summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES-1.6.txt244
-rw-r--r--CHANGES-1.7.txt250
-rw-r--r--CHANGES-2.0.txt215
-rw-r--r--CHANGES-IPPTOOL.txt168
-rw-r--r--CHANGES.txt351
-rw-r--r--CREDITS.txt3
-rw-r--r--INSTALL.txt44
-rw-r--r--IPPTOOL.txt108
-rw-r--r--LICENSE.txt20
-rw-r--r--Makedefs.in45
-rw-r--r--Makefile76
-rw-r--r--README.txt29
-rw-r--r--backend/Dependencies117
-rw-r--r--backend/Makefile35
-rw-r--r--backend/backend-private.h24
-rw-r--r--backend/dnssd.c158
-rw-r--r--backend/ieee1284.c48
-rw-r--r--backend/ipp.c1045
-rw-r--r--backend/lpd.c109
-rw-r--r--backend/network.c84
-rw-r--r--backend/org.cups.usb-quirks29
-rw-r--r--backend/runloop.c41
-rw-r--r--backend/snmp-supplies.c141
-rw-r--r--backend/snmp.c67
-rw-r--r--backend/socket.c58
-rw-r--r--backend/test1284.c4
-rw-r--r--backend/testbackend.c54
-rw-r--r--backend/testsupplies.c4
-rw-r--r--backend/usb-darwin.c1198
-rw-r--r--backend/usb-libusb.c88
-rw-r--r--backend/usb-unix.c36
-rw-r--r--backend/usb.c4
-rw-r--r--berkeley/Dependencies41
-rw-r--r--berkeley/Makefile5
-rw-r--r--berkeley/lpc.c34
-rw-r--r--berkeley/lpq.c70
-rw-r--r--berkeley/lpr.c34
-rw-r--r--berkeley/lprm.c4
-rw-r--r--cgi-bin/Dependencies39
-rw-r--r--cgi-bin/Makefile61
-rw-r--r--cgi-bin/admin.c197
-rw-r--r--cgi-bin/cgi-private.h4
-rw-r--r--cgi-bin/cgi.h4
-rw-r--r--cgi-bin/classes.c38
-rw-r--r--cgi-bin/help-index.c56
-rw-r--r--cgi-bin/help-index.h4
-rw-r--r--cgi-bin/help.c4
-rw-r--r--cgi-bin/html.c4
-rw-r--r--cgi-bin/ipp-var.c105
-rw-r--r--cgi-bin/jobs.c30
-rw-r--r--cgi-bin/makedocset.c4
-rw-r--r--cgi-bin/printers.c38
-rw-r--r--cgi-bin/search.c46
-rw-r--r--cgi-bin/template.c85
-rw-r--r--cgi-bin/testcgi.c28
-rw-r--r--cgi-bin/testhi.c4
-rw-r--r--cgi-bin/testtemplate.c4
-rw-r--r--cgi-bin/var.c140
-rw-r--r--cgi-bin/websearch.c116
-rw-r--r--conf/Makefile8
-rw-r--r--conf/cups-files.conf.in16
-rw-r--r--conf/cupsd.conf.in16
-rw-r--r--conf/mime.convs.in4
-rw-r--r--conf/mime.types38
-rw-r--r--conf/snmp.conf.in10
-rw-r--r--config-scripts/cups-common.m485
-rw-r--r--config-scripts/cups-compiler.m4191
-rw-r--r--config-scripts/cups-defaults.m419
-rw-r--r--config-scripts/cups-directories.m4173
-rw-r--r--config-scripts/cups-dnssd.m418
-rw-r--r--config-scripts/cups-gssapi.m443
-rw-r--r--config-scripts/cups-largefile.m44
-rw-r--r--config-scripts/cups-launchd.m443
-rw-r--r--config-scripts/cups-libtool.m44
-rw-r--r--config-scripts/cups-manpages.m442
-rw-r--r--config-scripts/cups-network.m430
-rw-r--r--config-scripts/cups-opsys.m416
-rw-r--r--config-scripts/cups-pam.m423
-rw-r--r--config-scripts/cups-poll.m44
-rw-r--r--config-scripts/cups-scripting.m44
-rw-r--r--config-scripts/cups-sharedlibs.m4110
-rw-r--r--config-scripts/cups-ssl.m4128
-rw-r--r--config-scripts/cups-startup.m4192
-rw-r--r--config-scripts/cups-threads.m44
-rw-r--r--config.h.in127
-rwxr-xr-xconfigure1619
-rw-r--r--configure.ac (renamed from configure.in)38
-rwxr-xr-xcups-config.in4
-rw-r--r--cups/Dependencies452
-rw-r--r--cups/Makefile123
-rw-r--r--cups/adminutil.c170
-rw-r--r--cups/adminutil.h4
-rw-r--r--cups/api-filter.header2
-rw-r--r--cups/api-filter.shtml131
-rw-r--r--cups/array-private.h13
-rw-r--r--cups/array.c148
-rw-r--r--cups/array.h4
-rw-r--r--cups/attr.c34
-rw-r--r--cups/auth.c81
-rw-r--r--cups/backchannel.c30
-rw-r--r--cups/backend.c4
-rw-r--r--cups/backend.h4
-rw-r--r--cups/conflicts.c44
-rw-r--r--cups/cups-private.h25
-rw-r--r--cups/cups.h91
-rw-r--r--cups/custom.c4
-rw-r--r--cups/debug-private.h4
-rw-r--r--cups/debug.c603
-rw-r--r--cups/dest-job.c94
-rw-r--r--cups/dest-localization.c211
-rw-r--r--cups/dest-options.c740
-rw-r--r--cups/dest.c348
-rw-r--r--cups/dir.c4
-rw-r--r--cups/dir.h4
-rw-r--r--cups/emit.c79
-rw-r--r--cups/encode.c297
-rw-r--r--cups/file-private.h30
-rw-r--r--cups/file.c324
-rw-r--r--cups/file.h30
-rw-r--r--cups/getdevices.c41
-rw-r--r--cups/getifaddrs.c4
-rw-r--r--cups/getputfile.c157
-rw-r--r--cups/globals.c26
-rw-r--r--cups/http-addr.c371
-rw-r--r--cups/http-addrlist.c153
-rw-r--r--cups/http-private.h204
-rw-r--r--cups/http-support.c530
-rw-r--r--cups/http.c4146
-rw-r--r--cups/http.h397
-rw-r--r--cups/ipp-private.h27
-rw-r--r--cups/ipp-support.c1433
-rw-r--r--cups/ipp.c2466
-rw-r--r--cups/ipp.h743
-rw-r--r--cups/langprintf.c63
-rw-r--r--cups/language-private.h4
-rw-r--r--cups/language.c193
-rw-r--r--cups/language.h4
-rw-r--r--cups/libcups2.def921
-rw-r--r--cups/libcups_s.exp85
-rw-r--r--cups/localize.c108
-rw-r--r--cups/mark.c57
-rw-r--r--cups/md5-private.h4
-rw-r--r--cups/md5.c54
-rw-r--r--cups/md5passwd.c4
-rw-r--r--cups/notify.c26
-rw-r--r--cups/options.c43
-rw-r--r--cups/page.c4
-rw-r--r--cups/ppd-cache.c1524
-rw-r--r--cups/ppd-private.h93
-rw-r--r--cups/ppd.c146
-rw-r--r--cups/ppd.h78
-rw-r--r--cups/pwg-media.c744
-rw-r--r--cups/pwg-private.h73
-rw-r--r--cups/pwg.h94
-rw-r--r--cups/raster-private.h4
-rw-r--r--cups/raster.h8
-rw-r--r--cups/request.c333
-rw-r--r--cups/sidechannel.c73
-rw-r--r--cups/sidechannel.h4
-rw-r--r--cups/snmp-private.h28
-rw-r--r--cups/snmp.c214
-rw-r--r--cups/snprintf.c44
-rw-r--r--cups/sspi-private.h82
-rw-r--r--cups/sspi.c1485
-rw-r--r--cups/string-private.h45
-rw-r--r--cups/string.c103
-rw-r--r--cups/tempfile.c72
-rw-r--r--cups/test.ppd15
-rw-r--r--cups/testadmin.c9
-rw-r--r--cups/testarray.c121
-rw-r--r--cups/testcache.c98
-rw-r--r--cups/testconflicts.c4
-rw-r--r--cups/testcups.c63
-rw-r--r--cups/testdest.c460
-rw-r--r--cups/testfile.c86
-rw-r--r--cups/testhttp.c525
-rw-r--r--cups/testi18n.c65
-rw-r--r--cups/testipp.c162
-rw-r--r--cups/testlang.c52
-rw-r--r--cups/testoptions.c4
-rw-r--r--cups/testppd.c130
-rw-r--r--cups/testpwg.c97
-rw-r--r--cups/testsnmp.c31
-rw-r--r--cups/thread-private.h22
-rw-r--r--cups/thread.c29
-rw-r--r--cups/tls-darwin.c1839
-rw-r--r--cups/tls-gnutls.c1345
-rw-r--r--cups/tls-sspi.c2431
-rw-r--r--cups/tls.c112
-rw-r--r--cups/tlscheck.c739
-rw-r--r--cups/transcode.c76
-rw-r--r--cups/transcode.h4
-rw-r--r--cups/usersys.c730
-rw-r--r--cups/util.c454
-rw-r--r--cups/versioning.h104
-rw-r--r--data/Makefile29
-rw-r--r--data/classified6
-rw-r--r--data/confidential6
-rw-r--r--data/epson.h4
-rw-r--r--data/hp.h4
-rw-r--r--data/label.h4
-rw-r--r--data/secret6
-rw-r--r--data/standard6
-rw-r--r--data/testprint.in7
-rw-r--r--data/topsecret6
-rw-r--r--data/unclassified6
-rw-r--r--desktop/Makefile4
-rw-r--r--doc/Makefile47
-rw-r--r--doc/apple-touch-icon.opacitybin0 -> 13914 bytes
-rw-r--r--doc/apple-touch-icon.pngbin0 -> 6139 bytes
-rw-r--r--doc/ca/index.html.in107
-rw-r--r--doc/cs/index.html.in107
-rw-r--r--doc/cups-printable.css16
-rw-r--r--doc/cups.css182
-rw-r--r--doc/de/index.html.in55
-rw-r--r--doc/es/index.html.in162
-rw-r--r--doc/fr/index.html.in107
-rw-r--r--doc/help/accounting.html13
-rw-r--r--doc/help/api-array.html16
-rw-r--r--doc/help/api-cgi.html16
-rw-r--r--doc/help/api-cups.html549
-rw-r--r--doc/help/api-filedir.html16
-rw-r--r--doc/help/api-filter.html150
-rw-r--r--doc/help/api-httpipp.html2027
-rw-r--r--doc/help/api-mime.html16
-rw-r--r--doc/help/api-overview.html16
-rw-r--r--doc/help/api-ppd.html20
-rw-r--r--doc/help/api-ppdc.html16
-rw-r--r--doc/help/api-raster.html16
-rw-r--r--doc/help/cgi.html8
-rw-r--r--doc/help/glossary.html9
-rw-r--r--doc/help/kerberos.html6
-rw-r--r--doc/help/license.html22
-rw-r--r--doc/help/man-backend.html179
-rw-r--r--doc/help/man-cancel.html89
-rw-r--r--doc/help/man-classes.conf.html30
-rw-r--r--doc/help/man-client.conf.html65
-rw-r--r--doc/help/man-cups-config.html100
-rw-r--r--doc/help/man-cups-files.conf.html166
-rw-r--r--doc/help/man-cups-lpd.html114
-rw-r--r--doc/help/man-cups-snmp.conf.html55
-rw-r--r--doc/help/man-cups-snmp.html54
-rw-r--r--doc/help/man-cups.html119
-rw-r--r--doc/help/man-cupsaccept.html84
-rw-r--r--doc/help/man-cupsaddsmb.html121
-rw-r--r--doc/help/man-cupsctl.html94
-rw-r--r--doc/help/man-cupsd-helper.html84
-rw-r--r--doc/help/man-cupsd-logs.html194
-rw-r--r--doc/help/man-cupsd.conf.html595
-rw-r--r--doc/help/man-cupsd.html117
-rw-r--r--doc/help/man-cupsenable.html93
-rw-r--r--doc/help/man-cupsfilter.html126
-rw-r--r--doc/help/man-cupstestdsc.html44
-rw-r--r--doc/help/man-cupstestppd.html127
-rw-r--r--doc/help/man-filter.html189
-rw-r--r--doc/help/man-ippfind.html204
-rw-r--r--doc/help/man-ipptool.html326
-rw-r--r--doc/help/man-ipptoolfile.html761
-rw-r--r--doc/help/man-lp.html193
-rw-r--r--doc/help/man-lpadmin.html182
-rw-r--r--doc/help/man-lpc.html54
-rw-r--r--doc/help/man-lpinfo.html123
-rw-r--r--doc/help/man-lpmove.html75
-rw-r--r--doc/help/man-lpoptions.html125
-rw-r--r--doc/help/man-lpq.html61
-rw-r--r--doc/help/man-lpr.html130
-rw-r--r--doc/help/man-lprm.html82
-rw-r--r--doc/help/man-lpstat.html129
-rw-r--r--doc/help/man-mailto.conf.html42
-rw-r--r--doc/help/man-mime.convs.html55
-rw-r--r--doc/help/man-mime.types.html97
-rw-r--r--doc/help/man-notifier.html37
-rw-r--r--doc/help/man-ppdc.html91
-rw-r--r--doc/help/man-ppdcfile.html95
-rw-r--r--doc/help/man-ppdhtml.html45
-rw-r--r--doc/help/man-ppdi.html52
-rw-r--r--doc/help/man-ppdmerge.html49
-rw-r--r--doc/help/man-ppdpo.html51
-rw-r--r--doc/help/man-printers.conf.html30
-rw-r--r--doc/help/man-subscriptions.conf.html30
-rw-r--r--doc/help/network.html20
-rw-r--r--doc/help/overview.html9
-rw-r--r--doc/help/policies.html285
-rw-r--r--doc/help/postscript-driver.html16
-rw-r--r--doc/help/ppd-compiler.html16
-rw-r--r--doc/help/raster-driver.html16
-rw-r--r--doc/help/ref-access_log.html140
-rw-r--r--doc/help/ref-classes-conf.html565
-rw-r--r--doc/help/ref-client-conf.html94
-rw-r--r--doc/help/ref-cups-files-conf.html.in538
-rw-r--r--doc/help/ref-cupsd-conf.html.in2162
-rw-r--r--doc/help/ref-error_log.html55
-rw-r--r--doc/help/ref-mailto-conf.html108
-rw-r--r--doc/help/ref-page_log.html77
-rw-r--r--doc/help/ref-printers-conf.html719
-rw-r--r--doc/help/ref-snmp-conf.html145
-rw-r--r--doc/help/ref-subscriptions-conf.html354
-rw-r--r--doc/help/security.html53
-rw-r--r--doc/help/spec-browsing.html118
-rw-r--r--doc/help/spec-cmp.html167
-rw-r--r--doc/help/spec-design.html8
-rw-r--r--doc/help/spec-ipp.html14
-rw-r--r--doc/help/spec-pdf.html11
-rw-r--r--doc/help/spec-ppd.html92
-rw-r--r--doc/help/standard.html.in181
-rw-r--r--doc/help/whatsnew.html66
-rw-r--r--doc/images/generic.pngbin0 -> 6744 bytes
-rw-r--r--doc/index.html.in162
-rw-r--r--doc/ja/index.html.in162
-rw-r--r--doc/ru/index.html.in159
-rw-r--r--examples/Makefile4
-rw-r--r--examples/ppdx.c4
-rw-r--r--examples/ppdx.h4
-rw-r--r--examples/testppdx.c4
-rw-r--r--filter/Dependencies73
-rw-r--r--filter/Makefile12
-rw-r--r--filter/commandtops.c33
-rw-r--r--filter/common.c35
-rw-r--r--filter/common.h4
-rw-r--r--filter/error.c59
-rw-r--r--filter/gziptoany.c46
-rw-r--r--filter/interpret.c239
-rw-r--r--filter/pstops.c218
-rw-r--r--filter/raster.c354
-rw-r--r--filter/rasterbench.c37
-rw-r--r--filter/rastertoepson.c195
-rw-r--r--filter/rastertohp.c153
-rw-r--r--filter/rastertolabel.c191
-rw-r--r--filter/rastertopwg.c103
-rw-r--r--filter/spec-ppd.shtml72
-rw-r--r--filter/testraster.c66
-rwxr-xr-xinstall-sh2
-rw-r--r--locale/Dependencies26
-rw-r--r--locale/Makefile44
-rw-r--r--locale/checkpo.c8
-rw-r--r--locale/cups.header16
-rw-r--r--locale/cups.pot3625
-rw-r--r--locale/cups.strings669
-rw-r--r--locale/cups_ca.po1120
-rw-r--r--locale/cups_cs.po2728
-rw-r--r--locale/cups_de.po5774
-rw-r--r--locale/cups_es.po1200
-rw-r--r--locale/cups_fr.po891
-rw-r--r--locale/cups_it.po6261
-rw-r--r--locale/cups_ja.po1277
-rw-r--r--locale/cups_ru.po6051
-rw-r--r--locale/po2strings.c120
-rw-r--r--locale/strings2po.c20
-rw-r--r--locale/translate.c439
-rw-r--r--man/Makefile53
-rw-r--r--man/backend.man269
-rw-r--r--man/cancel.man114
-rw-r--r--man/classes.conf.man122
-rw-r--r--man/client.conf.man.in127
-rw-r--r--man/cups-config.man157
-rw-r--r--man/cups-deviced.man.in44
-rw-r--r--man/cups-driverd.man.in122
-rw-r--r--man/cups-files.conf.man.in343
-rw-r--r--man/cups-lpd.man.in200
-rw-r--r--man/cups-snmp.conf.man99
-rw-r--r--man/cups-snmp.man.in84
-rw-r--r--man/cups.man147
-rw-r--r--man/cupsaccept.man107
-rw-r--r--man/cupsaddsmb.man.in193
-rw-r--r--man/cupsctl.man101
-rw-r--r--man/cupsd-helper.man94
-rw-r--r--man/cupsd-logs.man241
-rw-r--r--man/cupsd.conf.man.in1061
-rw-r--r--man/cupsd.man.in149
-rw-r--r--man/cupsenable.man131
-rw-r--r--man/cupsfilter.man156
-rw-r--r--man/cupstestdsc.man63
-rw-r--r--man/cupstestppd.man166
-rw-r--r--man/filter.man318
-rw-r--r--man/ippfind.man261
-rw-r--r--man/ipptool.man283
-rw-r--r--man/ipptoolfile.man847
-rw-r--r--man/lp.man320
-rw-r--r--man/lpadmin.man313
-rw-r--r--man/lpc.man77
-rw-r--r--man/lpinfo.man165
-rw-r--r--man/lpmove.man92
-rw-r--r--man/lpoptions.man.in192
-rw-r--r--man/lppasswd.man68
-rw-r--r--man/lpq.man84
-rw-r--r--man/lpr.man183
-rw-r--r--man/lprm.man105
-rw-r--r--man/lpstat.man197
-rw-r--r--man/mailto.conf.man70
-rw-r--r--man/mantohtml.c1171
-rw-r--r--man/mime.convs.man76
-rw-r--r--man/mime.types.man163
-rw-r--r--man/notifier.man163
-rw-r--r--man/ppdc.man149
-rw-r--r--man/ppdcfile.man175
-rw-r--r--man/ppdhtml.man65
-rw-r--r--man/ppdi.man68
-rw-r--r--man/ppdmerge.man63
-rw-r--r--man/ppdpo.man76
-rw-r--r--man/printers.conf.man136
-rw-r--r--man/subscriptions.conf.man103
-rw-r--r--monitor/Dependencies19
-rw-r--r--monitor/Makefile5
-rw-r--r--monitor/bcp.c49
-rw-r--r--monitor/tbcp.c56
-rw-r--r--notifier/Dependencies24
-rw-r--r--notifier/Makefile9
-rw-r--r--notifier/dbus.c91
-rw-r--r--notifier/mailto.c4
-rw-r--r--notifier/rss.c44
-rw-r--r--notifier/testnotify.c4
-rw-r--r--packaging/cups.list.in24
-rw-r--r--packaging/cups.spec128
-rw-r--r--packaging/cups.spec.in124
-rw-r--r--ppdc/Dependencies284
-rw-r--r--ppdc/Makefile50
-rw-r--r--ppdc/genstrings.cxx31
-rw-r--r--ppdc/ppdc-array.cxx35
-rw-r--r--ppdc/ppdc-attr.cxx4
-rw-r--r--ppdc/ppdc-catalog.cxx161
-rw-r--r--ppdc/ppdc-choice.cxx4
-rw-r--r--ppdc/ppdc-constraint.cxx4
-rw-r--r--ppdc/ppdc-driver.cxx40
-rw-r--r--ppdc/ppdc-file.cxx4
-rw-r--r--ppdc/ppdc-filter.cxx4
-rw-r--r--ppdc/ppdc-font.cxx4
-rw-r--r--ppdc/ppdc-group.cxx4
-rw-r--r--ppdc/ppdc-import.cxx4
-rw-r--r--ppdc/ppdc-mediasize.cxx4
-rw-r--r--ppdc/ppdc-message.cxx4
-rw-r--r--ppdc/ppdc-option.cxx4
-rw-r--r--ppdc/ppdc-profile.cxx4
-rw-r--r--ppdc/ppdc-shared.cxx4
-rw-r--r--ppdc/ppdc-source.cxx124
-rw-r--r--ppdc/ppdc-string.cxx12
-rw-r--r--ppdc/ppdc-variable.cxx4
-rw-r--r--ppdc/ppdc.cxx29
-rw-r--r--ppdc/ppdhtml.cxx149
-rw-r--r--ppdc/ppdi.cxx4
-rw-r--r--ppdc/ppdmerge.cxx30
-rw-r--r--ppdc/ppdpo.cxx63
-rw-r--r--ppdc/sample.drv161
-rw-r--r--ppdc/testcatalog.cxx4
-rw-r--r--scheduler/Dependencies459
-rw-r--r--scheduler/Makefile131
-rw-r--r--scheduler/auth.c694
-rw-r--r--scheduler/auth.h36
-rw-r--r--scheduler/banners.c4
-rw-r--r--scheduler/banners.h4
-rw-r--r--scheduler/cert.c85
-rw-r--r--scheduler/cert.h4
-rw-r--r--scheduler/classes.c42
-rw-r--r--scheduler/classes.h4
-rw-r--r--scheduler/client.c2076
-rw-r--r--scheduler/client.h38
-rw-r--r--scheduler/colorman.c95
-rw-r--r--scheduler/colorman.h4
-rw-r--r--scheduler/conf.c777
-rw-r--r--scheduler/conf.h90
-rw-r--r--scheduler/cups-deviced.c43
-rw-r--r--scheduler/cups-driverd.cxx162
-rw-r--r--scheduler/cups-exec.c175
-rw-r--r--scheduler/cups-lpd.c93
-rw-r--r--scheduler/cups.sh.in57
-rw-r--r--scheduler/cups.xml.in2
-rw-r--r--scheduler/cupsd.h38
-rw-r--r--scheduler/cupsfilter.c462
-rw-r--r--scheduler/dirsvc.c727
-rw-r--r--scheduler/dirsvc.h4
-rw-r--r--scheduler/env.c38
-rw-r--r--scheduler/file.c138
-rw-r--r--scheduler/filter.c4
-rw-r--r--scheduler/ipp.c1455
-rw-r--r--scheduler/job.c806
-rw-r--r--scheduler/job.h33
-rw-r--r--scheduler/listen.c199
-rw-r--r--scheduler/log.c590
-rw-r--r--scheduler/main.c989
-rw-r--r--scheduler/mime-private.h4
-rw-r--r--scheduler/mime.c69
-rw-r--r--scheduler/mime.h11
-rw-r--r--scheduler/network.c38
-rw-r--r--scheduler/network.h4
-rw-r--r--scheduler/org.cups.cups-lpd.plist.in6
-rw-r--r--scheduler/org.cups.cups-lpd.socket9
-rw-r--r--scheduler/org.cups.cups-lpdAT.service.in9
-rw-r--r--scheduler/org.cups.cupsd.path.in8
-rw-r--r--scheduler/org.cups.cupsd.plist23
-rw-r--r--scheduler/org.cups.cupsd.service.in11
-rw-r--r--scheduler/org.cups.cupsd.socket.in8
-rw-r--r--scheduler/policy.c52
-rw-r--r--scheduler/policy.h4
-rw-r--r--scheduler/printers.c947
-rw-r--r--scheduler/printers.h31
-rw-r--r--scheduler/process.c442
-rw-r--r--scheduler/quotas.c4
-rw-r--r--scheduler/select.c81
-rw-r--r--scheduler/server.c15
-rw-r--r--scheduler/statbuf.c38
-rw-r--r--scheduler/statbuf.h4
-rw-r--r--scheduler/subscriptions.c53
-rw-r--r--scheduler/subscriptions.h4
-rw-r--r--scheduler/sysman.c358
-rw-r--r--scheduler/sysman.h24
-rw-r--r--scheduler/testlpd.c83
-rw-r--r--scheduler/testmime.c32
-rw-r--r--scheduler/testspeed.c73
-rw-r--r--scheduler/testsub.c38
-rw-r--r--scheduler/tls-darwin.c570
-rw-r--r--scheduler/tls-gnutls.c292
-rw-r--r--scheduler/tls-openssl.c353
-rw-r--r--scheduler/tls.c30
-rw-r--r--scheduler/type.c183
-rw-r--r--scheduler/util.c48
-rw-r--r--scheduler/util.h22
-rw-r--r--systemv/Dependencies120
-rw-r--r--systemv/Makefile36
-rw-r--r--systemv/cancel.c29
-rw-r--r--systemv/cupsaccept.c4
-rw-r--r--systemv/cupsaddsmb.c4
-rw-r--r--systemv/cupsctl.c4
-rw-r--r--systemv/cupstestdsc.c4
-rw-r--r--systemv/cupstestppd.c164
-rw-r--r--systemv/lp.c44
-rw-r--r--systemv/lpadmin.c295
-rw-r--r--systemv/lpinfo.c4
-rw-r--r--systemv/lpmove.c4
-rw-r--r--systemv/lpoptions.c58
-rw-r--r--systemv/lppasswd.c489
-rw-r--r--systemv/lpstat.c307
-rw-r--r--templates/Makefile22
-rw-r--r--templates/add-class.tmpl3
-rw-r--r--templates/add-printer.tmpl3
-rw-r--r--templates/admin.tmpl199
-rw-r--r--templates/ca/add-class.tmpl40
-rw-r--r--templates/ca/add-printer.tmpl47
-rw-r--r--templates/ca/add-rss-subscription.tmpl44
-rw-r--r--templates/ca/admin.tmpl102
-rw-r--r--templates/ca/choose-model.tmpl60
-rw-r--r--templates/ca/choose-serial.tmpl52
-rw-r--r--templates/ca/choose-uri.tmpl43
-rw-r--r--templates/ca/class-added.tmpl7
-rw-r--r--templates/ca/class-confirm.tmpl10
-rw-r--r--templates/ca/class-deleted.tmpl7
-rw-r--r--templates/ca/class-jobs-header.tmpl3
-rw-r--r--templates/ca/class-modified.tmpl7
-rw-r--r--templates/ca/class.tmpl44
-rw-r--r--templates/ca/classes-header.tmpl1
-rw-r--r--templates/ca/command.tmpl12
-rw-r--r--templates/ca/edit-config.tmpl24
-rw-r--r--templates/ca/error-op.tmpl9
-rw-r--r--templates/ca/header.tmpl.in29
-rw-r--r--templates/ca/help-header.tmpl52
-rw-r--r--templates/ca/help-trailer.tmpl1
-rw-r--r--templates/ca/job-cancel.tmpl7
-rw-r--r--templates/ca/job-hold.tmpl7
-rw-r--r--templates/ca/job-move.tmpl27
-rw-r--r--templates/ca/job-moved.tmpl8
-rw-r--r--templates/ca/job-release.tmpl7
-rw-r--r--templates/ca/job-restart.tmpl7
-rw-r--r--templates/ca/jobs-header.tmpl5
-rw-r--r--templates/ca/modify-class.tmpl34
-rw-r--r--templates/ca/modify-printer.tmpl42
-rw-r--r--templates/ca/norestart.tmpl8
-rw-r--r--templates/ca/option-conflict.tmpl7
-rw-r--r--templates/ca/option-pickone.tmpl18
-rw-r--r--templates/ca/option-trailer.tmpl5
-rw-r--r--templates/ca/printer-accept.tmpl9
-rw-r--r--templates/ca/printer-added.tmpl8
-rw-r--r--templates/ca/printer-configured.tmpl6
-rw-r--r--templates/ca/printer-default.tmpl12
-rw-r--r--templates/ca/printer-deleted.tmpl7
-rw-r--r--templates/ca/printer-jobs-header.tmpl3
-rw-r--r--templates/ca/printer-modified.tmpl8
-rw-r--r--templates/ca/printer-purge.tmpl8
-rw-r--r--templates/ca/printer-reject.tmpl9
-rw-r--r--templates/ca/printer-start.tmpl9
-rw-r--r--templates/ca/printer-stop.tmpl9
-rw-r--r--templates/ca/printer.tmpl47
-rw-r--r--templates/ca/printers-header.tmpl1
-rw-r--r--templates/ca/printers.tmpl11
-rw-r--r--templates/ca/restart.tmpl8
-rw-r--r--templates/ca/samba-export.tmpl55
-rw-r--r--templates/ca/samba-exported.tmpl1
-rw-r--r--templates/ca/set-printer-options-header.tmpl26
-rw-r--r--templates/ca/set-printer-options-trailer.tmpl16
-rw-r--r--templates/ca/subscription-added.tmpl5
-rw-r--r--templates/ca/subscription-canceled.tmpl5
-rw-r--r--templates/ca/test-page.tmpl8
-rw-r--r--templates/ca/trailer.tmpl8
-rw-r--r--templates/choose-device.tmpl4
-rw-r--r--templates/choose-make.tmpl3
-rw-r--r--templates/choose-model.tmpl3
-rw-r--r--templates/choose-serial.tmpl3
-rw-r--r--templates/choose-uri.tmpl3
-rw-r--r--templates/class-added.tmpl4
-rw-r--r--templates/class-confirm.tmpl4
-rw-r--r--templates/class-deleted.tmpl4
-rw-r--r--templates/class-jobs-header.tmpl2
-rw-r--r--templates/class-modified.tmpl4
-rw-r--r--templates/class.tmpl3
-rw-r--r--templates/command.tmpl4
-rw-r--r--templates/cs/admin.tmpl102
-rw-r--r--templates/cs/choose-device.tmpl53
-rw-r--r--templates/cs/choose-make.tmpl64
-rw-r--r--templates/cs/choose-serial.tmpl52
-rw-r--r--templates/cs/class-added.tmpl7
-rw-r--r--templates/cs/class-deleted.tmpl7
-rw-r--r--templates/cs/class-jobs-header.tmpl3
-rw-r--r--templates/cs/class-modified.tmpl7
-rw-r--r--templates/cs/class.tmpl44
-rw-r--r--templates/cs/classes-header.tmpl1
-rw-r--r--templates/cs/classes.tmpl12
-rw-r--r--templates/cs/command.tmpl12
-rw-r--r--templates/cs/error-op.tmpl9
-rw-r--r--templates/cs/error.tmpl9
-rw-r--r--templates/cs/header.tmpl.in29
-rw-r--r--templates/cs/help-header.tmpl48
-rw-r--r--templates/cs/help-printable.tmpl9
-rw-r--r--templates/cs/help-trailer.tmpl1
-rw-r--r--templates/cs/job-cancel.tmpl7
-rw-r--r--templates/cs/job-hold.tmpl7
-rw-r--r--templates/cs/job-moved.tmpl8
-rw-r--r--templates/cs/job-release.tmpl7
-rw-r--r--templates/cs/job-restart.tmpl7
-rw-r--r--templates/cs/jobs-header.tmpl5
-rw-r--r--templates/cs/jobs.tmpl37
-rw-r--r--templates/cs/list-available-printers.tmpl11
-rw-r--r--templates/cs/norestart.tmpl8
-rw-r--r--templates/cs/option-boolean.tmpl6
-rw-r--r--templates/cs/option-conflict.tmpl7
-rw-r--r--templates/cs/option-header.tmpl5
-rw-r--r--templates/cs/option-pickmany.tmpl6
-rw-r--r--templates/cs/option-trailer.tmpl5
-rw-r--r--templates/cs/pager.tmpl6
-rw-r--r--templates/cs/printer-accept.tmpl9
-rw-r--r--templates/cs/printer-added.tmpl7
-rw-r--r--templates/cs/printer-configured.tmpl8
-rw-r--r--templates/cs/printer-confirm.tmpl10
-rw-r--r--templates/cs/printer-default.tmpl11
-rw-r--r--templates/cs/printer-deleted.tmpl7
-rw-r--r--templates/cs/printer-jobs-header.tmpl3
-rw-r--r--templates/cs/printer-modified.tmpl8
-rw-r--r--templates/cs/printer-purge.tmpl10
-rw-r--r--templates/cs/printer-reject.tmpl9
-rw-r--r--templates/cs/printer-start.tmpl9
-rw-r--r--templates/cs/printer-stop.tmpl9
-rw-r--r--templates/cs/printer.tmpl48
-rw-r--r--templates/cs/printers-header.tmpl1
-rw-r--r--templates/cs/printers.tmpl11
-rw-r--r--templates/cs/restart.tmpl8
-rw-r--r--templates/cs/samba-export.tmpl55
-rw-r--r--templates/cs/samba-exported.tmpl1
-rw-r--r--templates/cs/search.tmpl10
-rw-r--r--templates/cs/set-printer-options-trailer.tmpl16
-rw-r--r--templates/cs/subscription-added.tmpl5
-rw-r--r--templates/cs/subscription-canceled.tmpl5
-rw-r--r--templates/cs/test-page.tmpl8
-rw-r--r--templates/cs/trailer.tmpl8
-rw-r--r--templates/cs/users.tmpl30
-rw-r--r--templates/de/add-class.tmpl (renamed from templates/cs/add-class.tmpl)21
-rw-r--r--templates/de/add-printer.tmpl (renamed from templates/cs/add-printer.tmpl)25
-rw-r--r--templates/de/add-rss-subscription.tmpl (renamed from templates/cs/add-rss-subscription.tmpl)42
-rw-r--r--templates/de/admin.tmpl97
-rw-r--r--templates/de/choose-device.tmpl (renamed from templates/ca/choose-device.tmpl)26
-rw-r--r--templates/de/choose-make.tmpl (renamed from templates/ca/choose-make.tmpl)25
-rw-r--r--templates/de/choose-model.tmpl (renamed from templates/cs/choose-model.tmpl)29
-rw-r--r--templates/de/choose-serial.tmpl49
-rw-r--r--templates/de/choose-uri.tmpl (renamed from templates/cs/choose-uri.tmpl)14
-rw-r--r--templates/de/class-added.tmpl3
-rw-r--r--templates/de/class-confirm.tmpl (renamed from templates/cs/class-confirm.tmpl)12
-rw-r--r--templates/de/class-deleted.tmpl3
-rw-r--r--templates/de/class-jobs-header.tmpl1
-rw-r--r--templates/de/class-modified.tmpl4
-rw-r--r--templates/de/class.tmpl41
-rw-r--r--templates/de/classes-header.tmpl1
-rw-r--r--templates/de/classes.tmpl (renamed from templates/ca/classes.tmpl)4
-rw-r--r--templates/de/command.tmpl8
-rw-r--r--templates/de/edit-config.tmpl (renamed from templates/cs/edit-config.tmpl)10
-rw-r--r--templates/de/error-op.tmpl6
-rw-r--r--templates/de/error.tmpl (renamed from templates/ca/error.tmpl)6
-rw-r--r--templates/de/header.tmpl.in43
-rw-r--r--templates/de/help-header.tmpl41
-rw-r--r--templates/de/help-printable.tmpl (renamed from templates/ca/help-printable.tmpl)0
-rw-r--r--templates/de/help-trailer.tmpl0
-rw-r--r--templates/de/job-cancel.tmpl3
-rw-r--r--templates/de/job-hold.tmpl3
-rw-r--r--templates/de/job-move.tmpl (renamed from templates/cs/job-move.tmpl)10
-rw-r--r--templates/de/job-moved.tmpl4
-rw-r--r--templates/de/job-release.tmpl3
-rw-r--r--templates/de/job-restart.tmpl3
-rw-r--r--templates/de/jobs-header.tmpl5
-rw-r--r--templates/de/jobs.tmpl (renamed from templates/ca/jobs.tmpl)27
-rw-r--r--templates/de/list-available-printers.tmpl (renamed from templates/ca/list-available-printers.tmpl)10
-rw-r--r--templates/de/modify-class.tmpl (renamed from templates/cs/modify-class.tmpl)13
-rw-r--r--templates/de/modify-printer.tmpl (renamed from templates/cs/modify-printer.tmpl)19
-rw-r--r--templates/de/norestart.tmpl3
-rw-r--r--templates/de/option-boolean.tmpl (renamed from templates/ca/option-boolean.tmpl)0
-rw-r--r--templates/de/option-conflict.tmpl7
-rw-r--r--templates/de/option-header.tmpl (renamed from templates/ca/option-header.tmpl)0
-rw-r--r--templates/de/option-pickmany.tmpl (renamed from templates/ca/option-pickmany.tmpl)0
-rw-r--r--templates/de/option-pickone.tmpl (renamed from templates/cs/option-pickone.tmpl)12
-rw-r--r--templates/de/option-trailer.tmpl5
-rw-r--r--templates/de/pager.tmpl (renamed from templates/ca/pager.tmpl)6
-rw-r--r--templates/de/printer-accept.tmpl5
-rw-r--r--templates/de/printer-added.tmpl4
-rw-r--r--templates/de/printer-cancel-jobs.tmpl5
-rw-r--r--templates/de/printer-configured.tmpl4
-rw-r--r--templates/de/printer-confirm.tmpl (renamed from templates/ca/printer-confirm.tmpl)12
-rw-r--r--templates/de/printer-default.tmpl9
-rw-r--r--templates/de/printer-deleted.tmpl3
-rw-r--r--templates/de/printer-jobs-header.tmpl1
-rw-r--r--templates/de/printer-modified.tmpl4
-rw-r--r--templates/de/printer-reject.tmpl5
-rw-r--r--templates/de/printer-start.tmpl5
-rw-r--r--templates/de/printer-stop.tmpl5
-rw-r--r--templates/de/printer.tmpl43
-rw-r--r--templates/de/printers-header.tmpl1
-rw-r--r--templates/de/printers.tmpl11
-rw-r--r--templates/de/restart.tmpl4
-rw-r--r--templates/de/samba-export.tmpl55
-rw-r--r--templates/de/samba-exported.tmpl1
-rw-r--r--templates/de/search.tmpl (renamed from templates/ca/search.tmpl)6
-rw-r--r--templates/de/set-printer-options-header.tmpl (renamed from templates/cs/set-printer-options-header.tmpl)6
-rw-r--r--templates/de/set-printer-options-trailer.tmpl (renamed from templates/fr/set-printer-options-trailer.tmpl)2
-rw-r--r--templates/de/subscription-added.tmpl1
-rw-r--r--templates/de/subscription-canceled.tmpl1
-rw-r--r--templates/de/test-page.tmpl4
-rw-r--r--templates/de/trailer.tmpl5
-rw-r--r--templates/de/users.tmpl (renamed from templates/ca/users.tmpl)13
-rw-r--r--templates/edit-config.tmpl4
-rw-r--r--templates/error-op.tmpl4
-rw-r--r--templates/error.tmpl4
-rw-r--r--templates/es/add-class.tmpl3
-rw-r--r--templates/es/add-printer.tmpl3
-rw-r--r--templates/es/admin.tmpl199
-rw-r--r--templates/es/choose-device.tmpl6
-rw-r--r--templates/es/choose-make.tmpl3
-rw-r--r--templates/es/choose-model.tmpl3
-rw-r--r--templates/es/choose-serial.tmpl3
-rw-r--r--templates/es/choose-uri.tmpl3
-rw-r--r--templates/es/class-added.tmpl3
-rw-r--r--templates/es/class-confirm.tmpl4
-rw-r--r--templates/es/class-deleted.tmpl4
-rw-r--r--templates/es/class-jobs-header.tmpl2
-rw-r--r--templates/es/class-modified.tmpl3
-rw-r--r--templates/es/class.tmpl3
-rw-r--r--templates/es/command.tmpl6
-rw-r--r--templates/es/edit-config.tmpl4
-rw-r--r--templates/es/error-op.tmpl4
-rw-r--r--templates/es/error.tmpl4
-rw-r--r--templates/es/header.tmpl.in72
-rw-r--r--templates/es/help-header.tmpl18
-rw-r--r--templates/es/help-trailer.tmpl1
-rw-r--r--templates/es/job-cancel.tmpl3
-rw-r--r--templates/es/job-hold.tmpl4
-rw-r--r--templates/es/job-move.tmpl4
-rw-r--r--templates/es/job-moved.tmpl4
-rw-r--r--templates/es/job-release.tmpl4
-rw-r--r--templates/es/job-restart.tmpl4
-rw-r--r--templates/es/jobs-header.tmpl4
-rw-r--r--templates/es/jobs.tmpl2
-rw-r--r--templates/es/list-available-printers.tmpl4
-rw-r--r--templates/es/modify-class.tmpl3
-rw-r--r--templates/es/modify-printer.tmpl3
-rw-r--r--templates/es/norestart.tmpl4
-rw-r--r--templates/es/printer-accept.tmpl4
-rw-r--r--templates/es/printer-added.tmpl4
-rw-r--r--templates/es/printer-cancel-jobs.tmpl4
-rw-r--r--templates/es/printer-configured.tmpl4
-rw-r--r--templates/es/printer-confirm.tmpl4
-rw-r--r--templates/es/printer-default.tmpl4
-rw-r--r--templates/es/printer-deleted.tmpl4
-rw-r--r--templates/es/printer-jobs-header.tmpl2
-rw-r--r--templates/es/printer-modified.tmpl4
-rw-r--r--templates/es/printer-reject.tmpl4
-rw-r--r--templates/es/printer-start.tmpl4
-rw-r--r--templates/es/printer-stop.tmpl4
-rw-r--r--templates/es/printer.tmpl12
-rw-r--r--templates/es/restart.tmpl6
-rw-r--r--templates/es/set-printer-options-header.tmpl2
-rw-r--r--templates/es/set-printer-options-trailer.tmpl2
-rw-r--r--templates/es/subscription-added.tmpl4
-rw-r--r--templates/es/subscription-canceled.tmpl4
-rw-r--r--templates/es/test-page.tmpl4
-rw-r--r--templates/es/trailer.tmpl13
-rw-r--r--templates/es/users.tmpl3
-rw-r--r--templates/fr/add-class.tmpl40
-rw-r--r--templates/fr/add-printer.tmpl47
-rw-r--r--templates/fr/add-rss-subscription.tmpl44
-rw-r--r--templates/fr/admin.tmpl102
-rw-r--r--templates/fr/choose-device.tmpl53
-rw-r--r--templates/fr/choose-make.tmpl64
-rw-r--r--templates/fr/choose-model.tmpl60
-rw-r--r--templates/fr/choose-serial.tmpl52
-rw-r--r--templates/fr/choose-uri.tmpl44
-rw-r--r--templates/fr/class-added.tmpl8
-rw-r--r--templates/fr/class-confirm.tmpl10
-rw-r--r--templates/fr/class-deleted.tmpl7
-rw-r--r--templates/fr/class-jobs-header.tmpl3
-rw-r--r--templates/fr/class-modified.tmpl8
-rw-r--r--templates/fr/class.tmpl44
-rw-r--r--templates/fr/classes-header.tmpl1
-rw-r--r--templates/fr/classes.tmpl11
-rw-r--r--templates/fr/command.tmpl12
-rw-r--r--templates/fr/edit-config.tmpl24
-rw-r--r--templates/fr/error-op.tmpl9
-rw-r--r--templates/fr/error.tmpl9
-rw-r--r--templates/fr/header.tmpl.in29
-rw-r--r--templates/fr/help-header.tmpl51
-rw-r--r--templates/fr/help-printable.tmpl9
-rw-r--r--templates/fr/help-trailer.tmpl1
-rw-r--r--templates/fr/job-cancel.tmpl7
-rw-r--r--templates/fr/job-hold.tmpl7
-rw-r--r--templates/fr/job-move.tmpl27
-rw-r--r--templates/fr/job-moved.tmpl8
-rw-r--r--templates/fr/job-release.tmpl7
-rw-r--r--templates/fr/job-restart.tmpl7
-rw-r--r--templates/fr/jobs-header.tmpl5
-rw-r--r--templates/fr/jobs.tmpl36
-rw-r--r--templates/fr/list-available-printers.tmpl11
-rw-r--r--templates/fr/modify-class.tmpl34
-rw-r--r--templates/fr/modify-printer.tmpl42
-rw-r--r--templates/fr/norestart.tmpl8
-rw-r--r--templates/fr/option-boolean.tmpl6
-rw-r--r--templates/fr/option-conflict.tmpl7
-rw-r--r--templates/fr/option-header.tmpl5
-rw-r--r--templates/fr/option-pickmany.tmpl6
-rw-r--r--templates/fr/option-pickone.tmpl18
-rw-r--r--templates/fr/option-trailer.tmpl5
-rw-r--r--templates/fr/pager.tmpl6
-rw-r--r--templates/fr/printer-accept.tmpl9
-rw-r--r--templates/fr/printer-added.tmpl8
-rw-r--r--templates/fr/printer-configured.tmpl8
-rw-r--r--templates/fr/printer-confirm.tmpl10
-rw-r--r--templates/fr/printer-default.tmpl13
-rw-r--r--templates/fr/printer-deleted.tmpl7
-rw-r--r--templates/fr/printer-jobs-header.tmpl3
-rw-r--r--templates/fr/printer-modified.tmpl8
-rw-r--r--templates/fr/printer-purge.tmpl9
-rw-r--r--templates/fr/printer-reject.tmpl9
-rw-r--r--templates/fr/printer-start.tmpl9
-rw-r--r--templates/fr/printer-stop.tmpl9
-rw-r--r--templates/fr/printer.tmpl47
-rw-r--r--templates/fr/printers-header.tmpl1
-rw-r--r--templates/fr/printers.tmpl11
-rw-r--r--templates/fr/restart.tmpl8
-rw-r--r--templates/fr/samba-export.tmpl54
-rw-r--r--templates/fr/samba-exported.tmpl1
-rw-r--r--templates/fr/search.tmpl10
-rw-r--r--templates/fr/set-printer-options-header.tmpl26
-rw-r--r--templates/fr/subscription-added.tmpl5
-rw-r--r--templates/fr/subscription-canceled.tmpl5
-rw-r--r--templates/fr/test-page.tmpl8
-rw-r--r--templates/fr/trailer.tmpl8
-rw-r--r--templates/fr/users.tmpl30
-rw-r--r--templates/header.tmpl.in72
-rw-r--r--templates/help-header.tmpl18
-rw-r--r--templates/help-trailer.tmpl1
-rw-r--r--templates/ja/add-class.tmpl7
-rw-r--r--templates/ja/add-printer.tmpl7
-rw-r--r--templates/ja/admin.tmpl199
-rw-r--r--templates/ja/choose-device.tmpl4
-rw-r--r--templates/ja/choose-make.tmpl3
-rw-r--r--templates/ja/choose-model.tmpl3
-rw-r--r--templates/ja/choose-serial.tmpl3
-rw-r--r--templates/ja/choose-uri.tmpl3
-rw-r--r--templates/ja/class-added.tmpl4
-rw-r--r--templates/ja/class-confirm.tmpl4
-rw-r--r--templates/ja/class-deleted.tmpl4
-rw-r--r--templates/ja/class-jobs-header.tmpl2
-rw-r--r--templates/ja/class-modified.tmpl4
-rw-r--r--templates/ja/class.tmpl5
-rw-r--r--templates/ja/command.tmpl4
-rw-r--r--templates/ja/edit-config.tmpl6
-rw-r--r--templates/ja/error-op.tmpl3
-rw-r--r--templates/ja/error.tmpl4
-rw-r--r--templates/ja/header.tmpl.in64
-rw-r--r--templates/ja/help-header.tmpl8
-rw-r--r--templates/ja/help-trailer.tmpl1
-rw-r--r--templates/ja/job-cancel.tmpl4
-rw-r--r--templates/ja/job-hold.tmpl4
-rw-r--r--templates/ja/job-move.tmpl4
-rw-r--r--templates/ja/job-moved.tmpl3
-rw-r--r--templates/ja/job-release.tmpl4
-rw-r--r--templates/ja/job-restart.tmpl4
-rw-r--r--templates/ja/jobs-header.tmpl4
-rw-r--r--templates/ja/list-available-printers.tmpl4
-rw-r--r--templates/ja/modify-class.tmpl3
-rw-r--r--templates/ja/modify-printer.tmpl7
-rw-r--r--templates/ja/norestart.tmpl3
-rw-r--r--templates/ja/printer-accept.tmpl4
-rw-r--r--templates/ja/printer-added.tmpl4
-rw-r--r--templates/ja/printer-cancel-jobs.tmpl5
-rw-r--r--templates/ja/printer-configured.tmpl4
-rw-r--r--templates/ja/printer-confirm.tmpl4
-rw-r--r--templates/ja/printer-default.tmpl4
-rw-r--r--templates/ja/printer-deleted.tmpl4
-rw-r--r--templates/ja/printer-jobs-header.tmpl2
-rw-r--r--templates/ja/printer-modified.tmpl4
-rw-r--r--templates/ja/printer-purge.tmpl9
-rw-r--r--templates/ja/printer-reject.tmpl4
-rw-r--r--templates/ja/printer-start.tmpl4
-rw-r--r--templates/ja/printer-stop.tmpl4
-rw-r--r--templates/ja/printer.tmpl12
-rw-r--r--templates/ja/restart.tmpl6
-rw-r--r--templates/ja/set-printer-options-header.tmpl2
-rw-r--r--templates/ja/set-printer-options-trailer.tmpl2
-rw-r--r--templates/ja/subscription-added.tmpl4
-rw-r--r--templates/ja/subscription-canceled.tmpl4
-rw-r--r--templates/ja/test-page.tmpl4
-rw-r--r--templates/ja/trailer.tmpl13
-rw-r--r--templates/ja/users.tmpl3
-rw-r--r--templates/job-cancel.tmpl4
-rw-r--r--templates/job-hold.tmpl4
-rw-r--r--templates/job-move.tmpl4
-rw-r--r--templates/job-moved.tmpl4
-rw-r--r--templates/job-release.tmpl4
-rw-r--r--templates/job-restart.tmpl4
-rw-r--r--templates/jobs-header.tmpl4
-rw-r--r--templates/list-available-printers.tmpl4
-rw-r--r--templates/modify-class.tmpl3
-rw-r--r--templates/modify-printer.tmpl3
-rw-r--r--templates/norestart.tmpl4
-rw-r--r--templates/printer-accept.tmpl4
-rw-r--r--templates/printer-added.tmpl4
-rw-r--r--templates/printer-cancel-jobs.tmpl5
-rw-r--r--templates/printer-configured.tmpl4
-rw-r--r--templates/printer-confirm.tmpl4
-rw-r--r--templates/printer-default.tmpl4
-rw-r--r--templates/printer-deleted.tmpl4
-rw-r--r--templates/printer-jobs-header.tmpl2
-rw-r--r--templates/printer-modified.tmpl4
-rw-r--r--templates/printer-purge.tmpl9
-rw-r--r--templates/printer-reject.tmpl4
-rw-r--r--templates/printer-start.tmpl4
-rw-r--r--templates/printer-stop.tmpl4
-rw-r--r--templates/printer.tmpl12
-rw-r--r--templates/restart.tmpl6
-rw-r--r--templates/ru/add-class.tmpl3
-rw-r--r--templates/ru/add-printer.tmpl3
-rw-r--r--templates/ru/admin.tmpl199
-rw-r--r--templates/ru/choose-device.tmpl12
-rw-r--r--templates/ru/choose-make.tmpl3
-rw-r--r--templates/ru/choose-model.tmpl3
-rw-r--r--templates/ru/choose-serial.tmpl11
-rw-r--r--templates/ru/choose-uri.tmpl3
-rw-r--r--templates/ru/class-added.tmpl4
-rw-r--r--templates/ru/class-confirm.tmpl4
-rw-r--r--templates/ru/class-deleted.tmpl4
-rw-r--r--templates/ru/class-jobs-header.tmpl2
-rw-r--r--templates/ru/class-modified.tmpl4
-rw-r--r--templates/ru/class.tmpl15
-rw-r--r--templates/ru/classes.tmpl4
-rw-r--r--templates/ru/command.tmpl6
-rw-r--r--templates/ru/edit-config.tmpl8
-rw-r--r--templates/ru/error-op.tmpl4
-rw-r--r--templates/ru/error.tmpl4
-rw-r--r--templates/ru/header.tmpl.in72
-rw-r--r--templates/ru/help-header.tmpl4
-rw-r--r--templates/ru/help-trailer.tmpl1
-rw-r--r--templates/ru/job-cancel.tmpl4
-rw-r--r--templates/ru/job-hold.tmpl4
-rw-r--r--templates/ru/job-move.tmpl4
-rw-r--r--templates/ru/job-moved.tmpl4
-rw-r--r--templates/ru/job-release.tmpl4
-rw-r--r--templates/ru/job-restart.tmpl4
-rw-r--r--templates/ru/jobs-header.tmpl4
-rw-r--r--templates/ru/list-available-printers.tmpl4
-rw-r--r--templates/ru/modify-class.tmpl3
-rw-r--r--templates/ru/modify-printer.tmpl3
-rw-r--r--templates/ru/norestart.tmpl4
-rw-r--r--templates/ru/option-trailer.tmpl2
-rw-r--r--templates/ru/pager.tmpl4
-rw-r--r--templates/ru/printer-accept.tmpl4
-rw-r--r--templates/ru/printer-added.tmpl4
-rw-r--r--templates/ru/printer-cancel-jobs.tmpl5
-rw-r--r--templates/ru/printer-configured.tmpl6
-rw-r--r--templates/ru/printer-confirm.tmpl4
-rw-r--r--templates/ru/printer-default.tmpl6
-rw-r--r--templates/ru/printer-deleted.tmpl4
-rw-r--r--templates/ru/printer-jobs-header.tmpl2
-rw-r--r--templates/ru/printer-modified.tmpl6
-rw-r--r--templates/ru/printer-purge.tmpl9
-rw-r--r--templates/ru/printer-reject.tmpl4
-rw-r--r--templates/ru/printer-start.tmpl6
-rw-r--r--templates/ru/printer-stop.tmpl4
-rw-r--r--templates/ru/printer.tmpl16
-rw-r--r--templates/ru/printers.tmpl4
-rw-r--r--templates/ru/restart.tmpl8
-rw-r--r--templates/ru/search.tmpl2
-rw-r--r--templates/ru/set-printer-options-header.tmpl2
-rw-r--r--templates/ru/set-printer-options-trailer.tmpl2
-rw-r--r--templates/ru/subscription-added.tmpl4
-rw-r--r--templates/ru/subscription-canceled.tmpl4
-rw-r--r--templates/ru/test-page.tmpl4
-rw-r--r--templates/ru/trailer.tmpl13
-rw-r--r--templates/ru/users.tmpl3
-rw-r--r--templates/set-printer-options-header.tmpl2
-rw-r--r--templates/set-printer-options-trailer.tmpl2
-rw-r--r--templates/subscription-added.tmpl4
-rw-r--r--templates/subscription-canceled.tmpl4
-rw-r--r--templates/test-page.tmpl4
-rw-r--r--templates/trailer.tmpl13
-rw-r--r--templates/users.tmpl3
-rw-r--r--test/4.1-requests.test4
-rw-r--r--test/4.2-cups-printer-ops.test5
-rw-r--r--test/4.3-job-ops.test4
-rw-r--r--test/4.4-subscription-ops.test4
-rw-r--r--test/5.1-lpadmin.sh31
-rw-r--r--test/5.2-lpc.sh4
-rw-r--r--test/5.3-lpq.sh4
-rw-r--r--test/5.4-lpstat.sh6
-rw-r--r--test/5.5-lp.sh25
-rw-r--r--test/5.6-lpr.sh12
-rw-r--r--test/5.7-lprm.sh4
-rw-r--r--test/5.8-cancel.sh18
-rw-r--r--test/5.9-lpinfo.sh4
-rw-r--r--test/Dependencies31
-rw-r--r--test/Makefile77
-rw-r--r--test/cancel-current-job.test4
-rw-r--r--test/create-printer-subscription.test54
-rwxr-xr-xtest/everywhere/bonjour-tests.sh1
-rwxr-xr-xtest/everywhere/document-format-tests.sh1
-rw-r--r--test/everywhere/document-format-tests.test9689
-rwxr-xr-xtest/everywhere/ipp-tests.sh1
-rw-r--r--test/everywhere/ipp-tests.test12086
-rw-r--r--test/fax-job.test59
-rw-r--r--test/get-completed-jobs.test8
-rw-r--r--test/get-job-template-attributes.test24
-rw-r--r--test/get-jobs.test8
-rw-r--r--test/get-notifications.test46
-rw-r--r--test/get-printer-attributes-2.0.test2
-rw-r--r--test/get-printer-description-attributes.test43
-rw-r--r--test/identify-printer-display.test21
-rw-r--r--test/identify-printer-multiple.test21
-rw-r--r--test/identify-printer.test20
-rw-r--r--test/ipp-1.1.test102
-rw-r--r--test/ipp-2.0.test4
-rw-r--r--test/ipp-2.1.test4
-rw-r--r--test/ipp-2.2.test4
-rw-r--r--test/ipp-everywhere.test9689
-rw-r--r--test/ippdiscover.c829
-rw-r--r--test/ippfind.c2847
-rw-r--r--test/ippinfra.c7125
-rw-r--r--test/ippinfra.man103
-rw-r--r--test/ippproxy.c29
-rw-r--r--test/ippproxy.man59
-rw-r--r--test/ippserver.c5537
-rw-r--r--test/ippserver.man172
-rw-r--r--test/ipptool.c2446
-rwxr-xr-xtest/make-ippeverywhere-print-tests.sh84
-rw-r--r--test/onepage-a4-300-black-1.pwg.gzbin0 -> 152826 bytes
-rw-r--r--test/onepage-letter-300-black-1.pwg.gzbin0 -> 137724 bytes
-rw-r--r--test/print-job-and-wait.test45
-rw-r--r--test/print-job-deflate.test31
-rw-r--r--test/print-job-gzip.test31
-rw-r--r--test/print-job-password.test31
-rw-r--r--test/printer.opacitybin18493 -> 42698 bytes
-rw-r--r--test/printer.pngbin5133 -> 6744 bytes
-rwxr-xr-xtest/run-stp-tests.sh544
-rw-r--r--test/str-header.html21
-rw-r--r--test/test.convs8
-rw-r--r--test/testhp.ppd33
-rw-r--r--test/testps.ppd4
-rw-r--r--test/validate-job.test23
-rw-r--r--test/xmltotest.c4
-rw-r--r--vc2005/cups.sln78
-rw-r--r--vc2005/ipptool.vcproj199
-rw-r--r--vc2005/libcups2.vcproj1611
-rw-r--r--vc2005/testfile.vcproj202
-rw-r--r--vc2005/testhttp.vcproj202
-rw-r--r--vcnet/README.txt27
-rw-r--r--vcnet/config.h197
-rw-r--r--vcnet/cups.sln54
-rw-r--r--vcnet/ippfind.vcproj (renamed from vc2005/cupstestppd.vcproj)103
-rw-r--r--vcnet/ippserver.vcproj (renamed from vc2005/libcupsimage2.vcproj)136
-rw-r--r--vcnet/ipptool-installer.vdproj353
-rw-r--r--vcnet/libcups2-installer.vdproj933
-rw-r--r--vcnet/libcups2.vcproj57
-rw-r--r--vcnet/regex.vcproj154
-rw-r--r--vcnet/regex/regcomp.c2
-rw-r--r--vcnet/sw-ippeveselfcert10.vdproj1581
-rw-r--r--xcode/CUPS.xcodeproj/project.pbxproj1096
-rw-r--r--xcode/config.h141
1085 files changed, 126752 insertions, 55925 deletions
diff --git a/CHANGES-1.6.txt b/CHANGES-1.6.txt
new file mode 100644
index 0000000..23e1422
--- /dev/null
+++ b/CHANGES-1.6.txt
@@ -0,0 +1,244 @@
+CHANGES-1.6.txt
+---------------
+
+CHANGES IN CUPS V1.6.4
+
+ - Removed some duplicate size definitions for some ISO sizes that were
+ causing problems (<rdar://problem/14722721>)
+ - The IPP backend did not add the "last-document" attribute
+ (<rdar://problem/114660379>)
+ - Added a SyncOnClose directive to cups-files.conf to force cupsd to
+ call fsync before closing any configuration/state files it writes
+ (<rdar://problem/14523043>)
+ - Added USB quirk rule for Lexmark E238 (<rdar://problem/14493054>)
+ - Closed server connections were still not always detected
+ (<rdar://problem/14484313>)
+ - The libusb-based USB backend now loads its list of quirks from files
+ in /usr/share/cups/usb instead of using a hardcoded table
+ (<rdar://problem/14442769>)
+ - The scheduler did not properly register ICC color profiles with
+ colord (<rdar://problem/14455625>)
+
+
+CHANGES IN CUPS V1.6.3
+
+ - The configure script now prefers Clang over GCC.
+ - Fixed a compile problem on AIX (STR #4307)
+ - The default IPP version did not always get set before creating a new
+ IPP request message (<rdar://problem/14401718>)
+ - The lp, lpq, lpr, and lpstat now display an error message advising the
+ use of the /version=1.1 ServerName option (<rdar://problem/14290628>)
+ - Added documentation about the /version=1.1 option to ServerName in
+ client.conf (<rdar://problem/14216262>)
+ - httpStatus(HTTP_ERROR) did not return a useful error message
+ (<rdar://problem/14217326>)
+ - The lp, lpq, lpr, and lpstat commands incorrectly ignored the default
+ printer set in the lpoptions file (<rdar://problem/14216472>)
+ - Fixed a URI encoding issue for hostnames containing the ` (backquote)
+ character (<rdar://problem/14243133>)
+ - Added support for RFC 6874's IPv6 link local address format in URIs
+ (<rdar://problem/13979453>)
+ - The USB backend could crash on libusb-based systems if USB was
+ disabled in the BIOS (<rdar://problem/13875729>)
+ - Fixed a rounding error in the PWG media size mapping code
+ (<rdar://problem/13493241>)
+ - Fixed several ipptool test files that used old STATUS names.
+ - Kerberos credentials could get truncated when printing to a shared
+ printer.
+ - Printing using "ipps" URIs was not encrypted.
+ - Insecure ICC profiles prevented installation of user profiles for a
+ printer on OS X.
+ - Added more USB quirks for the libusb-based backend (STR #4311,
+ <rdar://problem/13736470>)
+ - The Russian web interface templates were broken (STR #4310)
+ - The scheduler no longer tries to do Kerberos authentication over the
+ loopback interface.
+ - The IPP backend could fail to pause a job for authentication
+ (STR #4298)
+ - Fixed a regression on the handling of auth keys on OS X if the
+ cups-files.conf was not present or did not contain a SystemAuthKey
+ value.
+ - The scheduler incorrectly did a reverse lookup of the server address
+ when HostNameLookups was turned off (STR #4302)
+ - The scheduler incorrectly computed the final content type value when
+ null filters were present.
+
+
+CHANGES IN CUPS V1.6.2
+
+ - Documentation fixes (STR #4229, STR #4239, STR #4234, STR #4248,
+ STR #4259)
+ - Security: All file, directory, user, and group settings are now stored
+ in a separate cups-files.conf configuration file that cannot be set
+ through the CUPS web interface or APIs (STR #4223)
+ - Added a Czech localization (STR #4201)
+ - Added a French localization (STR #4247)
+ - Added a Russian localization (STR #4228, STR #4285)
+ - Updated the Catalan localization (STR #4202)
+ - Local certificate authentication did not guard against an empty
+ certification file (STR #4293)
+ - The scheduler did not reject device URIs with spaces.
+ - Added USB quirk rule for Epson Stylus Photo 750 (STR #4286)
+ - The IPP backend could crash if the printer disconnects early
+ (STR #4284)
+ - cupsGetPPD did not work with statically-configured CUPS shared
+ queues (STR #4178)
+ - The scheduler did not support long MIME media types (STR #4270)
+ - The cupsfilter command did not set the CHARSET environment variable
+ for the text filters (STR #4273)
+ - The lp command did not show errors for unknown "--foo" (STR #4261)
+ - Bad IPP responses could crash ipptool (STR #4262)
+ - Updated USB quirk rules for Canon and Xerox printers (STR #4217,
+ STR #4263)
+ - Added USB blacklisting for printers that require a custom backend
+ (STR #4218)
+ - The PPD compiler did not correctly JCL options (STR #4115, STR #4203)
+ - The ipptool program now supports DEFINE-MATCH and DEFINE-NO-MATCH
+ predicates for STATUS directives.
+ - Fixed a problem with local Kerberos authentication (STR #4140)
+ - Coverity scan: fixed some minor issues (STR #4242)
+ - The scheduler did not remove color profiles after deleting a printer
+ (STR #4232, STR #4276)
+ - The CUPS library did not always detect a timed out connection to the
+ server which could cause temporary loss of printing from applications
+ (STR #4187)
+ - The ipptool program now supports variable substitution in OPERATION
+ and DELAY directives (STR #4175)
+ - The IPP backend now stops queues when the server configuration
+ prevents successful job submission (STR #4125)
+ - The XML output of ipptool contained empty dictionaries (STR #4136)
+ - The scheduler did not delete job control backup files (STR #4244)
+ - cupsGetPPD3 could return a local PPD instead of the correct remote
+ PPD.
+ - The scheduler incorrectly advertised auth-info-required for local
+ queues needing local authentication (STR #4205)
+ - CUPS 1.6 clients using the ServerName directive in client.conf did not
+ work with CUPS 1.3.x or older servers (STR #4231, STR #4291)
+ - The SNMP backend now tries to work around broken printers that use a
+ newline to separate key/value pairs.
+ - The IPP backend did not send a cancel request to printers when a job
+ was canceled and the printer did not support Create-Job.
+ - Fixed EPM packaging files (STR #4199)
+ - OpenBSD build fix (STR #4195, STR #4196, STR #4197)
+ - The scheduler could crash when using Avahi (STR #4183, STR #4192,
+ STR #4200, STR #4213)
+ - The IPP backend could get stuck in an endless loop on certain network
+ errors (STR #4194)
+ - 32-bit builds failed on Debian (STR #4133)
+ - The scheduler no longer accepts or sends job description attributes.
+ - The IPP backend now works around some conformance issues for broken
+ printers (STR #4190)
+ - cupsBackendReport() now filters out all control characters from the
+ reported 1284 device IDs (STR #4124)
+ - The scheduler no longer allows job-name values that are not valid
+ network Unicode strings (STR #4072)
+ - The web interface did not preserve the order of classes, jobs, or
+ printers (STR #4170)
+ - The network backends now support disabling of SNMP supply level
+ queries via the "snmp" URI option (STR #4106)
+ - The IPP backend did not specify the compression used (STR #4181)
+ - ipptool did not support octetString values.
+ - The scheduler did not recognize dnssd: or ipps: URIs as Bonjour shared
+ queues (STR #4158)
+ - Applications could not get the PPD file for statically-configured
+ Bonjour-shared print queues (STR #4159)
+ - The cupsd.conf file included obsolete browsing directives (STR #4157)
+ - Fixed a USB backend compatibility issue on systems using libusb
+ (STR #4155, STR #4191)
+ - Some Bonjour features were not available on systems with Avahi
+ (STR #4156)
+ - CUPS now includes the port number in the Host: header for HTTP
+ requests.
+ - Fixed REPEAT-MATCH for STATUS and EXPECT - was incorrectly erroring
+ out.
+
+
+CHANGES IN CUPS V1.6.1
+
+ - Documentation fix (STR #4149)
+ - RPM packaging fixes (STR #4129, #4145)
+ - The Japanese and English web interface headers were swapped
+ (STR #4148)
+
+
+CHANGES IN CUPS V1.6.0
+
+ - Document changes (STR #4131)
+ - Added new Catalan (STR #4107) and Spanish (STR #4137) localizations.
+
+
+CHANGES IN CUPS V1.6rc1
+
+ - Added a new Japanese localization (STR #4122)
+ - The SNMP backend no longer exits if it is unable to obtain an IPv6
+ socket (STR #4109)
+ - The LPD backend incorrectly used "localhost" in the control file
+ instead of the current hostname.
+
+
+CHANGES IN CUPS V1.6b1
+
+ - Documentation updates (STR #3927, STR #3980, STR #4010, STR #4068)
+ - The scheduler now consolidates all PPD updates from filters at the
+ end of the job (STR #4075)
+ - CUPS now supports color management using colord (STR #3808)
+ - CUPS now supports Bonjour using Avahi (STR #3066)
+ - The PreserveJobFiles and PreserveJobHistory directives now support
+ specification of a time interval (STR #3143)
+ - PPD files can now be archived in (gzip'd) tar files to further reduce
+ the disk space used by PPD files (STR #3772)
+ - The network backends now deal with printers that report their levels
+ in percent but do not specify a maximum capacity of 100 (STR #3551)
+ - The network backends now report full/almost-full waste bins in
+ printers along with end-of-life for cleaning pads (STR #4017)
+ - Added a configure option to set the permissions of the installed
+ cupsd (STR #3459)
+ - Added a new WITH-ALL-VALUES directive to ipptool EXPECT predicates
+ (STR #3949)
+ - CUPS now supports a User directive in client.conf and the CUPS_USER
+ environment variable for overriding the default username (STR #3114)
+ - Now set the PJL USERNAME variable as needed (STR #3100)
+ - Added support for usernames and passwords longer than 32 characters
+ (STR #2856)
+ - Added a new MaxHoldTime directive to automatically cancel jobs that
+ have been held indefinitely after a specific number of seconds
+ (STR #2291)
+ - The LPD backend now uses the originating host name when it is not the
+ local system (STR #2053)
+ - CUPS now prefers the suffix "dpcm" when reporting resolution in dots-
+ per-centimeter (STR #4006)
+ - The configure script and build system no longer support building of
+ separate 32-bit and 64-bit libraries.
+ - The "brightness", "columns", "fitplot", "gamma", "hue",
+ "natural-scaling", "penwidth", "position", "ppi", "saturation", and
+ "scaling" options are not longer supported (STR #4010)
+ - The "page-bottom", "page-left", "page-right", "page-top",
+ "prettyprint", and "wrap" options have been deprecated (STR #4010)
+ - The scheduler now reports the standard "number-of-documents" attribute
+ instead of the CUPS-specific "document-count" attribute in
+ job objects.
+ - Added new destination connection and enumeration functions (STR #3924)
+ - Added new option, localization, and job submission functions that do
+ not depend on PPD files (STR #3925)
+ - Added a new MaxJobTime directive for cupsd that specifies the maximum
+ amount of time allowed for a job to complete before it is canceled.
+ - The default password callback now supports passwords up to 127
+ characters.
+ - The scheduler now supports a DefaultAuthType of "auto" to
+ automatically choose between Basic (username/password) and Negotiate
+ (Kerberos) authentication.
+ - cupsSideChannelSNMPGet/Walk now support OIDs and values up to 64k in
+ length.
+ - CUPS no longer supports automatic remote printers or implicit classes
+ via the CUPS, LDAP, or SLP protocols (STR #3922, STR #3923)
+ - The PPD APIs are now deprecated and will be removed in a future
+ version of CUPS (STR #3927)
+ - The default IPP version for requests is now 2.0 (STR #3929)
+ - The IPP APIs no longer expose the ipp_t or ipp_attribute_t structures
+ and instead provide accessor functions (STR #3928)
+ - The scheduler will no longer run programs with group write permission.
+ - The PHP module has been removed (STR #3932)
+ - The bannertops, commandtoescpx, commandtopclx, imagetops,
+ imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops
+ filters have been removed (STR #3930)
+ - The serial and parallel backends have been removed (STR 3935)
diff --git a/CHANGES-1.7.txt b/CHANGES-1.7.txt
new file mode 100644
index 0000000..d3438ff
--- /dev/null
+++ b/CHANGES-1.7.txt
@@ -0,0 +1,250 @@
+CHANGES-1.7.txt
+---------------
+
+CHANGES IN CUPS V1.7.5
+
+ - Security: Addressed some more situations where symlinked files would
+ be served by the web interface (STR #4455)
+ - The LPD backend did not work with some versions of glibc (STR #4452)
+ - CGI scripts did not work (STR #4454)
+ - The cupsd.conf man page did not list the ErrorPolicy directive
+ (STR #4457)
+ - Updated the Brazilian Portuguese translation (STR #4456)
+
+
+CHANGES IN CUPS V1.7.4
+
+ - Security: The web interface incorrectly served symlinked files and
+ files that were not world-readable, potentially leading to a
+ disclosure of information (STR #4450)
+ - The CUPS headers incorrectly needed libdispatch for blocks support
+ (STR #4397)
+ - CUPS did not compile when Avahi or mDNSResponder was not present
+ (STR #4402, STR #4424)
+ - The "snmp" option did not work with the network backends (STR #4422)
+ - The User directive in client.conf did not override the USER
+ environment variable (STR #4426)
+ - The web interface now properly shows a "Go" button for all text-based
+ browsers (STR #4425)
+ - The MaxJobTime directive now properly supports time values (STR #4434)
+ - The RPM spec file did not work due to the new Brazilian Portuguese
+ localization (STR #4436)
+ - Fixed an "IPP read error" issue (STR #4440)
+ - Fixed the --disable-libusb configure option (STR #4439)
+ - Fixed the debug output from the DNS-SD backend when using Avahi
+ (STR #4444)
+ - Fixed a bug in the CUPS_SC_GET_DEVICE_ID handling by the network
+ backends (STR #4447)
+ - Added USB quirk rule for Lexmark E230 (STR #4448)
+
+
+CHANGES IN CUPS V1.7.3
+
+ - Added Brazilian Portuguese translation (STR #4409)
+ - Fixed mapping of OutputBin values such as "Tray1"
+ (<rdar://problem/16685606>)
+ - Several ippGet* functions incorrectly returned -1 instead of 0 on
+ error.
+ - The cupsGetResponse function did not work properly with
+ CUPS_HTTP_DEFAULT (<rdar://problem/16762593>)
+ - The IPP backend did not abort a job when the printer did not validate
+ the supplied options (<rdar://problem/16836752>)
+ - Fixed an authentication race condition in cupsSendRequest (STR #4403)
+ - The scheduler did not add the "job-hold-until-specified" reason when
+ holding a job using the lp command (STR #4405)
+ - The configure script incorrectly added libgcrypt as a GNU TLS
+ dependency (STR #4399)
+ - cupsGetDestMediaCount did not work for CUPS_MEDIA_FLAGS DEFAULT
+ (STR #4414)
+ - Auto-typing of PWG Raster files did not work (STR #4417)
+ - IPP queues using hardcoded credentials would ask for credentials
+ (STR #4371)
+ - Dates in non-UTF-8 locales did not display correctly (STR #4388)
+ - The RPM spec file now looks for libusb-devel 1.0 or later.
+ - Fixed the "create-printer-subscription.test" file for IPPTOOL
+ (STR #4420)
+
+
+CHANGES IN CUPS V1.7.2
+
+ - Security: The scheduler now blocks URLs containing embedded HTML
+ (STR #4356)
+ - Documentation fixes (STR #3259, STR #4346, STR #4355)
+ - Fixed the Japanese localization (STR #4385)
+ - Added a German localization (STR #4363)
+ - The cupsfilter command incorrectly read the cupsd.conf file; it now
+ reads the cups-files.conf file instead.
+ - Fixed OS X builds with Xcode 5.x (<rdar://problem/15914959>)
+ - Fixed SSL support on Windows (STR #4358)
+ - Fixed documentation and naming of Create-Job/Printer-Subscriptions
+ operations (STR #4389)
+ - Phone numbers in fax jobs were not properly filtered for IPP FaxOut
+ (<rdar://problem/16351701>)
+ - Updated Linux "relro" support (STR #4349)
+ - Fixed a memory leak in the label printer driver (STR #4393)
+ - cupsEnumDests did not set the "is_default" field (STR #4332)
+ - cupsDoIORequest could miss the server status, causing failed lpadmin
+ and other administrative commands (STR #4386)
+ - cupsEnumDests didn't always call the callback function (STR #4380)
+ - "lp -i job-id -H hold" did not work (STR #nnn)
+ - CUPS didn't compile on older platforms (STR #4338)
+ - Several libcups files did not have the Apple license exception
+ notice (STR #4361)
+ - Fixed a D-BUS threading issue that caused the scheduler to crash
+ (STR #4347)
+ - The scheduler now automatically reconnects to Avahi as needed
+ (STR #4370, STR #4373)
+ - The scheduler did not handle GET requests for the log files properly
+ (STR #3265)
+ - The dnssd backend did not always report all discovered printers using
+ Avahi (STR #4365)
+ - The Zebra printer driver did not properly handle negative "label top"
+ values (STR #4354)
+ - The scheduler did not always update the MakeModel value in
+ printers.conf after updating the driver (STR #4264)
+ - The LPD mini daemon did not support print jobs larger than 2GB
+ (STR #4351)
+ - Fixed a bug in the status reading code when sending a compressed data
+ stream to an IPP printer/server (<rdar://problem/16019623>)
+ - The IPP backend might not include all job attributes in Validate-Job
+ operations (<rdar://problem/16025435>)
+ - Fixed some clang-reported issues (<rdar://problem/15936066>)
+
+
+CHANGES IN CUPS V1.7.1
+
+ - Security: the lppasswd program incorrectly used settings from
+ ~/.cups/client.conf (STR #4319)
+ - Auto debug logging was broken in 1.7.0 (<rdar://problem/15331639>)
+ - Some gzip'd PPD files could not be used (<rdar://problem/15386424>)
+ - Cleaned up some job logging in the scheduler
+ (<rdar://problem/15332672>)
+ - ATTR messages could cause string pool memory corruption in the
+ scheduler (<rdar://problem/15382819>)
+ - The RPM spec file did not list the build requirements; this was on
+ purpose, but now we are listing the Red Hat package names
+ (<rdar://problem/15375760>, STR #4322)
+ - Printing to a raw queue could result in corrupt output due to
+ opportunistic compression (<rdar://problem/15008524>)
+ - The GNU TLS support code triggered many compiler warnings due to the
+ use of old GNU TLS compatibility type names
+ (<rdar://problem/15392966>)
+ - The "make check" test suite did not work on Linux without the
+ cups-filters package installed (<rdar://problem/14292998>)
+ - Japanese PPDs using with the Shift-JIS encoding did not work
+ (<rdar://problem/15427759>)
+ - "tel:" URIs incorrectly had slashes (<rdar://problem/15418463>)
+ - The libusb-based USB backend incorrectly used write timeouts
+ (<rdar://problem/15564888>)
+ - Shared printers could become inaccessible after a few days on OS X
+ (<rdar://problem/15426838>)
+ - The IPP backend did not wait for a busy printer to become available
+ before attempting to print (<rdar://problem/15465667>)
+ - CUPS did not support "auto-monochrome" or "process-monochrome" for the
+ "print-color-mode" option (<rdar://problem/15482520>)
+ - Using "@IF(name)" in an Allow or Deny rule did not work (STR #4328)
+ - lpq and lpstat did not list jobs in the correct order when priorities
+ were specified (STR #4326)
+ - The D-BUS notifier did not remove its lockfile (STR #4314)
+ - CUPS incorrectly used the USER environment variable when the name did
+ not match the user ID (STR #4327)
+
+
+CHANGES IN CUPS V1.7.0
+
+ - Updated the Japanese localization.
+ - The lpadmin command did not send the PPD name from the "-m" option
+ (<rdar://problem/15264697>)
+ - Network backends now use the prtMarkerSuppliesClass property to
+ determine the direction of supply level values
+ (<rdar://problem/14302628>)
+ - The scheduler did not remove backup PPD files when a printer was
+ deleted (<rdar://problem/15065555>)
+ - The scheduler incorrectly responded to HEAD requests when the web
+ interface was disabled (<rdar://problem/15090332>)
+ - The scheduler did not respond using the hostname specified by the
+ client (<rdar://problem/14583574>)
+ - Fax queues did not work when shared via Bonjour
+ (<rdar://problem/14498310>)
+ - Error messages from the scheduler were not localized using the
+ language specified in the client's IPP request
+ (<rdar://problem/14128011>)
+ - Added an Italian localization (<rdar://problem/14481578>)
+ - Fixed a couple memory leaks in ippfind that were reported by Clang.
+ - Fixed a compile issue on 64-bit Linux with Clang - need to use the
+ -pie option instead of -Wl,-pie now (<rdar://problem/14480938>)
+ - The ippfind utility reported the wrong port numbers when compiled
+ against Avahi (<rdar://problem/14508324>)
+ - httpGetFd, httpGetFile, httpPutFd, and httpPutFile did not
+ automatically reconnect if the server closed the connecion after the
+ previous response.
+ - Fixed a compile error in libcups (<rdar://problem/14467141>)
+ - The scheduler incorrectly did not pass a FINAL_CONTENT_TYPE
+ environment variable to the filters or backend
+ (<rdar://problem/14355011>)
+ - The cups-exec helper program could fail randomly on OS X due to
+ sandbox violations when closing excess file descriptors
+ (<rdar://problem/14421943>)
+ - The scheduler incorrectly did not use the kqueue interface on OS X.
+
+
+CHANGES IN CUPS V1.7rc1
+
+ - Printer xxx-default values were not reported by Get-Printer-Attributes
+ or lpoptions (<rdar://problem/14401795>)
+ - Fixed deprecation warnings for many functions on OS X so they are tied
+ to the deployment version when building (<rdar://problem/14210079>)
+ - Fixed a build issue on ARM-based Linux systems - unable to validate
+ va_list arguments.
+ - Added a new ippfind tool for finding IPP printers and other Bonjour
+ services (<rdar://problem/13876199>)
+ - Fixed some issues with conversion of PWG media size names to
+ hundredths of millimeters (<rdar://problem/14065748>)
+ - The IPP backend could crash on OS X when printing to a Kerberized
+ printer (<rdar://problem/14040186>)
+ - The ipptool program now automatically extends timeouts when the
+ output buffer is filled (<rdar://problem/14016099>)
+ - The ipptool program now supports the --help and --version options.
+ - The ipptool program did not continue past include file errors by
+ default (<rdar://problem/13875803>)
+ - The ipptool program now supports FILE-ID and TEST-ID directives and
+ includes their values in its XML output (<rdar://problem/13876038>)
+ - The ipptool program now supports WITH-HOSTNAME, WITH-RESOURCE, and
+ WITH-SCHEME expect predicates to compare the corresponding URI
+ components (<rdar://problem/13876091>)
+
+
+CHANGES IN CUPS V1.7b1
+
+ - The configure script now supports a --with-rundir option to change
+ the transient run-time state directory from the default to other
+ locations like /run/cups (STR #4306)
+ - The scheduler now supports PPD lookups for classes (STR #4296)
+ - The cupsfilter program did not set the FINAL_CONTENT_TYPE
+ environment variable for filters.
+ - Added a new "-x" option to the cancel command (STR #4103)
+ - Made the PWG media handling APIs public (STR #4267)
+ - Implemented ready media support for the cupsGetDestMediaXxx APIs
+ (STR #4289)
+ - Added new cupsFindDestDefault, cupsFindDestReady, and
+ cupsFindDestSupported APIs (STR #4289)
+ - Added new cupsGetDestMediaByIndex, cupsGetDestMediaCount, and
+ cupsGetDestMediaDefault APIs (STR #4289)
+ - Added new ippGet/SetOctetString APIs for getting and setting an
+ octetString value (STR #4289)
+ - Added new ippCreateRequestedArray API for generating a array of
+ attributes from the requested-attributes attribute.
+ - The ipptool utility now supports compression, conditional tests based
+ on the presence of files, and new DEFINE predicates for STATUS.
+ - Added new IPP APIs for checking values (STR #4167)
+ - Added new IPP APis for adding and setting formatted strings.
+ - Added new HTTP APIs to support basic server functionality via libcups.
+ - The dnssd backend now generates a 1284 device ID as needed (STR #3702)
+ - CUPS now supports compressing and decompressing streamed data
+ (STR #4168)
+ - CUPS now supports higher-level PIN printing, external accounting
+ systems, and "print here" printing environments (STR #4169)
+ - IRIX is no longer a supported operating system (STR #4092)
+ - The PPD compiler now supports JCL options properly (STR #4115)
+ - The web interface now checks whether the web browser has cookies
+ enabled and displays a suitable error message (STR #4141)
diff --git a/CHANGES-2.0.txt b/CHANGES-2.0.txt
new file mode 100644
index 0000000..dc46f03
--- /dev/null
+++ b/CHANGES-2.0.txt
@@ -0,0 +1,215 @@
+CHANGES-2.0.txt
+---------------
+
+CHANGES IN CUPS V2.0.4
+
+ - Fixed a bug in cupsRasterWritePixels (STR #4650)
+ - Fixed redirection in the web interface (STR #4538)
+ - The IPP backend did not respond to side-channel requests (STR #4645)
+ - The scheduler did not start all pending jobs at once (STR #4646)
+ - The web search incorrectly searched time-at-xxx values (STR #4652)
+ - Fixed an RPM spec file issue (STR #4657)
+ - The scheduler incorrectly started jobs while canceling multiple jobs
+ (STR #4648)
+ - Fixed processing of server overrides without port numbers (STR #4675)
+ - Documentation changes (STR #4651, STR #4674)
+
+
+CHANGES IN CUPS V2.0.3
+
+ - Security: Fixed CERT VU #810572 exploiting the dynamic linker
+ (STR #4609)
+ - Security: The scheduler could hang with malformed gzip data
+ (STR #4602)
+ - Restored missing generic printer icon file (STR #4587)
+ - Fixed logging of configuration errors to show up as errors (STR #4582)
+ - Fixed potential buffer overflows in raster code and filters
+ (STR #4598, STR #4599, STR #4600, STR #4601)
+ - Fixed a gzip processing bug (#4602)
+ - Fixed <Limit> inside <Location> (STR #4575)
+ - Fixed lpadmin when both -m and -o are used (STR #4578)
+ - The web interface always showed support for 2-sided printing
+ (STR #4595)
+ - cupsRasterReadHeader did not fully validate the raster header
+ (STR #4596)
+ - The rastertopwg filter did not check for truncated input (STR #4597)
+ - The cups-lpd mini-daemon did not check for request parameters
+ (STR #4603)
+ - The scheduler could get caught in a busy loop (STR #4605)
+ - The sample Epson driver could crash (STR #4616)
+ - The IPP backend now correctly monitors jobs
+ (<rdar://problem/20495955>)
+ - The ppdhtml and ppdpo utilities crashed when the -D option was used
+ before a driver information file (STR #4627)
+ - ippfind incorrectly substituted "=port" for service_port.
+ - The IPP/1.1 test file did not handle the initial print job
+ completing early (STR #4576)
+ - Fixed a memory leak in cupsConnectDest (STR #4634)
+ - PWG Raster Format output contained invalid ImageBox values
+ (<rdar://problem/21144309>)
+ - Added Russian translation (STR #4577)
+ - Added German translation (STR #4635)
+
+
+CHANGES IN CUPS V2.0.2
+
+ - Security: cupsRasterReadPixels buffer overflow with invalid page
+ header and compressed raster data (STR #4551)
+ - Command-line programs were not localized on Mac OS X
+ (<rdar://problem/14546232>)
+ - The scheduler incorrectly cleared the MakeModel string in the
+ printers.conf file after a restart (<rdar://problem/16827518>)
+ - CUPS did not compile with older versions of GNU TLS (STR #4527)
+ - CUPS did not compile without Avahi or mDNSResponder (STR #4523)
+ - ippLength() did not return the correct length for IPP_TAG_CONST
+ string values.
+ - The scheduler incorrectly aborted jobs after a job was restarted
+ (<rdar://problem/19129387>)
+ - The cups-files.conf file contained the old ServerCertificate/Key
+ directives instead of ServerKeychain.
+ - Fixed builds when no SSL/TLS library is available, or when explicitly
+ disabled (STR #4531)
+ - Fixed an OpenBSD charset transcoding issue.
+ - Fixed USB printing on OpenBSD (STR #4525)
+ - The --without-xinetd configure option did not work (STR #4542)
+ - Backends needing to load OS X kernel extensions did not work
+ (<rdar://problem/19015679>)
+ - Mapping of PPD keywords to IPP keywords did not work if the PPD
+ keyword was already an IPP keyword (<rdar://problem/19121005>)
+ - cupsGetPPD* sent bad requests (STR #4567)
+ - ippserver used the wrong temporary directory on Windows (STR #4547)
+ - ippserver did not handle Bonjour registrations properly (STR #4548)
+ - The scheduler could crash during shutdown if Avahi was shutdown
+ first (STR #4550)
+ - Added a USB quirk rule for Intermec printers (STR #4553)
+ - The scheduler did not always log which configuration file had the
+ error (STR #4559)
+ - The ippfind and ipptool programs now correctly match hostnames with
+ trailing dots (STR #4563)
+ - The ipptool timeout option did not work (STR #4515)
+ - Fixed several issues with client.conf, CUPS_SERVER, and the "-h"
+ option of most commands (STR #4528)
+ - Another change for OpenBSD (STR #4526)
+ - Added Japanese localization (STR #4524)
+ - Documentation changes (STR #4569)
+
+
+CHANGES IN CUPS V2.0.1
+
+ - Security: SSLv3 is now disabled by default to protect against the
+ POODLE attack (STR #4476)
+ - Printer sharing did not work when systemd was being used (STR #4497)
+ - cupsGetPPD* would return a symlink to the PPD in /etc/cups/ppd even if
+ it was not readable by the user (STR #4500)
+ - The web interface now protects against frame "click-jacking" attacks
+ (STR #4492)
+ - Fixed a crash in ippAttributeString (<rdar://problem/17903871>)
+ - Fixed a crash in the scheduler on Linux/*BSD if colord was not running
+ (STR #4496)
+ - Fixed a random crash in the scheduler when not using systemd
+ (STR #4484)
+ - Added systemd support for cups-lpd (STR #4493)
+ - The scheduler did not honor the FatalErrors directive for mis-
+ configured Group and SystemGroup values (STR #4495)
+ - The network backends no longer report waste-receptacle conditions when
+ using SNMP (STR #4499)
+ - The IPP backend did not work with some configurations of Windows
+ (STR #4503)
+ - RPMs did not build (STR #4490)
+ - Added a USB quirk rule for the Brother HL-1250 (STR #4519)
+ - Fixed compiles on unsupported platforms (STR #4510)
+ - "cancel -a" did not cancel all jobs on all destinations (STR #4513)
+ - The web interface did not work on OpenBSD (STR #4496)
+
+
+CHANGES IN CUPS V2.0.0
+
+ - The scheduler did not preserve listener sockets from launchd or
+ systemd after a restart (<rdar://problem/18112848>)
+ - Added some USB quirk rules for the libusb-based USB backend
+ (STR #4482)
+ - Spanish localization update (STR #4487)
+ - Updated documentation for 2.0.0 release.
+
+
+CHANGES IN CUPS V2.0rc1
+
+ - Documentation updates (STR #4464)
+ - The scheduler now monitors the AC power status on OS X, allowing for
+ "sleep printing" when sharing printers (<rdar://problem/17325852>)
+ - The scheduler incorrectly called launch_activate_socket multiple times
+ on OS X (<rdar://problem/17523218>)
+ - The ippserver test program now passes the IPP Everywhere self-
+ certification tests (STR #4101)
+ - Relaxed the new OS X filter sandbox slightly (STR #4471,
+ <rdar://problem/17483959>)
+ - Dropped the old Epson Stylus Color/Photo sample drivers since they
+ don't work with any current printers and there are free alternatives
+ that produce much better output (<rdar://problem/18036889>)
+ - Log and configuration files that are not world-readable are again
+ accessible via the web interface (STR #4461)
+ - PPD files are now created using the permissions specified by the
+ ConfigFilePerm directive.
+ - Fixed RPM build issues (STR #4459)
+ - Fixed the spinner image and restart page when reconfiguring the
+ scheduler through the web interface (STR #4475)
+
+
+CHANGES IN CUPS V2.0b1
+
+ - Added a "--list-filters" option to the cupsfilter command (STR #4325)
+ - Added systemd support (STR #3917)
+ - Added support for re-sending a job as a raster file if a higher-level
+ format such as PDF fails (<rdar://problem/15583721>)
+ - Added support for regular expression matching in the MIME type rules
+ (<rdar://problem/11131245>)
+ - Added support for TLS certificate validation and policy enforcement
+ (STR #1616)
+ - Added support for simultaneous XML and test output from ipptool.
+ - Added support for PAUSE directive in ipptool test files.
+ - Added support for auto-typing of TIFF files by ipptool (STR #4418)
+ - The scheduler now returns completed jobs in the correct newest-to-
+ oldest order (STR #4396)
+ - The configure script now supports target-specific tools for pkg-config
+ and others (STR #4423)
+ - The ipptool program now supports EXPECT statements for collection
+ member attributes (<rdar://problem/15355218>)
+ - The ipptool program now supports collection attributes with multiple
+ values (<rdar://problem/15355124>)
+ - The sample drivers now include all of the installed localizations by
+ default (<rdar://problem/14756625>)
+ - Adopted Linux man page conventions and updated all man pages
+ (STR #4372, STR #4329)
+ - The scheduler now supports the "first-index" operation attribute for
+ the Get-Jobs operation (STR #2913)
+ - Changed the default AccessLogLevel and PageLogFormat to disable the
+ access_log and page_log files by default (<rdar://problem/16495000>)
+ - cupsRasterInterpretPPD now supports the Orientation header in order to
+ support long-edge feed raster printers (<rdar://problem/15837926>)
+ - The scheduler now allows run-as-root backends to have group read and
+ execute permissions (STR #2935)
+ - The ippFindAttribute and ippFindNextAttribute functions now support
+ hierarchical searches (STR #4395)
+ - Dropped OpenSSL support in favor of GNU TLS.
+ - Dropped "dark wake" support on OS X, which was preventing portables
+ from going to sleep when there was a stuck job. We now use a variation
+ of the CUPS 1.4 sleep support to do a cleaner sleep
+ (<rdar://problem/14323704>)
+ - Dropped support for AIX, HP-UX, and OSF/1 (aka Digital UNIX)
+ - Dropped lppasswd and support for Digest authentication in in the
+ scheduler (STR #4321)
+ - The cupsGetClasses, cupsGetPrinters, and cupsTempFile functions are no
+ longer supported.
+ - The scheduler now caches more job history data and limits the number
+ of completed jobs returned by Get-Jobs as needed in order to prevent a
+ denial-of-service on busy servers (STR #2913)
+ - The filter/backend sandbox on OS X now defaults to a more strict
+ whitelist (<rdar://problem/15939788>)
+ - Increased the default idle exit timeout to 60 seconds on OS X
+ (<rdar://problem/16041820>)
+ - Printer classes were not accessible on OS X
+ (<rdar://problem/16385643>)
+ - The scheduler now uses </DefaultPrinter> to close the default printer
+ definition in printers.conf (STR #4153)
+ - Canceling all jobs in the web interface now just cancels the jobs
+ (STR #1914)
diff --git a/CHANGES-IPPTOOL.txt b/CHANGES-IPPTOOL.txt
index e69de29..c96addb 100644
--- a/CHANGES-IPPTOOL.txt
+++ b/CHANGES-IPPTOOL.txt
@@ -0,0 +1,168 @@
+CHANGES-IPPTOOL.txt - 2015-05-15
+--------------------------------
+
+This file provides a list of changes to the ipptool binary distribution posted
+on CUPS.org.
+
+2014-05-15
+
+ - Added support for simultaneous XML and test output from ipptool.
+ - Added support for PAUSE directive in ipptool test files.
+
+
+2013-07-15
+
+ - New ippfind tool now included with ipptool.
+ - Added support for automatically extending the timeout when all of the
+ request data has not yet been written (all platforms but Windows
+ which does not support it...)
+ - Fixed several ipptool test files that used old STATUS names.
+
+
+2013-04-18
+
+ - Fixed some HTTP issues with authentication and compression.
+ - The IPP/1.1 test file did not allow for sufficient retries when
+ printing.
+ - The IPP/1.1 test file did not allow for empty printer-name values.
+ - The IPP Everywhere test file contained numerous errors.
+ - The color.jpg test file used a progressive mode instead of the
+ baseline JPEG mode.
+ - The IPP/1.1 test file referenced "color.jpeg" instead of "color.jpg".
+
+
+2013-01-31
+
+ - Added support for DEFINE-MATCH and DEFINE-NO-MATCH as STATUS
+ predicates.
+ - Added support for WITH-VALUE and resolution values.
+ - Added support for SKIP-IF-MISSING (skip test if file is missing)
+ - Added support for octetString values.
+ - Added support for document compression in Print-Job and Send-Document
+ requests.
+ - Fixed REPEAT-MATCH for STATUS and EXPECT - was incorrectly erroring
+ out.
+ - Fixed a bug where bad IPP responses would cause ipptool to crash.
+
+
+2012-02-28
+
+ - Changed behavior of WITH-VALUES "/regex/" to not require all values to
+ match.
+ - Added WITH-ALL-VALUES directive for EXPECT predicates that require all
+ values to match.
+ - Updated test files to use WITH-ALL-VALUES where necessary.
+ - Updated test files to use new ABNF for media names from PWG Media
+ Names 2.0.
+
+
+2012-02-06
+
+ - Fixed the packaging of ipptool on Windows (removed unnecessary DLLs)
+ - Fixed an crash in ipptool when mixing DISPLAY with -I and a failed
+ request.
+ - Added a Print-Job test file.
+ - Added a "setdebug" batch file for Windows
+ - Added support for a CUPS_DISABLE_ASYNC_CONNECT environment variable.
+
+
+2012-01-10
+
+ - Fixed an issue with the IPP/1.1 test file where the "waiting for job
+ completion" test did not work.
+ - The attribute groups out of order error was not shown for the
+ operation-attributes-tag group.
+
+
+2011-12-02
+
+ - Fixed a truncated XML output bug that would happen for certain errors.
+ - Fixed the order-of-groups tests.
+ - Fixed "WITH-VALUE >N" for rangeOfInteger attributes.
+ - The Windows installer was missing the get-printer-attributes.test
+ file.
+ - The Linux binaries are now compiled for all LSB 4.x-compliant Linux
+ distributions.
+ - The Linux binaries no longer support SSL or TLS.
+
+
+2011-10-05
+
+ - Fixed a crasher bug that showed up on Windows.
+ - The IPP/1.1 test would hang if the initial Print-Job test failed.
+ - Fixed a typo in the IPP/2.0 test.
+
+
+2011-10-03
+
+ - Using OF-TYPE with the "no-value" or "unknown" out-of-band value tags
+ now works without special WITH-VALUE strings.
+ - ipptool now shows an error when an attribute appears more than once
+ within the same attribute group.
+ - ipptool did not display attributes as specified by the DISPLAY
+ directive when a test error failed.
+ - Fixed one spot where DEFINE-VALUE was still treated as an error when
+ the EXPECT test failed.
+ - uriScheme values were not displayed properly.
+ - Updated the IPP/1.1 tests to properly validate support for
+ job-hold-until-default and job-hold-until-supported when the Hold-Job
+ operation is supported.
+ - Updated the IPP/1.1 tests to properly check for the various standard
+ media sizes for the printing tests.
+ - Updated the IPP/1.1 tests to accept "no-value" for media-default an
+ orientation-requested-default.
+ - Updated the IPP/1.1 tests to accept "unknown" for job-state.
+ - Updated the IPP/1.1 tests to not perform the bogus URI printing tests
+ unless the "document-uri" variable is defined.
+ - Updated the IPP/2.0 tests to properly validate media-col
+ "media-xxx-supported" attributes.
+ - Updated the IPP/2.2 tests to properly validate media-ready and
+ media-col-ready.
+
+
+2011-09-28
+
+ - Test output now includes a summary and overall score at the end.
+ - The MATCH-VALUE predicate now correctly deals with a failed EXPECT
+ condition.
+ - The IPP/1.1 test suite now looks for legacy media names and uses them
+ if the corresponding PWG standard names are not present.
+ - The IPP/1.1 test suite now tests the Print-Job+Release-Job when the
+ printer supports the job-hold-until attribute, Hold-Job operation, and
+ Release-Job operation.
+
+
+2011-09-21
+
+ - Fixes for HTTP chunking, timeout, and encryption issues reported by
+ various users.
+ - Greatly improved IPP tests with added IPP/2.2 tests.
+ - New test documents - 1-page and 4-page mixed A4/Letter PDF/PS and a
+ couple JPEGs.
+ - New REPEAT directives to programmatically repeat tests as needed.
+
+
+2011-08-16
+
+ - The Windows version no longer requires Visual Studio to be installed.
+ - The Windows version now supports SSL.
+ - Added "ipps" URI support.
+ - Added a new "-T" option.
+ - Added support for fractional seconds for the -i option and DELAY
+ directive.
+ - Added support for authentication.
+ - Added DEFINE-MATCH, DEFINE-NO-MATCH, DEFINE-VALUE, IF-NOT-DEFINED,
+ IGNORE-ERRORS, SKIP-IF-DEFINED, SKIP-IF-NOT-DEFINED,
+ SKIP-PREVIOUS-ERROR directives.
+ - WITH-VALUE now supports variable expansion.
+ - Updated the IPP/1.1 conformance test to skip the "my-jobs different
+ user" test if the printer URI contains a username.
+ - Updated the IPP conformance tests to validate media, media-default,
+ and media-supported values.
+ - No longer error out if a Printer returns a different version number in
+ the response when the request contains the version 0.0.
+
+
+2010-10-16
+
+ - Initial release of standalone binary.
diff --git a/CHANGES.txt b/CHANGES.txt
index 35d38fb..566a4e3 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,244 +1,113 @@
-CHANGES.txt - 1.6.4 - 2013-09-24
+CHANGES.txt - 2.1.2 - 2015-12-02
--------------------------------
-CHANGES IN CUPS V1.6.4
+CHANGES IN CUPS V2.1.2
+
+ - Re-release of CUPS 2.1.1 as CUPS 2.1.2 due to error in tagging of the
+ 2.1.1 release (pulled content from the 2.2.x tree instead)
+
+
+CHANGES IN CUPS V2.1.1
+
+ - Security hardening fixes (<rdar://problem/23131948>,
+ <rdar://problem/23132108>, <rdar://problem/23132353>,
+ <rdar://problem/23132803>, <rdar://problem/23133230>,
+ <rdar://problem/23133393>, <rdar://problem/23133466>,
+ <rdar://problem/23133833>, <rdar://problem/23133998>,
+ <rdar://problem/23134228>, <rdar://problem/23134299>,
+ <rdar://problem/23134356>, <rdar://problem/23134415>,
+ <rdar://problem/23134506>, <rdar://problem/23135066>,
+ <rdar://problem/23135122>, <rdar://problem/23135207>,
+ <rdar://problem/23144290>, <rdar://problem/23144358>,
+ <rdar://problem/23144461>)
+ - The cupsGetPPD* functions did not work with IPP printers (STR #4725)
+ - Some older HP LaserJet printers need a delayed close when printing
+ using the libusb-based USB backend (STR #4549)
+ - The libusb-based USB backend did not unload the kernel usblp module
+ if it was preventing the backend from accessing the printer
+ (STR #4707)
+ - Current Primera printers were incorrectly reported as Fargo printers
+ (STR #4708)
+ - The IPP backend did not always handle jobs getting canceled at the
+ printer (<rdar://problem/22716820>)
+ - Scheduler logging change (STR #4728)
+ - Added USB quirk for Canon MP530 (STR #4730)
+ - The scheduler did not deliver job notifications for jobs submitted to
+ classes (STR #4733)
+ - Changing the printer-is-shared value for a remote queue did not
+ produce an error (STR #4738)
+ - The IPP backend incorrectly included the job-password attribute in
+ Validate-Job requests (<rdar://problem/23531939>)
+ - Updated localizations (STR #4709)
+
+
+CHANGES IN CUPS V2.1.0
+
+ - Fixed more scheduler crash bugs in the new logging code (STR #4687,
+ STR #4690)
+ - The scheduler did not use the ConfigFilePerm setting when copying PPD
+ files or interface scripts attached to a request (STR #4703)
+ - Now support new Chinese locale IDs and their correct fallback locales
+ (<rdar://problem/22086642>, <rdar://problem/22130168>)
+ - "make check" incorrectly reported an expectation of 18 warning
+ messages when 8 were expected (STR #4684)
+ - The new PDF file type rule did not work (STR #4692)
+ - The scheduler did not update the jobs.cache file when job files were
+ expired (STR #4706)
+ - Fixed some configure script issues (STR #4694, STR #4695, STR #4698)
+ - Documentation updates (STR #4691, STR #4693)
+
+
+CHANGES IN CUPS V2.1rc1
+
+ - Added support for 3D printers (basic types only, no built-in filters)
+ based on PWG white paper.
+ - Fixed bugs in the new journald support (STR #4655, STR #4658,
+ STR #4661)
+ - Fixed domain socket support on Linux (STR #4679)
+ - Fixed signal handlers in the dnssd and usb backends (STR #4671)
+ - <Limit All> in <Policy> sections now applies to all operations when
+ used by itself (STR #4659)
+ - Configure script changes for systemd support (STR #4669)
+ - Updated autoconf sources to use newer form of AC_INIT (STR #4664)
+
+
+CHANGES IN CUPS V2.1b1
+
+ - Improved speed of ppdMarkDefaults for complex/large PPDs
+ (<rdar://problem/15146999>)
+ - The IPP backend now stops sending print data if the printer indicates
+ the job has been aborted or canceled (<rdar://problem/17837631>)
+ - The IPP backend now sends the job-pages-per-set attribute when
+ printing multiple copy jobs with finishings
+ (<rdar://problem/16792757>)
+ - The IPP backend now updates the cupsMandatory values when the printer
+ configuration changes (<rdar://problem/18126570>)
+ - No longer install banner files since third-party banner filters now
+ supply their own (STR #4518)
+ - Added support for EXPECT-ALL directive in ipptool test files
+ (STR #4469)
+ - Added support for WITH-VALUE-FROM predicate in ipptool test files
+ (STR #4470)
+ - The scheduler no longer listens on the loopback interface unless the
+ web interface or printer sharing are enabled
+ (<rdar://problem/9136448>)
+ - Added a PPD generator for IPP Everywhere printers (STR #4258)
+ - Now install "default" versions of more configuration files
+ (<rdar://problem/19024491>)
+ - The cupstestppd program did not handle "maxsize(nnn)" entries in
+ cupsFilter/cupsFilter2 values (<rdar://problem/18974858>)
+ - The scheduler now checks the return value of rename() calls
+ (STR #4589)
+ - The scheduler now validates ErrorPolicy values in config files
+ (STR #4591)
+ - Long cookies caused the web interface to stop working (STR #4619)
+ - Added SSLOptions values to allow Diffie-Hellman key exchange and
+ disable TLS/1.0 support.
+ - Updated the scheduler to support more IPP Everywhere attributes
+ (STR #4630)
+ - The scheduler now supports advanced ASL and journald logging when
+ "syslog" output is configured (STR #4474)
+ - The scheduler now supports logging to stderr when running in the
+ foreground (STR #4505)
- - Removed some duplicate size definitions for some ISO sizes that were
- causing problems (<rdar://problem/14722721>)
- - The IPP backend did not add the "last-document" attribute
- (<rdar://problem/114660379>)
- - Added a SyncOnClose directive to cups-files.conf to force cupsd to
- call fsync before closing any configuration/state files it writes
- (<rdar://problem/14523043>)
- - Added USB quirk rule for Lexmark E238 (<rdar://problem/14493054>)
- - Closed server connections were still not always detected
- (<rdar://problem/14484313>)
- - The libusb-based USB backend now loads its list of quirks from files
- in /usr/share/cups/usb instead of using a hardcoded table
- (<rdar://problem/14442769>)
- - The scheduler did not properly register ICC color profiles with
- colord (<rdar://problem/14455625>)
-
-
-CHANGES IN CUPS V1.6.3
-
- - The configure script now prefers Clang over GCC.
- - Fixed a compile problem on AIX (STR #4307)
- - The default IPP version did not always get set before creating a new
- IPP request message (<rdar://problem/14401718>)
- - The lp, lpq, lpr, and lpstat now display an error message advising the
- use of the /version=1.1 ServerName option (<rdar://problem/14290628>)
- - Added documentation about the /version=1.1 option to ServerName in
- client.conf (<rdar://problem/14216262>)
- - httpStatus(HTTP_ERROR) did not return a useful error message
- (<rdar://problem/14217326>)
- - The lp, lpq, lpr, and lpstat commands incorrectly ignored the default
- printer set in the lpoptions file (<rdar://problem/14216472>)
- - Fixed a URI encoding issue for hostnames containing the ` (backquote)
- character (<rdar://problem/14243133>)
- - Added support for RFC 6874's IPv6 link local address format in URIs
- (<rdar://problem/13979453>)
- - The USB backend could crash on libusb-based systems if USB was
- disabled in the BIOS (<rdar://problem/13875729>)
- - Fixed a rounding error in the PWG media size mapping code
- (<rdar://problem/13493241>)
- - Fixed several ipptool test files that used old STATUS names.
- - Kerberos credentials could get truncated when printing to a shared
- printer.
- - Printing using "ipps" URIs was not encrypted.
- - Insecure ICC profiles prevented installation of user profiles for a
- printer on OS X.
- - Added more USB quirks for the libusb-based backend (STR #4311,
- <rdar://problem/13736470>)
- - The Russian web interface templates were broken (STR #4310)
- - The scheduler no longer tries to do Kerberos authentication over the
- loopback interface.
- - The IPP backend could fail to pause a job for authentication
- (STR #4298)
- - Fixed a regression on the handling of auth keys on OS X if the
- cups-files.conf was not present or did not contain a SystemAuthKey
- value.
- - The scheduler incorrectly did a reverse lookup of the server address
- when HostNameLookups was turned off (STR #4302)
- - The scheduler incorrectly computed the final content type value when
- null filters were present.
-
-
-CHANGES IN CUPS V1.6.2
-
- - Documentation fixes (STR #4229, STR #4239, STR #4234, STR #4248,
- STR #4259)
- - Security: All file, directory, user, and group settings are now stored
- in a separate cups-files.conf configuration file that cannot be set
- through the CUPS web interface or APIs (STR #4223)
- - Added a Czech localization (STR #4201)
- - Added a French localization (STR #4247)
- - Added a Russian localization (STR #4228, STR #4285)
- - Updated the Catalan localization (STR #4202)
- - Local certificate authentication did not guard against an empty
- certification file (STR #4293)
- - The scheduler did not reject device URIs with spaces.
- - Added USB quirk rule for Epson Stylus Photo 750 (STR #4286)
- - The IPP backend could crash if the printer disconnects early
- (STR #4284)
- - cupsGetPPD did not work with statically-configured CUPS shared
- queues (STR #4178)
- - The scheduler did not support long MIME media types (STR #4270)
- - The cupsfilter command did not set the CHARSET environment variable
- for the text filters (STR #4273)
- - The lp command did not show errors for unknown "--foo" (STR #4261)
- - Bad IPP responses could crash ipptool (STR #4262)
- - Updated USB quirk rules for Canon and Xerox printers (STR #4217,
- STR #4263)
- - Added USB blacklisting for printers that require a custom backend
- (STR #4218)
- - The PPD compiler did not correctly JCL options (STR #4115, STR #4203)
- - The ipptool program now supports DEFINE-MATCH and DEFINE-NO-MATCH
- predicates for STATUS directives.
- - Fixed a problem with local Kerberos authentication (STR #4140)
- - Coverity scan: fixed some minor issues (STR #4242)
- - The scheduler did not remove color profiles after deleting a printer
- (STR #4232, STR #4276)
- - The CUPS library did not always detect a timed out connection to the
- server which could cause temporary loss of printing from applications
- (STR #4187)
- - The ipptool program now supports variable substitution in OPERATION
- and DELAY directives (STR #4175)
- - The IPP backend now stops queues when the server configuration
- prevents successful job submission (STR #4125)
- - The XML output of ipptool contained empty dictionaries (STR #4136)
- - The scheduler did not delete job control backup files (STR #4244)
- - cupsGetPPD3 could return a local PPD instead of the correct remote
- PPD.
- - The scheduler incorrectly advertised auth-info-required for local
- queues needing local authentication (STR #4205)
- - CUPS 1.6 clients using the ServerName directive in client.conf did not
- work with CUPS 1.3.x or older servers (STR #4231, STR #4291)
- - The SNMP backend now tries to work around broken printers that use a
- newline to separate key/value pairs.
- - The IPP backend did not send a cancel request to printers when a job
- was canceled and the printer did not support Create-Job.
- - Fixed EPM packaging files (STR #4199)
- - OpenBSD build fix (STR #4195, STR #4196, STR #4197)
- - The scheduler could crash when using Avahi (STR #4183, STR #4192,
- STR #4200, STR #4213)
- - The IPP backend could get stuck in an endless loop on certain network
- errors (STR #4194)
- - 32-bit builds failed on Debian (STR #4133)
- - The scheduler no longer accepts or sends job description attributes.
- - The IPP backend now works around some conformance issues for broken
- printers (STR #4190)
- - cupsBackendReport() now filters out all control characters from the
- reported 1284 device IDs (STR #4124)
- - The scheduler no longer allows job-name values that are not valid
- network Unicode strings (STR #4072)
- - The web interface did not preserve the order of classes, jobs, or
- printers (STR #4170)
- - The network backends now support disabling of SNMP supply level
- queries via the "snmp" URI option (STR #4106)
- - The IPP backend did not specify the compression used (STR #4181)
- - ipptool did not support octetString values.
- - The scheduler did not recognize dnssd: or ipps: URIs as Bonjour shared
- queues (STR #4158)
- - Applications could not get the PPD file for statically-configured
- Bonjour-shared print queues (STR #4159)
- - The cupsd.conf file included obsolete browsing directives (STR #4157)
- - Fixed a USB backend compatibility issue on systems using libusb
- (STR #4155, STR #4191)
- - Some Bonjour features were not available on systems with Avahi
- (STR #4156)
- - CUPS now includes the port number in the Host: header for HTTP
- requests.
- - Fixed REPEAT-MATCH for STATUS and EXPECT - was incorrectly erroring
- out.
-
-
-CHANGES IN CUPS V1.6.1
-
- - Documentation fix (STR #4149)
- - RPM packaging fixes (STR #4129, #4145)
- - The Japanese and English web interface headers were swapped
- (STR #4148)
-
-
-CHANGES IN CUPS V1.6.0
-
- - Document changes (STR #4131)
- - Added new Catalan (STR #4107) and Spanish (STR #4137) localizations.
-
-
-CHANGES IN CUPS V1.6rc1
-
- - Added a new Japanese localization (STR #4122)
- - The SNMP backend no longer exits if it is unable to obtain an IPv6
- socket (STR #4109)
- - The LPD backend incorrectly used "localhost" in the control file
- instead of the current hostname.
-
-
-CHANGES IN CUPS V1.6b1
-
- - Documentation updates (STR #3927, STR #3980, STR #4010, STR #4068)
- - The scheduler now consolidates all PPD updates from filters at the
- end of the job (STR #4075)
- - CUPS now supports color management using colord (STR #3808)
- - CUPS now supports Bonjour using Avahi (STR #3066)
- - The PreserveJobFiles and PreserveJobHistory directives now support
- specification of a time interval (STR #3143)
- - PPD files can now be archived in (gzip'd) tar files to further reduce
- the disk space used by PPD files (STR #3772)
- - The network backends now deal with printers that report their levels
- in percent but do not specify a maximum capacity of 100 (STR #3551)
- - The network backends now report full/almost-full waste bins in
- printers along with end-of-life for cleaning pads (STR #4017)
- - Added a configure option to set the permissions of the installed
- cupsd (STR #3459)
- - Added a new WITH-ALL-VALUES directive to ipptool EXPECT predicates
- (STR #3949)
- - CUPS now supports a User directive in client.conf and the CUPS_USER
- environment variable for overriding the default username (STR #3114)
- - Now set the PJL USERNAME variable as needed (STR #3100)
- - Added support for usernames and passwords longer than 32 characters
- (STR #2856)
- - Added a new MaxHoldTime directive to automatically cancel jobs that
- have been held indefinitely after a specific number of seconds
- (STR #2291)
- - The LPD backend now uses the originating host name when it is not the
- local system (STR #2053)
- - CUPS now prefers the suffix "dpcm" when reporting resolution in dots-
- per-centimeter (STR #4006)
- - The configure script and build system no longer support building of
- separate 32-bit and 64-bit libraries.
- - The "brightness", "columns", "fitplot", "gamma", "hue",
- "natural-scaling", "penwidth", "position", "ppi", "saturation", and
- "scaling" options are not longer supported (STR #4010)
- - The "page-bottom", "page-left", "page-right", "page-top",
- "prettyprint", and "wrap" options have been deprecated (STR #4010)
- - The scheduler now reports the standard "number-of-documents" attribute
- instead of the CUPS-specific "document-count" attribute in
- job objects.
- - Added new destination connection and enumeration functions (STR #3924)
- - Added new option, localization, and job submission functions that do
- not depend on PPD files (STR #3925)
- - Added a new MaxJobTime directive for cupsd that specifies the maximum
- amount of time allowed for a job to complete before it is canceled.
- - The default password callback now supports passwords up to 127
- characters.
- - The scheduler now supports a DefaultAuthType of "auto" to
- automatically choose between Basic (username/password) and Negotiate
- (Kerberos) authentication.
- - cupsSideChannelSNMPGet/Walk now support OIDs and values up to 64k in
- length.
- - CUPS no longer supports automatic remote printers or implicit classes
- via the CUPS, LDAP, or SLP protocols (STR #3922, STR #3923)
- - The PPD APIs are now deprecated and will be removed in a future
- version of CUPS (STR #3927)
- - The default IPP version for requests is now 2.0 (STR #3929)
- - The IPP APIs no longer expose the ipp_t or ipp_attribute_t structures
- and instead provide accessor functions (STR #3928)
- - The scheduler will no longer run programs with group write permission.
- - The PHP module has been removed (STR #3932)
- - The bannertops, commandtoescpx, commandtopclx, imagetops,
- imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops
- filters have been removed (STR #3930)
- - The serial and parallel backends have been removed (STR 3935)
diff --git a/CREDITS.txt b/CREDITS.txt
index b5721c4..d2a8ca5 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -1,4 +1,4 @@
-CREDITS.txt - 2012-07-16
+CREDITS.txt - 2013-07-23
------------------------
Few projects are completed by one person, and CUPS is no exception. We'd
@@ -39,6 +39,7 @@ like to thank the following individuals for their contributions:
Vincenzo Reale - Italian localization.
Petter Reinholdtsen - HP-UX compiler stuff.
Juan Pablo González Riopedre - Spanish localization.
+ Giovanni Scafora - Italian localization.
Opher Shachar - Hebrew localization.
Stuart Stevens - HP JetDirect IPP information.
Andrea Suatoni - IRIX desktop integration and testing.
diff --git a/INSTALL.txt b/INSTALL.txt
index 1688a2b..762b888 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,4 +1,4 @@
-INSTALL - CUPS v1.6.4 - 2013-09-24
+INSTALL - CUPS v2.1.2 - 2015-12-02
----------------------------------
This file describes how to compile and install CUPS from source code. For more
@@ -29,18 +29,16 @@ BEFORE YOU BEGIN
Compaq, HP, SGI, and Sun. BSD users should use GNU make (gmake) since BSD
make does not support "include".
- Besides these tools you'll want the JPEG, PNG, TIFF, and ZLIB libraries for
- image support, the CDSA, GNU TLS, or OpenSSL libraries for encryption
- support, the OpenLDAP and OpenSLP libraries for directory services support,
- and either MIT (1.6.3 or higher) or Heimdal Kerberos for Kerberos support.
- CUPS will compile and run without these, however you'll miss out on many of
- the features provided by CUPS.
+ Besides these tools you'll want ZLIB library for compression support, the
+ CDSA, GNU TLS, or OpenSSL libraries for encryption support, and either MIT
+ (1.6.3 or higher) or Heimdal Kerberos for Kerberos support. CUPS will
+ compile and run without these, however you'll miss out on many of the
+ features provided by CUPS.
- Also, please note that CUPS does not include the Ghostscript-based
- PostScript filter needed by non-PostScript printers. You *must* download
- GPL Ghostscript separately from the CUPS web site if you want to print
- PostScript files to non-PostScript printers on operating systems other than
- OS X.
+ Also, please note that CUPS does not include print filters to support PDF
+ or raster printing. You *must* download GPL Ghostscript and/or the Open
+ Printing CUPS filters package separately to print on operating systems
+ other than OS X.
COMPILING THE SUBVERSION REPOSITORY CODE
@@ -100,6 +98,11 @@ CONFIGURATION
and diagnose a variety of common problems - use the "--enable-unit-tests"
configure option to run them at build time.
+ On OS X, use the "--with-archflags" option to build with the correct set of
+ architectures:
+
+ ./configure --with-archflags="-arch i386 -arch x86_64" ...
+
Once you have configured things, just type:
make ENTER
@@ -138,6 +141,10 @@ INSTALLING THE SOFTWARE
gmake install ENTER
+ Use the BUILDROOT variable to install to an alternate root directory:
+
+ make BUILDROOT=/some/other/root/directory install ENTER
+
You can also build binary packages that can be installed on other machines
using the RPM spec file ("packaging/cups.spec") or EPM list file
("packaging/cups.list"). The latter also supports building of binary RPMs,
@@ -149,7 +156,7 @@ INSTALLING THE SOFTWARE
The EPM software is available at:
- http://www.epmhome.org/
+ http://www.msweet.org/
CREATING BINARY DISTRIBUTIONS WITH EPM
@@ -167,17 +174,11 @@ CREATING BINARY DISTRIBUTIONS WITH EPM
following:
epm - Builds a script + tarfile package
- aix - Builds an AIX package
bsd - Builds a *BSD package
deb - Builds a Debian package
- depot - Builds a HP-UX package (also swinstall)
- inst - Builds an IRIX package (also tardist)
pkg - Builds a Solaris package
rpm - Builds a RPM package
- setld - Build a Tru64 UNIX package
slackware - Build a Slackware package
- swinstall - Build a HP-UX package (also depot)
- tardist - Builds an IRIX package (also inst)
GETTING DEBUG LOGGING FROM CUPS
@@ -199,10 +200,9 @@ GETTING DEBUG LOGGING FROM CUPS
REPORTING PROBLEMS
If you have problems, READ THE DOCUMENTATION FIRST! If the documentation
- does not solve your problems, please post a message on the "cups.general"
- forum at:
+ does not solve your problems, please post a message on the users forum at:
- http://www.cups.org/newsgroups.php
+ http://www.cups.org/
Include your operating system and version, compiler and version, and any
errors or problems you've run into. The "config.log" file and the output
diff --git a/IPPTOOL.txt b/IPPTOOL.txt
index 1d1fce7..2293a45 100644
--- a/IPPTOOL.txt
+++ b/IPPTOOL.txt
@@ -1,4 +1,4 @@
-IPPTOOL.txt - 2012-02-06
+IPPTOOL.txt - 2013-07-15
------------------------
See the file CHANGES-IPPTOOL.txt for a list of changes to this software.
@@ -6,14 +6,46 @@ See the file CHANGES-IPPTOOL.txt for a list of changes to this software.
INTRODUCTION
- CUPS includes a user program called ipptool that can be used to send
- arbitrary IPP requests to a CUPS server or IPP printer. This tool started
- life as part of the CUPS automated test suite and has grown to support
- complex conformance tests and a simple way to query printer, job, and
- subscription attributes.
+ CUPS includes two user programs for IPP printers. The first is called
+ ipptool and can be used to send arbitrary IPP requests to a CUPS server or
+ IPP printer. This tool started life as part of the CUPS automated test
+ suite and has grown to support complex conformance tests and a simple way
+ to query printer, job, and subscription attributes.
+ The second program called ippfind that can be used to find IPP printers
+ that have registered themselves using Bonjour (DNS-SD, mDNS, and Zeroconf)
+ and run commands such as ipptool.
-BASIC USAGE
+
+READING THE DOCUMENTATION
+
+ Full documentation on the ipptool command can be found in the
+ "man-ipptool.html" and "man-ipptoolfile.html" files; the latter describes
+ the test file format supported by ipptool.
+
+ Full documentation on the ippfind command can be found in the
+ "man-ippfind.html" file.
+
+
+IPPFIND BASIC USAGE
+
+ The ippfind command can be used to discover IPP printers on your network.
+ For example, the following command prints the printer URI of registered IPP
+ printers:
+
+ ippfind
+
+ To find all color IPP printers, run:
+
+ ippfind --txt-color T
+
+ And to run the IPP Everywhere conformance test file on every registered IPP
+ printer, run the following command:
+
+ ippfind _ipp._tcp,_print --exec ipptool -t '{}' ipp-everywhere.test \;
+
+
+IPPTOOL BASIC USAGE
The ipptool command requires a printer URI and one or more "test" files that
describe the operations, attributes to display, and expected status and
@@ -54,19 +86,29 @@ STANDARD TEST FILES
state change notifications
get-completed-jobs.test Shows a list of completed jobs
get-jobs.test Shows a list of pending jobs
+ get-notifications.test Shows events for an ippget
+ subscription.
get-printer-attributes.test Shows printer attributes
+ get-subscriptions.test Shows a list of subscriptions
ipp-1.1.test IPP/1.1 conformance test suite
ipp-2.0.test IPP/2.0 conformance test suite
ipp-2.1.test IPP/2.1 conformance test suite
ipp-2.2.test IPP/2.2 conformance test suite
+ ipp-everywhere.test IPP Everywhere conformance test
+ suite
print-job.test Prints a file
+ print-job-deflate.test Prints a file, compressing with
+ deflate.
+ print-job-gzip.test Prints a file, compressing with gzip
+ validate-job.test Validates attributes for a job
+ submission.
CONFORMANCE TESTS
- We provide basic IPP conformance tests for IPP/1.1, IPP/2.0, IPP/2.1, and
- IPP/2.2. For a given printer URI, the following commands perform tests at
- each level:
+ We provide basic IPP conformance tests for IPP/1.1, IPP/2.0, IPP/2.1,
+ IPP/2.2, and IPP Everywhere. For a given printer URI, the following
+ commands perform tests at each level:
ipptool -tf filename [options] -I printer-uri ipp-1.1.test
ipptool -tf filename [options] -I -V 2.0 printer-uri ipp-2.0.test
@@ -104,6 +146,7 @@ CONFORMANCE TESTS
-S Test IPP over HTTPS (default for ipps: URIs)
-T seconds Set a timeout for responses in seconds
-v Be verbose, showing all attributes sent and received
+ -X Produce XML (Apple plist) output
The printer-uri must be a URI supported by the printer using the "ipp" or
"ipps" scheme, for example:
@@ -112,7 +155,7 @@ CONFORMANCE TESTS
ipps://192.168.0.1/ipp/print
Print-by-reference (URL) printing can be tested by defining the document-uri
- variable to a URL, for example:
+ variable as a URL, for example:
ipptool -tf filename -d document-uri=url -I printer-uri ipp-1.1.test
@@ -128,37 +171,40 @@ CONFORMANCE TESTS
printer.
-READING THE DOCUMENTATION
+IPP EVERYWHERE TESTING
+
+ The IPP Everywhere tests use sample PWG raster files available from:
- The command usage is described in the ipptest(1) man page, while the file
- format is described in the ipptestfile(5) man page. Both are provided in
- HTML format with the standalone releases of ipptool.
+ ftp://ftp.pwg.org/pub/pwg/ipp/examples
+
+ Extract the corresponding ZIP archives into the current directory before
+ running the ipp-everywhere.test file. The test file will attempt to print
+ each PWG Raster file that is supported by the printer being tested - up to
+ 372 pages including the 90 pages produced by the regular IPP test suite.
GETTING SUPPORT AND OTHER RESOURCES
- If you have problems, READ THE DOCUMENTATION FIRST! We also provide many
+ If you have problems, READ THE DOCUMENTATION FIRST! We also provide
discussion forums which are available at:
- http://www.cups.org/newsgroups.php
-
- See the CUPS web site at "http://www.cups.org/" for other resources.
+ http://www.cups.org/
REPORTING BUGS
- If you believe you have discovered a bug in ipptool, please fill out the
- bug form at:
+ If you believe you have discovered a bug in ippfind or ipptool, please fill
+ out the bug form at:
http://www.cups.org/str.php
- Be sure to identify the version of CUPS and ipptool (if you downloaded the
- standalone version) you are using, the printer (if any) and firmware
- version, and include any files that apply.
+ Be sure to identify the version of CUPS and ippfind/ipptool (if you
+ downloaded the standalone version) you are using, the printer (if any) and
+ firmware version, and include any files that apply.
- If you downloaded the standalone version of ipptool, please also re-run the
- test with debug logging enabled. Run the following commands on Windows to
- enable debug logging:
+ If you downloaded the standalone version of ippfind/ipptool, please also
+ re-run the command with debug logging enabled. Run the following commands
+ on Windows to enable debug logging:
setdebug.bat
@@ -167,14 +213,14 @@ REPORTING BUGS
CUPS_DEBUG_LOG=ipptool.log; export CUPS_DEBUG_LOG
CUPS_DEBUG_LEVEL=6; export CUPS_DEBUG_LEVEL
- Then when you run the ipptool command a new "ipptool.log" file will be
- created with detailed information - attach this file to the bug you file
- as well.
+ Then when you run the ippfind or ipptool command a new "ipptool.log" file
+ will be created with detailed information - attach this file to the bug you
+ file as well.
LEGAL STUFF
- CUPS is Copyright 2007-2012 by Apple Inc. CUPS and the CUPS logo are
+ CUPS is Copyright 2007-2013 by Apple Inc. CUPS and the CUPS logo are
trademarks of Apple Inc.
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
diff --git a/LICENSE.txt b/LICENSE.txt
index 75c4a37..658ea1e 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,6 +1,6 @@
CUPS License Agreement
- Copyright 2007-2012 by Apple Inc.
+ Copyright 2007-2013 by Apple Inc.
1 Infinite Loop
Cupertino, CA 95014 USA
@@ -10,9 +10,9 @@
INTRODUCTION
CUPS(tm) is provided under the GNU General Public License ("GPL")
-and GNU Library General Public License ("LGPL"), Version 2, with
-exceptions for Apple operating systems and the OpenSSL toolkit. A
-copy of the exceptions and licenses follow this introduction.
+and GNU Library General Public License ("LGPL"), Version 2, with an
+exception for Apple operating systems. A copy of the exception and
+licenses follow this introduction.
The GNU LGPL applies to the CUPS and CUPS Imaging libraries
located in the "cups" and "filter" subdirectories of the CUPS
@@ -45,7 +45,7 @@ application, driver, or filter.
LICENSE EXCEPTIONS
In addition, as the copyright holder of CUPS, Apple Inc. grants
-the following special exceptions:
+the following special exception:
1. Apple Operating System Development License Exception;
@@ -86,14 +86,8 @@ the following special exceptions:
This file is subject to the Apple OS-Developed
Software exception.
- 2. OpenSSL Toolkit License Exception;
-
- a. Apple Inc. explicitly allows the compilation and
- distribution of the CUPS software with the OpenSSL
- Toolkit.
-
-No developer is required to provide these exceptions in a
-derived work.
+No developer is required to provide this exception in a derived
+work.
KERBEROS SUPPORT CODE
diff --git a/Makedefs.in b/Makedefs.in
index 9132440..3afef0a 100644
--- a/Makedefs.in
+++ b/Makedefs.in
@@ -1,16 +1,16 @@
#
-# "$Id: Makedefs.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makedefs.in 12519 2015-02-17 13:10:19Z msweet $"
#
-# Common makefile definitions for CUPS.
+# Common makefile definitions for CUPS.
#
-# Copyright 2007-2013 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
#
@@ -121,9 +121,9 @@ INSTALLXPC = @INSTALLXPC@
#
ALL_CFLAGS = -I.. -D_CUPS_SOURCE $(CFLAGS) $(SSLFLAGS) \
- @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
+ @LARGEFILE@ @PTHREAD_FLAGS@ $(ONDEMANDFLAGS) $(OPTIONS)
ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) $(SSLFLAGS) \
- @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
+ @LARGEFILE@ @PTHREAD_FLAGS@ $(ONDEMANDFLAGS) $(OPTIONS)
ARCHFLAGS = @ARCHFLAGS@
ARFLAGS = @ARFLAGS@
BACKLIBS = @BACKLIBS@
@@ -138,13 +138,16 @@ DNSSD_BACKEND = @DNSSD_BACKEND@
DSOFLAGS = -L../cups @DSOFLAGS@
DSOLIBS = @DSOLIBS@ $(COMMONLIBS)
DNSSDLIBS = @DNSSDLIBS@
-LAUNCHDLIBS = @LAUNCHDLIBS@
+IPPFIND_BIN = @IPPFIND_BIN@
+IPPFIND_MAN = @IPPFIND_MAN@
LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \
-L../scheduler @LDARCHFLAGS@ \
@LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
-LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ)
+LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(LIBZ)
LINKCUPSIMAGE = @LINKCUPSIMAGE@
LIBS = $(LINKCUPS) $(COMMONLIBS)
+ONDEMANDFLAGS = @ONDEMANDFLAGS@
+ONDEMANDLIBS = @ONDEMANDLIBS@
OPTIM = @OPTIM@
OPTIONS =
PAMLIBS = @PAMLIBS@
@@ -198,8 +201,6 @@ DATADIR = $(BUILDROOT)@CUPS_DATADIR@
DOCDIR = $(BUILDROOT)@CUPS_DOCROOT@
ICONDIR = @ICONDIR@
INCLUDEDIR = $(BUILDROOT)$(includedir)
-INITDIR = @INITDIR@
-INITDDIR = @INITDDIR@
LIBDIR = $(BUILDROOT)$(libdir)
LOCALEDIR = $(BUILDROOT)@CUPS_LOCALEDIR@
LOGDIR = $(BUILDROOT)@CUPS_LOGDIR@
@@ -214,10 +215,7 @@ REQUESTS = $(BUILDROOT)@CUPS_REQUESTS@
SBINDIR = $(BUILDROOT)@sbindir@
SERVERBIN = $(BUILDROOT)@CUPS_SERVERBIN@
SERVERROOT = $(BUILDROOT)@CUPS_SERVERROOT@
-SMFMANIFESTDIR = @SMFMANIFESTDIR@
STATEDIR = $(BUILDROOT)@CUPS_STATEDIR@
-USBQUIRKS = @USBQUIRKS@
-XINETD = @XINETD@
MAN1EXT = @MAN1EXT@
MAN5EXT = @MAN5EXT@
@@ -228,8 +226,15 @@ MAN8DIR = @MAN8DIR@
PAMDIR = @PAMDIR@
PAMFILE = @PAMFILE@
-DEFAULT_LAUNCHD_CONF = @DEFAULT_LAUNCHD_CONF@
DBUSDIR = @DBUSDIR@
+INITDIR = @INITDIR@
+INITDDIR = @INITDDIR@
+LAUNCHD_DIR = @LAUNCHD_DIR@
+SMFMANIFESTDIR = @SMFMANIFESTDIR@
+SYSTEMD_DIR = @SYSTEMD_DIR@
+XINETD = @XINETD@
+
+USBQUIRKS = @USBQUIRKS@
#
@@ -259,5 +264,5 @@ DBUSDIR = @DBUSDIR@
#
-# End of "$Id: Makedefs.in 11173 2013-07-23 12:31:34Z msweet $"
+# End of "$Id: Makedefs.in 12519 2015-02-17 13:10:19Z msweet $"
#
diff --git a/Makefile b/Makefile
index 47495ce..94ce714 100644
--- a/Makefile
+++ b/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $"
#
-# Top-level Makefile for CUPS.
+# Top-level Makefile for CUPS.
#
-# Copyright 2007-2013 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include Makedefs
@@ -98,24 +98,18 @@ clean:
distclean: clean
$(RM) Makedefs config.h config.log config.status
+ $(RM) conf/cups-files.conf conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf
$(RM) cups-config
- $(RM) conf/cups-files.conf conf/cupsd.conf
- $(RM) conf/mime.convs conf/pam.std conf/snmp.conf
- $(RM) doc/help/ref-cups-files-conf.html doc/help/ref-cupsd-conf.html
- $(RM) doc/help/standard.html doc/index.html
- $(RM) man/client.conf.man
- $(RM) man/cups-deviced.man man/cups-driverd.man
- $(RM) man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
- $(RM) man/cupsd.conf.man man/drv.man man/lpoptions.man
+ $(RM) data/testprint
+ $(RM) desktop/cups.desktop
+ $(RM) doc/index.html
+ $(RM) man/client.conf.man man/cups-files.conf.man man/cups-lpd.man man/cups-snmp.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man
$(RM) packaging/cups.list
- $(RM) packaging/cups-desc.plist packaging/cups-info.plist
+ $(RM) scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/org.cups.cups-lpdAT.service scheduler/org.cups.cupsd.path scheduler/org.cups.cupsd.service scheduler/org.cups.cupsd.socket
$(RM) templates/header.tmpl
- $(RM) desktop/cups.desktop
- $(RM) scheduler/cups.sh scheduler/cups-lpd.xinetd
- $(RM) scheduler/org.cups.cups-lpd.plist scheduler/cups.xml
-$(RM) doc/*/index.html
-$(RM) templates/*/header.tmpl
- -$(RM) -r autom4te*.cache clang cups/charmaps cups/locale driver/test
+ -$(RM) -r autom4te*.cache clang cups/charmaps cups/locale
#
@@ -130,8 +124,11 @@ depend:
#
-# Run the clang.llvm.org static code analysis tool on the C sources.
-# (at least checker-231 is required for scan-build to work this way)
+# Run the Clang static code analysis tool on the sources, available here:
+#
+# http://clang-analyzer.llvm.org
+#
+# At least checker-231 is required.
#
.PHONY: clang clang-changes
@@ -143,6 +140,26 @@ clang-changes:
#
+# Run the STACK tool on the sources, available here:
+#
+# http://css.csail.mit.edu/stack/
+#
+# Do the following to pass options to configure:
+#
+# make CONFIGFLAGS="--foo --bar" stack
+#
+
+.PHONY: stack
+stack:
+ stack-build ./configure $(CONFIGFLAGS)
+ stack-build $(MAKE) $(MFLAGS) clean all
+ poptck
+ $(MAKE) $(MFLAGS) distclean
+ $(RM) */*.ll
+ $(RM) */*.ll.out
+
+
+#
# Generate a ctags file...
#
@@ -244,7 +261,7 @@ debugcheck: all unittests
#
-# Create HTML documentation...
+# Create HTML documentation using Mini-XML's mxmldoc (http://www.msweet.org/)...
#
apihelp:
@@ -261,7 +278,7 @@ framedhelp:
#
-# Create an Xcode docset...
+# Create an Xcode docset using Mini-XML's mxmldoc (http://www.msweet.org/)...
#
docset: apihelp
@@ -297,12 +314,12 @@ sloc:
#
-# Make software distributions using EPM (http://www.epmhome.org/)...
+# Make software distributions using EPM (http://www.msweet.org/)...
#
EPMFLAGS = -v --output-dir dist $(EPMARCH)
-aix bsd deb depot inst pkg setld slackware swinstall tardist:
+bsd deb pkg slackware:
epm $(EPMFLAGS) -f $@ cups packaging/cups.list
epm:
@@ -318,7 +335,6 @@ dist: all
case `uname` in \
*BSD*) $(MAKE) $(MFLAGS) bsd;; \
Darwin*) $(MAKE) $(MFLAGS) osx;; \
- IRIX*) $(MAKE) $(MFLAGS) tardist;; \
Linux*) test ! -x /usr/bin/rpm || $(MAKE) $(MFLAGS) rpm;; \
SunOS*) $(MAKE) $(MFLAGS) pkg;; \
esac
@@ -332,5 +348,5 @@ dist: all
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $".
#
diff --git a/README.txt b/README.txt
index ecccc39..91a3c18 100644
--- a/README.txt
+++ b/README.txt
@@ -1,4 +1,4 @@
-README - CUPS v1.6.4 - 2013-09-24
+README - CUPS v2.1.2 - 2015-12-02
---------------------------------
Looking for compile instructions? Read the file "INSTALL.txt" instead...
@@ -41,10 +41,10 @@ READING THE DOCUMENTATION
GETTING SUPPORT AND OTHER RESOURCES
- If you have problems, READ THE DOCUMENTATION FIRST! We also provide many
- discussion forums which are available at:
+ If you have problems, READ THE DOCUMENTATION FIRST! We also provide two
+ mailing lists which are available at:
- http://www.cups.org/newsgroups.php
+ http://www.cups.org/lists.php
See the CUPS web site at "http://www.cups.org/" for other resources.
@@ -78,10 +78,6 @@ SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
----------------------------- ------------------------------
Dymo Label Printers drv:///sample.drv/dymo.ppd
Intellitech Intellibar drv:///sample.drv/intelbar.ppd
- EPSON Stylus Color Series drv:///sample.drv/stcolor.ppd
- EPSON Stylus Photo Series drv:///sample.drv/stphoto.ppd
- EPSON Stylus New Color Series drv:///sample.drv/stcolor2.ppd
- EPSON Stylus New Photo Series drv:///sample.drv/stphoto2.ppd
EPSON 9-pin Series drv:///sample.drv/epson9.ppd
EPSON 24-pin Series drv:///sample.drv/epson24.ppd
Generic PCL Laser Printer drv:///sample.drv/generpcl.ppd
@@ -113,11 +109,7 @@ SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
lpadmin -p printername -E -v lpd://11.22.33.44/ -m ppd-name
The sample drivers provide basic printing capabilities, but generally do not
- exercise the full potential of the printers or CUPS. The CUPS web site
- provides links and drivers:
-
- http://www.cups.org/ppd.php PPD files
- http://www.cups.org/links.php Links to other drivers
+ exercise the full potential of the printers or CUPS.
PRINTING FILES
@@ -134,8 +126,8 @@ PRINTING FILES
lpr -o media=A4 -o resolution=600dpi filename
CUPS recognizes many types of images files as well as PDF, PostScript,
- HP-GL/2, and text files, so you can print those files directly rather than
- through an application.
+ and text files, so you can print those files directly rather than through
+ an application.
If you have an application that generates output specifically for your
printer then you need to use the "-oraw" or "-l" options:
@@ -143,19 +135,16 @@ PRINTING FILES
lp -o raw filename
lpr -l filename
- This will prevent the filters from misinterpreting your print
- file.
+ This will prevent the filters from misinterpreting your print file.
LEGAL STUFF
- CUPS is Copyright 2007-2013 by Apple Inc. CUPS and the CUPS logo are
+ CUPS is Copyright 2007-2015 by Apple Inc. CUPS and the CUPS logo are
trademarks of Apple Inc.
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
- This software is based in part on the work of the Independent JPEG Group.
-
CUPS is provided under the terms of version 2 of the GNU General Public
License and GNU Library General Public License. This program is distributed
in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
diff --git a/backend/Dependencies b/backend/Dependencies
index eeb231a..2d6e7eb 100644
--- a/backend/Dependencies
+++ b/backend/Dependencies
@@ -1,70 +1,77 @@
ipp.o: ipp.c backend-private.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h \
- ../cups/array-private.h
-lpd.o: lpd.c ../cups/http-private.h ../config.h ../cups/http.h \
- ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
- ../cups/ipp-private.h ../cups/ipp.h backend-private.h \
- ../cups/cups-private.h ../cups/string-private.h \
- ../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
+lpd.o: lpd.c ../cups/http-private.h ../config.h ../cups/language.h \
+ ../cups/array.h ../cups/versioning.h ../cups/http.h \
+ ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h \
+ backend-private.h ../cups/cups-private.h ../cups/string-private.h \
+ ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
dnssd.o: dnssd.c backend-private.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
snmp.o: snmp.c backend-private.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
-socket.o: socket.c ../cups/http-private.h ../config.h ../cups/http.h \
- ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
- ../cups/ipp-private.h ../cups/ipp.h backend-private.h \
- ../cups/cups-private.h ../cups/string-private.h \
- ../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
+socket.o: socket.c ../cups/http-private.h ../config.h ../cups/language.h \
+ ../cups/array.h ../cups/versioning.h ../cups/http.h \
+ ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h \
+ backend-private.h ../cups/cups-private.h ../cups/string-private.h \
+ ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
test1284.o: test1284.c ../cups/string-private.h ../config.h ieee1284.c \
backend-private.h ../cups/cups-private.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
testbackend.o: testbackend.c ../cups/string-private.h ../config.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h \
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
../cups/sidechannel.h
testsupplies.o: testsupplies.c backend-private.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h
usb.o: usb.c backend-private.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h \
- usb-darwin.c ../cups/file-private.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+ ../cups/backend.h ../cups/sidechannel.h usb-darwin.c \
+ ../cups/file-private.h
diff --git a/backend/Makefile b/backend/Makefile
index ad0d5f6..61a2ce8 100644
--- a/backend/Makefile
+++ b/backend/Makefile
@@ -1,9 +1,9 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11859 2014-05-08 22:42:44Z msweet $"
#
# Backend makefile for CUPS.
#
-# Copyright 2007-2013 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -23,8 +23,8 @@ include ../Makedefs
# RBACKENDS are installed mode 0700 so cupsd will run them as root...
#
-# UBACKENDS are installed mode 0755 so cupsd will run them as an unprivileged
-# user...
+# UBACKENDS and ULBACKENDS are installed mode 0755 so cupsd will run them as
+# an unprivileged user...
#
# See http://www.cups.org/documentation.php/api-filter.html for more info...
RBACKENDS = \
@@ -33,7 +33,8 @@ RBACKENDS = \
$(DNSSD_BACKEND)
UBACKENDS = \
snmp \
- socket \
+ socket
+ULBACKENDS = \
usb
UNITTESTS = \
test1284 \
@@ -42,7 +43,8 @@ UNITTESTS = \
TARGETS = \
libbackend.a \
$(RBACKENDS) \
- $(UBACKENDS)
+ $(UBACKENDS) \
+ $(ULBACKENDS)
LIBOBJS = \
ieee1284.o \
network.o \
@@ -71,7 +73,7 @@ all: $(TARGETS)
# Make library targets...
#
-libs:
+libs: $(ULBACKENDS)
#
@@ -139,8 +141,9 @@ install-exec: $(INSTALLXPC)
fi
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
- for file in $(TARGETS); do \
+ for file in $(RBACKENDS) $(UBACKENDS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -166,6 +169,18 @@ install-headers:
#
install-libs:
+ echo Installing backends in $(SERVERBIN)/backend
+ $(INSTALL_DIR) -m 755 $(SERVERBIN)/backend
+ for file in $(ULBACKENDS); do \
+ $(INSTALL_BIN) $$file $(SERVERBIN)/backend; \
+ done
+ if test "x$(SYMROOT)" != "x"; then \
+ $(INSTALL_DIR) $(SYMROOT); \
+ for file in $(ULBACKENDS); do \
+ cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
+ done \
+ fi
#
@@ -178,7 +193,7 @@ uninstall:
$(RM) $(SERVERBIN)/apple/$$file; \
done
-$(RMDIR) $(SERVERBIN)/apple
- for file in $(RBACKENDS) $(UBACKENDS); do \
+ for file in $(RBACKENDS) $(UBACKENDS) $(ULBACKENDS); do \
$(RM) $(SERVERBIN)/backend/$$file; \
done
for file in $(IPPALIASES); do \
@@ -300,5 +315,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 11859 2014-05-08 22:42:44Z msweet $".
#
diff --git a/backend/backend-private.h b/backend/backend-private.h
index 9b0eda8..2ad3d48 100644
--- a/backend/backend-private.h
+++ b/backend/backend-private.h
@@ -1,18 +1,18 @@
/*
- * "$Id: backend-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backend-private.h 11558 2014-02-06 18:33:34Z msweet $"
*
- * Backend support definitions for CUPS.
+ * Backend support definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_BACKEND_PRIVATE_H_
@@ -313,7 +313,7 @@ extern int backendGetDeviceID(int fd, char *device_id,
int uri_size);
extern int backendGetMakeModel(const char *device_id,
char *make_model,
- int make_model_size);
+ size_t make_model_size);
extern int backendNetworkSideCB(int print_fd, int device_fd,
int snmp_fd, http_addr_t *addr,
int use_bc);
@@ -334,5 +334,5 @@ extern int backendWaitLoop(int snmp_fd, http_addr_t *addr,
/*
- * End of "$Id: backend-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backend-private.h 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/backend/dnssd.c b/backend/dnssd.c
index 317b39f..c82877b 100644
--- a/backend/dnssd.c
+++ b/backend/dnssd.c
@@ -1,33 +1,17 @@
/*
- * "$Id: dnssd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dnssd.c 12970 2015-11-13 20:02:51Z msweet $"
*
- * DNS-SD discovery backend for CUPS.
+ * DNS-SD discovery backend for CUPS.
*
- * Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2015 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Browse for printers.
- * browse_callback() - Browse devices.
- * browse_local_callback() - Browse local devices.
- * client_callback() - Avahi client callback function.
- * compare_devices() - Compare two devices.
- * exec_backend() - Execute the backend that corresponds to the
- * resolved service name.
- * device_type() - Get DNS-SD type enumeration from string.
- * get_device() - Create or update a device.
- * query_callback() - Process query data.
- * find_device() - Find a device from its name and domain.
- * sigterm_handler() - Handle termination signals.
- * unquote() - Unquote a name string.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -77,7 +61,8 @@ typedef struct
*domain, /* Domain name */
*fullName, /* Full name */
*make_and_model, /* Make and model from TXT record */
- *device_id; /* 1284 device ID from TXT record */
+ *device_id, /* 1284 device ID from TXT record */
+ *uuid; /* UUID from TXT record */
cups_devtype_t type; /* Device registration type */
int priority, /* Priority associated with type */
cups_shared, /* CUPS shared printer? */
@@ -95,6 +80,7 @@ static int job_canceled = 0;
static AvahiSimplePoll *simple_poll = NULL;
/* Poll information */
static int got_data = 0; /* Got data from poll? */
+static int browsers = 0; /* Number of running browsers */
#endif /* HAVE_AVAHI */
@@ -137,7 +123,7 @@ static void client_callback(AvahiClient *client,
#endif /* HAVE_AVAHI */
static int compare_devices(cups_device_t *a, cups_device_t *b);
-static void exec_backend(char **argv);
+static void exec_backend(char **argv) __attribute__((noreturn));
static cups_device_t *get_device(cups_array_t *devices,
const char *serviceName,
const char *regtype,
@@ -332,7 +318,7 @@ main(int argc, /* I - Number of command-line args */
if ((simple_poll = avahi_simple_poll_new()) == NULL)
{
fputs("DEBUG: Unable to create Avahi simple poll object.\n", stderr);
- return (1);
+ return (0);
}
avahi_simple_poll_set_func(simple_poll, poll_callback, NULL);
@@ -342,9 +328,10 @@ main(int argc, /* I - Number of command-line args */
if (!client)
{
fputs("DEBUG: Unable to create Avahi client.\n", stderr);
- return (1);
+ return (0);
}
+ browsers = 6;
avahi_service_browser_new(client, AVAHI_IF_UNSPEC,
AVAHI_PROTO_UNSPEC,
"_fax-ipp._tcp", NULL, 0,
@@ -513,9 +500,15 @@ main(int argc, /* I - Number of command-line args */
{
unquote(uriName, best->fullName, sizeof(uriName));
- httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri),
- "dnssd", NULL, uriName, 0,
- best->cups_shared ? "/cups" : "/");
+ if (best->uuid)
+ httpAssembleURIf(HTTP_URI_CODING_ALL, device_uri,
+ sizeof(device_uri), "dnssd", NULL, uriName, 0,
+ best->cups_shared ? "/cups?uuid=%s" : "/?uuid=%s",
+ best->uuid);
+ else
+ httpAssembleURI(HTTP_URI_CODING_ALL, device_uri,
+ sizeof(device_uri), "dnssd", NULL, uriName, 0,
+ best->cups_shared ? "/cups" : "/");
cupsBackendReport("network", device_uri, best->make_and_model,
best->name, best->device_id, NULL);
@@ -546,9 +539,15 @@ main(int argc, /* I - Number of command-line args */
{
unquote(uriName, best->fullName, sizeof(uriName));
- httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri),
- "dnssd", NULL, uriName, 0,
- best->cups_shared ? "/cups" : "/");
+ if (best->uuid)
+ httpAssembleURIf(HTTP_URI_CODING_ALL, device_uri,
+ sizeof(device_uri), "dnssd", NULL, uriName, 0,
+ best->cups_shared ? "/cups?uuid=%s" : "/?uuid=%s",
+ best->uuid);
+ else
+ httpAssembleURI(HTTP_URI_CODING_ALL, device_uri,
+ sizeof(device_uri), "dnssd", NULL, uriName, 0,
+ best->cups_shared ? "/cups" : "/");
cupsBackendReport("network", device_uri, best->make_and_model,
best->name, best->device_id, NULL);
@@ -558,7 +557,11 @@ main(int argc, /* I - Number of command-line args */
fprintf(stderr, "DEBUG: sent=%d, count=%d\n", sent, count);
+#ifdef HAVE_AVAHI
+ if (sent == cupsArrayCount(devices) && browsers == 0)
+#else
if (sent == cupsArrayCount(devices))
+#endif /* HAVE_AVAHI */
break;
}
}
@@ -710,9 +713,12 @@ browse_callback(
break;
case AVAHI_BROWSER_REMOVE:
- case AVAHI_BROWSER_ALL_FOR_NOW:
case AVAHI_BROWSER_CACHE_EXHAUSTED:
break;
+
+ case AVAHI_BROWSER_ALL_FOR_NOW:
+ browsers--;
+ break;
}
}
@@ -824,8 +830,8 @@ exec_backend(char **argv) /* I - Command-line arguments */
* 'device_type()' - Get DNS-SD type enumeration from string.
*/
-static int
-device_type(const char *regtype)
+static cups_devtype_t /* O - Device type */
+device_type(const char *regtype) /* I - Service registration type */
{
#ifdef HAVE_AVAHI
if (!strcmp(regtype, "_ipp._tcp"))
@@ -915,9 +921,6 @@ get_device(cups_array_t *devices, /* I - Device array */
* Yes, add the device...
*/
- fprintf(stderr, "DEBUG: Found \"%s.%s%s\"...\n", serviceName, regtype,
- replyDomain);
-
device = calloc(sizeof(cups_device_t), 1);
device->name = strdup(serviceName);
device->domain = strdup(replyDomain);
@@ -933,8 +936,7 @@ get_device(cups_array_t *devices, /* I - Device array */
#ifdef HAVE_DNSSD
DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain);
#else /* HAVE_AVAHI */
- avahi_service_name_join(fullName, kDNSServiceMaxDomainName,
- serviceName, regtype, replyDomain);
+ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain);
#endif /* HAVE_DNSSD */
device->fullName = strdup(fullName);
@@ -1031,6 +1033,7 @@ query_callback(
value[256], /* Value string */
make_and_model[512], /* Manufacturer and model */
model[256], /* Model */
+ pdl[256], /* PDL */
device_id[2048]; /* 1284 device ID */
@@ -1079,8 +1082,9 @@ query_callback(
device_id[0] = '\0';
make_and_model[0] = '\0';
+ pdl[0] = '\0';
- strcpy(model, "Unknown");
+ strlcpy(model, "Unknown", sizeof(model));
for (data = rdata, dataend = data + rdlen;
data < dataend;
@@ -1100,7 +1104,7 @@ query_callback(
datanext = data + datalen;
for (ptr = key; data < datanext && *data != '='; data ++)
- *ptr++ = *data;
+ *ptr++ = (char)*data;
*ptr = '\0';
if (data < datanext && *data == '=')
@@ -1108,7 +1112,7 @@ query_callback(
data ++;
if (data < datanext)
- memcpy(value, data, datanext - data);
+ memcpy(value, data, (size_t)(datanext - data));
value[datanext - data] = '\0';
fprintf(stderr, "DEBUG2: query_callback: \"%s=%s\".\n",
@@ -1128,15 +1132,14 @@ query_callback(
*/
ptr = device_id + strlen(device_id);
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%s:%s;",
- key + 4, value);
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%s:%s;", key + 4, value);
}
if (!_cups_strcasecmp(key, "usb_MFG") || !_cups_strcasecmp(key, "usb_MANU") ||
!_cups_strcasecmp(key, "usb_MANUFACTURER"))
- strcpy(make_and_model, value);
+ strlcpy(make_and_model, value, sizeof(make_and_model));
else if (!_cups_strcasecmp(key, "usb_MDL") || !_cups_strcasecmp(key, "usb_MODEL"))
- strcpy(model, value);
+ strlcpy(model, value, sizeof(model));
else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript"))
{
if (value[0] == '(')
@@ -1148,18 +1151,20 @@ query_callback(
if ((ptr = value + strlen(value) - 1) > value && *ptr == ')')
*ptr = '\0';
- strcpy(model, value + 1);
+ strlcpy(model, value + 1, sizeof(model));
}
else
- strcpy(model, value);
+ strlcpy(model, value, sizeof(model));
}
else if (!_cups_strcasecmp(key, "ty"))
{
- strcpy(model, value);
+ strlcpy(model, value, sizeof(model));
if ((ptr = strchr(model, ',')) != NULL)
*ptr = '\0';
}
+ else if (!_cups_strcasecmp(key, "pdl"))
+ strlcpy(pdl, value, sizeof(pdl));
else if (!_cups_strcasecmp(key, "priority"))
device->priority = atoi(value);
else if ((device->type == CUPS_DEVICE_IPP ||
@@ -1176,6 +1181,8 @@ query_callback(
if (device->type == CUPS_DEVICE_PRINTER)
device->sent = 1;
}
+ else if (!_cups_strcasecmp(key, "UUID"))
+ device->uuid = strdup(value);
}
if (device->device_id)
@@ -1196,7 +1203,7 @@ query_callback(
* Assume the first word is the make...
*/
- memcpy(make_and_model, model, ptr - model);
+ memcpy(make_and_model, model, (size_t)(ptr - model));
make_and_model[ptr - model] = '\0';
snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s",
@@ -1204,6 +1211,45 @@ query_callback(
}
}
+ if (device_id[0] &&
+ !strstr(device_id, "CMD:") &&
+ !strstr(device_id, "COMMAND SET:") &&
+ (strstr(pdl, "application/pdf") ||
+ strstr(pdl, "application/postscript") ||
+ strstr(pdl, "application/vnd.hp-PCL") ||
+ strstr(pdl, "image/")))
+ {
+ value[0] = '\0';
+ if (strstr(pdl, "application/pdf"))
+ strlcat(value, ",PDF", sizeof(value));
+ if (strstr(pdl, "application/postscript"))
+ strlcat(value, ",PS", sizeof(value));
+ if (strstr(pdl, "application/vnd.hp-PCL"))
+ strlcat(value, ",PCL", sizeof(value));
+ for (ptr = strstr(pdl, "image/"); ptr; ptr = strstr(ptr, "image/"))
+ {
+ char *valptr = value + strlen(value);
+ /* Pointer into value */
+
+ if (valptr < (value + sizeof(value) - 1))
+ *valptr++ = ',';
+
+ ptr += 6;
+ while (isalnum(*ptr & 255) || *ptr == '-' || *ptr == '.')
+ {
+ if (isalnum(*ptr & 255) && valptr < (value + sizeof(value) - 1))
+ *valptr++ = (char)toupper(*ptr++ & 255);
+ else
+ break;
+ }
+
+ *valptr = '\0';
+ }
+
+ ptr = device_id + strlen(device_id);
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "CMD:%s;", value + 1);
+ }
+
if (device_id[0])
device->device_id = strdup(device_id);
else
@@ -1235,7 +1281,7 @@ sigterm_handler(int sig) /* I - Signal number (unused) */
(void)sig;
if (job_canceled)
- exit(CUPS_BACKEND_OK);
+ _exit(CUPS_BACKEND_OK);
else
job_canceled = 1;
}
@@ -1276,5 +1322,5 @@ unquote(char *dst, /* I - Destination buffer */
/*
- * End of "$Id: dnssd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dnssd.c 12970 2015-11-13 20:02:51Z msweet $".
*/
diff --git a/backend/ieee1284.c b/backend/ieee1284.c
index b2d1c7d..a2fc623 100644
--- a/backend/ieee1284.c
+++ b/backend/ieee1284.c
@@ -1,24 +1,18 @@
/*
- * "$Id: ieee1284.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ieee1284.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * IEEE-1284 support functions for CUPS.
+ * IEEE-1284 support functions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * backendGetDeviceID() - Get the IEEE-1284 device ID string and
- * corresponding URI.
- * backendGetMakeModel() - Get the make and model string from the device ID.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -26,7 +20,6 @@
*/
#include "backend-private.h"
-#include <cups/cups-private.h>
/*
@@ -148,8 +141,7 @@ backendGetDeviceID(
* Read the 1284 device ID...
*/
- if ((length = read(devparportfd, device_id,
- device_id_size - 1)) >= 2)
+ if ((length = read(devparportfd, device_id, (size_t)device_id_size - 1)) >= 2)
{
device_id[length] = '\0';
got_id = 1;
@@ -178,8 +170,7 @@ backendGetDeviceID(
* bytes. The 1284 spec says the length is stored MSB first...
*/
- length = (((unsigned)device_id[0] & 255) << 8) +
- ((unsigned)device_id[1] & 255);
+ length = (int)((((unsigned)device_id[0] & 255) << 8) + ((unsigned)device_id[1] & 255));
/*
* Check to see if the length is larger than our buffer; first
@@ -188,8 +179,7 @@ backendGetDeviceID(
*/
if (length > device_id_size || length < 14)
- length = (((unsigned)device_id[1] & 255) << 8) +
- ((unsigned)device_id[0] & 255);
+ length = (int)((((unsigned)device_id[1] & 255) << 8) + ((unsigned)device_id[0] & 255));
if (length > device_id_size)
length = device_id_size;
@@ -221,7 +211,7 @@ backendGetDeviceID(
length -= 2;
- memmove(device_id, device_id + 2, length);
+ memmove(device_id, device_id + 2, (size_t)length);
device_id[length] = '\0';
}
}
@@ -287,7 +277,7 @@ backendGetDeviceID(
*/
if (make_model)
- backendGetMakeModel(device_id, make_model, make_model_size);
+ backendGetMakeModel(device_id, make_model, (size_t)make_model_size);
/*
* Then generate a device URI...
@@ -372,7 +362,7 @@ int /* O - 0 on success, -1 on failure */
backendGetMakeModel(
const char *device_id, /* O - 1284 device ID */
char *make_model, /* O - Make/model */
- int make_model_size) /* I - Size of buffer */
+ size_t make_model_size) /* I - Size of buffer */
{
int num_values; /* Number of keys and values */
cups_option_t *values; /* Keys and values */
@@ -381,9 +371,7 @@ backendGetMakeModel(
*des; /* Description string */
- DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", "
- "make_model=%p, make_model_size=%d)\n", device_id,
- make_model, make_model_size));
+ DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", make_model=%p, make_model_size=" CUPS_LLFMT ")\n", device_id, make_model, CUPS_LLCAST make_model_size));
/*
* Range check input...
@@ -487,5 +475,5 @@ backendGetMakeModel(
/*
- * End of "$Id: ieee1284.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ieee1284.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/backend/ipp.c b/backend/ipp.c
index efd570a..69970a2 100644
--- a/backend/ipp.c
+++ b/backend/ipp.c
@@ -1,34 +1,18 @@
/*
- * "$Id: ipp.c 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: ipp.c 12896 2015-10-09 13:15:22Z msweet $"
*
- * IPP backend for CUPS.
+ * IPP backend for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Send a file to the printer or server.
- * cancel_job() - Cancel a print job.
- * check_printer_state() - Check the printer state.
- * compress_files() - Compress print files.
- * monitor_printer() - Monitor the printer state.
- * new_request() - Create a new print creation or validation request.
- * password_cb() - Disable the password prompt for
- * cupsDoFileRequest().
- * report_attr() - Report an IPP attribute value.
- * report_printer_state() - Report the printer state.
- * run_as_user() - Run the IPP backend as the printing user.
- * timeout_cb() - Handle HTTP timeouts.
- * sigterm_handler() - Handle 'terminate' signals that stop the backend.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -55,6 +39,18 @@ extern void xpc_connection_set_target_uid(xpc_connection_t connection,
/*
+ * Bits for job-state-reasons we care about...
+ */
+
+#define _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED 0x01
+#define _CUPS_JSR_ACCOUNT_CLOSED 0x02
+#define _CUPS_JSR_ACCOUNT_INFO_NEEDED 0x04
+#define _CUPS_JSR_ACCOUNT_LIMIT_REACHED 0x08
+#define _CUPS_JSR_JOB_PASSWORD_WAIT 0x10
+#define _CUPS_JSR_JOB_RELEASE_WAIT 0x20
+
+
+/*
* Types...
*/
@@ -67,6 +63,8 @@ typedef struct _cups_monitor_s /**** Monitoring data ****/
int port, /* Port number */
version, /* IPP version */
job_id, /* Job ID for submitted job */
+ job_reasons, /* Job state reasons bits */
+ create_job, /* Support Create-Job? */
get_job_attrs; /* Support Get-Job-Attributes? */
const char *job_name; /* Job name for submitted job */
http_encryption_t encryption; /* Use encryption? */
@@ -82,7 +80,7 @@ typedef struct _cups_monitor_s /**** Monitoring data ****/
static const char *auth_info_required;
/* New auth-info-required value */
#if defined(HAVE_GSSAPI) && defined(HAVE_XPC)
-static int child_pid = 0; /* Child process ID */
+static pid_t child_pid = 0; /* Child process ID */
#endif /* HAVE_GSSAPI && HAVE_XPC */
static const char * const jattrs[] = /* Job attributes we want */
{
@@ -94,14 +92,19 @@ static const char * const jattrs[] = /* Job attributes we want */
"job-state",
"job-state-reasons"
};
-static int job_canceled = 0;
+static int job_canceled = 0,
/* Job cancelled? */
+ uri_credentials = 0;
+ /* Credentials supplied in URI? */
static char username[256] = "",
/* Username for device URI */
*password = NULL;
/* Password for device URI */
static const char * const pattrs[] = /* Printer attributes we want */
{
+#ifdef HAVE_LIBZ
+ "compression-supported",
+#endif /* HAVE_LIBZ */
"copies-supported",
"cups-version",
"document-format-supported",
@@ -115,9 +118,11 @@ static const char * const pattrs[] = /* Printer attributes we want */
"media-col-supported",
"multiple-document-handling-supported",
"operations-supported",
+ "print-color-mode-supported",
"printer-alert",
"printer-alert-description",
"printer-is-accepting-jobs",
+ "printer-mandatory-job-attributes",
"printer-state",
"printer-state-message",
"printer-state-reasons"
@@ -141,6 +146,8 @@ static cups_option_t *attr_cache = NULL;
static cups_array_t *state_reasons; /* Array of printe-state-reasons keywords */
static char tmpfilename[1024] = "";
/* Temporary spool file name */
+static char mandatory_attrs[1024] = "";
+ /* cupsMandatory value */
/*
@@ -153,20 +160,20 @@ static void cancel_job(http_t *http, const char *uri, int id,
static ipp_pstate_t check_printer_state(http_t *http, const char *uri,
const char *resource,
const char *user, int version);
-#ifdef HAVE_LIBZ
-static void compress_files(int num_files, char **files);
-#endif /* HAVE_LIBZ */
static void *monitor_printer(_cups_monitor_t *monitor);
static ipp_t *new_request(ipp_op_t op, int version, const char *uri,
const char *user, const char *title,
int num_options, cups_option_t *options,
const char *compression, int copies,
const char *format, _ppd_cache_t *pc,
+ ppd_file_t *ppd,
ipp_attribute_t *media_col_sup,
- ipp_attribute_t *doc_handling_sup);
+ ipp_attribute_t *doc_handling_sup,
+ ipp_attribute_t *print_color_mode_sup);
static const char *password_cb(const char *prompt, http_t *http,
const char *method, const char *resource,
int *user_data);
+static const char *quote_string(const char *s, char *q, size_t qsize);
static void report_attr(ipp_attribute_t *attr);
static void report_printer_state(ipp_t *ipp);
#if defined(HAVE_GSSAPI) && defined(HAVE_XPC)
@@ -230,25 +237,31 @@ main(int argc, /* I - Number of command-line args */
prev_delay; /* Previous delay */
const char *compression; /* Compression mode */
int waitjob, /* Wait for job complete? */
+ waitjob_tries = 0, /* Number of times we've waited */
waitprinter; /* Wait for printer ready? */
_cups_monitor_t monitor; /* Monitoring data */
ipp_attribute_t *job_id_attr; /* job-id attribute */
int job_id; /* job-id value */
ipp_attribute_t *job_sheets; /* job-media-sheets-completed */
ipp_attribute_t *job_state; /* job-state */
+#ifdef HAVE_LIBZ
+ ipp_attribute_t *compression_sup; /* compression-supported */
+#endif /* HAVE_LIBZ */
ipp_attribute_t *copies_sup; /* copies-supported */
ipp_attribute_t *cups_version; /* cups-version */
ipp_attribute_t *format_sup; /* document-format-supported */
+ ipp_attribute_t *job_auth; /* job-authorization-uri */
ipp_attribute_t *media_col_sup; /* media-col-supported */
ipp_attribute_t *operations_sup; /* operations-supported */
ipp_attribute_t *doc_handling_sup; /* multiple-document-handling-supported */
ipp_attribute_t *printer_state; /* printer-state attribute */
ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */
+ ipp_attribute_t *print_color_mode_sup;/* Does printer support print-color-mode? */
int create_job = 0, /* Does printer support Create-Job? */
get_job_attrs = 0, /* Does printer support Get-Job-Attributes? */
send_document = 0, /* Does printer support Send-Document? */
- validate_job = 0; /* Does printer support Validate-Job? */
- int copies, /* Number of copies for job */
+ validate_job = 0, /* Does printer support Validate-Job? */
+ copies, /* Number of copies for job */
copies_remaining; /* Number of copies remaining */
const char *content_type, /* CONTENT_TYPE environment variable */
*final_content_type, /* FINAL_CONTENT_TYPE environment var */
@@ -260,8 +273,8 @@ main(int argc, /* I - Number of command-line args */
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
int version; /* IPP version */
- ppd_file_t *ppd; /* PPD file */
- _ppd_cache_t *pc; /* PPD cache and mapping data */
+ ppd_file_t *ppd = NULL; /* PPD file */
+ _ppd_cache_t *pc = NULL; /* PPD cache and mapping data */
fd_set input; /* Input set for select() */
@@ -334,7 +347,7 @@ main(int argc, /* I - Number of command-line args */
if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) == NULL)
auth_info_required = "none";
- state_reasons = _cupsArrayNewStrings(getenv("PRINTER_STATE_REASONS"));
+ state_reasons = _cupsArrayNewStrings(getenv("PRINTER_STATE_REASONS"), ',');
#ifdef HAVE_GSSAPI
/*
@@ -342,7 +355,8 @@ main(int argc, /* I - Number of command-line args */
* that way.
*/
- if (!getuid() && (value = getenv("AUTH_UID")) != NULL)
+ if (!getuid() && (value = getenv("AUTH_UID")) != NULL &&
+ !getenv("AUTH_PASSWORD"))
{
uid_t uid = (uid_t)atoi(value);
/* User ID */
@@ -518,8 +532,8 @@ main(int argc, /* I - Number of command-line args */
*/
snmp_enabled = !value[0] || !_cups_strcasecmp(value, "on") ||
- _cups_strcasecmp(value, "yes") ||
- _cups_strcasecmp(value, "true");
+ !_cups_strcasecmp(value, "yes") ||
+ !_cups_strcasecmp(value, "true");
}
else if (!_cups_strcasecmp(name, "version"))
{
@@ -546,6 +560,13 @@ main(int argc, /* I - Number of command-line args */
if (!_cups_strcasecmp(value, "true") || !_cups_strcasecmp(value, "yes") ||
!_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "gzip"))
compression = "gzip";
+ else if (!_cups_strcasecmp(value, "deflate"))
+ compression = "deflate";
+ else if (!_cups_strcasecmp(value, "false") ||
+ !_cups_strcasecmp(value, "no") ||
+ !_cups_strcasecmp(value, "off") ||
+ !_cups_strcasecmp(value, "none"))
+ compression = "none";
}
#endif /* HAVE_LIBZ */
else if (!_cups_strcasecmp(name, "contimeout"))
@@ -596,11 +617,6 @@ main(int argc, /* I - Number of command-line args */
files = argv + 6;
send_options = 1;
-#ifdef HAVE_LIBZ
- if (compression)
- compress_files(num_files, files);
-#endif /* HAVE_LIBZ */
-
fprintf(stderr, "DEBUG: %d files to send in job...\n", num_files);
}
@@ -613,13 +629,14 @@ main(int argc, /* I - Number of command-line args */
if (username[0])
{
/*
- * Use authenticaion information in the device URI...
+ * Use authentication information in the device URI...
*/
if ((password = strchr(username, ':')) != NULL)
*password++ = '\0';
cupsSetUser(username);
+ uri_credentials = 1;
}
else
{
@@ -665,9 +682,48 @@ main(int argc, /* I - Number of command-line args */
return (CUPS_BACKEND_OK);
}
- http = _httpCreate(hostname, port, addrlist, cupsEncryption(), AF_UNSPEC);
+ http = httpConnect2(hostname, port, addrlist, AF_UNSPEC, cupsEncryption(), 1,
+ 0, NULL);
httpSetTimeout(http, 30.0, timeout_cb, NULL);
+ if (httpIsEncrypted(http))
+ {
+ /*
+ * Validate TLS credentials...
+ */
+
+ cups_array_t *creds; /* TLS credentials */
+ cups_array_t *lcreds = NULL; /* Loaded credentials */
+ http_trust_t trust; /* Trust level */
+ static const char *trusts[] = { NULL, "+cups-pki-invalid", "+cups-pki-changed", "+cups-pki-expired", NULL, "+cups-pki-unknown" };
+ /* Trust keywords */
+
+ if (!httpCopyCredentials(http, &creds))
+ {
+ trust = httpCredentialsGetTrust(creds, hostname);
+
+ update_reasons(NULL, "-cups-pki-invalid,cups-pki-changed,cups-pki-expired,cups-pki-unknown");
+ if (trusts[trust])
+ {
+ update_reasons(NULL, trusts[trust]);
+ return (CUPS_BACKEND_STOP);
+ }
+
+ if (httpLoadCredentials(NULL, &lcreds, hostname))
+ {
+ /*
+ * Could not load the credentials, let's save the ones we have so we
+ * can detect changes...
+ */
+
+ httpSaveCredentials(NULL, creds, hostname);
+ }
+
+ httpFreeCredentials(lcreds);
+ httpFreeCredentials(creds);
+ }
+ }
+
/*
* See if the printer supports SNMP...
*/
@@ -774,7 +830,7 @@ main(int argc, /* I - Number of command-line args */
break;
}
- sleep(delay);
+ sleep((unsigned)delay);
delay = _cupsNextDelay(delay, &prev_delay);
}
@@ -803,7 +859,7 @@ main(int argc, /* I - Number of command-line args */
fprintf(stderr, "DEBUG: Connected to %s:%d...\n",
httpAddrString(http->hostaddr, addrname, sizeof(addrname)),
- _httpAddrPort(http->hostaddr));
+ httpAddrPort(http->hostaddr));
/*
* Build a URI for the printer and fill the standard IPP attributes for
@@ -819,13 +875,17 @@ main(int argc, /* I - Number of command-line args */
* copies...
*/
- copies_sup = NULL;
- cups_version = NULL;
- format_sup = NULL;
- media_col_sup = NULL;
- supported = NULL;
- operations_sup = NULL;
- doc_handling_sup = NULL;
+#ifdef HAVE_LIBZ
+ compression_sup = NULL;
+#endif /* HAVE_LIBZ */
+ copies_sup = NULL;
+ cups_version = NULL;
+ format_sup = NULL;
+ media_col_sup = NULL;
+ supported = NULL;
+ operations_sup = NULL;
+ doc_handling_sup = NULL;
+ print_color_mode_sup = NULL;
do
{
@@ -840,9 +900,7 @@ main(int argc, /* I - Number of command-line args */
*/
request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
-
+ ippSetVersion(request, version / 10, version % 10);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -891,7 +949,7 @@ main(int argc, /* I - Number of command-line args */
report_printer_state(supported);
- sleep(delay);
+ sleep((unsigned)delay);
delay = _cupsNextDelay(delay, &prev_delay);
}
@@ -904,16 +962,18 @@ main(int argc, /* I - Number of command-line args */
if (version >= 20)
{
- _cupsLangPrintFilter(stderr, "INFO",
- _("The printer does not support IPP/%d.%d, trying "
- "IPP/%s."), version / 10, version % 10, "1.1");
+ _cupsLangPrintFilter(stderr, "INFO", _("Preparing to print."));
+ fprintf(stderr,
+ "DEBUG: The printer does not support IPP/%d.%d, trying "
+ "IPP/1.1.\n", version / 10, version % 10);
version = 11;
}
else
{
- _cupsLangPrintFilter(stderr, "INFO",
- _("The printer does not support IPP/%d.%d, trying "
- "IPP/%s."), version / 10, version % 10, "1.0");
+ _cupsLangPrintFilter(stderr, "INFO", _("Preparing to print."));
+ fprintf(stderr,
+ "DEBUG: The printer does not support IPP/%d.%d, trying "
+ "IPP/1.0.\n", version / 10, version % 10);
version = 10;
}
@@ -922,8 +982,8 @@ main(int argc, /* I - Number of command-line args */
else if (ipp_status == IPP_NOT_FOUND)
{
_cupsLangPrintFilter(stderr, "ERROR",
- _("The printer URI is incorrect or no longer "
- "exists."));
+ _("The printer configuration is incorrect or the "
+ "printer no longer exists."));
ippDelete(supported);
@@ -1003,12 +1063,13 @@ main(int argc, /* I - Number of command-line args */
report_printer_state(supported);
- sleep(delay);
+ sleep((unsigned)delay);
delay = _cupsNextDelay(delay, &prev_delay);
ippDelete(supported);
- supported = NULL;
+ supported = NULL;
+ ipp_status = IPP_STATUS_ERROR_BUSY;
continue;
}
}
@@ -1017,6 +1078,35 @@ main(int argc, /* I - Number of command-line args */
* Check for supported attributes...
*/
+#ifdef HAVE_LIBZ
+ if ((compression_sup = ippFindAttribute(supported, "compression-supported",
+ IPP_TAG_KEYWORD)) != NULL)
+ {
+ /*
+ * Check whether the requested compression is supported and/or default to
+ * compression if supported...
+ */
+
+ if (compression && !ippContainsString(compression_sup, compression))
+ {
+ fprintf(stderr, "DEBUG: Printer does not support the requested "
+ "compression value \"%s\".\n", compression);
+ compression = NULL;
+ }
+ else if (!compression)
+ {
+ if (ippContainsString(compression_sup, "gzip"))
+ compression = "gzip";
+ else if (ippContainsString(compression_sup, "deflate"))
+ compression = "deflate";
+
+ if (compression)
+ fprintf(stderr, "DEBUG: Automatically using \"%s\" compression.\n",
+ compression);
+ }
+ }
+#endif /* HAVE_LIBZ */
+
if ((copies_sup = ippFindAttribute(supported, "copies-supported",
IPP_TAG_RANGE)) != NULL)
{
@@ -1055,6 +1145,8 @@ main(int argc, /* I - Number of command-line args */
media_col_sup->values[i].string.text);
}
+ print_color_mode_sup = ippFindAttribute(supported, "print-color-mode-supported", IPP_TAG_KEYWORD);
+
if ((operations_sup = ippFindAttribute(supported, "operations-supported",
IPP_TAG_ENUM)) != NULL)
{
@@ -1195,7 +1287,6 @@ main(int argc, /* I - Number of command-line args */
*/
options = NULL;
- pc = NULL;
if (send_options)
{
@@ -1207,10 +1298,16 @@ main(int argc, /* I - Number of command-line args */
* Load the PPD file and generate PWG attribute mapping information...
*/
+ ppd_attr_t *mandatory; /* cupsMandatory value */
+
ppd = ppdOpenFile(getenv("PPD"));
pc = _ppdCacheCreateWithPPD(ppd);
- ppdClose(ppd);
+ ppdMarkDefaults(ppd);
+ cupsMarkOptions(ppd, num_options, options);
+
+ if ((mandatory = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL)
+ strlcpy(mandatory_attrs, mandatory->value, sizeof(mandatory_attrs));
}
}
else
@@ -1260,7 +1357,7 @@ main(int argc, /* I - Number of command-line args */
_cupsLangPrintFilter(stderr, "INFO", _("Copying print data."));
- if ((compatsize = write(fd, buffer, bytes)) < 0)
+ if ((compatsize = write(fd, buffer, (size_t)bytes)) < 0)
{
perror("DEBUG: Unable to write temporary file");
return (CUPS_BACKEND_FAILED);
@@ -1308,6 +1405,7 @@ main(int argc, /* I - Number of command-line args */
monitor.port = port;
monitor.version = version;
monitor.job_id = 0;
+ monitor.create_job = create_job;
monitor.get_job_attrs = get_job_attrs;
monitor.encryption = cupsEncryption();
monitor.job_state = IPP_JOB_PENDING;
@@ -1334,28 +1432,43 @@ main(int argc, /* I - Number of command-line args */
{
request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2],
monitor.job_name, num_options, options, compression,
- copies_sup ? copies : 1, document_format, pc,
- media_col_sup, doc_handling_sup);
+ copies_sup ? copies : 1, document_format, pc, ppd,
+ media_col_sup, doc_handling_sup, print_color_mode_sup);
- ippDelete(cupsDoRequest(http, request, resource));
+ response = cupsDoRequest(http, request, resource);
ipp_status = cupsLastError();
fprintf(stderr, "DEBUG: Validate-Job: %s (%s)\n",
ippErrorString(ipp_status), cupsLastErrorString());
+ if ((job_auth = ippFindAttribute(response, "job-authorization-uri",
+ IPP_TAG_URI)) != NULL)
+ num_options = cupsAddOption("job-authorization-uri",
+ ippGetString(job_auth, 0, NULL), num_options,
+ &options);
+
+ ippDelete(response);
+
if (job_canceled)
break;
- if (ipp_status == IPP_SERVICE_UNAVAILABLE || ipp_status == IPP_PRINTER_BUSY)
+ if (ipp_status == IPP_STATUS_ERROR_SERVICE_UNAVAILABLE ||
+ ipp_status == IPP_STATUS_ERROR_BUSY)
{
_cupsLangPrintFilter(stderr, "INFO", _("The printer is in use."));
sleep(10);
}
- else if (ipp_status == IPP_DOCUMENT_FORMAT)
+ else if (ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED ||
+ ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
goto cleanup;
- else if (ipp_status == IPP_FORBIDDEN ||
- ipp_status == IPP_AUTHENTICATION_CANCELED)
+ else if (ipp_status == IPP_STATUS_ERROR_FORBIDDEN ||
+ ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
{
const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
/* WWW-Authenticate field value */
@@ -1367,7 +1480,7 @@ main(int argc, /* I - Number of command-line args */
goto cleanup;
}
- else if (ipp_status == IPP_OPERATION_NOT_SUPPORTED)
+ else if (ipp_status == IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED)
{
/*
* This is all too common...
@@ -1407,7 +1520,8 @@ main(int argc, /* I - Number of command-line args */
IPP_PRINT_JOB,
version, uri, argv[2], monitor.job_name, num_options,
options, compression, copies_sup ? copies : 1,
- document_format, pc, media_col_sup, doc_handling_sup);
+ document_format, pc, ppd, media_col_sup,
+ doc_handling_sup, print_color_mode_sup);
/*
* Do the request...
@@ -1430,6 +1544,9 @@ main(int argc, /* I - Number of command-line args */
http_status = cupsSendRequest(http, request, resource, length);
if (http_status == HTTP_CONTINUE && request->state == IPP_DATA)
{
+ if (compression && strcmp(compression, "none"))
+ httpSetField(http, HTTP_FIELD_CONTENT_ENCODING, compression);
+
if (num_files == 1)
{
if ((fd = open(files[0], O_RDONLY)) < 0)
@@ -1441,7 +1558,7 @@ main(int argc, /* I - Number of command-line args */
else
{
fd = 0;
- http_status = cupsWriteRequestData(http, buffer, bytes);
+ http_status = cupsWriteRequestData(http, buffer, (size_t)bytes);
}
while (http_status == HTTP_CONTINUE &&
@@ -1454,6 +1571,7 @@ main(int argc, /* I - Number of command-line args */
FD_ZERO(&input);
FD_SET(fd, &input);
FD_SET(snmp_fd, &input);
+ FD_SET(CUPS_SC_FD, &input);
while (select(fd > snmp_fd ? fd + 1 : snmp_fd + 1, &input, NULL, NULL,
NULL) <= 0 && !job_canceled);
@@ -1467,7 +1585,8 @@ main(int argc, /* I - Number of command-line args */
{
fprintf(stderr, "DEBUG: Read %d bytes...\n", (int)bytes);
- if (cupsWriteRequestData(http, buffer, bytes) != HTTP_CONTINUE)
+ if ((http_status = cupsWriteRequestData(http, buffer, (size_t)bytes))
+ != HTTP_CONTINUE)
break;
}
else if (bytes == 0 || (errno != EINTR && errno != EAGAIN))
@@ -1475,6 +1594,10 @@ main(int argc, /* I - Number of command-line args */
}
}
+ if (http_status == HTTP_ERROR)
+ fprintf(stderr, "DEBUG: Error writing document data for "
+ "Print-Job: %s\n", strerror(httpError(http)));
+
if (num_files == 1)
close(fd);
}
@@ -1496,9 +1619,9 @@ main(int argc, /* I - Number of command-line args */
if (job_canceled)
break;
- if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
- ipp_status == IPP_NOT_POSSIBLE ||
- ipp_status == IPP_PRINTER_BUSY)
+ if (ipp_status == IPP_STATUS_ERROR_SERVICE_UNAVAILABLE ||
+ ipp_status == IPP_STATUS_ERROR_NOT_POSSIBLE ||
+ ipp_status == IPP_STATUS_ERROR_BUSY)
{
_cupsLangPrintFilter(stderr, "INFO", _("The printer is in use."));
sleep(10);
@@ -1513,8 +1636,13 @@ main(int argc, /* I - Number of command-line args */
goto cleanup;
}
}
- else if (ipp_status == IPP_ERROR_JOB_CANCELED ||
- ipp_status == IPP_NOT_AUTHORIZED)
+ else if (ipp_status == IPP_STATUS_ERROR_JOB_CANCELED ||
+ ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED ||
+ ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
goto cleanup;
else
{
@@ -1523,10 +1651,10 @@ main(int argc, /* I - Number of command-line args */
*/
_cupsLangPrintFilter(stderr, "ERROR",
- _("Print file was not accepted."));
+ _("Print job was not accepted."));
- if (ipp_status == IPP_FORBIDDEN ||
- ipp_status == IPP_AUTHENTICATION_CANCELED)
+ if (ipp_status == IPP_STATUS_ERROR_FORBIDDEN ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
{
const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
/* WWW-Authenticate field value */
@@ -1561,8 +1689,7 @@ main(int argc, /* I - Number of command-line args */
else if ((job_id_attr = ippFindAttribute(response, "job-id",
IPP_TAG_INTEGER)) == NULL)
{
- _cupsLangPrintFilter(stderr, "INFO",
- _("Print file accepted - job ID unknown."));
+ fputs("DEBUG: Print job accepted - job ID unknown.\n", stderr);
update_reasons(NULL, "+cups-ipp-conformance-failure-report,"
"cups-ipp-missing-job-id");
job_id = 0;
@@ -1571,11 +1698,9 @@ main(int argc, /* I - Number of command-line args */
{
password_tries = 0;
monitor.job_id = job_id = job_id_attr->values[0].integer;
- _cupsLangPrintFilter(stderr, "INFO",
- _("Print file accepted - job ID %d."), job_id);
+ fprintf(stderr, "DEBUG: Print job accepted - job ID %d.\n", job_id);
}
- fprintf(stderr, "DEBUG: job-id=%d\n", job_id);
ippDelete(response);
if (job_canceled)
@@ -1596,8 +1721,7 @@ main(int argc, /* I - Number of command-line args */
*/
request = ippNewRequest(IPP_SEND_DOCUMENT);
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
+ ippSetVersion(request, version / 10, version % 10);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -1624,10 +1748,13 @@ main(int argc, /* I - Number of command-line args */
http_status = cupsSendRequest(http, request, resource, 0);
if (http_status == HTTP_CONTINUE && request->state == IPP_DATA)
{
+ if (compression && strcmp(compression, "none"))
+ httpSetField(http, HTTP_FIELD_CONTENT_ENCODING, compression);
+
if (num_files == 0)
{
fd = 0;
- http_status = cupsWriteRequestData(http, buffer, bytes);
+ http_status = cupsWriteRequestData(http, buffer, (size_t)bytes);
}
else
{
@@ -1646,7 +1773,7 @@ main(int argc, /* I - Number of command-line args */
while (!job_canceled && http_status == HTTP_CONTINUE &&
(bytes = read(fd, buffer, sizeof(buffer))) > 0)
{
- if ((http_status = cupsWriteRequestData(http, buffer, bytes))
+ if ((http_status = cupsWriteRequestData(http, buffer, (size_t)bytes))
!= HTTP_CONTINUE)
break;
else
@@ -1663,13 +1790,17 @@ main(int argc, /* I - Number of command-line args */
close(fd);
}
+ if (http_status == HTTP_ERROR)
+ fprintf(stderr, "DEBUG: Error writing document data for "
+ "Send-Document: %s\n", strerror(httpError(http)));
+
ippDelete(cupsGetResponse(http, resource));
ippDelete(request);
fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n",
ippErrorString(cupsLastError()), cupsLastErrorString());
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_OK_CONFLICT && !job_canceled)
{
ipp_status = cupsLastError();
@@ -1687,11 +1818,28 @@ main(int argc, /* I - Number of command-line args */
}
}
+ if (job_canceled)
+ break;
+
if (ipp_status <= IPP_OK_CONFLICT && argc > 6)
{
fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1);
copies_remaining --;
}
+ else if ((ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR || ipp_status == IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) &&
+ argc == 6 &&
+ document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf"))
+ {
+ /*
+ * Need to reprocess the job as raster...
+ */
+
+ fputs("JOBSTATE: cups-retry-as-raster\n", stderr);
+ if (job_id > 0)
+ cancel_job(http, uri, job_id, resource, argv[2], version);
+
+ goto cleanup;
+ }
else if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
ipp_status == IPP_NOT_POSSIBLE ||
ipp_status == IPP_PRINTER_BUSY)
@@ -1713,6 +1861,10 @@ main(int argc, /* I - Number of command-line args */
else if (ipp_status == IPP_REQUEST_VALUE ||
ipp_status == IPP_ERROR_JOB_CANCELED ||
ipp_status == IPP_NOT_AUTHORIZED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED ||
ipp_status == IPP_INTERNAL_ERROR)
{
/*
@@ -1722,7 +1874,7 @@ main(int argc, /* I - Number of command-line args */
goto cleanup;
}
- else if (ipp_status == IPP_UPGRADE_REQUIRED)
+ else if (ipp_status == IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED)
{
/*
* Server is configured incorrectly; the policy for Create-Job and
@@ -1736,7 +1888,7 @@ main(int argc, /* I - Number of command-line args */
fputs("DEBUG: The policy for Create-Job and Send-Document must have the "
"same authentication and encryption requirements.\n", stderr);
- ipp_status = IPP_INTERNAL_ERROR;
+ ipp_status = IPP_STATUS_ERROR_INTERNAL;
if (job_id > 0)
cancel_job(http, uri, job_id, resource, argv[2], version);
@@ -1771,6 +1923,8 @@ main(int argc, /* I - Number of command-line args */
if (!job_id || !waitjob || !get_job_attrs)
continue;
+ fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
+
_cupsLangPrintFilter(stderr, "INFO", _("Waiting for job to complete."));
for (delay = _cupsNextDelay(0, &prev_delay); !job_canceled;)
@@ -1782,12 +1936,20 @@ main(int argc, /* I - Number of command-line args */
backendCheckSideChannel(snmp_fd, http->hostaddr);
/*
+ * Check printer state...
+ */
+
+ check_printer_state(http, uri, resource, argv[2], version);
+
+ if (cupsLastError() <= IPP_OK_CONFLICT)
+ password_tries = 0;
+
+ /*
* Build an IPP_GET_JOB_ATTRIBUTES request...
*/
request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
+ ippSetVersion(request, version / 10, version % 10);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -1839,6 +2001,17 @@ main(int argc, /* I - Number of command-line args */
ipp_status = IPP_OK;
break;
}
+ else if (ipp_status == IPP_INTERNAL_ERROR)
+ {
+ waitjob_tries ++;
+
+ if (waitjob_tries > 4)
+ {
+ ippDelete(response);
+ ipp_status = IPP_OK;
+ break;
+ }
+ }
}
if (response)
@@ -1857,12 +2030,8 @@ main(int argc, /* I - Number of command-line args */
remote_job_states[job_state->values[0].integer -
IPP_JOB_PENDING]);
- if ((job_sheets = ippFindAttribute(response,
- "job-media-sheets-completed",
- IPP_TAG_INTEGER)) == NULL)
- job_sheets = ippFindAttribute(response,
- "job-impressions-completed",
- IPP_TAG_INTEGER);
+ if ((job_sheets = ippFindAttribute(response, "job-impressions-completed", IPP_TAG_INTEGER)) == NULL)
+ job_sheets = ippFindAttribute(response, "job-media-sheets-completed", IPP_TAG_INTEGER);
if (job_sheets)
fprintf(stderr, "PAGE: total %d\n",
@@ -1897,14 +2066,11 @@ main(int argc, /* I - Number of command-line args */
ippDelete(response);
- if (cupsLastError() <= IPP_OK_CONFLICT)
- password_tries = 0;
-
/*
* Wait before polling again...
*/
- sleep(delay);
+ sleep((unsigned)delay);
delay = _cupsNextDelay(delay, &prev_delay);
}
@@ -1915,8 +2081,13 @@ main(int argc, /* I - Number of command-line args */
*/
if (job_canceled > 0 && job_id > 0)
+ {
cancel_job(http, uri, job_id, resource, argv[2], version);
+ if (cupsLastError() > IPP_OK_CONFLICT)
+ _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job."));
+ }
+
/*
* Check the printer state and report it if necessary...
*/
@@ -1953,6 +2124,7 @@ main(int argc, /* I - Number of command-line args */
cupsFreeOptions(num_options, options);
_ppdCacheDestroy(pc);
+ ppdClose(ppd);
httpClose(http);
@@ -1965,14 +2137,6 @@ main(int argc, /* I - Number of command-line args */
if (tmpfilename[0])
unlink(tmpfilename);
-#ifdef HAVE_LIBZ
- if (compression)
- {
- for (i = 0; i < num_files; i ++)
- unlink(files[i]);
- }
-#endif /* HAVE_LIBZ */
-
/*
* Return the queue status...
*/
@@ -1982,14 +2146,29 @@ main(int argc, /* I - Number of command-line args */
ipp_status <= IPP_OK_CONFLICT)
fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required);
+ if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED)
+ fputs("JOBSTATE: account-info-needed\n", stderr);
+ else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED)
+ fputs("JOBSTATE: account-closed\n", stderr);
+ else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED)
+ fputs("JOBSTATE: account-limit-reached\n", stderr);
+ else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
+ fputs("JOBSTATE: account-authorization-failed\n", stderr);
+
if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN ||
ipp_status == IPP_AUTHENTICATION_CANCELED)
return (CUPS_BACKEND_AUTH_REQUIRED);
+ else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+ ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
+ return (CUPS_BACKEND_HOLD);
else if (ipp_status == IPP_INTERNAL_ERROR)
return (CUPS_BACKEND_STOP);
else if (ipp_status == IPP_CONFLICT)
return (CUPS_BACKEND_FAILED);
else if (ipp_status == IPP_REQUEST_VALUE ||
+ ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
ipp_status == IPP_DOCUMENT_FORMAT || job_canceled < 0)
{
if (ipp_status == IPP_REQUEST_VALUE)
@@ -1997,6 +2176,9 @@ main(int argc, /* I - Number of command-line args */
else if (ipp_status == IPP_DOCUMENT_FORMAT)
_cupsLangPrintFilter(stderr, "ERROR",
_("Printer cannot print supplied content."));
+ else if (ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES)
+ _cupsLangPrintFilter(stderr, "ERROR",
+ _("Printer cannot print with supplied options."));
else
_cupsLangPrintFilter(stderr, "ERROR", _("Print job canceled at printer."));
@@ -2027,8 +2209,7 @@ cancel_job(http_t *http, /* I - HTTP connection */
_cupsLangPrintFilter(stderr, "INFO", _("Canceling print job."));
request = ippNewRequest(IPP_CANCEL_JOB);
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
+ ippSetVersion(request, version / 10, version % 10);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -2043,9 +2224,6 @@ cancel_job(http_t *http, /* I - HTTP connection */
*/
ippDelete(cupsDoRequest(http, request, resource));
-
- if (cupsLastError() > IPP_OK_CONFLICT)
- _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job."));
}
@@ -2073,8 +2251,7 @@ check_printer_state(
*/
request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
+ ippSetVersion(request, version / 10, version % 10);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -2109,77 +2286,6 @@ check_printer_state(
}
-#ifdef HAVE_LIBZ
-/*
- * 'compress_files()' - Compress print files.
- */
-
-static void
-compress_files(int num_files, /* I - Number of files */
- char **files) /* I - Files */
-{
- int i, /* Looping var */
- fd; /* Temporary file descriptor */
- ssize_t bytes; /* Bytes read/written */
- size_t total; /* Total bytes read */
- cups_file_t *in, /* Input file */
- *out; /* Output file */
- struct stat outinfo; /* Output file information */
- char filename[1024], /* Temporary filename */
- buffer[32768]; /* Copy buffer */
-
-
- fprintf(stderr, "DEBUG: Compressing %d job files...\n", num_files);
- for (i = 0; i < num_files; i ++)
- {
- if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
- {
- _cupsLangPrintError("ERROR", _("Unable to create compressed print file"));
- exit(CUPS_BACKEND_FAILED);
- }
-
- if ((out = cupsFileOpenFd(fd, "w9")) == NULL)
- {
- _cupsLangPrintError("ERROR", _("Unable to open compressed print file"));
- exit(CUPS_BACKEND_FAILED);
- }
-
- if ((in = cupsFileOpen(files[i], "r")) == NULL)
- {
- _cupsLangPrintError("ERROR", _("Unable to open print file"));
- cupsFileClose(out);
- exit(CUPS_BACKEND_FAILED);
- }
-
- total = 0;
- while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0)
- if (cupsFileWrite(out, buffer, bytes) < bytes)
- {
- _cupsLangPrintError("ERROR",
- _("Unable to generate compressed print file"));
- cupsFileClose(in);
- cupsFileClose(out);
- exit(CUPS_BACKEND_FAILED);
- }
- else
- total += bytes;
-
- cupsFileClose(out);
- cupsFileClose(in);
-
- files[i] = strdup(filename);
-
- if (!stat(filename, &outinfo))
- fprintf(stderr,
- "DEBUG: File %d compressed to %.1f%% of original size, "
- CUPS_LLFMT " bytes...\n",
- i + 1, 100.0 * outinfo.st_size / total,
- CUPS_LLCAST outinfo.st_size);
- }
-}
-#endif /* HAVE_LIBZ */
-
-
/*
* 'monitor_printer()' - Monitor the printer state.
*/
@@ -2206,11 +2312,12 @@ monitor_printer(
* Make a copy of the printer connection...
*/
- http = _httpCreate(monitor->hostname, monitor->port, NULL, monitor->encryption,
- AF_UNSPEC);
+ http = httpConnect2(monitor->hostname, monitor->port, NULL, AF_UNSPEC,
+ monitor->encryption, 1, 0, NULL);
httpSetTimeout(http, 30.0, timeout_cb, NULL);
if (username[0])
cupsSetUser(username);
+
cupsSetPasswordCB2((cups_password_cb2_t)password_cb, &password_tries);
/*
@@ -2219,6 +2326,8 @@ monitor_printer(
delay = _cupsNextDelay(0, &prev_delay);
+ monitor->job_reasons = 0;
+
while (monitor->job_state < IPP_JOB_CANCELED && !job_canceled)
{
/*
@@ -2238,6 +2347,15 @@ monitor_printer(
if (cupsLastError() <= IPP_OK_CONFLICT)
password_tries = 0;
+ if (monitor->job_id == 0 && monitor->create_job)
+ {
+ /*
+ * No job-id yet, so continue...
+ */
+
+ goto monitor_disconnect;
+ }
+
/*
* Check the status of the job itself...
*/
@@ -2245,8 +2363,7 @@ monitor_printer(
job_op = (monitor->job_id > 0 && monitor->get_job_attrs) ?
IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS;
request = ippNewRequest(job_op);
- request->request.op.version[0] = monitor->version / 10;
- request->request.op.version[1] = monitor->version % 10;
+ ippSetVersion(request, monitor->version / 10, monitor->version % 10);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, monitor->uri);
@@ -2308,7 +2425,7 @@ monitor_printer(
job_name = attr->values[0].string.text;
else if (!strcmp(attr->name, "job-state") &&
attr->value_tag == IPP_TAG_ENUM)
- job_state = attr->values[0].integer;
+ job_state = (ipp_jstate_t)attr->values[0].integer;
else if (!strcmp(attr->name, "job-originating-user-name") &&
(attr->value_tag == IPP_TAG_NAME ||
attr->value_tag == IPP_TAG_NAMELANG))
@@ -2330,9 +2447,67 @@ monitor_printer(
}
}
+ fprintf(stderr, "DEBUG: (monitor) job-state = %s\n",
+ ippEnumString("job-state", monitor->job_state));
+
+ if (!job_canceled &&
+ (monitor->job_state == IPP_JOB_CANCELED ||
+ monitor->job_state == IPP_JOB_ABORTED))
+ {
+ job_canceled = -1;
+ fprintf(stderr, "DEBUG: (monitor) job_canceled = -1\n");
+ }
+
+ if ((attr = ippFindAttribute(response, "job-state-reasons",
+ IPP_TAG_KEYWORD)) != NULL)
+ {
+ int i, new_reasons = 0; /* Looping var, new reasons */
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (!strcmp(attr->values[i].string.text,
+ "account-authorization-failed"))
+ new_reasons |= _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED;
+ else if (!strcmp(attr->values[i].string.text, "account-closed"))
+ new_reasons |= _CUPS_JSR_ACCOUNT_CLOSED;
+ else if (!strcmp(attr->values[i].string.text, "account-info-needed"))
+ new_reasons |= _CUPS_JSR_ACCOUNT_INFO_NEEDED;
+ else if (!strcmp(attr->values[i].string.text,
+ "account-limit-reached"))
+ new_reasons |= _CUPS_JSR_ACCOUNT_LIMIT_REACHED;
+ else if (!strcmp(attr->values[i].string.text, "job-password-wait"))
+ new_reasons |= _CUPS_JSR_JOB_PASSWORD_WAIT;
+ else if (!strcmp(attr->values[i].string.text, "job-release-wait"))
+ new_reasons |= _CUPS_JSR_JOB_RELEASE_WAIT;
+ if (!job_canceled &&
+ (!strncmp(attr->values[i].string.text, "job-canceled-", 13) || !strcmp(attr->values[i].string.text, "aborted-by-system")))
+ job_canceled = 1;
+ }
+
+ if (new_reasons != monitor->job_reasons)
+ {
+ if (new_reasons & _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED)
+ fputs("JOBSTATE: account-authorization-failed\n", stderr);
+ else if (new_reasons & _CUPS_JSR_ACCOUNT_CLOSED)
+ fputs("JOBSTATE: account-closed\n", stderr);
+ else if (new_reasons & _CUPS_JSR_ACCOUNT_INFO_NEEDED)
+ fputs("JOBSTATE: account-info-needed\n", stderr);
+ else if (new_reasons & _CUPS_JSR_ACCOUNT_LIMIT_REACHED)
+ fputs("JOBSTATE: account-limit-reached\n", stderr);
+ else if (new_reasons & _CUPS_JSR_JOB_PASSWORD_WAIT)
+ fputs("JOBSTATE: job-password-wait\n", stderr);
+ else if (new_reasons & _CUPS_JSR_JOB_RELEASE_WAIT)
+ fputs("JOBSTATE: job-release-wait\n", stderr);
+ else
+ fputs("JOBSTATE: job-printing\n", stderr);
+
+ monitor->job_reasons = new_reasons;
+ }
+ }
+
ippDelete(response);
- fprintf(stderr, "DEBUG: (monitor) job-state=%s\n",
+ fprintf(stderr, "DEBUG: (monitor) job-state = %s\n",
ippEnumString("job-state", monitor->job_state));
if (!job_canceled &&
@@ -2344,6 +2519,8 @@ monitor_printer(
* Disconnect from the printer - we'll reconnect on the next poll...
*/
+ monitor_disconnect:
+
_httpDisconnect(http);
}
@@ -2351,7 +2528,7 @@ monitor_printer(
* Sleep for N seconds...
*/
- sleep(delay);
+ sleep((unsigned)delay);
delay = _cupsNextDelay(delay, &prev_delay);
}
@@ -2361,10 +2538,20 @@ monitor_printer(
*/
if (job_canceled > 0 && monitor->job_id > 0)
+ {
if (!httpReconnect(http))
+ {
cancel_job(http, monitor->uri, monitor->job_id, monitor->resource,
monitor->user, monitor->version);
+ if (cupsLastError() > IPP_OK_CONFLICT)
+ {
+ fprintf(stderr, "DEBUG: (monitor) cancel_job() = %s\n", cupsLastErrorString());
+ _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job."));
+ }
+ }
+ }
+
/*
* Cleanup and return...
*/
@@ -2392,27 +2579,25 @@ new_request(
int copies, /* I - copies value or 0 */
const char *format, /* I - document-format value or NULL */
_ppd_cache_t *pc, /* I - PPD cache and mapping data */
+ ppd_file_t *ppd, /* I - PPD file data */
ipp_attribute_t *media_col_sup, /* I - media-col-supported values */
- ipp_attribute_t *doc_handling_sup) /* I - multiple-document-handling-supported values */
+ ipp_attribute_t *doc_handling_sup, /* I - multiple-document-handling-supported values */
+ ipp_attribute_t *print_color_mode_sup)
+ /* I - Printer supports print-color-mode */
{
- int i; /* Looping var */
ipp_t *request; /* Request data */
const char *keyword; /* PWG keyword */
- _pwg_size_t *size; /* PWG media size */
- ipp_t *media_col, /* media-col value */
- *media_size; /* media-size value */
- const char *media_source, /* media-source value */
- *media_type, /* media-type value */
- *collate_str; /* multiple-document-handling value */
+ ipp_tag_t group; /* Current group */
+ ipp_attribute_t *attr; /* Current attribute */
+ char buffer[1024]; /* Value buffer */
/*
* Create the IPP request...
*/
- request = ippNewRequest(op);
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
+ request = ippNewRequest(op);
+ ippSetVersion(request, version / 10, version % 10);
fprintf(stderr, "DEBUG: %s IPP/%d.%d\n",
ippOpString(request->request.op.operation_id),
@@ -2423,36 +2608,31 @@ new_request(
* Add standard attributes...
*/
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
- NULL, uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
fprintf(stderr, "DEBUG: printer-uri=\"%s\"\n", uri);
if (user && *user)
{
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
- "requesting-user-name", NULL, user);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user);
fprintf(stderr, "DEBUG: requesting-user-name=\"%s\"\n", user);
}
if (title && *title)
{
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
- title);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, title);
fprintf(stderr, "DEBUG: job-name=\"%s\"\n", title);
}
if (format && op != IPP_CREATE_JOB)
{
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
- "document-format", NULL, format);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format);
fprintf(stderr, "DEBUG: document-format=\"%s\"\n", format);
}
#ifdef HAVE_LIBZ
- if (compression && op != IPP_CREATE_JOB)
+ if (compression && op != IPP_OP_CREATE_JOB && op != IPP_OP_VALIDATE_JOB)
{
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
- "compression", NULL, compression);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "compression", NULL, compression);
fprintf(stderr, "DEBUG: compression=\"%s\"\n", compression);
}
#endif /* HAVE_LIBZ */
@@ -2465,198 +2645,13 @@ new_request(
{
if (pc)
{
- int num_finishings = 0, /* Number of finishing values */
- finishings[10]; /* Finishing enum values */
-
/*
* Send standard IPP attributes...
*/
- if ((keyword = cupsGetOption("PageSize", num_options, options)) == NULL)
- keyword = cupsGetOption("media", num_options, options);
-
- if ((size = _ppdCacheGetSize(pc, keyword)) != NULL)
- {
- /*
- * Add a media-col value...
- */
-
- media_size = ippNew();
- ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER,
- "x-dimension", size->width);
- ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER,
- "y-dimension", size->length);
-
- media_col = ippNew();
- ippAddCollection(media_col, IPP_TAG_ZERO, "media-size", media_size);
-
- media_source = _ppdCacheGetSource(pc, cupsGetOption("InputSlot",
- num_options,
- options));
- media_type = _ppdCacheGetType(pc, cupsGetOption("MediaType",
- num_options,
- options));
-
- for (i = 0; i < media_col_sup->num_values; i ++)
- {
- if (!strcmp(media_col_sup->values[i].string.text,
- "media-left-margin"))
- ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER,
- "media-left-margin", size->left);
- else if (!strcmp(media_col_sup->values[i].string.text,
- "media-bottom-margin"))
- ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER,
- "media-bottom-margin", size->bottom);
- else if (!strcmp(media_col_sup->values[i].string.text,
- "media-right-margin"))
- ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER,
- "media-right-margin", size->right);
- else if (!strcmp(media_col_sup->values[i].string.text,
- "media-top-margin"))
- ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER,
- "media-top-margin", size->top);
- else if (!strcmp(media_col_sup->values[i].string.text,
- "media-source") && media_source)
- ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD,
- "media-source", NULL, media_source);
- else if (!strcmp(media_col_sup->values[i].string.text,
- "media-type") && media_type)
- ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD,
- "media-type", NULL, media_type);
- }
-
- ippAddCollection(request, IPP_TAG_JOB, "media-col", media_col);
- }
-
- if ((keyword = cupsGetOption("output-bin", num_options,
- options)) == NULL)
- keyword = _ppdCacheGetBin(pc, cupsGetOption("OutputBin", num_options,
- options));
-
- if (keyword)
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-bin",
- NULL, keyword);
-
- if ((keyword = cupsGetOption("output-mode", num_options,
- options)) != NULL)
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode",
- NULL, keyword);
- else if ((keyword = cupsGetOption("ColorModel", num_options,
- options)) != NULL)
- {
- if (!_cups_strcasecmp(keyword, "Gray"))
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode",
- NULL, "monochrome");
- else
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode",
- NULL, "color");
- }
-
- if ((keyword = cupsGetOption("print-quality", num_options,
- options)) != NULL)
- ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
- atoi(keyword));
- else if ((keyword = cupsGetOption("cupsPrintQuality", num_options,
- options)) != NULL)
- {
- if (!_cups_strcasecmp(keyword, "draft"))
- ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
- IPP_QUALITY_DRAFT);
- else if (!_cups_strcasecmp(keyword, "normal"))
- ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
- IPP_QUALITY_NORMAL);
- else if (!_cups_strcasecmp(keyword, "high"))
- ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
- IPP_QUALITY_HIGH);
- }
-
- if ((keyword = cupsGetOption("sides", num_options, options)) != NULL)
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
- NULL, keyword);
- else if (pc->sides_option &&
- (keyword = cupsGetOption(pc->sides_option, num_options,
- options)) != NULL)
- {
- if (!_cups_strcasecmp(keyword, pc->sides_1sided))
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
- NULL, "one-sided");
- else if (!_cups_strcasecmp(keyword, pc->sides_2sided_long))
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
- NULL, "two-sided-long-edge");
- if (!_cups_strcasecmp(keyword, pc->sides_2sided_short))
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
- NULL, "two-sided-short-edge");
- }
-
- if ((keyword = cupsGetOption("multiple-document-handling",
- num_options, options)) != NULL)
- {
- if (strstr(keyword, "uncollated"))
- keyword = "false";
- else
- keyword = "true";
- }
- else if ((keyword = cupsGetOption("collate", num_options,
- options)) == NULL)
- keyword = "true";
-
- if (format)
- {
- if (!_cups_strcasecmp(format, "image/gif") ||
- !_cups_strcasecmp(format, "image/jp2") ||
- !_cups_strcasecmp(format, "image/jpeg") ||
- !_cups_strcasecmp(format, "image/png") ||
- !_cups_strcasecmp(format, "image/tiff") ||
- !_cups_strncasecmp(format, "image/x-", 8))
- {
- /*
- * Collation makes no sense for single page image formats...
- */
-
- keyword = "false";
- }
- else if (!_cups_strncasecmp(format, "image/", 6) ||
- !_cups_strcasecmp(format, "application/vnd.cups-raster"))
- {
- /*
- * Multi-page image formats will have copies applied by the upstream
- * filters...
- */
-
- copies = 1;
- }
- }
+ fputs("DEBUG: Adding standard IPP operation/job attributes.\n", stderr);
- if (doc_handling_sup)
- {
- if (!_cups_strcasecmp(keyword, "true"))
- collate_str = "separate-documents-collated-copies";
- else
- collate_str = "separate-documents-uncollated-copies";
-
- for (i = 0; i < doc_handling_sup->num_values; i ++)
- if (!strcmp(doc_handling_sup->values[i].string.text, collate_str))
- {
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD,
- "multiple-document-handling", NULL, collate_str);
- break;
- }
-
- if (i >= doc_handling_sup->num_values)
- copies = 1;
- }
-
- /*
- * Map finishing options...
- */
-
- num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options,
- (int)(sizeof(finishings) /
- sizeof(finishings[0])),
- finishings);
- if (num_finishings > 0)
- ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings",
- num_finishings, finishings);
+ copies = _cupsConvertOptions(request, ppd, pc, media_col_sup, doc_handling_sup, print_color_mode_sup, user, format, copies, num_options, options);
/*
* Map FaxOut options...
@@ -2665,19 +2660,39 @@ new_request(
if ((keyword = cupsGetOption("phone", num_options, options)) != NULL)
{
ipp_t *destination; /* destination collection */
- char tel_uri[1024]; /* tel: URI */
+ char phone[1024], /* Phone number string */
+ *ptr, /* Pointer into string */
+ tel_uri[1024]; /* tel: URI */
+ static const char * const allowed = "0123456789#*-+.()";
+ /* Allowed characters */
destination = ippNew();
- httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel",
- NULL, NULL, 0, keyword);
- ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri",
- NULL, tel_uri);
+ /*
+ * Unescape and filter out spaces and other characters that are not
+ * allowed in a tel: URI.
+ */
+
+ _httpDecodeURI(phone, keyword, sizeof(phone));
+ for (ptr = phone; *ptr;)
+ {
+ if (!strchr(allowed, *ptr))
+ _cups_strcpy(ptr, ptr + 1);
+ else
+ ptr ++;
+ }
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
+ ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
if ((keyword = cupsGetOption("faxPrefix", num_options,
options)) != NULL && *keyword)
- ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT,
- "pre-dial-string", NULL, keyword);
+ {
+ char predial[1024]; /* Pre-dial string */
+
+ _httpDecodeURI(predial, keyword, sizeof(predial));
+ ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, predial);
+ }
ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
ippDelete(destination);
@@ -2689,6 +2704,8 @@ new_request(
* When talking to another CUPS server, send all options...
*/
+ fputs("DEBUG: Adding all operation/job attributes.\n", stderr);
+ cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB);
}
@@ -2696,6 +2713,34 @@ new_request(
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", copies);
}
+ fprintf(stderr, "DEBUG: IPP/%d.%d %s #%d\n", version / 10, version % 10,
+ ippOpString(ippGetOperation(request)), ippGetRequestId(request));
+ for (group = IPP_TAG_ZERO, attr = ippFirstAttribute(request);
+ attr;
+ attr = ippNextAttribute(request))
+ {
+ const char *name = ippGetName(attr);
+
+ if (!name)
+ {
+ group = IPP_TAG_ZERO;
+ continue;
+ }
+
+ if (group != ippGetGroupTag(attr))
+ {
+ group = ippGetGroupTag(attr);
+ fprintf(stderr, "DEBUG: ---- %s ----\n", ippTagString(group));
+ }
+
+ ippAttributeString(attr, buffer, sizeof(buffer));
+ fprintf(stderr, "DEBUG: %s %s%s %s\n", name,
+ ippGetCount(attr) > 1 ? "1setOf " : "",
+ ippTagString(ippGetValueTag(attr)), buffer);
+ }
+
+ fprintf(stderr, "DEBUG: ---- %s ----\n", ippTagString(IPP_TAG_END));
+
return (request);
}
@@ -2711,6 +2756,9 @@ password_cb(const char *prompt, /* I - Prompt (not used) */
const char *resource, /* I - Resource path (not used) */
int *password_tries) /* I - Password tries */
{
+ char def_username[HTTP_MAX_VALUE]; /* Default username */
+
+
fprintf(stderr, "DEBUG: password_cb(prompt=\"%s\", http=%p, method=\"%s\", "
"resource=\"%s\", password_tries=%p(%d)), password=%p\n",
prompt, http, method, resource, password_tries, *password_tries,
@@ -2720,16 +2768,31 @@ password_cb(const char *prompt, /* I - Prompt (not used) */
(void)method;
(void)resource;
- /*
- * Remember that we need to authenticate...
- */
+ if (!uri_credentials)
+ {
+ /*
+ * Remember that we need to authenticate...
+ */
- auth_info_required = "username,password";
+ auth_info_required = "username,password";
+
+ if (httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "username",
+ def_username))
+ {
+ char quoted[HTTP_MAX_VALUE * 2 + 4];
+ /* Quoted string */
+
+ fprintf(stderr, "ATTR: auth-info-default=%s,\n",
+ quote_string(def_username, quoted, sizeof(quoted)));
+ }
+ }
if (password && *password && *password_tries < 3)
{
(*password_tries) ++;
+ cupsSetUser(username);
+
return (password);
}
else
@@ -2744,6 +2807,56 @@ password_cb(const char *prompt, /* I - Prompt (not used) */
/*
+ * 'quote_string()' - Quote a string value.
+ */
+
+static const char * /* O - Quoted string */
+quote_string(const char *s, /* I - String */
+ char *q, /* I - Quoted string buffer */
+ size_t qsize) /* I - Size of quoted string buffer */
+{
+ char *qptr, /* Pointer into string buffer */
+ *qend; /* End of string buffer */
+
+
+ qptr = q;
+ qend = q + qsize - 5;
+
+ if (qend < q)
+ {
+ *q = '\0';
+ return (q);
+ }
+
+ *qptr++ = '\'';
+ *qptr++ = '\"';
+
+ while (*s && qptr < qend)
+ {
+ if (*s == '\\' || *s == '\"' || *s == '\'')
+ {
+ if (qptr < (qend - 4))
+ {
+ *qptr++ = '\\';
+ *qptr++ = '\\';
+ *qptr++ = '\\';
+ }
+ else
+ break;
+ }
+
+ *qptr++ = *s++;
+ }
+
+ *qptr++ = '\"';
+ *qptr++ = '\'';
+ *qptr = '\0';
+
+ return (q);
+}
+
+
+/*
* 'report_attr()' - Report an IPP attribute value.
*/
@@ -2752,8 +2865,7 @@ report_attr(ipp_attribute_t *attr) /* I - Attribute */
{
int i; /* Looping var */
char value[1024], /* Value string */
- *valptr, /* Pointer into value string */
- *attrptr; /* Pointer into attribute value */
+ *valptr; /* Pointer into value string */
const char *cached; /* Cached attribute */
@@ -2772,31 +2884,15 @@ report_attr(ipp_attribute_t *attr) /* I - Attribute */
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- snprintf(valptr, sizeof(value) - (valptr - value), "%d",
- attr->values[i].integer);
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", attr->values[i].integer);
valptr += strlen(valptr);
break;
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
- *valptr++ = '\'';
- *valptr++ = '\"';
- for (attrptr = attr->values[i].string.text;
- *attrptr && valptr < (value + sizeof(value) - 10);
- attrptr ++)
- {
- if (*attrptr == '\\' || *attrptr == '\"' || *attrptr == '\'')
- {
- *valptr++ = '\\';
- *valptr++ = '\\';
- *valptr++ = '\\';
- }
-
- *valptr++ = *attrptr;
- }
- *valptr++ = '\"';
- *valptr++ = '\'';
+ quote_string(attr->values[i].string.text, valptr, (size_t)(value + sizeof(value) - valptr));
+ valptr += strlen(valptr);
break;
default :
@@ -2837,6 +2933,7 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
{
ipp_attribute_t *pa, /* printer-alert */
*pam, /* printer-alert-message */
+ *pmja, /* printer-mandatory-job-attributes */
*psm, /* printer-state-message */
*reasons, /* printer-state-reasons */
*marker; /* marker-* attributes */
@@ -2857,6 +2954,26 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
IPP_TAG_TEXT)) != NULL)
report_attr(pam);
+ if ((pmja = ippFindAttribute(ipp, "printer-mandatory-job-attributes", IPP_TAG_KEYWORD)) != NULL)
+ {
+ int i, /* Looping var */
+ count = ippGetCount(pmja); /* Number of values */
+
+ for (i = 0, valptr = value; i < count; i ++, valptr += strlen(valptr))
+ {
+ if (i)
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value), " %s", ippGetString(pmja, i, NULL));
+ else
+ strlcpy(value, ippGetString(pmja, i, NULL), sizeof(value));
+ }
+
+ if (strcmp(value, mandatory_attrs))
+ {
+ strlcpy(mandatory_attrs, value, sizeof(mandatory_attrs));
+ fprintf(stderr, "PPD: cupsMandatory=\"%s\"\n", value);
+ }
+ }
+
if ((psm = ippFindAttribute(ipp, "printer-state-message",
IPP_TAG_TEXT)) != NULL)
{
@@ -3046,12 +3163,12 @@ run_as_user(char *argv[], /* I - Command-line arguments */
if (response)
{
- child_pid = xpc_dictionary_get_int64(response, "child-pid");
+ child_pid = (pid_t)xpc_dictionary_get_int64(response, "child-pid");
xpc_release(response);
if (child_pid)
- fprintf(stderr, "DEBUG: Child PID=%d.\n", child_pid);
+ fprintf(stderr, "DEBUG: Child PID=%d.\n", (int)child_pid);
else
{
_cupsLangPrintFilter(stderr, "ERROR",
@@ -3097,7 +3214,7 @@ run_as_user(char *argv[], /* I - Command-line arguments */
if (response)
{
- status = xpc_dictionary_get_int64(response, "status");
+ status = (int)xpc_dictionary_get_int64(response, "status");
if (status == SIGTERM || status == SIGKILL || status == SIGPIPE)
{
@@ -3125,7 +3242,6 @@ run_as_user(char *argv[], /* I - Command-line arguments */
if (conn)
{
- xpc_connection_suspend(conn);
xpc_connection_cancel(conn);
xpc_release(conn);
}
@@ -3160,7 +3276,7 @@ sigterm_handler(int sig) /* I - Signal */
* Flag that the job should be canceled...
*/
- write(2, "DEBUG: job_canceled = 1.\n", 25);
+ write(2, "DEBUG: sigterm_handler: job_canceled = 1.\n", 25);
job_canceled = 1;
return;
@@ -3247,7 +3363,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
else
op = '\0';
- new_reasons = _cupsArrayNewStrings(s);
+ new_reasons = _cupsArrayNewStrings(s, ',');
}
else
return;
@@ -3297,8 +3413,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
temp = (char *)cupsArrayNext(state_reasons))
if (!strncmp(temp, "cups-remote-", 12))
{
- snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix,
- temp);
+ snprintf(remptr, sizeof(rem) - (size_t)(remptr - rem), "%s%s", remprefix, temp);
remptr += strlen(remptr);
remprefix = ",";
@@ -3311,8 +3426,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
cupsArrayAdd(state_reasons, reason);
- snprintf(addptr, sizeof(add) - (addptr - add), "%s%s", addprefix,
- reason);
+ snprintf(addptr, sizeof(add) - (size_t)(addptr - add), "%s%s", addprefix, reason);
addptr += strlen(addptr);
addprefix = ",";
}
@@ -3330,8 +3444,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
{
if (cupsArrayFind(state_reasons, reason))
{
- snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix,
- reason);
+ snprintf(remptr, sizeof(rem) - (size_t)(remptr - rem), "%s%s", remprefix, reason);
remptr += strlen(remptr);
remprefix = ",";
@@ -3351,8 +3464,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
{
if (strncmp(reason, "cups-", 5) && !cupsArrayFind(new_reasons, reason))
{
- snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix,
- reason);
+ snprintf(remptr, sizeof(rem) - (size_t)(remptr - rem), "%s%s", remprefix, reason);
remptr += strlen(remptr);
remprefix = ",";
@@ -3368,8 +3480,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
{
cupsArrayAdd(state_reasons, reason);
- snprintf(addptr, sizeof(add) - (addptr - add), "%s%s", addprefix,
- reason);
+ snprintf(addptr, sizeof(add) - (size_t)(addptr - add), "%s%s", addprefix, reason);
addptr += strlen(addptr);
addprefix = ",";
}
@@ -3391,5 +3502,5 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */
}
/*
- * End of "$Id: ipp.c 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: ipp.c 12896 2015-10-09 13:15:22Z msweet $".
*/
diff --git a/backend/lpd.c b/backend/lpd.c
index 8436f99..33e8408 100644
--- a/backend/lpd.c
+++ b/backend/lpd.c
@@ -1,27 +1,18 @@
/*
- * "$Id: lpd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpd.c 12024 2014-07-15 12:58:39Z msweet $"
*
- * Line Printer Daemon backend for CUPS.
+ * Line Printer Daemon backend for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Send a file to the printer or server.
- * lpd_command() - Send an LPR command sequence and wait for a reply.
- * lpd_queue() - Queue a file using the Line Printer Daemon protocol.
- * lpd_write() - Write a buffer of data to an LPD server.
- * rresvport_af() - A simple implementation of rresvport_af().
- * sigterm_handler() - Handle 'terminate' signals that stop the backend.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -93,7 +84,7 @@ static int lpd_queue(const char *hostname, http_addrlist_t *addrlist,
int copies, int banner, int format, int order,
int reserve, int manual_copies, int timeout,
int contimeout, const char *orighost);
-static int lpd_write(int lpd_fd, char *buffer, int length);
+static ssize_t lpd_write(int lpd_fd, char *buffer, size_t length);
#ifndef HAVE_RRESVPORT_AF
static int rresvport_af(int *port, int family);
#endif /* !HAVE_RRESVPORT_AF */
@@ -393,8 +384,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
snmp_enabled = !value[0] || !_cups_strcasecmp(value, "on") ||
- _cups_strcasecmp(value, "yes") ||
- _cups_strcasecmp(value, "true");
+ !_cups_strcasecmp(value, "yes") ||
+ !_cups_strcasecmp(value, "true");
}
else if (!_cups_strcasecmp(name, "timeout"))
{
@@ -481,7 +472,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
_cupsLangPrintFilter(stderr, "INFO", _("Copying print data."));
if (bytes > 0)
- write(fd, buffer, bytes);
+ write(fd, buffer, (size_t)bytes);
backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0,
backendNetworkSideCB);
@@ -592,7 +583,7 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
{
va_list ap; /* Argument pointer */
char buf[1024]; /* Output buffer */
- int bytes; /* Number of bytes to output */
+ ssize_t bytes; /* Number of bytes to output */
char status; /* Status from command */
@@ -617,9 +608,9 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
* Send the command...
*/
- fprintf(stderr, "DEBUG: Sending command string (%d bytes)...\n", bytes);
+ fprintf(stderr, "DEBUG: Sending command string (" CUPS_LLFMT " bytes)...\n", CUPS_LLCAST bytes);
- if (lpd_write(fd, buf, bytes) < bytes)
+ if (lpd_write(fd, buf, (size_t)bytes) < bytes)
{
perror("DEBUG: Unable to send LPD command");
return (-1);
@@ -634,7 +625,7 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
if (recv(fd, &status, 1, 0) < 1)
{
_cupsLangPrintFilter(stderr, "WARNING", _("The printer did not respond."));
- status = errno;
+ status = (char)errno;
}
fprintf(stderr, "DEBUG: lpd_command returning %d\n", status);
@@ -680,7 +671,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
int have_supplies; /* Printer supports supply levels? */
int copy; /* Copies written */
time_t start_time; /* Time of first connect */
- size_t nbytes; /* Number of bytes written */
+ ssize_t nbytes; /* Number of bytes written */
off_t tbytes; /* Total bytes written */
char buffer[32768]; /* Output buffer */
#ifdef WIN32
@@ -707,7 +698,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
*/
fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n", hostname,
- _httpAddrPort(&(addrlist->addr)), printer);
+ httpAddrPort(&(addrlist->addr)), printer);
_cupsLangPrintFilter(stderr, "INFO", _("Connecting to printer."));
for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
@@ -782,7 +773,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
return (CUPS_BACKEND_FAILED);
}
- if (!connect(fd, &(addr->addr.addr), httpAddrLength(&(addr->addr))))
+ if (!connect(fd, &(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr))))
break;
error = errno;
@@ -846,7 +837,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
break;
}
- sleep(delay);
+ sleep((unsigned)delay);
if (delay < 30)
delay += 5;
@@ -889,7 +880,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
fprintf(stderr, "DEBUG: Connected to %s:%d (local port %d)...\n",
httpAddrString(&(addr->addr), addrname, sizeof(addrname)),
- _httpAddrPort(&(addr->addr)), lport);
+ httpAddrPort(&(addr->addr)), lport);
/*
* See if the printer supports SNMP...
@@ -967,7 +958,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
if (banner)
{
- snprintf(cptr, sizeof(control) - (cptr - control),
+ snprintf(cptr, sizeof(control) - (size_t)(cptr - control),
"C%.31s\n" /* RFC 1179, Section 7.2 - class name <= 31 chars */
"L%s\n",
localhost, user);
@@ -976,13 +967,13 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
while (copies > 0)
{
- snprintf(cptr, sizeof(control) - (cptr - control), "%cdfA%03d%.15s\n",
+ snprintf(cptr, sizeof(control) - (size_t)(cptr - control), "%cdfA%03d%.15s\n",
format, (int)getpid() % 1000, localhost);
cptr += strlen(cptr);
copies --;
}
- snprintf(cptr, sizeof(control) - (cptr - control),
+ snprintf(cptr, sizeof(control) - (size_t)(cptr - control),
"UdfA%03d%.15s\n"
"N%.131s\n", /* RFC 1179, Section 7.2 - sourcefile name <= 131 chars */
(int)getpid() % 1000, localhost, title);
@@ -1012,9 +1003,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
fprintf(stderr, "DEBUG: Sending control file (%u bytes)\n",
(unsigned)strlen(control));
- if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
+ if ((size_t)lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
{
- status = errno;
+ status = (char)errno;
perror("DEBUG: Unable to write control file");
}
@@ -1024,7 +1015,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
{
_cupsLangPrintFilter(stderr, "WARNING",
_("The printer did not respond."));
- status = errno;
+ status = (char)errno;
}
}
@@ -1074,7 +1065,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
_("Spooling job, %.0f%% complete."),
100.0 * tbytes / filestats.st_size);
- if (lpd_write(fd, buffer, nbytes) < nbytes)
+ if (lpd_write(fd, buffer, (size_t)nbytes) < nbytes)
{
perror("DEBUG: Unable to send print file to printer");
break;
@@ -1087,11 +1078,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
if (mode == MODE_STANDARD)
{
if (tbytes < filestats.st_size)
- status = errno;
+ status = (char)errno;
else if (lpd_write(fd, "", 1) < 1)
{
perror("DEBUG: Unable to send trailing nul to printer");
- status = errno;
+ status = (char)errno;
}
else
{
@@ -1145,9 +1136,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
fprintf(stderr, "DEBUG: Sending control file (%lu bytes)\n",
(unsigned long)strlen(control));
- if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
+ if ((size_t)lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
{
- status = errno;
+ status = (char)errno;
perror("DEBUG: Unable to write control file");
}
else
@@ -1156,7 +1147,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
{
_cupsLangPrintFilter(stderr, "WARNING",
_("The printer did not respond."));
- status = errno;
+ status = (char)errno;
}
}
@@ -1169,6 +1160,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
_("Control file sent successfully."));
}
+ fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
+
/*
* Collect the final supply levels as needed...
*/
@@ -1204,32 +1197,32 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
* 'lpd_write()' - Write a buffer of data to an LPD server.
*/
-static int /* O - Number of bytes written or -1 on error */
-lpd_write(int lpd_fd, /* I - LPD socket */
- char *buffer, /* I - Buffer to write */
- int length) /* I - Number of bytes to write */
+static ssize_t /* O - Number of bytes written or -1 on error */
+lpd_write(int lpd_fd, /* I - LPD socket */
+ char *buffer, /* I - Buffer to write */
+ size_t length) /* I - Number of bytes to write */
{
- int bytes, /* Number of bytes written */
- total; /* Total number of bytes written */
+ ssize_t bytes, /* Number of bytes written */
+ total; /* Total number of bytes written */
if (abort_job)
return (-1);
total = 0;
- while ((bytes = send(lpd_fd, buffer, length - total, 0)) >= 0)
+ while ((bytes = send(lpd_fd, buffer, length - (size_t)total, 0)) >= 0)
{
total += bytes;
buffer += bytes;
- if (total == length)
+ if ((size_t)total == length)
break;
}
if (bytes < 0)
return (-1);
else
- return (length);
+ return (total);
}
@@ -1276,7 +1269,7 @@ rresvport_af(int *port, /* IO - Port number to bind to */
* Try binding the port to the socket; return if all is OK...
*/
- if (!bind(fd, (struct sockaddr *)&addr, sizeof(addr)))
+ if (!bind(fd, (struct sockaddr *)&addr, httpAddrLength(&addr)))
return (fd);
/*
@@ -1285,11 +1278,7 @@ rresvport_af(int *port, /* IO - Port number to bind to */
if (errno != EADDRINUSE)
{
-# ifdef WIN32
- closesocket(fd);
-# else
- close(fd);
-# endif /* WIN32 */
+ httpAddrClose(NULL, fd);
return (-1);
}
@@ -1331,5 +1320,5 @@ sigterm_handler(int sig) /* I - Signal */
/*
- * End of "$Id: lpd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpd.c 12024 2014-07-15 12:58:39Z msweet $".
*/
diff --git a/backend/network.c b/backend/network.c
index e66f49b..2cf5f72 100644
--- a/backend/network.c
+++ b/backend/network.c
@@ -1,23 +1,18 @@
/*
- * "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: network.c 12124 2014-08-28 15:37:22Z msweet $"
*
- * Common backend network APIs for CUPS.
+ * Common backend network APIs for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * backendCheckSideChannel() - Check the side-channel for pending requests.
- * backendNetworkSideCB() - Handle common network side-channel commands.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -26,11 +21,7 @@
#include "backend-private.h"
#include <limits.h>
-#ifdef __hpux
-# include <sys/time.h>
-#else
-# include <sys/select.h>
-#endif /* __hpux */
+#include <sys/select.h>
/*
@@ -100,7 +91,7 @@ backendNetworkSideCB(
case CUPS_SC_CMD_GET_BIDI :
status = CUPS_SC_STATUS_OK;
- data[0] = use_bc;
+ data[0] = (char)use_bc;
datalen = 1;
break;
@@ -139,13 +130,13 @@ backendNetworkSideCB(
for (dataptr = data + strlen(data) + 1;
count > 0 && dataptr < (data + sizeof(data) - 1);
count --, dataptr += strlen(dataptr))
- strlcpy(dataptr, snmp_value, sizeof(data) - (dataptr - data));
+ strlcpy(dataptr, snmp_value, sizeof(data) - (size_t)(dataptr - data));
fprintf(stderr, "DEBUG: Returning %s %s\n", data,
data + strlen(data) + 1);
status = CUPS_SC_STATUS_OK;
- datalen = dataptr - data;
+ datalen = (int)(dataptr - data);
break;
}
@@ -168,7 +159,7 @@ backendNetworkSideCB(
{
if (_cupsSNMPRead(snmp_fd, &packet, 1.0))
{
- int i; /* Looping var */
+ size_t i; /* Looping var */
if (!_cupsSNMPOIDToString(packet.object_name, data, sizeof(data)))
@@ -183,35 +174,31 @@ backendNetworkSideCB(
switch (packet.object_type)
{
case CUPS_ASN1_BOOLEAN :
- snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
- packet.object_value.boolean);
+ snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d", packet.object_value.boolean);
datalen += (int)strlen(dataptr);
break;
case CUPS_ASN1_INTEGER :
- snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
+ snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d",
packet.object_value.integer);
datalen += (int)strlen(dataptr);
break;
case CUPS_ASN1_BIT_STRING :
case CUPS_ASN1_OCTET_STRING :
- if (packet.object_value.string.num_bytes < 0)
- i = 0;
- else if (packet.object_value.string.num_bytes <
- (sizeof(data) - (dataptr - data)))
+ if (packet.object_value.string.num_bytes < (sizeof(data) - (size_t)(dataptr - data)))
i = packet.object_value.string.num_bytes;
else
- i = (int)(sizeof(data) - (dataptr - data));
+ i = sizeof(data) - (size_t)(dataptr - data);
memcpy(dataptr, packet.object_value.string.bytes, i);
- datalen += i;
+ datalen += (int)i;
break;
case CUPS_ASN1_OID :
_cupsSNMPOIDToString(packet.object_value.oid, dataptr,
- sizeof(data) - (dataptr - data));
+ sizeof(data) - (size_t)(dataptr - data));
datalen += (int)strlen(dataptr);
break;
@@ -220,32 +207,27 @@ backendNetworkSideCB(
i < packet.object_value.string.num_bytes &&
dataptr < (data + sizeof(data) - 3);
i ++, dataptr += 2)
- sprintf(dataptr, "%02X",
- packet.object_value.string.bytes[i]);
+ sprintf(dataptr, "%02X", packet.object_value.string.bytes[i]);
datalen += (int)strlen(dataptr);
break;
case CUPS_ASN1_COUNTER :
- snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
- packet.object_value.counter);
+ snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.counter);
datalen += (int)strlen(dataptr);
break;
case CUPS_ASN1_GAUGE :
- snprintf(dataptr, sizeof(data) - (dataptr - data), "%u",
- packet.object_value.gauge);
+ snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.gauge);
datalen += (int)strlen(dataptr);
break;
case CUPS_ASN1_TIMETICKS :
- snprintf(dataptr, sizeof(data) - (dataptr - data), "%u",
- packet.object_value.timeticks);
+ snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.timeticks);
datalen += (int)strlen(dataptr);
break;
default :
- fprintf(stderr, "DEBUG: Unknown OID value type %02X!\n",
- packet.object_type);
+ fprintf(stderr, "DEBUG: Unknown OID value type %02X.\n", packet.object_type);
case CUPS_ASN1_NULL_VALUE :
dataptr[0] = '\0';
@@ -268,6 +250,12 @@ backendNetworkSideCB(
datalen = 0;
break;
+ case CUPS_SC_CMD_GET_CONNECTED :
+ status = CUPS_SC_STATUS_OK;
+ data[0] = device_fd != -1;
+ datalen = 1;
+ break;
+
case CUPS_SC_CMD_GET_DEVICE_ID :
if (snmp_fd >= 0)
{
@@ -305,12 +293,6 @@ backendNetworkSideCB(
break;
}
- case CUPS_SC_CMD_GET_CONNECTED :
- status = CUPS_SC_STATUS_OK;
- data[0] = device_fd != -1;
- datalen = 1;
- break;
-
default :
status = CUPS_SC_STATUS_NOT_IMPLEMENTED;
datalen = 0;
@@ -322,5 +304,5 @@ backendNetworkSideCB(
/*
- * End of "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: network.c 12124 2014-08-28 15:37:22Z msweet $".
*/
diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks
index 567d715..3eb98f6 100644
--- a/backend/org.cups.usb-quirks
+++ b/backend/org.cups.usb-quirks
@@ -5,6 +5,7 @@
# product ID (omit for all vendor products), and a list of known issues:
#
# blacklist The printer is not functional with the USB backend.
+# delay-close Delay close/reset of selected interface
# no-reattach Do no re-attach usblp kernel module after printing.
# soft-reset Do a soft reset after printing for cleanup.
# unidir Only supported unidirectional I/O
@@ -84,6 +85,9 @@
# Canon, Inc. MF4150 Printer, https://bugs.launchpad.net/bugs/1160638
0x04a9 0x26a3 no-reattach
+# Brother Industries, Ltd HL-1250 Laser Printer, https://bugs.debian.org/712512
+0x04f9 0x0007 no-reattach
+
# Brother Industries, Ltd HL-1430 Laser Printer, https://bugs.launchpad.net/bugs/1038695
0x04f9 0x001a no-reattach
@@ -212,3 +216,28 @@
# Lexmark E238 (<rdar://problem/14493054>)
0x043d 0x00d7 no-reattach
+
+# Lexmark E238 (STR #4448)
+0x043d 0x009a no-reattach
+
+# Canon MX310 (STR #4482)
+0x04a9 0x1728 unidir
+
+# Canon MX320 (STR #4482)
+0x04A9 0x1736 unidir
+
+# All Intermec devices (STR #4553)
+0x067e no-reattach
+
+# HP LaserJet 1150 (STR #4549)
+0x03f0 0x0f17 delay-close
+
+# HP LaserJet 1300 (STR #4549)
+0x03f0 0x1017 delay-close
+0x03f0 0x1117 delay-close
+
+# HP LaserJet 1320 (STR #4549)
+0x03f0 0x1d17 delay-close
+
+# Canon, Inc. MP530 Printer
+0x04a9 0x1712 unidir
diff --git a/backend/runloop.c b/backend/runloop.c
index 5a81a61..48b458a 100644
--- a/backend/runloop.c
+++ b/backend/runloop.c
@@ -1,25 +1,18 @@
/*
- * "$Id: runloop.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: runloop.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Common run loop APIs for CUPS backends.
+ * Common run loop APIs for CUPS backends.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * backendDrainOutput() - Drain pending print data to the device.
- * backendRunLoop() - Read and write print and back-channel data.
- * backendWaitLoop() - Wait for input from stdin while handling
- * side-channel queries.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -28,11 +21,7 @@
#include "backend-private.h"
#include <limits.h>
-#ifdef __hpux
-# include <sys/time.h>
-#else
-# include <sys/select.h>
-#endif /* __hpux */
+#include <sys/select.h>
/*
@@ -113,7 +102,7 @@ backendDrainOutput(int print_fd, /* I - Print file descriptor */
for (print_ptr = print_buffer; print_bytes > 0;)
{
- if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
+ if ((bytes = write(device_fd, print_ptr, (size_t)print_bytes)) < 0)
{
/*
* Write error - bail if we don't see an error we can retry...
@@ -293,7 +282,7 @@ backendRunLoop(
fprintf(stderr,
"DEBUG: Received " CUPS_LLFMT " bytes of back-channel data\n",
CUPS_LLCAST bc_bytes);
- cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0);
+ cupsBackChannelWrite(bc_buffer, (size_t)bc_bytes, 1.0);
}
else if (bc_bytes < 0 && errno != EAGAIN && errno != EINTR)
{
@@ -350,7 +339,7 @@ backendRunLoop(
if (print_bytes && FD_ISSET(device_fd, &output))
{
- if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
+ if ((bytes = write(device_fd, print_ptr, (size_t)print_bytes)) < 0)
{
/*
* Write error - bail if we don't see an error we can retry...
@@ -539,5 +528,5 @@ backendWaitLoop(
/*
- * End of "$Id: runloop.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: runloop.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/backend/snmp-supplies.c b/backend/snmp-supplies.c
index 41d4d75..38ef28e 100644
--- a/backend/snmp-supplies.c
+++ b/backend/snmp-supplies.c
@@ -1,24 +1,17 @@
/*
- * "$Id: snmp-supplies.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp-supplies.c 12227 2014-10-21 13:42:04Z msweet $"
*
- * SNMP supplies functions for CUPS.
+ * SNMP supplies functions for CUPS.
*
- * Copyright 2008-2013 by Apple Inc.
+ * Copyright 2008-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * backendSNMPSupplies() - Get the current supplies for a device.
- * backend_init_supplies() - Initialize the supplies list.
- * backend_walk_cb() - Interpret the supply value responses.
- * utf16_to_utf8() - Convert UTF-16 text to UTF-8.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -62,6 +55,7 @@ typedef struct /**** Printer supply data ****/
char name[CUPS_SNMP_MAX_STRING], /* Name of supply */
color[8]; /* Color: "#RRGGBB" or "none" */
int colorant, /* Colorant index */
+ sclass, /* Supply class */
type, /* Supply type */
max_capacity, /* Maximum capacity */
level; /* Current level value */
@@ -148,6 +142,13 @@ static const int prtMarkerSuppliesMaxCapacity[] =
(sizeof(prtMarkerSuppliesMaxCapacity) /
sizeof(prtMarkerSuppliesMaxCapacity[0]));
/* Offset to supply index */
+static const int prtMarkerSuppliesClass[] =
+ { CUPS_OID_prtMarkerSuppliesClass, -1 },
+ /* Class OID */
+ prtMarkerSuppliesClassOffset =
+ (sizeof(prtMarkerSuppliesClass) /
+ sizeof(prtMarkerSuppliesClass[0]));
+ /* Offset to supply index */
static const int prtMarkerSuppliesType[] =
{ CUPS_OID_prtMarkerSuppliesType, -1 },
/* Type OID */
@@ -257,6 +258,9 @@ backendSNMPSupplies(
else
percent = 50;
+ if (supplies[i].sclass == CUPS_TC_receptacleThatIsFilled)
+ percent = 100 - percent;
+
if (percent <= 5)
{
switch (supplies[i].type)
@@ -293,6 +297,7 @@ backendSNMPSupplies(
else
new_supply_state |= CUPS_OPC_NEAR_EOL;
break;
+#if 0 /* Because no two vendors report waste containers the same, disable SNMP reporting of same */
case CUPS_TC_wasteInk :
case CUPS_TC_wastePaper :
case CUPS_TC_wasteToner :
@@ -303,6 +308,7 @@ backendSNMPSupplies(
else
new_supply_state |= CUPS_WASTE_ALMOST_FULL;
break;
+#endif /* 0 */
case CUPS_TC_cleanerUnit :
case CUPS_TC_fuserCleaningPad :
if (percent <= 1)
@@ -318,9 +324,9 @@ backendSNMPSupplies(
if ((supplies[i].max_capacity > 0 || (quirks & CUPS_SNMP_CAPACITY)) &&
supplies[i].level >= 0)
- sprintf(ptr, "%d", percent);
+ snprintf(ptr, sizeof(value) - (size_t)(ptr - value), "%d", percent);
else
- strcpy(ptr, "-1");
+ strlcpy(ptr, "-1", sizeof(value) - (size_t)(ptr - value));
}
fprintf(stderr, "ATTR: marker-levels=%s\n", value);
@@ -458,34 +464,34 @@ backend_init_supplies(
"other",
"unknown",
"toner",
- "wasteToner",
+ "waste-toner",
"ink",
- "inkCartridge",
- "inkRibbon",
- "wasteInk",
+ "ink-cartridge",
+ "ink-ribbon",
+ "waste-ink",
"opc",
"developer",
- "fuserOil",
- "solidWax",
- "ribbonWax",
- "wasteWax",
+ "fuser-oil",
+ "solid-wax",
+ "ribbon-wax",
+ "waste-wax",
"fuser",
- "coronaWire",
- "fuserOilWick",
- "cleanerUnit",
- "fuserCleaningPad",
- "transferUnit",
- "tonerCartridge",
- "fuserOiler",
+ "corona-wire",
+ "fuser-oil-wick",
+ "cleaner-unit",
+ "fuser-cleaning-pad",
+ "transfer-unit",
+ "toner-cartridge",
+ "fuser-oiler",
"water",
- "wasteWater",
- "glueWaterAdditive",
- "wastePaper",
- "bindingSupply",
- "bandingSupply",
- "stitchingWire",
- "shrinkWrap",
- "paperWrap",
+ "waste-water",
+ "glue-water-additive",
+ "waste-paper",
+ "binding-supply",
+ "banding-supply",
+ "stitching-wire",
+ "shrink-wrap",
+ "paper-wrap",
"staples",
"inserts",
"covers"
@@ -561,20 +567,20 @@ backend_init_supplies(
/*
* Yes, read the cache file:
*
- * 2 num_supplies charset
+ * 3 num_supplies charset
* device description
* supply structures...
*/
if (cupsFileGets(cachefile, value, sizeof(value)))
{
- if (sscanf(value, "2 %d%d", &num_supplies, &charset) == 2 &&
+ if (sscanf(value, "3 %d%d", &num_supplies, &charset) == 2 &&
num_supplies <= CUPS_MAX_SUPPLIES &&
cupsFileGets(cachefile, value, sizeof(value)))
{
if (!strcmp(description, value))
cupsFileRead(cachefile, (char *)supplies,
- num_supplies * sizeof(backend_supplies_t));
+ (size_t)num_supplies * sizeof(backend_supplies_t));
else
{
num_supplies = -1;
@@ -664,12 +670,12 @@ backend_init_supplies(
if ((cachefile = cupsFileOpen(cachefilename, "w")) != NULL)
{
- cupsFilePrintf(cachefile, "2 %d %d\n", num_supplies, charset);
+ cupsFilePrintf(cachefile, "3 %d %d\n", num_supplies, charset);
cupsFilePrintf(cachefile, "%s\n", description);
if (num_supplies > 0)
cupsFileWrite(cachefile, (char *)supplies,
- num_supplies * sizeof(backend_supplies_t));
+ (size_t)num_supplies * sizeof(backend_supplies_t));
cupsFileClose(cachefile);
}
@@ -682,7 +688,7 @@ backend_init_supplies(
*/
for (i = 0; i < num_supplies; i ++)
- strcpy(supplies[i].color, "none");
+ strlcpy(supplies[i].color, "none", sizeof(supplies[i].color));
_cupsSNMPWalk(snmp_fd, &current_addr, CUPS_SNMP_VERSION_1,
_cupsSNMPDefaultCommunity(), prtMarkerColorantValue,
@@ -697,7 +703,7 @@ backend_init_supplies(
if (i)
*ptr++ = ',';
- strcpy(ptr, supplies[i].color);
+ strlcpy(ptr, supplies[i].color, sizeof(value) - (size_t)(ptr - value));
}
fprintf(stderr, "ATTR: marker-colors=%s\n", value);
@@ -745,9 +751,9 @@ backend_init_supplies(
type = supplies[i].type;
if (type < CUPS_TC_other || type > CUPS_TC_covers)
- strcpy(ptr, "unknown");
+ strlcpy(ptr, "unknown", sizeof(value) - (size_t)(ptr - value));
else
- strcpy(ptr, types[type - CUPS_TC_other]);
+ strlcpy(ptr, types[type - CUPS_TC_other], sizeof(value) - (size_t)(ptr - value));
}
fprintf(stderr, "ATTR: marker-types=%s\n", value);
@@ -814,7 +820,7 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */
if (!_cups_strcasecmp(colors[k][0],
(char *)packet->object_value.string.bytes))
{
- strcpy(supplies[j].color, colors[k][1]);
+ strlcpy(supplies[j].color, colors[k][1], sizeof(supplies[j].color));
break;
}
}
@@ -969,6 +975,25 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */
packet->object_value.integer > 0)
supplies[i - 1].max_capacity = packet->object_value.integer;
}
+ else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesClass))
+ {
+ /*
+ * Get marker class...
+ */
+
+ i = packet->object_name[prtMarkerSuppliesClassOffset];
+ if (i < 1 || i > CUPS_MAX_SUPPLIES ||
+ packet->object_type != CUPS_ASN1_INTEGER)
+ return;
+
+ fprintf(stderr, "DEBUG2: prtMarkerSuppliesClass.1.%d = %d\n", i,
+ packet->object_value.integer);
+
+ if (i > num_supplies)
+ num_supplies = i;
+
+ supplies[i - 1].sclass = packet->object_value.integer;
+ }
else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesType))
{
/*
@@ -1032,9 +1057,9 @@ utf16_to_utf8(
for (ptr = temp; srcsize >= 2;)
{
if (le)
- ch = src[0] | (src[1] << 8);
+ ch = (cups_utf32_t)(src[0] | (src[1] << 8));
else
- ch = (src[0] << 8) | src[1];
+ ch = (cups_utf32_t)((src[0] << 8) | src[1]);
src += 2;
srcsize -= 2;
@@ -1045,13 +1070,13 @@ utf16_to_utf8(
* Multi-word UTF-16 char...
*/
- int lch; /* Lower word */
+ cups_utf32_t lch; /* Lower word */
if (le)
- lch = src[0] | (src[1] << 8);
+ lch = (cups_utf32_t)(src[0] | (src[1] << 8));
else
- lch = (src[0] << 8) | src[1];
+ lch = (cups_utf32_t)((src[0] << 8) | src[1]);
if (lch >= 0xdc00 && lch <= 0xdfff)
{
@@ -1068,10 +1093,10 @@ utf16_to_utf8(
*ptr = '\0';
- cupsUTF32ToUTF8(dst, temp, dstsize);
+ cupsUTF32ToUTF8(dst, temp, (int)dstsize);
}
/*
- * End of "$Id: snmp-supplies.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp-supplies.c 12227 2014-10-21 13:42:04Z msweet $".
*/
diff --git a/backend/snmp.c b/backend/snmp.c
index 2262095..d2dd1e0 100644
--- a/backend/snmp.c
+++ b/backend/snmp.c
@@ -1,44 +1,18 @@
/*
- * "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * SNMP discovery backend for CUPS.
+ * SNMP discovery backend for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Discover printers via SNMP.
- * add_array() - Add a string to an array.
- * add_cache() - Add a cached device...
- * add_device_uri() - Add a device URI to the cache.
- * alarm_handler() - Handle alarm signals...
- * 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.
- * list_device() - List a device we found...
- * 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.
- * try_connect() - Try connecting on a port...
- * update_cache() - Update a cached device...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -532,17 +506,16 @@ fix_make_model(
make_model[0] = 'H';
make_model[1] = 'P';
make_model[2] = ' ';
- strlcpy(make_model + 3, mmptr, make_model_size - 3);
+ strlcpy(make_model + 3, mmptr, (size_t)make_model_size - 3);
}
else if (!_cups_strncasecmp(old_make_model, "deskjet", 7))
- snprintf(make_model, make_model_size, "HP DeskJet%s", old_make_model + 7);
+ snprintf(make_model, (size_t)make_model_size, "HP DeskJet%s", old_make_model + 7);
else if (!_cups_strncasecmp(old_make_model, "officejet", 9))
- snprintf(make_model, make_model_size, "HP OfficeJet%s", old_make_model + 9);
+ snprintf(make_model, (size_t)make_model_size, "HP OfficeJet%s", old_make_model + 9);
else if (!_cups_strncasecmp(old_make_model, "stylus_pro_", 11))
- snprintf(make_model, make_model_size, "EPSON Stylus Pro %s",
- old_make_model + 11);
+ snprintf(make_model, (size_t)make_model_size, "EPSON Stylus Pro %s", old_make_model + 11);
else
- strlcpy(make_model, old_make_model, make_model_size);
+ strlcpy(make_model, old_make_model, (size_t)make_model_size);
if ((mmptr = strstr(make_model, ", Inc.,")) != NULL)
{
@@ -753,7 +726,7 @@ probe_device(snmp_cache_t *device) /* I - Device */
* Insert hostname/address...
*/
- strlcpy(uriptr, device->addrname, sizeof(uri) - (uriptr - uri));
+ strlcpy(uriptr, device->addrname, sizeof(uri) - (size_t)(uriptr - uri));
uriptr += strlen(uriptr);
format += 2;
}
@@ -1233,7 +1206,7 @@ scan_devices(int ipv4, /* I - SNMP IPv4 socket */
for (addr = addrs; addr; addr = addr->next)
{
#ifdef AF_INET6
- if (_httpAddrFamily(&(addr->addr)) == AF_INET6)
+ if (httpAddrFamily(&(addr->addr)) == AF_INET6)
fd = ipv6;
else
#endif /* AF_INET6 */
@@ -1335,7 +1308,7 @@ try_connect(http_addr_t *addr, /* I - Socket address */
debug_printf("DEBUG: %.3f Trying %s://%s:%d...\n", run_time(),
port == 515 ? "lpd" : "socket", addrname, port);
- if ((fd = socket(_httpAddrFamily(addr), SOCK_STREAM, 0)) < 0)
+ if ((fd = socket(httpAddrFamily(addr), SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "ERROR: Unable to create socket: %s\n",
strerror(errno));
@@ -1346,7 +1319,7 @@ try_connect(http_addr_t *addr, /* I - Socket address */
alarm(1);
- status = connect(fd, (void *)addr, httpAddrLength(addr));
+ status = connect(fd, (void *)addr, (socklen_t)httpAddrLength(addr));
close(fd);
alarm(0);
@@ -1391,5 +1364,5 @@ update_cache(snmp_cache_t *device, /* I - Device */
/*
- * End of "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/backend/socket.c b/backend/socket.c
index 2ec83f2..11abd00 100644
--- a/backend/socket.c
+++ b/backend/socket.c
@@ -1,23 +1,18 @@
/*
- * "$Id: socket.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: socket.c 11907 2014-06-09 18:35:32Z msweet $"
*
- * AppSocket backend for CUPS.
+ * AppSocket backend for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Send a file to the printer or server.
- * wait_bc() - Wait for back-channel data...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -46,7 +41,7 @@
* Local functions...
*/
-static int wait_bc(int device_fd, int secs);
+static ssize_t wait_bc(int device_fd, int secs);
/*
@@ -73,10 +68,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
int print_fd; /* Print file */
int copies; /* Number of copies to print */
time_t start_time; /* Time of first connect */
-#ifdef __APPLE__
- time_t current_time, /* Current time */
- wait_time; /* Time to wait before shutting down socket */
-#endif /* __APPLE__ */
int contimeout; /* Connection timeout */
int waiteof; /* Wait for end-of-file? */
int port; /* Port number */
@@ -254,8 +245,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
snmp_enabled = !value[0] || !_cups_strcasecmp(value, "on") ||
- _cups_strcasecmp(value, "yes") ||
- _cups_strcasecmp(value, "true");
+ !_cups_strcasecmp(value, "yes") ||
+ !_cups_strcasecmp(value, "true");
}
else if (!_cups_strcasecmp(name, "contimeout"))
{
@@ -389,7 +380,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
break;
}
- sleep(delay);
+ sleep((unsigned)delay);
if (delay < 30)
delay += 5;
@@ -410,7 +401,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
fprintf(stderr, "DEBUG: Connected to %s:%d...\n",
httpAddrString(&(addr->addr), addrname, sizeof(addrname)),
- _httpAddrPort(&(addr->addr)));
+ httpAddrPort(&(addr->addr)));
/*
* Print everything...
@@ -419,7 +410,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
tbytes = 0;
if (bytes > 0)
- tbytes += write(device_fd, buffer, bytes);
+ tbytes += write(device_fd, buffer, (size_t)bytes);
while (copies > 0 && tbytes >= 0)
{
@@ -438,16 +429,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
_cupsLangPrintFilter(stderr, "INFO", _("Print file sent."));
}
-#ifdef __APPLE__
- /*
- * Wait up to 5 seconds to get any pending back-channel data...
- */
-
- wait_time = time(NULL) + 5;
- while (wait_time >= time(&current_time))
- if (wait_bc(device_fd, wait_time - current_time) <= 0)
- break;
-#endif /* __APPLE__ */
+ fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
if (waiteof)
{
@@ -494,7 +476,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* 'wait_bc()' - Wait for back-channel data...
*/
-static int /* O - # bytes read or -1 on error */
+static ssize_t /* O - # bytes read or -1 on error */
wait_bc(int device_fd, /* I - Socket */
int secs) /* I - Seconds to wait */
{
@@ -524,7 +506,7 @@ wait_bc(int device_fd, /* I - Socket */
{
fprintf(stderr, "DEBUG: Received %d bytes of back-channel data\n",
(int)bytes);
- cupsBackChannelWrite(buffer, bytes, 1.0);
+ cupsBackChannelWrite(buffer, (size_t)bytes, 1.0);
}
return (bytes);
@@ -535,5 +517,5 @@ wait_bc(int device_fd, /* I - Socket */
/*
- * End of "$Id: socket.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: socket.c 11907 2014-06-09 18:35:32Z msweet $".
*/
diff --git a/backend/test1284.c b/backend/test1284.c
index 18861fd..3a32391 100644
--- a/backend/test1284.c
+++ b/backend/test1284.c
@@ -1,5 +1,5 @@
/*
- * "$Id: test1284.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: test1284.c 10996 2013-05-29 11:51:34Z msweet $"
*
* IEEE-1284 support functions test program for CUPS.
*
@@ -80,5 +80,5 @@ main(int argc, /* I - Number of command-line args */
/*
- * End of "$Id: test1284.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: test1284.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/backend/testbackend.c b/backend/testbackend.c
index 065c27a..b1f27e4 100644
--- a/backend/testbackend.c
+++ b/backend/testbackend.c
@@ -1,25 +1,18 @@
/*
- * "$Id: testbackend.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testbackend.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * Backend test program for CUPS.
+ * Backend test program for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Run the named backend.
- * sigterm_handler() - Flag when we get SIGTERM.
- * usage() - Show usage information.
- * walk_cb() - Show results of cupsSideChannelSNMPWalk...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -97,7 +90,7 @@ main(int argc, /* I - Number of command-line args */
if (getcwd(libpath, sizeof(libpath)) &&
(ptr = strrchr(libpath, '/')) != NULL && !strcmp(ptr, "/backend"))
{
- strlcpy(ptr, "/cups", sizeof(libpath) - (ptr - libpath));
+ strlcpy(ptr, "/cups", sizeof(libpath) - (size_t)(ptr - libpath));
if (!access(libpath, 0))
{
#ifdef __APPLE__
@@ -311,7 +304,7 @@ main(int argc, /* I - Number of command-line args */
*/
if ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0)) > 0)
- write(2, buffer, bytes);
+ write(2, buffer, (size_t)bytes);
/*
* Throttle output to ~100hz...
@@ -339,7 +332,7 @@ main(int argc, /* I - Number of command-line args */
*/
while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 5.0)) > 0)
- write(2, buffer, bytes);
+ write(2, buffer, (size_t)bytes);
exit(0);
}
@@ -414,7 +407,7 @@ main(int argc, /* I - Number of command-line args */
while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer),
timeout)) > 0)
{
- write(2, buffer, bytes);
+ write(2, buffer, (size_t)bytes);
timeout = 5.0;
}
write(2, "\nDEBUG: END\n", 12);
@@ -667,10 +660,25 @@ walk_cb(const char *oid, /* I - OID */
int datalen, /* I - Length of data */
void *context) /* I - Context (unused) */
{
- printf("CUPS_SC_CMD_SNMP_WALK %s, %d bytes (%s)\n", oid, datalen, data);
+ char temp[80];
+
+ (void)context;
+
+ if ((size_t)datalen > (sizeof(temp) - 1))
+ {
+ memcpy(temp, data, sizeof(temp) - 1);
+ temp[sizeof(temp) - 1] = '\0';
+ }
+ else
+ {
+ memcpy(temp, data, (size_t)datalen);
+ temp[datalen] = '\0';
+ }
+
+ printf("CUPS_SC_CMD_SNMP_WALK %s, %d bytes (%s)\n", oid, datalen, temp);
}
/*
- * End of "$Id: testbackend.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testbackend.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/backend/testsupplies.c b/backend/testsupplies.c
index 0079ce3..0a300bc 100644
--- a/backend/testsupplies.c
+++ b/backend/testsupplies.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testsupplies.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testsupplies.c 3247 2011-05-12 06:22:31Z msweet $"
*
* SNMP supplies test program for CUPS.
*
@@ -79,5 +79,5 @@ main(int argc, /* I - Number of command-line args */
/*
- * End of "$Id: testsupplies.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testsupplies.c 3247 2011-05-12 06:22:31Z msweet $".
*/
diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c
index 6d7514d..285bccc 100644
--- a/backend/usb-darwin.c
+++ b/backend/usb-darwin.c
@@ -1,75 +1,46 @@
/*
-* "$Id: usb-darwin.c 11173 2013-07-23 12:31:34Z msweet $"
-*
-* Copyright 2005-2012 Apple Inc. All rights reserved.
-*
-* IMPORTANT: This Apple software is supplied to you by Apple Computer,
-* Inc. ("Apple") in consideration of your agreement to the following
-* terms, and your use, installation, modification or redistribution of
-* this Apple software constitutes acceptance of these terms. If you do
-* not agree with these terms, please do not use, install, modify or
-* redistribute this Apple software.
-*
-* In consideration of your agreement to abide by the following terms, and
-* subject to these terms, Apple grants you a personal, non-exclusive
-* license, under Apple's copyrights in this original Apple software (the
-* "Apple Software"), to use, reproduce, modify and redistribute the Apple
-* Software, with or without modifications, in source and/or binary forms;
-* provided that if you redistribute the Apple Software in its entirety and
-* without modifications, you must retain this notice and the following
-* text and disclaimers in all such redistributions of the Apple Software.
-* Neither the name, trademarks, service marks or logos of Apple Computer,
-* Inc. may be used to endorse or promote products derived from the Apple
-* Software without specific prior written permission from Apple. Except
-* as expressly stated in this notice, no other rights or licenses, express
-* or implied, are granted by Apple herein, including but not limited to
-* any patent rights that may be infringed by your derivative works or by
-* other works in which the Apple Software may be incorporated.
-*
-* The Apple Software is provided by Apple on an "AS IS" basis. APPLE
-* MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
-* THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
-* OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-*
-* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
-* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
-* MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
-* AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
-* STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.
-*
-* Contents:
-*
- * list_devices() - List all USB devices.
- * print_device() - Print a file to a USB device.
- * read_thread() - Thread to read the backchannel data on.
- * sidechannel_thread() - Handle side-channel requests.
- * iterate_printers() - Iterate over all the printers.
- * device_added() - Device added notifier.
- * list_device_cb() - list_device iterator callback.
- * find_device_cb() - print_device iterator callback.
- * status_timer_cb() - Status timer callback.
- * copy_deviceinfo() - Copy strings from the 1284 device ID.
- * release_deviceinfo() - Release deviceinfo strings.
- * load_classdriver() - Load a classdriver.
- * unload_classdriver() - Unload a classdriver.
- * load_printerdriver() - Load vendor's classdriver.
- * registry_open() - Open a connection to the printer.
- * registry_close() - Close the connection to the printer.
- * copy_deviceid() - Copy the 1284 device id string.
- * copy_devicestring() - Copy the 1284 device id string.
- * copy_value_for_key() - Copy value string associated with a key.
- * cfstr_create_trim() - Create CFString and trim whitespace characters.
- * parse_options() - Parse URI options.
- * sigterm_handler() - SIGTERM handler.
- * next_line() - Find the next line in a buffer.
- * parse_pserror() - Scan the backchannel data for postscript errors.
- * soft_reset() - Send a soft reset to the device.
- * get_device_id() - Return IEEE-1284 device ID.
-*/
+ * "$Id: usb-darwin.c 12928 2015-10-23 21:31:58Z msweet $"
+ *
+ * Copyright 2005-2015 Apple Inc. All rights reserved.
+ *
+ * IMPORTANT: This Apple software is supplied to you by Apple Computer,
+ * Inc. ("Apple") in consideration of your agreement to the following
+ * terms, and your use, installation, modification or redistribution of
+ * this Apple software constitutes acceptance of these terms. If you do
+ * not agree with these terms, please do not use, install, modify or
+ * redistribute this Apple software.
+ *
+ * In consideration of your agreement to abide by the following terms, and
+ * subject to these terms, Apple grants you a personal, non-exclusive
+ * license, under Apple's copyrights in this original Apple software (the
+ * "Apple Software"), to use, reproduce, modify and redistribute the Apple
+ * Software, with or without modifications, in source and/or binary forms;
+ * provided that if you redistribute the Apple Software in its entirety and
+ * without modifications, you must retain this notice and the following
+ * text and disclaimers in all such redistributions of the Apple Software.
+ * Neither the name, trademarks, service marks or logos of Apple Computer,
+ * Inc. may be used to endorse or promote products derived from the Apple
+ * Software without specific prior written permission from Apple. Except
+ * as expressly stated in this notice, no other rights or licenses, express
+ * or implied, are granted by Apple herein, including but not limited to
+ * any patent rights that may be infringed by your derivative works or by
+ * other works in which the Apple Software may be incorporated.
+ *
+ * The Apple Software is provided by Apple on an "AS IS" basis. APPLE
+ * MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
+ * THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
+ * OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+ *
+ * IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
+ * MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
+ * AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
+ * STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
/*
* Include necessary headers.
@@ -96,10 +67,15 @@
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/usb/IOUSBLib.h>
#include <IOKit/IOCFPlugIn.h>
-
+#include <libproc.h>
+#include <asl.h>
#include <spawn.h>
#include <pthread.h>
+/*
+ * Include necessary headers.
+ */
+
extern char **environ;
@@ -119,7 +95,7 @@ extern char **environ;
#define WAIT_SIDE_DELAY 3
#define DEFAULT_TIMEOUT 5000L
-#define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190)
+#define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID245)
#define kUSBLanguageEnglish 0x409
#define PRINTER_POLLING_INTERVAL 5 /* seconds */
@@ -134,6 +110,26 @@ extern char **environ;
#define kUSBGenericTOPrinterClassDriver CFSTR("/System/Library/Printers/Libraries/USBGenericPrintingClass.plugin")
#define kUSBPrinterClassDeviceNotOpen -9664 /*kPMInvalidIOMContext*/
+#define CRSetCrashLogMessage(m) _crc_make_setter(message, m)
+#define _crc_make_setter(attr, arg) (gCRAnnotations.attr = (uint64_t)(unsigned long)(arg))
+#define CRASH_REPORTER_CLIENT_HIDDEN __attribute__((visibility("hidden")))
+#define CRASHREPORTER_ANNOTATIONS_VERSION 4
+#define CRASHREPORTER_ANNOTATIONS_SECTION "__crash_info"
+
+struct crashreporter_annotations_t {
+ uint64_t version; // unsigned long
+ uint64_t message; // char *
+ uint64_t signature_string; // char *
+ uint64_t backtrace; // char *
+ uint64_t message2; // char *
+ uint64_t thread; // uint64_t
+ uint64_t dialog_mode; // unsigned int
+};
+
+CRASH_REPORTER_CLIENT_HIDDEN
+struct crashreporter_annotations_t gCRAnnotations
+ __attribute__((section("__DATA," CRASHREPORTER_ANNOTATIONS_SECTION)))
+ = { CRASHREPORTER_ANNOTATIONS_VERSION, 0, 0, 0, 0, 0, 0 };
/*
* Section 5.3 USB Printing Class spec
@@ -142,8 +138,9 @@ extern char **environ;
#define kUSBPrintingProtocolNoOpen 0
#define kUSBPrintingProtocolUnidirectional 1
#define kUSBPrintingProtocolBidirectional 2
+#define kUSBPrintingProtocolIPP 4
-typedef IOUSBInterfaceInterface190 **printer_interface_t;
+typedef IOUSBInterfaceInterface245 **printer_interface_t;
typedef struct iodevice_request_s /**** Device request ****/
{
@@ -179,7 +176,7 @@ typedef struct classdriver_s /**** g.classdriver context ****/
UInt16 vendorID; /* Vendor id */
UInt16 productID; /* Product id */
printer_interface_t interface; /* identify the device to IOKit */
- UInt8 outpipe; /* mandatory bulkOut pipe */
+ UInt8 outpipe; /* mandatory bulkOut pipe */
UInt8 inpipe; /* optional bulkIn pipe */
/* general class requests */
@@ -206,7 +203,7 @@ typedef struct classdriver_s /**** g.classdriver context ****/
} classdriver_t;
-typedef Boolean (*iterator_callback_t)(void *refcon, io_service_t obj);
+typedef Boolean (*iterator_callback_t)(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting);
typedef struct iterator_reference_s /**** Iterator reference data */
{
@@ -234,6 +231,7 @@ typedef struct globals_s
CFStringRef serial;
UInt32 location;
UInt8 interfaceNum;
+ UInt8 alternateSetting;
CFRunLoopTimerRef status_timer;
@@ -243,6 +241,7 @@ typedef struct globals_s
ssize_t debug_bytes; /* Current bytes to read */
#endif /* DEBUG_WRITES */
+ Boolean use_generic_class_driver;
Boolean wait_eof;
int drain_output; /* Drain all pending output */
int bidi_flag; /* 0=unidirectional, 1=bidirectional */
@@ -259,14 +258,16 @@ typedef struct globals_s
*/
globals_t g = { 0 }; /* Globals */
+int Iterating = 0; /* Are we iterating the bus? */
/*
* Local functions...
*/
-static Boolean find_device_cb(void *refcon, io_service_t obj);
-static Boolean list_device_cb(void *refcon, io_service_t obj);
+static Boolean find_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting);
+static Boolean list_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting);
+
static CFStringRef cfstr_create_trim(const char *cstr);
static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys);
static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t interface, classdriver_t ***printerDriver);
@@ -274,31 +275,40 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath);
static kern_return_t registry_close(void);
static kern_return_t registry_open(CFStringRef *driverBundlePath);
static kern_return_t unload_classdriver(classdriver_t ***classdriver);
-static OSStatus copy_deviceid(classdriver_t **printer, CFStringRef *deviceID);
+
static void *read_thread(void *reference);
static void *sidechannel_thread(void *reference);
-static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStringRef *model, CFStringRef *serial);
-static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, UInt32 *deviceLocation, UInt8 *interfaceNum);
static void device_added(void *userdata, io_iterator_t iterator);
static void get_device_id(cups_sc_status_t *status, char *data, int *datalen);
static void iterate_printers(iterator_callback_t callBack, void *userdata);
static void parse_options(char *options, char *serial, int serial_size, UInt32 *location, Boolean *wait_eof);
-static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial);
static void setup_cfLanguage(void);
static void soft_reset(void);
static void status_timer_cb(CFRunLoopTimerRef timer, void *info);
+static void log_usb_class_driver(int is_64bit);
+#define IS_64BIT 1
+#define IS_NOT_64BIT 0
#if defined(__i386__) || defined(__x86_64__)
static pid_t child_pid; /* Child PID */
-static void run_legacy_backend(int argc, char *argv[], int fd); /* Starts child backend process running as a ppc executable */
+static void run_legacy_backend(int argc, char *argv[], int fd) __attribute__((noreturn)); /* Starts child backend process running as a ppc executable */
#endif /* __i386__ || __x86_64__ */
static void sigterm_handler(int sig); /* SIGTERM handler */
+static void sigquit_handler(int sig, siginfo_t *si, void *unused) __attribute__((noreturn));
#ifdef PARSE_PS_ERRORS
static const char *next_line (const char *buffer);
static void parse_pserror (char *sockBuffer, int len);
#endif /* PARSE_PS_ERRORS */
+static printer_interface_t usb_printer_interface_interface(io_service_t usbClass);
+static IOUSBDeviceInterface **usb_device_interface_for_device(io_service_t usbDevice);
+static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer, UInt8 alternateSetting);
+static CFStringRef copy_printer_interface_indexed_description(printer_interface_t printer, UInt8 index, UInt16 language);
+static CFStringRef deviceIDCopyManufacturer(CFStringRef deviceID);
+static CFStringRef deviceIDCopyModel(CFStringRef deviceID);
+static CFStringRef deviceIDCopySerialNumber(CFStringRef deviceID);
+
#pragma mark -
/*
@@ -344,11 +354,21 @@ print_device(const char *uri, /* I - Device URI */
struct timeval *timeout, /* Timeout pointer */
tv; /* Time value */
struct timespec cond_timeout; /* pthread condition timeout */
+ struct sigaction action; /* Actions for POSIX signals */
(void)uri;
/*
+ * Catch SIGQUIT to determine who is sending it...
+ */
+
+ memset(&action, 0, sizeof(action));
+ action.sa_sigaction = sigquit_handler;
+ action.sa_flags = SA_SIGINFO;
+ sigaction(SIGQUIT, &action, NULL);
+
+ /*
* See if the side-channel descriptor is valid...
*/
@@ -444,6 +464,11 @@ print_device(const char *uri, /* I - Device URI */
return (CUPS_BACKEND_STOP);
}
+#ifdef __x86_64__
+ if (status == noErr && driverBundlePath != NULL && CFStringCompare(driverBundlePath, kUSBGenericTOPrinterClassDriver, 0) != kCFCompareEqualTo)
+ log_usb_class_driver(IS_64BIT);
+#endif /* __x86_64__ */
+
if (driverBundlePath)
CFRelease(driverBundlePath);
@@ -472,9 +497,6 @@ print_device(const char *uri, /* I - Device URI */
if (!print_fd)
{
- struct sigaction action; /* POSIX signal action */
-
-
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
@@ -679,12 +701,12 @@ print_device(const char *uri, /* I - Device URI */
if (g.print_bytes)
{
- bytes = g.print_bytes;
+ bytes = (UInt32)g.print_bytes;
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
/*
* Ignore timeout errors, but retain the number of bytes written to
- * avoid sending duplicate data (<rdar://problem/6254911>)...
+ * avoid sending duplicate data...
*/
if (iostatus == kIOUSBTransactionTimeout)
@@ -701,13 +723,13 @@ print_device(const char *uri, /* I - Device URI */
{
fputs("DEBUG: Got USB pipe stalled during write\n", stderr);
- bytes = g.print_bytes;
+ bytes = (UInt32)g.print_bytes;
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
}
/*
* Retry a write after an aborted write since we probably just got
- * SIGTERM (<rdar://problem/6860126>)...
+ * SIGTERM...
*/
else if (iostatus == kIOReturnAborted)
@@ -721,7 +743,7 @@ print_device(const char *uri, /* I - Device URI */
sleep(5);
#endif /* DEBUG_WRITES */
- bytes = g.print_bytes;
+ bytes = (UInt32)g.print_bytes;
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
}
@@ -760,6 +782,7 @@ print_device(const char *uri, /* I - Device URI */
}
fprintf(stderr, "DEBUG: Sent %lld bytes...\n", (off_t)total_bytes);
+ fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
/*
* Signal the side channel thread to exit...
@@ -935,6 +958,27 @@ static void *read_thread(void *reference)
} while (g.wait_eof || !g.read_thread_stop); /* Abort from main thread tests error here */
+ /* Workaround for usb race condition. <rdar://problem/21882551> */
+ if (!g.wait_eof && g.use_generic_class_driver)
+ {
+ const char *pdl = getenv("FINAL_CONTENT_TYPE");
+ if (pdl && strcmp(pdl, "application/vnd.cups-postscript") == 0)
+ {
+ while (readstatus == kIOReturnSuccess && ((rbytes > 0 && readbuffer[rbytes-1] != 0x4) || rbytes == 0))
+ {
+ start = mach_absolute_time();
+
+ rbytes = sizeof(readbuffer);
+ readstatus = (*g.classdriver)->ReadPipe(g.classdriver, readbuffer, &rbytes);
+ if (readstatus == kIOReturnSuccess && rbytes > 0 && readbuffer[rbytes-1] == 0x4)
+ break;
+
+ /* Make sure this loop executes no more than once every 250 miliseconds... */
+ mach_wait_until(start + delay);
+ }
+ }
+ }
+
/*
* Let the main thread know that we have completed the read thread...
*/
@@ -1008,7 +1052,7 @@ sidechannel_thread(void *reference)
fputs("DEBUG: CUPS_SC_CMD_GET_BIDI received from driver...\n",
stderr);
- data[0] = g.bidi_flag;
+ data[0] = (char)g.bidi_flag;
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
fprintf(stderr,
@@ -1024,7 +1068,7 @@ sidechannel_thread(void *reference)
get_device_id(&status, data, &datalen);
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, datalen, 1.0);
- if (datalen < sizeof(data))
+ if ((size_t)datalen < sizeof(data))
data[datalen] = '\0';
else
data[sizeof(data) - 1] = '\0';
@@ -1074,224 +1118,276 @@ sidechannel_thread(void *reference)
* 'iterate_printers()' - Iterate over all the printers.
*/
-static void iterate_printers(iterator_callback_t callBack,
- void *userdata)
+static void iterate_printers(iterator_callback_t callBack, void *userdata)
{
- mach_port_t masterPort = 0x0;
- kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort);
-
- if (kr == kIOReturnSuccess && masterPort != 0x0)
- {
- io_iterator_t addIterator = 0x0;
+ Iterating = 1;
- iterator_reference_t reference = { callBack, userdata, true };
- IONotificationPortRef addNotification = IONotificationPortCreate(masterPort);
+ mach_port_t masterPort = 0x0;
+ kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort);
- int klass = kUSBPrintingClass;
- int subklass = kUSBPrintingSubclass;
-
- CFNumberRef usb_klass = CFNumberCreate(NULL, kCFNumberIntType, &klass);
- CFNumberRef usb_subklass = CFNumberCreate(NULL, kCFNumberIntType, &subklass);
- CFMutableDictionaryRef usbPrinterMatchDictionary = IOServiceMatching(kIOUSBInterfaceClassName);
-
- CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceClass"), usb_klass);
- CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceSubClass"), usb_subklass);
-
- CFRelease(usb_klass);
- CFRelease(usb_subklass);
-
- kr = IOServiceAddMatchingNotification(addNotification, kIOMatchedNotification, usbPrinterMatchDictionary, &device_added, &reference, &addIterator);
- if (addIterator != 0x0)
+ if (kr == kIOReturnSuccess && masterPort != 0x0)
{
- device_added (&reference, addIterator);
-
- if (reference.keepRunning)
- {
- CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode);
- CFRunLoopRun();
- }
- IOObjectRelease(addIterator);
+ iterator_reference_t reference = { callBack, userdata, true };
+
+ IONotificationPortRef addNotification = IONotificationPortCreate(masterPort);
+ io_iterator_t addIterator = IO_OBJECT_NULL;
+
+ kr = IOServiceAddMatchingNotification(addNotification, kIOFirstMatchNotification, IOServiceMatching(kIOUSBDeviceClassName),
+ &device_added, &reference, &addIterator);
+ if (kr == kIOReturnSuccess && addIterator != IO_OBJECT_NULL)
+ {
+ device_added(&reference, addIterator);
+ if (reference.keepRunning)
+ {
+ CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode);
+ CFRunLoopRun();
+ }
+ IOObjectRelease(addIterator);
+ }
+ mach_port_deallocate(mach_task_self(), masterPort);
}
- mach_port_deallocate(mach_task_self(), masterPort);
- }
+
+ Iterating = 0;
}
/*
* 'device_added()' - Device added notifier.
*/
+#define IsPrintingInterface(c,s,p) ((c) == kUSBPrintingInterfaceClass && (s) == kUSBPrintingSubclass && (p) != kUSBPrintingProtocolIPP)
-static void device_added(void *userdata,
- io_iterator_t iterator)
+static void device_added(void *userdata, io_iterator_t iterator)
{
- iterator_reference_t *reference = userdata;
+ iterator_reference_t *reference = userdata;
+ io_service_t device;
- io_service_t obj;
- while (reference->keepRunning && (obj = IOIteratorNext(iterator)) != 0x0)
- {
- if (reference->callback != NULL)
- reference->keepRunning = reference->callback(reference->userdata, obj);
+ while (reference->keepRunning && (device = IOIteratorNext(iterator)) != 0x0)
+ {
+ UInt32 locationID = 0;
+ IOUSBDeviceInterface **devIntf = NULL;
+ io_iterator_t intfIterator = IO_OBJECT_NULL;
+ io_object_t intf = IO_OBJECT_NULL;
+
+ devIntf = usb_device_interface_for_device(device);
+ if (devIntf == NULL)
+ goto device_added_done;
+
+ UInt16 vendorUniqueID;
+ if ((*devIntf)->GetDeviceVendor(devIntf, &vendorUniqueID) != kIOReturnSuccess || vendorUniqueID == kAppleVendorID || vendorUniqueID == 0x0A5C)
+ goto device_added_done;
+
+ if ((*devIntf)->GetLocationID(devIntf, &locationID) != kIOReturnSuccess)
+ goto device_added_done;
+
+ IOUSBFindInterfaceRequest req = { kIOUSBFindInterfaceDontCare, kIOUSBFindInterfaceDontCare, kIOUSBFindInterfaceDontCare, kIOUSBFindInterfaceDontCare };
+ if ((*devIntf)->CreateInterfaceIterator(devIntf, &req, &intfIterator) != kIOReturnSuccess)
+ goto device_added_done;
+
+ while (reference->keepRunning && (intf = IOIteratorNext(intfIterator)))
+ {
+ printer_interface_t printerIntf = usb_printer_interface_interface(intf);
+ if (printerIntf != NULL)
+ {
+ UInt8 intfClass = 0, intfSubclass = 0, intfProtocol = 0, intfNumber = 0;
+
+ (*printerIntf)->GetInterfaceClass(printerIntf, &intfClass);
+ (*printerIntf)->GetInterfaceSubClass(printerIntf, &intfSubclass);
+ (*printerIntf)->GetInterfaceProtocol(printerIntf, &intfProtocol);
+ (*printerIntf)->GetInterfaceNumber(printerIntf, &intfNumber);
+
+ if (IsPrintingInterface(intfClass, intfSubclass, intfProtocol))
+ {
+ CFStringRef deviceIDString = copy_printer_interface_deviceid(printerIntf, 0);
+ if (deviceIDString != NULL)
+ {
+ reference->keepRunning = reference->callback(userdata, intf, deviceIDString, locationID, intfNumber, 0);
+ CFRelease(deviceIDString);
+ }
+ }
+
+ IOUSBInterfaceDescriptor *intfDesc = NULL;
+ while (reference->keepRunning && (intfDesc = (IOUSBInterfaceDescriptor *)(*printerIntf)->FindNextAssociatedDescriptor(printerIntf, intfDesc, kUSBInterfaceDesc)))
+ {
+ intfClass = intfDesc->bInterfaceClass;
+ intfSubclass = intfDesc->bInterfaceSubClass;
+ intfProtocol = intfDesc->bInterfaceProtocol;
+
+ if ((IsPrintingInterface(intfClass, intfSubclass, intfProtocol)))
+ {
+ CFStringRef deviceIDString = copy_printer_interface_deviceid(printerIntf, intfDesc->bAlternateSetting);
+ if (deviceIDString != NULL)
+ {
+ reference->keepRunning = reference->callback(userdata, intf, deviceIDString, locationID, intfNumber, intfDesc->bAlternateSetting);
+ CFRelease(deviceIDString);
+ }
+ }
+ }
+ (*printerIntf)->Release(printerIntf);
+ }
+ IOObjectRelease(intf);
+ }
- IOObjectRelease(obj);
- }
+ device_added_done:
+ if (devIntf != NULL) (*devIntf)->Release(devIntf);
+ if (intfIterator != IO_OBJECT_NULL) IOObjectRelease(intfIterator);
- /* One last call to the call back now that we are not longer have printers left to iterate...
- */
- if (reference->keepRunning)
- reference->keepRunning = reference->callback(reference->userdata, 0x0);
+ IOObjectRelease(device);
+ }
- if (!reference->keepRunning)
- CFRunLoopStop(CFRunLoopGetCurrent());
-}
+ /* One last call to the call back now that we are not longer have printers left to iterate...
+ */
+ if (reference->keepRunning && reference->callback)
+ reference->keepRunning = reference->callback(reference->userdata, IO_OBJECT_NULL, NULL, 0, 0, 0);
+ if (!reference->keepRunning)
+ CFRunLoopStop(CFRunLoopGetCurrent());
+}
/*
* 'list_device_cb()' - list_device iterator callback.
*/
-static Boolean list_device_cb(void *refcon,
- io_service_t obj)
+static Boolean list_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting)
{
- Boolean keepRunning = (obj != 0x0);
-
-
- (void)refcon;
+ (void)refcon;
+ (void)interfaceNum;
+ (void)alternateSetting;
- if (keepRunning)
- {
- CFStringRef deviceIDString = NULL;
- UInt32 deviceLocation = 0;
- UInt8 interfaceNum = 0;
-
- copy_devicestring(obj, &deviceIDString, &deviceLocation, &interfaceNum);
- if (deviceIDString != NULL)
+ if (obj != IO_OBJECT_NULL)
{
- CFStringRef make = NULL, model = NULL, serial = NULL;
- char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024];
- char optionsstr[1024], idstr[1024], make_modelstr[1024];
+ CFStringRef make = deviceIDCopyManufacturer(deviceIDString);
+ CFStringRef model = deviceIDCopyModel(deviceIDString);
+ CFStringRef serial = deviceIDCopySerialNumber(deviceIDString);
- copy_deviceinfo(deviceIDString, &make, &model, &serial);
- CFStringGetCString(deviceIDString, idstr, sizeof(idstr),
- kCFStringEncodingUTF8);
- backendGetMakeModel(idstr, make_modelstr, sizeof(make_modelstr));
+ char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024];
+ char optionsstr[1024], idstr[1024], make_modelstr[1024];
- modelstr[0] = '/';
+ CFStringGetCString(deviceIDString, idstr, sizeof(idstr), kCFStringEncodingUTF8);
+ backendGetMakeModel(idstr, make_modelstr, sizeof(make_modelstr));
- if (!make ||
- !CFStringGetCString(make, makestr, sizeof(makestr),
- kCFStringEncodingUTF8))
- strcpy(makestr, "Unknown");
+ modelstr[0] = '/';
- if (!model ||
- !CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1,
- kCFStringEncodingUTF8))
- strcpy(modelstr + 1, "Printer");
+ if (make == NULL || !CFStringGetCString(make, makestr, sizeof(makestr), kCFStringEncodingUTF8))
+ strlcpy(makestr, "Unknown", sizeof(makestr));
- optionsstr[0] = '\0';
- if (serial != NULL)
- {
- CFStringGetCString(serial, serialstr, sizeof(serialstr), kCFStringEncodingUTF8);
- snprintf(optionsstr, sizeof(optionsstr), "?serial=%s", serialstr);
- }
- else if (deviceLocation != 0)
- snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation);
+ if (model == NULL || !CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1, kCFStringEncodingUTF8))
+ strlcpy(modelstr + 1, "Printer", sizeof(modelstr) - 1);
- httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr);
- strlcat(uristr, optionsstr, sizeof(uristr));
+ optionsstr[0] = '\0';
+ if (serial != NULL && CFStringGetCString(serial, serialstr, sizeof(serialstr), kCFStringEncodingUTF8))
+ snprintf(optionsstr, sizeof(optionsstr), "?serial=%s", serialstr);
+ else if (deviceLocation != 0)
+ snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation);
- cupsBackendReport("direct", uristr, make_modelstr, make_modelstr, idstr,
- NULL);
+ httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr);
+ strlcat(uristr, optionsstr, sizeof(uristr));
- release_deviceinfo(&make, &model, &serial);
- CFRelease(deviceIDString);
+ cupsBackendReport("direct", uristr, make_modelstr, make_modelstr, idstr,
+ NULL);
+
+ if (make != NULL) CFRelease(make);
+ if (model != NULL) CFRelease(model);
+ if (serial != NULL) CFRelease(serial);
}
- }
- return keepRunning;
+ return obj != IO_OBJECT_NULL;
}
-
/*
* 'find_device_cb()' - print_device iterator callback.
*/
-
-static Boolean find_device_cb(void *refcon,
- io_service_t obj)
+static Boolean find_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting)
{
- Boolean keepLooking = true;
+ Boolean keepLooking = true;
- if (obj != 0x0)
- {
- CFStringRef idString = NULL;
- UInt32 location = -1;
- UInt8 interfaceNum = 0;
-
- copy_devicestring(obj, &idString, &location, &interfaceNum);
- if (idString != NULL)
+ if (obj != IO_OBJECT_NULL)
{
- CFStringRef make = NULL, model = NULL, serial = NULL;
-
- copy_deviceinfo(idString, &make, &model, &serial);
- if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
- {
- if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
- {
- if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
- {
- if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
- {
- IOObjectRetain(obj);
- g.printer_obj = obj;
- keepLooking = false;
- }
- }
- else
- {
- if (g.printer_obj != 0)
- IOObjectRelease(g.printer_obj);
-
- g.printer_obj = obj;
- IOObjectRetain(obj);
-
- if (g.location == 0 || g.location == location)
- keepLooking = false;
- }
- if ( !keepLooking )
- g.interfaceNum = interfaceNum;
- }
- }
+ CFStringRef make = deviceIDCopyManufacturer(deviceIDString);
+ CFStringRef model = deviceIDCopyModel(deviceIDString);
+ CFStringRef serial = deviceIDCopySerialNumber(deviceIDString);
+
+ if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+ {
+ if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+ {
+ if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
+ {
+ if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+ {
+ IOObjectRetain(obj);
+ g.printer_obj = obj;
+ g.location = deviceLocation;
+ g.alternateSetting = alternateSetting;
+ keepLooking = false;
+ }
+ }
+ else
+ {
+ if (g.printer_obj != 0)
+ IOObjectRelease(g.printer_obj);
+
+ g.alternateSetting = alternateSetting;
+ g.printer_obj = obj;
+ IOObjectRetain(obj);
+
+ if (g.location == 0 || g.location == deviceLocation)
+ keepLooking = false;
+ }
+
+ if ( !keepLooking )
+ g.interfaceNum = interfaceNum;
+ }
+ }
- release_deviceinfo(&make, &model, &serial);
- CFRelease(idString);
+ if (make) CFRelease(make);
+ if (model) CFRelease(model);
+ if (serial) CFRelease(serial);
}
- }
- else
- {
- keepLooking = (g.printer_obj == 0);
- if (obj == 0x0 && keepLooking)
+ else
{
- CFRunLoopTimerContext context = { 0, refcon, NULL, NULL, NULL };
- CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, status_timer_cb, &context);
- if (timer != NULL)
- {
- CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
- g.status_timer = timer;
- }
+ keepLooking = (g.printer_obj == 0);
+ if (obj == IO_OBJECT_NULL && keepLooking)
+ {
+ CFRunLoopTimerContext context = { 0, refcon, NULL, NULL, NULL };
+ CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, status_timer_cb, &context);
+ if (timer != NULL)
+ {
+ CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
+ g.status_timer = timer;
+ }
+ }
}
- }
- if (!keepLooking && g.status_timer != NULL)
- {
- fputs("STATE: -offline-report\n", stderr);
- _cupsLangPrintFilter(stderr, "INFO", _("The printer is now online."));
- CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode);
- CFRelease(g.status_timer);
- g.status_timer = NULL;
- }
+ if (!keepLooking && g.status_timer != NULL)
+ {
+ fputs("STATE: -offline-report\n", stderr);
+ _cupsLangPrintFilter(stderr, "INFO", _("The printer is now online."));
+ CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode);
+ CFRelease(g.status_timer);
+ g.status_timer = NULL;
+ }
- return keepLooking;
+ return keepLooking;
}
+static CFStringRef deviceIDCopySerialNumber(CFStringRef deviceID)
+{
+ CFStringRef serialKeys[] = { CFSTR("SN:"), CFSTR("SERN:"), NULL };
+
+ return copy_value_for_key(deviceID, serialKeys);
+}
+
+static CFStringRef deviceIDCopyModel(CFStringRef deviceID)
+{
+ CFStringRef modelKeys[] = { CFSTR("MDL:"), CFSTR("MODEL:"), NULL };
+ return copy_value_for_key(deviceID, modelKeys);
+}
+
+static CFStringRef deviceIDCopyManufacturer(CFStringRef deviceID)
+{
+ CFStringRef makeKeys[] = { CFSTR("MFG:"), CFSTR("MANUFACTURER:"), NULL };
+ return copy_value_for_key(deviceID, makeKeys);
+}
/*
* 'status_timer_cb()' - Status timer callback.
@@ -1326,59 +1422,6 @@ static void status_timer_cb(CFRunLoopTimerRef timer,
#pragma mark -
/*
- * 'copy_deviceinfo()' - Copy strings from the 1284 device ID.
- */
-
-static void copy_deviceinfo(CFStringRef deviceIDString,
- CFStringRef *make,
- CFStringRef *model,
- CFStringRef *serial)
-{
- CFStringRef modelKeys[] = { CFSTR("MDL:"), CFSTR("MODEL:"), NULL };
- CFStringRef makeKeys[] = { CFSTR("MFG:"), CFSTR("MANUFACTURER:"), NULL };
- CFStringRef serialKeys[] = { CFSTR("SN:"), CFSTR("SERN:"), NULL };
-
- if (make != NULL)
- *make = copy_value_for_key(deviceIDString, makeKeys);
-
- if (model != NULL)
- *model = copy_value_for_key(deviceIDString, modelKeys);
-
- if (serial != NULL)
- *serial = copy_value_for_key(deviceIDString, serialKeys);
-}
-
-
-/*
- * 'release_deviceinfo()' - Release deviceinfo strings.
- */
-
-static void release_deviceinfo(CFStringRef *make,
- CFStringRef *model,
- CFStringRef *serial)
-{
- if (make != NULL && *make != NULL)
- {
- CFRelease(*make);
- *make = NULL;
- }
-
- if (model != NULL && *model != NULL)
- {
- CFRelease(*model);
- *model = NULL;
- }
-
- if (serial != NULL && *serial != NULL)
- {
- CFRelease(*serial);
- *serial = NULL;
- }
-}
-
-
-#pragma mark -
-/*
* 'load_classdriver()' - Load a classdriver.
*/
@@ -1402,7 +1445,7 @@ static kern_return_t load_classdriver(CFStringRef driverPath,
_cups_fc_result_t result = _cupsFileCheck(bundlestr,
_CUPS_FILE_CHECK_DIRECTORY, 1,
- _cupsFileCheckFilter, NULL);
+ Iterating ? NULL : _cupsFileCheckFilter, NULL);
if (result && driverPath)
return (load_classdriver(NULL, interface, printerDriver));
@@ -1498,6 +1541,7 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath)
{
*driverBundlePath = IORegistryEntryCreateCFProperty(g.printer_obj, kUSBClassDriverProperty, NULL, kNilOptions);
+ g.use_generic_class_driver = (*driverBundlePath == NULL || (CFStringCompare(*driverBundlePath, kUSBGenericTOPrinterClassDriver, 0x0) == kCFCompareEqualTo));
kr = load_classdriver(*driverBundlePath, interface, &g.classdriver);
if (kr != kIOReturnSuccess)
@@ -1508,6 +1552,301 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath)
return kr;
}
+static printer_interface_t usb_printer_interface_interface(io_service_t usbClass)
+{
+ printer_interface_t intf = NULL;
+ IOCFPlugInInterface **plugin = NULL;
+ SInt32 score;
+ int kr = IOCreatePlugInInterfaceForService(usbClass, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score);
+ if (kr == kIOReturnSuccess)
+ {
+ (*plugin)->QueryInterface(plugin, USB_INTERFACE_KIND, (LPVOID *)&intf);
+ IODestroyPlugInInterface(plugin);
+ }
+
+ return intf;
+}
+
+static IOUSBDeviceInterface **usb_device_interface_for_device(io_service_t usbDevice)
+{
+ IOUSBDeviceInterface ** intf = NULL;
+ IOCFPlugInInterface **plugin = NULL;
+ SInt32 score;
+
+ int kr = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score);
+ if (kr == kIOReturnSuccess)
+ {
+ (*plugin)->QueryInterface(plugin, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID *)&intf);
+ IODestroyPlugInInterface(plugin);
+ }
+
+ return intf;
+}
+
+
+static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer, UInt8 alternateSetting)
+{
+ // I have tried to make this function as neat as I can, but the possibility of needing to resend
+ // a request to get the entire string makes it hideous...
+ //
+ // We package the job of sending a request up into the block (^sendRequest), which takes the size
+ // it should allocate for the message buffer. It frees the current buffer if one is set and
+ // allocates one of the specified size, then performs the request. We can then easily retry by
+ // calling the block again if we fail to get the whole string the first time around.
+
+ #define kUSBPrintClassGetDeviceID 0
+ #define kDefaultNoDataTimeout 5000L
+ #define pack_device_id_wIndex(intf, alt) ((UInt16)((((UInt16)(intf)) << 8) | ((UInt8)(alt))))
+
+ if (printer == NULL)
+ return NULL;
+
+
+ IOReturn err = kIOReturnError;
+ UInt8 configurationIndex = 0;
+ UInt8 interfaceNumber = 0;
+ size_t bufferLength = 256;
+ CFStringRef ret = NULL;
+
+ if ((*printer)->GetConfigurationValue( printer, &configurationIndex) == kIOReturnSuccess &&
+ (*printer)->GetInterfaceNumber( printer, &interfaceNumber) == kIOReturnSuccess)
+ {
+ __block IOUSBDevRequestTO request;
+ IOReturn (^sendRequest)(size_t) = ^ (size_t size)
+ {
+ if (request.pData)
+ {
+ free(request.pData);
+ request.wLength = 0;
+ request.pData = NULL;
+ }
+
+ IOReturn berr = kIOReturnError;
+ char *buffer = malloc(size);
+ if (buffer == NULL)
+ return kIOReturnNoMemory;
+
+ request.wLength = HostToUSBWord(size);
+ request.pData = buffer;
+ berr = (*printer)->ControlRequestTO(printer, (UInt8)0, &request);
+ return berr;
+ };
+
+ /* This request takes the 0 based configuration index. IOKit returns a 1 based configuration index */
+ configurationIndex -= 1;
+
+ bzero(&request, sizeof(request));
+
+ request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBClass, kUSBInterface);
+ request.bRequest = kUSBPrintClassGetDeviceID;
+ request.wValue = HostToUSBWord(configurationIndex);
+ request.wIndex = HostToUSBWord(pack_device_id_wIndex(interfaceNumber, alternateSetting));
+ request.noDataTimeout = kDefaultNoDataTimeout;
+ request.completionTimeout = 0; // Copying behavior from Generic Class Driver
+
+ err = sendRequest(bufferLength);
+
+ if (err == kIOReturnSuccess && request.wLenDone > 1)
+ {
+ UInt16 actualLength = OSSwapBigToHostInt16(*((UInt16 *)request.pData));
+
+ if (actualLength > 2 && actualLength <= bufferLength - 2)
+ {
+ ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false);
+ }
+ else if (actualLength > 2) {
+ err = sendRequest(actualLength);
+ if (err == kIOReturnSuccess && request.wLenDone > 0)
+ {
+ actualLength = OSSwapBigToHostInt16(*((UInt16 *)request.pData));
+ ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false);
+ }
+ }
+ }
+
+ if (request.pData)
+ free(request.pData);
+ }
+
+ CFStringRef manufacturer = deviceIDCopyManufacturer(ret);
+ CFStringRef model = deviceIDCopyModel(ret);
+ CFStringRef serial = deviceIDCopySerialNumber(ret);
+
+ if (manufacturer == NULL || serial == NULL || model == NULL)
+ {
+ IOUSBDevRequestTO request;
+ IOUSBDeviceDescriptor desc;
+
+ bzero(&request, sizeof(request));
+
+ request.bmRequestType = USBmakebmRequestType( kUSBIn, kUSBStandard, kUSBDevice );
+ request.bRequest = kUSBRqGetDescriptor;
+ request.wValue = kUSBDeviceDesc << 8;
+ request.wIndex = 0;
+ request.wLength = sizeof(desc);
+ request.pData = &desc;
+ request.completionTimeout = 0;
+ request.noDataTimeout = 60L;
+
+ err = (*printer)->ControlRequestTO(printer, 0, &request);
+ if (err == kIOReturnSuccess)
+ {
+ CFMutableStringRef extras = CFStringCreateMutable(NULL, 0);
+ if (manufacturer == NULL)
+ {
+ manufacturer = copy_printer_interface_indexed_description(printer, desc.iManufacturer, kUSBLanguageEnglish);
+ if (manufacturer && CFStringGetLength(manufacturer) > 0)
+ CFStringAppendFormat(extras, NULL, CFSTR("MFG:%@;"), manufacturer);
+ }
+
+ if (model == NULL)
+ {
+ model = copy_printer_interface_indexed_description(printer, desc.iProduct, kUSBLanguageEnglish);
+ if (model && CFStringGetLength(model) > 0)
+ CFStringAppendFormat(extras, NULL, CFSTR("MDL:%@;"), model);
+ }
+
+ if (serial == NULL && desc.iSerialNumber != 0)
+ {
+ serial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish);
+ if (serial && CFStringGetLength(serial) > 0)
+ CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), serial);
+ }
+
+ if (ret != NULL)
+ {
+ CFStringAppend(extras, ret);
+ CFRelease(ret);
+
+ ret = extras;
+ }
+ else
+ {
+ ret = extras;
+ }
+ }
+ }
+
+ if (ret != NULL)
+ {
+ /* Remove special characters from the serial number */
+ CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0));
+ if (range.length == 1)
+ {
+ range = CFStringFind(ret, serial, 0);
+
+ CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
+ CFRelease(ret);
+
+ ret = deviceIDString;
+ CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0);
+ }
+ }
+
+ if (manufacturer != NULL)
+ CFRelease(manufacturer);
+
+ if (model != NULL)
+ CFRelease(model);
+
+ if (serial != NULL)
+ CFRelease(serial);
+
+ if (ret != NULL && CFStringGetLength(ret) == 0)
+ {
+ CFRelease(ret);
+ return NULL;
+ }
+
+ return ret;
+}
+
+static CFStringRef copy_printer_interface_indexed_description(printer_interface_t printer, UInt8 index, UInt16 language)
+{
+ IOReturn err;
+ UInt8 description[256]; // Max possible descriptor length
+ IOUSBDevRequestTO request;
+
+ bzero(description, 2);
+
+ request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
+ request.bRequest = kUSBRqGetDescriptor;
+ request.wValue = (kUSBStringDesc << 8) | index;
+ request.wIndex = language;
+ request.wLength = 2;
+ request.pData = &description;
+ request.completionTimeout = 0;
+ request.noDataTimeout = 60L;
+
+ err = (*printer)->ControlRequestTO(printer, 0, &request);
+ if (err != kIOReturnSuccess && err != kIOReturnOverrun)
+ {
+ bzero(description, request.wLength);
+
+ // Let's try again full length. Here's why:
+ // On USB 2.0 controllers, we will not get an overrun error. We just get a "babble" error
+ // and no valid data. So, if we ask for the max size, we will either get it, or we'll get an underrun.
+ // It looks like we get it w/out an underrun
+
+ request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
+ request.bRequest = kUSBRqGetDescriptor;
+ request.wValue = (kUSBStringDesc << 8) | index;
+ request.wIndex = language;
+ request.wLength = sizeof description;
+ request.pData = &description;
+ request.completionTimeout = 0;
+ request.noDataTimeout = 60L;
+
+ err = (*printer)->ControlRequestTO(printer, 0, &request);
+ if (err != kIOReturnSuccess && err != kIOReturnUnderrun)
+ return NULL;
+ }
+
+ unsigned int length = description[0];
+ if (length == 0)
+ return CFStringCreateWithCString(NULL, "", kCFStringEncodingUTF8);
+
+ if (description[1] != kUSBStringDesc)
+ return NULL;
+
+ request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
+ request.bRequest = kUSBRqGetDescriptor;
+ request.wValue = (kUSBStringDesc << 8) | index;
+ request.wIndex = language;
+
+ bzero(description, length);
+ request.wLength = (UInt16)length;
+ request.pData = &description;
+ request.completionTimeout = 0;
+ request.noDataTimeout = 60L;
+
+ err = (*printer)->ControlRequestTO(printer, 0, &request);
+ if (err != kIOReturnSuccess)
+ return NULL;
+
+ if (description[1] != kUSBStringDesc)
+ return NULL;
+
+ if ((description[0] & 1) != 0)
+ description[0] &= 0xfe;
+
+ char buffer[258] = {};
+ unsigned int maxLength = sizeof buffer;
+ if (description[0] > 1)
+ {
+ length = (description[0]-2)/2;
+
+ if (length > maxLength - 1)
+ length = maxLength -1;
+
+ for (unsigned i = 0; i < length; i++)
+ buffer[i] = (char) description[2*i+2];
+
+ buffer[length] = 0;
+ }
+
+ return CFStringCreateWithCString(NULL, buffer, kCFStringEncodingUTF8);
+}
/*
* 'registry_open()' - Open a connection to the printer.
@@ -1561,144 +1900,6 @@ static kern_return_t registry_close(void)
return kIOReturnSuccess;
}
-
-/*
- * 'copy_deviceid()' - Copy the 1284 device id string.
- */
-
-static OSStatus copy_deviceid(classdriver_t **classdriver,
- CFStringRef *deviceID)
-{
- CFStringRef devID = NULL,
-
- deviceMake = NULL,
- deviceModel = NULL,
- deviceSerial = NULL;
-
- OSStatus err = (*classdriver)->GetDeviceID(classdriver, &devID, DEFAULT_TIMEOUT);
-
- copy_deviceinfo(devID, &deviceMake, &deviceModel, &deviceSerial);
-
- if (deviceMake == NULL || deviceModel == NULL || deviceSerial == NULL)
- {
- IOUSBDeviceDescriptor desc;
- iodevice_request_t request;
-
- request.requestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
- request.request = kUSBRqGetDescriptor;
- request.value = (kUSBDeviceDesc << 8) | 0;
- request.index = 0;
- request.length = sizeof(desc);
- request.buffer = &desc;
- err = (*classdriver)->DeviceRequest(classdriver, &request, DEFAULT_TIMEOUT);
- if (err == kIOReturnSuccess)
- {
- CFMutableStringRef newDevID = CFStringCreateMutable(NULL, 0);
-
- if (deviceMake == NULL)
- {
- CFStringRef data = NULL;
- err = (*classdriver)->GetString(classdriver, desc.iManufacturer, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data);
- if (data != NULL)
- {
- CFStringAppendFormat(newDevID, NULL, CFSTR("MFG:%@;"), data);
- CFRelease(data);
- }
- }
-
- if (deviceModel == NULL)
- {
- CFStringRef data = NULL;
- err = (*classdriver)->GetString(classdriver, desc.iProduct, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data);
- if (data != NULL)
- {
- CFStringAppendFormat(newDevID, NULL, CFSTR("MDL:%@;"), data);
- CFRelease(data);
- }
- }
-
- if (deviceSerial == NULL && desc.iSerialNumber != 0)
- {
- CFStringRef data = NULL;
- err = (*classdriver)->GetString(classdriver, desc.iSerialNumber, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data);
- if (data != NULL)
- {
- CFStringAppendFormat(newDevID, NULL, CFSTR("SERN:%@;"), data);
- CFRelease(data);
- }
- }
-
- if (devID != NULL)
- {
- CFStringAppend(newDevID, devID);
- CFRelease(devID);
- }
-
- *deviceID = newDevID;
- }
- }
- else
- {
- *deviceID = devID;
- }
- release_deviceinfo(&deviceMake, &deviceModel, &deviceSerial);
-
- return err;
-}
-
-
-/*
- * 'copy_devicestring()' - Copy the 1284 device id string.
- */
-
-static void copy_devicestring(io_service_t usbInterface,
- CFStringRef *deviceID,
- UInt32 *deviceLocation,
- UInt8 *interfaceNumber )
-{
- IOCFPlugInInterface **iodev = NULL;
- SInt32 score;
- kern_return_t kr;
- printer_interface_t interface;
- HRESULT res;
- classdriver_t **klassDriver = NULL;
- CFStringRef driverBundlePath;
-
- if ((kr = IOCreatePlugInInterfaceForService(usbInterface,
- kIOUSBInterfaceUserClientTypeID,
- kIOCFPlugInInterfaceID,
- &iodev, &score)) == kIOReturnSuccess)
- {
- if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *)
- &interface)) == noErr)
- {
- (*interface)->GetLocationID(interface, deviceLocation);
- (*interface)->GetInterfaceNumber(interface, interfaceNumber);
-
- driverBundlePath = IORegistryEntryCreateCFProperty(usbInterface,
- kUSBClassDriverProperty,
- NULL, kNilOptions);
-
- kr = load_classdriver(driverBundlePath, interface, &klassDriver);
-
- if (kr != kIOReturnSuccess && driverBundlePath != NULL)
- kr = load_classdriver(NULL, interface, &klassDriver);
-
- if (kr == kIOReturnSuccess && klassDriver != NULL)
- kr = copy_deviceid(klassDriver, deviceID);
-
- unload_classdriver(&klassDriver);
-
- if (driverBundlePath != NULL)
- CFRelease(driverBundlePath);
-
- /* (*interface)->Release(interface); */
- }
- IODestroyPlugInInterface(iodev);
- }
-}
-
-
#pragma mark -
/*
* 'copy_value_for_key()' - Copy value string associated with a key.
@@ -1849,7 +2050,7 @@ static void parse_options(char *options,
else if (!_cups_strcasecmp(name, "serial"))
strlcpy(serial, value, serial_size);
else if (!_cups_strcasecmp(name, "location") && location)
- *location = strtol(value, NULL, 16);
+ *location = (UInt32)strtoul(value, NULL, 16);
}
}
@@ -1912,6 +2113,7 @@ static void run_legacy_backend(int argc,
char *my_argv[32];
char *usb_legacy_status;
+
/*
* If we're running as x86_64 or i386 and couldn't load the class driver
* (because it's ppc or i386), then try to re-exec ourselves in ppc or i386
@@ -1928,6 +2130,8 @@ static void run_legacy_backend(int argc,
if (!usb_legacy_status)
{
+ log_usb_class_driver(IS_NOT_64BIT);
+
/*
* Setup a SIGTERM handler then block it before forking...
*/
@@ -1995,7 +2199,7 @@ static void run_legacy_backend(int argc,
cups_serverbin = CUPS_SERVERBIN;
snprintf(usbpath, sizeof(usbpath), "%s/backend/usb", cups_serverbin);
- for (i = 0; i < argc && i < (sizeof(my_argv) / sizeof(my_argv[0])) - 1; i ++)
+ for (i = 0; i < argc && i < (int)(sizeof(my_argv) / sizeof(my_argv[0])) - 1; i ++)
my_argv[i] = argv[i];
my_argv[i] = NULL;
@@ -2081,19 +2285,45 @@ sigterm_handler(int sig) /* I - Signal */
while (waitpid(child_pid, &status, 0) < 0 && errno == EINTR);
if (WIFEXITED(status))
- exit(WEXITSTATUS(status));
+ _exit(WEXITSTATUS(status));
else if (status == SIGTERM || status == SIGKILL)
- exit(0);
+ _exit(0);
else
{
- fprintf(stderr, "DEBUG: Child crashed on signal %d\n", status);
- exit(CUPS_BACKEND_STOP);
+ write(2, "DEBUG: Child crashed.\n", 22);
+ _exit(CUPS_BACKEND_STOP);
}
}
#endif /* __i386__ || __x86_64__ */
}
+/*
+ * 'sigquit_handler()' - SIGQUIT handler.
+ */
+
+static void sigquit_handler(int sig, siginfo_t *si, void *unused)
+{
+ char *path;
+ char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
+ static char msgbuf[256] = "";
+
+
+ (void)sig;
+ (void)unused;
+
+ if (proc_pidpath(si->si_pid, pathbuf, sizeof(pathbuf)) > 0 &&
+ (path = basename(pathbuf)) != NULL)
+ snprintf(msgbuf, sizeof(msgbuf), "SIGQUIT sent by %s(%d)", path, (int)si->si_pid);
+ else
+ snprintf(msgbuf, sizeof(msgbuf), "SIGQUIT sent by PID %d", (int)si->si_pid);
+
+ CRSetCrashLogMessage(msgbuf);
+
+ abort();
+}
+
+
#ifdef PARSE_PS_ERRORS
/*
* 'next_line()' - Find the next line in a buffer.
@@ -2164,7 +2394,7 @@ static void parse_pserror(char *sockBuffer,
}
/* move everything over... */
- strcpy(gErrorBuffer, pLineEnd);
+ strlcpy(gErrorBuffer, pLineEnd, sizeof(gErrorBuffer));
gErrorBufferPtr = gErrorBuffer;
pLineEnd = (char *)next_line((const char *)gErrorBuffer);
}
@@ -2251,19 +2481,61 @@ static void get_device_id(cups_sc_status_t *status,
{
CFStringRef deviceIDString = NULL;
- /* GetDeviceID */
- copy_deviceid(g.classdriver, &deviceIDString);
+ if (g.printer_obj != IO_OBJECT_NULL)
+ {
+ printer_interface_t printerIntf = usb_printer_interface_interface(g.printer_obj);
+ if (printerIntf)
+ {
+ deviceIDString = copy_printer_interface_deviceid(printerIntf, g.alternateSetting);
+ (*printerIntf)->Release(printerIntf);
+ }
+ }
+
if (deviceIDString)
{
- CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8);
- *datalen = strlen(data);
+ if (CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8))
+ *datalen = (int)strlen(data);
+ else
+ *datalen = 0;
+
CFRelease(deviceIDString);
}
+ else
+ {
+ *datalen = 0;
+ }
+
*status = CUPS_SC_STATUS_OK;
}
+static void
+log_usb_class_driver(int is_64bit) /* I - Is the USB class driver 64-bit? */
+{
+ /*
+ * Report the usage of legacy USB class drivers to Apple if the user opts into providing
+ * feedback to Apple...
+ */
+
+ aslmsg aslm = asl_new(ASL_TYPE_MSG);
+ if (aslm)
+ {
+ ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+ const char *make_model = ppd ? ppd->nickname : NULL;
+ ppd_attr_t *version = ppdFindAttr(ppd, "FileVersion", "");
+
+ asl_set(aslm, "com.apple.message.domain", "com.apple.printing.usb.64bit");
+ asl_set(aslm, "com.apple.message.result", is_64bit ? "yes" : "no");
+ asl_set(aslm, "com.apple.message.signature", make_model ? make_model : "Unknown");
+ asl_set(aslm, "com.apple.message.signature2", version ? version->value : "?.?");
+ asl_set(aslm, "com.apple.message.summarize", "YES");
+ asl_log(NULL, aslm, ASL_LEVEL_NOTICE, "");
+ asl_free(aslm);
+ }
+}
+
+
/*
- * End of "$Id: usb-darwin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb-darwin.c 12928 2015-10-23 21:31:58Z msweet $".
*/
diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c
index 8101006..ffb2fe9 100644
--- a/backend/usb-libusb.c
+++ b/backend/usb-libusb.c
@@ -1,35 +1,15 @@
/*
- * "$Id: usb-libusb.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usb-libusb.c 12881 2015-09-15 21:20:02Z msweet $"
*
- * LIBUSB interface code for CUPS.
+ * LIBUSB interface code for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * list_devices() - List the available printers.
- * print_device() - Print a file to a USB device.
- * close_device() - Close the connection to the USB printer.
- * compare_quirks() - Compare two quirks entries.
- * find_device() - Find or enumerate USB printers.
- * find_quirks() - Find the quirks for the given printer, if any.
- * get_device_id() - Get the IEEE-1284 device ID for the printer.
- * list_cb() - List USB printers for discovery.
- * load_quirks() - Load all quirks files in the /usr/share/cups/usb
- * directory.
- * make_device_uri() - Create a device URI for a USB printer.
- * open_device() - Open a connection to the USB printer.
- * print_cb() - Find a USB printer for printing.
- * read_thread() - Thread to read the backchannel data on.
- * sidechannel_thread() - Handle side-channel requests.
- * soft_reset() - Send a soft reset to the device.
- * soft_reset_printer() - Do the soft reset request specific to printers
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -123,6 +103,7 @@ typedef struct usb_globals_s /* Global USB printer information */
#define USB_QUIRK_USB_INIT 0x0010 /* Needs vendor USB init string */
#define USB_QUIRK_VENDOR_CLASS 0x0020 /* Descriptor uses vendor-specific
Class or SubClass */
+#define USB_QUIRK_DELAY_CLOSE 0x0040 /* Delay close */
#define USB_QUIRK_WHITELIST 0x0000 /* no quirks */
@@ -496,7 +477,7 @@ print_device(const char *uri, /* I - Device URI */
iostatus = libusb_bulk_transfer(g.printer->handle,
g.printer->write_endp,
print_buffer, g.print_bytes,
- &bytes, 60000);
+ &bytes, 0);
/*
* Ignore timeout errors, but retain the number of bytes written to
* avoid sending duplicate data...
@@ -519,7 +500,7 @@ print_device(const char *uri, /* I - Device URI */
iostatus = libusb_bulk_transfer(g.printer->handle,
g.printer->write_endp,
print_buffer, g.print_bytes,
- &bytes, 60000);
+ &bytes, 0);
}
/*
@@ -534,7 +515,7 @@ print_device(const char *uri, /* I - Device URI */
iostatus = libusb_bulk_transfer(g.printer->handle,
g.printer->write_endp,
print_buffer, g.print_bytes,
- &bytes, 60000);
+ &bytes, 0);
}
if (iostatus)
@@ -661,6 +642,9 @@ print_device(const char *uri, /* I - Device URI */
* Close the connection and input file and general clean up...
*/
+ if (g.printer->quirks & USB_QUIRK_DELAY_CLOSE)
+ sleep(1);
+
close_device(g.printer);
/*
@@ -920,8 +904,8 @@ find_device(usb_cb_t cb, /* I - Callback function */
fprintf(stderr, "DEBUG: Printer does not report class 7 and/or "
"subclass 1 but works as a printer anyway\n");
- read_endp = -1;
- write_endp = -1;
+ read_endp = 0xff;
+ write_endp = 0xff;
for (endp = 0, endpptr = altptr->endpoint;
endp < altptr->bNumEndpoints;
@@ -935,7 +919,7 @@ find_device(usb_cb_t cb, /* I - Callback function */
write_endp = endp;
}
- if (write_endp >= 0)
+ if (write_endp != 0xff)
{
/*
* Save the best match so far...
@@ -1085,8 +1069,7 @@ get_device_id(usb_printer_t *printer, /* I - Printer */
* bytes. The 1284 spec says the length is stored MSB first...
*/
- length = (((unsigned)buffer[0] & 255) << 8) |
- ((unsigned)buffer[1] & 255);
+ length = (int)((((unsigned)buffer[0] & 255) << 8) | ((unsigned)buffer[1] & 255));
/*
* Check to see if the length is larger than our buffer or less than 14 bytes
@@ -1097,8 +1080,7 @@ get_device_id(usb_printer_t *printer, /* I - Printer */
*/
if (length > bufsize || length < 14)
- length = (((unsigned)buffer[1] & 255) << 8) |
- ((unsigned)buffer[0] & 255);
+ length = (int)((((unsigned)buffer[1] & 255) << 8) | ((unsigned)buffer[0] & 255));
if (length > bufsize)
length = bufsize;
@@ -1120,7 +1102,7 @@ get_device_id(usb_printer_t *printer, /* I - Printer */
* nul-terminate.
*/
- memmove(buffer, buffer + 2, length);
+ memmove(buffer, buffer + 2, (size_t)length);
buffer[length] = '\0';
return (0);
@@ -1233,6 +1215,9 @@ load_quirks(void)
if (strstr(line, " blacklist"))
quirk->quirks |= USB_QUIRK_BLACKLIST;
+ if (strstr(line, " delay-close"))
+ quirk->quirks |= USB_QUIRK_DELAY_CLOSE;
+
if (strstr(line, " no-reattach"))
quirk->quirks |= USB_QUIRK_NO_REATTACH;
@@ -1473,9 +1458,14 @@ open_device(usb_printer_t *printer, /* I - Printer */
else
{
printer->usblp_attached = 0;
- fprintf(stderr, "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" kernel module attached\n",
- devdesc.idVendor, devdesc.idProduct);
- goto error;
+
+ if (errcode != LIBUSB_ERROR_NOT_SUPPORTED)
+ {
+ fprintf(stderr,
+ "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" "
+ "kernel module attached\n", devdesc.idVendor, devdesc.idProduct);
+ goto error;
+ }
}
/*
@@ -1539,6 +1529,16 @@ open_device(usb_printer_t *printer, /* I - Printer */
goto error;
}
+ else if ((errcode = libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0)
+ {
+ fprintf(stderr,
+ "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n",
+ devdesc.idVendor, devdesc.idProduct);
+
+ goto error;
+ }
+
+ sleep (1);
}
/*
@@ -1734,7 +1734,7 @@ static void *read_thread(void *reference)
{
fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n",
(int)rbytes);
- cupsBackChannelWrite((const char *)readbuffer, rbytes, 1.0);
+ cupsBackChannelWrite((const char *)readbuffer, (size_t)rbytes, 1.0);
}
else if (readstatus == LIBUSB_ERROR_TIMEOUT)
fputs("DEBUG: Got USB transaction timeout during read.\n", stderr);
@@ -2021,6 +2021,6 @@ soft_reset_printer(
/*
- * End of "$Id: usb-libusb.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb-libusb.c 12881 2015-09-15 21:20:02Z msweet $".
*/
diff --git a/backend/usb-unix.c b/backend/usb-unix.c
index adcd254..813039d 100644
--- a/backend/usb-unix.c
+++ b/backend/usb-unix.c
@@ -1,27 +1,20 @@
/*
- * "$Id: usb-unix.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usb-unix.c 12124 2014-08-28 15:37:22Z msweet $"
*
- * USB port backend for CUPS.
+ * USB port backend for CUPS.
*
- * This file is included from "usb.c" when compiled on UNIX/Linux.
+ * This file is included from "usb.c" when compiled on UNIX/Linux.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * print_device() - Print a file to a USB device.
- * list_devices() - List all USB devices.
- * open_device() - Open a USB device...
- * side_cb() - Handle side-channel requests...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -153,7 +146,7 @@ print_device(const char *uri, /* I - Device URI */
tcgetattr(device_fd, &opts);
- opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */
+ opts.c_lflag &= ~(unsigned)(ICANON | ECHO | ISIG); /* Raw mode */
/**** No options supported yet ****/
@@ -257,7 +250,6 @@ list_devices(void)
close(fd);
}
-#elif defined(__sgi)
#elif defined(__sun) && defined(ECPPIOC_GETDEVID)
int i; /* Looping var */
int fd; /* File descriptor */
@@ -286,8 +278,6 @@ list_devices(void)
close(fd);
}
}
-#elif defined(__hpux)
-#elif defined(__osf)
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
int i; /* Looping var */
char device[255]; /* Device filename */
@@ -613,5 +603,5 @@ side_cb(int print_fd, /* I - Print file */
/*
- * End of "$Id: usb-unix.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb-unix.c 12124 2014-08-28 15:37:22Z msweet $".
*/
diff --git a/backend/usb.c b/backend/usb.c
index 914a4ac..3ccbc00 100644
--- a/backend/usb.c
+++ b/backend/usb.c
@@ -1,5 +1,5 @@
/*
- * "$Id: usb.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usb.c 10996 2013-05-29 11:51:34Z msweet $"
*
* USB port backend for CUPS.
*
@@ -260,5 +260,5 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
/*
- * End of "$Id: usb.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/berkeley/Dependencies b/berkeley/Dependencies
index 46b71d9..76b1f2a 100644
--- a/berkeley/Dependencies
+++ b/berkeley/Dependencies
@@ -1,25 +1,28 @@
lpc.o: lpc.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
- ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
lpq.o: lpq.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
- ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
lpr.o: lpr.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
- ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
lprm.o: lprm.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
diff --git a/berkeley/Makefile b/berkeley/Makefile
index 8f208ae..6534f76 100644
--- a/berkeley/Makefile
+++ b/berkeley/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $"
#
# Berkeley commands makefile for CUPS.
#
@@ -88,6 +88,7 @@ install-exec:
$(INSTALL_DIR) $(SYMROOT); \
for file in $(TARGETS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -163,5 +164,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $".
#
diff --git a/berkeley/lpc.c b/berkeley/lpc.c
index e402a78..72b0f71 100644
--- a/berkeley/lpc.c
+++ b/berkeley/lpc.c
@@ -1,24 +1,16 @@
/*
- * "$Id: lpc.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpc.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * "lpc" command for CUPS.
+ * "lpc" command for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and commands.
- * compare_strings() - Compare two command-line strings.
- * do_command() - Do an lpc command...
- * show_help() - Show help messages.
- * show_status() - Show printers.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -32,7 +24,7 @@
* Local functions...
*/
-static int compare_strings(const char *, const char *, int);
+static int compare_strings(const char *, const char *, size_t);
static void do_command(http_t *, const char *, const char *);
static void show_help(const char *);
static void show_status(http_t *, const char *);
@@ -158,9 +150,9 @@ main(int argc, /* I - Number of command-line arguments */
static int /* O - -1 or 1 = no match, 0 = match */
compare_strings(const char *s, /* I - Command-line string */
const char *t, /* I - Option string */
- int tmin) /* I - Minimum number of unique chars in option */
+ size_t tmin) /* I - Minimum number of unique chars in option */
{
- int slen; /* Length of command-line string */
+ size_t slen; /* Length of command-line string */
slen = strlen(s);
@@ -446,5 +438,5 @@ show_status(http_t *http, /* I - HTTP connection to server */
/*
- * End of "$Id: lpc.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpc.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/berkeley/lpq.c b/berkeley/lpq.c
index d3839d5..0cb9047 100644
--- a/berkeley/lpq.c
+++ b/berkeley/lpq.c
@@ -1,27 +1,16 @@
/*
- * "$Id: lpq.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpq.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * "lpq" command for CUPS.
+ * "lpq" command for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and commands.
- * show_jobs() - Show jobs.
- * show_printer() - Show printer status.
- * usage() - Show program usage.
- */
-
-/*
- * Include necessary headers...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -138,8 +127,8 @@ main(int argc, /* I - Number of command-line arguments */
if ((named_dest = cupsGetNamedDest(http, dest, instance)) == NULL)
{
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
"name."), argv[0]);
@@ -194,7 +183,6 @@ main(int argc, /* I - Number of command-line arguments */
httpClose(http);
usage();
- break;
}
}
else if (isdigit(argv[i][0] & 255))
@@ -208,8 +196,8 @@ main(int argc, /* I - Number of command-line arguments */
{
if ((named_dest = cupsGetNamedDest(http, NULL, NULL)) == NULL)
{
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
@@ -262,7 +250,7 @@ main(int argc, /* I - Number of command-line arguments */
if (i && interval)
{
fflush(stdout);
- sleep(interval);
+ sleep((unsigned)interval);
}
else
break;
@@ -323,9 +311,6 @@ show_jobs(const char *command, /* I - Command name */
ipp_jstate_t jobstate; /* job-state */
int jobid, /* job-id */
jobsize, /* job-k-octets */
-#ifdef __osf__
- jobpriority, /* job-priority */
-#endif /* __osf__ */
jobcount, /* Number of jobs */
jobcopies, /* Number of copies */
rank; /* Rank of job */
@@ -448,9 +433,6 @@ show_jobs(const char *command, /* I - Command name */
jobid = 0;
jobsize = 0;
-#ifdef __osf__
- jobpriority = 50;
-#endif /* __osf__ */
jobstate = IPP_JOB_PENDING;
jobname = "unknown";
jobuser = "unknown";
@@ -467,12 +449,6 @@ show_jobs(const char *command, /* I - Command name */
attr->value_tag == IPP_TAG_INTEGER)
jobsize = attr->values[0].integer;
-#ifdef __osf__
- if (!strcmp(attr->name, "job-priority") &&
- attr->value_tag == IPP_TAG_INTEGER)
- jobpriority = attr->values[0].integer;
-#endif /* __osf__ */
-
if (!strcmp(attr->name, "job-state") &&
attr->value_tag == IPP_TAG_ENUM)
jobstate = (ipp_jstate_t)attr->values[0].integer;
@@ -510,16 +486,9 @@ show_jobs(const char *command, /* I - Command name */
}
if (!longstatus && jobcount == 0)
-#ifdef __osf__
- _cupsLangPuts(stdout,
- /* TRANSLATORS: Pri is job priority. */
- _("Rank Owner Pri Job Files"
- " Total Size"));
-#else
_cupsLangPuts(stdout,
_("Rank Owner Job File(s)"
" Total Size"));
-#endif /* __osf__ */
jobcount ++;
@@ -528,7 +497,7 @@ show_jobs(const char *command, /* I - Command name */
*/
if (jobstate == IPP_JOB_PROCESSING)
- strcpy(rankstr, "active");
+ strlcpy(rankstr, "active", sizeof(rankstr));
else
{
/*
@@ -560,16 +529,9 @@ show_jobs(const char *command, /* I - Command name */
namestr, 1024.0 * jobsize);
}
else
-#ifdef __osf__
- _cupsLangPrintf(stdout,
- _("%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"),
- rankstr, jobuser, jobpriority, jobid, jobname,
- 1024.0 * jobsize);
-#else
_cupsLangPrintf(stdout,
_("%-7s %-7.7s %-7d %-31.31s %.0f bytes"),
rankstr, jobuser, jobid, jobname, 1024.0 * jobsize);
-#endif /* __osf */
if (attr == NULL)
break;
@@ -679,5 +641,5 @@ usage(void)
/*
- * End of "$Id: lpq.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpq.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/berkeley/lpr.c b/berkeley/lpr.c
index 724a0c1..24242ca 100644
--- a/berkeley/lpr.c
+++ b/berkeley/lpr.c
@@ -1,20 +1,16 @@
/*
- * "$Id: lpr.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpr.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * "lpr" command for CUPS.
+ * "lpr" command for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and send files for printing.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -227,8 +223,8 @@ main(int argc, /* I - Number of command-line arguments */
dest->options[j].value,
num_options, &options);
}
- else if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -330,8 +326,8 @@ main(int argc, /* I - Number of command-line arguments */
dest->options[j].value,
num_options, &options);
}
- else if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -406,7 +402,7 @@ main(int argc, /* I - Number of command-line arguments */
while (status == HTTP_CONTINUE &&
(bytes = read(0, buffer, sizeof(buffer))) > 0)
- status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes);
+ status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes);
if (status != HTTP_CONTINUE)
{
@@ -436,5 +432,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: lpr.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpr.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/berkeley/lprm.c b/berkeley/lprm.c
index 3427def..922bbbd 100644
--- a/berkeley/lprm.c
+++ b/berkeley/lprm.c
@@ -1,5 +1,5 @@
/*
- * "$Id: lprm.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lprm.c 10996 2013-05-29 11:51:34Z msweet $"
*
* "lprm" command for CUPS.
*
@@ -213,5 +213,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: lprm.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lprm.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/Dependencies b/cgi-bin/Dependencies
index ff16e48..66ffa01 100644
--- a/cgi-bin/Dependencies
+++ b/cgi-bin/Dependencies
@@ -1,73 +1,72 @@
help-index.o: help-index.c cgi-private.h cgi.h ../cups/cups.h \
../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \
- ../cups/array.h ../cups/language.h help-index.h \
+ ../cups/array.h ../cups/language.h ../cups/pwg.h help-index.h \
../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h \
../cups/dir.h
html.o: html.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
ipp-var.o: ipp-var.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
search.o: search.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
template.o: template.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
var.o: var.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h \
../cups/md5-private.h
admin.o: admin.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h \
../cups/adminutil.h ../cups/ppd.h
classes.o: classes.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
help.o: help.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
jobs.o: jobs.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
-makedocset.o: makedocset.c cgi.h ../cups/cups.h ../cups/file.h \
- ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h
+makedocset.o: makedocset.c cgi-private.h cgi.h ../cups/cups.h \
+ ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \
+ ../cups/array.h ../cups/language.h ../cups/pwg.h help-index.h \
+ ../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/string-private.h ../config.h ../cups/ipp-private.h
printers.o: printers.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h ../cups/debug-private.h \
+ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
../cups/language-private.h ../cups/transcode.h \
../cups/string-private.h ../config.h ../cups/ipp-private.h
testcgi.o: testcgi.c cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h
+ ../cups/language.h ../cups/pwg.h help-index.h
testhi.o: testhi.c cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h
+ ../cups/language.h ../cups/pwg.h help-index.h
testtemplate.o: testtemplate.c cgi.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h
-websearch.o: websearch.c cgi.h ../cups/cups.h ../cups/file.h \
- ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h help-index.h
+ ../cups/language.h ../cups/pwg.h help-index.h
diff --git a/cgi-bin/Makefile b/cgi-bin/Makefile
index a3d5265..898fb7b 100644
--- a/cgi-bin/Makefile
+++ b/cgi-bin/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $"
#
-# CGI makefile for CUPS.
+# CGI makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2006 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2006 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
@@ -32,8 +32,7 @@ OBJS = \
printers.o \
testcgi.o \
testhi.o \
- testtemplate.o \
- websearch.o
+ testtemplate.o
CGIS = \
admin.cgi \
classes.cgi \
@@ -42,8 +41,7 @@ CGIS = \
printers.cgi
LIBTARGETS = \
libcupscgi.a \
- $(LIBCUPSCGI) \
- websearch
+ $(LIBCUPSCGI)
UNITTARGETS = \
testcgi \
@@ -82,7 +80,7 @@ unittests: $(UNITTARGETS)
clean:
$(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) makedocset
- $(RM) libcupscgi.so libcupscgi.sl libcupscgi.dylib
+ $(RM) libcupscgi.so libcupscgi.dylib
#
@@ -120,6 +118,7 @@ install-exec:
$(INSTALL_DIR) $(SYMROOT); \
for file in $(CGIS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -143,7 +142,7 @@ install-libs: $(INSTALLSTATIC)
echo Installing libraries in $(LIBDIR)...
$(INSTALL_DIR) -m 755 $(LIBDIR)
$(INSTALL_LIB) $(LIBCUPSCGI) $(LIBDIR)
- if test $(LIBCUPSCGI) = "libcupscgi.so.1" -o $(LIBCUPSCGI) = "libcupscgi.sl.1"; then \
+ if test $(LIBCUPSCGI) = "libcupscgi.so.1"; then \
$(RM) $(LIBDIR)/`basename $(LIBCUPSCGI) .1`; \
$(LN) $(LIBCUPSCGI) $(LIBDIR)/`basename $(LIBCUPSCGI) .1`; \
fi
@@ -154,6 +153,7 @@ install-libs: $(INSTALLSTATIC)
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
cp $(LIBCUPSCGI) $(SYMROOT); \
+ dsymutil $(SYMROOT)/$(LIBCUPSCGI); \
fi
installstatic:
@@ -175,9 +175,6 @@ uninstall:
$(RM) $(LIBDIR)/libcupscgi.1.dylib
$(RM) $(LIBDIR)/libcupscgi.a
$(RM) $(LIBDIR)/libcupscgi.dylib
- $(RM) $(LIBDIR)/libcupscgi_s.a
- $(RM) $(LIBDIR)/libcupscgi.sl
- $(RM) $(LIBDIR)/libcupscgi.sl.1
$(RM) $(LIBDIR)/libcupscgi.so
$(RM) $(LIBDIR)/libcupscgi.so.1
-$(RMDIR) $(LIBDIR)
@@ -209,10 +206,10 @@ framedhelp:
#
-# libcupscgi.so.1, libcupscgi.sl.1
+# libcupscgi.so.1
#
-libcupscgi.so.1 libcupscgi.sl.1: $(LIBOBJS)
+libcupscgi.so.1: $(LIBOBJS)
echo Linking $@...
$(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS)
$(RM) `basename $@ .1`
@@ -236,17 +233,6 @@ libcupscgi.1.dylib: $(LIBOBJS) libcupscgi.exp
#
-# libcupscgi_s.a
-#
-
-libcupscgi_s.a: $(LIBOBJS)
- echo Creating $@...
- $(DSO) $(DSOFLAGS) -o libcupscgi_s.o $(LIBOBJS) $(LIBS)
- $(RM) $@
- $(AR) $(ARFLAGS) $@ libcupscgi_s.o
-
-
-#
# libcupscgi.la
#
@@ -360,17 +346,6 @@ testtemplate: testtemplate.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
#
-# websearch
-#
-
-websearch: websearch.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
- echo Linking $@...
- $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ websearch.o libcupscgi.a \
- ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \
- $(LIBZ) $(LIBGSSAPI)
-
-
-#
# Dependencies...
#
@@ -378,5 +353,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $".
#
diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
index c30b590..29ae5c8 100644
--- a/cgi-bin/admin.c
+++ b/cgi-bin/admin.c
@@ -1,37 +1,16 @@
/*
- * "$Id: admin.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: admin.c 12516 2015-02-12 20:18:11Z msweet $"
*
- * Administration CGI for CUPS.
+ * Administration CGI for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for CGI.
- * choose_device_cb() - Add a device to the device selection page.
- * do_add_rss_subscription() - Add a RSS subscription.
- * do_am_class() - Add or modify a class.
- * do_am_printer() - Add or modify a printer.
- * do_cancel_subscription() - Cancel a subscription.
- * do_config_server() - Configure server settings.
- * do_delete_class() - Delete a class.
- * do_delete_printer() - Delete a printer.
- * do_export() - Export printers to Samba.
- * do_list_printers() - List available printers.
- * do_menu() - Show the main menu.
- * do_set_allowed_users() - Set the allowed/denied users for a queue.
- * do_set_default() - Set the server default printer/class.
- * do_set_options() - Configure the default options for a queue.
- * do_set_sharing() - Set printer-is-shared value.
- * get_option_value() - Return the value of an option.
- * get_points() - Get a value in points.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -39,6 +18,8 @@
*/
#include "cgi-private.h"
+#include <cups/http-private.h>
+#include <cups/ppd-private.h>
#include <cups/adminutil.h>
#include <cups/ppd.h>
#include <errno.h>
@@ -59,12 +40,7 @@ static int current_device = 0; /* Current device shown */
* Local functions...
*/
-static void choose_device_cb(const char *device_class,
- const char *device_id, const char *device_info,
- const char *device_make_and_model,
- const char *device_uri,
- const char *device_location,
- const char *title);
+static void choose_device_cb(const char *device_class, const char *device_id, const char *device_info, const char *device_make_and_model, const char *device_uri, const char *device_location, const char *title);
static void do_add_rss_subscription(http_t *http);
static void do_am_class(http_t *http, int modify);
static void do_am_printer(http_t *http, int modify);
@@ -82,6 +58,7 @@ static void do_set_sharing(http_t *http);
static char *get_option_value(ppd_file_t *ppd, const char *name,
char *buffer, size_t bufsize);
static double get_points(double number, const char *uval);
+static char *get_printer_ppd(const char *uri, char *buffer, size_t bufsize);
/*
@@ -89,8 +66,7 @@ static double get_points(double number, const char *uval);
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
http_t *http; /* Connection to the server */
const char *op; /* Operation name */
@@ -854,7 +830,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
const cgi_file_t *file; /* Uploaded file, if any */
const char *var; /* CGI variable */
char uri[HTTP_MAX_URI], /* Device or printer URI */
- *uriptr; /* Pointer into URI */
+ *uriptr, /* Pointer into URI */
+ evefile[1024] = ""; /* IPP Everywhere PPD file */
int maxrate; /* Maximum baud rate */
char baudrate[255]; /* Baud rate string */
const char *name, /* Pointer to class name */
@@ -962,13 +939,13 @@ do_am_printer(http_t *http, /* I - HTTP connection */
else if (!_cups_strncasecmp(make, "laserjet", 8) ||
!_cups_strncasecmp(make, "deskjet", 7) ||
!_cups_strncasecmp(make, "designjet", 9))
- strcpy(make, "HP");
+ strlcpy(make, "HP", sizeof(make));
else if (!_cups_strncasecmp(make, "phaser", 6))
- strcpy(make, "Xerox");
+ strlcpy(make, "Xerox", sizeof(make));
else if (!_cups_strncasecmp(make, "stylus", 6))
- strcpy(make, "Epson");
+ strlcpy(make, "Epson", sizeof(make));
else
- strcpy(make, "Generic");
+ strlcpy(make, "Generic", sizeof(make));
if (!cgiGetVariable("CURRENT_MAKE"))
cgiSetVariable("CURRENT_MAKE", make);
@@ -1172,7 +1149,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
char filename[1024]; /* PPD filename */
ppd_file_t *ppd; /* PPD information */
char buffer[1024]; /* Buffer */
- int bytes; /* Number of bytes */
+ ssize_t bytes; /* Number of bytes */
http_status_t get_status; /* Status of GET */
@@ -1194,7 +1171,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
else if ((fd = cupsTempFd(filename, sizeof(filename))) >= 0)
{
while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
- write(fd, buffer, bytes);
+ write(fd, buffer, (size_t)bytes);
close(fd);
@@ -1211,8 +1188,10 @@ do_am_printer(http_t *http, /* I - HTTP connection */
}
else
{
+ int linenum; /* Line number */
+
fprintf(stderr, "ERROR: Unable to open PPD file %s: %s\n",
- filename, ppdErrorString(ppdLastError(&bytes)));
+ filename, ppdErrorString(ppdLastError(&linenum)));
}
}
else
@@ -1348,20 +1327,22 @@ do_am_printer(http_t *http, /* I - HTTP connection */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
- ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location",
- NULL, cgiGetVariable("PRINTER_LOCATION"));
-
- ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info",
- NULL, cgiGetVariable("PRINTER_INFO"));
-
if (!file)
{
var = cgiGetVariable("PPD_NAME");
- if (strcmp(var, "__no_change__"))
- ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name",
+ if (!strcmp(var, "everywhere"))
+ get_printer_ppd(cgiGetVariable("DEVICE_URI"), evefile, sizeof(evefile));
+ else if (strcmp(var, "__no_change__"))
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
NULL, var);
}
+ ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location",
+ NULL, cgiGetVariable("PRINTER_LOCATION"));
+
+ ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info",
+ NULL, cgiGetVariable("PRINTER_INFO"));
+
strlcpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri));
/*
@@ -1380,7 +1361,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
if ((uriptr = strchr(uri, '?')) == NULL)
uriptr = uri + strlen(uri);
- snprintf(uriptr, sizeof(uri) - (uriptr - uri),
+ snprintf(uriptr, sizeof(uri) - (size_t)(uriptr - uri),
"?baud=%s+bits=%s+parity=%s+flow=%s",
cgiGetVariable("BAUDRATE"), cgiGetVariable("BITS"),
cgiGetVariable("PARITY"), cgiGetVariable("FLOW"));
@@ -1404,6 +1385,11 @@ do_am_printer(http_t *http, /* I - HTTP connection */
if (file)
ippDelete(cupsDoFileRequest(http, request, "/admin/", file->tempfile));
+ else if (evefile[0])
+ {
+ ippDelete(cupsDoFileRequest(http, request, "/admin/", evefile));
+ unlink(evefile);
+ }
else
ippDelete(cupsDoRequest(http, request, "/admin/"));
@@ -1881,7 +1867,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
if ((end = strstr(start, "\n")) == NULL)
end = start + strlen(start);
- cupsFileWrite(temp, start, end - start);
+ cupsFileWrite(temp, start, (size_t)(end - start));
cupsFilePutChar(temp, '\n');
if (*end == '\r')
@@ -1917,7 +1903,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
}
else
{
- cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect");
+ cgiSetVariable("refresh_page", "5;URL=/admin/");
cgiStartHTML(cgiText(_("Edit Configuration File")));
cgiCopyTemplateLang("restart.tmpl");
@@ -2006,9 +1992,9 @@ do_config_server(http_t *http) /* I - HTTP connection */
* Allocate memory and load the file into a string buffer...
*/
- if ((buffer = calloc(1, info.st_size + 1)) != NULL)
+ if ((buffer = calloc(1, (size_t)info.st_size + 1)) != NULL)
{
- cupsFileRead(cupsd, buffer, info.st_size);
+ cupsFileRead(cupsd, buffer, (size_t)info.st_size);
cgiSetVariable("CUPSDCONF", buffer);
free(buffer);
}
@@ -2025,7 +2011,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
(cupsd = cupsFileOpen(filename, "r")) != NULL)
{
- if ((buffer = calloc(1, 2 * info.st_size + 1)) != NULL)
+ if ((buffer = calloc(1, 2 * (size_t)info.st_size + 1)) != NULL)
{
bufend = buffer + 2 * info.st_size - 1;
@@ -2035,7 +2021,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
if (ch == '\\' || ch == '\"')
{
*bufptr++ = '\\';
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
else if (ch == '\n')
{
@@ -2048,7 +2034,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
*bufptr++ = 't';
}
else if (ch >= ' ')
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
*bufptr = '\0';
@@ -3882,7 +3868,7 @@ do_set_sharing(http_t *http) /* I - HTTP connection */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
- ippAddBoolean(request, IPP_TAG_OPERATION, "printer-is-shared", atoi(shared));
+ ippAddBoolean(request, IPP_TAG_OPERATION, "printer-is-shared", (char)atoi(shared));
/*
* Do the request and get back a response...
@@ -4096,7 +4082,7 @@ get_option_value(
if ((val = cgiGetVariable(keyword)) == NULL)
return (NULL);
- snprintf(bufptr, bufend - bufptr, "%s%s=", prefix, cparam->name);
+ snprintf(bufptr, (size_t)(bufend - bufptr), "%s%s=", prefix, cparam->name);
bufptr += strlen(bufptr);
prefix = " ";
@@ -4110,7 +4096,7 @@ get_option_value(
number > cparam->maximum.custom_real)
return (NULL);
- snprintf(bufptr, bufend - bufptr, "%g", number);
+ snprintf(bufptr, (size_t)(bufend - bufptr), "%g", number);
break;
case PPD_CUSTOM_INT :
@@ -4120,7 +4106,7 @@ get_option_value(
integer > cparam->maximum.custom_int)
return (NULL);
- snprintf(bufptr, bufend - bufptr, "%ld", integer);
+ snprintf(bufptr, (size_t)(bufend - bufptr), "%ld", integer);
break;
case PPD_CUSTOM_POINTS :
@@ -4138,7 +4124,7 @@ get_option_value(
number_points > cparam->maximum.custom_points)
return (NULL);
- snprintf(bufptr, bufend - bufptr, "%g%s", number, uval);
+ snprintf(bufptr, (size_t)(bufend - bufptr), "%g%s", number, uval);
break;
case PPD_CUSTOM_PASSCODE :
@@ -4187,7 +4173,7 @@ get_option_value(
if (bufptr == buffer || (bufend - bufptr) < 2)
return (NULL);
- strcpy(bufptr, "}");
+ memcpy(bufptr, "}", 2);
}
return (buffer);
@@ -4218,5 +4204,78 @@ get_points(double number, /* I - Original number */
/*
- * End of "$Id: admin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'get_printer_ppd()' - Get an IPP Everywhere PPD file for the given URI.
+ */
+
+static char * /* O - Filename or NULL */
+get_printer_ppd(const char *uri, /* I - Printer URI */
+ char *buffer, /* I - Filename buffer */
+ size_t bufsize) /* I - Size of filename buffer */
+{
+ http_t *http; /* Connection to printer */
+ ipp_t *request, /* Get-Printer-Attributes request */
+ *response; /* Get-Printer-Attributes response */
+ char resolved[1024], /* Resolved URI */
+ scheme[32], /* URI scheme */
+ userpass[256], /* Username:password */
+ host[256], /* Hostname */
+ resource[256]; /* Resource path */
+ int port; /* Port number */
+
+
+ /*
+ * Connect to the printer...
+ */
+
+ if (strstr(uri, "._tcp"))
+ {
+ /*
+ * Resolve URI...
+ */
+
+ if (!_httpResolveURI(uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
+ {
+ fprintf(stderr, "ERROR: Unable to resolve \"%s\".\n", uri);
+ return (NULL);
+ }
+
+ uri = resolved;
+ }
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ {
+ fprintf(stderr, "ERROR: Bad printer URI \"%s\".\n", uri);
+ return (NULL);
+ }
+
+ http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
+ if (!http)
+ {
+ fprintf(stderr, "ERROR: Unable to connect to \"%s:%d\": %s\n", host, port, cupsLastErrorString());
+ return (NULL);
+ }
+
+ /*
+ * Send a Get-Printer-Attributes request...
+ */
+
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+ response = cupsDoRequest(http, request, resource);
+
+ if (!_ppdCreateFromIPP(buffer, bufsize, response))
+ fprintf(stderr, "ERROR: Unable to create PPD file: %s\n", strerror(errno));
+
+ ippDelete(response);
+ httpClose(http);
+
+ if (buffer[0])
+ return (buffer);
+ else
+ return (NULL);
+}
+
+
+/*
+ * End of "$Id: admin.c 12516 2015-02-12 20:18:11Z msweet $".
*/
diff --git a/cgi-bin/cgi-private.h b/cgi-bin/cgi-private.h
index 348da08..c5d0eef 100644
--- a/cgi-bin/cgi-private.h
+++ b/cgi-bin/cgi-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: cgi-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cgi-private.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Private CGI definitions for CUPS.
*
@@ -32,5 +32,5 @@
/*
- * End of "$Id: cgi-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cgi-private.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/cgi.h b/cgi-bin/cgi.h
index 4d76a02..37732b5 100644
--- a/cgi-bin/cgi.h
+++ b/cgi-bin/cgi.h
@@ -1,5 +1,5 @@
/*
- * "$Id: cgi.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cgi.h 10996 2013-05-29 11:51:34Z msweet $"
*
* CGI support library definitions for CUPS.
*
@@ -115,5 +115,5 @@ extern const char *cgiText(const char *message);
#endif /* !_CUPS_CGI_H_ */
/*
- * End of "$Id: cgi.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cgi.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/classes.c b/cgi-bin/classes.c
index 47bcedf..0af538b 100644
--- a/cgi-bin/classes.c
+++ b/cgi-bin/classes.c
@@ -1,23 +1,16 @@
/*
- * "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: classes.c 11928 2014-06-13 00:08:32Z msweet $"
*
- * Class status CGI for CUPS.
+ * Class status CGI for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for CGI.
- * do_class_op() - Do a class operation.
- * show_all_classes() - Show all classes...
- * show_class() - Show a single class.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -42,8 +35,7 @@ static void show_class(http_t *http, const char *printer);
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
const char *pclass; /* Class name */
const char *user; /* Username */
@@ -169,8 +161,8 @@ main(int argc, /* I - Number of command-line arguments */
do_class_op(http, pclass, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs")));
else if (!strcmp(op, "reject-jobs"))
do_class_op(http, pclass, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs")));
- else if (!strcmp(op, "purge-jobs"))
- do_class_op(http, pclass, IPP_PURGE_JOBS, cgiText(_("Purge Jobs")));
+ else if (!strcmp(op, "cancel-jobs"))
+ do_class_op(http, pclass, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs")));
else if (!_cups_strcasecmp(op, "print-test-page"))
cgiPrintTestPage(http, pclass);
else if (!_cups_strcasecmp(op, "move-jobs"))
@@ -286,8 +278,8 @@ do_class_op(http_t *http, /* I - HTTP connection */
cgiCopyTemplateLang("printer-accept.tmpl");
else if (op == CUPS_REJECT_JOBS)
cgiCopyTemplateLang("printer-reject.tmpl");
- else if (op == IPP_PURGE_JOBS)
- cgiCopyTemplateLang("printer-purge.tmpl");
+ else if (op == IPP_OP_CANCEL_JOBS)
+ cgiCopyTemplateLang("printer-cancel-jobs.tmpl");
}
cgiEndHTML();
@@ -554,5 +546,5 @@ show_class(http_t *http, /* I - Connection to server */
/*
- * End of "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: classes.c 11928 2014-06-13 00:08:32Z msweet $".
*/
diff --git a/cgi-bin/help-index.c b/cgi-bin/help-index.c
index 195c1f6..d467cb6 100644
--- a/cgi-bin/help-index.c
+++ b/cgi-bin/help-index.c
@@ -1,34 +1,16 @@
/*
- * "$Id: help-index.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: help-index.c 12644 2015-05-19 21:22:35Z msweet $"
*
- * Online help index routines for CUPS.
+ * Online help index routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * helpDeleteIndex() - Delete an index, freeing all memory used.
- * helpFindNode() - Find a node in an index.
- * helpLoadIndex() - Load a help index from disk.
- * helpSaveIndex() - Save a help index to disk.
- * helpSearchIndex() - Search an index.
- * help_add_word() - Add a word to a node.
- * help_compile_search() - Convert a search string into a regular expression.
- * help_delete_node() - Free all memory used by a node.
- * help_delete_word() - Free all memory used by a word.
- * help_load_directory() - Load a directory of files into an index.
- * help_load_file() - Load a HTML files into an index.
- * help_new_node() - Create a new node and add it to an index.
- * help_sort_nodes_by_name() - Sort nodes by section, filename, and anchor.
- * help_sort_nodes_by_score() - Sort nodes by score and text.
- * help_sort_words() - Sort words alphabetically.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -346,7 +328,7 @@ helpLoadIndex(const char *hifile, /* I - Index filename */
mtime = strtol(ptr, &ptr, 10);
offset = strtoll(ptr, &ptr, 10);
- length = strtoll(ptr, &ptr, 10);
+ length = (size_t)strtoll(ptr, &ptr, 10);
while (isspace(*ptr & 255))
ptr ++;
@@ -902,7 +884,7 @@ help_load_file(
DEBUG_printf(("2help_load_file(hi=%p, filename=\"%s\", relative=\"%s\", "
- "mtime=%ld)", hi, filename, relative, mtime));
+ "mtime=%ld)", hi, filename, relative, (long)mtime));
if ((fp = cupsFileOpen(filename, "r")) == NULL)
return (-1);
@@ -910,7 +892,7 @@ help_load_file(
node = NULL;
offset = 0;
- strcpy(section, "Other");
+ strlcpy(section, "Other", sizeof(section));
while (cupsFileGets(fp, line, sizeof(line)))
{
@@ -1019,14 +1001,14 @@ help_load_file(
*ptr++ = ' ';
- if (!cupsFileGets(fp, ptr, sizeof(line) - (ptr - line) - 1))
+ if (!cupsFileGets(fp, ptr, sizeof(line) - (size_t)(ptr - line) - 1))
break;
}
*ptr = '\0';
if (node)
- node->length = offset - node->offset;
+ node->length = (size_t)(offset - node->offset);
if (!*text)
{
@@ -1179,9 +1161,9 @@ help_load_file(
for (text = ptr, ptr ++; *ptr && isalnum(*ptr & 255); ptr ++);
- wordlen = ptr - text;
+ wordlen = (int)(ptr - text);
- memcpy(temp, text, wordlen);
+ memcpy(temp, text, (size_t)wordlen);
temp[wordlen] = '\0';
ptr --;
@@ -1206,7 +1188,7 @@ help_load_file(
cupsFileClose(fp);
if (node)
- node->length = offset - node->offset;
+ node->length = (size_t)(offset - node->offset);
return (0);
}
@@ -1238,7 +1220,7 @@ help_new_node(const char *filename, /* I - Filename */
n->filename = strdup(filename);
n->anchor = anchor ? strdup(anchor) : NULL;
- n->section = (section && *section) ? strdup(section) : NULL;
+ n->section = *section ? strdup(section) : NULL;
n->text = strdup(text);
n->mtime = mtime;
n->offset = offset;
@@ -1324,5 +1306,5 @@ help_sort_words(help_word_t *w1, /* I - Second word */
/*
- * End of "$Id: help-index.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: help-index.c 12644 2015-05-19 21:22:35Z msweet $".
*/
diff --git a/cgi-bin/help-index.h b/cgi-bin/help-index.h
index 4b03969..3618d60 100644
--- a/cgi-bin/help-index.h
+++ b/cgi-bin/help-index.h
@@ -1,5 +1,5 @@
/*
- * "$Id: help-index.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: help-index.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Online help index definitions for CUPS.
*
@@ -83,5 +83,5 @@ extern help_index_t *helpSearchIndex(help_index_t *hi, const char *query,
#endif /* !_CUPS_HELP_INDEX_H_ */
/*
- * End of "$Id: help-index.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: help-index.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/help.c b/cgi-bin/help.c
index c8fc66e..75f70d9 100644
--- a/cgi-bin/help.c
+++ b/cgi-bin/help.c
@@ -1,5 +1,5 @@
/*
- * "$Id: help.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: help.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Online help CGI for CUPS.
*
@@ -393,5 +393,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: help.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: help.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/html.c b/cgi-bin/html.c
index b721ee3..af58c88 100644
--- a/cgi-bin/html.c
+++ b/cgi-bin/html.c
@@ -1,5 +1,5 @@
/*
- * "$Id: html.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: html.c 10996 2013-05-29 11:51:34Z msweet $"
*
* HTML support functions for CUPS.
*
@@ -235,5 +235,5 @@ cgi_null_passwd(const char *prompt) /* I - Prompt string (unused) */
/*
- * End of "$Id: html.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: html.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c
index a1d7f38..1a08960 100644
--- a/cgi-bin/ipp-var.c
+++ b/cgi-bin/ipp-var.c
@@ -1,31 +1,16 @@
/*
- * "$Id: ipp-var.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp-var.c 12768 2015-06-30 16:13:38Z msweet $"
*
- * CGI <-> IPP variable routines for CUPS.
+ * CGI <-> IPP variable routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cgiGetAttributes() - Get the list of attributes that are needed by the
- * template file.
- * cgiGetIPPObjects() - Get the objects in an IPP response.
- * cgiMoveJobs() - Move one or more jobs.
- * cgiPrintCommand() - Print a CUPS command job.
- * cgiPrintTestPage() - Print a test page.
- * cgiRewriteURL() - Rewrite a printer URI into a web browser URL...
- * cgiSetIPPObjectVars() - Set CGI variables from an IPP object.
- * cgiSetIPPVars() - Set CGI variables from an IPP response.
- * cgiShowIPPError() - Show the last IPP error message.
- * cgiShowJobs() - Show print jobs.
- * cgiText() - Return localized text.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -65,7 +50,7 @@ cgiGetAttributes(ipp_t *request, /* I - IPP request */
{
for (i = 0; lang[i] && i < 15; i ++)
if (isalnum(lang[i] & 255))
- locale[i] = tolower(lang[i]);
+ locale[i] = (char)tolower(lang[i]);
else
locale[i] = '_';
@@ -107,7 +92,7 @@ cgiGetAttributes(ipp_t *request, /* I - IPP request */
while ((ch = getc(in)) != EOF)
if (ch == '\\')
getc(in);
- else if (ch == '{' && num_attrs < (sizeof(attrs) / sizeof(attrs[0])))
+ else if (ch == '{' && num_attrs < (int)(sizeof(attrs) / sizeof(attrs[0])))
{
/*
* Grab the name...
@@ -123,13 +108,13 @@ cgiGetAttributes(ipp_t *request, /* I - IPP request */
if (ch == '_')
*nameptr++ = '-';
else
- *nameptr++ = ch;
+ *nameptr++ = (char)ch;
}
*nameptr = '\0';
if (!strncmp(name, "printer_state_history", 21))
- strcpy(name, "printer_state_history");
+ strlcpy(name, "printer_state_history", sizeof(name));
/*
* Possibly add it to the list of attributes...
@@ -237,6 +222,9 @@ cgiGetIPPObjects(ipp_t *response, /* I - IPP response */
break;
case IPP_TAG_INTEGER :
+ if (!strncmp(ippGetName(attr), "time-at-", 8))
+ break; /* Ignore time-at-xxx */
+
for (i = 0; !add && i < attr->num_values; i ++)
{
char buf[255]; /* Number buffer */
@@ -554,8 +542,8 @@ cgiPrintCommand(http_t *http, /* I - Connection to server */
ipp_t *request, /* Get-Job-Attributes request */
*response; /* Get-Job-Attributes response */
ipp_attribute_t *attr; /* Current job attribute */
- static const char * const job_attrs[] =
- { /* Job attributes we want */
+ static const char * const job_attrs[] =/* Job attributes we want */
+ {
"job-state",
"job-printer-state-message"
};
@@ -917,7 +905,7 @@ cgiRewriteURL(const char *uri, /* I - Current URI */
* Make URI relative to the current server...
*/
- strlcpy(url, resource, urlsize);
+ strlcpy(url, resource, (size_t)urlsize);
}
else
{
@@ -926,17 +914,13 @@ cgiRewriteURL(const char *uri, /* I - Current URI */
*/
if (userpass[0])
- snprintf(url, urlsize, "%s://%s@%s:%d%s",
- ishttps ? "https" : "http",
- userpass, hostname, port, resource);
+ snprintf(url, (size_t)urlsize, "%s://%s@%s:%d%s", ishttps ? "https" : "http", userpass, hostname, port, resource);
else
- snprintf(url, urlsize, "%s://%s:%d%s",
- ishttps ? "https" : "http",
- hostname, port, resource);
+ snprintf(url, (size_t)urlsize, "%s://%s:%d%s", ishttps ? "https" : "http", hostname, port, resource);
}
}
else
- strlcpy(url, uri, urlsize);
+ strlcpy(url, uri, (size_t)urlsize);
return (url);
}
@@ -958,7 +942,6 @@ cgiSetIPPObjectVars(
*nameptr, /* Pointer into name */
value[16384], /* Value(s) */
*valptr; /* Pointer into value */
- struct tm *date; /* Date information */
fprintf(stderr, "DEBUG2: cgiSetIPPObjectVars(obj=%p, prefix=\"%s\", "
@@ -1039,7 +1022,7 @@ cgiSetIPPObjectVars(
*valptr++ = ' ';
}
- remaining = sizeof(value) - (valptr - value);
+ remaining = sizeof(value) - (size_t)(valptr - value);
if (!strcmp(attr->values[i].string.text, "printer-stopped"))
strlcpy(valptr, _("Printer Paused"), remaining);
@@ -1177,7 +1160,7 @@ cgiSetIPPObjectVars(
for (i = 0; i < attr->num_values; i ++)
{
if (i)
- strlcat(valptr, ", ", sizeof(value) - (valptr - value));
+ strlcat(valptr, ", ", sizeof(value) - (size_t)(valptr - value));
valptr += strlen(valptr);
@@ -1186,36 +1169,28 @@ cgiSetIPPObjectVars(
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
if (strncmp(name, "time_at_", 8) == 0)
- {
- time_t t; /* Temporary time value */
-
- t = (time_t)attr->values[i].integer;
- date = localtime(&t);
-
- strftime(valptr, sizeof(value) - (valptr - value), "%c", date);
- }
+ _cupsStrDate(valptr, sizeof(value) - (size_t)(valptr - value), (time_t)ippGetInteger(attr, i));
else
- snprintf(valptr, sizeof(value) - (valptr - value),
- "%d", attr->values[i].integer);
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", ippGetInteger(attr, i));
break;
case IPP_TAG_BOOLEAN :
- snprintf(valptr, sizeof(value) - (valptr - value),
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value),
"%d", attr->values[i].boolean);
break;
case IPP_TAG_NOVALUE :
- strlcat(valptr, "novalue", sizeof(value) - (valptr - value));
+ strlcat(valptr, "novalue", sizeof(value) - (size_t)(valptr - value));
break;
case IPP_TAG_RANGE :
- snprintf(valptr, sizeof(value) - (valptr - value),
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value),
"%d-%d", attr->values[i].range.lower,
attr->values[i].range.upper);
break;
case IPP_TAG_RESOLUTION :
- snprintf(valptr, sizeof(value) - (valptr - value),
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value),
"%dx%d%s", attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units == IPP_RES_PER_INCH ?
@@ -1230,21 +1205,7 @@ cgiSetIPPObjectVars(
* Rewrite URIs...
*/
- if (!strcmp(name, "member_uris"))
- {
- char url[1024]; /* URL for class member... */
-
-
- cgiRewriteURL(attr->values[i].string.text, url,
- sizeof(url), NULL);
-
- snprintf(valptr, sizeof(value) - (valptr - value),
- "<A HREF=\"%s\">%s</A>", url,
- strrchr(attr->values[i].string.text, '/') + 1);
- }
- else
- cgiRewriteURL(attr->values[i].string.text, valptr,
- sizeof(value) - (valptr - value), NULL);
+ cgiRewriteURL(attr->values[i].string.text, valptr, (int)(sizeof(value) - (size_t)(valptr - value)), NULL);
break;
}
@@ -1256,7 +1217,7 @@ cgiSetIPPObjectVars(
case IPP_TAG_LANGUAGE :
case IPP_TAG_MIMETYPE :
strlcat(valptr, attr->values[i].string.text,
- sizeof(value) - (valptr - value));
+ sizeof(value) - (size_t)(valptr - value));
break;
case IPP_TAG_BEGIN_COLLECTION :
@@ -1589,5 +1550,5 @@ cgiText(const char *message) /* I - Message */
/*
- * End of "$Id: ipp-var.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp-var.c 12768 2015-06-30 16:13:38Z msweet $".
*/
diff --git a/cgi-bin/jobs.c b/cgi-bin/jobs.c
index 95c8d1d..383532d 100644
--- a/cgi-bin/jobs.c
+++ b/cgi-bin/jobs.c
@@ -1,21 +1,16 @@
/*
- * "$Id: jobs.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: jobs.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Job status CGI for CUPS.
+ * Job status CGI for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for CGI.
- * do_job_op() - Do a job operation.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -37,8 +32,7 @@ static void do_job_op(http_t *http, int job_id, ipp_op_t op);
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
http_t *http; /* Connection to the server */
const char *op; /* Operation name */
@@ -182,7 +176,7 @@ do_job_op(http_t *http, /* I - HTTP connection */
char url[1024]; /* Encoded URL */
- strcpy(url, "5;URL=");
+ strlcpy(url, "5;URL=", sizeof(url));
cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6);
cgiSetVariable("refresh_page", url);
}
@@ -210,5 +204,5 @@ do_job_op(http_t *http, /* I - HTTP connection */
/*
- * End of "$Id: jobs.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: jobs.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cgi-bin/makedocset.c b/cgi-bin/makedocset.c
index 079c59f..6be2797 100644
--- a/cgi-bin/makedocset.c
+++ b/cgi-bin/makedocset.c
@@ -1,5 +1,5 @@
/*
- * "$Id: makedocset.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: makedocset.c 3833 2012-05-23 22:51:18Z msweet $"
*
* Xcode documentation set generator.
*
@@ -482,5 +482,5 @@ write_nodes(const char *path, /* I - File to write */
/*
- * End of "$Id: makedocset.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: makedocset.c 3833 2012-05-23 22:51:18Z msweet $".
*/
diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c
index f61d407..9cfd44c 100644
--- a/cgi-bin/printers.c
+++ b/cgi-bin/printers.c
@@ -1,23 +1,16 @@
/*
- * "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: printers.c 11928 2014-06-13 00:08:32Z msweet $"
*
- * Printer status CGI for CUPS.
+ * Printer status CGI for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for CGI.
- * do_printer_op() - Do a printer operation.
- * show_all_printers() - Show all printers...
- * show_printer() - Show a single printer.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -43,8 +36,7 @@ static void show_printer(http_t *http, const char *printer);
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
const char *printer; /* Printer name */
const char *user; /* Username */
@@ -172,8 +164,8 @@ main(int argc, /* I - Number of command-line arguments */
do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs")));
else if (!strcmp(op, "reject-jobs"))
do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs")));
- else if (!strcmp(op, "purge-jobs"))
- do_printer_op(http, printer, IPP_PURGE_JOBS, cgiText(_("Purge Jobs")));
+ else if (!strcmp(op, "cancel-jobs"))
+ do_printer_op(http, printer, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs")));
else if (!_cups_strcasecmp(op, "print-self-test-page"))
cgiPrintCommand(http, printer, "PrintSelfTestPage",
cgiText(_("Print Self-Test Page")));
@@ -293,8 +285,8 @@ do_printer_op(http_t *http, /* I - HTTP connection */
cgiCopyTemplateLang("printer-accept.tmpl");
else if (op == CUPS_REJECT_JOBS)
cgiCopyTemplateLang("printer-reject.tmpl");
- else if (op == IPP_PURGE_JOBS)
- cgiCopyTemplateLang("printer-purge.tmpl");
+ else if (op == IPP_OP_CANCEL_JOBS)
+ cgiCopyTemplateLang("printer-cancel-jobs.tmpl");
}
cgiEndHTML();
@@ -574,5 +566,5 @@ show_printer(http_t *http, /* I - Connection to server */
/*
- * End of "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: printers.c 11928 2014-06-13 00:08:32Z msweet $".
*/
diff --git a/cgi-bin/search.c b/cgi-bin/search.c
index 8fd8221..9a93431 100644
--- a/cgi-bin/search.c
+++ b/cgi-bin/search.c
@@ -1,22 +1,16 @@
/*
- * "$Id: search.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: search.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Search routines for CUPS.
+ * Search routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cgiCompileSearch() - Compile a search string.
- * cgiDoSearch() - Do a search of some text.
- * cgiFreeSearch() - Free a compiled search context.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -38,12 +32,12 @@ cgiCompileSearch(const char *query) /* I - Query string */
char *s, /* Regular expression string */
*sptr, /* Pointer into RE string */
*sword; /* Pointer to start of word */
- int slen; /* Allocated size of RE string */
+ size_t slen; /* Allocated size of RE string */
const char *qptr, /* Pointer into query string */
*qend; /* End of current word */
const char *prefix; /* Prefix to add to next word */
int quoted; /* Word is quoted */
- int wlen; /* Word length */
+ size_t wlen; /* Word length */
char *lword; /* Last word in query */
@@ -139,7 +133,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
for (qend = qptr + 1; *qend && !isspace(*qend); qend ++);
}
- wlen = qend - qptr;
+ wlen = (size_t)(qend - qptr);
/*
* Look for logic words: AND, OR
@@ -174,7 +168,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
* string + RE overhead...
*/
- wlen = (sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11;
+ wlen = (size_t)(sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11;
if (lword)
wlen += strlen(lword);
@@ -208,7 +202,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
* Add the prefix string...
*/
- strcpy(sptr, prefix);
+ memcpy(sptr, prefix, strlen(prefix) + 1);
sptr += strlen(sptr);
/*
@@ -249,16 +243,16 @@ cgiCompileSearch(const char *query) /* I - Query string */
return (NULL);
}
- strcpy(sptr, ".*|.*");
+ memcpy(sptr, ".*|.*", 6);
sptr += 5;
- strcpy(sptr, lword2);
+ memcpy(sptr, lword2, strlen(lword2) + 1);
sptr += strlen(sptr);
- strcpy(sptr, ".*");
+ memcpy(sptr, ".*", 3);
sptr += 2;
- strcpy(sptr, lword);
+ memcpy(sptr, lword, strlen(lword) + 1);
sptr += strlen(sptr);
free(lword);
@@ -287,7 +281,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
free(lword);
if (sptr > s)
- strcpy(sptr, ".*");
+ memcpy(sptr, ".*", 3);
else
{
/*
@@ -377,5 +371,5 @@ cgiFreeSearch(void *search) /* I - Search context */
/*
- * End of "$Id: search.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: search.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cgi-bin/template.c b/cgi-bin/template.c
index 7c36c67..426e635 100644
--- a/cgi-bin/template.c
+++ b/cgi-bin/template.c
@@ -1,27 +1,16 @@
/*
- * "$Id: template.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: template.c 12700 2015-06-08 18:32:35Z msweet $"
*
- * CGI template function.
+ * CGI template function.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cgiCopyTemplateFile() - Copy a template file and replace all the
- * '{variable}' strings with the variable value.
- * cgiCopyTemplateLang() - Copy a template file using a language...
- * cgiGetTemplateDir() - Get the templates directory...
- * cgiSetServerVersion() - Set the server name and CUPS version...
- * cgi_copy() - Copy the template file, substituting as needed...
- * cgi_puts() - Put a string to the output file, quoting as
- * needed...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#include "cgi-private.h"
@@ -266,7 +255,7 @@ cgi_copy(FILE *out, /* I - Output file */
else if (s > name && ch == '?')
break;
else if (s < (name + sizeof(name) - 1))
- *s++ = ch;
+ *s++ = (char)ch;
*s = '\0';
@@ -443,7 +432,7 @@ cgi_copy(FILE *out, /* I - Output file */
* {name~refex?true:false} Regex match
*/
- op = ch;
+ op = (char)ch;
if (ch == '?')
{
@@ -486,7 +475,7 @@ cgi_copy(FILE *out, /* I - Output file */
innerptr = innername;
while ((ch = getc(in)) != EOF && ch != '}')
if (innerptr < (innername + sizeof(innername) - 1))
- *innerptr++ = ch;
+ *innerptr++ = (char)ch;
*innerptr = '\0';
if (innername[0] == '#')
@@ -498,26 +487,26 @@ cgi_copy(FILE *out, /* I - Output file */
if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL)
*s = '\0';
else
- strlcpy(s, innerval, sizeof(compare) - (s - compare));
+ strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare));
}
else if (innername[0] == '?')
{
if ((innerval = cgiGetArray(innername + 1, element)) == NULL)
*s = '\0';
else
- strlcpy(s, innerval, sizeof(compare) - (s - compare));
+ strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare));
}
else if ((innerval = cgiGetArray(innername, element)) == NULL)
- snprintf(s, sizeof(compare) - (s - compare), "{%s}", innername);
+ snprintf(s, sizeof(compare) - (size_t)(s - compare), "{%s}", innername);
else
- strlcpy(s, innerval, sizeof(compare) - (s - compare));
+ strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare));
s += strlen(s);
}
else if (ch == '\\')
- *s++ = getc(in);
+ *s++ = (char)getc(in);
else
- *s++ = ch;
+ *s++ = (char)ch;
*s = '\0';
@@ -553,7 +542,7 @@ cgi_copy(FILE *out, /* I - Output file */
if (regcomp(&re, compare, REG_EXTENDED | REG_ICASE))
{
fprintf(stderr,
- "ERROR: Unable to compile regular expresion \"%s\"!\n",
+ "ERROR: Unable to compile regular expression \"%s\"!\n",
compare);
result = 0;
}
@@ -659,39 +648,7 @@ cgi_puts(const char *s, /* I - String to output */
while (*s)
{
if (*s == '<')
- {
- /*
- * Pass <A HREF="url"> and </A>, otherwise quote it...
- */
-
- if (!_cups_strncasecmp(s, "<A HREF=\"", 9))
- {
- fputs("<A HREF=\"", out);
- s += 9;
-
- while (*s && *s != '\"')
- {
- if (*s == '&')
- fputs("&amp;", out);
- else
- putc(*s, out);
-
- s ++;
- }
-
- if (*s)
- s ++;
-
- fputs("\">", out);
- }
- else if (!_cups_strncasecmp(s, "</A>", 4))
- {
- fputs("</A>", out);
- s += 3;
- }
- else
- fputs("&lt;", out);
- }
+ fputs("&lt;", out);
else if (*s == '>')
fputs("&gt;", out);
else if (*s == '\"')
@@ -729,5 +686,5 @@ cgi_puturi(const char *s, /* I - String to output */
/*
- * End of "$Id: template.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: template.c 12700 2015-06-08 18:32:35Z msweet $".
*/
diff --git a/cgi-bin/testcgi.c b/cgi-bin/testcgi.c
index e59986a..61d3296 100644
--- a/cgi-bin/testcgi.c
+++ b/cgi-bin/testcgi.c
@@ -1,21 +1,16 @@
/*
- * "$Id: testcgi.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testcgi.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * CGI test program for CUPS.
+ * CGI test program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Test the help index code.
- * list_nodes() - List nodes in an array...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -30,8 +25,7 @@
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
/*
* Test file upload/multi-part submissions...
@@ -71,5 +65,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: testcgi.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testcgi.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cgi-bin/testhi.c b/cgi-bin/testhi.c
index a257b70..9feed6b 100644
--- a/cgi-bin/testhi.c
+++ b/cgi-bin/testhi.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testhi.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testhi.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Help index test program for CUPS.
*
@@ -109,5 +109,5 @@ list_nodes(const char *title, /* I - Title string */
/*
- * End of "$Id: testhi.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testhi.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/testtemplate.c b/cgi-bin/testtemplate.c
index 979296e..c479b3a 100644
--- a/cgi-bin/testtemplate.c
+++ b/cgi-bin/testtemplate.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testtemplate.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testtemplate.c 10996 2013-05-29 11:51:34Z msweet $"
*
* CGI template test program for CUPS.
*
@@ -99,5 +99,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: testtemplate.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testtemplate.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cgi-bin/var.c b/cgi-bin/var.c
index c124778..017de1e 100644
--- a/cgi-bin/var.c
+++ b/cgi-bin/var.c
@@ -1,49 +1,20 @@
/*
- * "$Id: var.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: var.c 12621 2015-05-06 21:32:18Z msweet $"
*
- * CGI form variable and array functions for CUPS.
+ * CGI form variable and array functions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cgiCheckVariables() - Check for the presence of "required"
- * variables.
- * cgiClearVariables() - Clear all form variables.
- * cgiGetArray() - Get an element from a form array.
- * cgiGetCookie() - Get a cookie value.
- * cgiGetFile() - Get the file (if any) that was submitted in
- * the form.
- * cgiGetSize() - Get the size of a form array value.
- * cgiGetVariable() - Get a CGI variable from the database.
- * cgiInitialize() - Initialize the CGI variable "database".
- * cgiIsPOST() - Determine whether this page was POSTed.
- * cgiSetArray() - Set array element N to the specified string.
- * cgiSetCookie() - Set a cookie value.
- * cgiSetSize() - Set the array size.
- * cgiSetVariable() - Set a CGI variable in the database.
- * cgi_add_variable() - Add a form variable.
- * cgi_compare_variables() - Compare two variables.
- * cgi_find_variable() - Find a variable.
- * cgi_initialize_cookies() - Initialize cookies.
- * cgi_initialize_get() - Initialize form variables using the GET
- * method.
- * cgi_initialize_multipart() - Initialize variables and file using the POST
- * method.
- * cgi_initialize_post() - Initialize variables using the POST method.
- * cgi_initialize_string() - Initialize form variables from a string.
- * cgi_passwd() - Catch authentication requests and notify the
- * server.
- * cgi_set_sid() - Set the CUPS session ID.
- * cgi_sort_variables() - Sort all form variables for faster lookup.
- * cgi_unlink_file() - Remove the uploaded form.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ */
+
+/*
+ * Include necessary headers...
*/
/*#define DEBUG*/
@@ -417,7 +388,7 @@ cgiSetArray(const char *name, /* I - Name of variable */
const char **temp; /* Temporary pointer */
temp = (const char **)realloc((void *)(var->values),
- sizeof(char *) * (element + 16));
+ sizeof(char *) * (size_t)(element + 16));
if (!temp)
return;
@@ -466,9 +437,9 @@ cgiSetCookie(const char *name, /* I - Name */
printf(" expires=%s;", httpGetDateString2(expires, date, sizeof(date)));
}
if (secure)
- puts(" secure;");
+ puts(" httponly; secure;");
else
- putchar('\n');
+ puts(" httponly;");
}
@@ -495,7 +466,7 @@ cgiSetSize(const char *name, /* I - Name of variable */
const char **temp; /* Temporary pointer */
temp = (const char **)realloc((void *)(var->values),
- sizeof(char *) * (size + 16));
+ sizeof(char *) * (size_t)(size + 16));
if (!temp)
return;
@@ -581,7 +552,7 @@ cgi_add_variable(const char *name, /* I - Variable name */
if (form_alloc == 0)
temp_vars = malloc(sizeof(_cgi_var_t) * 16);
else
- temp_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
+ temp_vars = realloc(form_vars, (size_t)(form_alloc + 16) * sizeof(_cgi_var_t));
if (!temp_vars)
return;
@@ -592,7 +563,7 @@ cgi_add_variable(const char *name, /* I - Variable name */
var = form_vars + form_count;
- if ((var->values = calloc(element + 1, sizeof(char *))) == NULL)
+ if ((var->values = calloc((size_t)element + 1, sizeof(char *))) == NULL)
return;
var->name = _cupsStrAlloc(name);
@@ -632,7 +603,7 @@ cgi_find_variable(const char *name) /* I - Name of variable */
key.name = name;
- return ((_cgi_var_t *)bsearch(&key, form_vars, form_count, sizeof(_cgi_var_t),
+ return ((_cgi_var_t *)bsearch(&key, form_vars, (size_t)form_count, sizeof(_cgi_var_t),
(int (*)(const void *, const void *))cgi_compare_variables));
}
@@ -655,6 +626,8 @@ cgi_initialize_cookies(void)
while (*cookie)
{
+ int skip = 0; /* Skip this cookie? */
+
/*
* Skip leading whitespace...
*/
@@ -670,9 +643,14 @@ cgi_initialize_cookies(void)
for (ptr = name; *cookie && *cookie != '=';)
if (ptr < (name + sizeof(name) - 1))
+ {
*ptr++ = *cookie++;
+ }
else
- break;
+ {
+ skip = 1;
+ cookie ++;
+ }
if (*cookie != '=')
break;
@@ -688,26 +666,38 @@ cgi_initialize_cookies(void)
{
for (cookie ++, ptr = value; *cookie && *cookie != '\"';)
if (ptr < (value + sizeof(value) - 1))
+ {
*ptr++ = *cookie++;
+ }
else
- break;
+ {
+ skip = 1;
+ cookie ++;
+ }
if (*cookie == '\"')
cookie ++;
+ else
+ skip = 1;
}
else
{
for (ptr = value; *cookie && *cookie != ';';)
if (ptr < (value + sizeof(value) - 1))
+ {
*ptr++ = *cookie++;
+ }
else
- break;
+ {
+ skip = 1;
+ cookie ++;
+ }
}
if (*cookie == ';')
cookie ++;
else if (*cookie)
- break;
+ skip = 1;
*ptr = '\0';
@@ -716,7 +706,7 @@ cgi_initialize_cookies(void)
* "$"...
*/
- if (name[0] != '$')
+ if (name[0] != '$' && !skip)
num_cookies = cupsAddOption(name, value, num_cookies, &cookies);
}
}
@@ -769,8 +759,8 @@ cgi_initialize_multipart(
*ptr, /* Pointer into name/filename */
*end; /* End of buffer */
int ch, /* Character from file */
- fd, /* Temporary file descriptor */
- blen; /* Length of boundary string */
+ fd; /* Temporary file descriptor */
+ size_t blen; /* Length of boundary string */
DEBUG_printf(("cgi_initialize_multipart(boundary=\"%s\")\n", boundary));
@@ -835,22 +825,22 @@ cgi_initialize_multipart(
while ((ch = getchar()) != EOF)
{
- *ptr++ = ch;
+ *ptr++ = (char)ch;
- if ((ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
+ if ((size_t)(ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
{
ptr -= blen;
break;
}
- if ((ptr - line - blen) >= 8192)
+ if ((ptr - line - (int)blen) >= 8192)
{
/*
* Write out the first 8k of the buffer...
*/
write(fd, line, 8192);
- memmove(line, line + 8192, ptr - line - 8192);
+ memmove(line, line + 8192, (size_t)(ptr - line - 8192));
ptr -= 8192;
}
}
@@ -860,7 +850,7 @@ cgi_initialize_multipart(
*/
if (ptr > line)
- write(fd, line, ptr - line);
+ write(fd, line, (size_t)(ptr - line));
close(fd);
}
@@ -877,9 +867,9 @@ cgi_initialize_multipart(
while ((ch = getchar()) != EOF)
{
if (ptr < end)
- *ptr++ = ch;
+ *ptr++ = (char)ch;
- if ((ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
+ if ((size_t)(ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
{
ptr -= blen;
break;
@@ -979,12 +969,12 @@ cgi_initialize_multipart(
static int /* O - 1 if form data was read */
cgi_initialize_post(void)
{
- char *content_length, /* Length of input data (string) */
- *data; /* Pointer to form data string */
- int length, /* Length of input data */
- nbytes, /* Number of bytes read this read() */
- tbytes, /* Total number of bytes read */
- status; /* Return status */
+ char *content_length, /* Length of input data (string) */
+ *data; /* Pointer to form data string */
+ size_t length, /* Length of input data */
+ tbytes; /* Total number of bytes read */
+ ssize_t nbytes; /* Number of bytes read this read() */
+ int status; /* Return status */
DEBUG_puts("cgi_initialize_post: Initializing variables using POST method...");
@@ -1001,7 +991,7 @@ cgi_initialize_post(void)
* Get the length of the input stream and allocate a buffer for it...
*/
- length = atoi(content_length);
+ length = (size_t)strtol(content_length, NULL, 10);
data = malloc(length + 1);
if (data == NULL)
@@ -1011,8 +1001,8 @@ cgi_initialize_post(void)
* Read the data into the buffer...
*/
- for (tbytes = 0; tbytes < length; tbytes += nbytes)
- if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0)
+ for (tbytes = 0; tbytes < length; tbytes += (size_t)nbytes)
+ if ((nbytes = read(0, data + tbytes, (size_t)(length - tbytes))) < 0)
{
if (errno != EAGAIN)
{
@@ -1126,7 +1116,7 @@ cgi_initialize_string(const char *data) /* I - Form data string */
ch = *data - '0';
if (ch > 9)
ch -= 7;
- *s = ch << 4;
+ *s = (char)(ch << 4);
data ++;
ch = *data - '0';
@@ -1264,7 +1254,7 @@ cgi_sort_variables(void)
if (form_count < 2)
return;
- qsort(form_vars, form_count, sizeof(_cgi_var_t),
+ qsort(form_vars, (size_t)form_count, sizeof(_cgi_var_t),
(int (*)(const void *, const void *))cgi_compare_variables);
#ifdef DEBUG
@@ -1307,5 +1297,5 @@ cgi_unlink_file(void)
/*
- * End of "$Id: var.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: var.c 12621 2015-05-06 21:32:18Z msweet $".
*/
diff --git a/cgi-bin/websearch.c b/cgi-bin/websearch.c
deleted file mode 100644
index 91ed4b1..0000000
--- a/cgi-bin/websearch.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * "$Id: websearch.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * Web search program for www.cups.org.
- *
- * Copyright 2007-2009 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Usage:
- *
- * websearch directory "search string"
- *
- * Contents:
- *
- * main() - Search a directory of help files.
- * list_nodes() - List matching nodes.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "cgi.h"
-
-
-/*
- * Local functions...
- */
-
-static void list_nodes(help_index_t *hi, const char *title,
- cups_array_t *nodes);
-
-
-/*
- * 'main()' - Test the help index code.
- */
-
-int /* O - Exit status */
-main(int argc, /* I - Number of command-line args */
- char *argv[]) /* I - Command-line arguments */
-{
- help_index_t *hi, /* Help index */
- *search; /* Search index */
- char indexname[1024]; /* Name of index file */
-
-
- if (argc != 3)
- {
- puts("Usage: websearch directory \"search terms\"");
- return (1);
- }
-
- /*
- * Load the help index...
- */
-
- snprintf(indexname, sizeof(indexname), "%s/.index", argv[1]);
- hi = helpLoadIndex(indexname, argv[1]);
-
- /*
- * Do any searches...
- */
-
- search = helpSearchIndex(hi, argv[2], NULL, NULL);
-
- if (search)
- list_nodes(hi, argv[1], search->sorted);
-
- /*
- * Return with no errors...
- */
-
- return (0);
-}
-
-
-/*
- * 'list_nodes()' - List nodes in an array...
- */
-
-static void
-list_nodes(help_index_t *hi, /* I - Help index */
- const char *title, /* I - Title string */
- cups_array_t *nodes) /* I - Nodes */
-{
- help_node_t *node, /* Current node */
- *file; /* File node */
-
-
- printf("%d\n", cupsArrayCount(nodes));
- for (node = (help_node_t *)cupsArrayFirst(nodes);
- node;
- node = (help_node_t *)cupsArrayNext(nodes))
- {
- if (node->anchor)
- {
- file = helpFindNode(hi, node->filename, NULL);
- printf("%d|%s#%s|%s|%s\n", node->score, node->filename, node->anchor,
- node->text, file ? file->text : node->filename);
- }
- else
- printf("%d|%s|%s|%s\n", node->score, node->filename, node->text,
- node->text);
- }
-}
-
-
-/*
- * End of "$Id: websearch.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/conf/Makefile b/conf/Makefile
index 1235324..933d7d9 100644
--- a/conf/Makefile
+++ b/conf/Makefile
@@ -1,9 +1,9 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12533 2015-02-27 12:30:26Z msweet $"
#
# Configuration file makefile for CUPS.
#
-# Copyright 2007-2011 by Apple Inc.
+# Copyright 2007-2015 by Apple Inc.
# Copyright 1993-2006 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
@@ -76,8 +76,8 @@ install-data:
else \
$(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \
fi ; \
+ $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.default; \
done
- $(INSTALL_CONFIG) -g $(CUPS_GROUP) cupsd.conf $(SERVERROOT)/cupsd.conf.default
$(INSTALL_DIR) -m 755 $(DATADIR)/mime
for file in $(REPLACE); do \
if test -r $(DATADIR)/mime/$$file ; then \
@@ -139,5 +139,5 @@ uninstall:
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12533 2015-02-27 12:30:26Z msweet $".
#
diff --git a/conf/cups-files.conf.in b/conf/cups-files.conf.in
index d7e88b3..4a78ba6 100644
--- a/conf/cups-files.conf.in
+++ b/conf/cups-files.conf.in
@@ -1,7 +1,5 @@
#
-# "$Id: cups-files.conf.in 11221 2013-08-06 16:16:01Z msweet $"
-#
-# Sample file/directory/user/group configuration file for the CUPS scheduler.
+# File/directory/user/group configuration file for the CUPS scheduler.
# See "man cups-files.conf" for a complete description of this file.
#
@@ -17,6 +15,7 @@
#Group @CUPS_GROUP@
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
+# This cannot contain the Group value for security reasons...
SystemGroup @CUPS_SYSTEM_GROUPS@
@CUPS_SYSTEM_AUTHKEY@
@@ -76,11 +75,8 @@ PageLog @CUPS_LOGDIR@/page_log
# Location of helper programs...
#ServerBin @CUPS_SERVERBIN@
-# SSL/TLS certificate for the scheduler...
-#ServerCertificate @CUPS_SERVERCERT@
-
-# SSL/TLS private key for the scheduler...
-#ServerKey @CUPS_SERVERKEY@
+# SSL/TLS keychain for the scheduler...
+#ServerKeychain @CUPS_SERVERKEYCHAIN@
# Location of other configuration files...
#ServerRoot @CUPS_SERVERROOT@
@@ -95,7 +91,3 @@ PageLog @CUPS_LOGDIR@/page_log
# scheduler startup and cannot be one of the standard (public) temporary
# directory locations for security reasons...
#TempDir @CUPS_REQUESTS@/tmp
-
-#
-# End of "$Id: cups-files.conf.in 11221 2013-08-06 16:16:01Z msweet $".
-#
diff --git a/conf/cupsd.conf.in b/conf/cupsd.conf.in
index 9fe0365..2fd0de0 100644
--- a/conf/cupsd.conf.in
+++ b/conf/cupsd.conf.in
@@ -1,13 +1,12 @@
#
-# "$Id: cupsd.conf.in 11173 2013-07-23 12:31:34Z msweet $"
-#
-# Sample configuration file for the CUPS scheduler. See "man cupsd.conf" for a
+# Configuration file for the CUPS scheduler. See "man cupsd.conf" for a
# complete description of this file.
#
# Log general information in error_log - change "@CUPS_LOG_LEVEL@" to "debug"
# for troubleshooting...
LogLevel @CUPS_LOG_LEVEL@
+@CUPS_PAGE_LOG_FORMAT@
# Only listen for connections from the local machine.
Listen localhost:@DEFAULT_IPP_PORT@
@@ -40,6 +39,13 @@ WebInterface @CUPS_WEBIF@
Order allow,deny
</Location>
+# Restrict access to log files...
+<Location /admin/log>
+ AuthType Default
+ Require user @SYSTEM
+ Order allow,deny
+</Location>
+
# Set the default printer/job policies...
<Policy default>
# Job/subscription privacy...
@@ -128,7 +134,3 @@ WebInterface @CUPS_WEBIF@
Order deny,allow
</Limit>
</Policy>
-
-#
-# End of "$Id: cupsd.conf.in 11173 2013-07-23 12:31:34Z msweet $".
-#
diff --git a/conf/mime.convs.in b/conf/mime.convs.in
index d6bebf8..0685b19 100644
--- a/conf/mime.convs.in
+++ b/conf/mime.convs.in
@@ -1,5 +1,5 @@
#
-# "$Id: mime.convs.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: mime.convs.in 11025 2013-06-07 01:00:33Z msweet $"
#
# DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW
# VERSIONS OF CUPS. Instead, create a "local.convs" file that
@@ -59,5 +59,5 @@ application/vnd.cups-raster image/pwg-raster 100 rastertopwg
@DEFAULT_RAW_PRINTING@application/octet-stream application/vnd.cups-raw 0 -
#
-# End of "$Id: mime.convs.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: mime.convs.in 11025 2013-06-07 01:00:33Z msweet $".
#
diff --git a/conf/mime.types b/conf/mime.types
index 217d75b..dcb0771 100644
--- a/conf/mime.types
+++ b/conf/mime.types
@@ -1,20 +1,20 @@
#
# "$Id: mime.types 7670 2008-06-17 22:42:08Z mike $"
#
-# Base MIME types file for CUPS.
+# Base MIME types file for CUPS.
#
-# DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW
-# VERSIONS OF CUPS. Instead, create a "local.types" file that
-# reflects your local configuration changes.
+# DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW
+# VERSIONS OF CUPS. Instead, create a "local.types" file that
+# reflects your local configuration changes.
#
-# Copyright 2007-2011 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
########################################################################
@@ -37,6 +37,7 @@
# 100=default, 200=highest)
# printable(offset,length) True if bytes are printable 8-bit chars
# (CR, NL, TAB, BS, 32-126, 128-254)
+# regex(offset,"regex") True if bytes match regular expression
# string(offset,"string") True if bytes are identical to string
# istring(offset,"string") True if bytes are identical to
# case-insensitive string
@@ -70,7 +71,7 @@
#
#application/msword doc string(0,<D0CF11E0A1B11AE1>)
-application/pdf pdf string(0,%PDF)
+application/pdf pdf regex(0,^[\n\r]*%PDF)
application/postscript ai eps ps string(0,%!) string(0,<04>%!) \
contains(0,128,<1B>%-12345X) + \
(contains(0,4096,"LANGUAGE=POSTSCRIPT") \
@@ -80,6 +81,13 @@ application/postscript ai eps ps string(0,%!) string(0,<04>%!) \
(contains(0,4096,<0a>%!) + \
!contains(0,4096,"ENTER LANGUAGE")))
+application/g-code gcode
+application/sla stl string(0,"solid ") + contains(0,4096,"facet") + contains(0,4096,"vertex")
+application/vnd.makerbot-s3g x3g
+model/amf amf
+model/vnd.collada+xml dae
+
+
########################################################################
#
# Image files...
@@ -92,7 +100,7 @@ image/jpeg jpeg jpg jpe string(0,<FFD8FF>) +\
char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
-image/pwg-raster string(0,"RaS2") + string(4,PwgRaster<00>) priority(100)
+image/pwg-raster string(0,"RaS2") + string(4,PwgRaster<00>) priority(150)
image/tiff tiff tif string(0,MM<002A>) string(0,II<2A00>)
image/x-photocd pcd string(2048,PCD_IPI)
image/x-portable-anymap pnm
@@ -123,7 +131,7 @@ application/x-shell sh printable(0,1024) + string(0,#!) +\
(contains(2,80,/bash) contains(2,80,/ksh)\
contains(2,80,/sh) contains(2,80,/zsh))
application/x-csource c cxx cpp cc C h hpp \
- printable(0,1024) + \
+ printable(0,1024) + ! css + \
(string(0,/*) string(0,//)
string(0,#include) contains(0,1024,<0a>#include) \
string(0,#define) contains(0,1024,<0a>#define))
@@ -152,7 +160,7 @@ 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") \
- string(0,"RaS2") string(0,"2SaR") \
+ (string(0,"RaS2") + !string(4,PwgRaster<00>)) string(0,"2SaR") \
string(0,"RaS3") string(0,"3SaR")
application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
string(0,<1B>@) \
diff --git a/conf/snmp.conf.in b/conf/snmp.conf.in
index 5d7d52c..23a5bab 100644
--- a/conf/snmp.conf.in
+++ b/conf/snmp.conf.in
@@ -1,13 +1,7 @@
#
-# "$Id: snmp.conf.in 11173 2013-07-23 12:31:34Z msweet $"
-#
-# Sample SNMP configuration file for CUPS. See "man cups-snmp.conf" for a
-# complete description of this file.
+# SNMP configuration file for CUPS. See "man cups-snmp.conf" for a complete
+# description of this file.
#
@CUPS_SNMP_ADDRESS@
@CUPS_SNMP_COMMUNITY@
-
-#
-# End of "$Id: snmp.conf.in 11173 2013-07-23 12:31:34Z msweet $".
-#
diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4
index 06e675a..38a7af6 100644
--- a/config-scripts/cups-common.m4
+++ b/config-scripts/cups-common.m4
@@ -1,30 +1,38 @@
dnl
-dnl "$Id: cups-common.m4 8781 2009-08-28 17:34:54Z mike $"
+dnl "$Id: cups-common.m4 12852 2015-08-28 13:29:21Z msweet $"
dnl
-dnl Common configuration stuff for CUPS.
+dnl Common configuration stuff for CUPS.
dnl
-dnl Copyright 2007-2013 by Apple Inc.
-dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
-dnl We need at least autoconf 2.60...
-AC_PREREQ(2.60)
-
dnl Set the name of the config header file...
AC_CONFIG_HEADER(config.h)
dnl Version number information...
-CUPS_VERSION=1.6.4
-CUPS_REVISION=
-#if test -z "$CUPS_REVISION" -a -d .svn; then
-# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
-#fi
+CUPS_VERSION=2.1.2
+
+case "$CUPS_VERSION" in
+ *svn)
+ if test -z "$CUPS_REVISION" -a -d .svn; then
+ CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
+ else
+ CUPS_REVISION=""
+ fi
+ ;;
+
+ *)
+ CUPS_REVISION=""
+ ;;
+esac
+
CUPS_BUILD="cups-$CUPS_VERSION"
AC_ARG_WITH(cups_build, [ --with-cups-build set "cups-config --build" string ],
@@ -33,8 +41,8 @@ AC_ARG_WITH(cups_build, [ --with-cups-build set "cups-config --build" str
AC_SUBST(CUPS_VERSION)
AC_SUBST(CUPS_REVISION)
AC_SUBST(CUPS_BUILD)
-AC_DEFINE_UNQUOTED(CUPS_SVERSION, "CUPS v$CUPS_VERSION$CUPS_REVISION")
-AC_DEFINE_UNQUOTED(CUPS_MINIMAL, "CUPS/$CUPS_VERSION$CUPS_REVISION")
+AC_DEFINE_UNQUOTED(CUPS_SVERSION, "AC_PACKAGE_NAME v$CUPS_VERSION$CUPS_REVISION")
+AC_DEFINE_UNQUOTED(CUPS_MINIMAL, "AC_PACKAGE_NAME/$CUPS_VERSION$CUPS_REVISION")
dnl Default compiler flags...
CFLAGS="${CFLAGS:=}"
@@ -89,7 +97,7 @@ fi
AC_SUBST(INSTALLSTATIC)
dnl Check for pkg-config, which is used for some other tests later on...
-AC_PATH_PROG(PKGCONFIG, pkg-config)
+AC_PATH_TOOL(PKGCONFIG, pkg-config)
dnl Check for libraries...
AC_SEARCH_LIBS(abs, m, AC_DEFINE(HAVE_ABS))
@@ -134,11 +142,10 @@ AC_CHECK_HEADER(stdint.h,AC_DEFINE(HAVE_STDINT_H))
AC_CHECK_HEADER(string.h,AC_DEFINE(HAVE_STRING_H))
AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H))
AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H))
-AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H))
AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H))
AC_CHECK_HEADER(sys/param.h,AC_DEFINE(HAVE_SYS_PARAM_H))
AC_CHECK_HEADER(sys/ucred.h,AC_DEFINE(HAVE_SYS_UCRED_H))
-AC_CHECK_HEADER(scsi/sg.h,AC_DEFINE(HAVE_SCSI_SG_H))
+AC_CHECK_HEADER(asl.h,AC_DEFINE(HAVE_ASL_H))
dnl Checks for iconv.h and iconv_open
AC_CHECK_HEADER(iconv.h,
@@ -147,6 +154,9 @@ AC_CHECK_HEADER(iconv.h,
AC_SEARCH_LIBS(iconv_open,iconv,
AC_DEFINE(HAVE_ICONV_H)
SAVELIBS="$SAVELIBS $LIBS")
+ AC_SEARCH_LIBS(libiconv_open,iconv,
+ AC_DEFINE(HAVE_ICONV_H)
+ SAVELIBS="$SAVELIBS $LIBS")
LIBS="$SAVELIBS")
dnl Checks for Mini-XML (www.minixml.org)...
@@ -202,6 +212,9 @@ AC_CHECK_FUNCS(sigaction)
dnl Checks for wait functions.
AC_CHECK_FUNCS(waitpid wait3)
+dnl Check for posix_spawn
+AC_CHECK_FUNCS(posix_spawn)
+
dnl See if the tm structure has the tm_gmtoff member...
AC_MSG_CHECKING(for tm_gmtoff member in tm structure)
AC_TRY_COMPILE([#include <time.h>],[struct tm t;
@@ -230,7 +243,7 @@ AC_SUBST(LIBUSB)
AC_SUBST(USBQUIRKS)
if test "x$PKGCONFIG" != x; then
- if test x$enable_libusb = xyes -o $uname != Darwin; then
+ if test x$enable_libusb != xno -a $uname != Darwin; then
AC_MSG_CHECKING(for libusb-1.0)
if $PKGCONFIG --exists libusb-1.0; then
AC_MSG_RESULT(yes)
@@ -240,6 +253,9 @@ if test "x$PKGCONFIG" != x; then
USBQUIRKS="\$(DATADIR)/usb"
else
AC_MSG_RESULT(no)
+ if test x$enable_libusb = xyes; then
+ AC_MSG_ERROR(libusb required for --enable-libusb.)
+ fi
fi
fi
elif test x$enable_libusb = xyes; then
@@ -267,6 +283,7 @@ AC_CHECK_HEADER(zlib.h,
AC_DEFINE(HAVE_LIBZ)
LIBZ="-lz"
LIBS="$LIBS -lz"
+ AC_CHECK_LIB(z, inflateCopy, AC_DEFINE(HAVE_INFLATECOPY))
if test "x$GZIP" != z; then
INSTALL_GZIP="-z"
fi))
@@ -302,20 +319,15 @@ fi
LIBS="$SAVELIBS"
dnl Check for DBUS support
-if test -d /etc/dbus-1; then
- DBUSDIR="/etc/dbus-1"
-else
- DBUSDIR=""
-fi
-
-AC_ARG_ENABLE(dbus, [ --enable-dbus build with DBUS support])
+AC_ARG_ENABLE(dbus, [ --disable-dbus build without DBUS support])
AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory ],
DBUSDIR="$withval")
+DBUSDIR=""
DBUS_NOTIFIER=""
DBUS_NOTIFIERLIBS=""
-if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
+if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$uname" != xDarwin; then
AC_MSG_CHECKING(for DBUS)
if $PKGCONFIG --exists dbus-1; then
AC_MSG_RESULT(yes)
@@ -328,7 +340,12 @@ if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
LIBS="$LIBS $DBUS_NOTIFIERLIBS"
AC_CHECK_FUNC(dbus_message_iter_init_append,
AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND))
+ AC_CHECK_FUNC(dbus_threads_init,
+ AC_DEFINE(HAVE_DBUS_THREADS_INIT))
LIBS="$SAVELIBS"
+ if test -d /etc/dbus-1; then
+ DBUSDIR="/etc/dbus-1"
+ fi
else
AC_MSG_RESULT(no)
fi
@@ -355,7 +372,6 @@ case $uname in
AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H))
AC_CHECK_HEADER(CoreFoundation/CFPriv.h,AC_DEFINE(HAVE_CFPRIV_H))
AC_CHECK_HEADER(CoreFoundation/CFBundlePriv.h,AC_DEFINE(HAVE_CFBUNDLEPRIV_H))
- AC_CHECK_HEADER(IOKit/pwr_mgt/IOPMLibPrivate.h,AC_DEFINE(HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H))
dnl Check for dynamic store function...
AC_CHECK_FUNCS(SCDynamicStoreCopyComputerName)
@@ -365,9 +381,6 @@ case $uname in
AC_CHECK_HEADER(membershipPriv.h,AC_DEFINE(HAVE_MEMBERSHIPPRIV_H))
AC_CHECK_FUNCS(mbr_uid_to_uuid)
- dnl Check for the vproc_transaction_begin/end stuff...
- AC_CHECK_FUNCS(vproc_transaction_begin)
-
dnl Need <dlfcn.h> header...
AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H))
@@ -461,5 +474,5 @@ esac
AC_SUBST(BUILDDIRS)
dnl
-dnl End of "$Id: cups-common.m4 8781 2009-08-28 17:34:54Z mike $".
+dnl End of "$Id: cups-common.m4 12852 2015-08-28 13:29:21Z msweet $".
dnl
diff --git a/config-scripts/cups-compiler.m4 b/config-scripts/cups-compiler.m4
index 4286895..b911877 100644
--- a/config-scripts/cups-compiler.m4
+++ b/config-scripts/cups-compiler.m4
@@ -1,16 +1,16 @@
dnl
-dnl "$Id: cups-compiler.m4 7871 2008-08-27 21:12:43Z mike $"
+dnl "$Id: cups-compiler.m4 12742 2015-06-23 14:48:53Z msweet $"
dnl
-dnl Compiler stuff for CUPS.
+dnl Compiler stuff for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
-dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2014 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
dnl Clear the debugging and non-shared library options unless the user asks
@@ -103,57 +103,89 @@ if test -n "$GCC"; then
fi
# Generate position-independent code as needed...
- if test $PICFLAG = 1 -a $uname != AIX; then
+ if test $PICFLAG = 1; then
OPTIM="-fPIC $OPTIM"
fi
# The -fstack-protector option is available with some versions of
# GCC and adds "stack canaries" which detect when the return address
# has been overwritten, preventing many types of exploit attacks.
- AC_MSG_CHECKING(if GCC supports -fstack-protector)
+ AC_MSG_CHECKING(whether compiler supports -fstack-protector)
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fstack-protector"
AC_TRY_LINK(,,
- OPTIM="$OPTIM -fstack-protector"
+ if test "x$LSB_BUILD" = xy; then
+ # Can't use stack-protector with LSB binaries...
+ OPTIM="$OPTIM -fno-stack-protector"
+ else
+ OPTIM="$OPTIM -fstack-protector"
+ fi
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))
CFLAGS="$OLDCFLAGS"
- # The -fPIE option is available with some versions of GCC and adds
- # randomization of addresses, which avoids another class of exploits
- # that depend on a fixed address for common functions.
- AC_MSG_CHECKING(if GCC supports -fPIE)
- OLDCFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fPIE"
- AC_TRY_COMPILE(,,
- [case "$CC" in
- *clang)
- PIEFLAGS="-fPIE -Wl,-pie"
+ if test "x$LSB_BUILD" != xy; then
+ # The -fPIE option is available with some versions of GCC and
+ # adds randomization of addresses, which avoids another class of
+ # exploits that depend on a fixed address for common functions.
+ #
+ # Not available to LSB binaries...
+ AC_MSG_CHECKING(whether compiler supports -fPIE)
+ OLDCFLAGS="$CFLAGS"
+ case "$uname" in
+ Darwin*)
+ CFLAGS="$CFLAGS -fPIE -Wl,-pie"
+ AC_TRY_COMPILE(,,[
+ PIEFLAGS="-fPIE -Wl,-pie"
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
;;
+
*)
- PIEFLAGS="-fPIE -pie"
+ CFLAGS="$CFLAGS -fPIE -pie"
+ AC_TRY_COMPILE(,,[
+ PIEFLAGS="-fPIE -pie"
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
;;
esac
- AC_MSG_RESULT(yes)],
- AC_MSG_RESULT(no))
- CFLAGS="$OLDCFLAGS"
+ CFLAGS="$OLDCFLAGS"
+ fi
if test "x$with_optim" = x; then
# Add useful warning options for tracking down problems...
OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM"
+ AC_MSG_CHECKING(whether compiler supports -Wno-unused-result)
+ OLDCFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-unused-result"
+ AC_TRY_COMPILE(,,
+ [OPTIM="$OPTIM -Wno-unused-result"
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+ CFLAGS="$OLDCFLAGS"
+
+ AC_MSG_CHECKING(whether compiler supports -Wsign-conversion)
+ OLDCFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wsign-conversion"
+ AC_TRY_COMPILE(,,
+ [OPTIM="$OPTIM -Wsign-conversion"
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+ CFLAGS="$OLDCFLAGS"
+
+ AC_MSG_CHECKING(whether compiler supports -Wno-tautological-compare)
+ OLDCFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
+ AC_TRY_COMPILE(,,
+ [OPTIM="$OPTIM -Wno-tautological-compare"
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+ CFLAGS="$OLDCFLAGS"
+
# Additional warning options for development testing...
if test -d .svn; then
- OPTIM="-Wshadow -Werror $OPTIM"
- else
- AC_MSG_CHECKING(if GCC supports -Wno-tautological-compare)
- OLDCFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
- AC_TRY_COMPILE(,,
- [OPTIM="$OPTIM -Wno-tautological-compare"
- AC_MSG_RESULT(yes)],
- AC_MSG_RESULT(no))
- CFLAGS="$OLDCFLAGS"
+ OPTIM="-Werror $OPTIM"
fi
fi
@@ -171,60 +203,13 @@ if test -n "$GCC"; then
# The -z relro option is provided by the Linux linker command to
# make relocatable data read-only.
if test x$enable_relro = xyes; then
- RELROFLAGS="-Wl,-z,relro"
+ RELROFLAGS="-Wl,-z,relro,-z,now"
fi
;;
esac
else
# Add vendor-specific compiler options...
case $uname in
- AIX*)
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O2 -qmaxmem=6000"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
- ;;
- HP-UX*)
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="+O2"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
-
- CFLAGS="-Ae $CFLAGS"
-
- if test $PICFLAG = 1; then
- OPTIM="+z $OPTIM"
- fi
- ;;
- IRIX)
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O2"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
-
- if test "x$with_optim" = x; then
- OPTIM="-fullwarn -woff 1183,1209,1349,1506,3201 $OPTIM"
- fi
- ;;
- OSF*)
- # Tru64 UNIX aka Digital UNIX aka OSF/1
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O"
- else
- OPTIM="$with_optim"
- fi
- fi
- ;;
SunOS*)
# Solaris
if test -z "$OPTIM"; then
@@ -239,26 +224,12 @@ else
OPTIM="-KPIC $OPTIM"
fi
;;
- UNIX_SVR*)
- # UnixWare
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
-
- if test $PICFLAG = 1; then
- OPTIM="-KPIC $OPTIM"
- fi
- ;;
*)
# Running some other operating system; inform the user they
# should contribute the necessary options to
# cups-support@cups.org...
echo "Building CUPS with default compiler optimizations; contact"
- echo "cups-bugs@cups.org with uname and compiler options needed"
+ echo "cups-devel@cups.org with uname and compiler options needed"
echo "for your platform, or set the CFLAGS and LDFLAGS environment"
echo "variables before running configure."
;;
@@ -267,33 +238,13 @@ fi
# Add general compiler options per platform...
case $uname in
- HP-UX*)
- # HP-UX 10.20 (at least) needs this definition to get the
- # h_errno global...
- OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED"
-
- # HP-UX 11.00 (at least) needs this definition to get the
- # u_short type used by the IP headers...
- OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE"
-
- # HP-UX 11.23 (at least) needs this definition to get the
- # IPv6 header to work...
- OPTIM="$OPTIM -D_HPUX_SOURCE"
- ;;
-
Linux*)
# glibc 2.8 and higher breaks peer credentials unless you
# define _GNU_SOURCE...
OPTIM="$OPTIM -D_GNU_SOURCE"
;;
-
- OSF*)
- # Tru64 UNIX aka Digital UNIX aka OSF/1 need to be told
- # to be POSIX-compliant...
- OPTIM="$OPTIM -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE"
- ;;
esac
dnl
-dnl End of "$Id: cups-compiler.m4 7871 2008-08-27 21:12:43Z mike $".
+dnl End of "$Id: cups-compiler.m4 12742 2015-06-23 14:48:53Z msweet $".
dnl
diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4
index 173cfea..432a927 100644
--- a/config-scripts/cups-defaults.m4
+++ b/config-scripts/cups-defaults.m4
@@ -1,9 +1,9 @@
dnl
-dnl "$Id: cups-defaults.m4 7959 2008-09-17 19:30:58Z mike $"
+dnl "$Id: cups-defaults.m4 12846 2015-08-26 18:26:22Z msweet $"
dnl
dnl Default cupsd configuration settings for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
+dnl Copyright 2007-2015 by Apple Inc.
dnl Copyright 2006-2007 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -78,12 +78,21 @@ AC_SUBST(CUPS_LOG_LEVEL)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LOG_LEVEL, "$CUPS_LOG_LEVEL")
dnl Default AccessLogLevel
-AC_ARG_WITH(access_log_level, [ --with-access-log-level set default AccessLogLevel value, default=actions],
+AC_ARG_WITH(access_log_level, [ --with-access-log-level set default AccessLogLevel value, default=none],
CUPS_ACCESS_LOG_LEVEL="$withval",
- CUPS_ACCESS_LOG_LEVEL="actions")
+ CUPS_ACCESS_LOG_LEVEL="none")
AC_SUBST(CUPS_ACCESS_LOG_LEVEL)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_ACCESS_LOG_LEVEL, "$CUPS_ACCESS_LOG_LEVEL")
+dnl Default PageLogFormat
+AC_ARG_ENABLE(page_logging, [ --enable-page-logging enable page_log by default])
+if test "x$enable_page_logging" = xyes; then
+ CUPS_PAGE_LOG_FORMAT=""
+else
+ CUPS_PAGE_LOG_FORMAT="PageLogFormat"
+fi
+AC_SUBST(CUPS_PAGE_LOG_FORMAT)
+
dnl Default Browsing
AC_ARG_ENABLE(browsing, [ --disable-browsing disable Browsing by default])
if test "x$enable_browsing" = xno; then
@@ -400,5 +409,5 @@ AC_SUBST(CUPS_WEBIF)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_WEBIF, $CUPS_DEFAULT_WEBIF)
dnl
-dnl End of "$Id: cups-defaults.m4 7959 2008-09-17 19:30:58Z mike $".
+dnl End of "$Id: cups-defaults.m4 12846 2015-08-26 18:26:22Z msweet $".
dnl
diff --git a/config-scripts/cups-directories.m4 b/config-scripts/cups-directories.m4
index fe6e01e..fa3369e 100644
--- a/config-scripts/cups-directories.m4
+++ b/config-scripts/cups-directories.m4
@@ -1,16 +1,16 @@
dnl
-dnl "$Id: cups-directories.m4 7799 2008-07-25 20:06:08Z mike $"
+dnl "$Id: cups-directories.m4 11717 2014-03-21 16:42:53Z msweet $"
dnl
-dnl Directory stuff for CUPS.
+dnl Directory stuff for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
-dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2014 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
AC_PREFIX_DEFAULT(/)
@@ -102,19 +102,11 @@ fi
dnl Fix "libdir" variable...
if test "$libdir" = "\${exec_prefix}/lib"; then
case "$uname" in
- IRIX*)
- libdir="$exec_prefix/lib32"
- ;;
Linux*)
if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
libdir="$exec_prefix/lib64"
fi
;;
- HP-UX*)
- if test -d /usr/lib/hpux32; then
- libdir="$exec_prefix/lib/hpux32"
- fi
- ;;
esac
fi
@@ -129,126 +121,6 @@ fi
AC_SUBST(privateinclude)
AC_SUBST(PRIVATEINCLUDE)
-dnl Setup init.d locations...
-AC_ARG_WITH(rcdir, [ --with-rcdir set path for rc scripts],rcdir="$withval",rcdir="")
-AC_ARG_WITH(rclevels, [ --with-rclevels set run levels for rc scripts],rclevels="$withval",rclevels="2 3 5")
-AC_ARG_WITH(rcstart, [ --with-rcstart set start number for rc scripts],rcstart="$withval",rcstart="99")
-AC_ARG_WITH(rcstop, [ --with-rcstop set stop number for rc scripts],rcstop="$withval",rcstop="00")
-AC_ARG_WITH(smfmanifestdir, [ --with-smfmanifestdir set path for Solaris SMF manifest],smfmanifestdir="$withval",smfmanifestdir="")
-
-INITDIR=""
-INITDDIR=""
-RCLEVELS="$rclevels"
-RCSTART="$rcstart"
-RCSTOP="$rcstop"
-SMFMANIFESTDIR=""
-
-if test x$rcdir = x; then
- case "$uname" in
- AIX*)
- INITDIR="/etc/rc.d"
- ;;
-
- Darwin*)
- # Darwin and MacOS X...
- if test -x /sbin/launchd; then
- INITDDIR="/System/Library/LaunchDaemons"
- else
- INITDDIR="/System/Library/StartupItems/PrintingServices"
- fi
- ;;
-
- FreeBSD* | OpenBSD* | MirBSD* | ekkoBSD*)
- # FreeBSD and OpenBSD
- ;;
-
- HP-UX*)
- INITDIR="/sbin"
- RCLEVELS="2"
- RCSTART="380"
- RCSTOP="620"
- ;;
-
- IRIX*)
- # IRIX
- INITDIR="/etc"
- RCSTART="60"
- RCSTOP="25"
- ;;
-
- Linux | GNU | GNU/k*BSD*)
- # Linux/HURD seems to choose an init.d directory at random...
- if test -d /sbin/init.d; then
- # SuSE
- INITDIR="/sbin/init.d"
- else
- if test -d /etc/init.d; then
- # Others
- INITDIR="/etc"
- else
- # RedHat
- INITDIR="/etc/rc.d"
- fi
- fi
- RCSTART="81"
- RCSTOP="36"
- ;;
-
- NetBSD*)
- # NetBSD
- INITDDIR="/etc/rc.d"
- ;;
-
- OSF1*)
- INITDIR="/sbin"
- ;;
-
- SunOS*)
- # Solaris
- if test "x$smfmanifestdir" != x; then
- SMFMANIFESTDIR=$smfmanifestdir
- else
- INITDIR="/etc"
- RCSTART="81"
- fi
- ;;
-
- *)
- INITDIR="/etc"
- ;;
-
- esac
-elif test "x$rcdir" != xno; then
- if test "x$rclevels" = x; then
- INITDDIR="$rcdir"
- else
- INITDIR="$rcdir"
- fi
-fi
-
-AC_SUBST(INITDIR)
-AC_SUBST(INITDDIR)
-AC_SUBST(RCLEVELS)
-AC_SUBST(RCSTART)
-AC_SUBST(RCSTOP)
-AC_SUBST(SMFMANIFESTDIR)
-
-dnl Xinetd support...
-AC_ARG_WITH(xinetd, [ --with-xinetd set path for xinetd config files],XINETD="$withval",XINETD="")
-
-if test "x$XINETD" = x -a ! -x /sbin/launchd; then
- for dir in /private/etc/xinetd.d /etc/xinetd.d /usr/local/etc/xinetd.d; do
- if test -d $dir; then
- XINETD="$dir"
- break
- fi
- done
-elif test "x$XINETD" = xno; then
- XINETD=""
-fi
-
-AC_SUBST(XINETD)
-
dnl LPD sharing support...
AC_ARG_WITH(lpdconfig, [ --with-lpdconfig set URI for LPD config file],
LPDCONFIG="$withval", LPDCONFIG="")
@@ -365,10 +237,6 @@ if test "$localedir" = "\${datarootdir}/locale"; then
CUPS_LOCALEDIR="$datarootdir/locale"
;;
- OSF1* | AIX*)
- CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
- ;;
-
*)
# This is the standard System V location...
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
@@ -422,19 +290,20 @@ AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$sysconfdir/cups")
AC_SUBST(CUPS_SERVERROOT)
# Transient run-time state
-case "$uname" in
- Darwin*)
- # Darwin (OS X)
- CUPS_STATEDIR="$CUPS_SERVERROOT"
- ;;
- *)
- # All others
- CUPS_STATEDIR="$localstatedir/run/cups"
- ;;
-esac
+AC_ARG_WITH(rundir, [ --with-rundir set transient run-time state directory],CUPS_STATEDIR="$withval",[
+ case "$uname" in
+ Darwin*)
+ # Darwin (OS X)
+ CUPS_STATEDIR="$CUPS_SERVERROOT"
+ ;;
+ *)
+ # All others
+ CUPS_STATEDIR="$localstatedir/run/cups"
+ ;;
+ esac])
AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$CUPS_STATEDIR")
AC_SUBST(CUPS_STATEDIR)
dnl
-dnl End of "$Id: cups-directories.m4 7799 2008-07-25 20:06:08Z mike $".
+dnl End of "$Id: cups-directories.m4 11717 2014-03-21 16:42:53Z msweet $".
dnl
diff --git a/config-scripts/cups-dnssd.m4 b/config-scripts/cups-dnssd.m4
index 426637a..69e5d37 100644
--- a/config-scripts/cups-dnssd.m4
+++ b/config-scripts/cups-dnssd.m4
@@ -1,9 +1,9 @@
dnl
-dnl "$Id: cups-dnssd.m4 7890 2008-08-29 22:19:39Z mike $"
+dnl "$Id: cups-dnssd.m4 12845 2015-08-26 18:23:53Z msweet $"
dnl
dnl DNS Service Discovery (aka Bonjour) stuff for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
+dnl Copyright 2007-2015 by Apple Inc.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Apple Inc. and are protected by Federal copyright
@@ -23,14 +23,18 @@ AC_ARG_WITH(dnssd-includes, [ --with-dnssd-includes set directory for DNS Ser
DNSSDLIBS=""
DNSSD_BACKEND=""
+IPPFIND_BIN=""
+IPPFIND_MAN=""
-if test "x$PKGCONFIG" != x -a x$enable_avahi != xno; then
+if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$uname != xDarwin; then
AC_MSG_CHECKING(for Avahi)
if $PKGCONFIG --exists avahi-client; then
AC_MSG_RESULT(yes)
CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`"
DNSSDLIBS="`$PKGCONFIG --libs avahi-client`"
DNSSD_BACKEND="dnssd"
+ IPPFIND_BIN="ippfind"
+ IPPFIND_MAN="ippfind.\$(MAN1EXT)"
AC_DEFINE(HAVE_AVAHI)
else
AC_MSG_RESULT(no)
@@ -45,6 +49,8 @@ if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then
AC_DEFINE(HAVE_DNSSD)
DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
DNSSD_BACKEND="dnssd"
+ IPPFIND_BIN="ippfind"
+ IPPFIND_MAN="ippfind.\$(MAN1EXT)"
;;
*)
# All others...
@@ -61,6 +67,8 @@ if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then
AC_DEFINE(HAVE_DNSSD)
DNSSDLIBS="-ldns_sd"
DNSSD_BACKEND="dnssd",
+ IPPFIND_BIN="ippfind"
+ IPPFIND_MAN="ippfind.\$(MAN1EXT)"
AC_MSG_RESULT(no))
LIBS="$SAVELIBS"
;;
@@ -70,7 +78,9 @@ fi
AC_SUBST(DNSSDLIBS)
AC_SUBST(DNSSD_BACKEND)
+AC_SUBST(IPPFIND_BIN)
+AC_SUBST(IPPFIND_MAN)
dnl
-dnl End of "$Id: cups-dnssd.m4 7890 2008-08-29 22:19:39Z mike $".
+dnl End of "$Id: cups-dnssd.m4 12845 2015-08-26 18:23:53Z msweet $".
dnl
diff --git a/config-scripts/cups-gssapi.m4 b/config-scripts/cups-gssapi.m4
index d378bbf..616d96c 100644
--- a/config-scripts/cups-gssapi.m4
+++ b/config-scripts/cups-gssapi.m4
@@ -1,9 +1,9 @@
dnl
-dnl "$Id$"
+dnl "$Id: cups-gssapi.m4 11911 2014-06-10 13:54:53Z msweet $"
dnl
dnl GSSAPI/Kerberos library detection for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
+dnl Copyright 2007-2013 by Apple Inc.
dnl Copyright 2006-2007 by Easy Software Products.
dnl
dnl This file contains Kerberos support code, copyright 2006 by
@@ -22,7 +22,7 @@ LIBGSSAPI=""
AC_SUBST(LIBGSSAPI)
if test x$enable_gssapi != xno; then
- AC_PATH_PROG(KRB5CONFIG, krb5-config)
+ AC_PATH_TOOL(KRB5CONFIG, krb5-config)
if test "x$KRB5CONFIG" != x; then
case "$uname" in
Darwin)
@@ -71,38 +71,9 @@ if test x$enable_gssapi != xno; then
if test "x$LIBGSSAPI" != x; then
AC_CHECK_HEADER(krb5.h, AC_DEFINE(HAVE_KRB5_H))
if test -d /System/Library/Frameworks/GSS.framework; then
- gssdir="/System/Library/Frameworks/GSS.framework"
- AC_MSG_CHECKING(for GSS/gssapi.h presence)
- if test -f $gssdir/Headers/gssapi.h; then
- AC_DEFINE(HAVE_GSS_GSSAPI_H)
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- fi
- AC_MSG_CHECKING(for GSS/gssapi_generic.h presence)
- if test -f $gssdir/Headers/gssapi_generic.h; then
- AC_DEFINE(HAVE_GSSAPI_GENERIC_H)
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- fi
- AC_MSG_CHECKING(for GSS/gssapi_spi.h presence)
- if test -f $gssdir/PrivateHeaders/gssapi_spi.h; then
- AC_MSG_RESULT(yes)
- AC_MSG_CHECKING(for GSS/gssapi_spi.h usability)
- if test -s $gssdir/PrivateHeaders/gssapi_spi.h; then
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_GSS_GSSAPI_SPI_H)
- else
- AC_MSG_RESULT(no)
- fi
- else
- AC_MSG_RESULT(no)
- if test $uversion -ge 110 -a $uversion -lt 120; then
- # Broken public headers in 10.7.x...
- AC_MSG_ERROR(Run 'sudo mkdir -p $gssdir/PrivateHeaders' and 'sudo touch $gssdir/PrivateHeaders/gssapi_spi.h' to build CUPS.)
- fi
- fi
+ AC_CHECK_HEADER(GSS/gssapi.h, AC_DEFINE(HAVE_GSS_GSSAPI_H))
+ AC_CHECK_HEADER(GSS/gssapi_generic.h, AC_DEFINE(HAVE_GSS_GSSAPI_GENERIC_H))
+ AC_CHECK_HEADER(GSS/gssapi_spi.h, AC_DEFINE(HAVE_GSS_GSSAPI_SPI_H))
else
AC_CHECK_HEADER(gssapi.h, AC_DEFINE(HAVE_GSSAPI_H))
AC_CHECK_HEADER(gssapi/gssapi.h, AC_DEFINE(HAVE_GSSAPI_GSSAPI_H))
@@ -158,5 +129,5 @@ AC_SUBST(CUPS_DEFAULT_GSSSERVICENAME)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GSSSERVICENAME, "$CUPS_DEFAULT_GSSSERVICENAME")
dnl
-dnl End of "$Id$".
+dnl End of "$Id: cups-gssapi.m4 11911 2014-06-10 13:54:53Z msweet $".
dnl
diff --git a/config-scripts/cups-largefile.m4 b/config-scripts/cups-largefile.m4
index 8243de7..6be7b1f 100644
--- a/config-scripts/cups-largefile.m4
+++ b/config-scripts/cups-largefile.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id: cups-largefile.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-largefile.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
dnl Large file support stuff for CUPS.
dnl
@@ -48,5 +48,5 @@ fi
AC_CHECK_FUNC(strtoll, AC_DEFINE(HAVE_STRTOLL))
dnl
-dnl End of "$Id: cups-largefile.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-largefile.m4 11324 2013-10-04 03:11:42Z msweet $".
dnl
diff --git a/config-scripts/cups-launchd.m4 b/config-scripts/cups-launchd.m4
deleted file mode 100644
index 23a2295..0000000
--- a/config-scripts/cups-launchd.m4
+++ /dev/null
@@ -1,43 +0,0 @@
-dnl
-dnl "$Id: cups-launchd.m4 6649 2007-07-11 21:46:42Z mike $"
-dnl
-dnl launchd stuff for CUPS.
-dnl
-dnl Copyright 2007-2010 by Apple Inc.
-dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
-dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
-dnl
-
-
-AC_ARG_ENABLE(launchd, [ --disable-launchd disable launchd support])
-
-DEFAULT_LAUNCHD_CONF=""
-LAUNCHDLIBS=""
-
-if test x$enable_launchd != xno; then
- AC_CHECK_FUNC(launch_msg, AC_DEFINE(HAVE_LAUNCHD))
- AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H))
-
- case "$uname" in
- Darwin*)
- # Darwin, MacOS X
- DEFAULT_LAUNCHD_CONF="/System/Library/LaunchDaemons/org.cups.cupsd.plist"
- # liblaunch is already part of libSystem
- ;;
- *)
- # All others; this test will need to be updated
- ;;
- esac
-fi
-
-AC_SUBST(DEFAULT_LAUNCHD_CONF)
-AC_SUBST(LAUNCHDLIBS)
-
-dnl
-dnl End of "$Id: cups-launchd.m4 6649 2007-07-11 21:46:42Z mike $".
-dnl
diff --git a/config-scripts/cups-libtool.m4 b/config-scripts/cups-libtool.m4
index d6026b2..2dcaab3 100644
--- a/config-scripts/cups-libtool.m4
+++ b/config-scripts/cups-libtool.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id: cups-libtool.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-libtool.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
dnl Libtool stuff for CUPS.
dnl
@@ -35,5 +35,5 @@ if test x$LIBTOOL != x; then
fi
dnl
-dnl End of "$Id: cups-libtool.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-libtool.m4 11324 2013-10-04 03:11:42Z msweet $".
dnl
diff --git a/config-scripts/cups-manpages.m4 b/config-scripts/cups-manpages.m4
index 7420433..bd6b8d5 100644
--- a/config-scripts/cups-manpages.m4
+++ b/config-scripts/cups-manpages.m4
@@ -1,16 +1,16 @@
dnl
-dnl "$Id: cups-manpages.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-manpages.m4 11342 2013-10-18 20:36:01Z msweet $"
dnl
-dnl Manpage stuff for CUPS.
+dnl Manpage stuff for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
-dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2013 by Apple Inc.
+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 Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
dnl Fix "mandir" variable...
@@ -22,18 +22,12 @@ fi
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
case "$uname" in
- Darwin* | Linux | GNU | *BSD* | AIX*)
- # Darwin, MacOS X, Linux, GNU HURD, *BSD, and AIX
+ Darwin* | Linux | GNU | *BSD*)
+ # Darwin, MacOS X, Linux, GNU HURD, and *BSD
mandir="/usr/share/man"
AMANDIR="/usr/share/man"
PMANDIR="/usr/share/man"
;;
- IRIX)
- # SGI IRIX
- mandir="/usr/share/catman/u_man"
- AMANDIR="/usr/share/catman/a_man"
- PMANDIR="/usr/share/catman/p_man"
- ;;
*)
# All others
mandir="/usr/man"
@@ -51,16 +45,8 @@ AC_SUBST(PMANDIR)
dnl Setup manpage extensions...
case "$uname" in
- IRIX*)
- # SGI IRIX
- MAN1EXT=1
- MAN5EXT=5
- MAN7EXT=7
- MAN8EXT=1m
- MAN8DIR=1
- ;;
- SunOS* | HP-UX*)
- # Solaris and HP-UX
+ SunOS*)
+ # Solaris
MAN1EXT=1
MAN5EXT=5
MAN7EXT=7
@@ -92,5 +78,5 @@ AC_SUBST(MAN8EXT)
AC_SUBST(MAN8DIR)
dnl
-dnl End of "$Id: cups-manpages.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-manpages.m4 11342 2013-10-18 20:36:01Z msweet $".
dnl
diff --git a/config-scripts/cups-network.m4 b/config-scripts/cups-network.m4
index b97fb4a..e5b3405 100644
--- a/config-scripts/cups-network.m4
+++ b/config-scripts/cups-network.m4
@@ -1,19 +1,24 @@
dnl
-dnl "$Id: cups-network.m4 7918 2008-09-08 22:03:01Z mike $"
+dnl "$Id: cups-network.m4 12324 2014-12-09 20:28:39Z msweet $"
dnl
-dnl Networking stuff for CUPS.
+dnl Networking stuff for CUPS.
dnl
-dnl Copyright 2007-2011 by Apple Inc.
-dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2014 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
-AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H))
+AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H),,[
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>])
AC_SEARCH_LIBS(socket, socket)
AC_SEARCH_LIBS(gethostbyaddr, nsl)
AC_SEARCH_LIBS(getifaddrs, nsl, AC_DEFINE(HAVE_GETIFADDRS))
@@ -66,9 +71,6 @@ fi
AC_SUBST(CUPS_DEFAULT_DOMAINSOCKET)
AC_SUBST(CUPS_LISTEN_DOMAINSOCKET)
-AC_CHECK_HEADERS(AppleTalk/at_proto.h,AC_DEFINE(HAVE_APPLETALK_AT_PROTO_H),,
- [#include <netat/appletalk.h>])
-
dnl
-dnl End of "$Id: cups-network.m4 7918 2008-09-08 22:03:01Z mike $".
+dnl End of "$Id: cups-network.m4 12324 2014-12-09 20:28:39Z msweet $".
dnl
diff --git a/config-scripts/cups-opsys.m4 b/config-scripts/cups-opsys.m4
index 5b38975..755f9d7 100644
--- a/config-scripts/cups-opsys.m4
+++ b/config-scripts/cups-opsys.m4
@@ -1,9 +1,9 @@
dnl
-dnl "$Id: cups-opsys.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-opsys.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
dnl Operating system stuff for CUPS.
dnl
-dnl Copyright 2007-2011 by Apple Inc.
+dnl Copyright 2007-2012 by Apple Inc.
dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -19,17 +19,21 @@ uversion=`uname -r | sed -e '1,$s/^[[^0-9]]*\([[0-9]]*\)\.\([[0-9]]*\).*/\1\2/'`
uarch=`uname -m`
case "$uname" in
+ Darwin*)
+ uname="Darwin"
+ if test $uversion -lt 120; then
+ AC_MSG_ERROR([Sorry, this version of CUPS requires OS X 10.8 or higher.])
+ fi
+ ;;
+
GNU* | GNU/*)
uname="GNU"
;;
- IRIX*)
- uname="IRIX"
- ;;
Linux*)
uname="Linux"
;;
esac
dnl
-dnl "$Id: cups-opsys.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-opsys.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
diff --git a/config-scripts/cups-pam.m4 b/config-scripts/cups-pam.m4
index 72bf32f..904a273 100644
--- a/config-scripts/cups-pam.m4
+++ b/config-scripts/cups-pam.m4
@@ -1,26 +1,21 @@
dnl
-dnl "$Id: cups-pam.m4 7960 2008-09-17 19:42:02Z mike $"
+dnl "$Id: cups-pam.m4 11342 2013-10-18 20:36:01Z msweet $"
dnl
dnl PAM stuff for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
-dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2013 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
AC_ARG_ENABLE(pam, [ --disable-pam disable PAM support])
AC_ARG_WITH(pam_module, [ --with-pam-module specify the PAM module to use])
-dnl Don't use PAM with AIX...
-if test $uname = AIX; then
- enable_pam=no
-fi
-
PAMDIR=""
PAMFILE="pam.std"
PAMLIBS=""
@@ -98,5 +93,5 @@ AC_SUBST(PAMMOD)
AC_SUBST(PAMMODAUTH)
dnl
-dnl End of "$Id: cups-pam.m4 7960 2008-09-17 19:42:02Z mike $".
+dnl End of "$Id: cups-pam.m4 11342 2013-10-18 20:36:01Z msweet $".
dnl
diff --git a/config-scripts/cups-poll.m4 b/config-scripts/cups-poll.m4
index 901068c..8774a2f 100644
--- a/config-scripts/cups-poll.m4
+++ b/config-scripts/cups-poll.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id$"
+dnl "$Id: cups-poll.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
dnl Select/poll stuff for CUPS.
dnl
@@ -18,5 +18,5 @@ AC_CHECK_FUNC(epoll_create, AC_DEFINE(HAVE_EPOLL))
AC_CHECK_FUNC(kqueue, AC_DEFINE(HAVE_KQUEUE))
dnl
-dnl End of "$Id$".
+dnl End of "$Id: cups-poll.m4 11324 2013-10-04 03:11:42Z msweet $".
dnl
diff --git a/config-scripts/cups-scripting.m4 b/config-scripts/cups-scripting.m4
index d4ed988..defaf09 100644
--- a/config-scripts/cups-scripting.m4
+++ b/config-scripts/cups-scripting.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id: cups-scripting.m4 7915 2008-09-07 22:18:29Z mike $"
+dnl "$Id: cups-scripting.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
dnl Scripting configuration stuff for CUPS.
dnl
@@ -85,5 +85,5 @@ if test "x$CUPS_PYTHON" != x; then
fi
dnl
-dnl End of "$Id: cups-scripting.m4 7915 2008-09-07 22:18:29Z mike $".
+dnl End of "$Id: cups-scripting.m4 11324 2013-10-04 03:11:42Z msweet $".
dnl
diff --git a/config-scripts/cups-sharedlibs.m4 b/config-scripts/cups-sharedlibs.m4
index 13dde4b..a8df14a 100644
--- a/config-scripts/cups-sharedlibs.m4
+++ b/config-scripts/cups-sharedlibs.m4
@@ -1,16 +1,16 @@
dnl
-dnl "$Id: cups-sharedlibs.m4 7630 2008-06-09 22:31:44Z mike $"
+dnl "$Id: cups-sharedlibs.m4 11342 2013-10-18 20:36:01Z msweet $"
dnl
-dnl Shared library support for CUPS.
+dnl Shared library support for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
-dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2013 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
PICFLAG=1
@@ -34,51 +34,7 @@ if test x$enable_shared != xno; then
DSOXX="\$(CXX)"
DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)"
;;
- UNIX_S*)
- LIBCUPS="lib$cupsbase.so.2"
- LIBCUPSCGI="libcupscgi.so.1"
- LIBCUPSIMAGE="libcupsimage.so.2"
- LIBCUPSMIME="libcupsmime.so.1"
- LIBCUPSPPDC="libcupsppdc.so.1"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -Wl,-h,\`basename \$@\` -G \$(OPTIM)"
- ;;
- HP-UX*)
- case "$uarch" in
- ia64)
- LIBCUPS="lib$cupsbase.so.2"
- LIBCUPSCGI="libcupscgi.so.1"
- LIBCUPSIMAGE="libcupsimage.so.2"
- LIBCUPSMIME="libcupsmime.so.1"
- LIBCUPSPPDC="libcupsppdc.so.1"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -Wl,-b,-z,+h,\`basename \$@\`"
- ;;
- *)
- LIBCUPS="lib$cupsbase.sl.2"
- LIBCUPSCGI="libcupscgi.sl.1"
- LIBCUPSIMAGE="libcupsimage.sl.2"
- LIBCUPSMIME="libcupsmime.sl.1"
- LIBCUPSPPDC="libcupsppdc.sl.1"
- DSO="\$(LD)"
- DSOXX="\$(LD)"
- DSOFLAGS="$DSOFLAGS -b -z +h \`basename \$@\`"
- ;;
- esac
- ;;
- IRIX)
- LIBCUPS="lib$cupsbase.so.2"
- LIBCUPSCGI="libcupscgi.so.1"
- LIBCUPSIMAGE="libcupsimage.so.2"
- LIBCUPSMIME="libcupsmime.so.1"
- LIBCUPSPPDC="libcupsppdc.so.1"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -set_version,sgi2.6,-soname,\`basename \$@\` -shared \$(OPTIM)"
- ;;
- OSF1* | Linux | GNU | *BSD*)
+ Linux | GNU | *BSD*)
LIBCUPS="lib$cupsbase.so.2"
LIBCUPSCGI="libcupscgi.so.1"
LIBCUPSIMAGE="libcupsimage.so.2"
@@ -98,17 +54,6 @@ if test x$enable_shared != xno; then
DSOXX="\$(CXX)"
DSOFLAGS="$DSOFLAGS -dynamiclib -single_module -lc"
;;
- AIX*)
- LIBCUPS="lib${cupsbase}_s.a"
- LIBCUPSBASE="${cupsbase}_s"
- LIBCUPSCGI="libcupscgi_s.a"
- LIBCUPSIMAGE="libcupsimage_s.a"
- LIBCUPSMIME="libcupsmime_s.a"
- LIBCUPSPPDC="libcupsppdc_s.a"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)"
- ;;
*)
echo "Warning: shared libraries may not be supported. Trying -shared"
echo " option with compiler."
@@ -151,19 +96,11 @@ if test x$enable_shared = xno; then
EXTLINKCUPS="-lcups"
EXTLINKCUPSIMAGE="-lcupsimage"
else
- if test $uname = AIX; then
- LINKCUPS="-l${cupsbase}_s"
- LINKCUPSIMAGE="-lcupsimage_s"
-
- EXTLINKCUPS="-lcups_s"
- EXTLINKCUPSIMAGE="-lcupsimage_s"
- else
- LINKCUPS="-l${cupsbase}"
- LINKCUPSIMAGE="-lcupsimage"
+ LINKCUPS="-l${cupsbase}"
+ LINKCUPSIMAGE="-lcupsimage"
- EXTLINKCUPS="-lcups"
- EXTLINKCUPSIMAGE="-lcupsimage"
- fi
+ EXTLINKCUPS="-lcups"
+ EXTLINKCUPSIMAGE="-lcupsimage"
fi
AC_SUBST(EXTLINKCUPS)
@@ -186,19 +123,6 @@ if test "$DSO" != ":"; then
# need this option, even when the library is installed in a
# standard location...
case $uname in
- HP-UX*)
- # HP-UX needs the path, even for /usr/lib...
- case "$uarch" in
- ia64)
- DSOFLAGS="-Wl,+s,+b,$libdir $DSOFLAGS"
- ;;
- *)
- DSOFLAGS="+s +b $libdir $DSOFLAGS"
- ;;
- esac
- LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
- EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
- ;;
SunOS*)
# Solaris...
if test $exec_prefix != /usr; then
@@ -215,8 +139,8 @@ if test "$DSO" != ":"; then
EXPORT_LDFLAGS="-Wl,-R$libdir"
fi
;;
- IRIX | Linux | GNU)
- # IRIX, Linux, and HURD...
+ Linux | GNU)
+ # Linux, and HURD...
if test $exec_prefix != /usr; then
DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
@@ -234,5 +158,5 @@ AC_SUBST(IMGLIBS)
AC_SUBST(EXPORT_LDFLAGS)
dnl
-dnl End of "$Id: cups-sharedlibs.m4 7630 2008-06-09 22:31:44Z mike $".
+dnl End of "$Id: cups-sharedlibs.m4 11342 2013-10-18 20:36:01Z msweet $".
dnl
diff --git a/config-scripts/cups-ssl.m4 b/config-scripts/cups-ssl.m4
index 03f7530..df0bd45 100644
--- a/config-scripts/cups-ssl.m4
+++ b/config-scripts/cups-ssl.m4
@@ -1,34 +1,26 @@
dnl
-dnl "$Id: cups-ssl.m4 7241 2008-01-22 22:34:52Z mike $"
+dnl "$Id: cups-ssl.m4 12645 2015-05-20 01:20:52Z msweet $"
dnl
-dnl OpenSSL/GNUTLS stuff for CUPS.
+dnl TLS stuff for CUPS.
dnl
-dnl Copyright 2007-2012 by Apple Inc.
-dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
AC_ARG_ENABLE(ssl, [ --disable-ssl disable SSL/TLS support])
AC_ARG_ENABLE(cdsassl, [ --enable-cdsassl use CDSA for SSL/TLS support, default=first])
AC_ARG_ENABLE(gnutls, [ --enable-gnutls use GNU TLS for SSL/TLS support, default=second])
-AC_ARG_ENABLE(openssl, [ --enable-openssl use OpenSSL for SSL/TLS support, default=third])
-AC_ARG_WITH(openssl-libs, [ --with-openssl-libs set directory for OpenSSL library],
- LDFLAGS="-L$withval $LDFLAGS"
- DSOFLAGS="-L$withval $DSOFLAGS",)
-AC_ARG_WITH(openssl-includes, [ --with-openssl-includes set directory for OpenSSL includes],
- CFLAGS="-I$withval $CFLAGS"
- CPPFLAGS="-I$withval $CPPFLAGS",)
SSLFLAGS=""
SSLLIBS=""
have_ssl=0
-CUPS_SERVERCERT=""
-CUPS_SERVERKEY=""
+CUPS_SERVERKEYCHAIN=""
if test x$enable_ssl != xno; then
dnl Look for CDSA...
@@ -38,7 +30,7 @@ if test x$enable_ssl != xno; then
have_ssl=1
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_CDSASSL)
- CUPS_SERVERCERT="/Library/Keychains/System.keychain"
+ CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain"
dnl Check for the various security headers...
AC_CHECK_HEADER(Security/SecureTransportPriv.h,
@@ -59,41 +51,19 @@ if test x$enable_ssl != xno; then
AC_CHECK_HEADER(Security/SecIdentitySearchPriv.h,
AC_DEFINE(HAVE_SECIDENTITYSEARCHPRIV_H))
- dnl Check for SecCertificateCopyData..
- AC_MSG_CHECKING(for SecCertificateCopyData)
- if test $uversion -ge 100; then
- AC_DEFINE(HAVE_SECCERTIFICATECOPYDATA)
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- fi
+ AC_DEFINE(HAVE_CSSMERRORSTRING)
+ AC_DEFINE(HAVE_SECKEYCHAINOPEN)])
- dnl Check for SecIdentitySearchCreateWithPolicy...
- AC_MSG_CHECKING(for SecIdentitySearchCreateWithPolicy)
- if test $uversion -ge 80; then
- AC_DEFINE(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
+ if test $uversion -ge 150; then
+ AC_DEFINE(HAVE_SSLSETENABLEDCIPHERS)
fi
-
- dnl Check for SecPolicyCreateSSL...
- AC_MSG_CHECKING(for SecPolicyCreateSSL)
- if test $uversion -ge 110; then
- AC_DEFINE(HAVE_SECPOLICYCREATESSL)
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- fi])
-
- AC_DEFINE(HAVE_CSSMERRORSTRING)
fi
fi
dnl Then look for GNU TLS...
if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then
- AC_PATH_PROG(LIBGNUTLSCONFIG,libgnutls-config)
- AC_PATH_PROG(LIBGCRYPTCONFIG,libgcrypt-config)
+ AC_PATH_TOOL(LIBGNUTLSCONFIG,libgnutls-config)
+ AC_PATH_TOOL(LIBGCRYPTCONFIG,libgcrypt-config)
if $PKGCONFIG --exists gnutls; then
have_ssl=1
SSLLIBS=`$PKGCONFIG --libs gnutls`
@@ -109,59 +79,14 @@ if test x$enable_ssl != xno; then
fi
if test $have_ssl = 1; then
- CUPS_SERVERCERT="ssl/server.crt"
- CUPS_SERVERKEY="ssl/server.key"
-
- if $PKGCONFIG --exists gcrypt; then
- SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`"
- SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`"
- elif test "x$LIBGCRYPTCONFIG" != x; then
- SSLLIBS="$SSLLIBS `$LIBGCRYPTCONFIG --libs`"
- SSLFLAGS="$SSLFLAGS `$LIBGCRYPTCONFIG --cflags`"
- fi
- fi
- fi
+ CUPS_SERVERKEYCHAIN="ssl"
- dnl Check for the OpenSSL library last...
- if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then
- AC_CHECK_HEADER(openssl/ssl.h,[
- dnl Save the current libraries so the crypto stuff isn't always
- dnl included...
SAVELIBS="$LIBS"
-
- dnl Some ELF systems can't resolve all the symbols in libcrypto
- dnl if libcrypto was linked against RSAREF, and fail to link the
- dnl test program correctly, even though a correct installation
- dnl of OpenSSL exists. So we test the linking three times in
- dnl case the RSAREF libraries are needed.
-
- for libcrypto in \
- "-lcrypto" \
- "-lcrypto -lrsaref" \
- "-lcrypto -lRSAglue -lrsaref"
- do
- AC_CHECK_LIB(ssl,SSL_new,
- [have_ssl=1
- SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
- SSLLIBS="-lssl $libcrypto"
- AC_DEFINE(HAVE_SSL)
- AC_DEFINE(HAVE_LIBSSL)],,
- $libcrypto)
-
- if test "x${SSLLIBS}" != "x"; then
- break
- fi
- done
-
- if test "x${SSLLIBS}" != "x"; then
- CUPS_SERVERCERT="ssl/server.crt"
- CUPS_SERVERKEY="ssl/server.key"
-
- LIBS="$SAVELIBS $SSLLIBS"
- AC_CHECK_FUNCS(SSL_set_tlsext_host_name)
- fi
-
- LIBS="$SAVELIBS"])
+ LIBS="$LIBS $SSLLIBS"
+ AC_CHECK_FUNC(gnutls_transport_set_pull_timeout_function, AC_DEFINE(HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION))
+ AC_CHECK_FUNC(gnutls_priority_set_direct, AC_DEFINE(HAVE_GNUTLS_PRIORITY_SET_DIRECT))
+ LIBS="$SAVELIBS"
+ fi
fi
fi
@@ -170,12 +95,11 @@ if test $have_ssl = 1; then
AC_MSG_RESULT([ Using SSLLIBS="$SSLLIBS"])
AC_MSG_RESULT([ Using SSLFLAGS="$SSLFLAGS"])
IPPALIASES="http https ipps"
-elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes -o x$enable_openssl = xyes; then
+elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes; then
AC_MSG_ERROR([Unable to enable SSL support.])
fi
-AC_SUBST(CUPS_SERVERCERT)
-AC_SUBST(CUPS_SERVERKEY)
+AC_SUBST(CUPS_SERVERKEYCHAIN)
AC_SUBST(IPPALIASES)
AC_SUBST(SSLFLAGS)
AC_SUBST(SSLLIBS)
@@ -184,5 +108,5 @@ EXPORT_SSLLIBS="$SSLLIBS"
AC_SUBST(EXPORT_SSLLIBS)
dnl
-dnl End of "$Id: cups-ssl.m4 7241 2008-01-22 22:34:52Z mike $".
+dnl End of "$Id: cups-ssl.m4 12645 2015-05-20 01:20:52Z msweet $".
dnl
diff --git a/config-scripts/cups-startup.m4 b/config-scripts/cups-startup.m4
new file mode 100644
index 0000000..dfe4740
--- /dev/null
+++ b/config-scripts/cups-startup.m4
@@ -0,0 +1,192 @@
+dnl
+dnl "$Id: cups-startup.m4 12857 2015-08-31 15:00:45Z msweet $"
+dnl
+dnl Launch-on-demand/startup stuff for CUPS.
+dnl
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl
+
+ONDEMANDFLAGS=""
+ONDEMANDLIBS=""
+AC_SUBST(ONDEMANDFLAGS)
+AC_SUBST(ONDEMANDLIBS)
+
+dnl Launchd is used on OS X/Darwin...
+AC_ARG_ENABLE(launchd, [ --disable-launchd disable launchd support])
+LAUNCHD_DIR=""
+AC_SUBST(LAUNCHD_DIR)
+
+if test x$enable_launchd != xno; then
+ AC_CHECK_FUNC(launch_msg, AC_DEFINE(HAVE_LAUNCHD))
+ if test $uversion -ge 140; then
+ AC_CHECK_FUNC(launch_activate_socket, [
+ AC_DEFINE(HAVE_LAUNCHD)
+ AC_DEFINE(HAVE_LAUNCH_ACTIVATE_SOCKET)])
+ fi
+ AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H))
+
+ case "$uname" in
+ Darwin*)
+ # Darwin, MacOS X
+ LAUNCHD_DIR="/System/Library/LaunchDaemons"
+ # liblaunch is already part of libSystem
+ ;;
+ *)
+ # All others; this test will need to be updated
+ ;;
+ esac
+fi
+
+dnl Systemd is used on Linux...
+AC_ARG_ENABLE(systemd, [ --disable-systemd disable systemd support])
+AC_ARG_WITH(systemd, [ --with-systemd set directory for systemd service files],
+ SYSTEMD_DIR="$withval", SYSTEMD_DIR="")
+AC_SUBST(SYSTEMD_DIR)
+
+if test x$enable_systemd != xno; then
+ if test "x$PKGCONFIG" = x; then
+ if test x$enable_systemd = xyes; then
+ AC_MSG_ERROR(Need pkg-config to enable systemd support.)
+ fi
+ else
+ have_systemd=no
+ AC_MSG_CHECKING(for libsystemd)
+ if $PKGCONFIG --exists libsystemd; then
+ AC_MSG_RESULT(yes)
+ have_systemd=yes
+ ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd`
+ ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd`
+ elif $PKGCONFIG --exists libsystemd-daemon; then
+ AC_MSG_RESULT(yes - legacy)
+ have_systemd=yes
+ ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd-daemon`
+ ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd-daemon`
+
+ if $PKGCONFIG --exists libsystemd-journal; then
+ ONDEMANDFLAGS="$ONDEMANDFLAGS `$PKGCONFIG --cflags libsystemd-journal`"
+ ONDEMANDLIBS="$ONDEMANDLIBS `$PKGCONFIG --libs libsystemd-journal`"
+ fi
+ else
+ AC_MSG_RESULT(no)
+ fi
+
+ if test $have_systemd = yes; then
+ AC_DEFINE(HAVE_SYSTEMD)
+ AC_CHECK_HEADER(systemd/sd-journal.h,AC_DEFINE(HAVE_SYSTEMD_SD_JOURNAL_H))
+ if test "x$SYSTEMD_DIR" = x; then
+ SYSTEMD_DIR="`$PKGCONFIG --variable=systemdsystemunitdir systemd`"
+ fi
+ fi
+ fi
+fi
+
+dnl Solaris uses smf
+SMFMANIFESTDIR=""
+AC_SUBST(SMFMANIFESTDIR)
+AC_ARG_WITH(smfmanifestdir, [ --with-smfmanifestdir set path for Solaris SMF manifest],SMFMANIFESTDIR="$withval")
+
+dnl Use init on other platforms...
+AC_ARG_WITH(rcdir, [ --with-rcdir set path for rc scripts],rcdir="$withval",rcdir="")
+AC_ARG_WITH(rclevels, [ --with-rclevels set run levels for rc scripts],rclevels="$withval",rclevels="2 3 5")
+AC_ARG_WITH(rcstart, [ --with-rcstart set start number for rc scripts],rcstart="$withval",rcstart="")
+AC_ARG_WITH(rcstop, [ --with-rcstop set stop number for rc scripts],rcstop="$withval",rcstop="")
+
+if test x$rcdir = x; then
+ if test x$LAUNCHD_DIR = x -a x$SYSTEMD_DIR = x -a x$SMFMANIFESTDIR = x; then
+ # Fall back on "init", the original service startup interface...
+ if test -d /sbin/init.d; then
+ # SuSE
+ rcdir="/sbin/init.d"
+ elif test -d /etc/init.d; then
+ # Others
+ rcdir="/etc"
+ else
+ # RedHat, NetBSD
+ rcdir="/etc/rc.d"
+ fi
+ else
+ rcdir="no"
+ fi
+fi
+
+if test "x$rcstart" = x; then
+ case "$uname" in
+ Linux | GNU | GNU/k*BSD*)
+ # Linux
+ rcstart="81"
+ ;;
+
+ SunOS*)
+ # Solaris
+ rcstart="81"
+ ;;
+
+ *)
+ # Others
+ rcstart="99"
+ ;;
+ esac
+fi
+
+if test "x$rcstop" = x; then
+ case "$uname" in
+ Linux | GNU | GNU/k*BSD*)
+ # Linux
+ rcstop="36"
+ ;;
+
+ *)
+ # Others
+ rcstop="00"
+ ;;
+ esac
+fi
+
+INITDIR=""
+INITDDIR=""
+RCLEVELS="$rclevels"
+RCSTART="$rcstart"
+RCSTOP="$rcstop"
+AC_SUBST(INITDIR)
+AC_SUBST(INITDDIR)
+AC_SUBST(RCLEVELS)
+AC_SUBST(RCSTART)
+AC_SUBST(RCSTOP)
+
+if test "x$rcdir" != xno; then
+ if test "x$rclevels" = x; then
+ INITDDIR="$rcdir"
+ else
+ INITDIR="$rcdir"
+ fi
+fi
+
+dnl Xinetd support...
+AC_ARG_WITH(xinetd, [ --with-xinetd set path for xinetd config files],xinetd="$withval",xinetd="")
+XINETD=""
+AC_SUBST(XINETD)
+
+if test "x$xinetd" = x; then
+ if test ! -x /sbin/launchd; then
+ for dir in /etc/xinetd.d /usr/local/etc/xinetd.d; do
+ if test -d $dir; then
+ XINETD="$dir"
+ break
+ fi
+ done
+ fi
+elif test "x$xinetd" != xno; then
+ XINETD="$xinetd"
+fi
+
+
+dnl
+dnl End of "$Id: cups-startup.m4 12857 2015-08-31 15:00:45Z msweet $".
+dnl
diff --git a/config-scripts/cups-threads.m4 b/config-scripts/cups-threads.m4
index b95c79f..9eaf63a 100644
--- a/config-scripts/cups-threads.m4
+++ b/config-scripts/cups-threads.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id: cups-threads.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-threads.m4 11324 2013-10-04 03:11:42Z msweet $"
dnl
dnl Threading stuff for CUPS.
dnl
@@ -50,5 +50,5 @@ fi
AC_SUBST(PTHREAD_FLAGS)
dnl
-dnl End of "$Id: cups-threads.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-threads.m4 11324 2013-10-04 03:11:42Z msweet $".
dnl
diff --git a/config.h.in b/config.h.in
index edff532..15607ee 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,16 +1,16 @@
/*
- * "$Id: config.h.in 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: config.h.in 12687 2015-06-03 17:19:04Z msweet $"
*
- * Configuration file for CUPS.
+ * Configuration file for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#ifndef _CUPS_CONFIG_H_
@@ -93,7 +93,7 @@
* Default MaxCopies value...
*/
-#define CUPS_DEFAULT_MAX_COPIES 100
+#define CUPS_DEFAULT_MAX_COPIES 9999
/*
@@ -132,23 +132,25 @@
/*
- * Do we have various image libraries?
+ * Do we have posix_spawn?
+ */
+
+#undef HAVE_POSIX_SPAWN
+
+
+/*
+ * Do we have ZLIB?
*/
-#undef HAVE_LIBPNG
#undef HAVE_LIBZ
-#undef HAVE_LIBJPEG
-#undef HAVE_LIBTIFF
+#undef HAVE_INFLATECOPY
/*
* Do we have PAM stuff?
*/
-#ifndef HAVE_LIBPAM
#define HAVE_LIBPAM 0
-#endif /* !HAVE_LIBPAM */
-
#undef HAVE_PAM_PAM_APPL_H
#undef HAVE_PAM_SET_ITEM
#undef HAVE_PAM_SETCRED
@@ -169,13 +171,6 @@
/*
- * Do we have <scsi/sg.h>?
- */
-
-#undef HAVE_SCSI_SG_H
-
-
-/*
* Use <stdint.h>?
*/
@@ -248,6 +243,20 @@
/*
+ * Do we have the ASL functions?
+ */
+
+#undef HAVE_ASL_H
+
+
+/*
+ * Do we have the systemd journal functions?
+ */
+
+#undef HAVE_SYSTEMD_SD_JOURNAL_H
+
+
+/*
* Do we have the (v)snprintf() functions?
*/
@@ -299,15 +308,22 @@
#undef HAVE_CDSASSL
#undef HAVE_GNUTLS
-#undef HAVE_LIBSSL
+#undef HAVE_SSPISSL
#undef HAVE_SSL
/*
- * Do we have the SSL_set_tlsext_host_name function?
+ * Do we have the gnutls_transport_set_pull_timeout_function function?
*/
-#undef HAVE_SSL_SET_TLSEXT_HOST_NAME
+#undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION
+
+
+/*
+ * Do we have the gnutls_priority_set_direct function?
+ */
+
+#undef HAVE_GNUTLS_PRIORITY_SET_DIRECT
/*
@@ -326,38 +342,31 @@
/*
- * Do we have the SecCertificateCopyData function?
- */
-
-#undef HAVE_SECCERTIFICATECOPYDATA
-
-
-/*
- * Do we have the SecIdentitySearchCreateWithPolicy function?
+ * Do we have the cssmErrorString function?
*/
-#undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY
+#undef HAVE_CSSMERRORSTRING
/*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecGenerateSelfSignedCertificate function?
*/
-#undef HAVE_SECPOLICYCREATESSL
+#undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE
/*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecKeychainOpen function?
*/
-#undef HAVE_SECPOLICYCREATESSL
+#undef HAVE_SECKEYCHAINOPEN
/*
- * Do we have the cssmErrorString function?
+ * Do we have (a working) SSLSetEnabledCiphers function?
*/
-#undef HAVE_CSSMERRORSTRING
+#undef HAVE_SSLSETENABLEDCIPHERS
/*
@@ -466,13 +475,6 @@
/*
- * Do we have the AIX usersec.h header file?
- */
-
-#undef HAVE_USERSEC_H
-
-
-/*
* Do we have pthread support?
*/
@@ -485,6 +487,14 @@
#undef HAVE_LAUNCH_H
#undef HAVE_LAUNCHD
+#undef HAVE_LAUNCH_ACTIVATE_SOCKET
+
+
+/*
+ * Do we have systemd support?
+ */
+
+#undef HAVE_SYSTEMD
/*
@@ -560,18 +570,12 @@
/*
- * Do we have Darwin's IOKit private headers?
- */
-
-#undef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H
-
-
-/*
* Do we have DBUS?
*/
#undef HAVE_DBUS
#undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND
+#undef HAVE_DBUS_THREADS_INIT
/*
@@ -648,7 +652,7 @@
#ifdef HAVE_ARC4RANDOM
# define CUPS_RAND() arc4random()
-# define CUPS_SRAND(v) arc4random_stir()
+# define CUPS_SRAND(v)
#elif defined(HAVE_RANDOM)
# define CUPS_RAND() random()
# define CUPS_SRAND(v) srandom(v)
@@ -662,13 +666,6 @@
/*
- * Do we have vproc_transaction_begin/end?
- */
-
-#undef HAVE_VPROC_TRANSACTION_BEGIN
-
-
-/*
* Do we have libusb?
*/
@@ -743,5 +740,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); }
#endif /* !_CUPS_CONFIG_H_ */
/*
- * End of "$Id: config.h.in 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: config.h.in 12687 2015-06-03 17:19:04Z msweet $".
*/
diff --git a/configure b/configure
index 8582cb8..4170ff3 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,8 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68.
+# Generated by GNU Autoconf 2.68 for CUPS 2.1.2.
+#
+# Report bugs to <https://www.cups.org/str.php>.
#
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -236,7 +238,8 @@ fi
$as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://www.cups.org/str.php about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -555,14 +558,13 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
-
-ac_unique_file="cups/cups.h"
+PACKAGE_NAME='CUPS'
+PACKAGE_TARNAME='cups'
+PACKAGE_VERSION='2.1.2'
+PACKAGE_STRING='CUPS 2.1.2'
+PACKAGE_BUGREPORT='https://www.cups.org/str.php'
+PACKAGE_URL='https://www.cups.org/'
+
# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
@@ -625,6 +627,7 @@ CUPS_USER
CUPS_DEFAULT_SHARED
CUPS_BROWSE_LOCAL_PROTOCOLS
CUPS_BROWSING
+CUPS_PAGE_LOG_FORMAT
CUPS_ACCESS_LOG_LEVEL
CUPS_LOG_LEVEL
CUPS_FATAL_ERRORS
@@ -633,8 +636,19 @@ CUPS_CUPSD_FILE_PERM
CUPS_CONFIG_FILE_PERM
CUPS_BUNDLEDIR
LANGUAGES
-LAUNCHDLIBS
-DEFAULT_LAUNCHD_CONF
+XINETD
+RCSTOP
+RCSTART
+RCLEVELS
+INITDDIR
+INITDIR
+SMFMANIFESTDIR
+SYSTEMD_DIR
+LAUNCHD_DIR
+ONDEMANDLIBS
+ONDEMANDFLAGS
+IPPFIND_MAN
+IPPFIND_BIN
DNSSD_BACKEND
DNSSDLIBS
LARGEFILE
@@ -647,8 +661,7 @@ EXPORT_SSLLIBS
SSLLIBS
SSLFLAGS
IPPALIASES
-CUPS_SERVERKEY
-CUPS_SERVERCERT
+CUPS_SERVERKEYCHAIN
LIBGCRYPTCONFIG
LIBGNUTLSCONFIG
PTHREAD_FLAGS
@@ -703,13 +716,6 @@ MENUDIR
ICONDIR
CUPS_DATADIR
CUPS_CACHEDIR
-XINETD
-SMFMANIFESTDIR
-RCSTOP
-RCSTART
-RCLEVELS
-INITDDIR
-INITDIR
PRIVATEINCLUDE
privateinclude
BUILDDIRS
@@ -816,12 +822,6 @@ with_adminkey
with_operkey
with_components
with_privateinclude
-with_rcdir
-with_rclevels
-with_rcstart
-with_rcstop
-with_smfmanifestdir
-with_xinetd
with_lpdconfig
with_smbconfig
with_cachedir
@@ -830,6 +830,7 @@ with_menudir
with_docdir
with_fontpath
with_logdir
+with_rundir
enable_shared
enable_libtool_unsupported
with_optim
@@ -847,9 +848,6 @@ enable_threads
enable_ssl
enable_cdsassl
enable_gnutls
-enable_openssl
-with_openssl_libs
-with_openssl_includes
enable_pam
with_pam_module
enable_largefile
@@ -858,6 +856,14 @@ enable_dnssd
with_dnssd_libs
with_dnssd_includes
enable_launchd
+enable_systemd
+with_systemd
+with_smfmanifestdir
+with_rcdir
+with_rclevels
+with_rcstart
+with_rcstop
+with_xinetd
with_languages
with_bundledir
with_config_file_perm
@@ -866,6 +872,7 @@ with_log_file_perm
with_fatal_errors
with_log_level
with_access_log_level
+enable_page_logging
enable_browsing
with_local_protocols
enable_default_shared
@@ -938,7 +945,7 @@ sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE}'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
@@ -1440,7 +1447,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures this package to adapt to many kinds of systems.
+\`configure' configures CUPS 2.1.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1488,7 +1495,7 @@ Fine tuning of the installation directories:
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
- --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/cups]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
@@ -1500,7 +1507,9 @@ _ACEOF
fi
if test -n "$ac_init_help"; then
-
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of CUPS 2.1.2:";;
+ esac
cat <<\_ACEOF
Optional Features:
@@ -1513,7 +1522,7 @@ Optional Features:
--enable-libusb use libusb for USB printing
--enable-tcp-wrappers use libwrap for TCP wrappers support
--enable-acl build with POSIX ACL support
- --enable-dbus build with DBUS support
+ --disable-dbus build without DBUS support
--disable-shared do not create shared libraries
--enable-libtool-unsupported
build with libtool (UNSUPPORTED!)
@@ -1527,12 +1536,13 @@ Optional Features:
--disable-ssl disable SSL/TLS support
--enable-cdsassl use CDSA for SSL/TLS support, default=first
--enable-gnutls use GNU TLS for SSL/TLS support, default=second
- --enable-openssl use OpenSSL for SSL/TLS support, default=third
--disable-pam disable PAM support
--disable-largefile omit support for large files
--disable-avahi disable DNS Service Discovery support using Avahi
--disable-dnssd disable DNS Service Discovery support using mDNSResponder
--disable-launchd disable launchd support
+ --disable-systemd disable systemd support
+ --enable-page-logging enable page_log by default
--disable-browsing disable Browsing by default
--disable-default-shared
disable DefaultShared by default
@@ -1550,12 +1560,6 @@ Optional Packages:
- "all" (default) builds everything
- "core" builds libcups and ipptool
--with-privateinclude set path for private include files, default=none
- --with-rcdir set path for rc scripts
- --with-rclevels set run levels for rc scripts
- --with-rcstart set start number for rc scripts
- --with-rcstop set stop number for rc scripts
- --with-smfmanifestdir set path for Solaris SMF manifest
- --with-xinetd set path for xinetd config files
--with-lpdconfig set URI for LPD config file
--with-smbconfig set URI for Samba config file
--with-cachedir set path for cache files
@@ -1564,16 +1568,22 @@ Optional Packages:
--with-docdir set path for documentation
--with-fontpath set font path for pstoraster
--with-logdir set path for log files
+ --with-rundir set transient run-time state directory
--with-optim set optimization flags
--with-archflags set default architecture flags
--with-ldarchflags set program architecture flags
--with-domainsocket set unix domain socket name
--with-gssservicename set default gss service name
- --with-openssl-libs set directory for OpenSSL library
- --with-openssl-includes set directory for OpenSSL includes
--with-pam-module specify the PAM module to use
--with-dnssd-libs set directory for DNS Service Discovery library
--with-dnssd-includes set directory for DNS Service Discovery includes
+ --with-systemd set directory for systemd service files
+ --with-smfmanifestdir set path for Solaris SMF manifest
+ --with-rcdir set path for rc scripts
+ --with-rclevels set run levels for rc scripts
+ --with-rcstart set start number for rc scripts
+ --with-rcstop set stop number for rc scripts
+ --with-xinetd set path for xinetd config files
--with-languages set installed languages, default=all
--with-bundledir set OS X localization bundle directory
--with-config-file-perm set default ConfigFilePerm value, default=0640
@@ -1581,7 +1591,7 @@ Optional Packages:
--with-log-file-perm set default LogFilePerm value, default=0644
--with-fatal-errors set default FatalErrors value, default=config
--with-log-level set default LogLevel value, default=warn
- --with-access-log-level set default AccessLogLevel value, default=actions
+ --with-access-log-level set default AccessLogLevel value, default=none
--with-local-protocols set default BrowseLocalProtocols, default=""
--with-cups-user set default user for CUPS
--with-cups-group set default group for CUPS
@@ -1613,7 +1623,8 @@ Some influential environment variables:
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
-Report bugs to the package provider.
+Report bugs to <https://www.cups.org/str.php>.
+CUPS home page: <https://www.cups.org/>.
_ACEOF
ac_status=$?
fi
@@ -1676,7 +1687,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-configure
+CUPS configure 2.1.2
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1961,6 +1972,10 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------------- ##
+## Report this to https://www.cups.org/str.php ##
+## ------------------------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
@@ -2136,7 +2151,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by $as_me, which was
+It was created by CUPS $as_me 2.1.2, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
@@ -2491,12 +2506,16 @@ uversion=`uname -r | sed -e '1,$s/^[^0-9]*\([0-9]*\)\.\([0-9]*\).*/\1\2/'`
uarch=`uname -m`
case "$uname" in
+ Darwin*)
+ uname="Darwin"
+ if test $uversion -lt 120; then
+ as_fn_error $? "Sorry, this version of CUPS requires OS X 10.8 or higher." "$LINENO" 5
+ fi
+ ;;
+
GNU* | GNU/*)
uname="GNU"
;;
- IRIX*)
- uname="IRIX"
- ;;
Linux*)
uname="Linux"
;;
@@ -2504,16 +2523,25 @@ esac
+ac_config_headers="$ac_config_headers config.h"
-ac_config_headers="$ac_config_headers config.h"
+CUPS_VERSION=2.1.2
+case "$CUPS_VERSION" in
+ *svn)
+ if test -z "$CUPS_REVISION" -a -d .svn; then
+ CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[a-zA-Z]*//g'`"
+ else
+ CUPS_REVISION=""
+ fi
+ ;;
+
+ *)
+ CUPS_REVISION=""
+ ;;
+esac
-CUPS_VERSION=1.6.4
-CUPS_REVISION=
-#if test -z "$CUPS_REVISION" -a -d .svn; then
-# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
-#fi
CUPS_BUILD="cups-$CUPS_VERSION"
@@ -4101,8 +4129,9 @@ fi
-# Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKGCONFIG+:} false; then :
@@ -4141,6 +4170,63 @@ $as_echo "no" >&6; }
fi
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+ ac_pt_PKGCONFIG=$PKGCONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKGCONFIG" = x; then
+ PKGCONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKGCONFIG=$ac_pt_PKGCONFIG
+ fi
+else
+ PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing abs" >&5
@@ -4821,13 +4907,6 @@ if test "x$ac_cv_header_bstring_h" = xyes; then :
fi
-ac_fn_c_check_header_mongrel "$LINENO" "usersec.h" "ac_cv_header_usersec_h" "$ac_includes_default"
-if test "x$ac_cv_header_usersec_h" = xyes; then :
- $as_echo "#define HAVE_USERSEC_H 1" >>confdefs.h
-
-fi
-
-
ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_ioctl_h" = xyes; then :
$as_echo "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h
@@ -4849,9 +4928,9 @@ if test "x$ac_cv_header_sys_ucred_h" = xyes; then :
fi
-ac_fn_c_check_header_mongrel "$LINENO" "scsi/sg.h" "ac_cv_header_scsi_sg_h" "$ac_includes_default"
-if test "x$ac_cv_header_scsi_sg_h" = xyes; then :
- $as_echo "#define HAVE_SCSI_SG_H 1" >>confdefs.h
+ac_fn_c_check_header_mongrel "$LINENO" "asl.h" "ac_cv_header_asl_h" "$ac_includes_default"
+if test "x$ac_cv_header_asl_h" = xyes; then :
+ $as_echo "#define HAVE_ASL_H 1" >>confdefs.h
fi
@@ -4919,6 +4998,64 @@ if test "$ac_res" != no; then :
SAVELIBS="$SAVELIBS $LIBS"
fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing libiconv_open" >&5
+$as_echo_n "checking for library containing libiconv_open... " >&6; }
+if ${ac_cv_search_libiconv_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char libiconv_open ();
+int
+main ()
+{
+return libiconv_open ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' iconv; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_libiconv_open=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_libiconv_open+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_libiconv_open+:} false; then :
+
+else
+ ac_cv_search_libiconv_open=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_libiconv_open" >&5
+$as_echo "$ac_cv_search_libiconv_open" >&6; }
+ac_res=$ac_cv_search_libiconv_open
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ $as_echo "#define HAVE_ICONV_H 1" >>confdefs.h
+
+ SAVELIBS="$SAVELIBS $LIBS"
+fi
+
LIBS="$SAVELIBS"
fi
@@ -5156,6 +5293,18 @@ fi
done
+for ac_func in posix_spawn
+do :
+ ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn"
+if test "x$ac_cv_func_posix_spawn" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POSIX_SPAWN 1
+_ACEOF
+
+fi
+done
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff member in tm structure" >&5
$as_echo_n "checking for tm_gmtoff member in tm structure... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5230,7 +5379,7 @@ USBQUIRKS=""
if test "x$PKGCONFIG" != x; then
- if test x$enable_libusb = xyes -o $uname != Darwin; then
+ if test x$enable_libusb != xno -a $uname != Darwin; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libusb-1.0" >&5
$as_echo_n "checking for libusb-1.0... " >&6; }
if $PKGCONFIG --exists libusb-1.0; then
@@ -5244,6 +5393,9 @@ $as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
+ if test x$enable_libusb = xyes; then
+ as_fn_error $? "libusb required for --enable-libusb." "$LINENO" 5
+ fi
fi
fi
elif test x$enable_libusb = xyes; then
@@ -5355,6 +5507,47 @@ if test "x$ac_cv_lib_z_gzgets" = xyes; then :
LIBZ="-lz"
LIBS="$LIBS -lz"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz" >&5
+$as_echo_n "checking for inflateCopy in -lz... " >&6; }
+if ${ac_cv_lib_z_inflateCopy+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inflateCopy ();
+int
+main ()
+{
+return inflateCopy ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_z_inflateCopy=yes
+else
+ ac_cv_lib_z_inflateCopy=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy" >&5
+$as_echo "$ac_cv_lib_z_inflateCopy" >&6; }
+if test "x$ac_cv_lib_z_inflateCopy" = xyes; then :
+ $as_echo "#define HAVE_INFLATECOPY 1" >>confdefs.h
+
+fi
+
if test "x$GZIP" != z; then
INSTALL_GZIP="-z"
fi
@@ -5451,12 +5644,6 @@ fi
fi
LIBS="$SAVELIBS"
-if test -d /etc/dbus-1; then
- DBUSDIR="/etc/dbus-1"
-else
- DBUSDIR=""
-fi
-
# Check whether --enable-dbus was given.
if test "${enable_dbus+set}" = set; then :
enableval=$enable_dbus;
@@ -5469,10 +5656,11 @@ if test "${with_dbusdir+set}" = set; then :
fi
+DBUSDIR=""
DBUS_NOTIFIER=""
DBUS_NOTIFIERLIBS=""
-if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
+if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$uname" != xDarwin; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5
$as_echo_n "checking for DBUS... " >&6; }
if $PKGCONFIG --exists dbus-1; then
@@ -5492,7 +5680,16 @@ if test "x$ac_cv_func_dbus_message_iter_init_append" = xyes; then :
fi
+ ac_fn_c_check_func "$LINENO" "dbus_threads_init" "ac_cv_func_dbus_threads_init"
+if test "x$ac_cv_func_dbus_threads_init" = xyes; then :
+ $as_echo "#define HAVE_DBUS_THREADS_INIT 1" >>confdefs.h
+
+fi
+
LIBS="$SAVELIBS"
+ if test -d /etc/dbus-1; then
+ DBUSDIR="/etc/dbus-1"
+ fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@@ -5542,13 +5739,6 @@ if test "x$ac_cv_header_CoreFoundation_CFBundlePriv_h" = xyes; then :
fi
- ac_fn_c_check_header_mongrel "$LINENO" "IOKit/pwr_mgt/IOPMLibPrivate.h" "ac_cv_header_IOKit_pwr_mgt_IOPMLibPrivate_h" "$ac_includes_default"
-if test "x$ac_cv_header_IOKit_pwr_mgt_IOPMLibPrivate_h" = xyes; then :
- $as_echo "#define HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H 1" >>confdefs.h
-
-fi
-
-
for ac_func in SCDynamicStoreCopyComputerName
do :
@@ -5588,18 +5778,6 @@ fi
done
- for ac_func in vproc_transaction_begin
-do :
- ac_fn_c_check_func "$LINENO" "vproc_transaction_begin" "ac_cv_func_vproc_transaction_begin"
-if test "x$ac_cv_func_vproc_transaction_begin" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_VPROC_TRANSACTION_BEGIN 1
-_ACEOF
-
-fi
-done
-
-
ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
if test "x$ac_cv_header_dlfcn_h" = xyes; then :
$as_echo "#define HAVE_DLFCN_H 1" >>confdefs.h
@@ -5843,19 +6021,11 @@ fi
if test "$libdir" = "\${exec_prefix}/lib"; then
case "$uname" in
- IRIX*)
- libdir="$exec_prefix/lib32"
- ;;
Linux*)
if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
libdir="$exec_prefix/lib64"
fi
;;
- HP-UX*)
- if test -d /usr/lib/hpux32; then
- libdir="$exec_prefix/lib/hpux32"
- fi
- ;;
esac
fi
@@ -5877,166 +6047,6 @@ fi
-# Check whether --with-rcdir was given.
-if test "${with_rcdir+set}" = set; then :
- withval=$with_rcdir; rcdir="$withval"
-else
- rcdir=""
-fi
-
-
-# Check whether --with-rclevels was given.
-if test "${with_rclevels+set}" = set; then :
- withval=$with_rclevels; rclevels="$withval"
-else
- rclevels="2 3 5"
-fi
-
-
-# Check whether --with-rcstart was given.
-if test "${with_rcstart+set}" = set; then :
- withval=$with_rcstart; rcstart="$withval"
-else
- rcstart="99"
-fi
-
-
-# Check whether --with-rcstop was given.
-if test "${with_rcstop+set}" = set; then :
- withval=$with_rcstop; rcstop="$withval"
-else
- rcstop="00"
-fi
-
-
-# Check whether --with-smfmanifestdir was given.
-if test "${with_smfmanifestdir+set}" = set; then :
- withval=$with_smfmanifestdir; smfmanifestdir="$withval"
-else
- smfmanifestdir=""
-fi
-
-
-INITDIR=""
-INITDDIR=""
-RCLEVELS="$rclevels"
-RCSTART="$rcstart"
-RCSTOP="$rcstop"
-SMFMANIFESTDIR=""
-
-if test x$rcdir = x; then
- case "$uname" in
- AIX*)
- INITDIR="/etc/rc.d"
- ;;
-
- Darwin*)
- # Darwin and MacOS X...
- if test -x /sbin/launchd; then
- INITDDIR="/System/Library/LaunchDaemons"
- else
- INITDDIR="/System/Library/StartupItems/PrintingServices"
- fi
- ;;
-
- FreeBSD* | OpenBSD* | MirBSD* | ekkoBSD*)
- # FreeBSD and OpenBSD
- ;;
-
- HP-UX*)
- INITDIR="/sbin"
- RCLEVELS="2"
- RCSTART="380"
- RCSTOP="620"
- ;;
-
- IRIX*)
- # IRIX
- INITDIR="/etc"
- RCSTART="60"
- RCSTOP="25"
- ;;
-
- Linux | GNU | GNU/k*BSD*)
- # Linux/HURD seems to choose an init.d directory at random...
- if test -d /sbin/init.d; then
- # SuSE
- INITDIR="/sbin/init.d"
- else
- if test -d /etc/init.d; then
- # Others
- INITDIR="/etc"
- else
- # RedHat
- INITDIR="/etc/rc.d"
- fi
- fi
- RCSTART="81"
- RCSTOP="36"
- ;;
-
- NetBSD*)
- # NetBSD
- INITDDIR="/etc/rc.d"
- ;;
-
- OSF1*)
- INITDIR="/sbin"
- ;;
-
- SunOS*)
- # Solaris
- if test "x$smfmanifestdir" != x; then
- SMFMANIFESTDIR=$smfmanifestdir
- else
- INITDIR="/etc"
- RCSTART="81"
- fi
- ;;
-
- *)
- INITDIR="/etc"
- ;;
-
- esac
-elif test "x$rcdir" != xno; then
- if test "x$rclevels" = x; then
- INITDDIR="$rcdir"
- else
- INITDIR="$rcdir"
- fi
-fi
-
-
-
-
-
-
-
-
-
-# Check whether --with-xinetd was given.
-if test "${with_xinetd+set}" = set; then :
- withval=$with_xinetd; XINETD="$withval"
-else
- XINETD=""
-fi
-
-
-if test "x$XINETD" = x -a ! -x /sbin/launchd; then
- for dir in /private/etc/xinetd.d /etc/xinetd.d /usr/local/etc/xinetd.d; do
- if test -d $dir; then
- XINETD="$dir"
- break
- fi
- done
-elif test "x$XINETD" = xno; then
- XINETD=""
-fi
-
-
-
-
# Check whether --with-lpdconfig was given.
if test "${with_lpdconfig+set}" = set; then :
withval=$with_lpdconfig; LPDCONFIG="$withval"
@@ -6220,10 +6230,6 @@ if test "$localedir" = "\${datarootdir}/locale"; then
CUPS_LOCALEDIR="$datarootdir/locale"
;;
- OSF1* | AIX*)
- CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
- ;;
-
*)
# This is the standard System V location...
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
@@ -6302,16 +6308,24 @@ _ACEOF
# Transient run-time state
-case "$uname" in
- Darwin*)
- # Darwin (OS X)
- CUPS_STATEDIR="$CUPS_SERVERROOT"
- ;;
- *)
- # All others
- CUPS_STATEDIR="$localstatedir/run/cups"
- ;;
-esac
+
+# Check whether --with-rundir was given.
+if test "${with_rundir+set}" = set; then :
+ withval=$with_rundir; CUPS_STATEDIR="$withval"
+else
+
+ case "$uname" in
+ Darwin*)
+ # Darwin (OS X)
+ CUPS_STATEDIR="$CUPS_SERVERROOT"
+ ;;
+ *)
+ # All others
+ CUPS_STATEDIR="$localstatedir/run/cups"
+ ;;
+ esac
+fi
+
cat >>confdefs.h <<_ACEOF
#define CUPS_STATEDIR "$CUPS_STATEDIR"
_ACEOF
@@ -6328,18 +6342,12 @@ fi
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
case "$uname" in
- Darwin* | Linux | GNU | *BSD* | AIX*)
- # Darwin, MacOS X, Linux, GNU HURD, *BSD, and AIX
+ Darwin* | Linux | GNU | *BSD*)
+ # Darwin, MacOS X, Linux, GNU HURD, and *BSD
mandir="/usr/share/man"
AMANDIR="/usr/share/man"
PMANDIR="/usr/share/man"
;;
- IRIX)
- # SGI IRIX
- mandir="/usr/share/catman/u_man"
- AMANDIR="/usr/share/catman/a_man"
- PMANDIR="/usr/share/catman/p_man"
- ;;
*)
# All others
mandir="/usr/man"
@@ -6356,16 +6364,8 @@ fi
case "$uname" in
- IRIX*)
- # SGI IRIX
- MAN1EXT=1
- MAN5EXT=5
- MAN7EXT=7
- MAN8EXT=1m
- MAN8DIR=1
- ;;
- SunOS* | HP-UX*)
- # Solaris and HP-UX
+ SunOS*)
+ # Solaris
MAN1EXT=1
MAN5EXT=5
MAN7EXT=7
@@ -6424,51 +6424,7 @@ if test x$enable_shared != xno; then
DSOXX="\$(CXX)"
DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)"
;;
- UNIX_S*)
- LIBCUPS="lib$cupsbase.so.2"
- LIBCUPSCGI="libcupscgi.so.1"
- LIBCUPSIMAGE="libcupsimage.so.2"
- LIBCUPSMIME="libcupsmime.so.1"
- LIBCUPSPPDC="libcupsppdc.so.1"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -Wl,-h,\`basename \$@\` -G \$(OPTIM)"
- ;;
- HP-UX*)
- case "$uarch" in
- ia64)
- LIBCUPS="lib$cupsbase.so.2"
- LIBCUPSCGI="libcupscgi.so.1"
- LIBCUPSIMAGE="libcupsimage.so.2"
- LIBCUPSMIME="libcupsmime.so.1"
- LIBCUPSPPDC="libcupsppdc.so.1"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -Wl,-b,-z,+h,\`basename \$@\`"
- ;;
- *)
- LIBCUPS="lib$cupsbase.sl.2"
- LIBCUPSCGI="libcupscgi.sl.1"
- LIBCUPSIMAGE="libcupsimage.sl.2"
- LIBCUPSMIME="libcupsmime.sl.1"
- LIBCUPSPPDC="libcupsppdc.sl.1"
- DSO="\$(LD)"
- DSOXX="\$(LD)"
- DSOFLAGS="$DSOFLAGS -b -z +h \`basename \$@\`"
- ;;
- esac
- ;;
- IRIX)
- LIBCUPS="lib$cupsbase.so.2"
- LIBCUPSCGI="libcupscgi.so.1"
- LIBCUPSIMAGE="libcupsimage.so.2"
- LIBCUPSMIME="libcupsmime.so.1"
- LIBCUPSPPDC="libcupsppdc.so.1"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -set_version,sgi2.6,-soname,\`basename \$@\` -shared \$(OPTIM)"
- ;;
- OSF1* | Linux | GNU | *BSD*)
+ Linux | GNU | *BSD*)
LIBCUPS="lib$cupsbase.so.2"
LIBCUPSCGI="libcupscgi.so.1"
LIBCUPSIMAGE="libcupsimage.so.2"
@@ -6488,17 +6444,6 @@ if test x$enable_shared != xno; then
DSOXX="\$(CXX)"
DSOFLAGS="$DSOFLAGS -dynamiclib -single_module -lc"
;;
- AIX*)
- LIBCUPS="lib${cupsbase}_s.a"
- LIBCUPSBASE="${cupsbase}_s"
- LIBCUPSCGI="libcupscgi_s.a"
- LIBCUPSIMAGE="libcupsimage_s.a"
- LIBCUPSMIME="libcupsmime_s.a"
- LIBCUPSPPDC="libcupsppdc_s.a"
- DSO="\$(CC)"
- DSOXX="\$(CXX)"
- DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)"
- ;;
*)
echo "Warning: shared libraries may not be supported. Trying -shared"
echo " option with compiler."
@@ -6541,19 +6486,11 @@ if test x$enable_shared = xno; then
EXTLINKCUPS="-lcups"
EXTLINKCUPSIMAGE="-lcupsimage"
else
- if test $uname = AIX; then
- LINKCUPS="-l${cupsbase}_s"
- LINKCUPSIMAGE="-lcupsimage_s"
-
- EXTLINKCUPS="-lcups_s"
- EXTLINKCUPSIMAGE="-lcupsimage_s"
- else
- LINKCUPS="-l${cupsbase}"
- LINKCUPSIMAGE="-lcupsimage"
+ LINKCUPS="-l${cupsbase}"
+ LINKCUPSIMAGE="-lcupsimage"
- EXTLINKCUPS="-lcups"
- EXTLINKCUPSIMAGE="-lcupsimage"
- fi
+ EXTLINKCUPS="-lcups"
+ EXTLINKCUPSIMAGE="-lcupsimage"
fi
@@ -6575,19 +6512,6 @@ if test "$DSO" != ":"; then
# need this option, even when the library is installed in a
# standard location...
case $uname in
- HP-UX*)
- # HP-UX needs the path, even for /usr/lib...
- case "$uarch" in
- ia64)
- DSOFLAGS="-Wl,+s,+b,$libdir $DSOFLAGS"
- ;;
- *)
- DSOFLAGS="+s +b $libdir $DSOFLAGS"
- ;;
- esac
- LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
- EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
- ;;
SunOS*)
# Solaris...
if test $exec_prefix != /usr; then
@@ -6604,8 +6528,8 @@ if test "$DSO" != ":"; then
EXPORT_LDFLAGS="-Wl,-R$libdir"
fi
;;
- IRIX | Linux | GNU)
- # IRIX, Linux, and HURD...
+ Linux | GNU)
+ # Linux, and HURD...
if test $exec_prefix != /usr; then
DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
@@ -6764,15 +6688,15 @@ if test -n "$GCC"; then
fi
# Generate position-independent code as needed...
- if test $PICFLAG = 1 -a $uname != AIX; then
+ if test $PICFLAG = 1; then
OPTIM="-fPIC $OPTIM"
fi
# The -fstack-protector option is available with some versions of
# GCC and adds "stack canaries" which detect when the return address
# has been overwritten, preventing many types of exploit attacks.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fstack-protector" >&5
-$as_echo_n "checking if GCC supports -fstack-protector... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fstack-protector" >&5
+$as_echo_n "checking whether compiler supports -fstack-protector... " >&6; }
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fstack-protector"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -6787,7 +6711,12 @@ main ()
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- OPTIM="$OPTIM -fstack-protector"
+ if test "x$LSB_BUILD" = xy; then
+ # Can't use stack-protector with LSB binaries...
+ OPTIM="$OPTIM -fno-stack-protector"
+ else
+ OPTIM="$OPTIM -fstack-protector"
+ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
@@ -6798,14 +6727,19 @@ rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$OLDCFLAGS"
- # The -fPIE option is available with some versions of GCC and adds
- # randomization of addresses, which avoids another class of exploits
- # that depend on a fixed address for common functions.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fPIE" >&5
-$as_echo_n "checking if GCC supports -fPIE... " >&6; }
- OLDCFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fPIE"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if test "x$LSB_BUILD" != xy; then
+ # The -fPIE option is available with some versions of GCC and
+ # adds randomization of addresses, which avoids another class of
+ # exploits that depend on a fixed address for common functions.
+ #
+ # Not available to LSB binaries...
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fPIE" >&5
+$as_echo_n "checking whether compiler supports -fPIE... " >&6; }
+ OLDCFLAGS="$CFLAGS"
+ case "$uname" in
+ Darwin*)
+ CFLAGS="$CFLAGS -fPIE -Wl,-pie"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -6817,36 +6751,106 @@ main ()
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
- case "$CC" in
- *clang)
- PIEFLAGS="-fPIE -Wl,-pie"
+
+ PIEFLAGS="-fPIE -Wl,-pie"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;;
+
*)
- PIEFLAGS="-fPIE -pie"
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ CFLAGS="$CFLAGS -fPIE -pie"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ PIEFLAGS="-fPIE -pie"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$OLDCFLAGS"
+ ;;
+ esac
+ CFLAGS="$OLDCFLAGS"
+ fi
if test "x$with_optim" = x; then
# Add useful warning options for tracking down problems...
OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM"
- # Additional warning options for development testing...
- if test -d .svn; then
- OPTIM="-Wshadow -Werror $OPTIM"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -Wno-tautological-compare" >&5
-$as_echo_n "checking if GCC supports -Wno-tautological-compare... " >&6; }
- OLDCFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-unused-result" >&5
+$as_echo_n "checking whether compiler supports -Wno-unused-result... " >&6; }
+ OLDCFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-unused-result"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ OPTIM="$OPTIM -Wno-unused-result"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$OLDCFLAGS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wsign-conversion" >&5
+$as_echo_n "checking whether compiler supports -Wsign-conversion... " >&6; }
+ OLDCFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wsign-conversion"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ OPTIM="$OPTIM -Wsign-conversion"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$OLDCFLAGS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-tautological-compare" >&5
+$as_echo_n "checking whether compiler supports -Wno-tautological-compare... " >&6; }
+ OLDCFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -6859,14 +6863,18 @@ main ()
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
OPTIM="$OPTIM -Wno-tautological-compare"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$OLDCFLAGS"
+ CFLAGS="$OLDCFLAGS"
+
+ # Additional warning options for development testing...
+ if test -d .svn; then
+ OPTIM="-Werror $OPTIM"
fi
fi
@@ -6884,60 +6892,13 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# The -z relro option is provided by the Linux linker command to
# make relocatable data read-only.
if test x$enable_relro = xyes; then
- RELROFLAGS="-Wl,-z,relro"
+ RELROFLAGS="-Wl,-z,relro,-z,now"
fi
;;
esac
else
# Add vendor-specific compiler options...
case $uname in
- AIX*)
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O2 -qmaxmem=6000"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
- ;;
- HP-UX*)
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="+O2"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
-
- CFLAGS="-Ae $CFLAGS"
-
- if test $PICFLAG = 1; then
- OPTIM="+z $OPTIM"
- fi
- ;;
- IRIX)
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O2"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
-
- if test "x$with_optim" = x; then
- OPTIM="-fullwarn -woff 1183,1209,1349,1506,3201 $OPTIM"
- fi
- ;;
- OSF*)
- # Tru64 UNIX aka Digital UNIX aka OSF/1
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O"
- else
- OPTIM="$with_optim"
- fi
- fi
- ;;
SunOS*)
# Solaris
if test -z "$OPTIM"; then
@@ -6952,26 +6913,12 @@ else
OPTIM="-KPIC $OPTIM"
fi
;;
- UNIX_SVR*)
- # UnixWare
- if test -z "$OPTIM"; then
- if test "x$with_optim" = x; then
- OPTIM="-O"
- else
- OPTIM="$with_optim $OPTIM"
- fi
- fi
-
- if test $PICFLAG = 1; then
- OPTIM="-KPIC $OPTIM"
- fi
- ;;
*)
# Running some other operating system; inform the user they
# should contribute the necessary options to
# cups-support@cups.org...
echo "Building CUPS with default compiler optimizations; contact"
- echo "cups-bugs@cups.org with uname and compiler options needed"
+ echo "cups-devel@cups.org with uname and compiler options needed"
echo "for your platform, or set the CFLAGS and LDFLAGS environment"
echo "variables before running configure."
;;
@@ -6980,37 +6927,23 @@ fi
# Add general compiler options per platform...
case $uname in
- HP-UX*)
- # HP-UX 10.20 (at least) needs this definition to get the
- # h_errno global...
- OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED"
-
- # HP-UX 11.00 (at least) needs this definition to get the
- # u_short type used by the IP headers...
- OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE"
-
- # HP-UX 11.23 (at least) needs this definition to get the
- # IPv6 header to work...
- OPTIM="$OPTIM -D_HPUX_SOURCE"
- ;;
-
Linux*)
# glibc 2.8 and higher breaks peer credentials unless you
# define _GNU_SOURCE...
OPTIM="$OPTIM -D_GNU_SOURCE"
;;
-
- OSF*)
- # Tru64 UNIX aka Digital UNIX aka OSF/1 need to be told
- # to be POSIX-compliant...
- OPTIM="$OPTIM -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE"
- ;;
esac
-ac_fn_c_check_header_mongrel "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "$ac_includes_default"
+ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+"
if test "x$ac_cv_header_resolv_h" = xyes; then :
$as_echo "#define HAVE_RESOLV_H 1" >>confdefs.h
@@ -7647,21 +7580,6 @@ fi
-for ac_header in AppleTalk/at_proto.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "AppleTalk/at_proto.h" "ac_cv_header_AppleTalk_at_proto_h" "#include <netat/appletalk.h>
-"
-if test "x$ac_cv_header_AppleTalk_at_proto_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_APPLETALK_AT_PROTO_H 1
-_ACEOF
- $as_echo "#define HAVE_APPLETALK_AT_PROTO_H 1" >>confdefs.h
-
-fi
-
-done
-
-
ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll"
@@ -7695,8 +7613,9 @@ LIBGSSAPI=""
if test x$enable_gssapi != xno; then
- # Extract the first word of "krb5-config", so it can be a program name with args.
-set dummy krb5-config; ac_word=$2
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}krb5-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}krb5-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_KRB5CONFIG+:} false; then :
@@ -7735,6 +7654,63 @@ $as_echo "no" >&6; }
fi
+fi
+if test -z "$ac_cv_path_KRB5CONFIG"; then
+ ac_pt_KRB5CONFIG=$KRB5CONFIG
+ # Extract the first word of "krb5-config", so it can be a program name with args.
+set dummy krb5-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_KRB5CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_KRB5CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_KRB5CONFIG="$ac_pt_KRB5CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ac_pt_KRB5CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_KRB5CONFIG=$ac_cv_path_ac_pt_KRB5CONFIG
+if test -n "$ac_pt_KRB5CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_KRB5CONFIG" >&5
+$as_echo "$ac_pt_KRB5CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_KRB5CONFIG" = x; then
+ KRB5CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ KRB5CONFIG=$ac_pt_KRB5CONFIG
+ fi
+else
+ KRB5CONFIG="$ac_cv_path_KRB5CONFIG"
+fi
+
if test "x$KRB5CONFIG" != x; then
case "$uname" in
Darwin)
@@ -7914,53 +7890,27 @@ fi
if test -d /System/Library/Frameworks/GSS.framework; then
- gssdir="/System/Library/Frameworks/GSS.framework"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi.h presence" >&5
-$as_echo_n "checking for GSS/gssapi.h presence... " >&6; }
- if test -f $gssdir/Headers/gssapi.h; then
- $as_echo "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h
+ ac_fn_c_check_header_mongrel "$LINENO" "GSS/gssapi.h" "ac_cv_header_GSS_gssapi_h" "$ac_includes_default"
+if test "x$ac_cv_header_GSS_gssapi_h" = xyes; then :
+ $as_echo "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_generic.h presence" >&5
-$as_echo_n "checking for GSS/gssapi_generic.h presence... " >&6; }
- if test -f $gssdir/Headers/gssapi_generic.h; then
- $as_echo "#define HAVE_GSSAPI_GENERIC_H 1" >>confdefs.h
+fi
+
+
+ ac_fn_c_check_header_mongrel "$LINENO" "GSS/gssapi_generic.h" "ac_cv_header_GSS_gssapi_generic_h" "$ac_includes_default"
+if test "x$ac_cv_header_GSS_gssapi_generic_h" = xyes; then :
+ $as_echo "#define HAVE_GSS_GSSAPI_GENERIC_H 1" >>confdefs.h
+
+fi
+
+
+ ac_fn_c_check_header_mongrel "$LINENO" "GSS/gssapi_spi.h" "ac_cv_header_GSS_gssapi_spi_h" "$ac_includes_default"
+if test "x$ac_cv_header_GSS_gssapi_spi_h" = xyes; then :
+ $as_echo "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_spi.h presence" >&5
-$as_echo_n "checking for GSS/gssapi_spi.h presence... " >&6; }
- if test -f $gssdir/PrivateHeaders/gssapi_spi.h; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_spi.h usability" >&5
-$as_echo_n "checking for GSS/gssapi_spi.h usability... " >&6; }
- if test -s $gssdir/PrivateHeaders/gssapi_spi.h; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- $as_echo "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- if test $uversion -ge 110 -a $uversion -lt 120; then
- # Broken public headers in 10.7.x...
- as_fn_error $? "Run 'sudo mkdir -p $gssdir/PrivateHeaders' and 'sudo touch $gssdir/PrivateHeaders/gssapi_spi.h' to build CUPS." "$LINENO" 5
- fi
- fi
else
ac_fn_c_check_header_mongrel "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default"
if test "x$ac_cv_header_gssapi_h" = xyes; then :
@@ -8167,31 +8117,11 @@ if test "${enable_gnutls+set}" = set; then :
enableval=$enable_gnutls;
fi
-# Check whether --enable-openssl was given.
-if test "${enable_openssl+set}" = set; then :
- enableval=$enable_openssl;
-fi
-
-
-# Check whether --with-openssl-libs was given.
-if test "${with_openssl_libs+set}" = set; then :
- withval=$with_openssl_libs; LDFLAGS="-L$withval $LDFLAGS"
- DSOFLAGS="-L$withval $DSOFLAGS"
-fi
-
-
-# Check whether --with-openssl-includes was given.
-if test "${with_openssl_includes+set}" = set; then :
- withval=$with_openssl_includes; CFLAGS="-I$withval $CFLAGS"
- CPPFLAGS="-I$withval $CPPFLAGS"
-fi
-
SSLFLAGS=""
SSLLIBS=""
have_ssl=0
-CUPS_SERVERCERT=""
-CUPS_SERVERKEY=""
+CUPS_SERVERKEYCHAIN=""
if test x$enable_ssl != xno; then
if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then
@@ -8204,7 +8134,7 @@ if test "x$ac_cv_header_Security_SecureTransport_h" = xyes; then :
$as_echo "#define HAVE_CDSASSL 1" >>confdefs.h
- CUPS_SERVERCERT="/Library/Keychains/System.keychain"
+ CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain"
ac_fn_c_check_header_mongrel "$LINENO" "Security/SecureTransportPriv.h" "ac_cv_header_Security_SecureTransportPriv_h" "$ac_includes_default"
if test "x$ac_cv_header_Security_SecureTransportPriv_h" = xyes; then :
@@ -8264,53 +8194,25 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecCertificateCopyData" >&5
-$as_echo_n "checking for SecCertificateCopyData... " >&6; }
- if test $uversion -ge 100; then
- $as_echo "#define HAVE_SECCERTIFICATECOPYDATA 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecIdentitySearchCreateWithPolicy" >&5
-$as_echo_n "checking for SecIdentitySearchCreateWithPolicy... " >&6; }
- if test $uversion -ge 80; then
- $as_echo "#define HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+ $as_echo "#define HAVE_CSSMERRORSTRING 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecPolicyCreateSSL" >&5
-$as_echo_n "checking for SecPolicyCreateSSL... " >&6; }
- if test $uversion -ge 110; then
- $as_echo "#define HAVE_SECPOLICYCREATESSL 1" >>confdefs.h
+ $as_echo "#define HAVE_SECKEYCHAINOPEN 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
fi
- $as_echo "#define HAVE_CSSMERRORSTRING 1" >>confdefs.h
+ if test $uversion -ge 150; then
+ $as_echo "#define HAVE_SSLSETENABLEDCIPHERS 1" >>confdefs.h
+ fi
fi
fi
if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then
- # Extract the first word of "libgnutls-config", so it can be a program name with args.
-set dummy libgnutls-config; ac_word=$2
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}libgnutls-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}libgnutls-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_LIBGNUTLSCONFIG+:} false; then :
@@ -8349,8 +8251,66 @@ $as_echo "no" >&6; }
fi
- # Extract the first word of "libgcrypt-config", so it can be a program name with args.
-set dummy libgcrypt-config; ac_word=$2
+fi
+if test -z "$ac_cv_path_LIBGNUTLSCONFIG"; then
+ ac_pt_LIBGNUTLSCONFIG=$LIBGNUTLSCONFIG
+ # Extract the first word of "libgnutls-config", so it can be a program name with args.
+set dummy libgnutls-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_LIBGNUTLSCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_LIBGNUTLSCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_LIBGNUTLSCONFIG="$ac_pt_LIBGNUTLSCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ac_pt_LIBGNUTLSCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_LIBGNUTLSCONFIG=$ac_cv_path_ac_pt_LIBGNUTLSCONFIG
+if test -n "$ac_pt_LIBGNUTLSCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGNUTLSCONFIG" >&5
+$as_echo "$ac_pt_LIBGNUTLSCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_LIBGNUTLSCONFIG" = x; then
+ LIBGNUTLSCONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIBGNUTLSCONFIG=$ac_pt_LIBGNUTLSCONFIG
+ fi
+else
+ LIBGNUTLSCONFIG="$ac_cv_path_LIBGNUTLSCONFIG"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}libgcrypt-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_LIBGCRYPTCONFIG+:} false; then :
@@ -8389,6 +8349,63 @@ $as_echo "no" >&6; }
fi
+fi
+if test -z "$ac_cv_path_LIBGCRYPTCONFIG"; then
+ ac_pt_LIBGCRYPTCONFIG=$LIBGCRYPTCONFIG
+ # Extract the first word of "libgcrypt-config", so it can be a program name with args.
+set dummy libgcrypt-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_LIBGCRYPTCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_LIBGCRYPTCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_LIBGCRYPTCONFIG="$ac_pt_LIBGCRYPTCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ac_pt_LIBGCRYPTCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_LIBGCRYPTCONFIG=$ac_cv_path_ac_pt_LIBGCRYPTCONFIG
+if test -n "$ac_pt_LIBGCRYPTCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGCRYPTCONFIG" >&5
+$as_echo "$ac_pt_LIBGCRYPTCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_LIBGCRYPTCONFIG" = x; then
+ LIBGCRYPTCONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIBGCRYPTCONFIG=$ac_pt_LIBGCRYPTCONFIG
+ fi
+else
+ LIBGCRYPTCONFIG="$ac_cv_path_LIBGCRYPTCONFIG"
+fi
+
if $PKGCONFIG --exists gnutls; then
have_ssl=1
SSLLIBS=`$PKGCONFIG --libs gnutls`
@@ -8408,105 +8425,24 @@ fi
fi
if test $have_ssl = 1; then
- CUPS_SERVERCERT="ssl/server.crt"
- CUPS_SERVERKEY="ssl/server.key"
-
- if $PKGCONFIG --exists gcrypt; then
- SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`"
- SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`"
- elif test "x$LIBGCRYPTCONFIG" != x; then
- SSLLIBS="$SSLLIBS `$LIBGCRYPTCONFIG --libs`"
- SSLFLAGS="$SSLFLAGS `$LIBGCRYPTCONFIG --cflags`"
- fi
- fi
- fi
+ CUPS_SERVERKEYCHAIN="ssl"
- if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then
- ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default"
-if test "x$ac_cv_header_openssl_ssl_h" = xyes; then :
-
- SAVELIBS="$LIBS"
-
-
- for libcrypto in \
- "-lcrypto" \
- "-lcrypto -lrsaref" \
- "-lcrypto -lRSAglue -lrsaref"
- do
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5
-$as_echo_n "checking for SSL_new in -lssl... " >&6; }
-if ${ac_cv_lib_ssl_SSL_new+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lssl $libcrypto $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char SSL_new ();
-int
-main ()
-{
-return SSL_new ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_ssl_SSL_new=yes
-else
- ac_cv_lib_ssl_SSL_new=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_new" >&5
-$as_echo "$ac_cv_lib_ssl_SSL_new" >&6; }
-if test "x$ac_cv_lib_ssl_SSL_new" = xyes; then :
- have_ssl=1
- SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
- SSLLIBS="-lssl $libcrypto"
- $as_echo "#define HAVE_SSL 1" >>confdefs.h
-
- $as_echo "#define HAVE_LIBSSL 1" >>confdefs.h
+ SAVELIBS="$LIBS"
+ LIBS="$LIBS $SSLLIBS"
+ ac_fn_c_check_func "$LINENO" "gnutls_transport_set_pull_timeout_function" "ac_cv_func_gnutls_transport_set_pull_timeout_function"
+if test "x$ac_cv_func_gnutls_transport_set_pull_timeout_function" = xyes; then :
+ $as_echo "#define HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION 1" >>confdefs.h
fi
-
- if test "x${SSLLIBS}" != "x"; then
- break
- fi
- done
-
- if test "x${SSLLIBS}" != "x"; then
- CUPS_SERVERCERT="ssl/server.crt"
- CUPS_SERVERKEY="ssl/server.key"
-
- LIBS="$SAVELIBS $SSLLIBS"
- for ac_func in SSL_set_tlsext_host_name
-do :
- ac_fn_c_check_func "$LINENO" "SSL_set_tlsext_host_name" "ac_cv_func_SSL_set_tlsext_host_name"
-if test "x$ac_cv_func_SSL_set_tlsext_host_name" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_SSL_SET_TLSEXT_HOST_NAME 1
-_ACEOF
+ ac_fn_c_check_func "$LINENO" "gnutls_priority_set_direct" "ac_cv_func_gnutls_priority_set_direct"
+if test "x$ac_cv_func_gnutls_priority_set_direct" = xyes; then :
+ $as_echo "#define HAVE_GNUTLS_PRIORITY_SET_DIRECT 1" >>confdefs.h
fi
-done
-
- fi
LIBS="$SAVELIBS"
-fi
-
-
+ fi
fi
fi
@@ -8517,7 +8453,7 @@ $as_echo " Using SSLLIBS=\"$SSLLIBS\"" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Using SSLFLAGS=\"$SSLFLAGS\"" >&5
$as_echo " Using SSLFLAGS=\"$SSLFLAGS\"" >&6; }
IPPALIASES="http https ipps"
-elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes -o x$enable_openssl = xyes; then
+elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes; then
as_fn_error $? "Unable to enable SSL support." "$LINENO" 5
fi
@@ -8526,7 +8462,6 @@ fi
-
EXPORT_SSLLIBS="$SSLLIBS"
@@ -8544,10 +8479,6 @@ if test "${with_pam_module+set}" = set; then :
fi
-if test $uname = AIX; then
- enable_pam=no
-fi
-
PAMDIR=""
PAMFILE="pam.std"
PAMLIBS=""
@@ -9088,8 +9019,10 @@ fi
DNSSDLIBS=""
DNSSD_BACKEND=""
+IPPFIND_BIN=""
+IPPFIND_MAN=""
-if test "x$PKGCONFIG" != x -a x$enable_avahi != xno; then
+if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$uname != xDarwin; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Avahi" >&5
$as_echo_n "checking for Avahi... " >&6; }
if $PKGCONFIG --exists avahi-client; then
@@ -9098,6 +9031,8 @@ $as_echo "yes" >&6; }
CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`"
DNSSDLIBS="`$PKGCONFIG --libs avahi-client`"
DNSSD_BACKEND="dnssd"
+ IPPFIND_BIN="ippfind"
+ IPPFIND_MAN="ippfind.\$(MAN1EXT)"
$as_echo "#define HAVE_AVAHI 1" >>confdefs.h
else
@@ -9117,6 +9052,8 @@ if test "x$ac_cv_header_dns_sd_h" = xyes; then :
DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
DNSSD_BACKEND="dnssd"
+ IPPFIND_BIN="ippfind"
+ IPPFIND_MAN="ippfind.\$(MAN1EXT)"
;;
*)
# All others...
@@ -9147,7 +9084,9 @@ $as_echo "yes" >&6; }
DNSSDLIBS="-ldns_sd"
DNSSD_BACKEND="dnssd"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ IPPFIND_BIN="ippfind"
+ IPPFIND_MAN="ippfind.\$(MAN1EXT)"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -9166,14 +9105,19 @@ fi
+
+ONDEMANDFLAGS=""
+ONDEMANDLIBS=""
+
+
+
# Check whether --enable-launchd was given.
if test "${enable_launchd+set}" = set; then :
enableval=$enable_launchd;
fi
+LAUNCHD_DIR=""
-DEFAULT_LAUNCHD_CONF=""
-LAUNCHDLIBS=""
if test x$enable_launchd != xno; then
ac_fn_c_check_func "$LINENO" "launch_msg" "ac_cv_func_launch_msg"
@@ -9182,6 +9126,17 @@ if test "x$ac_cv_func_launch_msg" = xyes; then :
fi
+ if test $uversion -ge 140; then
+ ac_fn_c_check_func "$LINENO" "launch_activate_socket" "ac_cv_func_launch_activate_socket"
+if test "x$ac_cv_func_launch_activate_socket" = xyes; then :
+
+ $as_echo "#define HAVE_LAUNCHD 1" >>confdefs.h
+
+ $as_echo "#define HAVE_LAUNCH_ACTIVATE_SOCKET 1" >>confdefs.h
+
+fi
+
+ fi
ac_fn_c_check_header_mongrel "$LINENO" "launch.h" "ac_cv_header_launch_h" "$ac_includes_default"
if test "x$ac_cv_header_launch_h" = xyes; then :
$as_echo "#define HAVE_LAUNCH_H 1" >>confdefs.h
@@ -9193,7 +9148,7 @@ fi
case "$uname" in
Darwin*)
# Darwin, MacOS X
- DEFAULT_LAUNCHD_CONF="/System/Library/LaunchDaemons/org.cups.cupsd.plist"
+ LAUNCHD_DIR="/System/Library/LaunchDaemons"
# liblaunch is already part of libSystem
;;
*)
@@ -9202,7 +9157,204 @@ fi
esac
fi
+# Check whether --enable-systemd was given.
+if test "${enable_systemd+set}" = set; then :
+ enableval=$enable_systemd;
+fi
+
+
+# Check whether --with-systemd was given.
+if test "${with_systemd+set}" = set; then :
+ withval=$with_systemd; SYSTEMD_DIR="$withval"
+else
+ SYSTEMD_DIR=""
+fi
+
+
+
+if test x$enable_systemd != xno; then
+ if test "x$PKGCONFIG" = x; then
+ if test x$enable_systemd = xyes; then
+ as_fn_error $? "Need pkg-config to enable systemd support." "$LINENO" 5
+ fi
+ else
+ have_systemd=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5
+$as_echo_n "checking for libsystemd... " >&6; }
+ if $PKGCONFIG --exists libsystemd; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ have_systemd=yes
+ ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd`
+ ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd`
+ elif $PKGCONFIG --exists libsystemd-daemon; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - legacy" >&5
+$as_echo "yes - legacy" >&6; }
+ have_systemd=yes
+ ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd-daemon`
+ ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd-daemon`
+
+ if $PKGCONFIG --exists libsystemd-journal; then
+ ONDEMANDFLAGS="$ONDEMANDFLAGS `$PKGCONFIG --cflags libsystemd-journal`"
+ ONDEMANDLIBS="$ONDEMANDLIBS `$PKGCONFIG --libs libsystemd-journal`"
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+ if test $have_systemd = yes; then
+ $as_echo "#define HAVE_SYSTEMD 1" >>confdefs.h
+
+ ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-journal.h" "ac_cv_header_systemd_sd_journal_h" "$ac_includes_default"
+if test "x$ac_cv_header_systemd_sd_journal_h" = xyes; then :
+ $as_echo "#define HAVE_SYSTEMD_SD_JOURNAL_H 1" >>confdefs.h
+
+fi
+
+
+ if test "x$SYSTEMD_DIR" = x; then
+ SYSTEMD_DIR="`$PKGCONFIG --variable=systemdsystemunitdir systemd`"
+ fi
+ fi
+ fi
+fi
+
+SMFMANIFESTDIR=""
+
+
+# Check whether --with-smfmanifestdir was given.
+if test "${with_smfmanifestdir+set}" = set; then :
+ withval=$with_smfmanifestdir; SMFMANIFESTDIR="$withval"
+fi
+
+
+
+# Check whether --with-rcdir was given.
+if test "${with_rcdir+set}" = set; then :
+ withval=$with_rcdir; rcdir="$withval"
+else
+ rcdir=""
+fi
+
+
+# Check whether --with-rclevels was given.
+if test "${with_rclevels+set}" = set; then :
+ withval=$with_rclevels; rclevels="$withval"
+else
+ rclevels="2 3 5"
+fi
+
+
+# Check whether --with-rcstart was given.
+if test "${with_rcstart+set}" = set; then :
+ withval=$with_rcstart; rcstart="$withval"
+else
+ rcstart=""
+fi
+
+
+# Check whether --with-rcstop was given.
+if test "${with_rcstop+set}" = set; then :
+ withval=$with_rcstop; rcstop="$withval"
+else
+ rcstop=""
+fi
+
+
+if test x$rcdir = x; then
+ if test x$LAUNCHD_DIR = x -a x$SYSTEMD_DIR = x -a x$SMFMANIFESTDIR = x; then
+ # Fall back on "init", the original service startup interface...
+ if test -d /sbin/init.d; then
+ # SuSE
+ rcdir="/sbin/init.d"
+ elif test -d /etc/init.d; then
+ # Others
+ rcdir="/etc"
+ else
+ # RedHat, NetBSD
+ rcdir="/etc/rc.d"
+ fi
+ else
+ rcdir="no"
+ fi
+fi
+
+if test "x$rcstart" = x; then
+ case "$uname" in
+ Linux | GNU | GNU/k*BSD*)
+ # Linux
+ rcstart="81"
+ ;;
+
+ SunOS*)
+ # Solaris
+ rcstart="81"
+ ;;
+
+ *)
+ # Others
+ rcstart="99"
+ ;;
+ esac
+fi
+
+if test "x$rcstop" = x; then
+ case "$uname" in
+ Linux | GNU | GNU/k*BSD*)
+ # Linux
+ rcstop="36"
+ ;;
+
+ *)
+ # Others
+ rcstop="00"
+ ;;
+ esac
+fi
+
+INITDIR=""
+INITDDIR=""
+RCLEVELS="$rclevels"
+RCSTART="$rcstart"
+RCSTOP="$rcstop"
+
+
+
+
+
+
+if test "x$rcdir" != xno; then
+ if test "x$rclevels" = x; then
+ INITDDIR="$rcdir"
+ else
+ INITDIR="$rcdir"
+ fi
+fi
+
+# Check whether --with-xinetd was given.
+if test "${with_xinetd+set}" = set; then :
+ withval=$with_xinetd; xinetd="$withval"
+else
+ xinetd=""
+fi
+
+XINETD=""
+
+
+if test "x$xinetd" = x; then
+ if test ! -x /sbin/launchd; then
+ for dir in /etc/xinetd.d /usr/local/etc/xinetd.d; do
+ if test -d $dir; then
+ XINETD="$dir"
+ break
+ fi
+ done
+ fi
+elif test "x$xinetd" != xno; then
+ XINETD="$xinetd"
+fi
@@ -9319,7 +9471,7 @@ _ACEOF
if test "${with_access_log_level+set}" = set; then :
withval=$with_access_log_level; CUPS_ACCESS_LOG_LEVEL="$withval"
else
- CUPS_ACCESS_LOG_LEVEL="actions"
+ CUPS_ACCESS_LOG_LEVEL="none"
fi
@@ -9328,6 +9480,18 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
+# Check whether --enable-page_logging was given.
+if test "${enable_page_logging+set}" = set; then :
+ enableval=$enable_page_logging;
+fi
+
+if test "x$enable_page_logging" = xyes; then
+ CUPS_PAGE_LOG_FORMAT=""
+else
+ CUPS_PAGE_LOG_FORMAT="PageLogFormat"
+fi
+
+
# Check whether --enable-browsing was given.
if test "${enable_browsing+set}" = set; then :
enableval=$enable_browsing;
@@ -10081,7 +10245,7 @@ fi
-ac_config_files="$ac_config_files Makedefs conf/cups-files.conf conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf cups-config data/testprint desktop/cups.desktop doc/help/ref-cups-files-conf.html doc/help/ref-cupsd-conf.html doc/help/standard.html doc/index.html man/client.conf.man man/cups-deviced.man man/cups-driverd.man man/cups-files.conf.man man/cups-lpd.man man/cups-snmp.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist templates/header.tmpl packaging/cups.list $LANGFILES"
+ac_config_files="$ac_config_files Makedefs conf/cups-files.conf conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf cups-config desktop/cups.desktop doc/index.html man/client.conf.man man/cups-files.conf.man man/cups-lpd.man man/cups-snmp.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/org.cups.cups-lpdAT.service scheduler/org.cups.cupsd.path scheduler/org.cups.cupsd.service scheduler/org.cups.cupsd.socket templates/header.tmpl packaging/cups.list $LANGFILES"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@@ -10601,7 +10765,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by $as_me, which was
+This file was extended by CUPS $as_me 2.1.2, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -10657,13 +10821,14 @@ $config_files
Configuration headers:
$config_headers
-Report bugs to the package provider."
+Report bugs to <https://www.cups.org/str.php>.
+CUPS home page: <https://www.cups.org/>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-config.status
+CUPS config.status 2.1.2
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
@@ -10793,15 +10958,9 @@ do
"conf/pam.std") CONFIG_FILES="$CONFIG_FILES conf/pam.std" ;;
"conf/snmp.conf") CONFIG_FILES="$CONFIG_FILES conf/snmp.conf" ;;
"cups-config") CONFIG_FILES="$CONFIG_FILES cups-config" ;;
- "data/testprint") CONFIG_FILES="$CONFIG_FILES data/testprint" ;;
"desktop/cups.desktop") CONFIG_FILES="$CONFIG_FILES desktop/cups.desktop" ;;
- "doc/help/ref-cups-files-conf.html") CONFIG_FILES="$CONFIG_FILES doc/help/ref-cups-files-conf.html" ;;
- "doc/help/ref-cupsd-conf.html") CONFIG_FILES="$CONFIG_FILES doc/help/ref-cupsd-conf.html" ;;
- "doc/help/standard.html") CONFIG_FILES="$CONFIG_FILES doc/help/standard.html" ;;
"doc/index.html") CONFIG_FILES="$CONFIG_FILES doc/index.html" ;;
"man/client.conf.man") CONFIG_FILES="$CONFIG_FILES man/client.conf.man" ;;
- "man/cups-deviced.man") CONFIG_FILES="$CONFIG_FILES man/cups-deviced.man" ;;
- "man/cups-driverd.man") CONFIG_FILES="$CONFIG_FILES man/cups-driverd.man" ;;
"man/cups-files.conf.man") CONFIG_FILES="$CONFIG_FILES man/cups-files.conf.man" ;;
"man/cups-lpd.man") CONFIG_FILES="$CONFIG_FILES man/cups-lpd.man" ;;
"man/cups-snmp.man") CONFIG_FILES="$CONFIG_FILES man/cups-snmp.man" ;;
@@ -10813,6 +10972,10 @@ do
"scheduler/cups.sh") CONFIG_FILES="$CONFIG_FILES scheduler/cups.sh" ;;
"scheduler/cups.xml") CONFIG_FILES="$CONFIG_FILES scheduler/cups.xml" ;;
"scheduler/org.cups.cups-lpd.plist") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cups-lpd.plist" ;;
+ "scheduler/org.cups.cups-lpdAT.service") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cups-lpdAT.service" ;;
+ "scheduler/org.cups.cupsd.path") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cupsd.path" ;;
+ "scheduler/org.cups.cupsd.service") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cupsd.service" ;;
+ "scheduler/org.cups.cupsd.socket") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cupsd.socket" ;;
"templates/header.tmpl") CONFIG_FILES="$CONFIG_FILES templates/header.tmpl" ;;
"packaging/cups.list") CONFIG_FILES="$CONFIG_FILES packaging/cups.list" ;;
"$LANGFILES") CONFIG_FILES="$CONFIG_FILES $LANGFILES" ;;
diff --git a/configure.in b/configure.ac
index 33a7ba2..e6dc4fb 100644
--- a/configure.in
+++ b/configure.ac
@@ -1,19 +1,23 @@
dnl
-dnl "$Id: configure.in 11173 2013-07-23 12:31:34Z msweet $"
+dnl "$Id: configure.ac 12998 2015-12-02 15:09:04Z msweet $"
dnl
-dnl Configuration script for CUPS.
+dnl Configuration script for CUPS.
dnl
-dnl Copyright 2007-2013 by Apple Inc.
-dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
-dnl These coded instructions, statements, and computer programs are the
-dnl property of Apple Inc. and are protected by Federal copyright
-dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl which should have been included with this file. If this file is
-dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law. Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file. If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
-AC_INIT(cups/cups.h)
+dnl We need at least autoconf 2.60...
+AC_PREREQ(2.60)
+
+dnl Package name and version...
+AC_INIT([CUPS], [2.1.2], [https://www.cups.org/str.php], [cups], [https://www.cups.org/])
sinclude(config-scripts/cups-opsys.m4)
sinclude(config-scripts/cups-common.m4)
@@ -32,7 +36,7 @@ sinclude(config-scripts/cups-ssl.m4)
sinclude(config-scripts/cups-pam.m4)
sinclude(config-scripts/cups-largefile.m4)
sinclude(config-scripts/cups-dnssd.m4)
-sinclude(config-scripts/cups-launchd.m4)
+sinclude(config-scripts/cups-startup.m4)
sinclude(config-scripts/cups-defaults.m4)
sinclude(config-scripts/cups-scripting.m4)
@@ -66,15 +70,9 @@ AC_OUTPUT(Makedefs
conf/pam.std
conf/snmp.conf
cups-config
- data/testprint
desktop/cups.desktop
- doc/help/ref-cups-files-conf.html
- doc/help/ref-cupsd-conf.html
- doc/help/standard.html
doc/index.html
man/client.conf.man
- man/cups-deviced.man
- man/cups-driverd.man
man/cups-files.conf.man
man/cups-lpd.man
man/cups-snmp.man
@@ -86,6 +84,10 @@ AC_OUTPUT(Makedefs
scheduler/cups.sh
scheduler/cups.xml
scheduler/org.cups.cups-lpd.plist
+ scheduler/org.cups.cups-lpdAT.service
+ scheduler/org.cups.cupsd.path
+ scheduler/org.cups.cupsd.service
+ scheduler/org.cups.cupsd.socket
templates/header.tmpl
packaging/cups.list
$LANGFILES)
@@ -93,5 +95,5 @@ AC_OUTPUT(Makedefs
chmod +x cups-config
dnl
-dnl End of "$Id: configure.in 11173 2013-07-23 12:31:34Z msweet $".
+dnl End of "$Id: configure.ac 12998 2015-12-02 15:09:04Z msweet $".
dnl
diff --git a/cups-config.in b/cups-config.in
index ee9a0ea..07726c5 100755
--- a/cups-config.in
+++ b/cups-config.in
@@ -1,6 +1,6 @@
#! /bin/sh
#
-# "$Id: cups-config.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups-config.in 10996 2013-05-29 11:51:34Z msweet $"
#
# CUPS configuration utility.
#
@@ -142,5 +142,5 @@ while test $# -gt 0; do
done
#
-# End of "$Id: cups-config.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups-config.in 10996 2013-05-29 11:51:34Z msweet $".
#
diff --git a/cups/Dependencies b/cups/Dependencies
index 10beea2..64a0d19 100644
--- a/cups/Dependencies
+++ b/cups/Dependencies
@@ -1,260 +1,318 @@
adminutil.o: adminutil.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h adminutil.h
-array.o: array.c string-private.h ../config.h debug-private.h \
- ../cups/versioning.h array-private.h ../cups/array.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h adminutil.h
+array.o: array.c ../cups/cups.h file.h versioning.h ipp.h http.h array.h \
+ language.h pwg.h string-private.h ../config.h debug-private.h \
+ array-private.h
attr.o: attr.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
auth.o: auth.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
backchannel.o: backchannel.c cups.h file.h versioning.h ipp.h http.h \
- array.h language.h
+ array.h language.h pwg.h
backend.o: backend.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h backend.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h backend.h
conflicts.o: conflicts.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
custom.o: custom.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
debug.o: debug.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
dest.o: dest.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
dest-job.o: dest-job.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
dest-localization.o: dest-localization.c cups-private.h string-private.h \
- ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
- ../cups/ipp.h http.h array.h http-private.h md5-private.h \
- language-private.h ../cups/transcode.h language.h pwg-private.h \
- ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+ ../config.h debug-private.h ../cups/versioning.h array-private.h \
+ ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+ ../cups/language.h md5-private.h language-private.h \
+ ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+ ppd-private.h ../cups/ppd.h thread-private.h
dest-options.o: dest-options.c cups-private.h string-private.h \
- ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
- ../cups/ipp.h http.h array.h http-private.h md5-private.h \
- language-private.h ../cups/transcode.h language.h pwg-private.h \
- ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+ ../config.h debug-private.h ../cups/versioning.h array-private.h \
+ ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+ ../cups/language.h md5-private.h language-private.h \
+ ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+ ppd-private.h ../cups/ppd.h thread-private.h
dir.o: dir.c string-private.h ../config.h debug-private.h \
../cups/versioning.h dir.h
emit.o: emit.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
encode.o: encode.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
file.o: file.c file-private.h cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
getdevices.o: getdevices.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
-getifaddrs.o: getifaddrs.c http-private.h ../config.h ../cups/http.h \
- versioning.h array.h md5-private.h ipp-private.h ../cups/ipp.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
+getifaddrs.o: getifaddrs.c http-private.h ../config.h ../cups/language.h \
+ array.h versioning.h ../cups/http.h md5-private.h ipp-private.h \
+ ../cups/ipp.h
getputfile.o: getputfile.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
globals.o: globals.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
http.o: http.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
http-addr.o: http-addr.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
http-addrlist.o: http-addrlist.c cups-private.h string-private.h \
- ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
- ../cups/ipp.h http.h array.h http-private.h md5-private.h \
- language-private.h ../cups/transcode.h language.h pwg-private.h \
- ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+ ../config.h debug-private.h ../cups/versioning.h array-private.h \
+ ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+ ../cups/language.h md5-private.h language-private.h \
+ ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+ ppd-private.h ../cups/ppd.h thread-private.h
http-support.o: http-support.c cups-private.h string-private.h \
- ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
- ../cups/ipp.h http.h array.h http-private.h md5-private.h \
- language-private.h ../cups/transcode.h language.h pwg-private.h \
- ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+ ../config.h debug-private.h ../cups/versioning.h array-private.h \
+ ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+ ../cups/language.h md5-private.h language-private.h \
+ ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+ ppd-private.h ../cups/ppd.h thread-private.h
ipp.o: ipp.c cups-private.h string-private.h ../config.h debug-private.h \
- ../cups/versioning.h ipp-private.h ../cups/ipp.h http.h array.h \
- http-private.h md5-private.h language-private.h ../cups/transcode.h \
- language.h pwg-private.h ../cups/cups.h file.h ppd-private.h \
- ../cups/ppd.h thread-private.h
+ ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+ ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+ language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+ file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h
ipp-support.o: ipp-support.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
langprintf.o: langprintf.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
language.o: language.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
localize.o: localize.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
mark.o: mark.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
md5.o: md5.c md5-private.h string-private.h ../config.h
-md5passwd.o: md5passwd.c http-private.h ../config.h ../cups/http.h \
- versioning.h array.h md5-private.h ipp-private.h ../cups/ipp.h \
- string-private.h
+md5passwd.o: md5passwd.c http-private.h ../config.h ../cups/language.h \
+ array.h versioning.h ../cups/http.h md5-private.h ipp-private.h \
+ ../cups/ipp.h string-private.h
notify.o: notify.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
options.o: options.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
page.o: page.c string-private.h ../config.h debug-private.h \
../cups/versioning.h ppd.h cups.h file.h ipp.h http.h array.h \
- language.h
+ language.h pwg.h
ppd.o: ppd.c cups-private.h string-private.h ../config.h debug-private.h \
- ../cups/versioning.h ipp-private.h ../cups/ipp.h http.h array.h \
- http-private.h md5-private.h language-private.h ../cups/transcode.h \
- language.h pwg-private.h ../cups/cups.h file.h ppd-private.h \
- ../cups/ppd.h thread-private.h
+ ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+ ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+ language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+ file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h
ppd-cache.o: ppd-cache.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
pwg-media.o: pwg-media.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
request.o: request.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
sidechannel.o: sidechannel.c sidechannel.h versioning.h cups-private.h \
- string-private.h ../config.h debug-private.h ipp-private.h \
- ../cups/ipp.h http.h array.h http-private.h md5-private.h \
- language-private.h ../cups/transcode.h language.h pwg-private.h \
- ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+ string-private.h ../config.h debug-private.h array-private.h \
+ ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+ ../cups/language.h md5-private.h language-private.h \
+ ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+ ppd-private.h ../cups/ppd.h thread-private.h
snmp.o: snmp.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h snmp-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h snmp-private.h
snprintf.o: snprintf.c string-private.h ../config.h
-string.o: string.c string-private.h ../config.h debug-private.h \
- ../cups/versioning.h thread-private.h array.h
+string.o: string.c cups-private.h string-private.h ../config.h \
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
tempfile.o: tempfile.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
thread.o: thread.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
+tls.o: tls.c cups-private.h string-private.h ../config.h debug-private.h \
+ ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+ ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+ language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+ file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h tls-darwin.c
transcode.o: transcode.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
usersys.o: usersys.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
util.o: util.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
testadmin.o: testadmin.c adminutil.h cups.h file.h versioning.h ipp.h \
- http.h array.h language.h string-private.h ../config.h
+ http.h array.h language.h pwg.h string-private.h ../config.h
testarray.o: testarray.c string-private.h ../config.h debug-private.h \
- ../cups/versioning.h array.h dir.h
+ ../cups/versioning.h array-private.h ../cups/array.h dir.h
testconflicts.o: testconflicts.c cups.h file.h versioning.h ipp.h http.h \
- array.h language.h ppd.h string-private.h ../config.h
+ array.h language.h pwg.h ppd.h string-private.h ../config.h
testcups.o: testcups.c string-private.h ../config.h cups.h file.h \
- versioning.h ipp.h http.h array.h language.h ppd.h
+ versioning.h ipp.h http.h array.h language.h pwg.h ppd.h
+testdest.o: testdest.c cups.h file.h versioning.h ipp.h http.h array.h \
+ language.h pwg.h
testfile.o: testfile.c string-private.h ../config.h debug-private.h \
../cups/versioning.h file.h
-testhttp.o: testhttp.c string-private.h ../config.h http-private.h \
- ../cups/http.h versioning.h array.h md5-private.h ipp-private.h \
- ../cups/ipp.h
+testhttp.o: testhttp.c cups-private.h string-private.h ../config.h \
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
testi18n.o: testi18n.c string-private.h ../config.h language-private.h \
../cups/transcode.h language.h array.h versioning.h
testipp.o: testipp.c file.h versioning.h string-private.h ../config.h \
ipp-private.h ../cups/ipp.h http.h array.h
testoptions.o: testoptions.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
testlang.o: testlang.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
testppd.o: testppd.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h
testpwg.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h \
- ipp.h http.h array.h language.h ../cups/ppd.h pwg-private.h \
+ ipp.h http.h array.h language.h pwg.h ../cups/ppd.h pwg-private.h \
file-private.h cups-private.h string-private.h ../config.h \
- debug-private.h ipp-private.h http-private.h md5-private.h \
- language-private.h ../cups/transcode.h thread-private.h
+ debug-private.h array-private.h ipp-private.h http-private.h \
+ md5-private.h language-private.h ../cups/transcode.h thread-private.h
testsnmp.o: testsnmp.c cups-private.h string-private.h ../config.h \
- debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
- http.h array.h http-private.h md5-private.h language-private.h \
- ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
- ppd-private.h ../cups/ppd.h thread-private.h snmp-private.h
+ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+ thread-private.h snmp-private.h
diff --git a/cups/Makefile b/cups/Makefile
index 662a00b..7b65214 100644
--- a/cups/Makefile
+++ b/cups/Makefile
@@ -1,22 +1,30 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12850 2015-08-27 19:29:06Z msweet $"
#
-# API library Makefile for CUPS.
+# API library Makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2006 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2006 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
-# This file is subject to the Apple OS-Developed Software exception.
+# This file is subject to the Apple OS-Developed Software exception.
#
include ../Makedefs
+
+#
+# Options to build libcups without the use of deprecated APIs...
+#
+
+OPTIONS = -D_CUPS_NO_DEPRECATED=1 -D_PPD_DEPRECATED=""
+
+
#
# Object files...
#
@@ -68,14 +76,17 @@ LIBOBJS = \
string.o \
tempfile.o \
thread.o \
+ tls.o \
transcode.o \
usersys.o \
util.o
TESTOBJS = \
testadmin.o \
testarray.o \
+ testcache.o \
testconflicts.o \
testcups.o \
+ testdest.o \
testfile.o \
testhttp.o \
testi18n.o \
@@ -84,7 +95,8 @@ TESTOBJS = \
testlang.o \
testppd.o \
testpwg.o \
- testsnmp.o
+ testsnmp.o \
+ tlscheck.o
OBJS = \
$(LIBOBJS) \
$(TESTOBJS)
@@ -105,6 +117,7 @@ HEADERS = \
ipp.h \
language.h \
ppd.h \
+ pwg.h \
raster.h \
sidechannel.h \
transcode.h \
@@ -138,8 +151,10 @@ LIBTARGETS = \
UNITTARGETS = \
testadmin \
testarray \
+ testcache \
testconflicts \
testcups \
+ testdest \
testfile \
testhttp \
testi18n \
@@ -148,7 +163,8 @@ UNITTARGETS = \
testoptions \
testppd \
testpwg \
- testsnmp
+ testsnmp \
+ tlscheck
TARGETS = \
$(LIBTARGETS)
@@ -181,7 +197,7 @@ unittests: $(UNITTARGETS)
clean:
$(RM) $(OBJS) $(TARGETS) $(UNITTARGETS)
- $(RM) libcups.so libcups.sl libcups.dylib
+ $(RM) libcups.so libcups.dylib
#
@@ -248,7 +264,7 @@ install-libs: $(INSTALLSTATIC)
echo Installing libraries in $(LIBDIR)...
$(INSTALL_DIR) -m 755 $(LIBDIR)
$(INSTALL_LIB) $(LIBCUPS) $(LIBDIR)
- if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \
+ if test $(LIBCUPS) = "libcups.so.2"; then \
$(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
$(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
fi
@@ -259,6 +275,7 @@ install-libs: $(INSTALLSTATIC)
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
cp $(LIBCUPS) $(SYMROOT); \
+ dsymutil $(SYMROOT)/$(LIBCUPS); \
fi
installstatic:
@@ -276,9 +293,6 @@ uninstall:
$(RM) $(LIBDIR)/libcups.2.dylib
$(RM) $(LIBDIR)/$(LIBCUPSSTATIC)
$(RM) $(LIBDIR)/libcups.dylib
- $(RM) $(LIBDIR)/libcups_s.a
- $(RM) $(LIBDIR)/libcups.sl
- $(RM) $(LIBDIR)/libcups.sl.2
$(RM) $(LIBDIR)/libcups.so
$(RM) $(LIBDIR)/libcups.so.2
-$(RMDIR) $(LIBDIR)
@@ -289,10 +303,10 @@ uninstall:
#
-# libcups.so.2, libcups.sl.2
+# libcups.so.2
#
-libcups.so.2 libcups.sl.2: $(LIBOBJS)
+libcups.so.2: $(LIBOBJS)
echo Linking $@...
$(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBGSSAPI) \
$(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
@@ -312,7 +326,7 @@ libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER)
echo Linking $@...
$(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \
-install_name $(libdir)/$@ \
- -current_version 2.10.0 \
+ -current_version 2.11.0 \
-compatibility_version 2.0.0 \
-exported_symbols_list t.exp \
$(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
@@ -322,26 +336,13 @@ libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER)
#
-# libcups_s.a
-#
-
-libcups_s.a: $(LIBOBJS) libcups_s.exp
- echo Creating $@...
- $(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o \
- $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
- $(COMMONLIBS) $(LIBZ)
- $(RM) $@
- $(AR) $(ARFLAGS) $@ libcups_s.o
-
-
-#
# libcups.la
#
libcups.la: $(LIBOBJS)
echo Linking $@...
$(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \
- -rpath $(LIBDIR) -version-info 2:10 $(LIBGSSAPI) $(SSLLIBS) \
+ -rpath $(LIBDIR) -version-info 2:11 $(LIBGSSAPI) $(SSLLIBS) \
$(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
@@ -357,6 +358,23 @@ libcups.a: $(LIBOBJS)
#
+# libcups2.def (Windows DLL exports file...)
+#
+
+libcups2.def: $(LIBOBJS) Makefile
+ echo Generating $@...
+ echo "LIBRARY libcups2" >libcups2.def
+ echo "VERSION 2.11" >>libcups2.def
+ echo "EXPORTS" >>libcups2.def
+ (nm $(LIBOBJS) 2>/dev/null | grep "T _" | awk '{print $$3}'; \
+ echo __cups_strcpy; echo __cups_strlcat; echo __cups_strlcpy) | \
+ grep -v -E \
+ -e 'cups_debug|Apple|BackChannel|Backend|FileCheck|Filter|GSSService|SetNegotiate|SideChannel' \
+ -e 'Block$$' | \
+ sed -e '1,$$s/^_//' | sort >>libcups2.def
+
+
+#
# testadmin (dependency on static CUPS library is intentional)
#
@@ -379,6 +397,16 @@ testarray: testarray.o $(LIBCUPSSTATIC)
#
+# testcache (dependency on static CUPS library is intentional)
+#
+
+testcache: testcache.o $(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ testcache.o $(LIBCUPSSTATIC) \
+ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
# testconflicts (dependency on static CUPS library is intentional)
#
@@ -399,6 +427,16 @@ testcups: testcups.o $(LIBCUPSSTATIC)
#
+# testdest (dependency on static CUPS library is intentional)
+#
+
+testdest: testdest.o $(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ testdest.o $(LIBCUPSSTATIC) \
+ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
# testfile (dependency on static CUPS library is intentional)
#
@@ -505,6 +543,16 @@ testsnmp: testsnmp.o $(LIBCUPSSTATIC)
#
+# tlscheck (dependency on static CUPS library is intentional)
+#
+
+tlscheck: tlscheck.o $(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ tlscheck.o $(LIBCUPSSTATIC) \
+ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
# Automatic API help files...
#
@@ -526,8 +574,8 @@ apihelp:
--css ../doc/cups-printable.css \
--header api-cups.header --intro api-cups.shtml \
api-cups.xml \
- cups.h adminutil.c dest*.c language.c notify.c \
- options.c tempfile.c usersys.c \
+ cups.h pwg.h adminutil.c dest*.c language.c notify.c \
+ options.c pwg-media.c tempfile.c usersys.c \
util.c >../doc/help/api-cups.html
mxmldoc --tokens help/api-cups.html api-cups.xml >../doc/help/api-cups.tokens
$(RM) api-cups.xml
@@ -626,8 +674,9 @@ sloc:
#
include Dependencies
+tls.o: tls-darwin.c tls-gnutls.c tls-sspi.c
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12850 2015-08-27 19:29:06Z msweet $".
#
diff --git a/cups/adminutil.c b/cups/adminutil.c
index a5e2612..6f38f4f 100644
--- a/cups/adminutil.c
+++ b/cups/adminutil.c
@@ -1,29 +1,18 @@
/*
- * "$Id: adminutil.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: adminutil.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * Administration utility API definitions for CUPS.
+ * Administration utility API definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2001-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2001-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsAdminCreateWindowsPPD() - Create the Windows PPD file for a printer.
- * cupsAdminExportSamba() - Export a printer to Samba.
- * cupsAdminGetServerSettings() - Get settings from the server.
- * cupsAdminSetServerSettings() - Set settings on the server.
- * do_samba_command() - Do a SAMBA command.
- * get_cupsd_conf() - Get the current cupsd.conf file.
- * invalidate_cupsd_cache() - Invalidate the cached cupsd.conf settings.
- * write_option() - Write a CUPS option to a PPD file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -52,7 +41,7 @@ static int do_samba_command(const char *command,
FILE *logfile);
static http_status_t get_cupsd_conf(http_t *http, _cups_globals_t *cg,
time_t last_update, char *name,
- int namelen, int *remote);
+ size_t namelen, int *remote);
static void invalidate_cupsd_cache(_cups_globals_t *cg);
static void write_option(cups_file_t *dstfp, int order,
const char *name, const char *text,
@@ -129,7 +118,7 @@ cupsAdminCreateWindowsPPD(
* Get the supported banner pages, etc. for the printer...
*/
- request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", 0, "/printers/%s", dest);
@@ -145,7 +134,7 @@ cupsAdminCreateWindowsPPD(
*/
response = cupsDoRequest(http, request, "/");
- if (!response || cupsLastError() > IPP_OK_CONFLICT)
+ if (!response || cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
unlink(src);
return (NULL);
@@ -253,7 +242,7 @@ cupsAdminCreateWindowsPPD(
snprintf(line, sizeof(line),
_cupsLangString(language, _("Missing value on line %d.")),
linenum);
- _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0);
+ _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0);
cupsFileClose(srcfp);
cupsFileClose(dstfp);
@@ -272,7 +261,7 @@ cupsAdminCreateWindowsPPD(
_cupsLangString(language,
_("Missing double quote on line %d.")),
linenum);
- _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0);
+ _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0);
cupsFileClose(srcfp);
cupsFileClose(dstfp);
@@ -291,7 +280,7 @@ cupsAdminCreateWindowsPPD(
_cupsLangString(language,
_("Bad option + choice on line %d.")),
linenum);
- _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0);
+ _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0);
cupsFileClose(srcfp);
cupsFileClose(dstfp);
@@ -319,7 +308,7 @@ cupsAdminCreateWindowsPPD(
}
}
- snprintf(ptr + 1, sizeof(line) - (ptr - line + 1),
+ snprintf(ptr + 1, sizeof(line) - (size_t)(ptr - line + 1),
"%%cupsJobTicket: %s=%s\n\"\n*End", option, choice);
cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s\n",
@@ -334,7 +323,7 @@ cupsAdminCreateWindowsPPD(
if (linenum == 0)
{
- _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, _("Empty PPD file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, _("Empty PPD file."), 1);
cupsFileClose(dstfp);
unlink(buffer);
@@ -424,7 +413,7 @@ cupsAdminExportSamba(
if (!dest || !ppd || !samba_server || !samba_user || !samba_password)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -434,7 +423,7 @@ cupsAdminExportSamba(
if ((fp = cupsTempFile2(authfile, sizeof(authfile))) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
return (0);
}
@@ -487,7 +476,7 @@ cupsAdminExportSamba(
_("Unable to copy Windows 2000 printer "
"driver files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -522,7 +511,7 @@ cupsAdminExportSamba(
_("Unable to copy CUPS printer driver "
"files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -565,7 +554,7 @@ cupsAdminExportSamba(
_("Unable to install Windows 2000 printer "
"driver files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -610,7 +599,7 @@ cupsAdminExportSamba(
_("Unable to copy Windows 9x printer "
"driver files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -639,7 +628,7 @@ cupsAdminExportSamba(
_("Unable to install Windows 9x printer "
"driver files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -691,7 +680,7 @@ cupsAdminExportSamba(
_("Unable to copy 64-bit Windows printer "
"driver files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -726,7 +715,7 @@ cupsAdminExportSamba(
_("Unable to copy 64-bit CUPS printer driver "
"files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -769,7 +758,7 @@ cupsAdminExportSamba(
_("Unable to install Windows 2000 printer "
"driver files (%d).")), status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -794,13 +783,13 @@ cupsAdminExportSamba(
"are installed.")),
sizeof(message));
- _cupsSetError(IPP_NOT_FOUND, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, message, 0);
_cupsLangPuts(logfile, message);
}
if (have_drivers == 0)
{
- _cupsSetError(IPP_NOT_FOUND, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, message, 0);
unlink(authfile);
@@ -821,7 +810,7 @@ cupsAdminExportSamba(
_("Unable to set Windows printer driver (%d).")),
status);
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
if (logfile)
_cupsLangPuts(logfile, message);
@@ -882,9 +871,9 @@ cupsAdminGetServerSettings(
*/
if (strcmp(cg->http->hostname, cg->server) ||
- cg->ipp_port != _httpAddrPort(cg->http->hostaddr) ||
+ cg->ipp_port != httpAddrPort(cg->http->hostaddr) ||
(cg->http->encryption != cg->encryption &&
- cg->http->encryption == HTTP_ENCRYPT_NEVER))
+ cg->http->encryption == HTTP_ENCRYPTION_NEVER))
{
/*
* Need to close the current connection because something has changed...
@@ -901,13 +890,13 @@ cupsAdminGetServerSettings(
if (!cg->http)
{
- if ((cg->http = _httpCreate(cupsServer(), ippPort(), NULL,
- cupsEncryption(), AF_UNSPEC)) == NULL)
+ if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
+ cupsEncryption(), 1, 0, NULL)) == NULL)
{
if (errno)
- _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0);
else
- _cupsSetError(IPP_SERVICE_UNAVAILABLE,
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE,
_("Unable to connect to host."), 1);
if (num_settings)
@@ -925,7 +914,7 @@ cupsAdminGetServerSettings(
if (!http || !num_settings || !settings)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
if (num_settings)
*num_settings = 0;
@@ -944,7 +933,7 @@ cupsAdminGetServerSettings(
*/
if ((status = get_cupsd_conf(http, cg, cg->cupsd_update, cupsdconf,
- sizeof(cupsdconf), &remote)) == HTTP_OK)
+ sizeof(cupsdconf), &remote)) == HTTP_STATUS_OK)
{
if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL)
{
@@ -954,7 +943,7 @@ cupsAdminGetServerSettings(
snprintf(message, sizeof(message),
_cupsLangString(cupsLangDefault(), _("Open of %s failed: %s")),
cupsdconf, strerror(errno));
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
}
}
else
@@ -1136,7 +1125,7 @@ cupsAdminGetServerSettings(
cg->cupsd_num_settings,
&(cg->cupsd_settings));
}
- else if (status != HTTP_NOT_MODIFIED)
+ else if (status != HTTP_STATUS_NOT_MODIFIED)
invalidate_cupsd_cache(cg);
/*
@@ -1186,6 +1175,7 @@ cupsAdminSetServerSettings(
in_cancel_job, /* In a cancel-job section? */
in_admin_location, /* In the /admin location? */
in_conf_location, /* In the /admin/conf location? */
+ in_log_location, /* In the /admin/log location? */
in_root_location; /* In the / location? */
const char *val; /* Setting value */
int share_printers, /* Share local printers */
@@ -1199,6 +1189,7 @@ cupsAdminSetServerSettings(
wrote_loglevel, /* Wrote the LogLevel line? */
wrote_admin_location, /* Wrote the /admin location? */
wrote_conf_location, /* Wrote the /admin/conf location? */
+ wrote_log_location, /* Wrote the /admin/log location? */
wrote_root_location; /* Wrote the / location? */
int indent; /* Indentation */
int cupsd_num_settings; /* New number of settings */
@@ -1220,7 +1211,7 @@ cupsAdminSetServerSettings(
if (!http || !num_settings || !settings)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -1230,11 +1221,11 @@ cupsAdminSetServerSettings(
*/
if (get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf),
- &remote) == HTTP_OK)
+ &remote) == HTTP_STATUS_OK)
{
if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
return (0);
}
}
@@ -1398,7 +1389,7 @@ cupsAdminSetServerSettings(
if (remote)
unlink(cupsdconf);
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
return (0);
}
@@ -1412,12 +1403,14 @@ cupsAdminSetServerSettings(
in_conf_location = 0;
in_default_policy = 0;
in_location = 0;
+ in_log_location = 0;
in_policy = 0;
in_root_location = 0;
linenum = 0;
wrote_admin_location = 0;
wrote_browsing = 0;
wrote_conf_location = 0;
+ wrote_log_location = 0;
wrote_loglevel = 0;
wrote_policy = 0;
wrote_port_listen = 0;
@@ -1561,8 +1554,10 @@ cupsAdminSetServerSettings(
indent += 2;
if (!strcmp(value, "/admin"))
in_admin_location = 1;
- if (!strcmp(value, "/admin/conf"))
+ else if (!strcmp(value, "/admin/conf"))
in_conf_location = 1;
+ else if (!strcmp(value, "/admin/log"))
+ in_log_location = 1;
else if (!strcmp(value, "/"))
in_root_location = 1;
@@ -1604,6 +1599,23 @@ cupsAdminSetServerSettings(
cupsFilePrintf(temp, " Allow %s\n",
remote_any > 0 ? "all" : "@LOCAL");
}
+ else if (in_log_location && remote_admin >= 0)
+ {
+ wrote_log_location = 1;
+
+ if (remote_admin)
+ cupsFilePuts(temp, " # Allow remote access to the log "
+ "files...\n");
+ else
+ cupsFilePuts(temp, " # Restrict access to the log "
+ "files...\n");
+
+ cupsFilePuts(temp, " Order allow,deny\n");
+
+ if (remote_admin)
+ cupsFilePrintf(temp, " Allow %s\n",
+ remote_any > 0 ? "all" : "@LOCAL");
+ }
else if (in_root_location &&
(remote_admin >= 0 || remote_any > 0 || share_printers >= 0))
{
@@ -1630,6 +1642,7 @@ cupsAdminSetServerSettings(
in_admin_location = 0;
in_conf_location = 0;
+ in_log_location = 0;
in_root_location = 0;
cupsFilePuts(temp, "</Location>\n");
@@ -1878,6 +1891,25 @@ cupsAdminSetServerSettings(
cupsFilePuts(temp, "</Location>\n");
}
+ if (!wrote_log_location && remote_admin >= 0)
+ {
+ if (remote_admin)
+ cupsFilePuts(temp,
+ "# Allow remote access to the log files...\n");
+ else
+ cupsFilePuts(temp, "# Restrict access to the log files...\n");
+
+ cupsFilePuts(temp, "<Location /admin/log>\n"
+ " AuthType Default\n"
+ " Require user @SYSTEM\n"
+ " Order allow,deny\n");
+
+ if (remote_admin)
+ cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
+
+ cupsFilePuts(temp, "</Location>\n");
+ }
+
if (!wrote_policy && user_cancel_any >= 0)
{
cupsFilePuts(temp, "<Policy default>\n"
@@ -1954,7 +1986,7 @@ cupsAdminSetServerSettings(
status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile);
- if (status == HTTP_CREATED)
+ if (status == HTTP_STATUS_CREATED)
{
/*
* Updated OK, add the basic settings...
@@ -2024,7 +2056,7 @@ cupsAdminSetServerSettings(
unlink(tempfile);
- return (status == HTTP_CREATED);
+ return (status == HTTP_STATUS_CREATED);
}
@@ -2120,7 +2152,7 @@ get_cupsd_conf(
_cups_globals_t *cg, /* I - Global data */
time_t last_update, /* I - Last update time for file */
char *name, /* I - Filename buffer */
- int namesize, /* I - Size of filename buffer */
+ size_t namesize, /* I - Size of filename buffer */
int *remote) /* O - Remote file? */
{
int fd; /* Temporary file descriptor */
@@ -2158,16 +2190,16 @@ get_cupsd_conf(
snprintf(message, sizeof(message),
_cupsLangString(cupsLangDefault(), _("stat of %s failed: %s")),
name, strerror(errno));
- _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
*name = '\0';
- return (HTTP_SERVER_ERROR);
+ return (HTTP_STATUS_SERVER_ERROR);
}
else if (last_update && info.st_mtime <= last_update)
- status = HTTP_NOT_MODIFIED;
+ status = HTTP_STATUS_NOT_MODIFIED;
else
- status = HTTP_OK;
+ status = HTTP_STATUS_OK;
}
else
#endif /* !WIN32 */
@@ -2176,15 +2208,15 @@ get_cupsd_conf(
* Read cupsd.conf via a HTTP GET request...
*/
- if ((fd = cupsTempFd(name, namesize)) < 0)
+ if ((fd = cupsTempFd(name, (int)namesize)) < 0)
{
*name = '\0';
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
invalidate_cupsd_cache(cg);
- return (HTTP_SERVER_ERROR);
+ return (HTTP_STATUS_SERVER_ERROR);
}
*remote = 1;
@@ -2199,7 +2231,7 @@ get_cupsd_conf(
close(fd);
- if (status != HTTP_OK)
+ if (status != HTTP_STATUS_OK)
{
unlink(name);
*name = '\0';
@@ -2337,5 +2369,5 @@ write_option(cups_file_t *dstfp, /* I - PPD file */
/*
- * End of "$Id: adminutil.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: adminutil.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/cups/adminutil.h b/cups/adminutil.h
index d00452e..f03d2fa 100644
--- a/cups/adminutil.h
+++ b/cups/adminutil.h
@@ -1,5 +1,5 @@
/*
- * "$Id: adminutil.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: adminutil.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Administration utility API definitions for CUPS.
*
@@ -77,5 +77,5 @@ extern int cupsAdminSetServerSettings(http_t *http,
#endif /* !_CUPS_ADMINUTIL_H_ */
/*
- * End of "$Id: adminutil.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: adminutil.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/api-filter.header b/cups/api-filter.header
index 5b7ee18..3031452 100644
--- a/cups/api-filter.header
+++ b/cups/api-filter.header
@@ -3,7 +3,7 @@
Filter and backend programming header for CUPS.
- Copyright 2008-2011 by Apple Inc.
+ Copyright 2008-2014 by Apple Inc.
These coded instructions, statements, and computer programs are the
property of Apple Inc. and are protected by Federal copyright
diff --git a/cups/api-filter.shtml b/cups/api-filter.shtml
index 3f912ba..7c33179 100644
--- a/cups/api-filter.shtml
+++ b/cups/api-filter.shtml
@@ -3,7 +3,7 @@
Filter and backend programming introduction for CUPS.
- Copyright 2007-2013 by Apple Inc.
+ Copyright 2007-2014 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
@@ -81,7 +81,7 @@ directory to write to.</p>
<p>In addition, some operating systems provide additional security mechanisms
that further limit file system access, even for backends running as root. On
-OS X, for example, no backend may write to a user's home directory.</p>
+OS X, for example, no backend may write to a user's home directory. See the <a href="#SANDBOXING">Sandboxing on OS X</a> section for more information.</p>
</blockquote>
<h3><a name="SIGNALS">Canceled Jobs and Signal Handling</a></h3>
@@ -237,7 +237,7 @@ prefix strings:</p>
<code>marker-types</code>, <code>printer-alert</code>, and
<code>printer-alert-description</code> printer attributes. Standard
<code>marker-types</code> values are listed in <a href='#TABLE1'>Table
- 1</a>.</dd>
+ 1</a>. String values need special handling - see <a href="#ATTR_STRINGS">Reporting Attribute String Values</a> below.</dd>
<dt>CRIT: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
@@ -320,11 +320,11 @@ the "DEBUG:" prefix string.</p>
<td>Fuser unit</td>
</tr>
<tr>
- <td>fuserCleaningPad</td>
+ <td>fuser-cleaning-pad</td>
<td>Fuser cleaning pad</td>
</tr>
<tr>
- <td>fuserOil</td>
+ <td>fuser-oil</td>
<td>Fuser oil</td>
</tr>
<tr>
@@ -336,7 +336,7 @@ the "DEBUG:" prefix string.</p>
<td>Photo conductor</td>
</tr>
<tr>
- <td>solidWax</td>
+ <td>solid-wax</td>
<td>Wax supply</td>
</tr>
<tr>
@@ -348,19 +348,19 @@ the "DEBUG:" prefix string.</p>
<td>Toner supply</td>
</tr>
<tr>
- <td>transferUnit</td>
+ <td>transfer-unit</td>
<td>Transfer unit</td>
</tr>
<tr>
- <td>wasteInk</td>
+ <td>waste-ink</td>
<td>Waste ink tank</td>
</tr>
<tr>
- <td>wasteToner</td>
+ <td>waste-toner</td>
<td>Waste toner tank</td>
</tr>
<tr>
- <td>wasteWax</td>
+ <td>waste-wax</td>
<td>Waste wax tank</td>
</tr>
</tbody>
@@ -440,6 +440,95 @@ the "DEBUG:" prefix string.</p>
</tbody>
</table></div>
+
+<h4><a name="ATTR_STRINGS">Reporting Attribute String Values</a></h4>
+
+<p>When reporting string values using "ATTR:" messages, a filter or backend must take special care to appropriately quote those values. The scheduler uses the CUPS option parsing code for attributes, so the general syntax is:</p>
+
+<pre class="example">
+name=simple
+name=simple,simple,...
+name='complex value'
+name="complex value"
+name='"complex value"','"complex value"',...
+</pre>
+
+<p>Simple values are strings that do not contain spaces, quotes, backslashes, or the comma and can be placed verbatim in the "ATTR:" message, for example:</p>
+
+<pre class="example">
+int levels[4] = { 40, 50, 60, 70 }; /* CMYK */
+
+fputs("ATTR: marker-colors=#00FFFF,#FF00FF,#FFFF00,#000000\n", stderr);
+fputs("ATTR: marker-high-levels=100,100,100,100\n", stderr);
+fprintf(stderr, "ATTR: marker-levels=%d,%d,%d,%d\n", levels[0], levels[1],
+ levels[2], levels[3], levels[4]);
+fputs("ATTR: marker-low-levels=5,5,5,5\n", stderr);
+fputs("ATTR: marker-types=toner,toner,toner,toner\n", stderr);
+</pre>
+
+<p>Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:</p>
+
+<pre class="example">
+fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr);
+</pre>
+
+<p>When multiple values are reported, each value must be enclosed by a set of single and double quotes:</p>
+
+<pre class="example">
+fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"',"
+ "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr);
+</pre>
+
+<p>The IPP backend includes a <var>quote_string</var> function that may be used to properly quote a complex value in an "ATTR:" message:</p>
+
+<pre class="example">
+static const char * /* O - Quoted string */
+quote_string(const char *s, /* I - String */
+ char *q, /* I - Quoted string buffer */
+ size_t qsize) /* I - Size of quoted string buffer */
+{
+ char *qptr, /* Pointer into string buffer */
+ *qend; /* End of string buffer */
+
+
+ qptr = q;
+ qend = q + qsize - 5;
+
+ if (qend &lt; q)
+ {
+ *q = '\0';
+ return (q);
+ }
+
+ *qptr++ = '\'';
+ *qptr++ = '\"';
+
+ while (*s && qptr &lt; qend)
+ {
+ if (*s == '\\' || *s == '\"' || *s == '\'')
+ {
+ if (qptr &lt; (qend - 4))
+ {
+ *qptr++ = '\\';
+ *qptr++ = '\\';
+ *qptr++ = '\\';
+ }
+ else
+ break;
+ }
+
+ *qptr++ = *s++;
+ }
+
+ *qptr++ = '\"';
+ *qptr++ = '\'';
+ *qptr = '\0';
+
+ return (q);
+}
+</pre>
+
+
<h4><a name="MANAGING_STATE">Managing Printer State in a Filter</a></h4>
<p>Filters are responsible for managing the state keywords they set using
@@ -763,3 +852,25 @@ void *my_data;
<a href="#cupsSideChannelSNMPWalk">cupsSNMPSideChannelWalk</a>(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);
</pre>
+
+<h2><a name="SANDBOXING">Sandboxing on OS X</a></h2>
+
+<p>Starting with OS X 10.6, filters and backends are run inside a security "sandbox" which further limits (beyond the normal UNIX user/group permissions) what a filter or backend can do. This helps to both secure the printing system from malicious software and enforce the functional separation of components in the CUPS filter chain. What follows is a list of actions that are explicitly allowed for all filters and backends:</p>
+
+<ol>
+
+ <li>Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the <var>/private/var/spool/cups</var> directory and other files on mounted filesystems <em>except</em> for user home directories under <var>/Users</var>.</li>
+
+ <li>Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the <code>CUPS_CACHEDIR</code> environment variable, to the state directory specified by the <code>CUPS_STATEDIR</code> environment variable, to the temporary directory specified by the <code>TMPDIR</code> environment variable, and under the <var>/private/var/db</var>, <var>/private/var/folders</var>, <var>/private/var/lib</var>, <var>/private/var/mysql</var>, <var>/private/var/run</var>, <var>/private/var/spool</var> (except <var>/private/var/spool/cups</var>), <var>/Library/Application&nbsp;Support</var>, <var>/Library/Caches</var>, <var>/Library/Logs</var>, <var>/Library/Preferences</var>, <var>/Library/WebServer</var>, and <var>/Users/Shared</var> directories.</li>
+
+ <li>Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the <var>/Users</var> directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.</li>
+
+ <li>Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. <em>Filters cannot access Bluetooth and USB printers directly.</em></li>
+
+ <li>Network: filters and backends can access UNIX domain sockets under the <var>/private/tmp</var>, <var>/private/var/run</var>, and <var>/private/var/tmp</var> directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. <em>Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.</em></li>
+
+ <li>Notifications: filters and backends can send notifications via the Darwin <code>notify_post()</code> API.</li>
+
+</ol>
+
+<blockquote><b>Note:</b> The sandbox profile used in CUPS 2.0 still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.</blockquote>
diff --git a/cups/array-private.h b/cups/array-private.h
index b9d0b7f..74b0c9b 100644
--- a/cups/array-private.h
+++ b/cups/array-private.h
@@ -1,9 +1,9 @@
/*
- * "$Id: array-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: array-private.h 3933 2012-10-01 03:01:10Z msweet $"
*
* Private array definitions for CUPS.
*
- * Copyright 2011 by Apple Inc.
+ * Copyright 2011-2012 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -37,9 +37,10 @@ extern "C" {
* Functions...
*/
-extern int _cupsArrayAddStrings(cups_array_t *a, const char *s)
- _CUPS_API_1_5;
-extern cups_array_t *_cupsArrayNewStrings(const char *s) _CUPS_API_1_5;
+extern int _cupsArrayAddStrings(cups_array_t *a, const char *s,
+ char delim) _CUPS_API_1_5;
+extern cups_array_t *_cupsArrayNewStrings(const char *s, char delim)
+ _CUPS_API_1_5;
# ifdef __cplusplus
}
@@ -47,5 +48,5 @@ extern cups_array_t *_cupsArrayNewStrings(const char *s) _CUPS_API_1_5;
#endif /* !_CUPS_ARRAY_PRIVATE_H_ */
/*
- * End of "$Id: array-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: array-private.h 3933 2012-10-01 03:01:10Z msweet $".
*/
diff --git a/cups/array.c b/cups/array.c
index cd8f64d..b93ca18 100644
--- a/cups/array.c
+++ b/cups/array.c
@@ -1,56 +1,25 @@
/*
- * "$Id: array.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: array.c 12031 2014-07-15 19:57:59Z msweet $"
*
- * Sorted array routines for CUPS.
+ * Sorted array routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsArrayAdd() - Add an element to the array.
- * _cupsArrayAddStrings() - Add zero or more comma-delimited strings to an
- * array.
- * cupsArrayClear() - Clear the array.
- * cupsArrayCount() - Get the number of elements in the array.
- * cupsArrayCurrent() - Return the current element in the array.
- * cupsArrayDelete() - Free all memory used by the array.
- * cupsArrayDup() - Duplicate the array.
- * cupsArrayFind() - Find an element in the array.
- * cupsArrayFirst() - Get the first element in the array.
- * cupsArrayGetIndex() - Get the index of the current element.
- * cupsArrayGetInsert() - Get the index of the last inserted element.
- * cupsArrayIndex() - Get the N-th element in the array.
- * cupsArrayInsert() - Insert an element in the array.
- * cupsArrayLast() - Get the last element in the array.
- * cupsArrayNew() - Create a new array.
- * cupsArrayNew2() - Create a new array with hash.
- * cupsArrayNew3() - Create a new array with hash and/or free function.
- * _cupsArrayNewStrings() - Create a new array of comma-delimited strings.
- * cupsArrayNext() - Get the next element in the array.
- * cupsArrayPrev() - Get the previous element in the array.
- * cupsArrayRemove() - Remove an element from the array.
- * cupsArrayRestore() - Reset the current element to the last @link
- * cupsArraySave@.
- * cupsArraySave() - Mark the current element for a later @link
- * cupsArrayRestore@.
- * cupsArrayUserData() - Return the user data for an array.
- * cups_array_add() - Insert or append an element to the array.
- * cups_array_find() - Find an element in the array.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
* Include necessary headers...
*/
+#include <cups/cups.h>
#include "string-private.h"
#include "debug-private.h"
#include "array-private.h"
@@ -138,8 +107,7 @@ cupsArrayAdd(cups_array_t *a, /* I - Array */
/*
- * '_cupsArrayAddStrings()' - Add zero or more comma-delimited strings to an
- * array.
+ * '_cupsArrayAddStrings()' - Add zero or more delimited strings to an array.
*
* Note: The array MUST be created using the @link _cupsArrayNewStrings@
* function. Duplicate strings are NOT added. If the string pointer "s" is NULL
@@ -148,7 +116,8 @@ cupsArrayAdd(cups_array_t *a, /* I - Array */
int /* O - 1 on success, 0 on failure */
_cupsArrayAddStrings(cups_array_t *a, /* I - Array */
- const char *s) /* I - Comma-delimited strings or NULL */
+ const char *s, /* I - Delimited strings or NULL */
+ char delim)/* I - Delimiter character */
{
char *buffer, /* Copy of string */
*start, /* Start of string */
@@ -156,20 +125,47 @@ _cupsArrayAddStrings(cups_array_t *a, /* I - Array */
int status = 1; /* Status of add */
+ DEBUG_printf(("_cupsArrayAddStrings(a=%p, s=\"%s\", delim='%c')", a, s,
+ delim));
+
if (!a || !s || !*s)
+ {
+ DEBUG_puts("1_cupsArrayAddStrings: Returning 0");
return (0);
+ }
- if (!strchr(s, ','))
+ if (delim == ' ')
{
/*
- * String doesn't contain a comma, so add it as a single value...
+ * Skip leading whitespace...
*/
+ DEBUG_puts("1_cupsArrayAddStrings: Skipping leading whitespace.");
+
+ while (*s && isspace(*s & 255))
+ s ++;
+
+ DEBUG_printf(("1_cupsArrayAddStrings: Remaining string \"%s\".", s));
+ }
+
+ if (!strchr(s, delim) &&
+ (delim != ' ' || (!strchr(s, '\t') && !strchr(s, '\n'))))
+ {
+ /*
+ * String doesn't contain a delimiter, so add it as a single value...
+ */
+
+ DEBUG_puts("1_cupsArrayAddStrings: No delimiter seen, adding a single "
+ "value.");
+
if (!cupsArrayFind(a, (void *)s))
status = cupsArrayAdd(a, (void *)s);
}
else if ((buffer = strdup(s)) == NULL)
+ {
+ DEBUG_puts("1_cupsArrayAddStrings: Unable to duplicate string.");
status = 0;
+ }
else
{
for (start = end = buffer; *end; start = end)
@@ -179,11 +175,21 @@ _cupsArrayAddStrings(cups_array_t *a, /* I - Array */
* it...
*/
- if ((end = strchr(start, ',')) != NULL)
+ if (delim == ' ')
+ {
+ while (*end && !isspace(*end & 255))
+ end ++;
+ while (*end && isspace(*end & 255))
+ *end++ = '\0';
+ }
+ else if ((end = strchr(start, delim)) != NULL)
*end++ = '\0';
else
end = start + strlen(start);
+ DEBUG_printf(("1_cupsArrayAddStrings: Adding \"%s\", end=\"%s\"", start,
+ end));
+
if (!cupsArrayFind(a, start))
status &= cupsArrayAdd(a, start);
}
@@ -191,6 +197,8 @@ _cupsArrayAddStrings(cups_array_t *a, /* I - Array */
free(buffer);
}
+ DEBUG_printf(("1_cupsArrayAddStrings: Returning %d.", status));
+
return (status);
}
@@ -384,7 +392,7 @@ cupsArrayDup(cups_array_t *a) /* I - Array */
* Allocate memory for the elements...
*/
- da->elements = malloc(a->num_elements * sizeof(void *));
+ da->elements = malloc((size_t)a->num_elements * sizeof(void *));
if (!da->elements)
{
free(da);
@@ -412,7 +420,7 @@ cupsArrayDup(cups_array_t *a) /* I - Array */
* Just copy raw pointers...
*/
- memcpy(da->elements, a->elements, a->num_elements * sizeof(void *));
+ memcpy(da->elements, a->elements, (size_t)a->num_elements * sizeof(void *));
}
da->num_elements = a->num_elements;
@@ -755,7 +763,7 @@ cupsArrayNew3(cups_array_func_t f, /* I - Comparison function or @code NULL@ fo
{
a->hashfunc = h;
a->hashsize = hsize;
- a->hash = malloc(hsize * sizeof(int));
+ a->hash = malloc((size_t)hsize * sizeof(int));
if (!a->hash)
{
@@ -763,7 +771,7 @@ cupsArrayNew3(cups_array_func_t f, /* I - Comparison function or @code NULL@ fo
return (NULL);
}
- memset(a->hash, -1, hsize * sizeof(int));
+ memset(a->hash, -1, (size_t)hsize * sizeof(int));
}
a->copyfunc = cf;
@@ -782,7 +790,8 @@ cupsArrayNew3(cups_array_func_t f, /* I - Comparison function or @code NULL@ fo
*/
cups_array_t * /* O - Array */
-_cupsArrayNewStrings(const char *s) /* I - Comma-delimited strings or NULL */
+_cupsArrayNewStrings(const char *s, /* I - Delimited strings or NULL */
+ char delim) /* I - Delimiter character */
{
cups_array_t *a; /* Array */
@@ -790,7 +799,7 @@ _cupsArrayNewStrings(const char *s) /* I - Comma-delimited strings or NULL */
if ((a = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0,
(cups_acopy_func_t)_cupsStrAlloc,
(cups_afree_func_t)_cupsStrFree)) != NULL)
- _cupsArrayAddStrings(a, s);
+ _cupsArrayAddStrings(a, s, delim);
return (a);
}
@@ -878,9 +887,9 @@ int /* O - 1 on success, 0 on failure */
cupsArrayRemove(cups_array_t *a, /* I - Array */
void *e) /* I - Element */
{
- int i, /* Looping var */
- current, /* Current element */
- diff; /* Difference */
+ ssize_t i, /* Looping var */
+ current; /* Current element */
+ int diff; /* Difference */
/*
@@ -912,7 +921,7 @@ cupsArrayRemove(cups_array_t *a, /* I - Array */
if (current < a->num_elements)
memmove(a->elements + current, a->elements + current + 1,
- (a->num_elements - current) * sizeof(void *));
+ (size_t)(a->num_elements - current) * sizeof(void *));
if (current <= a->current)
a->current --;
@@ -1013,9 +1022,9 @@ cups_array_add(cups_array_t *a, /* I - Array */
void *e, /* I - Element to add */
int insert) /* I - 1 = insert, 0 = append */
{
- int i, /* Looping var */
- current, /* Current element */
- diff; /* Comparison with current element */
+ int i, /* Looping var */
+ current; /* Current element */
+ int diff; /* Comparison with current element */
DEBUG_printf(("7cups_array_add(a=%p, e=%p, insert=%d)", a, e, insert));
@@ -1039,7 +1048,7 @@ cups_array_add(cups_array_t *a, /* I - Array */
if (a->alloc_elements == 0)
{
count = 16;
- temp = malloc(count * sizeof(void *));
+ temp = malloc((size_t)count * sizeof(void *));
}
else
{
@@ -1048,10 +1057,10 @@ cups_array_add(cups_array_t *a, /* I - Array */
else
count = a->alloc_elements + 1024;
- temp = realloc(a->elements, count * sizeof(void *));
+ temp = realloc(a->elements, (size_t)count * sizeof(void *));
}
- DEBUG_printf(("9cups_array_add: count=%d", count));
+ DEBUG_printf(("9cups_array_add: count=" CUPS_LLFMT, CUPS_LLCAST count));
if (!temp)
{
@@ -1141,7 +1150,7 @@ cups_array_add(cups_array_t *a, /* I - Array */
*/
memmove(a->elements + current + 1, a->elements + current,
- (a->num_elements - current) * sizeof(void *));
+ (size_t)(a->num_elements - current) * sizeof(void *));
if (a->current >= current)
a->current ++;
@@ -1150,11 +1159,11 @@ cups_array_add(cups_array_t *a, /* I - Array */
if (a->saved[i] >= current)
a->saved[i] ++;
- DEBUG_printf(("9cups_array_add: insert element at index %d...", current));
+ DEBUG_printf(("9cups_array_add: insert element at index " CUPS_LLFMT, CUPS_LLCAST current));
}
#ifdef DEBUG
else
- DEBUG_printf(("9cups_array_add: append element at %d...", current));
+ DEBUG_printf(("9cups_array_add: append element at " CUPS_LLFMT, CUPS_LLCAST current));
#endif /* DEBUG */
if (a->copyfunc)
@@ -1173,8 +1182,7 @@ cups_array_add(cups_array_t *a, /* I - Array */
#ifdef DEBUG
for (current = 0; current < a->num_elements; current ++)
- DEBUG_printf(("9cups_array_add: a->elements[%d]=%p", current,
- a->elements[current]));
+ DEBUG_printf(("9cups_array_add: a->elements[" CUPS_LLFMT "]=%p", CUPS_LLCAST current, a->elements[current]));
#endif /* DEBUG */
DEBUG_puts("9cups_array_add: returning 1");
@@ -1322,5 +1330,5 @@ cups_array_find(cups_array_t *a, /* I - Array */
/*
- * End of "$Id: array.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: array.c 12031 2014-07-15 19:57:59Z msweet $".
*/
diff --git a/cups/array.h b/cups/array.h
index 235fcc9..7a5fc58 100644
--- a/cups/array.h
+++ b/cups/array.h
@@ -1,5 +1,5 @@
/*
- * "$Id: array.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: array.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Sorted array definitions for CUPS.
*
@@ -88,5 +88,5 @@ extern void *cupsArrayUserData(cups_array_t *a) _CUPS_API_1_2;
#endif /* !_CUPS_ARRAY_H_ */
/*
- * End of "$Id: array.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: array.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/attr.c b/cups/attr.c
index 10d88dd..1f3d2e5 100644
--- a/cups/attr.c
+++ b/cups/attr.c
@@ -1,22 +1,16 @@
/*
- * "$Id: attr.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: attr.c 12867 2015-09-13 23:49:19Z msweet $"
*
- * PPD model-specific attribute routines for CUPS.
+ * PPD model-specific attribute routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * ppdFindAttr() - Find the first matching attribute.
- * ppdFindNextAttr() - Find the next matching attribute.
- * _ppdNormalizeMakeAndModel() - Normalize a product/make-and-model string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -229,14 +223,6 @@ _ppdNormalizeMakeAndModel(
snprintf(buffer, bufsize, "Canon %s", make_and_model);
}
- else if (!_cups_strncasecmp(make_and_model, "primera", 7))
- {
- /*
- * Fargo...
- */
-
- snprintf(buffer, bufsize, "Fargo %s", make_and_model);
- }
else if (!_cups_strncasecmp(make_and_model, "designjet", 9) ||
!_cups_strncasecmp(make_and_model, "deskjet", 7))
{
@@ -331,5 +317,5 @@ _ppdNormalizeMakeAndModel(
/*
- * End of "$Id: attr.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: attr.c 12867 2015-09-13 23:49:19Z msweet $".
*/
diff --git a/cups/auth.c b/cups/auth.c
index e1fc2c9..52a9db3 100644
--- a/cups/auth.c
+++ b/cups/auth.c
@@ -1,32 +1,21 @@
/*
- * "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: auth.c 12619 2015-05-06 21:00:19Z msweet $"
*
- * Authentication functions for CUPS.
+ * Authentication functions for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * This file contains Kerberos support code, copyright 2006 by
- * Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsDoAuthentication() - Authenticate a request.
- * _cupsSetNegotiateAuthString() - Set the Kerberos authentication string.
- * cups_gss_acquire() - Kerberos credentials callback.
- * cups_gss_getname() - Get CUPS service credentials for
- * authentication.
- * cups_gss_printf() - Show debug error messages from GSSAPI.
- * cups_local_auth() - Get the local authorization certificate if
- * available/applicable.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -112,7 +101,7 @@ static int cups_local_auth(http_t *http);
/*
* 'cupsDoAuthentication()' - Authenticate a request.
*
- * This function should be called in response to a @code HTTP_UNAUTHORIZED@
+ * This function should be called in response to a @code HTTP_STATUS_UNAUTHORIZED@
* status, prior to resubmitting your request.
*
* @since CUPS 1.1.20/OS X 10.4@
@@ -164,14 +153,14 @@ cupsDoAuthentication(
DEBUG_printf(("2cupsDoAuthentication: authstring=\"%s\"",
http->authstring));
- if (http->status == HTTP_UNAUTHORIZED)
+ if (http->status == HTTP_STATUS_UNAUTHORIZED)
http->digest_tries ++;
return (0);
}
else if (localauth == -1)
{
- http->status = HTTP_AUTHORIZATION_CANCELED;
+ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
return (-1); /* Error or canceled */
}
}
@@ -190,11 +179,18 @@ cupsDoAuthentication(
* Nope - get a new password from the user...
*/
+ char default_username[HTTP_MAX_VALUE];
+ /* Default username */
+
cg = _cupsGlobals();
if (!cg->lang_default)
cg->lang_default = cupsLangDefault();
+ if (httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "username",
+ default_username))
+ cupsSetUser(default_username);
+
snprintf(prompt, sizeof(prompt),
_cupsLangString(cg->lang_default, _("Password for %s on %s? ")),
cupsUser(),
@@ -205,22 +201,22 @@ cupsDoAuthentication(
if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL)
{
- http->status = HTTP_AUTHORIZATION_CANCELED;
+ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
return (-1);
}
snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(),
password);
}
- else if (http->status == HTTP_UNAUTHORIZED)
+ else if (http->status == HTTP_STATUS_UNAUTHORIZED)
http->digest_tries ++;
- if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3)
+ if (http->status == HTTP_STATUS_UNAUTHORIZED && http->digest_tries >= 3)
{
DEBUG_printf(("1cupsDoAuthentication: Too many authentication tries (%d)",
http->digest_tries));
- http->status = HTTP_AUTHORIZATION_CANCELED;
+ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
return (-1);
}
@@ -237,7 +233,7 @@ cupsDoAuthentication(
if (_cupsSetNegotiateAuthString(http, method, resource))
{
- http->status = HTTP_AUTHORIZATION_CANCELED;
+ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
return (-1);
}
}
@@ -265,7 +261,6 @@ cupsDoAuthentication(
char encode[33], /* MD5 buffer */
digest[1024]; /* Digest auth data */
-
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
@@ -280,7 +275,7 @@ cupsDoAuthentication(
{
DEBUG_printf(("1cupsDoAuthentication: Unknown auth type: \"%s\"",
www_auth));
- http->status = HTTP_AUTHORIZATION_CANCELED;
+ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
return (-1);
}
@@ -316,7 +311,7 @@ _cupsSetNegotiateAuthString(
* to use it...
*/
- if (gss_init_sec_context == NULL)
+ if (&gss_init_sec_context == NULL)
{
DEBUG_puts("1_cupsSetNegotiateAuthString: Weak-linked GSSAPI/Kerberos "
"framework is not present");
@@ -446,21 +441,21 @@ _cupsSetNegotiateAuthString(
* arbitrarily large credentials...
*/
- int authsize = 10 + /* "Negotiate " */
- output_token.length * 4 / 3 + 1 + /* Base64 */
- 1; /* nul */
+ int authsize = 10 + /* "Negotiate " */
+ (int)output_token.length * 4 / 3 + 1 + 1;
+ /* Base64 + nul */
httpSetAuthString(http, NULL, NULL);
- if ((http->authstring = malloc(authsize)) == NULL)
+ if ((http->authstring = malloc((size_t)authsize)) == NULL)
{
http->authstring = http->_authstring;
authsize = sizeof(http->_authstring);
}
- strcpy(http->authstring, "Negotiate ");
+ strlcpy(http->authstring, "Negotiate ", (size_t)authsize);
httpEncode64_2(http->authstring + 10, authsize - 10, output_token.value,
- output_token.length);
+ (int)output_token.length);
gss_release_buffer(&minor_status, &output_token);
}
@@ -766,7 +761,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
if (
# ifdef HAVE_GSSAPI
- strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) &&
+ _cups_strncasecmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) &&
# endif /* HAVE_GSSAPI */
# ifdef HAVE_AUTHORIZATION_H
!httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey",
@@ -813,7 +808,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
filename, strerror(errno)));
# ifdef HAVE_GSSAPI
- if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
+ if (!_cups_strncasecmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
{
/*
* Kerberos required, don't try the root certificate...
@@ -881,5 +876,5 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
/*
- * End of "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: auth.c 12619 2015-05-06 21:00:19Z msweet $".
*/
diff --git a/cups/backchannel.c b/cups/backchannel.c
index ffae80b..dca31d2 100644
--- a/cups/backchannel.c
+++ b/cups/backchannel.c
@@ -1,24 +1,18 @@
/*
- * "$Id: backchannel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backchannel.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Backchannel functions for CUPS.
+ * Backchannel functions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsBackChannelRead() - Read data from the backchannel.
- * cupsBackChannelWrite() - Write data to the backchannel.
- * cups_setup() - Setup select()
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -169,7 +163,7 @@ cupsBackChannelWrite(
*/
buffer += count;
- total += count;
+ total += (size_t)count;
}
}
@@ -195,5 +189,5 @@ cups_setup(fd_set *set, /* I - Set for select() */
/*
- * End of "$Id: backchannel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backchannel.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/backend.c b/cups/backend.c
index 22b379e..0789471 100644
--- a/cups/backend.c
+++ b/cups/backend.c
@@ -1,5 +1,5 @@
/*
- * "$Id: backend.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backend.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Backend functions for CUPS.
*
@@ -150,5 +150,5 @@ quote_string(const char *s) /* I - String to write */
/*
- * End of "$Id: backend.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backend.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/backend.h b/cups/backend.h
index 565960d..127c027 100644
--- a/cups/backend.h
+++ b/cups/backend.h
@@ -1,5 +1,5 @@
/*
- * "$Id: backend.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backend.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Backend definitions for CUPS.
*
@@ -74,5 +74,5 @@ extern void cupsBackendReport(const char *device_scheme,
#endif /* !_CUPS_BACKEND_H_ */
/*
- * End of "$Id: backend.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backend.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/conflicts.c b/cups/conflicts.c
index dcfd84d..23fecde 100644
--- a/cups/conflicts.c
+++ b/cups/conflicts.c
@@ -1,34 +1,20 @@
/*
- * "$Id: conflicts.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: conflicts.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Option marking routines for CUPS.
+ * Option marking routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsGetConflicts() - Get a list of conflicting options in a marked
- * PPD.
- * cupsResolveConflicts() - Resolve conflicts in a marked PPD.
- * ppdConflicts() - Check to see if there are any conflicts among
- * the marked option choices.
- * ppdInstallableConflict() - Test whether an option choice conflicts with an
- * installable option.
- * ppd_is_installable() - Determine whether an option is in the
- * InstallableOptions group.
- * ppd_load_constraints() - Load constraints from a PPD file.
- * ppd_test_constraints() - See if any constraints are active.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -193,7 +179,7 @@ cupsResolveConflicts(
tries, /* Number of tries */
num_newopts; /* Number of new options */
cups_option_t *newopts; /* New options */
- cups_array_t *active, /* Active constraints */
+ cups_array_t *active = NULL, /* Active constraints */
*pass, /* Resolvers for this pass */
*resolvers, /* Resolvers we have used */
*test; /* Test array for conflicts */
@@ -886,7 +872,7 @@ ppd_load_constraints(ppd_file_t *ppd) /* I - PPD file */
return;
}
- if ((constptr = calloc(i, sizeof(_ppd_cups_uiconst_t))) == NULL)
+ if ((constptr = calloc((size_t)i, sizeof(_ppd_cups_uiconst_t))) == NULL)
{
free(consts);
DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for "
@@ -930,7 +916,7 @@ ppd_load_constraints(ppd_file_t *ppd) /* I - PPD file */
if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True"))
{
_cups_strcpy(option, option + 6);
- strcpy(choice, "Custom");
+ strlcpy(choice, "Custom", sizeof(choice));
}
constptr->option = ppdFindOption(ppd, option);
@@ -1210,5 +1196,5 @@ ppd_test_constraints(
/*
- * End of "$Id: conflicts.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: conflicts.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/cups-private.h b/cups/cups-private.h
index 6ef16b4..da8a396 100644
--- a/cups/cups-private.h
+++ b/cups/cups-private.h
@@ -1,9 +1,9 @@
/*
- * "$Id: cups-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-private.h 12441 2015-01-29 14:42:32Z msweet $"
*
* Private definitions for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -24,6 +24,7 @@
# include "string-private.h"
# include "debug-private.h"
+# include "array-private.h"
# include "ipp-private.h"
# include "http-private.h"
# include "language-private.h"
@@ -86,6 +87,11 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
char resolved_uri[1024];
/* Buffer for cupsBackendDeviceURI */
+ /* debug.c */
+# ifdef DEBUG
+ int thread_id; /* Friendly thread ID */
+# endif /* DEBUG */
+
/* file.c */
cups_file_t *stdio_files[3];/* stdin, stdout, stderr */
@@ -125,7 +131,7 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
cups_array_t *leg_size_lut, /* Lookup table for legacy names */
*ppd_size_lut, /* Lookup table for PPD names */
*pwg_size_lut; /* Lookup table for PWG names */
- _pwg_media_t pwg_media; /* PWG media data for custom size */
+ pwg_media_t pwg_media; /* PWG media data for custom size */
char pwg_name[65]; /* PWG media name for custom size */
/* request.c */
@@ -145,6 +151,7 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
/* usersys.c */
http_encryption_t encryption; /* Encryption setting */
char user[65], /* User name */
+ user_agent[256],/* User-Agent string */
server[256], /* Server address */
servername[256],/* Server hostname */
password[128]; /* Password for default callback */
@@ -159,9 +166,9 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
void *server_cert_data;
/* Server certificate user data */
int server_version, /* Server IPP version */
- any_root, /* Allow any root */
+ any_root, /* Allow any (e.g., self-signed) root */
expired_certs, /* Allow expired certs */
- expired_root; /* Allow expired root */
+ validate_certs; /* Validate certificates */
/* util.c */
char def_printer[256];
@@ -200,6 +207,7 @@ typedef struct _cups_dconstres_s /* Constraint/resolver */
struct _cups_dinfo_s /* Destination capability and status
* information */
{
+ int version; /* IPP version */
const char *uri; /* Printer URI */
char *resource; /* Resource path */
ipp_t *attrs; /* Printer attributes */
@@ -211,6 +219,11 @@ struct _cups_dinfo_s /* Destination capability and status
cups_array_t *media_db; /* Media database */
_cups_media_db_t min_size, /* Minimum size */
max_size; /* Maximum size */
+ unsigned cached_flags; /* Flags used for cached media */
+ cups_array_t *cached_db; /* Cache of media from last index/default */
+ time_t ready_time; /* When xxx-ready attributes were last queried */
+ ipp_t *ready_attrs; /* xxx-ready attributes */
+ cups_array_t *ready_db; /* media[-col]-ready media database */
};
@@ -268,5 +281,5 @@ extern char *_cupsUserDefault(char *name, size_t namesize);
#endif /* !_CUPS_CUPS_PRIVATE_H_ */
/*
- * End of "$Id: cups-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-private.h 12441 2015-01-29 14:42:32Z msweet $".
*/
diff --git a/cups/cups.h b/cups/cups.h
index b6a2674..dc000ab 100644
--- a/cups/cups.h
+++ b/cups/cups.h
@@ -1,18 +1,18 @@
/*
- * "$Id: cups.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups.h 12998 2015-12-02 15:09:04Z msweet $"
*
- * API definitions for CUPS.
+ * API definitions for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_CUPS_H_
@@ -30,13 +30,19 @@
typedef off_t ssize_t; /* @private@ */
# endif /* WIN32 && !__CUPS_SSIZE_T_DEFINED */
-# ifdef __BLOCKS__
-# include <dispatch/dispatch.h>
-# endif /* __BLOCKS__ */
-
# include "file.h"
# include "ipp.h"
# include "language.h"
+# include "pwg.h"
+
+/*
+ * Define _PPD_DEPRECATED to silence the warnings about PPD functions being
+ * deprecated...
+ */
+
+# ifndef _PPD_DEPRECATED
+# define _PPD_DEPRECATED _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead.")
+# endif /* !_PPD_DEPRECATED */
/*
@@ -52,10 +58,10 @@ extern "C" {
* Constants...
*/
-# define CUPS_VERSION 1.0604
-# define CUPS_VERSION_MAJOR 1
-# define CUPS_VERSION_MINOR 6
-# define CUPS_VERSION_PATCH 4
+# define CUPS_VERSION 2.0102
+# define CUPS_VERSION_MAJOR 2
+# define CUPS_VERSION_MINOR 1
+# define CUPS_VERSION_PATCH 2
# define CUPS_BC_FD 3
/* Back-channel file descriptor for
@@ -244,6 +250,7 @@ enum cups_ptype_e /* Printer type/capability bit
* @since CUPS 1.4/OS X 10.6@ */
CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities
* @since CUPS 1.4/OS X 10.6@ */
+ CUPS_PRINTER_3D = 0x8000000, /* 3D Printing @since CUPS 2.1@ */
CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT |
* DEFAULT | FAX | REJECTING | DELETE |
* NOT_SHARED | AUTHENTICATED |
@@ -353,12 +360,12 @@ extern ipp_t *cupsDoRequest(http_t *http, ipp_t *request,
const char *resource);
extern http_encryption_t cupsEncryption(void);
extern void cupsFreeJobs(int num_jobs, cups_job_t *jobs);
-extern int cupsGetClasses(char ***classes) _CUPS_DEPRECATED;
+extern int cupsGetClasses(char ***classes) _CUPS_DEPRECATED_MSG("Use cupsGetDests instead.");
extern const char *cupsGetDefault(void);
extern int cupsGetJobs(cups_job_t **jobs, const char *name,
int myjobs, int whichjobs);
-extern const char *cupsGetPPD(const char *name);
-extern int cupsGetPrinters(char ***printers) _CUPS_DEPRECATED;
+extern const char *cupsGetPPD(const char *name) _PPD_DEPRECATED;
+extern int cupsGetPrinters(char ***printers) _CUPS_DEPRECATED_MSG("Use cupsGetDests instead.");
extern ipp_status_t cupsLastError(void);
extern int cupsPrintFile(const char *name, const char *filename,
const char *title, int num_options,
@@ -366,7 +373,7 @@ extern int cupsPrintFile(const char *name, const char *filename,
extern int cupsPrintFiles(const char *name, int num_files,
const char **files, const char *title,
int num_options, cups_option_t *options);
-extern char *cupsTempFile(char *filename, int len) _CUPS_DEPRECATED;
+extern char *cupsTempFile(char *filename, int len) _CUPS_DEPRECATED_MSG("Use cupsTempFd or cupsTempFile2 instead.");
extern int cupsTempFd(char *filename, int len);
extern int cupsAddDest(const char *name, const char *instance,
@@ -415,8 +422,7 @@ extern int cupsGetDests2(http_t *http, cups_dest_t **dests)
extern int cupsGetJobs2(http_t *http, cups_job_t **jobs,
const char *name, int myjobs,
int whichjobs) _CUPS_API_1_1_21;
-extern const char *cupsGetPPD2(http_t *http, const char *name)
- _CUPS_API_1_1_21;
+extern const char *cupsGetPPD2(http_t *http, const char *name) _PPD_DEPRECATED;
extern int cupsPrintFile2(http_t *http, const char *name,
const char *filename,
const char *title, int num_options,
@@ -481,7 +487,7 @@ extern const char *cupsGetPassword2(const char *prompt, http_t *http,
const char *resource) _CUPS_API_1_4;
extern http_status_t cupsGetPPD3(http_t *http, const char *name,
time_t *modtime, char *buffer,
- size_t bufsize) _CUPS_API_1_4;
+ size_t bufsize) _PPD_DEPRECATED;
extern ipp_t *cupsGetResponse(http_t *http,
const char *resource) _CUPS_API_1_4;
extern ssize_t cupsReadResponseData(http_t *http, char *buffer,
@@ -590,6 +596,39 @@ extern http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest,
cups_option_t *options,
int last_document) _CUPS_API_1_6;
+/* New in CUPS 1.7 */
+extern ipp_attribute_t *cupsFindDestDefault(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ const char *option) _CUPS_API_1_7;
+extern ipp_attribute_t *cupsFindDestReady(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ const char *option) _CUPS_API_1_7;
+extern ipp_attribute_t *cupsFindDestSupported(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ const char *option)
+ _CUPS_API_1_7;
+extern int cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo, int n,
+ unsigned flags,
+ cups_size_t *size)
+ _CUPS_API_1_7;
+extern int cupsGetDestMediaCount(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ unsigned flags) _CUPS_API_1_7;
+extern int cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ unsigned flags,
+ cups_size_t *size)
+ _CUPS_API_1_7;
+extern void cupsSetUserAgent(const char *user_agent) _CUPS_API_1_7;
+extern const char *cupsUserAgent(void) _CUPS_API_1_7;
+
+/* New in CUPS 2.0/OS X 10.10 */
+extern cups_dest_t *cupsGetDestWithURI(const char *name, const char *uri) _CUPS_API_2_0;
+extern const char *cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, unsigned flags, cups_size_t *size) _CUPS_API_2_0;
+extern int cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date) _CUPS_API_2_0;
+extern int cupsSetServerCredentials(const char *path, const char *common_name, int auto_create) _CUPS_API_2_0;
+
# ifdef __cplusplus
}
# endif /* __cplusplus */
@@ -597,5 +636,5 @@ extern http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest,
#endif /* !_CUPS_CUPS_H_ */
/*
- * End of "$Id: cups.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups.h 12998 2015-12-02 15:09:04Z msweet $".
*/
diff --git a/cups/custom.c b/cups/custom.c
index 09c3b71..28c1fed 100644
--- a/cups/custom.c
+++ b/cups/custom.c
@@ -1,5 +1,5 @@
/*
- * "$Id: custom.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: custom.c 10996 2013-05-29 11:51:34Z msweet $"
*
* PPD custom option routines for CUPS.
*
@@ -118,5 +118,5 @@ ppdNextCustomParam(ppd_coption_t *opt) /* I - Custom option */
/*
- * End of "$Id: custom.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: custom.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/debug-private.h b/cups/debug-private.h
index 7a817ad..8968aeb 100644
--- a/cups/debug-private.h
+++ b/cups/debug-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: debug-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: debug-private.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Private debugging macros for CUPS.
*
@@ -113,5 +113,5 @@ extern int _cups_gettimeofday(struct timeval *tv, void *tz);
#endif /* !_CUPS_DEBUG_PRIVATE_H_ */
/*
- * End of "$Id: debug-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: debug-private.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/debug.c b/cups/debug.c
index 846d98b..5b51d46 100644
--- a/cups/debug.c
+++ b/cups/debug.c
@@ -1,24 +1,17 @@
/*
- * "$Id: debug.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: debug.c 12928 2015-10-23 21:31:58Z msweet $"
*
- * Debugging functions for CUPS.
+ * Debugging functions for CUPS.
*
- * Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2015 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * debug_vsnprintf() - Format a string into a fixed size buffer.
- * _cups_debug_printf() - Write a formatted line to the log.
- * _cups_debug_puts() - Write a single line to the log.
- * _cups_debug_set() - Enable or disable debug logging.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -68,19 +61,279 @@ int _cups_debug_level = 1;
static regex_t *debug_filter = NULL;
/* Filter expression for messages */
static int debug_init = 0; /* Did we initialize debugging? */
-static _cups_mutex_t debug_mutex = _CUPS_MUTEX_INITIALIZER;
+static _cups_mutex_t debug_init_mutex = _CUPS_MUTEX_INITIALIZER,
/* Mutex to control initialization */
+ debug_log_mutex = _CUPS_MUTEX_INITIALIZER;
+ /* Mutex to serialize log entries */
+
+
+/*
+ * 'debug_thread_id()' - Return an integer representing the current thread.
+ */
+
+static int /* O - Local thread ID */
+debug_thread_id(void)
+{
+ _cups_globals_t *cg = _cupsGlobals(); /* Global data */
+
+
+ return (cg->thread_id);
+}
+
+
+/*
+ * '_cups_debug_printf()' - Write a formatted line to the log.
+ */
+
+void DLLExport
+_cups_debug_printf(const char *format, /* I - Printf-style format string */
+ ...) /* I - Additional arguments as needed */
+{
+ va_list ap; /* Pointer to arguments */
+ struct timeval curtime; /* Current time */
+ char buffer[2048]; /* Output buffer */
+ ssize_t bytes; /* Number of bytes in buffer */
+ int level; /* Log level in message */
+
+
+ /*
+ * See if we need to do any logging...
+ */
+
+ if (!debug_init)
+ _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"),
+ getenv("CUPS_DEBUG_FILTER"), 0);
+
+ if (_cups_debug_fd < 0)
+ return;
+
+ /*
+ * Filter as needed...
+ */
+
+ if (isdigit(format[0]))
+ level = *format++ - '0';
+ else
+ level = 0;
+
+ if (level > _cups_debug_level)
+ return;
+
+ if (debug_filter)
+ {
+ int result; /* Filter result */
+
+ _cupsMutexLock(&debug_init_mutex);
+ result = regexec(debug_filter, format, 0, NULL, 0);
+ _cupsMutexUnlock(&debug_init_mutex);
+
+ if (result)
+ return;
+ }
+
+ /*
+ * Format the message...
+ */
+
+ gettimeofday(&curtime, NULL);
+ snprintf(buffer, sizeof(buffer), "T%03d %02d:%02d:%02d.%03d ",
+ debug_thread_id(), (int)((curtime.tv_sec / 3600) % 24),
+ (int)((curtime.tv_sec / 60) % 60),
+ (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000));
+
+ va_start(ap, format);
+ bytes = _cups_safe_vsnprintf(buffer + 19, sizeof(buffer) - 20, format, ap) + 19;
+ va_end(ap);
+
+ if ((size_t)bytes >= (sizeof(buffer) - 1))
+ {
+ buffer[sizeof(buffer) - 2] = '\n';
+ bytes = sizeof(buffer) - 1;
+ }
+ else if (buffer[bytes - 1] != '\n')
+ {
+ buffer[bytes++] = '\n';
+ buffer[bytes] = '\0';
+ }
+
+ /*
+ * Write it out...
+ */
+
+ _cupsMutexLock(&debug_log_mutex);
+ write(_cups_debug_fd, buffer, (size_t)bytes);
+ _cupsMutexUnlock(&debug_log_mutex);
+}
+
+
+/*
+ * '_cups_debug_puts()' - Write a single line to the log.
+ */
+
+void DLLExport
+_cups_debug_puts(const char *s) /* I - String to output */
+{
+ struct timeval curtime; /* Current time */
+ char buffer[2048]; /* Output buffer */
+ ssize_t bytes; /* Number of bytes in buffer */
+ int level; /* Log level in message */
+
+
+ /*
+ * See if we need to do any logging...
+ */
+
+ if (!debug_init)
+ _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"),
+ getenv("CUPS_DEBUG_FILTER"), 0);
+
+ if (_cups_debug_fd < 0)
+ return;
+
+ /*
+ * Filter as needed...
+ */
+
+ if (isdigit(s[0]))
+ level = *s++ - '0';
+ else
+ level = 0;
+
+ if (level > _cups_debug_level)
+ return;
+
+ if (debug_filter)
+ {
+ int result; /* Filter result */
+
+ _cupsMutexLock(&debug_init_mutex);
+ result = regexec(debug_filter, s, 0, NULL, 0);
+ _cupsMutexUnlock(&debug_init_mutex);
+
+ if (result)
+ return;
+ }
+
+ /*
+ * Format the message...
+ */
+
+ gettimeofday(&curtime, NULL);
+ bytes = snprintf(buffer, sizeof(buffer), "T%03d %02d:%02d:%02d.%03d %s",
+ debug_thread_id(), (int)((curtime.tv_sec / 3600) % 24),
+ (int)((curtime.tv_sec / 60) % 60),
+ (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000),
+ s);
+
+ if ((size_t)bytes >= (sizeof(buffer) - 1))
+ {
+ buffer[sizeof(buffer) - 2] = '\n';
+ bytes = sizeof(buffer) - 1;
+ }
+ else if (buffer[bytes - 1] != '\n')
+ {
+ buffer[bytes++] = '\n';
+ buffer[bytes] = '\0';
+ }
+
+ /*
+ * Write it out...
+ */
+
+ _cupsMutexLock(&debug_log_mutex);
+ write(_cups_debug_fd, buffer, (size_t)bytes);
+ _cupsMutexUnlock(&debug_log_mutex);
+}
/*
- * 'debug_vsnprintf()' - Format a string into a fixed size buffer.
+ * '_cups_debug_set()' - Enable or disable debug logging.
*/
-static int /* O - Number of bytes formatted */
-debug_vsnprintf(char *buffer, /* O - Output buffer */
- size_t bufsize, /* O - Size of output buffer */
- const char *format, /* I - printf-style format string */
- va_list ap) /* I - Pointer to additional arguments */
+void DLLExport
+_cups_debug_set(const char *logfile, /* I - Log file or NULL */
+ const char *level, /* I - Log level or NULL */
+ const char *filter, /* I - Filter string or NULL */
+ int force) /* I - Force initialization */
+{
+ _cupsMutexLock(&debug_init_mutex);
+
+ if (!debug_init || force)
+ {
+ /*
+ * Restore debug settings to defaults...
+ */
+
+ if (_cups_debug_fd != -1)
+ {
+ close(_cups_debug_fd);
+ _cups_debug_fd = -1;
+ }
+
+ if (debug_filter)
+ {
+ regfree((regex_t *)debug_filter);
+ debug_filter = NULL;
+ }
+
+ _cups_debug_level = 1;
+
+ /*
+ * Open logs, set log levels, etc.
+ */
+
+ if (!logfile)
+ _cups_debug_fd = -1;
+ else if (!strcmp(logfile, "-"))
+ _cups_debug_fd = 2;
+ else
+ {
+ char buffer[1024]; /* Filename buffer */
+
+ snprintf(buffer, sizeof(buffer), logfile, getpid());
+
+ if (buffer[0] == '+')
+ _cups_debug_fd = open(buffer + 1, O_WRONLY | O_APPEND | O_CREAT, 0644);
+ else
+ _cups_debug_fd = open(buffer, O_WRONLY | O_TRUNC | O_CREAT, 0644);
+ }
+
+ if (level)
+ _cups_debug_level = atoi(level);
+
+ if (filter)
+ {
+ if ((debug_filter = (regex_t *)calloc(1, sizeof(regex_t))) == NULL)
+ fputs("Unable to allocate memory for CUPS_DEBUG_FILTER - results not "
+ "filtered!\n", stderr);
+ else if (regcomp(debug_filter, filter, REG_EXTENDED))
+ {
+ fputs("Bad regular expression in CUPS_DEBUG_FILTER - results not "
+ "filtered!\n", stderr);
+ free(debug_filter);
+ debug_filter = NULL;
+ }
+ }
+
+ debug_init = 1;
+ }
+
+ _cupsMutexUnlock(&debug_init_mutex);
+}
+#endif /* DEBUG */
+
+
+/*
+ * '_cups_safe_vsnprintf()' - Format a string into a fixed size buffer,
+ * quoting special characters.
+ */
+
+ssize_t /* O - Number of bytes formatted */
+_cups_safe_vsnprintf(
+ char *buffer, /* O - Output buffer */
+ size_t bufsize, /* O - Size of output buffer */
+ const char *format, /* I - printf-style format string */
+ va_list ap) /* I - Pointer to additional arguments */
{
char *bufptr, /* Pointer to position in buffer */
*bufend, /* Pointer to end of buffer */
@@ -88,11 +341,11 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
type; /* Format type character */
int width, /* Width of field */
prec; /* Number of characters of precision */
- char tformat[100], /* Temporary format string for sprintf() */
+ char tformat[100], /* Temporary format string for snprintf() */
*tptr, /* Pointer into temporary format */
temp[1024]; /* Buffer for formatted numbers */
char *s; /* Pointer to string */
- int bytes; /* Total number of bytes needed */
+ ssize_t bytes; /* Total number of bytes needed */
if (!buffer || bufsize < 2 || !format)
@@ -133,7 +386,7 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
format ++;
width = va_arg(ap, int);
- snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
+ snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width);
tptr += strlen(tptr);
}
else
@@ -165,7 +418,7 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
format ++;
prec = va_arg(ap, int);
- snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
+ snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec);
tptr += strlen(tptr);
}
else
@@ -220,25 +473,17 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
case 'e' :
case 'f' :
case 'g' :
- if ((width + 2) > sizeof(temp))
+ if ((size_t)(width + 2) > sizeof(temp))
break;
- sprintf(temp, tformat, va_arg(ap, double));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, double));
bytes += (int)strlen(temp);
if (bufptr)
{
- if ((bufptr + strlen(temp)) > bufend)
- {
- strncpy(bufptr, temp, (size_t)(bufend - bufptr));
- bufptr = bufend;
- }
- else
- {
- strcpy(bufptr, temp);
- bufptr += strlen(temp);
- }
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
+ bufptr += strlen(bufptr);
}
break;
@@ -250,56 +495,40 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
case 'o' :
case 'u' :
case 'x' :
- if ((width + 2) > sizeof(temp))
+ if ((size_t)(width + 2) > sizeof(temp))
break;
# ifdef HAVE_LONG_LONG
if (size == 'L')
- sprintf(temp, tformat, va_arg(ap, long long));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long));
else
# endif /* HAVE_LONG_LONG */
if (size == 'l')
- sprintf(temp, tformat, va_arg(ap, long));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, long));
else
- sprintf(temp, tformat, va_arg(ap, int));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, int));
bytes += (int)strlen(temp);
if (bufptr)
{
- if ((bufptr + strlen(temp)) > bufend)
- {
- strncpy(bufptr, temp, (size_t)(bufend - bufptr));
- bufptr = bufend;
- }
- else
- {
- strcpy(bufptr, temp);
- bufptr += strlen(temp);
- }
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
+ bufptr += strlen(bufptr);
}
break;
case 'p' : /* Pointer value */
- if ((width + 2) > sizeof(temp))
+ if ((size_t)(width + 2) > sizeof(temp))
break;
- sprintf(temp, tformat, va_arg(ap, void *));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *));
bytes += (int)strlen(temp);
if (bufptr)
{
- if ((bufptr + strlen(temp)) > bufend)
- {
- strncpy(bufptr, temp, (size_t)(bufend - bufptr));
- bufptr = bufend;
- }
- else
- {
- strcpy(bufptr, temp);
- bufptr += strlen(temp);
- }
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
+ bufptr += strlen(bufptr);
}
break;
@@ -309,7 +538,7 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
if (bufptr)
{
if (width <= 1)
- *bufptr++ = va_arg(ap, int);
+ *bufptr++ = (char)va_arg(ap, int);
else
{
if ((bufptr + width) > bufend)
@@ -390,7 +619,7 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
break;
case 'n' : /* Output number of chars so far */
- *(va_arg(ap, int *)) = bytes;
+ *(va_arg(ap, int *)) = (int)bytes;
break;
}
}
@@ -416,243 +645,5 @@ debug_vsnprintf(char *buffer, /* O - Output buffer */
/*
- * '_cups_debug_printf()' - Write a formatted line to the log.
- */
-
-void DLLExport
-_cups_debug_printf(const char *format, /* I - Printf-style format string */
- ...) /* I - Additional arguments as needed */
-{
- va_list ap; /* Pointer to arguments */
- struct timeval curtime; /* Current time */
- char buffer[2048]; /* Output buffer */
- size_t bytes; /* Number of bytes in buffer */
- int level; /* Log level in message */
-
-
- /*
- * See if we need to do any logging...
- */
-
- if (!debug_init)
- _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"),
- getenv("CUPS_DEBUG_FILTER"), 0);
-
- if (_cups_debug_fd < 0)
- return;
-
- /*
- * Filter as needed...
- */
-
- if (isdigit(format[0]))
- level = *format++ - '0';
- else
- level = 0;
-
- if (level > _cups_debug_level)
- return;
-
- if (debug_filter)
- {
- int result; /* Filter result */
-
- _cupsMutexLock(&debug_mutex);
- result = regexec(debug_filter, format, 0, NULL, 0);
- _cupsMutexUnlock(&debug_mutex);
-
- if (result)
- return;
- }
-
- /*
- * Format the message...
- */
-
- gettimeofday(&curtime, NULL);
- snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d.%03d ",
- (int)((curtime.tv_sec / 3600) % 24),
- (int)((curtime.tv_sec / 60) % 60),
- (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000));
-
- va_start(ap, format);
- bytes = debug_vsnprintf(buffer + 13, sizeof(buffer) - 14, format, ap) + 13;
- va_end(ap);
-
- if (bytes >= (sizeof(buffer) - 1))
- {
- buffer[sizeof(buffer) - 2] = '\n';
- bytes = sizeof(buffer) - 1;
- }
- else if (buffer[bytes - 1] != '\n')
- {
- buffer[bytes++] = '\n';
- buffer[bytes] = '\0';
- }
-
- /*
- * Write it out...
- */
-
- write(_cups_debug_fd, buffer, bytes);
-}
-
-
-/*
- * '_cups_debug_puts()' - Write a single line to the log.
- */
-
-void DLLExport
-_cups_debug_puts(const char *s) /* I - String to output */
-{
- struct timeval curtime; /* Current time */
- char buffer[2048]; /* Output buffer */
- size_t bytes; /* Number of bytes in buffer */
- int level; /* Log level in message */
-
-
- /*
- * See if we need to do any logging...
- */
-
- if (!debug_init)
- _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"),
- getenv("CUPS_DEBUG_FILTER"), 0);
-
- if (_cups_debug_fd < 0)
- return;
-
- /*
- * Filter as needed...
- */
-
- if (isdigit(s[0]))
- level = *s++ - '0';
- else
- level = 0;
-
- if (level > _cups_debug_level)
- return;
-
- if (debug_filter)
- {
- int result; /* Filter result */
-
- _cupsMutexLock(&debug_mutex);
- result = regexec(debug_filter, s, 0, NULL, 0);
- _cupsMutexUnlock(&debug_mutex);
-
- if (result)
- return;
- }
-
- /*
- * Format the message...
- */
-
- gettimeofday(&curtime, NULL);
- bytes = snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d.%03d %s",
- (int)((curtime.tv_sec / 3600) % 24),
- (int)((curtime.tv_sec / 60) % 60),
- (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000),
- s);
-
- if (bytes >= (sizeof(buffer) - 1))
- {
- buffer[sizeof(buffer) - 2] = '\n';
- bytes = sizeof(buffer) - 1;
- }
- else if (buffer[bytes - 1] != '\n')
- {
- buffer[bytes++] = '\n';
- buffer[bytes] = '\0';
- }
-
- /*
- * Write it out...
- */
-
- write(_cups_debug_fd, buffer, bytes);
-}
-
-
-/*
- * '_cups_debug_set()' - Enable or disable debug logging.
- */
-
-void DLLExport
-_cups_debug_set(const char *logfile, /* I - Log file or NULL */
- const char *level, /* I - Log level or NULL */
- const char *filter, /* I - Filter string or NULL */
- int force) /* I - Force initialization */
-{
- _cupsMutexLock(&debug_mutex);
-
- if (!debug_init || force)
- {
- /*
- * Restore debug settings to defaults...
- */
-
- if (_cups_debug_fd != -1)
- {
- close(_cups_debug_fd);
- _cups_debug_fd = -1;
- }
-
- if (debug_filter)
- {
- regfree((regex_t *)debug_filter);
- debug_filter = NULL;
- }
-
- _cups_debug_level = 1;
-
- /*
- * Open logs, set log levels, etc.
- */
-
- if (!logfile)
- _cups_debug_fd = -1;
- else if (!strcmp(logfile, "-"))
- _cups_debug_fd = 2;
- else
- {
- char buffer[1024]; /* Filename buffer */
-
- snprintf(buffer, sizeof(buffer), logfile, getpid());
-
- if (buffer[0] == '+')
- _cups_debug_fd = open(buffer + 1, O_WRONLY | O_APPEND | O_CREAT, 0644);
- else
- _cups_debug_fd = open(buffer, O_WRONLY | O_TRUNC | O_CREAT, 0644);
- }
-
- if (level)
- _cups_debug_level = atoi(level);
-
- if (filter)
- {
- if ((debug_filter = (regex_t *)calloc(1, sizeof(regex_t))) == NULL)
- fputs("Unable to allocate memory for CUPS_DEBUG_FILTER - results not "
- "filtered!\n", stderr);
- else if (regcomp(debug_filter, filter, REG_EXTENDED))
- {
- fputs("Bad regular expression in CUPS_DEBUG_FILTER - results not "
- "filtered!\n", stderr);
- free(debug_filter);
- debug_filter = NULL;
- }
- }
-
- debug_init = 1;
- }
-
- _cupsMutexUnlock(&debug_mutex);
-}
-#endif /* DEBUG */
-
-
-/*
- * End of "$Id: debug.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: debug.c 12928 2015-10-23 21:31:58Z msweet $".
*/
diff --git a/cups/dest-job.c b/cups/dest-job.c
index a11386c..703b171 100644
--- a/cups/dest-job.c
+++ b/cups/dest-job.c
@@ -1,25 +1,17 @@
/*
- * "$Id: dest-job.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest-job.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Destination job support for CUPS.
+ * Destination job support for CUPS.
*
- * Copyright 2012 by Apple Inc.
+ * Copyright 2012-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsCancelDestJob() - Cancel a job on a destination.
- * cupsCloseDestJob() - Close a job and start printing.
- * cupsCreateDestJob() - Create a job on a destination.
- * cupsFinishDestDocument() - Finish the current document.
- * cupsStartDestDocument() - Start a new document.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -34,7 +26,7 @@
*
* The "job_id" is the number returned by cupsCreateDestJob.
*
- * Returns IPP_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
+ * Returns IPP_STATUS_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
* failure.
*
* @since CUPS 1.6/OS X 10.8@
@@ -45,7 +37,13 @@ cupsCancelDestJob(http_t *http, /* I - Connection to destination */
cups_dest_t *dest, /* I - Destination */
int job_id) /* I - Job ID */
{
- return (IPP_NOT_FOUND);
+ /* TODO: Needs to be implemented! */
+ /* Probably also needs to be revved to accept cups_dinfo_t... */
+ (void)http;
+ (void)dest;
+ (void)job_id;
+
+ return (IPP_STATUS_ERROR_NOT_FOUND);
}
@@ -53,7 +51,7 @@ cupsCancelDestJob(http_t *http, /* I - Connection to destination */
* 'cupsCloseDestJob()' - Close a job and start printing.
*
* Use when the last call to cupsStartDocument passed 0 for "last_document".
- * "job_id" is the job ID returned by cupsCreateDestJob. Returns @code IPP_OK@
+ * "job_id" is the job ID returned by cupsCreateDestJob. Returns @code IPP_STATUS_OK@
* on success.
*
* @since CUPS 1.6/OS X 10.8@
@@ -81,9 +79,9 @@ cupsCloseDestJob(
if (!http || !dest || !info || job_id <= 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
DEBUG_puts("1cupsCloseDestJob: Bad arguments.");
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
}
/*
@@ -94,31 +92,33 @@ cupsCloseDestJob(
IPP_TAG_ENUM)) != NULL)
{
for (i = 0; i < attr->num_values; i ++)
- if (attr->values[i].integer == IPP_CLOSE_JOB)
+ if (attr->values[i].integer == IPP_OP_CLOSE_JOB)
{
- request = ippNewRequest(IPP_CLOSE_JOB);
+ request = ippNewRequest(IPP_OP_CLOSE_JOB);
break;
}
}
if (!request)
- request = ippNewRequest(IPP_SEND_DOCUMENT);
+ request = ippNewRequest(IPP_OP_SEND_DOCUMENT);
if (!request)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
DEBUG_puts("1cupsCloseDestJob: Unable to create Close-Job/Send-Document "
"request.");
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
}
+ ippSetVersion(request, info->version / 10, info->version % 10);
+
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, info->uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
job_id);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, cupsUser());
- if (ippGetOperation(request) == IPP_SEND_DOCUMENT)
+ if (ippGetOperation(request) == IPP_OP_SEND_DOCUMENT)
ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1);
/*
@@ -137,7 +137,7 @@ cupsCloseDestJob(
/*
* 'cupsCreateDestJob()' - Create a job on a destination.
*
- * Returns @code IPP_OK@ or @code IPP_OK_SUBST@ on success, saving the job ID
+ * Returns @code IPP_STATUS_OK@ or @code IPP_STATUS_OK_SUBST@ on success, saving the job ID
* in the variable pointed to by "job_id".
*
* @since CUPS 1.6/OS X 10.8@
@@ -173,22 +173,24 @@ cupsCreateDestJob(
if (!http || !dest || !info || !job_id)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
DEBUG_puts("1cupsCreateDestJob: Bad arguments.");
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
}
/*
* Build a Create-Job request...
*/
- if ((request = ippNewRequest(IPP_CREATE_JOB)) == NULL)
+ if ((request = ippNewRequest(IPP_OP_CREATE_JOB)) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
DEBUG_puts("1cupsCreateDestJob: Unable to create Create-Job request.");
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
}
+ ippSetVersion(request, info->version / 10, info->version % 10);
+
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, info->uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
@@ -197,6 +199,7 @@ cupsCreateDestJob(
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
title);
+ cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_SUBSCRIPTION);
@@ -228,7 +231,7 @@ cupsCreateDestJob(
/*
* 'cupsFinishDestDocument()' - Finish the current document.
*
- * Returns @code IPP_OK@ or @code IPP_OK_SUBST@ on success.
+ * Returns @code IPP_STATUS_OK@ or @code IPP_STATUS_OK_SUBST@ on success.
*
* @since CUPS 1.6/OS X 10.8@
*/
@@ -249,9 +252,9 @@ cupsFinishDestDocument(
if (!http || !dest || !info)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
DEBUG_puts("1cupsFinishDestDocument: Bad arguments.");
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
}
/*
@@ -309,23 +312,25 @@ cupsStartDestDocument(
if (!http || !dest || !info || job_id <= 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
DEBUG_puts("1cupsStartDestDocument: Bad arguments.");
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
* Create a Send-Document request...
*/
- if ((request = ippNewRequest(IPP_SEND_DOCUMENT)) == NULL)
+ if ((request = ippNewRequest(IPP_OP_SEND_DOCUMENT)) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
DEBUG_puts("1cupsStartDestDocument: Unable to create Send-Document "
"request.");
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
+ ippSetVersion(request, info->version / 10, info->version % 10);
+
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, info->uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id);
@@ -337,8 +342,9 @@ cupsStartDestDocument(
if (format)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
"document-format", NULL, format);
- ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last_document);
+ ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last_document);
+ cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_DOCUMENT);
/*
@@ -354,5 +360,5 @@ cupsStartDestDocument(
/*
- * End of "$Id: dest-job.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dest-job.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/dest-localization.c b/cups/dest-localization.c
index 4d8bff6..d76ae2b 100644
--- a/cups/dest-localization.c
+++ b/cups/dest-localization.c
@@ -1,28 +1,17 @@
/*
- * "$Id: dest-localization.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest-localization.c 12094 2014-08-19 12:15:11Z msweet $"
*
- * Destination localization support for CUPS.
+ * Destination localization support for CUPS.
*
- * Copyright 2012 by Apple Inc.
+ * Copyright 2012-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsLocalizeDestOption() - Get the localized string for a destination
- * option.
- * cupsLocalizeDestValue() - Get the localized string for a destination
- * option+value pair.
- * cups_create_localizations() - Create the localizations array for a
- * destination.
- * cups_read_strings() - Read a pair of strings from a .strings file.
- * cups_scan_strings() - Scan a quoted string.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -43,6 +32,170 @@ static char *cups_scan_strings(char *buffer);
/*
+ * 'cupsLocalizeDestMedia()' - Get the localized string for a destination media
+ * size.
+ *
+ * The returned string is stored in the destination information and will become
+ * invalid if the destination information is deleted.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+const char * /* O - Localized string */
+cupsLocalizeDestMedia(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ unsigned flags, /* I - Media flags */
+ cups_size_t *size) /* I - Media size */
+{
+ cups_lang_t *lang; /* Standard localizations */
+ _cups_message_t key, /* Search key */
+ *match; /* Matching entry */
+ pwg_media_t *pwg; /* PWG media information */
+ cups_array_t *db; /* Media database */
+ _cups_media_db_t *mdb; /* Media database entry */
+ char name[1024], /* Size name */
+ temp[256]; /* Temporary string */
+ const char *lsize, /* Localized media size */
+ *lsource, /* Localized media source */
+ *ltype; /* Localized media type */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo || !size)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ /*
+ * See if the localization is cached...
+ */
+
+ if (!dinfo->localizations)
+ cups_create_localizations(http, dinfo);
+
+ key.id = size->media;
+ if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
+ return (match->str);
+
+ /*
+ * If not, get the localized size, source, and type strings...
+ */
+
+ lang = cupsLangDefault();
+ pwg = pwgMediaForSize(size->width, size->length);
+
+ if (pwg->ppd)
+ lsize = _cupsLangString(lang, pwg->ppd);
+ else
+ lsize = NULL;
+
+ if (!lsize)
+ {
+ if ((size->width % 635) == 0 && (size->length % 635) == 0)
+ {
+ /*
+ * Use inches since the size is a multiple of 1/4 inch.
+ */
+
+ snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%g x %g")), size->width / 2540.0, size->length / 2540.0);
+ }
+ else
+ {
+ /*
+ * Use millimeters since the size is not a multiple of 1/4 inch.
+ */
+
+ snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%d x %d mm")), (size->width + 50) / 100, (size->length + 50) / 100);
+ }
+
+ lsize = temp;
+ }
+
+ if (flags & CUPS_MEDIA_FLAGS_READY)
+ db = dinfo->ready_db;
+ else
+ db = dinfo->media_db;
+
+ DEBUG_printf(("1cupsLocalizeDestMedia: size->media=\"%s\"", size->media));
+
+ for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db))
+ {
+ if (mdb->key && !strcmp(mdb->key, size->media))
+ break;
+ else if (mdb->size_name && !strcmp(mdb->size_name, size->media))
+ break;
+ }
+
+ if (!mdb)
+ {
+ for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db))
+ {
+ if (mdb->width == size->width && mdb->length == size->length && mdb->bottom == size->bottom && mdb->left == size->left && mdb->right == size->right && mdb->top == size->top)
+ break;
+ }
+ }
+
+ if (mdb)
+ {
+ DEBUG_printf(("1cupsLocalizeDestMedia: MATCH mdb%p [key=\"%s\" size_name=\"%s\" source=\"%s\" type=\"%s\" width=%d length=%d B%d L%d R%d T%d]", mdb, mdb->key, mdb->size_name, mdb->source, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top));
+
+ lsource = cupsLocalizeDestValue(http, dest, dinfo, "media-source", mdb->source);
+ ltype = cupsLocalizeDestValue(http, dest, dinfo, "media-type", mdb->type);
+ }
+ else
+ {
+ lsource = NULL;
+ ltype = NULL;
+ }
+
+ if (!lsource && !ltype)
+ {
+ if (size->bottom || size->left || size->right || size->top)
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless)")), lsize);
+ else
+ strlcpy(name, lsize, sizeof(name));
+ }
+ else if (!lsource)
+ {
+ if (size->bottom || size->left || size->right || size->top)
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, ltype);
+ else
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s)")), lsize, ltype);
+ }
+ else if (!ltype)
+ {
+ if (size->bottom || size->left || size->right || size->top)
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, lsource);
+ else
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s)")), lsize, lsource);
+ }
+ else
+ {
+ if (size->bottom || size->left || size->right || size->top)
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s, %s)")), lsize, ltype, lsource);
+ else
+ snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s, %s)")), lsize, ltype, lsource);
+ }
+
+ if ((match = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL)
+ return (NULL);
+
+ match->id = strdup(size->media);
+ match->str = strdup(name);
+
+ cupsArrayAdd(dinfo->localizations, match);
+
+ return (match->str);
+}
+
+
+/*
* 'cupsLocalizeDestOption()' - Get the localized string for a destination
* option.
*
@@ -178,7 +331,7 @@ cups_create_localizations(
if (httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text,
scheme, sizeof(scheme), userpass, sizeof(userpass),
hostname, sizeof(hostname), &port, resource,
- sizeof(resource)) < HTTP_URI_OK)
+ sizeof(resource)) < HTTP_URI_STATUS_OK)
{
DEBUG_printf(("4cups_create_localizations: Bad printer-strings-uri value "
"\"%s\".", attr->values[0].string.text));
@@ -188,7 +341,7 @@ cups_create_localizations(
httpGetHostname(http, http_hostname, sizeof(http_hostname));
if (!_cups_strcasecmp(http_hostname, hostname) &&
- port == _httpAddrPort(http->hostaddr))
+ port == httpAddrPort(http->hostaddr))
{
/*
* Use the same connection...
@@ -203,11 +356,12 @@ cups_create_localizations(
*/
if (!strcmp(scheme, "https"))
- encryption = HTTP_ENCRYPT_ALWAYS;
+ encryption = HTTP_ENCRYPTION_ALWAYS;
else
- encryption = HTTP_ENCRYPT_IF_REQUESTED;
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
- if ((http2 = httpConnectEncrypt(hostname, port, encryption)) == NULL)
+ if ((http2 = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1,
+ 30000, NULL)) == NULL)
{
DEBUG_printf(("4cups_create_localizations: Unable to connect to "
"%s:%d: %s", hostname, port, cupsLastErrorString()));
@@ -233,7 +387,7 @@ cups_create_localizations(
DEBUG_printf(("4cups_create_localizations: GET %s = %s", resource,
httpStatus(status)));
- if (status == HTTP_OK)
+ if (status == HTTP_STATUS_OK)
{
/*
* Got the file, read it...
@@ -355,8 +509,7 @@ cups_scan_strings(char *buffer) /* I - Start of string */
* Decode \nnn octal escape...
*/
- *bufptr = ((((bufptr[1] - '0') << 3) | (bufptr[2] - '0')) << 3) |
- (bufptr[3] - '0');
+ *bufptr = (char)(((((bufptr[1] - '0') << 3) | (bufptr[2] - '0')) << 3) | (bufptr[3] - '0'));
_cups_strcpy(bufptr + 1, bufptr + 4);
}
else
@@ -382,5 +535,5 @@ cups_scan_strings(char *buffer) /* I - Start of string */
/*
- * End of "$Id: dest-localization.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dest-localization.c 12094 2014-08-19 12:15:11Z msweet $".
*/
diff --git a/cups/dest-options.c b/cups/dest-options.c
index 08bd16d..8fda3c8 100644
--- a/cups/dest-options.c
+++ b/cups/dest-options.c
@@ -1,42 +1,17 @@
/*
- * "$Id: dest-options.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest-options.c 11882 2014-05-16 21:02:15Z msweet $"
*
- * Destination option/media support for CUPS.
+ * Destination option/media support for CUPS.
*
- * Copyright 2012 by Apple Inc.
+ * Copyright 2012-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsCheckDestSupported() - Check that the option and value are supported
- * by the destination.
- * cupsCopyDestConflicts() - Get conflicts and resolutions for a new
- * option/value pair.
- * cupsCopyDestInfo() - Get the supported values/capabilities for the
- * destination.
- * cupsFreeDestInfo() - Free destination information obtained using
- * @link cupsCopyDestInfo@.
- * cupsGetDestMediaByName() - Get media names, dimensions, and margins.
- * cupsGetDestMediaBySize() - Get media names, dimensions, and margins.
- * cups_add_dconstres() - Add a constraint or resolver to an array.
- * cups_compare_dconstres() - Compare to resolver entries.
- * cups_compare_media_db() - Compare two media entries.
- * cups_copy_media_db() - Copy a media entry.
- * cups_create_constraints() - Create the constraints and resolvers arrays.
- * cups_create_defaults() - Create the -default option array.
- * cups_create_media_db() - Create the media database.
- * cups_free_media_cb() - Free a media entry.
- * cups_get_media_db() - Lookup the media entry for a given size.
- * cups_is_close_media_db() - Compare two media entries to see if they are
- * close to the same size.
- * cups_test_constraints() - Test constraints.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -47,6 +22,13 @@
/*
+ * Local constants...
+ */
+
+#define _CUPS_MEDIA_READY_TTL 30 /* Life of xxx-ready values */
+
+
+/*
* Local functions...
*/
@@ -56,12 +38,15 @@ static int cups_compare_dconstres(_cups_dconstres_t *a,
static int cups_compare_media_db(_cups_media_db_t *a,
_cups_media_db_t *b);
static _cups_media_db_t *cups_copy_media_db(_cups_media_db_t *mdb);
+static void cups_create_cached(http_t *http, cups_dinfo_t *dinfo,
+ unsigned flags);
static void cups_create_constraints(cups_dinfo_t *dinfo);
static void cups_create_defaults(cups_dinfo_t *dinfo);
-static void cups_create_media_db(cups_dinfo_t *dinfo);
+static void cups_create_media_db(cups_dinfo_t *dinfo,
+ unsigned flags);
static void cups_free_media_db(_cups_media_db_t *mdb);
-static int cups_get_media_db(cups_dinfo_t *dinfo,
- _pwg_media_t *pwg, unsigned flags,
+static int cups_get_media_db(http_t *http, cups_dinfo_t *dinfo,
+ pwg_media_t *pwg, unsigned flags,
cups_size_t *size);
static int cups_is_close_media_db(_cups_media_db_t *a,
_cups_media_db_t *b);
@@ -72,6 +57,7 @@ static cups_array_t *cups_test_constraints(cups_dinfo_t *dinfo,
cups_option_t *options,
int *num_conflicts,
cups_option_t **conflicts);
+static void cups_update_ready(http_t *http, cups_dinfo_t *dinfo);
/*
@@ -133,7 +119,7 @@ cupsCheckDestSupported(
* Check range of custom media sizes...
*/
- _pwg_media_t *pwg; /* Current PWG media size info */
+ pwg_media_t *pwg; /* Current PWG media size info */
int min_width, /* Minimum width */
min_length, /* Minimum length */
max_width, /* Maximum width */
@@ -151,13 +137,13 @@ cupsCheckDestSupported(
i --, attrval ++)
{
if (!strncmp(attrval->string.text, "custom_min_", 11) &&
- (pwg = _pwgMediaForPWG(attrval->string.text)) != NULL)
+ (pwg = pwgMediaForPWG(attrval->string.text)) != NULL)
{
min_width = pwg->width;
min_length = pwg->length;
}
else if (!strncmp(attrval->string.text, "custom_max_", 11) &&
- (pwg = _pwgMediaForPWG(attrval->string.text)) != NULL)
+ (pwg = pwgMediaForPWG(attrval->string.text)) != NULL)
{
max_width = pwg->width;
max_length = pwg->length;
@@ -169,7 +155,7 @@ cupsCheckDestSupported(
*/
if (min_width < INT_MAX && max_width > 0 &&
- (pwg = _pwgMediaForPWG(value)) != NULL &&
+ (pwg = pwgMediaForPWG(value)) != NULL &&
pwg->width >= min_width && pwg->width <= max_width &&
pwg->length >= min_length && pwg->length <= max_length)
return (1);
@@ -304,7 +290,7 @@ cupsCopyDestConflicts(
*myres = NULL, /* My resolved options */
*myoption, /* My current option */
*option; /* Current option */
- cups_array_t *active, /* Active conflicts */
+ cups_array_t *active = NULL, /* Active conflicts */
*pass = NULL, /* Resolvers for this pass */
*resolvers = NULL, /* Resolvers we have used */
*test; /* Test array for conflicts */
@@ -620,11 +606,11 @@ cupsCopyDestInfo(
* Send a Get-Printer-Attributes request...
*/
- request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
- NULL, cupsUser());
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+ "requesting-user-name", NULL, cupsUser());
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes",
(int)(sizeof(requested_attrs) / sizeof(requested_attrs[0])),
@@ -632,7 +618,7 @@ cupsCopyDestInfo(
response = cupsDoRequest(http, request, resource);
status = cupsLastError();
- if (status > IPP_OK_SUBST)
+ if (status > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
{
DEBUG_printf(("cupsCopyDestSupported: Get-Printer-Attributes for '%s' "
"returned %s (%s)", dest->name, ippErrorString(status),
@@ -641,11 +627,11 @@ cupsCopyDestInfo(
ippDelete(response);
response = NULL;
- if (status == IPP_VERSION_NOT_SUPPORTED && version > 11)
+ if (status == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED && version > 11)
version = 11;
- else if (status == IPP_PRINTER_BUSY)
+ else if (status == IPP_STATUS_ERROR_BUSY)
{
- sleep(delay);
+ sleep((unsigned)delay);
delay = _cupsNextDelay(delay, &prev_delay);
}
@@ -666,11 +652,12 @@ cupsCopyDestInfo(
if ((dinfo = calloc(1, sizeof(cups_dinfo_t))) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
ippDelete(response);
return (NULL);
}
+ dinfo->version = version;
dinfo->uri = uri;
dinfo->resource = _cupsStrAlloc(resource);
dinfo->attrs = response;
@@ -680,6 +667,129 @@ cupsCopyDestInfo(
/*
+ * 'cupsFindDestDefault()' - Find the default value(s) for the given option.
+ *
+ * The returned value is an IPP attribute. Use the @code ippGetBoolean@,
+ * @code ippGetCollection@, @code ippGetCount@, @code ippGetDate@,
+ * @code ippGetInteger@, @code ippGetOctetString@, @code ippGetRange@,
+ * @code ippGetResolution@, @code ippGetString@, and @code ippGetValueTag@
+ * functions to inspect the default value(s) as needed.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+ipp_attribute_t * /* O - Default attribute or @code NULL@ for none */
+cupsFindDestDefault(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option) /* I - Option/attribute name */
+{
+ char name[IPP_MAX_NAME]; /* Attribute name */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo || !option)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ /*
+ * Find and return the attribute...
+ */
+
+ snprintf(name, sizeof(name), "%s-default", option);
+ return (ippFindAttribute(dinfo->attrs, name, IPP_TAG_ZERO));
+}
+
+/*
+ * 'cupsFindDestReady()' - Find the default value(s) for the given option.
+ *
+ * The returned value is an IPP attribute. Use the @code ippGetBoolean@,
+ * @code ippGetCollection@, @code ippGetCount@, @code ippGetDate@,
+ * @code ippGetInteger@, @code ippGetOctetString@, @code ippGetRange@,
+ * @code ippGetResolution@, @code ippGetString@, and @code ippGetValueTag@
+ * functions to inspect the default value(s) as needed.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+ipp_attribute_t * /* O - Default attribute or @code NULL@ for none */
+cupsFindDestReady(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option) /* I - Option/attribute name */
+{
+ char name[IPP_MAX_NAME]; /* Attribute name */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo || !option)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ /*
+ * Find and return the attribute...
+ */
+
+ cups_update_ready(http, dinfo);
+
+ snprintf(name, sizeof(name), "%s-ready", option);
+ return (ippFindAttribute(dinfo->ready_attrs, name, IPP_TAG_ZERO));
+}
+
+/*
+ * 'cupsFindDestSupported()' - Find the default value(s) for the given option.
+ *
+ * The returned value is an IPP attribute. Use the @code ippGetBoolean@,
+ * @code ippGetCollection@, @code ippGetCount@, @code ippGetDate@,
+ * @code ippGetInteger@, @code ippGetOctetString@, @code ippGetRange@,
+ * @code ippGetResolution@, @code ippGetString@, and @code ippGetValueTag@
+ * functions to inspect the default value(s) as needed.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+ipp_attribute_t * /* O - Default attribute or @code NULL@ for none */
+cupsFindDestSupported(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option) /* I - Option/attribute name */
+{
+ char name[IPP_MAX_NAME]; /* Attribute name */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo || !option)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ /*
+ * Find and return the attribute...
+ */
+
+ snprintf(name, sizeof(name), "%s-supported", option);
+ return (ippFindAttribute(dinfo->attrs, name, IPP_TAG_ZERO));
+}
+
+
+/*
* 'cupsFreeDestInfo()' - Free destination information obtained using
* @link cupsCopyDestInfo@.
*/
@@ -707,6 +817,11 @@ cupsFreeDestInfo(cups_dinfo_t *dinfo) /* I - Destination information */
cupsArrayDelete(dinfo->media_db);
+ cupsArrayDelete(dinfo->cached_db);
+
+ ippDelete(dinfo->ready_attrs);
+ cupsArrayDelete(dinfo->ready_db);
+
ippDelete(dinfo->attrs);
free(dinfo);
@@ -714,6 +829,86 @@ cupsFreeDestInfo(cups_dinfo_t *dinfo) /* I - Destination information */
/*
+ * 'cupsGetDestMediaByIndex()' - Get a media name, dimension, and margins for a
+ * specific size.
+ *
+ * The @code flags@ parameter determines which set of media are indexed. For
+ * example, passing @code CUPS_MEDIA_FLAGS_BORDERLESS@ will get the Nth
+ * borderless size supported by the printer.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsGetDestMediaByIndex(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ int n, /* I - Media size number (0-based) */
+ unsigned flags, /* I - Media flags */
+ cups_size_t *size) /* O - Media size information */
+{
+ _cups_media_db_t *nsize; /* Size for N */
+ pwg_media_t *pwg; /* PWG media name for size */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (size)
+ memset(size, 0, sizeof(cups_size_t));
+
+ if (!http || !dest || !dinfo || n < 0 || !size)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ /*
+ * Load media list as needed...
+ */
+
+ if (flags & CUPS_MEDIA_FLAGS_READY)
+ cups_update_ready(http, dinfo);
+
+ if (!dinfo->cached_db || dinfo->cached_flags != flags)
+ cups_create_cached(http, dinfo, flags);
+
+ /*
+ * Copy the size over and return...
+ */
+
+ if ((nsize = (_cups_media_db_t *)cupsArrayIndex(dinfo->cached_db, n)) == NULL)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ if (nsize->size_name)
+ strlcpy(size->media, nsize->size_name, sizeof(size->media));
+ else if (nsize->key)
+ strlcpy(size->media, nsize->key, sizeof(size->media));
+ else if ((pwg = pwgMediaForSize(nsize->width, nsize->length)) != NULL)
+ strlcpy(size->media, pwg->pwg, sizeof(size->media));
+ else
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ size->width = nsize->width;
+ size->length = nsize->length;
+ size->bottom = nsize->bottom;
+ size->left = nsize->left;
+ size->right = nsize->right;
+ size->top = nsize->top;
+
+ return (1);
+}
+
+
+/*
* 'cupsGetDestMediaByName()' - Get media names, dimensions, and margins.
*
* The "media" string is a PWG media name. "Flags" provides some matching
@@ -742,7 +937,7 @@ cupsGetDestMediaByName(
unsigned flags, /* I - Media matching flags */
cups_size_t *size) /* O - Media size information */
{
- _pwg_media_t *pwg; /* PWG media info */
+ pwg_media_t *pwg; /* PWG media info */
/*
@@ -754,7 +949,7 @@ cupsGetDestMediaByName(
if (!http || !dest || !dinfo || !media || !size)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -762,11 +957,11 @@ cupsGetDestMediaByName(
* Lookup the media size name...
*/
- if ((pwg = _pwgMediaForPWG(media)) == NULL)
- if ((pwg = _pwgMediaForLegacy(media)) == NULL)
+ if ((pwg = pwgMediaForPWG(media)) == NULL)
+ if ((pwg = pwgMediaForLegacy(media)) == NULL)
{
DEBUG_printf(("1cupsGetDestMediaByName: Unknown size '%s'.", media));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Unknown media size name."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown media size name."), 1);
return (0);
}
@@ -774,7 +969,7 @@ cupsGetDestMediaByName(
* Lookup the size...
*/
- return (cups_get_media_db(dinfo, pwg, flags, size));
+ return (cups_get_media_db(http, dinfo, pwg, flags, size));
}
@@ -810,7 +1005,7 @@ cupsGetDestMediaBySize(
unsigned flags, /* I - Media matching flags */
cups_size_t *size) /* O - Media size information */
{
- _pwg_media_t *pwg; /* PWG media info */
+ pwg_media_t *pwg; /* PWG media info */
/*
@@ -822,7 +1017,7 @@ cupsGetDestMediaBySize(
if (!http || !dest || !dinfo || width <= 0 || length <= 0 || !size)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -830,11 +1025,11 @@ cupsGetDestMediaBySize(
* Lookup the media size name...
*/
- if ((pwg = _pwgMediaForSize(width, length)) == NULL)
+ if ((pwg = pwgMediaForSize(width, length)) == NULL)
{
DEBUG_printf(("1cupsGetDestMediaBySize: Invalid size %dx%d.", width,
length));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Invalid media size."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid media size."), 1);
return (0);
}
@@ -842,7 +1037,116 @@ cupsGetDestMediaBySize(
* Lookup the size...
*/
- return (cups_get_media_db(dinfo, pwg, flags, size));
+ return (cups_get_media_db(http, dinfo, pwg, flags, size));
+}
+
+
+/*
+ * 'cupsGetDestMediaCount()' - Get the number of sizes supported by a
+ * destination.
+ *
+ * The @code flags@ parameter determines the set of media sizes that are
+ * counted. For example, passing @code CUPS_MEDIA_FLAGS_BORDERLESS@ will return
+ * the number of borderless sizes.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - Number of sizes */
+cupsGetDestMediaCount(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ unsigned flags) /* I - Media flags */
+{
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ /*
+ * Load media list as needed...
+ */
+
+ if (flags & CUPS_MEDIA_FLAGS_READY)
+ cups_update_ready(http, dinfo);
+
+ if (!dinfo->cached_db || dinfo->cached_flags != flags)
+ cups_create_cached(http, dinfo, flags);
+
+ return (cupsArrayCount(dinfo->cached_db));
+}
+
+
+/*
+ * 'cupsGetDestMediaDefault()' - Get the default size for a destination.
+ *
+ * The @code flags@ parameter determines which default size is returned. For
+ * example, passing @code CUPS_MEDIA_FLAGS_BORDERLESS@ will return the default
+ * borderless size, typically US Letter or A4, but sometimes 4x6 photo media.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsGetDestMediaDefault(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ unsigned flags, /* I - Media flags */
+ cups_size_t *size) /* O - Media size information */
+{
+ const char *media; /* Default media size */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (size)
+ memset(size, 0, sizeof(cups_size_t));
+
+ if (!http || !dest || !dinfo || !size)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ /*
+ * Get the default media size, if any...
+ */
+
+ if ((media = cupsGetOption("media", dest->num_options,
+ dest->options)) == NULL)
+ media = "na_letter_8.5x11in";
+
+ if (cupsGetDestMediaByName(http, dest, dinfo, media, flags, size))
+ return (1);
+
+ if (strcmp(media, "na_letter_8.5x11in") &&
+ cupsGetDestMediaByName(http, dest, dinfo, "iso_a4_210x297mm", flags,
+ size))
+ return (1);
+
+ if (strcmp(media, "iso_a4_210x297mm") &&
+ cupsGetDestMediaByName(http, dest, dinfo, "na_letter_8.5x11in", flags,
+ size))
+ return (1);
+
+ if ((flags & CUPS_MEDIA_FLAGS_BORDERLESS) &&
+ cupsGetDestMediaByName(http, dest, dinfo, "na_index_4x6in", flags, size))
+ return (1);
+
+ /*
+ * Fall back to the first matching media size...
+ */
+
+ return (cupsGetDestMediaByIndex(http, dest, dinfo, 0, flags, size));
}
@@ -944,6 +1248,86 @@ cups_copy_media_db(
/*
+ * 'cups_create_cached()' - Create the media selection cache.
+ */
+
+static void
+cups_create_cached(http_t *http, /* I - Connection to destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ unsigned flags) /* I - Media selection flags */
+{
+ cups_array_t *db; /* Media database array to use */
+ _cups_media_db_t *mdb, /* Media database entry */
+ *first; /* First entry this size */
+
+
+ DEBUG_printf(("3cups_create_cached(http=%p, dinfo=%p, flags=%u)", http, dinfo, flags));
+
+ if (dinfo->cached_db)
+ cupsArrayDelete(dinfo->cached_db);
+
+ dinfo->cached_db = cupsArrayNew(NULL, NULL);
+ dinfo->cached_flags = flags;
+
+ if (flags & CUPS_MEDIA_FLAGS_READY)
+ {
+ DEBUG_puts("4cups_create_cached: ready media");
+
+ cups_update_ready(http, dinfo);
+ db = dinfo->ready_db;
+ }
+ else
+ {
+ DEBUG_puts("4cups_create_cached: supported media");
+
+ if (!dinfo->media_db)
+ cups_create_media_db(dinfo, CUPS_MEDIA_FLAGS_DEFAULT);
+
+ db = dinfo->media_db;
+ }
+
+ for (mdb = (_cups_media_db_t *)cupsArrayFirst(db), first = mdb;
+ mdb;
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
+ {
+ DEBUG_printf(("4cups_create_cached: %p key=\"%s\", type=\"%s\", %dx%d, B%d L%d R%d T%d", mdb, mdb->key, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top));
+
+ if (flags & CUPS_MEDIA_FLAGS_BORDERLESS)
+ {
+ if (!mdb->left && !mdb->right && !mdb->top && !mdb->bottom)
+ {
+ DEBUG_printf(("4cups_create_cached: add %p", mdb));
+ cupsArrayAdd(dinfo->cached_db, mdb);
+ }
+ }
+ else if (flags & CUPS_MEDIA_FLAGS_DUPLEX)
+ {
+ if (first->width != mdb->width || first->length != mdb->length)
+ {
+ DEBUG_printf(("4cups_create_cached: add %p", first));
+ cupsArrayAdd(dinfo->cached_db, first);
+ first = mdb;
+ }
+ else if (mdb->left >= first->left && mdb->right >= first->right && mdb->top >= first->top && mdb->bottom >= first->bottom &&
+ (mdb->left != first->left || mdb->right != first->right || mdb->top != first->top || mdb->bottom != first->bottom))
+ first = mdb;
+ }
+ else
+ {
+ DEBUG_printf(("4cups_create_cached: add %p", mdb));
+ cupsArrayAdd(dinfo->cached_db, mdb);
+ }
+ }
+
+ if (flags & CUPS_MEDIA_FLAGS_DUPLEX)
+ {
+ DEBUG_printf(("4cups_create_cached: add %p", first));
+ cupsArrayAdd(dinfo->cached_db, first);
+ }
+}
+
+
+/*
* 'cups_create_constraints()' - Create the constraints and resolvers arrays.
*/
@@ -1036,7 +1420,8 @@ cups_create_defaults(
static void
cups_create_media_db(
- cups_dinfo_t *dinfo) /* I - Destination information */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ unsigned flags) /* I - Media flags */
{
int i; /* Looping var */
_ipp_value_t *val; /* Current value */
@@ -1044,21 +1429,40 @@ cups_create_media_db(
*media_attr, /* media-xxx */
*x_dimension, /* x-dimension */
*y_dimension; /* y-dimension */
- _pwg_media_t *pwg; /* PWG media info */
+ pwg_media_t *pwg; /* PWG media info */
+ cups_array_t *db; /* New media database array */
_cups_media_db_t mdb; /* Media entry */
- dinfo->media_db = cupsArrayNew3((cups_array_func_t)cups_compare_media_db,
- NULL, NULL, 0,
- (cups_acopy_func_t)cups_copy_media_db,
- (cups_afree_func_t)cups_free_media_db);
- dinfo->min_size.width = INT_MAX;
- dinfo->min_size.length = INT_MAX;
- dinfo->max_size.width = 0;
- dinfo->max_size.length = 0;
+ db = cupsArrayNew3((cups_array_func_t)cups_compare_media_db,
+ NULL, NULL, 0,
+ (cups_acopy_func_t)cups_copy_media_db,
+ (cups_afree_func_t)cups_free_media_db);
- if ((media_col_db = ippFindAttribute(dinfo->attrs, "media-col-database",
- IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ if (flags == CUPS_MEDIA_FLAGS_READY)
+ {
+ dinfo->ready_db = db;
+
+ media_col_db = ippFindAttribute(dinfo->ready_attrs, "media-col-ready",
+ IPP_TAG_BEGIN_COLLECTION);
+ media_attr = ippFindAttribute(dinfo->ready_attrs, "media-ready",
+ IPP_TAG_ZERO);
+ }
+ else
+ {
+ dinfo->media_db = db;
+ dinfo->min_size.width = INT_MAX;
+ dinfo->min_size.length = INT_MAX;
+ dinfo->max_size.width = 0;
+ dinfo->max_size.length = 0;
+
+ media_col_db = ippFindAttribute(dinfo->attrs, "media-col-database",
+ IPP_TAG_BEGIN_COLLECTION);
+ media_attr = ippFindAttribute(dinfo->attrs, "media-supported",
+ IPP_TAG_ZERO);
+ }
+
+ if (media_col_db)
{
_ipp_value_t *custom = NULL; /* Custom size range value */
@@ -1075,15 +1479,32 @@ cups_create_media_db(
/* media-size collection value */
if ((x_dimension = ippFindAttribute(media_size, "x-dimension",
- IPP_TAG_INTEGER)) != NULL &&
+ IPP_TAG_INTEGER)) != NULL &&
(y_dimension = ippFindAttribute(media_size, "y-dimension",
IPP_TAG_INTEGER)) != NULL)
{
+ /*
+ * Fixed size...
+ */
+
mdb.width = x_dimension->values[0].integer;
mdb.length = y_dimension->values[0].integer;
}
- else if ((x_dimension = ippFindAttribute(media_size, "x-dimension",
- IPP_TAG_RANGE)) != NULL &&
+ else if ((x_dimension = ippFindAttribute(media_size, "x-dimension",
+ IPP_TAG_INTEGER)) != NULL &&
+ (y_dimension = ippFindAttribute(media_size, "y-dimension",
+ IPP_TAG_RANGE)) != NULL)
+ {
+ /*
+ * Roll limits...
+ */
+
+ mdb.width = x_dimension->values[0].integer;
+ mdb.length = y_dimension->values[0].range.upper;
+ }
+ else if (flags != CUPS_MEDIA_FLAGS_READY &&
+ (x_dimension = ippFindAttribute(media_size, "x-dimension",
+ IPP_TAG_RANGE)) != NULL &&
(y_dimension = ippFindAttribute(media_size, "y-dimension",
IPP_TAG_RANGE)) != NULL)
{
@@ -1107,7 +1528,6 @@ cups_create_media_db(
dinfo->max_size.right = 635; /* Default 1/4" side margins */
dinfo->max_size.top =
dinfo->max_size.bottom = 1270; /* Default 1/2" top/bottom margins */
-
continue;
}
}
@@ -1167,7 +1587,7 @@ cups_create_media_db(
IPP_TAG_INTEGER)) != NULL)
mdb.top = media_attr->values[0].integer;
- cupsArrayAdd(dinfo->media_db, &mdb);
+ cupsArrayAdd(db, &mdb);
}
if (custom)
@@ -1205,8 +1625,7 @@ cups_create_media_db(
}
}
}
- else if ((media_attr = ippFindAttribute(dinfo->attrs, "media-supported",
- IPP_TAG_ZERO)) != NULL &&
+ else if (media_attr &&
(media_attr->value_tag == IPP_TAG_NAME ||
media_attr->value_tag == IPP_TAG_NAMELANG ||
media_attr->value_tag == IPP_TAG_KEYWORD))
@@ -1222,8 +1641,8 @@ cups_create_media_db(
i > 0;
i --, val ++)
{
- if ((pwg = _pwgMediaForPWG(val->string.text)) == NULL)
- if ((pwg = _pwgMediaForLegacy(val->string.text)) == NULL)
+ if ((pwg = pwgMediaForPWG(val->string.text)) == NULL)
+ if ((pwg = pwgMediaForLegacy(val->string.text)) == NULL)
{
DEBUG_printf(("3cups_create_media_db: Ignoring unknown size '%s'.",
val->string.text));
@@ -1233,12 +1652,14 @@ cups_create_media_db(
mdb.width = pwg->width;
mdb.length = pwg->length;
- if (!strncmp(val->string.text, "custom_min_", 11))
+ if (flags != CUPS_MEDIA_FLAGS_READY &&
+ !strncmp(val->string.text, "custom_min_", 11))
{
mdb.size_name = NULL;
dinfo->min_size = mdb;
}
- else if (!strncmp(val->string.text, "custom_max_", 11))
+ else if (flags != CUPS_MEDIA_FLAGS_READY &&
+ !strncmp(val->string.text, "custom_max_", 11))
{
mdb.size_name = NULL;
dinfo->max_size = mdb;
@@ -1247,7 +1668,7 @@ cups_create_media_db(
{
mdb.size_name = val->string.text;
- cupsArrayAdd(dinfo->media_db, &mdb);
+ cupsArrayAdd(db, &mdb);
}
}
}
@@ -1284,11 +1705,13 @@ cups_free_media_db(
*/
static int /* O - 1 on match, 0 on failure */
-cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
- _pwg_media_t *pwg, /* I - PWG media info */
+cups_get_media_db(http_t *http, /* I - Connection to destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ pwg_media_t *pwg, /* I - PWG media info */
unsigned flags, /* I - Media matching flags */
- cups_size_t *size) /* O - Media size/margin/name info */
+ cups_size_t *size) /* O - Media size/margin/name info */
{
+ cups_array_t *db; /* Which media database to query */
_cups_media_db_t *mdb, /* Current media database entry */
*best = NULL, /* Best matching entry */
key; /* Search key */
@@ -1298,8 +1721,18 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Create the media database as needed...
*/
- if (!dinfo->media_db)
- cups_create_media_db(dinfo);
+ if (flags & CUPS_MEDIA_FLAGS_READY)
+ {
+ cups_update_ready(http, dinfo);
+ db = dinfo->ready_db;
+ }
+ else
+ {
+ if (!dinfo->media_db)
+ cups_create_media_db(dinfo, CUPS_MEDIA_FLAGS_DEFAULT);
+
+ db = dinfo->media_db;
+ }
/*
* Find a match...
@@ -1309,7 +1742,7 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
key.width = pwg->width;
key.length = pwg->length;
- if ((mdb = cupsArrayFind(dinfo->media_db, &key)) != NULL)
+ if ((mdb = cupsArrayFind(db, &key)) != NULL)
{
/*
* Found an exact match, let's figure out the best margins for the flags
@@ -1324,12 +1757,11 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Look for the smallest margins...
*/
- if (best->left != 0 || best->right != 0 || best->top != 0 ||
- best->bottom != 0)
+ if (best->left != 0 || best->right != 0 || best->top != 0 || best->bottom != 0)
{
- for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
mdb && !cups_compare_media_db(mdb, &key);
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
{
if (mdb->left <= best->left && mdb->right <= best->right &&
mdb->top <= best->top && mdb->bottom <= best->bottom)
@@ -1357,12 +1789,13 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Look for the largest margins...
*/
- for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
mdb && !cups_compare_media_db(mdb, &key);
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
{
if (mdb->left >= best->left && mdb->right >= best->right &&
- mdb->top >= best->top && mdb->bottom >= best->bottom)
+ mdb->top >= best->top && mdb->bottom >= best->bottom &&
+ (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top))
best = mdb;
}
}
@@ -1372,16 +1805,15 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Look for the smallest non-zero margins...
*/
- for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
mdb && !cups_compare_media_db(mdb, &key);
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
{
if (((mdb->left > 0 && mdb->left <= best->left) || best->left == 0) &&
- ((mdb->right > 0 && mdb->right <= best->right) ||
- best->right == 0) &&
+ ((mdb->right > 0 && mdb->right <= best->right) || best->right == 0) &&
((mdb->top > 0 && mdb->top <= best->top) || best->top == 0) &&
- ((mdb->bottom > 0 && mdb->bottom <= best->bottom) ||
- best->bottom == 0))
+ ((mdb->bottom > 0 && mdb->bottom <= best->bottom) || best->bottom == 0) &&
+ (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top))
best = mdb;
}
}
@@ -1434,9 +1866,9 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Find a close size...
*/
- for (mdb = (_cups_media_db_t *)cupsArrayFirst(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayFirst(db);
mdb;
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
if (cups_is_close_media_db(mdb, &key))
break;
@@ -1454,12 +1886,13 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
if (best->left != 0 || best->right != 0 || best->top != 0 ||
best->bottom != 0)
{
- for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
mdb && cups_is_close_media_db(mdb, &key);
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
{
if (mdb->left <= best->left && mdb->right <= best->right &&
- mdb->top <= best->top && mdb->bottom <= best->bottom)
+ mdb->top <= best->top && mdb->bottom <= best->bottom &&
+ (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top))
{
best = mdb;
if (mdb->left == 0 && mdb->right == 0 && mdb->bottom == 0 &&
@@ -1475,12 +1908,13 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Look for the largest margins...
*/
- for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
mdb && cups_is_close_media_db(mdb, &key);
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
{
if (mdb->left >= best->left && mdb->right >= best->right &&
- mdb->top >= best->top && mdb->bottom >= best->bottom)
+ mdb->top >= best->top && mdb->bottom >= best->bottom &&
+ (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top))
best = mdb;
}
}
@@ -1490,16 +1924,17 @@ cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
* Look for the smallest non-zero margins...
*/
- for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
mdb && cups_is_close_media_db(mdb, &key);
- mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ mdb = (_cups_media_db_t *)cupsArrayNext(db))
{
if (((mdb->left > 0 && mdb->left <= best->left) || best->left == 0) &&
((mdb->right > 0 && mdb->right <= best->right) ||
best->right == 0) &&
((mdb->top > 0 && mdb->top <= best->top) || best->top == 0) &&
((mdb->bottom > 0 && mdb->bottom <= best->bottom) ||
- best->bottom == 0))
+ best->bottom == 0) &&
+ (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top))
best = mdb;
}
}
@@ -1759,5 +2194,78 @@ cups_test_constraints(
/*
- * End of "$Id: dest-options.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'cups_update_ready()' - Update xxx-ready attributes for the printer.
+ */
+
+static void
+cups_update_ready(http_t *http, /* I - Connection to destination */
+ cups_dinfo_t *dinfo) /* I - Destination information */
+{
+ ipp_t *request; /* Get-Printer-Attributes request */
+ static const char * const pattrs[] = /* Printer attributes we want */
+ {
+ "finishings-col-ready",
+ "finishings-ready",
+ "job-finishings-col-ready",
+ "job-finishings-ready",
+ "media-col-ready",
+ "media-ready"
+ };
+
+
+ /*
+ * Don't update more than once every 30 seconds...
+ */
+
+ if ((time(NULL) - dinfo->ready_time) < _CUPS_MEDIA_READY_TTL)
+ return;
+
+ /*
+ * Free any previous results...
+ */
+
+ if (dinfo->cached_flags & CUPS_MEDIA_FLAGS_READY)
+ {
+ cupsArrayDelete(dinfo->cached_db);
+ dinfo->cached_db = NULL;
+ dinfo->cached_flags = CUPS_MEDIA_FLAGS_DEFAULT;
+ }
+
+ ippDelete(dinfo->ready_attrs);
+ dinfo->ready_attrs = NULL;
+
+ cupsArrayDelete(dinfo->ready_db);
+ dinfo->ready_db = NULL;
+
+ /*
+ * Query the xxx-ready values...
+ */
+
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippSetVersion(request, dinfo->version / 10, dinfo->version % 10);
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+ dinfo->uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+ NULL, cupsUser());
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs);
+
+ dinfo->ready_attrs = cupsDoRequest(http, request, dinfo->resource);
+
+ /*
+ * Update the ready media database...
+ */
+
+ cups_create_media_db(dinfo, CUPS_MEDIA_FLAGS_READY);
+
+ /*
+ * Update last lookup time and return...
+ */
+
+ dinfo->ready_time = time(NULL);
+}
+
+
+/*
+ * End of "$Id: dest-options.c 11882 2014-05-16 21:02:15Z msweet $".
*/
diff --git a/cups/dest.c b/cups/dest.c
index 9999c0c..413fc27 100644
--- a/cups/dest.c
+++ b/cups/dest.c
@@ -1,85 +1,18 @@
/*
- * "$Id: dest.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest.c 12733 2015-06-12 01:21:05Z msweet $"
*
- * User-defined destination (and option) support for CUPS.
+ * User-defined destination (and option) support for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsAddDest() - Add a destination to the list of
- * destinations.
- * _cupsAppleCopyDefaultPaperID() - Get the default paper ID.
- * _cupsAppleCopyDefaultPrinter() - Get the default printer at this location.
- * _cupsAppleGetUseLastPrinter() - Get whether to use the last used printer.
- * _cupsAppleSetDefaultPaperID() - Set the default paper id.
- * _cupsAppleSetDefaultPrinter() - Set the default printer for this
- * location.
- * _cupsAppleSetUseLastPrinter() - Set whether to use the last used printer.
- * cupsConnectDest() - Connect to the server for a destination.
- * cupsConnectDestBlock() - Connect to the server for a destination.
- * cupsCopyDest() - Copy a destination.
- * cupsEnumDests() - Enumerate available destinations with a
- * callback function.
- * cupsEnumDestsBlock() - Enumerate available destinations with a
- * block.
- * cupsFreeDests() - Free the memory used by the list of
- * destinations.
- * cupsGetDest() - Get the named destination from the list.
- * _cupsGetDestResource() - Get the resource path and URI for a
- * destination.
- * _cupsGetDests() - Get destinations from a server.
- * cupsGetDests() - Get the list of destinations from the
- * default server.
- * cupsGetDests2() - Get the list of destinations from the
- * specified server.
- * cupsGetNamedDest() - Get options for the named destination.
- * cupsRemoveDest() - Remove a destination from the destination
- * list.
- * cupsSetDefaultDest() - Set the default destination.
- * cupsSetDests() - Save the list of destinations for the
- * default server.
- * cupsSetDests2() - Save the list of destinations for the
- * specified server.
- * _cupsUserDefault() - Get the user default printer from
- * environment variables and location
- * information.
- * appleCopyLocations() - Copy the location history array.
- * appleCopyNetwork() - Get the network ID for the current
- * location.
- * appleGetPaperSize() - Get the default paper size.
- * appleGetPrinter() - Get a printer from the history array.
- * cups_add_dest() - Add a destination to the array.
- * cups_block_cb() - Enumeration callback for block API.
- * cups_compare_dests() - Compare two destinations.
- * cups_dnssd_browse_cb() - Browse for printers.
- * cups_dnssd_browse_cb() - Browse for printers.
- * cups_dnssd_client_cb() - Avahi client callback function.
- * cups_dnssd_compare_device() - Compare two devices.
- * cups_dnssd_free_device() - Free the memory used by a device.
- * cups_dnssd_get_device() - Lookup a device and create it as needed.
- * cups_dnssd_local_cb() - Browse for local printers.
- * cups_dnssd_poll_cb() - Wait for input on the specified file
- * descriptors.
- * cups_dnssd_query_cb() - Process query data.
- * cups_dnssd_resolve() - Resolve a Bonjour printer URI.
- * cups_dnssd_resolve_cb() - See if we should continue resolving.
- * cups_dnssd_unquote() - Unquote a name string.
- * cups_find_dest() - Find a destination using a binary search.
- * cups_get_default() - Get the default destination from an
- * lpoptions file.
- * cups_get_dests() - Get destinations from a file.
- * cups_make_string() - Make a comma-separated string of values
- * from an IPP attribute.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -319,7 +252,8 @@ cupsAddDest(const char *name, /* I - Destination name */
if (instance && !cupsGetDest(name, NULL, num_dests, *dests))
return (num_dests);
- dest = cups_add_dest(name, instance, &num_dests, dests);
+ if ((dest = cups_add_dest(name, instance, &num_dests, dests)) == NULL)
+ return (num_dests);
/*
* Find the base dest again now the array has been realloc'd.
@@ -333,7 +267,7 @@ cupsAddDest(const char *name, /* I - Destination name */
* Copy options from parent...
*/
- dest->options = calloc(sizeof(cups_option_t), parent->num_options);
+ dest->options = calloc(sizeof(cups_option_t), (size_t)parent->num_options);
if (dest->options)
{
@@ -634,7 +568,7 @@ cupsConnectDest(
if (resource)
*resource = '\0';
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (NULL);
}
@@ -651,7 +585,7 @@ cupsConnectDest(
if ((uri = cupsGetOption("printer-uri-supported", dest->num_options,
dest->options)) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOENT), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0);
if (cb)
(*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
@@ -671,9 +605,9 @@ cupsConnectDest(
if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
userpass, sizeof(userpass), hostname, sizeof(hostname),
- &port, resource, resourcesize) < HTTP_URI_OK)
+ &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad printer URI."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1);
if (cb)
(*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
@@ -717,11 +651,13 @@ cupsConnectDest(
*/
if (!strcmp(scheme, "ipps") || port == 443)
- encryption = HTTP_ENCRYPT_ALWAYS;
+ encryption = HTTP_ENCRYPTION_ALWAYS;
else
- encryption = HTTP_ENCRYPT_IF_REQUESTED;
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
- http = _httpCreate(hostname, port, addrlist, encryption, AF_UNSPEC);
+ http = httpConnect2(hostname, port, addrlist, AF_UNSPEC, encryption, 1, 0,
+ NULL);
+ httpAddrFreeList(addrlist);
/*
* Connect if requested...
@@ -840,8 +776,7 @@ cupsCopyDest(cups_dest_t *dest,
if (new_dest)
{
- if ((new_dest->options = calloc(sizeof(cups_option_t),
- dest->num_options)) == NULL)
+ if ((new_dest->options = calloc(sizeof(cups_option_t), (size_t)dest->num_options)) == NULL)
return (cupsRemoveDest(dest->name, dest->instance, num_dests, dests));
new_dest->num_options = dest->num_options;
@@ -889,6 +824,10 @@ cupsEnumDests(
num_dests; /* Number of destinations */
cups_dest_t *dests = NULL, /* Destinations */
*dest; /* Current destination */
+ const char *defprinter; /* Default printer */
+ char name[1024], /* Copy of printer name */
+ *instance, /* Pointer to instance name */
+ *user_default; /* User default printer */
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
int count, /* Number of queries started */
remaining; /* Remainder of timeout */
@@ -931,8 +870,33 @@ cupsEnumDests(
* Get the list of local printers and pass them to the callback function...
*/
- num_dests = _cupsGetDests(CUPS_HTTP_DEFAULT, CUPS_GET_PRINTERS, NULL, &dests,
- type, mask);
+ num_dests = _cupsGetDests(CUPS_HTTP_DEFAULT, IPP_OP_CUPS_GET_PRINTERS, NULL,
+ &dests, type, mask | CUPS_PRINTER_3D);
+
+ if ((user_default = _cupsUserDefault(name, sizeof(name))) != NULL)
+ defprinter = name;
+ else if ((defprinter = cupsGetDefault2(CUPS_HTTP_DEFAULT)) != NULL)
+ {
+ strlcpy(name, defprinter, sizeof(name));
+ defprinter = name;
+ }
+
+ if (defprinter)
+ {
+ /*
+ * Separate printer and instance name...
+ */
+
+ if ((instance = strchr(name, '/')) != NULL)
+ *instance++ = '\0';
+
+ /*
+ * Lookup the printer and instance and make it the default...
+ */
+
+ if ((dest = cupsGetDest(name, instance, num_dests, dests)) != NULL)
+ dest->is_default = 1;
+ }
for (i = num_dests, dest = dests;
i > 0 && (!cancel || !*cancel);
@@ -951,11 +915,11 @@ cupsEnumDests(
* Get Bonjour-shared printers...
*/
- data.type = type;
- data.mask = mask;
- data.devices = cupsArrayNew3((cups_array_func_t)cups_dnssd_compare_devices,
- NULL, NULL, 0, NULL,
- (cups_afree_func_t)cups_dnssd_free_device);
+ data.type = type;
+ data.mask = mask;
+ data.cb = cb;
+ data.user_data = user_data;
+ data.devices = cupsArrayNew3((cups_array_func_t)cups_dnssd_compare_devices, NULL, NULL, 0, NULL, (cups_afree_func_t)cups_dnssd_free_device);
# ifdef HAVE_DNSSD
if (DNSServiceCreateConnection(&data.main_ref) != kDNSServiceErr_NoError)
@@ -1299,7 +1263,7 @@ _cupsGetDestResource(
if (resource)
*resource = '\0';
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (NULL);
}
@@ -1313,7 +1277,7 @@ _cupsGetDestResource(
if (resource)
*resource = '\0';
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOENT), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0);
return (NULL);
}
@@ -1328,9 +1292,9 @@ _cupsGetDestResource(
if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
userpass, sizeof(userpass), hostname, sizeof(hostname),
- &port, resource, resourcesize) < HTTP_URI_OK)
+ &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad printer URI."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1);
return (NULL);
}
@@ -1340,14 +1304,108 @@ _cupsGetDestResource(
/*
+ * 'cupsGetDestWithURI()' - Get a destination associated with a URI.
+ *
+ * "name" is the desired name for the printer. If @code NULL@, a name will be
+ * created using the URI.
+ *
+ * "uri" is the "ipp" or "ipps" URI for the printer.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+cups_dest_t * /* O - Destination or @code NULL@ */
+cupsGetDestWithURI(const char *name, /* I - Desired printer name or @code NULL@ */
+ const char *uri) /* I - URI for the printer */
+{
+ cups_dest_t *dest; /* New destination */
+ char temp[1024], /* Temporary string */
+ scheme[256], /* Scheme from URI */
+ userpass[256], /* Username:password from URI */
+ hostname[256], /* Hostname from URI */
+ resource[1024], /* Resource path from URI */
+ *ptr; /* Pointer into string */
+ int port; /* Port number from URI */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!uri)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK ||
+ (strncmp(uri, "ipp://", 6) && strncmp(uri, "ipps://", 7)))
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1);
+
+ return (NULL);
+ }
+
+ if (!name)
+ {
+ /*
+ * Create the name from the URI...
+ */
+
+ if (strstr(hostname, "._tcp"))
+ {
+ /*
+ * Use the service instance name...
+ */
+
+ if ((ptr = strchr(hostname, '.')) != NULL)
+ *ptr = '\0';
+
+ name = hostname;
+ }
+ else if (!strncmp(resource, "/classes/", 9))
+ {
+ snprintf(temp, sizeof(temp), "%s @ %s", resource + 9, hostname);
+ name = temp;
+ }
+ else if (!strncmp(resource, "/printers/", 10))
+ {
+ snprintf(temp, sizeof(temp), "%s @ %s", resource + 10, hostname);
+ name = temp;
+ }
+ else
+ {
+ name = hostname;
+ }
+ }
+
+ /*
+ * Create the destination...
+ */
+
+ if ((dest = calloc(1, sizeof(cups_dest_t))) == NULL)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
+ return (NULL);
+ }
+
+ dest->name = _cupsStrAlloc(name);
+ dest->num_options = cupsAddOption("printer-uri-supported", uri, dest->num_options, &(dest->options));
+ dest->num_options = cupsAddOption("printer-info", name, dest->num_options, &(dest->options));
+
+ return (dest);
+}
+
+
+/*
* '_cupsGetDests()' - Get destinations from a server.
*
- * "op" is CUPS_GET_PRINTERS to get a full list, CUPS_GET_DEFAULT to get the
- * system-wide default printer, or IPP_GET_PRINTER_ATTRIBUTES for a known
- * printer.
+ * "op" is IPP_OP_CUPS_GET_PRINTERS to get a full list, IPP_OP_CUPS_GET_DEFAULT
+ * to get the system-wide default printer, or IPP_OP_GET_PRINTER_ATTRIBUTES for
+ * a known printer.
*
* "name" is the name of an existing printer and is only used when "op" is
- * IPP_GET_PRINTER_ATTRIBUTES.
+ * IPP_OP_GET_PRINTER_ATTRIBUTES.
*
* "dest" is initialized to point to the array of destinations.
*
@@ -1409,6 +1467,7 @@ _cupsGetDests(http_t *http, /* I - Connection to server or
"printer-is-shared",
"printer-location",
"printer-make-and-model",
+ "printer-mandatory-job-attributes",
"printer-name",
"printer-state",
"printer-state-change-time",
@@ -1427,13 +1486,13 @@ _cupsGetDests(http_t *http, /* I - Connection to server or
#endif /* __APPLE__ */
/*
- * Build a CUPS_GET_PRINTERS or IPP_GET_PRINTER_ATTRIBUTES request, which
+ * Build a IPP_OP_CUPS_GET_PRINTERS or IPP_OP_GET_PRINTER_ATTRIBUTES request, which
* require the following attributes:
*
* attributes-charset
* attributes-natural-language
* requesting-user-name
- * printer-uri [for IPP_GET_PRINTER_ATTRIBUTES]
+ * printer-uri [for IPP_OP_GET_PRINTER_ATTRIBUTES]
*/
request = ippNewRequest(op);
@@ -1445,7 +1504,7 @@ _cupsGetDests(http_t *http, /* I - Connection to server or
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, cupsUser());
- if (name && op != CUPS_GET_DEFAULT)
+ if (name && op != IPP_OP_CUPS_GET_DEFAULT)
{
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", ippPort(), "/printers/%s", name);
@@ -1454,10 +1513,8 @@ _cupsGetDests(http_t *http, /* I - Connection to server or
}
else if (mask)
{
- ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
- type);
- ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
- mask);
+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", (int)type);
+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", (int)mask);
}
/*
@@ -1514,6 +1571,7 @@ _cupsGetDests(http_t *http, /* I - Connection to server or
!strcmp(attr->name, "printer-info") ||
!strcmp(attr->name, "printer-is-shared") ||
!strcmp(attr->name, "printer-make-and-model") ||
+ !strcmp(attr->name, "printer-mandatory-job-attributes") ||
!strcmp(attr->name, "printer-state") ||
!strcmp(attr->name, "printer-state-change-time") ||
!strcmp(attr->name, "printer-type") ||
@@ -1676,7 +1734,7 @@ cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
if (!dests)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad NULL dests pointer"), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad NULL dests pointer"), 1);
return (0);
}
@@ -1685,9 +1743,9 @@ cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
*/
*dests = (cups_dest_t *)0;
- num_dests = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, dests, 0, 0);
+ num_dests = _cupsGetDests(http, IPP_OP_CUPS_GET_PRINTERS, NULL, dests, 0, CUPS_PRINTER_3D);
- if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
+ if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE)
{
cupsFreeDests(num_dests, *dests);
*dests = (cups_dest_t *)0;
@@ -1701,10 +1759,10 @@ cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
if (num_dests > 0)
{
num_reals = num_dests;
- reals = calloc(num_reals, sizeof(cups_dest_t));
+ reals = calloc((size_t)num_reals, sizeof(cups_dest_t));
if (reals)
- memcpy(reals, *dests, num_reals * sizeof(cups_dest_t));
+ memcpy(reals, *dests, (size_t)num_reals * sizeof(cups_dest_t));
else
num_reals = 0;
}
@@ -1803,7 +1861,7 @@ cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
*/
if (num_dests > 0)
- _cupsSetError(IPP_OK, NULL, 0);
+ _cupsSetError(IPP_STATUS_OK, NULL, 0);
return (num_dests);
}
@@ -1840,7 +1898,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
defname[256]; /* Default printer name */
const char *home = getenv("HOME"); /* Home directory */
int set_as_default = 0; /* Set returned destination as default */
- ipp_op_t op = IPP_GET_PRINTER_ATTRIBUTES;
+ ipp_op_t op = IPP_OP_GET_PRINTER_ATTRIBUTES;
/* IPP operation to get server ops */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
@@ -1894,7 +1952,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
* No locally-set default destination, ask the server...
*/
- op = CUPS_GET_DEFAULT;
+ op = IPP_OP_CUPS_GET_DEFAULT;
}
}
@@ -1902,7 +1960,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
* Get the printer's attributes...
*/
- if (!_cupsGetDests(http, op, name, &dest, 0, 0))
+ if (!_cupsGetDests(http, op, name, &dest, 0, CUPS_PRINTER_3D))
return (NULL);
if (instance)
@@ -1975,10 +2033,10 @@ cupsRemoveDest(const char *name, /* I - Destination name */
num_dests --;
- i = dest - *dests;
+ i = (int)(dest - *dests);
if (i < num_dests)
- memmove(dest, dest + 1, (num_dests - i) * sizeof(cups_dest_t));
+ memmove(dest, dest + 1, (size_t)(num_dests - i) * sizeof(cups_dest_t));
return (num_dests);
}
@@ -2078,9 +2136,9 @@ cupsSetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
* Get the server destinations...
*/
- num_temps = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, &temps, 0, 0);
+ num_temps = _cupsGetDests(http, IPP_OP_CUPS_GET_PRINTERS, NULL, &temps, 0, CUPS_PRINTER_3D);
- if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
+ if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE)
{
cupsFreeDests(num_temps, temps);
return (-1);
@@ -2312,7 +2370,7 @@ _cupsUserDefault(char *name, /* I - Name buffer */
if ((locprinter = _cupsAppleCopyDefaultPrinter()) != NULL)
{
- CFStringGetCString(locprinter, name, namesize, kCFStringEncodingUTF8);
+ CFStringGetCString(locprinter, name, (CFIndex)namesize, kCFStringEncodingUTF8);
CFRelease(locprinter);
}
else
@@ -2437,7 +2495,7 @@ appleGetPaperSize(char *name, /* I - Paper size name buffer */
int namesize) /* I - Size of buffer */
{
CFStringRef defaultPaperID; /* Default paper ID */
- _pwg_media_t *pwgmedia; /* PWG media size */
+ pwg_media_t *pwgmedia; /* PWG media size */
defaultPaperID = _cupsAppleCopyDefaultPaperID();
@@ -2446,7 +2504,7 @@ appleGetPaperSize(char *name, /* I - Paper size name buffer */
!CFStringGetCString(defaultPaperID, name, namesize,
kCFStringEncodingUTF8))
name[0] = '\0';
- else if ((pwgmedia = _pwgMediaForLegacy(name)) != NULL)
+ else if ((pwgmedia = pwgMediaForLegacy(name)) != NULL)
strlcpy(name, pwgmedia->pwg, namesize);
if (defaultPaperID)
@@ -2520,7 +2578,7 @@ cups_add_dest(const char *name, /* I - Name of destination */
if (*num_dests == 0)
dest = malloc(sizeof(cups_dest_t));
else
- dest = realloc(*dests, sizeof(cups_dest_t) * (*num_dests + 1));
+ dest = realloc(*dests, sizeof(cups_dest_t) * (size_t)(*num_dests + 1));
if (!dest)
return (NULL);
@@ -2547,8 +2605,7 @@ cups_add_dest(const char *name, /* I - Name of destination */
*/
if (insert < *num_dests)
- memmove(*dests + insert + 1, *dests + insert,
- (*num_dests - insert) * sizeof(cups_dest_t));
+ memmove(*dests + insert + 1, *dests + insert, (size_t)(*num_dests - insert) * sizeof(cups_dest_t));
(*num_dests) ++;
@@ -3133,7 +3190,7 @@ cups_dnssd_query_cb(
device->state = _CUPS_DNSSD_PENDING;
make_and_model[0] = '\0';
- strcpy(model, "Unknown");
+ strlcpy(model, "Unknown", sizeof(model));
for (txt = rdata, txtend = txt + rdlen;
txt < txtend;
@@ -3153,7 +3210,7 @@ cups_dnssd_query_cb(
txtnext = txt + txtlen;
for (ptr = key; txt < txtnext && *txt != '='; txt ++)
- *ptr++ = *txt;
+ *ptr++ = (char)*txt;
*ptr = '\0';
if (txt < txtnext && *txt == '=')
@@ -3161,7 +3218,7 @@ cups_dnssd_query_cb(
txt ++;
if (txt < txtnext)
- memcpy(value, txt, txtnext - txt);
+ memcpy(value, txt, (size_t)(txtnext - txt));
value[txtnext - txt] = '\0';
DEBUG_printf(("6cups_dnssd_query_cb: %s=%s", key, value));
@@ -3175,10 +3232,10 @@ cups_dnssd_query_cb(
if (!_cups_strcasecmp(key, "usb_MFG") ||
!_cups_strcasecmp(key, "usb_MANU") ||
!_cups_strcasecmp(key, "usb_MANUFACTURER"))
- strcpy(make_and_model, value);
+ strlcpy(make_and_model, value, sizeof(make_and_model));
else if (!_cups_strcasecmp(key, "usb_MDL") ||
!_cups_strcasecmp(key, "usb_MODEL"))
- strcpy(model, value);
+ strlcpy(model, value, sizeof(model));
else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript"))
{
if (value[0] == '(')
@@ -3190,14 +3247,14 @@ cups_dnssd_query_cb(
if ((ptr = value + strlen(value) - 1) > value && *ptr == ')')
*ptr = '\0';
- strcpy(model, value + 1);
+ strlcpy(model, value + 1, sizeof(model));
}
else
- strcpy(model, value);
+ strlcpy(model, value, sizeof(model));
}
else if (!_cups_strcasecmp(key, "ty"))
{
- strcpy(model, value);
+ strlcpy(model, value, sizeof(model));
if ((ptr = strchr(model, ',')) != NULL)
*ptr = '\0';
@@ -3238,7 +3295,7 @@ cups_dnssd_query_cb(
*/
saw_printer_type = 1;
- type = strtol(value, NULL, 0);
+ type = (cups_ptype_t)strtol(value, NULL, 0);
}
else if (!saw_printer_type)
{
@@ -3386,7 +3443,7 @@ cups_dnssd_resolve(
_HTTP_RESOLVE_FQDN, cups_dnssd_resolve_cb,
&resolve)) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to resolve printer URI."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to resolve printer-uri."), 1);
if (cb)
(*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
@@ -3840,22 +3897,21 @@ cups_make_string(
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- snprintf(ptr, end - ptr + 1, "%d", attr->values[i].integer);
+ snprintf(ptr, (size_t)(end - ptr + 1), "%d", attr->values[i].integer);
break;
case IPP_TAG_BOOLEAN :
if (attr->values[i].boolean)
- strlcpy(ptr, "true", end - ptr + 1);
+ strlcpy(ptr, "true", (size_t)(end - ptr + 1));
else
- strlcpy(ptr, "false", end - ptr + 1);
+ strlcpy(ptr, "false", (size_t)(end - ptr + 1));
break;
case IPP_TAG_RANGE :
if (attr->values[i].range.lower == attr->values[i].range.upper)
- snprintf(ptr, end - ptr + 1, "%d", attr->values[i].range.lower);
+ snprintf(ptr, (size_t)(end - ptr + 1), "%d", attr->values[i].range.lower);
else
- snprintf(ptr, end - ptr + 1, "%d-%d", attr->values[i].range.lower,
- attr->values[i].range.upper);
+ snprintf(ptr, (size_t)(end - ptr + 1), "%d-%d", attr->values[i].range.lower, attr->values[i].range.upper);
break;
default :
@@ -3887,5 +3943,5 @@ cups_make_string(
/*
- * End of "$Id: dest.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dest.c 12733 2015-06-12 01:21:05Z msweet $".
*/
diff --git a/cups/dir.c b/cups/dir.c
index ede139d..1bae123 100644
--- a/cups/dir.c
+++ b/cups/dir.c
@@ -1,5 +1,5 @@
/*
- * "$Id: dir.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dir.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Directory routines for CUPS.
*
@@ -468,5 +468,5 @@ cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */
#endif /* WIN32 */
/*
- * End of "$Id: dir.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dir.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/dir.h b/cups/dir.h
index a16871f..ad8278c 100644
--- a/cups/dir.h
+++ b/cups/dir.h
@@ -1,5 +1,5 @@
/*
- * "$Id: dir.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dir.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Public directory definitions for CUPS.
*
@@ -65,5 +65,5 @@ extern void cupsDirRewind(cups_dir_t *dp) _CUPS_API_1_2;
#endif /* !_CUPS_DIR_H_ */
/*
- * End of "$Id: dir.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dir.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/emit.c b/cups/emit.c
index 15f2fcd..b1ad410 100644
--- a/cups/emit.c
+++ b/cups/emit.c
@@ -1,37 +1,20 @@
/*
- * "$Id: emit.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: emit.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * PPD code emission routines for CUPS.
+ * PPD code emission routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * ppdCollect() - Collect all marked options that reside in the
- * specified section.
- * ppdCollect2() - Collect all marked options that reside in the
- * specified section and minimum order.
- * ppdEmit() - Emit code for marked options to a file.
- * ppdEmitAfterOrder() - Emit a subset of the code for marked options to a
- * file.
- * ppdEmitFd() - Emit code for marked options to a file.
- * ppdEmitJCL() - Emit code for JCL options to a file.
- * ppdEmitJCLEnd() - Emit JCLEnd code to a file.
- * ppdEmitString() - Get a string containing the code for marked
- * options.
- * ppd_compare_cparams() - Compare the order of two custom parameters.
- * ppd_handle_media() - Handle media selection...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -121,13 +104,13 @@ ppdCollect2(ppd_file_t *ppd, /* I - PPD file data */
count = 0;
if ((collect = calloc(sizeof(ppd_choice_t *),
- cupsArrayCount(ppd->marked))) == NULL)
+ (size_t)cupsArrayCount(ppd->marked))) == NULL)
{
*choices = NULL;
return (0);
}
- if ((orders = calloc(sizeof(float), cupsArrayCount(ppd->marked))) == NULL)
+ if ((orders = calloc(sizeof(float), (size_t)cupsArrayCount(ppd->marked))) == NULL)
{
*choices = NULL;
free(collect);
@@ -358,7 +341,7 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
break;
}
- buflength -= bytes;
+ buflength -= (size_t)bytes;
bufptr += bytes;
}
@@ -831,8 +814,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
break;
case PPD_CUSTOM_INT :
- snprintf(bufptr, bufend - bufptr, "%d",
- cparam->current.custom_int);
+ snprintf(bufptr, (size_t)(bufend - bufptr), "%d", cparam->current.custom_int);
bufptr += strlen(bufptr);
break;
@@ -841,8 +823,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
case PPD_CUSTOM_STRING :
if (cparam->current.custom_string)
{
- strlcpy(bufptr, cparam->current.custom_string,
- bufend - bufptr);
+ strlcpy(bufptr, cparam->current.custom_string, (size_t)(bufend - bufptr));
bufptr += strlen(bufptr);
}
break;
@@ -862,7 +843,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
* Otherwise just copy the option code directly...
*/
- strlcpy(bufptr, choices[i]->code, bufend - bufptr + 1);
+ strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1));
bufptr += strlen(bufptr);
}
}
@@ -873,7 +854,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
* options...
*/
- strlcpy(bufptr, "[{\n", bufend - bufptr + 1);
+ strlcpy(bufptr, "[{\n", (size_t)(bufend - bufptr + 1));
bufptr += 3;
/*
@@ -898,8 +879,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
float values[5]; /* Values for custom command */
- strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n",
- bufend - bufptr + 1);
+ strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n", (size_t)(bufend - bufptr + 1));
bufptr += 37;
size = ppdPageSize(ppd, "Custom");
@@ -994,7 +974,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
* Level 2 command sequence...
*/
- strlcpy(bufptr, ppd_custom_code, bufend - bufptr + 1);
+ strlcpy(bufptr, ppd_custom_code, (size_t)(bufend - bufptr + 1));
bufptr += strlen(bufptr);
}
}
@@ -1017,8 +997,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
cupsArrayAdd(params, cparam);
- snprintf(bufptr, bufend - bufptr + 1,
- "%%%%BeginFeature: *Custom%s True\n", coption->keyword);
+ snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *Custom%s True\n", coption->keyword);
bufptr += strlen(bufptr);
for (cparam = (ppd_cparam_t *)cupsArrayFirst(params);
@@ -1037,8 +1016,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
break;
case PPD_CUSTOM_INT :
- snprintf(bufptr, bufend - bufptr + 1, "%d\n",
- cparam->current.custom_int);
+ snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d\n", cparam->current.custom_int);
bufptr += strlen(bufptr);
break;
@@ -1053,7 +1031,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
{
if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127)
{
- snprintf(bufptr, bufend - bufptr + 1, "\\%03o", *s & 255);
+ snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *s & 255);
bufptr += strlen(bufptr);
}
else
@@ -1071,15 +1049,14 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
}
else
{
- snprintf(bufptr, bufend - bufptr + 1, "%%%%BeginFeature: *%s %s\n",
- choices[i]->option->keyword, choices[i]->choice);
+ snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *%s %s\n", choices[i]->option->keyword, choices[i]->choice);
bufptr += strlen(bufptr);
}
if (choices[i]->code && choices[i]->code[0])
{
j = (int)strlen(choices[i]->code);
- memcpy(bufptr, choices[i]->code, j);
+ memcpy(bufptr, choices[i]->code, (size_t)j);
bufptr += j;
if (choices[i]->code[j - 1] != '\n')
@@ -1087,7 +1064,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
}
strlcpy(bufptr, "%%EndFeature\n"
- "} stopped cleartomark\n", bufend - bufptr + 1);
+ "} stopped cleartomark\n", (size_t)(bufend - bufptr + 1));
bufptr += strlen(bufptr);
DEBUG_printf(("2ppdEmitString: Offset in string is %d...",
@@ -1095,7 +1072,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
}
else
{
- strlcpy(bufptr, choices[i]->code, bufend - bufptr + 1);
+ strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1));
bufptr += strlen(bufptr);
}
@@ -1225,5 +1202,5 @@ ppd_handle_media(ppd_file_t *ppd) /* I - PPD file */
/*
- * End of "$Id: emit.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: emit.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/cups/encode.c b/cups/encode.c
index ee0f955..b43c4a3 100644
--- a/cups/encode.c
+++ b/cups/encode.c
@@ -1,26 +1,18 @@
/*
- * "$Id: encode.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: encode.c 12668 2015-05-27 19:30:32Z msweet $"
*
- * Option encoding routines for CUPS.
+ * Option encoding routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsEncodeOptions() - Encode printer options into IPP attributes.
- * cupsEncodeOptions2() - Encode printer options into IPP attributes for
- * a group.
- * _ippFindOption() - Find the attribute information for an option.
- * compare_ipp_options() - Compare two IPP options.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -31,14 +23,87 @@
/*
- * Local list of option names and the value tags they should use...
+ * Local list of option names, the value tags they should use, and the list of
+ * supported operations...
*
- * **** THIS LIST MUST BE SORTED ****
+ * **** THIS LIST MUST BE SORTED BY ATTRIBUTE NAME ****
*/
+static const ipp_op_t ipp_job_creation[] =
+{
+ IPP_OP_PRINT_JOB,
+ IPP_OP_PRINT_URI,
+ IPP_OP_VALIDATE_JOB,
+ IPP_OP_CREATE_JOB,
+ IPP_OP_HOLD_JOB,
+ IPP_OP_SET_JOB_ATTRIBUTES,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t ipp_doc_creation[] =
+{
+ IPP_OP_PRINT_JOB,
+ IPP_OP_PRINT_URI,
+ IPP_OP_SEND_DOCUMENT,
+ IPP_OP_SEND_URI,
+ IPP_OP_SET_JOB_ATTRIBUTES,
+ IPP_OP_SET_DOCUMENT_ATTRIBUTES,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t ipp_sub_creation[] =
+{
+ IPP_OP_PRINT_JOB,
+ IPP_OP_PRINT_URI,
+ IPP_OP_CREATE_JOB,
+ IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
+ IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t ipp_all_print[] =
+{
+ IPP_OP_PRINT_JOB,
+ IPP_OP_PRINT_URI,
+ IPP_OP_VALIDATE_JOB,
+ IPP_OP_CREATE_JOB,
+ IPP_OP_SEND_DOCUMENT,
+ IPP_OP_SEND_URI,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t ipp_set_printer[] =
+{
+ IPP_OP_SET_PRINTER_ATTRIBUTES,
+ IPP_OP_CUPS_ADD_MODIFY_PRINTER,
+ IPP_OP_CUPS_ADD_MODIFY_CLASS,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t cups_schemes[] =
+{
+ IPP_OP_CUPS_GET_DEVICES,
+ IPP_OP_CUPS_GET_PPDS,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t cups_get_ppds[] =
+{
+ IPP_OP_CUPS_GET_PPDS,
+ IPP_OP_CUPS_NONE
+};
+
+static const ipp_op_t cups_ppd_name[] =
+{
+ IPP_OP_CUPS_ADD_MODIFY_PRINTER,
+ IPP_OP_CUPS_GET_PPD,
+ IPP_OP_CUPS_NONE
+};
+
static const _ipp_option_t ipp_options[] =
{
{ 1, "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB },
+ { 1, "auth-info-default", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 1, "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
@@ -46,18 +111,29 @@ static const _ipp_option_t ipp_options[] =
{ 0, "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
- { 0, "compression", IPP_TAG_KEYWORD, IPP_TAG_OPERATION },
+ { 0, "compression", IPP_TAG_KEYWORD, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ ipp_doc_creation },
{ 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB,
IPP_TAG_DOCUMENT },
{ 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+ { 0, "date-time-at-completed",IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */
+ { 0, "date-time-at-creation", IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */
+ { 0, "date-time-at-processing",IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */
{ 0, "device-uri", IPP_TAG_URI, IPP_TAG_PRINTER },
{ 1, "document-copies", IPP_TAG_RANGE, IPP_TAG_JOB,
- IPP_TAG_DOCUMENT },
- { 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
+ IPP_TAG_DOCUMENT,
+ ipp_doc_creation },
+ { 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ ipp_doc_creation },
{ 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
{ 1, "document-numbers", IPP_TAG_RANGE, IPP_TAG_JOB,
- IPP_TAG_DOCUMENT },
- { 1, "exclude-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION },
+ IPP_TAG_DOCUMENT,
+ ipp_all_print },
+ { 1, "exclude-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_schemes },
{ 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB,
IPP_TAG_DOCUMENT },
{ 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
@@ -70,7 +146,17 @@ static const _ipp_option_t ipp_options[] =
{ 0, "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "hue", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
- { 1, "include-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION },
+ { 1, "include-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_schemes },
+ { 0, "job-account-id", IPP_TAG_NAME, IPP_TAG_JOB },
+ { 0, "job-account-id-default",IPP_TAG_NAME, IPP_TAG_PRINTER },
+ { 0, "job-accounting-user-id", IPP_TAG_NAME, IPP_TAG_JOB },
+ { 0, "job-accounting-user-id-default", IPP_TAG_NAME, IPP_TAG_PRINTER },
+ { 0, "job-authorization-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
+ { 0, "job-cancel-after", IPP_TAG_INTEGER, IPP_TAG_JOB },
+ { 0, "job-cancel-after-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+ { 0, "job-hold-until", IPP_TAG_KEYWORD, IPP_TAG_JOB },
{ 0, "job-id", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
{ 0, "job-impressions", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
{ 0, "job-impressions-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
@@ -80,6 +166,12 @@ static const _ipp_option_t ipp_options[] =
{ 0, "job-media-sheets", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
{ 0, "job-media-sheets-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
{ 0, "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+ { 0, "job-password", IPP_TAG_STRING, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ ipp_job_creation },
+ { 0, "job-password-encryption", IPP_TAG_KEYWORD, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ ipp_job_creation },
{ 0, "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 1, "job-sheets", IPP_TAG_NAME, IPP_TAG_JOB },
@@ -149,7 +241,33 @@ static const _ipp_option_t ipp_options[] =
{ 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
- { 0, "ppd-name", IPP_TAG_NAME, IPP_TAG_PRINTER },
+ { 0, "ppd-device-id", IPP_TAG_TEXT, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-make", IPP_TAG_TEXT, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-make-and-model", IPP_TAG_TEXT, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-model-number", IPP_TAG_INTEGER, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-name", IPP_TAG_NAME, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_ppd_name },
+ { 0, "ppd-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-product", IPP_TAG_TEXT, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-psversion", IPP_TAG_TEXT, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
+ { 0, "ppd-type", IPP_TAG_KEYWORD, IPP_TAG_OPERATION,
+ IPP_TAG_ZERO,
+ cups_get_ppds },
{ 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
@@ -159,6 +277,7 @@ static const _ipp_option_t ipp_options[] =
{ 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 1, "printer-commands", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
+ { 0, "printer-geo-location", IPP_TAG_URI, IPP_TAG_PRINTER },
{ 0, "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
@@ -249,23 +368,27 @@ cupsEncodeOptions2(
cups_option_t *options, /* I - Options */
ipp_tag_t group_tag) /* I - Group to encode */
{
- int i, j; /* Looping vars */
- int count; /* Number of values */
- char *s, /* Pointer into option value */
- *val, /* Pointer to option value */
- *copy, /* Copy of option value */
- *sep, /* Option separator */
- quote; /* Quote character */
- ipp_attribute_t *attr; /* IPP attribute */
- ipp_tag_t value_tag; /* IPP value tag */
- cups_option_t *option; /* Current option */
- ipp_t *collection; /* Collection value */
- int num_cols; /* Number of collection values */
- cups_option_t *cols; /* Collection values */
-
-
- DEBUG_printf(("cupsEncodeOptions2(ipp=%p, num_options=%d, options=%p, "
- "group_tag=%x)", ipp, num_options, options, group_tag));
+ int i, j; /* Looping vars */
+ int count; /* Number of values */
+ char *s, /* Pointer into option value */
+ *val, /* Pointer to option value */
+ *copy, /* Copy of option value */
+ *sep, /* Option separator */
+ quote; /* Quote character */
+ ipp_attribute_t *attr; /* IPP attribute */
+ ipp_tag_t value_tag; /* IPP value tag */
+ cups_option_t *option; /* Current option */
+ ipp_t *collection; /* Collection value */
+ int num_cols; /* Number of collection values */
+ cups_option_t *cols; /* Collection values */
+ ipp_op_t op; /* Operation for this request */
+ const ipp_op_t *ops; /* List of allowed operations */
+
+
+ DEBUG_printf(("cupsEncodeOptions2(ipp=%p(%s), num_options=%d, options=%p, "
+ "group_tag=%x)", ipp,
+ ipp ? ippOpString(ippGetOperation(ipp)) : "", num_options,
+ options, group_tag));
/*
* Range check input...
@@ -278,13 +401,18 @@ cupsEncodeOptions2(
* Do special handling for the document-format/raw options...
*/
- if (group_tag == IPP_TAG_OPERATION)
+ op = ippGetOperation(ipp);
+
+ if (group_tag == IPP_TAG_OPERATION &&
+ (op == IPP_OP_PRINT_JOB || op == IPP_OP_PRINT_URI ||
+ op == IPP_OP_SEND_DOCUMENT || op == IPP_OP_SEND_URI))
{
/*
* Handle the document format stuff first...
*/
- if ((val = (char *)cupsGetOption("document-format", num_options, options)) != NULL)
+ if ((val = (char *)cupsGetOption("document-format", num_options,
+ options)) != NULL)
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
NULL, val);
else if (cupsGetOption("raw", num_options, options))
@@ -323,6 +451,22 @@ cupsEncodeOptions2(
continue;
value_tag = match->value_tag;
+
+ if (match->operations)
+ ops = match->operations;
+ else if (group_tag == IPP_TAG_JOB)
+ ops = ipp_job_creation;
+ else if (group_tag == IPP_TAG_DOCUMENT)
+ ops = ipp_doc_creation;
+ else if (group_tag == IPP_TAG_SUBSCRIPTION)
+ ops = ipp_sub_creation;
+ else if (group_tag == IPP_TAG_PRINTER)
+ ops = ipp_set_printer;
+ else
+ {
+ DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
+ continue;
+ }
}
else
{
@@ -336,10 +480,23 @@ cupsEncodeOptions2(
strcmp(option->name + namelen - 10, "-supported")))
{
if (group_tag != IPP_TAG_JOB && group_tag != IPP_TAG_DOCUMENT)
+ {
+ DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
continue;
+ }
}
else if (group_tag != IPP_TAG_PRINTER)
+ {
+ DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
continue;
+ }
+
+ if (group_tag == IPP_TAG_JOB)
+ ops = ipp_job_creation;
+ else if (group_tag == IPP_TAG_DOCUMENT)
+ ops = ipp_doc_creation;
+ else
+ ops = ipp_set_printer;
if (!_cups_strcasecmp(option->value, "true") ||
!_cups_strcasecmp(option->value, "false"))
@@ -349,6 +506,22 @@ cupsEncodeOptions2(
}
/*
+ * Verify that we send this attribute for this operation...
+ */
+
+ while (*ops != IPP_OP_CUPS_NONE)
+ if (op == *ops)
+ break;
+ else
+ ops ++;
+
+ if (*ops == IPP_OP_CUPS_NONE && op != IPP_OP_CUPS_NONE)
+ {
+ DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
+ continue;
+ }
+
+ /*
* Count the number of values...
*/
@@ -480,7 +653,7 @@ cupsEncodeOptions2(
* Integer/enumeration value...
*/
- attr->values[j].integer = strtol(val, &s, 10);
+ attr->values[j].integer = (int)strtol(val, &s, 10);
DEBUG_printf(("2cupsEncodeOptions2: Added integer option value "
"%d...", attr->values[j].integer));
@@ -522,12 +695,12 @@ cupsEncodeOptions2(
s = val;
}
else
- attr->values[j].range.lower = strtol(val, &s, 10);
+ attr->values[j].range.lower = (int)strtol(val, &s, 10);
if (*s == '-')
{
if (s[1])
- attr->values[j].range.upper = strtol(s + 1, NULL, 10);
+ attr->values[j].range.upper = (int)strtol(s + 1, NULL, 10);
else
attr->values[j].range.upper = 2147483647;
}
@@ -544,10 +717,10 @@ cupsEncodeOptions2(
* Resolution...
*/
- attr->values[j].resolution.xres = strtol(val, &s, 10);
+ attr->values[j].resolution.xres = (int)strtol(val, &s, 10);
if (*s == 'x')
- attr->values[j].resolution.yres = strtol(s + 1, &s, 10);
+ attr->values[j].resolution.yres = (int)strtol(s + 1, &s, 10);
else
attr->values[j].resolution.yres = attr->values[j].resolution.xres;
@@ -623,6 +796,26 @@ cupsEncodeOptions2(
}
+#ifdef DEBUG
+/*
+ * '_ippCheckOptions()' - Validate that the option array is sorted properly.
+ */
+
+const char * /* O - First out-of-order option or NULL */
+_ippCheckOptions(void)
+{
+ int i; /* Looping var */
+
+
+ for (i = 0; i < (int)(sizeof(ipp_options) / sizeof(ipp_options[0]) - 1); i ++)
+ if (strcmp(ipp_options[i].name, ipp_options[i + 1].name) >= 0)
+ return (ipp_options[i + 1].name);
+
+ return (NULL);
+}
+#endif /* DEBUG */
+
+
/*
* '_ippFindOption()' - Find the attribute information for an option.
*/
@@ -660,5 +853,5 @@ compare_ipp_options(_ipp_option_t *a, /* I - First option */
/*
- * End of "$Id: encode.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: encode.c 12668 2015-05-27 19:30:32Z msweet $".
*/
diff --git a/cups/file-private.h b/cups/file-private.h
index ed61700..7a34207 100644
--- a/cups/file-private.h
+++ b/cups/file-private.h
@@ -1,21 +1,23 @@
/*
- * "$Id: file-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: file-private.h 11627 2014-02-20 16:15:09Z msweet $"
*
- * Private file definitions for CUPS.
+ * Private file definitions for CUPS.
*
- * Since stdio files max out at 256 files on many systems, we have to
- * write similar functions without this limit. At the same time, using
- * our own file functions allows us to provide transparent support of
- * gzip'd print files, PPD files, etc.
+ * Since stdio files max out at 256 files on many systems, we have to
+ * write similar functions without this limit. At the same time, using
+ * our own file functions allows us to provide transparent support of
+ * gzip'd print files, PPD files, etc.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_FILE_PRIVATE_H_
@@ -133,5 +135,5 @@ extern void _cupsFileCheckFilter(void *context,
#endif /* !_CUPS_FILE_PRIVATE_H_ */
/*
- * End of "$Id: file-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: file-private.h 11627 2014-02-20 16:15:09Z msweet $".
*/
diff --git a/cups/file.c b/cups/file.c
index 062d1a2..a69f0f9 100644
--- a/cups/file.c
+++ b/cups/file.c
@@ -1,61 +1,23 @@
/*
- * "$Id: file.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: file.c 12641 2015-05-19 15:04:39Z msweet $"
*
- * File functions for CUPS.
+ * File functions for CUPS.
*
- * Since stdio files max out at 256 files on many systems, we have to
- * write similar functions without this limit. At the same time, using
- * our own file functions allows us to provide transparent support of
- * gzip'd print files, PPD files, etc.
+ * Since stdio files max out at 256 files on many systems, we have to
+ * write similar functions without this limit. At the same time, using
+ * our own file functions allows us to provide transparent support of
+ * gzip'd print files, PPD files, etc.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * Contents:
- *
- * _cupsFileCheck() - Check the permissions of the given filename.
- * _cupsFileCheckFilter() - Report file check results as CUPS filter messages.
- * cupsFileClose() - Close a CUPS file.
- * cupsFileCompression() - Return whether a file is compressed.
- * cupsFileEOF() - Return the end-of-file status.
- * cupsFileFind() - Find a file using the specified path.
- * cupsFileFlush() - Flush pending output.
- * cupsFileGetChar() - Get a single character from a file.
- * cupsFileGetConf() - Get a line from a configuration file.
- * cupsFileGetLine() - Get a CR and/or LF-terminated line that may
- * contain binary data.
- * cupsFileGets() - Get a CR and/or LF-terminated line.
- * cupsFileLock() - Temporarily lock access to a file.
- * cupsFileNumber() - Return the file descriptor associated with a CUPS
- * file.
- * cupsFileOpen() - Open a CUPS file.
- * cupsFileOpenFd() - Open a CUPS file using a file descriptor.
- * cupsFilePeekChar() - Peek at the next character from a file.
- * cupsFilePrintf() - Write a formatted string.
- * cupsFilePutChar() - Write a character.
- * cupsFilePutConf() - Write a configuration line.
- * cupsFilePuts() - Write a string.
- * cupsFileRead() - Read from a file.
- * cupsFileRewind() - Set the current file position to the beginning of
- * the file.
- * cupsFileSeek() - Seek in a file.
- * cupsFileStderr() - Return a CUPS file associated with stderr.
- * cupsFileStdin() - Return a CUPS file associated with stdin.
- * cupsFileStdout() - Return a CUPS file associated with stdout.
- * cupsFileTell() - Return the current file position.
- * cupsFileUnlock() - Unlock access to a file.
- * cupsFileWrite() - Write to a file.
- * cups_compress() - Compress a buffer of data.
- * cups_fill() - Fill the input buffer.
- * cups_open() - Safely open a file for writing.
- * cups_read() - Read from a file descriptor.
- * cups_write() - Write to a file descriptor.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -410,7 +372,7 @@ cupsFileClose(cups_file_t *fp) /* I - CUPS file */
if (fp->stream.next_out > fp->cbuf)
{
if (cups_write(fp, (char *)fp->cbuf,
- fp->stream.next_out - fp->cbuf) < 0)
+ (size_t)(fp->stream.next_out - fp->cbuf)) < 0)
status = -1;
fp->stream.next_out = fp->cbuf;
@@ -428,14 +390,14 @@ cupsFileClose(cups_file_t *fp) /* I - CUPS file */
* Write the CRC and length...
*/
- trailer[0] = fp->crc;
- trailer[1] = fp->crc >> 8;
- trailer[2] = fp->crc >> 16;
- trailer[3] = fp->crc >> 24;
- trailer[4] = fp->pos;
- trailer[5] = fp->pos >> 8;
- trailer[6] = fp->pos >> 16;
- trailer[7] = fp->pos >> 24;
+ trailer[0] = (unsigned char)fp->crc;
+ trailer[1] = (unsigned char)(fp->crc >> 8);
+ trailer[2] = (unsigned char)(fp->crc >> 16);
+ trailer[3] = (unsigned char)(fp->crc >> 24);
+ trailer[4] = (unsigned char)fp->pos;
+ trailer[5] = (unsigned char)(fp->pos >> 8);
+ trailer[6] = (unsigned char)(fp->pos >> 16);
+ trailer[7] = (unsigned char)(fp->pos >> 24);
if (cups_write(fp, (char *)trailer, 8) < 0)
status = -1;
@@ -468,7 +430,7 @@ cupsFileClose(cups_file_t *fp) /* I - CUPS file */
if (mode == 's')
{
- if (closesocket(fd) < 0)
+ if (httpAddrClose(NULL, fd) < 0)
status = -1;
}
else if (!is_stdio)
@@ -549,7 +511,7 @@ cupsFileFind(const char *filename, /* I - File to find */
if (!access(filename, 0))
{
- strlcpy(buffer, filename, bufsize);
+ strlcpy(buffer, filename, (size_t)bufsize);
return (buffer);
}
else
@@ -574,7 +536,7 @@ cupsFileFind(const char *filename, /* I - File to find */
if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend)
*bufptr++ = '/';
- strlcpy(bufptr, filename, bufend - bufptr);
+ strlcpy(bufptr, filename, (size_t)(bufend - bufptr));
#ifdef WIN32
if (!access(buffer, 0))
@@ -601,7 +563,7 @@ cupsFileFind(const char *filename, /* I - File to find */
if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend)
*bufptr++ = '/';
- strlcpy(bufptr, filename, bufend - bufptr);
+ strlcpy(bufptr, filename, (size_t)(bufend - bufptr));
if (!access(buffer, 0))
{
@@ -649,10 +611,10 @@ cupsFileFlush(cups_file_t *fp) /* I - CUPS file */
{
#ifdef HAVE_LIBZ
if (fp->compressed)
- bytes = cups_compress(fp, fp->buf, bytes);
+ bytes = cups_compress(fp, fp->buf, (size_t)bytes);
else
#endif /* HAVE_LIBZ */
- bytes = cups_write(fp, fp->buf, bytes);
+ bytes = cups_write(fp, fp->buf, (size_t)bytes);
if (bytes < 0)
return (-1);
@@ -677,6 +639,8 @@ cupsFileGetChar(cups_file_t *fp) /* I - CUPS file */
* Range check input...
*/
+ DEBUG_printf(("4cupsFileGetChar(fp=%p)", fp));
+
if (!fp || (fp->mode != 'r' && fp->mode != 's'))
{
DEBUG_puts("5cupsFileGetChar: Bad arguments!");
@@ -687,8 +651,10 @@ cupsFileGetChar(cups_file_t *fp) /* I - CUPS file */
* If the input buffer is empty, try to read more data...
*/
+ DEBUG_printf(("5cupsFileGetChar: fp->eof=%d, fp->ptr=%p, fp->end=%p", fp->eof, fp->ptr, fp->end));
+
if (fp->ptr >= fp->end)
- if (cups_fill(fp) < 0)
+ if (cups_fill(fp) <= 0)
{
DEBUG_puts("5cupsFileGetChar: Unable to fill buffer!");
return (-1);
@@ -923,7 +889,7 @@ cupsFileGetLine(cups_file_t *fp, /* I - File to read from */
DEBUG_printf(("4cupsFileGetLine: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
- return (ptr - buf);
+ return ((size_t)(ptr - buf));
}
@@ -998,7 +964,7 @@ cupsFileGets(cups_file_t *fp, /* I - CUPS file */
break;
}
else
- *ptr++ = ch;
+ *ptr++ = (char)ch;
}
*ptr = '\0';
@@ -1170,7 +1136,7 @@ cupsFileOpen(const char *filename, /* I - Name of file */
if ((fp = cupsFileOpenFd(fd, mode)) == NULL)
{
if (*mode == 's')
- closesocket(fd);
+ httpAddrClose(NULL, fd);
else
close(fd);
}
@@ -1253,10 +1219,10 @@ cupsFileOpenFd(int fd, /* I - File descriptor */
header[1] = 0x8b;
header[2] = Z_DEFLATED;
header[3] = 0;
- header[4] = curtime;
- header[5] = curtime >> 8;
- header[6] = curtime >> 16;
- header[7] = curtime >> 24;
+ header[4] = (unsigned char)curtime;
+ header[5] = (unsigned char)(curtime >> 8);
+ header[6] = (unsigned char)(curtime >> 16);
+ header[7] = (unsigned char)(curtime >> 24);
header[8] = 0;
header[9] = 0x03;
@@ -1322,7 +1288,7 @@ cupsFilePeekChar(cups_file_t *fp) /* I - CUPS file */
*/
if (fp->ptr >= fp->end)
- if (cups_fill(fp) < 0)
+ if (cups_fill(fp) <= 0)
return (-1);
/*
@@ -1381,11 +1347,11 @@ cupsFilePrintf(cups_file_t *fp, /* I - CUPS file */
if (bytes > 65535)
return (-1);
- if ((temp = realloc(fp->printf_buffer, bytes + 1)) == NULL)
+ if ((temp = realloc(fp->printf_buffer, (size_t)(bytes + 1))) == NULL)
return (-1);
fp->printf_buffer = temp;
- fp->printf_size = bytes + 1;
+ fp->printf_size = (size_t)(bytes + 1);
va_start(ap, format);
bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap);
@@ -1394,14 +1360,14 @@ cupsFilePrintf(cups_file_t *fp, /* I - CUPS file */
if (fp->mode == 's')
{
- if (cups_write(fp, fp->printf_buffer, bytes) < 0)
+ if (cups_write(fp, fp->printf_buffer, (size_t)bytes) < 0)
return (-1);
fp->pos += bytes;
DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
- return (bytes);
+ return ((int)bytes);
}
if ((fp->ptr + bytes) > fp->end)
@@ -1412,20 +1378,20 @@ cupsFilePrintf(cups_file_t *fp, /* I - CUPS file */
DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
- if (bytes > sizeof(fp->buf))
+ if ((size_t)bytes > sizeof(fp->buf))
{
#ifdef HAVE_LIBZ
if (fp->compressed)
- return (cups_compress(fp, fp->printf_buffer, bytes));
+ return ((int)cups_compress(fp, fp->printf_buffer, (size_t)bytes));
else
#endif /* HAVE_LIBZ */
- return (cups_write(fp, fp->printf_buffer, bytes));
+ return ((int)cups_write(fp, fp->printf_buffer, (size_t)bytes));
}
else
{
- memcpy(fp->ptr, fp->printf_buffer, bytes);
+ memcpy(fp->ptr, fp->printf_buffer, (size_t)bytes);
fp->ptr += bytes;
- return (bytes);
+ return ((int)bytes);
}
}
@@ -1456,7 +1422,7 @@ cupsFilePutChar(cups_file_t *fp, /* I - CUPS file */
char ch; /* Output character */
- ch = c;
+ ch = (char)c;
if (send(fp->fd, &ch, 1, 0) < 1)
return (-1);
@@ -1471,7 +1437,7 @@ cupsFilePutChar(cups_file_t *fp, /* I - CUPS file */
if (cupsFileFlush(fp))
return (-1);
- *(fp->ptr) ++ = c;
+ *(fp->ptr) ++ = (char)c;
}
fp->pos ++;
@@ -1518,7 +1484,7 @@ cupsFilePutConf(cups_file_t *fp, /* I - CUPS file */
* Need to quote the first # in the info string...
*/
- if ((temp = cupsFileWrite(fp, value, ptr - value)) < 0)
+ if ((temp = cupsFileWrite(fp, value, (size_t)(ptr - value))) < 0)
return (-1);
bytes += temp;
@@ -1569,18 +1535,18 @@ cupsFilePuts(cups_file_t *fp, /* I - CUPS file */
* Write the string...
*/
- bytes = (int)strlen(s);
+ bytes = (ssize_t)strlen(s);
if (fp->mode == 's')
{
- if (cups_write(fp, s, bytes) < 0)
+ if (cups_write(fp, s, (size_t)bytes) < 0)
return (-1);
fp->pos += bytes;
DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
- return (bytes);
+ return ((int)bytes);
}
if ((fp->ptr + bytes) > fp->end)
@@ -1591,20 +1557,20 @@ cupsFilePuts(cups_file_t *fp, /* I - CUPS file */
DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
- if (bytes > sizeof(fp->buf))
+ if ((size_t)bytes > sizeof(fp->buf))
{
#ifdef HAVE_LIBZ
if (fp->compressed)
- return (cups_compress(fp, s, bytes));
+ return ((int)cups_compress(fp, s, (size_t)bytes));
else
#endif /* HAVE_LIBZ */
- return (cups_write(fp, s, bytes));
+ return ((int)cups_write(fp, s, (size_t)bytes));
}
else
{
- memcpy(fp->ptr, s, bytes);
+ memcpy(fp->ptr, s, (size_t)bytes);
fp->ptr += bytes;
- return (bytes);
+ return ((int)bytes);
}
}
@@ -1660,7 +1626,7 @@ cupsFileRead(cups_file_t *fp, /* I - CUPS file */
if (count > (ssize_t)bytes)
count = (ssize_t)bytes;
- memcpy(buf, fp->ptr, count);
+ memcpy(buf, fp->ptr,(size_t) count);
fp->ptr += count;
fp->pos += count;
@@ -1670,8 +1636,8 @@ cupsFileRead(cups_file_t *fp, /* I - CUPS file */
* Update the counts for the last read...
*/
- bytes -= count;
- total += count;
+ bytes -= (size_t)count;
+ total += (size_t)count;
buf += count;
}
@@ -1817,7 +1783,7 @@ cupsFileSeek(cups_file_t *fp, /* I - CUPS file */
* Preload a buffer to determine whether the file is compressed...
*/
- if (cups_fill(fp) < 0)
+ if (cups_fill(fp) <= 0)
return (-1);
}
#endif /* HAVE_LIBZ */
@@ -2143,14 +2109,14 @@ cups_compress(cups_file_t *fp, /* I - CUPS file */
* Update the CRC...
*/
- fp->crc = crc32(fp->crc, (const Bytef *)buf, bytes);
+ fp->crc = crc32(fp->crc, (const Bytef *)buf, (uInt)bytes);
/*
* Deflate the bytes...
*/
fp->stream.next_in = (Bytef *)buf;
- fp->stream.avail_in = bytes;
+ fp->stream.avail_in = (uInt)bytes;
while (fp->stream.avail_in > 0)
{
@@ -2161,9 +2127,9 @@ cups_compress(cups_file_t *fp, /* I - CUPS file */
DEBUG_printf(("9cups_compress: avail_in=%d, avail_out=%d",
fp->stream.avail_in, fp->stream.avail_out));
- if (fp->stream.avail_out < (int)(sizeof(fp->cbuf) / 8))
+ if (fp->stream.avail_out < (uInt)(sizeof(fp->cbuf) / 8))
{
- if (cups_write(fp, (char *)fp->cbuf, fp->stream.next_out - fp->cbuf) < 0)
+ if (cups_write(fp, (char *)fp->cbuf, (size_t)(fp->stream.next_out - fp->cbuf)) < 0)
return (-1);
fp->stream.next_out = fp->cbuf;
@@ -2173,7 +2139,7 @@ cups_compress(cups_file_t *fp, /* I - CUPS file */
deflate(&(fp->stream), Z_NO_FLUSH);
}
- return (bytes);
+ return ((ssize_t)bytes);
}
#endif /* HAVE_LIBZ */
@@ -2233,6 +2199,8 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
DEBUG_printf(("9cups_fill: cups_read() returned " CUPS_LLFMT,
CUPS_LLCAST bytes));
+ fp->eof = 1;
+
return (-1);
}
@@ -2272,6 +2240,11 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
* Can't read from file!
*/
+ DEBUG_puts("9cups_fill: Extra gzip header data missing, returning -1.");
+
+ fp->eof = 1;
+ errno = EIO;
+
return (-1);
}
@@ -2284,6 +2257,11 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
* Can't read from file!
*/
+ DEBUG_puts("9cups_fill: Extra gzip header data does not fit in initial buffer, returning -1.");
+
+ fp->eof = 1;
+ errno = EIO;
+
return (-1);
}
}
@@ -2305,6 +2283,11 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
* Can't read from file!
*/
+ DEBUG_puts("9cups_fill: Original filename in gzip header data does not fit in initial buffer, returning -1.");
+
+ fp->eof = 1;
+ errno = EIO;
+
return (-1);
}
}
@@ -2326,6 +2309,11 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
* Can't read from file!
*/
+ DEBUG_puts("9cups_fill: Comment in gzip header data does not fit in initial buffer, returning -1.");
+
+ fp->eof = 1;
+ errno = EIO;
+
return (-1);
}
}
@@ -2344,6 +2332,11 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
* Can't read from file!
*/
+ DEBUG_puts("9cups_fill: Header CRC in gzip header data does not fit in initial buffer, returning -1.");
+
+ fp->eof = 1;
+ errno = EIO;
+
return (-1);
}
}
@@ -2353,7 +2346,7 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
*/
if ((bytes = end - ptr) > 0)
- memcpy(fp->cbuf, ptr, bytes);
+ memcpy(fp->cbuf, ptr, (size_t)bytes);
/*
* Setup the decompressor data...
@@ -2364,12 +2357,19 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
fp->stream.opaque = (voidpf)0;
fp->stream.next_in = (Bytef *)fp->cbuf;
fp->stream.next_out = NULL;
- fp->stream.avail_in = bytes;
+ fp->stream.avail_in = (uInt)bytes;
fp->stream.avail_out = 0;
fp->crc = crc32(0L, Z_NULL, 0);
- if (inflateInit2(&(fp->stream), -15) != Z_OK)
+ if ((status = inflateInit2(&(fp->stream), -15)) != Z_OK)
+ {
+ DEBUG_printf(("9cups_fill: inflateInit2 returned %d, returning -1.", status));
+
+ fp->eof = 1;
+ errno = EIO;
+
return (-1);
+ }
fp->compressed = 1;
}
@@ -2381,7 +2381,11 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
*/
if (fp->eof)
- return (-1);
+ {
+ DEBUG_puts("9cups_fill: EOF, returning 0.");
+
+ return (0);
+ }
/*
* Fill the decompression buffer as needed...
@@ -2390,10 +2394,16 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
if (fp->stream.avail_in == 0)
{
if ((bytes = cups_read(fp, (char *)fp->cbuf, sizeof(fp->cbuf))) <= 0)
- return (-1);
+ {
+ DEBUG_printf(("9cups_fill: cups_read error, returning %d.", (int)bytes));
+
+ fp->eof = 1;
+
+ return (bytes);
+ }
fp->stream.next_in = fp->cbuf;
- fp->stream.avail_in = bytes;
+ fp->stream.avail_in = (uInt)bytes;
}
/*
@@ -2407,7 +2417,7 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
if (fp->stream.next_out > (Bytef *)fp->buf)
fp->crc = crc32(fp->crc, (Bytef *)fp->buf,
- fp->stream.next_out - (Bytef *)fp->buf);
+ (uInt)(fp->stream.next_out - (Bytef *)fp->buf));
if (status == Z_STREAM_END)
{
@@ -2417,45 +2427,72 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
unsigned char trailer[8]; /* Trailer bytes */
uLong tcrc; /* Trailer CRC */
+ ssize_t tbytes = 0; /* Number of bytes */
-
- if (read(fp->fd, trailer, sizeof(trailer)) < sizeof(trailer))
+ if (fp->stream.avail_in > 0)
{
- /*
- * Can't get it, so mark end-of-file...
- */
+ if (fp->stream.avail_in > sizeof(trailer))
+ tbytes = (ssize_t)sizeof(trailer);
+ else
+ tbytes = (ssize_t)fp->stream.avail_in;
- fp->eof = 1;
+ memcpy(trailer, fp->stream.next_in, (size_t)tbytes);
+ fp->stream.next_in += tbytes;
+ fp->stream.avail_in -= (size_t)tbytes;
}
- else
- {
- tcrc = (((((trailer[3] << 8) | trailer[2]) << 8) | trailer[1]) << 8) |
- trailer[0];
- if (tcrc != fp->crc)
+ if (tbytes < (ssize_t)sizeof(trailer))
+ {
+ if (read(fp->fd, trailer + tbytes, sizeof(trailer) - (size_t)tbytes) < ((ssize_t)sizeof(trailer) - tbytes))
{
/*
- * Bad CRC, mark end-of-file...
+ * Can't get it, so mark end-of-file...
*/
- DEBUG_printf(("9cups_fill: tcrc=%08x, fp->crc=%08x",
- (unsigned int)tcrc, (unsigned int)fp->crc));
+ DEBUG_puts("9cups_fill: Unable to read gzip CRC trailer, returning -1.");
fp->eof = 1;
+ errno = EIO;
return (-1);
}
+ }
+
+ tcrc = ((((((uLong)trailer[3] << 8) | (uLong)trailer[2]) << 8) |
+ (uLong)trailer[1]) << 8) | (uLong)trailer[0];
+ if (tcrc != fp->crc)
+ {
/*
- * Otherwise, reset the compressed flag so that we re-read the
- * file header...
+ * Bad CRC, mark end-of-file...
*/
- fp->compressed = 0;
+ DEBUG_printf(("9cups_fill: tcrc=%08x != fp->crc=%08x, returning -1.", (unsigned int)tcrc, (unsigned int)fp->crc));
+
+ fp->eof = 1;
+ errno = EIO;
+
+ return (-1);
}
+
+ /*
+ * Otherwise, reset the compressed flag so that we re-read the
+ * file header...
+ */
+
+ fp->compressed = 0;
}
+ else if (status < Z_OK)
+ {
+ DEBUG_printf(("9cups_fill: inflate returned %d, returning -1.", status));
- bytes = sizeof(fp->buf) - fp->stream.avail_out;
+ fp->eof = 1;
+ errno = EIO;
+
+ return (-1);
+ }
+
+ bytes = (ssize_t)sizeof(fp->buf) - (ssize_t)fp->stream.avail_out;
/*
* Return the decompressed data...
@@ -2465,7 +2502,10 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
fp->end = fp->buf + bytes;
if (bytes)
+ {
+ DEBUG_printf(("9cups_fill: Returning %d.", (int)bytes));
return (bytes);
+ }
}
}
#endif /* HAVE_LIBZ */
@@ -2483,17 +2523,19 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
fp->eof = 1;
fp->ptr = fp->buf;
fp->end = fp->buf;
-
- return (-1);
}
+ else
+ {
+ /*
+ * Return the bytes we read...
+ */
- /*
- * Return the bytes we read...
- */
+ fp->eof = 0;
+ fp->ptr = fp->buf;
+ fp->end = fp->buf + bytes;
+ }
- fp->eof = 0;
- fp->ptr = fp->buf;
- fp->end = fp->buf + bytes;
+ DEBUG_printf(("9cups_fill: Not gzip, returning %d.", (int)bytes));
return (bytes);
}
@@ -2696,8 +2738,8 @@ cups_write(cups_file_t *fp, /* I - CUPS file */
* Update the counts for the last write call...
*/
- bytes -= count;
- total += count;
+ bytes -= (size_t)count;
+ total += (size_t)count;
buf += count;
}
@@ -2710,5 +2752,5 @@ cups_write(cups_file_t *fp, /* I - CUPS file */
/*
- * End of "$Id: file.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: file.c 12641 2015-05-19 15:04:39Z msweet $".
*/
diff --git a/cups/file.h b/cups/file.h
index fb63d64..43bf294 100644
--- a/cups/file.h
+++ b/cups/file.h
@@ -1,21 +1,23 @@
/*
- * "$Id: file.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: file.h 11627 2014-02-20 16:15:09Z msweet $"
*
- * Public file definitions for CUPS.
+ * Public file definitions for CUPS.
*
- * Since stdio files max out at 256 files on many systems, we have to
- * write similar functions without this limit. At the same time, using
- * our own file functions allows us to provide transparent support of
- * gzip'd print files, PPD files, etc.
+ * Since stdio files max out at 256 files on many systems, we have to
+ * write similar functions without this limit. At the same time, using
+ * our own file functions allows us to provide transparent support of
+ * gzip'd print files, PPD files, etc.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_FILE_H_
@@ -112,5 +114,5 @@ extern ssize_t cupsFileWrite(cups_file_t *fp, const char *buf,
#endif /* !_CUPS_FILE_H_ */
/*
- * End of "$Id: file.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: file.h 11627 2014-02-20 16:15:09Z msweet $".
*/
diff --git a/cups/getdevices.c b/cups/getdevices.c
index 89f5b8d..ea862a7 100644
--- a/cups/getdevices.c
+++ b/cups/getdevices.c
@@ -1,9 +1,9 @@
/*
- * "$Id: getdevices.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: getdevices.c 4216 2013-03-11 13:57:36Z msweet $"
*
* cupsGetDevices implementation for CUPS.
*
- * Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2013 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -71,19 +71,19 @@ cupsGetDevices(
user_data));
if (!callback)
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
if (!http)
http = _cupsConnect();
if (!http)
- return (IPP_SERVICE_UNAVAILABLE);
+ return (IPP_STATUS_ERROR_SERVICE_UNAVAILABLE);
/*
* Create a CUPS-Get-Devices request...
*/
- request = ippNewRequest(CUPS_GET_DEVICES);
+ request = ippNewRequest(IPP_OP_CUPS_GET_DEVICES);
if (timeout > 0)
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "timeout",
@@ -115,14 +115,14 @@ cupsGetDevices(
status = cupsSendRequest(http, request, "/", ippLength(request));
DEBUG_puts("2cupsGetDevices: Waiting for response status...");
- while (status == HTTP_CONTINUE)
+ while (status == HTTP_STATUS_CONTINUE)
status = httpUpdate(http);
- if (status != HTTP_OK)
+ if (status != HTTP_STATUS_OK)
{
httpFlush(http);
- if (status == HTTP_UNAUTHORIZED)
+ if (status == HTTP_STATUS_UNAUTHORIZED)
{
/*
* See if we can do authentication...
@@ -131,16 +131,16 @@ cupsGetDevices(
DEBUG_puts("2cupsGetDevices: Need authorization...");
if (!cupsDoAuthentication(http, "POST", "/"))
- httpReconnect(http);
+ httpReconnect2(http, 30000, NULL);
else
{
- status = HTTP_AUTHORIZATION_CANCELED;
+ status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
break;
}
}
#ifdef HAVE_SSL
- else if (status == HTTP_UPGRADE_REQUIRED)
+ else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
{
/*
* Force a reconnect with encryption...
@@ -148,19 +148,20 @@ cupsGetDevices(
DEBUG_puts("2cupsGetDevices: Need encryption...");
- if (!httpReconnect(http))
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ if (!httpReconnect2(http, 30000, NULL))
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
}
#endif /* HAVE_SSL */
}
}
- while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED);
+ while (status == HTTP_STATUS_UNAUTHORIZED ||
+ status == HTTP_STATUS_UPGRADE_REQUIRED);
DEBUG_printf(("2cupsGetDevices: status=%d", status));
ippDelete(request);
- if (status != HTTP_OK)
+ if (status != HTTP_STATUS_OK)
{
_cupsSetHTTPError(status);
return (cupsLastError());
@@ -186,7 +187,7 @@ cupsGetDevices(
do
{
- if ((state = ippRead(http, response)) == IPP_ERROR)
+ if ((state = ippRead(http, response)) == IPP_STATE_ERROR)
break;
DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state,
@@ -240,7 +241,7 @@ cupsGetDevices(
device_uri = attr->values[0].string.text;
}
}
- while (state != IPP_DATA);
+ while (state != IPP_STATE_DATA);
DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state,
response->last));
@@ -257,8 +258,8 @@ cupsGetDevices(
httpBlocking(http, blocking);
httpFlush(http);
- if (status == HTTP_ERROR)
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0);
+ if (status == HTTP_STATUS_ERROR)
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0);
else
{
attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT);
@@ -279,5 +280,5 @@ cupsGetDevices(
/*
- * End of "$Id: getdevices.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: getdevices.c 4216 2013-03-11 13:57:36Z msweet $".
*/
diff --git a/cups/getifaddrs.c b/cups/getifaddrs.c
index e227276..02903a7 100644
--- a/cups/getifaddrs.c
+++ b/cups/getifaddrs.c
@@ -1,5 +1,5 @@
/*
- * "$Id: getifaddrs.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: getifaddrs.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Network interface functions for CUPS.
*
@@ -262,5 +262,5 @@ _cups_freeifaddrs(struct ifaddrs *addrs)/* I - Interface list to free */
/*
- * End of "$Id: getifaddrs.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: getifaddrs.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/getputfile.c b/cups/getputfile.c
index c7534ec..73d2142 100644
--- a/cups/getputfile.c
+++ b/cups/getputfile.c
@@ -1,25 +1,18 @@
/*
- * "$Id: getputfile.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: getputfile.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Get/put file functions for CUPS.
+ * Get/put file functions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsGetFd() - Get a file from the server.
- * cupsGetFile() - Get a file from the server.
- * cupsPutFd() - Put a file on the server.
- * cupsPutFile() - Put a file on the server.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -39,7 +32,7 @@
/*
* 'cupsGetFd()' - Get a file from the server.
*
- * This function returns @code HTTP_OK@ when the file is successfully retrieved.
+ * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved.
*
* @since CUPS 1.1.20/OS X 10.4@
*/
@@ -49,7 +42,7 @@ cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
const char *resource, /* I - Resource name */
int fd) /* I - File descriptor */
{
- int bytes; /* Number of bytes read */
+ ssize_t bytes; /* Number of bytes read */
char buffer[8192]; /* Buffer for file */
http_status_t status; /* HTTP status from server */
char if_modified_since[HTTP_MAX_VALUE];
@@ -68,12 +61,12 @@ cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
if (http)
http->error = EINVAL;
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
if (!http)
if ((http = _cupsConnect()) == NULL)
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
/*
* Then send GET requests to the HTTP server...
@@ -84,27 +77,37 @@ cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
do
{
+ if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close"))
+ {
+ httpClearFields(http);
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+ }
+
httpClearFields(http);
httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring);
httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, if_modified_since);
if (httpGet(http, resource))
{
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
else
{
- status = HTTP_UNAUTHORIZED;
+ status = HTTP_STATUS_UNAUTHORIZED;
continue;
}
}
- while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
- if (status == HTTP_UNAUTHORIZED)
+ if (status == HTTP_STATUS_UNAUTHORIZED)
{
/*
* Flush any error message...
@@ -118,53 +121,53 @@ cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
if (cupsDoAuthentication(http, "GET", resource))
{
- status = HTTP_AUTHORIZATION_CANCELED;
+ status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
break;
}
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
continue;
}
#ifdef HAVE_SSL
- else if (status == HTTP_UPGRADE_REQUIRED)
+ else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
{
/* Flush any error message... */
httpFlush(http);
/* Reconnect... */
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
/* Upgrade with encryption... */
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
/* Try again, this time with encryption enabled... */
continue;
}
#endif /* HAVE_SSL */
}
- while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED);
+ while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED);
/*
* See if we actually got the file or an error...
*/
- if (status == HTTP_OK)
+ if (status == HTTP_STATUS_OK)
{
/*
* Yes, copy the file...
*/
while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
- write(fd, buffer, bytes);
+ write(fd, buffer, (size_t)bytes);
}
else
{
@@ -185,7 +188,7 @@ cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
/*
* 'cupsGetFile()' - Get a file from the server.
*
- * This function returns @code HTTP_OK@ when the file is successfully retrieved.
+ * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved.
*
* @since CUPS 1.1.20/OS X 10.4@
*/
@@ -208,7 +211,7 @@ cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
if (http)
http->error = EINVAL;
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -223,7 +226,7 @@ cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
http->error = errno;
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -238,7 +241,7 @@ cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
close(fd);
- if (status != HTTP_OK)
+ if (status != HTTP_STATUS_OK)
unlink(filename);
/*
@@ -252,7 +255,7 @@ cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
/*
* 'cupsPutFd()' - Put a file on the server.
*
- * This function returns @code HTTP_CREATED@ when the file is stored
+ * This function returns @code HTTP_STATUS_CREATED@ when the file is stored
* successfully.
*
* @since CUPS 1.1.20/OS X 10.4@
@@ -263,8 +266,8 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
const char *resource, /* I - Resource name */
int fd) /* I - File descriptor */
{
- int bytes, /* Number of bytes read */
- retries; /* Number of retries */
+ ssize_t bytes; /* Number of bytes read */
+ int retries; /* Number of retries */
char buffer[8192]; /* Buffer for file */
http_status_t status; /* HTTP status from server */
@@ -281,12 +284,12 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
if (http)
http->error = EINVAL;
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
if (!http)
if ((http = _cupsConnect()) == NULL)
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
/*
* Then send PUT requests to the HTTP server...
@@ -296,24 +299,34 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
do
{
+ if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close"))
+ {
+ httpClearFields(http);
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+ }
+
DEBUG_printf(("2cupsPutFd: starting attempt, authstring=\"%s\"...",
http->authstring));
httpClearFields(http);
httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring);
httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked");
- httpSetExpect(http, HTTP_CONTINUE);
+ httpSetExpect(http, HTTP_STATUS_CONTINUE);
if (httpPut(http, resource))
{
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
else
{
- status = HTTP_UNAUTHORIZED;
+ status = HTTP_STATUS_UNAUTHORIZED;
continue;
}
}
@@ -325,9 +338,9 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
if (httpWait(http, 1000))
status = httpUpdate(http);
else
- status = HTTP_CONTINUE;
+ status = HTTP_STATUS_CONTINUE;
- if (status == HTTP_CONTINUE)
+ if (status == HTTP_STATUS_CONTINUE)
{
/*
* Copy the file...
@@ -338,21 +351,21 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
if (httpCheck(http))
{
- if ((status = httpUpdate(http)) != HTTP_CONTINUE)
+ if ((status = httpUpdate(http)) != HTTP_STATUS_CONTINUE)
break;
}
else
- httpWrite2(http, buffer, bytes);
+ httpWrite2(http, buffer, (size_t)bytes);
}
- if (status == HTTP_CONTINUE)
+ if (status == HTTP_STATUS_CONTINUE)
{
httpWrite2(http, buffer, 0);
- while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
}
- if (status == HTTP_ERROR && !retries)
+ if (status == HTTP_STATUS_ERROR && !retries)
{
DEBUG_printf(("2cupsPutFd: retry on status %d", status));
@@ -362,9 +375,9 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
httpFlush(http);
/* Reconnect... */
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
@@ -374,7 +387,7 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
DEBUG_printf(("2cupsPutFd: status=%d", status));
- if (status == HTTP_UNAUTHORIZED)
+ if (status == HTTP_STATUS_UNAUTHORIZED)
{
/*
* Flush any error message...
@@ -388,47 +401,47 @@ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFA
if (cupsDoAuthentication(http, "PUT", resource))
{
- status = HTTP_AUTHORIZATION_CANCELED;
+ status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
break;
}
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
continue;
}
#ifdef HAVE_SSL
- else if (status == HTTP_UPGRADE_REQUIRED)
+ else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
{
/* Flush any error message... */
httpFlush(http);
/* Reconnect... */
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
break;
}
/* Upgrade with encryption... */
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
/* Try again, this time with encryption enabled... */
continue;
}
#endif /* HAVE_SSL */
}
- while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED ||
- (status == HTTP_ERROR && retries < 2));
+ while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED ||
+ (status == HTTP_STATUS_ERROR && retries < 2));
/*
* See if we actually put the file or an error...
*/
- if (status != HTTP_CREATED)
+ if (status != HTTP_STATUS_CREATED)
{
_cupsSetHTTPError(status);
httpFlush(http);
@@ -467,7 +480,7 @@ cupsPutFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
if (http)
http->error = EINVAL;
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -482,7 +495,7 @@ cupsPutFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
http->error = errno;
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -498,5 +511,5 @@ cupsPutFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
/*
- * End of "$Id: getputfile.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: getputfile.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/globals.c b/cups/globals.c
index 8493a08..4b041f4 100644
--- a/cups/globals.c
+++ b/cups/globals.c
@@ -1,5 +1,5 @@
/*
- * "$Id: globals.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: globals.c 12480 2015-02-03 12:36:34Z msweet $"
*
* Global variable access routines for CUPS.
*
@@ -38,6 +38,10 @@
*/
+#ifdef DEBUG
+static int cups_global_index = 0;
+ /* Next thread number */
+#endif /* DEBUG */
static _cups_threadkey_t cups_globals_key = _CUPS_THREADKEY_INITIALIZER;
/* Thread local storage key */
#ifdef HAVE_PTHREAD_H
@@ -212,9 +216,17 @@ cups_globals_alloc(void)
memset(cg, 0, sizeof(_cups_globals_t));
cg->encryption = (http_encryption_t)-1;
cg->password_cb = (cups_password_cb2_t)_cupsGetPassword;
- cg->any_root = 1;
- cg->expired_certs = 1;
- cg->expired_root = 1;
+ cg->any_root = -1;
+ cg->expired_certs = -1;
+ cg->validate_certs = -1;
+
+#ifdef DEBUG
+ /*
+ * Friendly thread ID for debugging...
+ */
+
+ cg->thread_id = ++ cups_global_index;
+#endif /* DEBUG */
/*
* Then set directories as appropriate...
@@ -227,7 +239,7 @@ cups_globals_alloc(void)
* Open the registry...
*/
- strcpy(installdir, "C:/Program Files/cups.org");
+ strlcpy(installdir, "C:/Program Files/cups.org", sizeof(installdir));
if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ,
&key))
@@ -349,7 +361,9 @@ cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */
httpClose(cg->http);
+#ifdef HAVE_SSL
_httpFreeCredentials(cg->tls_credentials);
+#endif /* HAVE_SSL */
cupsFileClose(cg->stdio_files[0]);
cupsFileClose(cg->stdio_files[1]);
@@ -380,5 +394,5 @@ cups_globals_init(void)
/*
- * End of "$Id: globals.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: globals.c 12480 2015-02-03 12:36:34Z msweet $".
*/
diff --git a/cups/http-addr.c b/cups/http-addr.c
index 74218de..3f68d0d 100644
--- a/cups/http-addr.c
+++ b/cups/http-addr.c
@@ -1,29 +1,18 @@
/*
- * "$Id: http-addr.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-addr.c 12129 2014-08-28 19:26:31Z msweet $"
*
- * HTTP address routines for CUPS.
+ * HTTP address routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * Contents:
- *
- * httpAddrAny() - Check for the "any" address.
- * httpAddrEqual() - Compare two addresses.
- * httpAddrLocalhost() - Check for the local loopback address.
- * httpAddrLookup() - Lookup the hostname associated with the address.
- * _httpAddrPort() - Get the port number associated with an address.
- * _httpAddrSetPort() - Set the port number associated with an address.
- * httpAddrString() - Convert an IP address to a dotted string.
- * httpGetHostByName() - Lookup a hostname or IP address, and return
- * address records for the specified name.
- * httpGetHostname() - Get the FQDN for the local system.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -31,6 +20,7 @@
*/
#include "cups-private.h"
+#include <sys/stat.h>
#ifdef HAVE_RESOLV_H
# include <resolv.h>
#endif /* HAVE_RESOLV_H */
@@ -67,6 +57,37 @@ httpAddrAny(const http_addr_t *addr) /* I - Address to check */
/*
+ * 'httpAddrClose()' - Close a socket created by @link httpAddrConnect@ or
+ * @link httpAddrListen@.
+ *
+ * Pass @code NULL@ for sockets created with @link httpAddrConnect@ and the
+ * listen address for sockets created with @link httpAddrListen@. This will
+ * ensure that domain sockets are removed when closed.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 0 on success, -1 on failure */
+httpAddrClose(http_addr_t *addr, /* I - Listen address or @code NULL@ */
+ int fd) /* I - Socket file descriptor */
+{
+#ifdef WIN32
+ if (closesocket(fd))
+#else
+ if (close(fd))
+#endif /* WIN32 */
+ return (-1);
+
+#ifdef AF_LOCAL
+ if (addr && addr->addr.sa_family == AF_LOCAL)
+ return (unlink(addr->un.sun_path));
+#endif /* AF_LOCAL */
+
+ return (0);
+}
+
+
+/*
* 'httpAddrEqual()' - Compare two addresses.
*
* @since CUPS 1.2/OS X 10.5@
@@ -118,8 +139,7 @@ httpAddrLength(const http_addr_t *addr) /* I - Address */
#endif /* AF_INET6 */
#ifdef AF_LOCAL
if (addr->addr.sa_family == AF_LOCAL)
- return (offsetof(struct sockaddr_un, sun_path) +
- strlen(addr->un.sun_path) + 1);
+ return ((int)(offsetof(struct sockaddr_un, sun_path) + strlen(addr->un.sun_path) + 1));
else
#endif /* AF_LOCAL */
if (addr->addr.sa_family == AF_INET)
@@ -131,6 +151,133 @@ httpAddrLength(const http_addr_t *addr) /* I - Address */
/*
+ * 'httpAddrListen()' - Create a listening socket bound to the specified
+ * address and port.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - Socket or -1 on error */
+httpAddrListen(http_addr_t *addr, /* I - Address to bind to */
+ int port) /* I - Port number to bind to */
+{
+ int fd = -1, /* Socket */
+ val, /* Socket value */
+ status; /* Bind status */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!addr || port < 0)
+ return (-1);
+
+ /*
+ * Create the socket and set options...
+ */
+
+ if ((fd = socket(addr->addr.sa_family, SOCK_STREAM, 0)) < 0)
+ {
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+ return (-1);
+ }
+
+ val = 1;
+ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, CUPS_SOCAST &val, sizeof(val));
+
+#ifdef IPV6_V6ONLY
+ if (addr->addr.sa_family == AF_INET6)
+ setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, CUPS_SOCAST &val, sizeof(val));
+#endif /* IPV6_V6ONLY */
+
+ /*
+ * Bind the socket...
+ */
+
+#ifdef AF_LOCAL
+ if (addr->addr.sa_family == AF_LOCAL)
+ {
+ mode_t mask; /* Umask setting */
+
+ /*
+ * Remove any existing domain socket file...
+ */
+
+ unlink(addr->un.sun_path);
+
+ /*
+ * Save the current umask and set it to 0 so that all users can access
+ * the domain socket...
+ */
+
+ mask = umask(0);
+
+ /*
+ * Bind the domain socket...
+ */
+
+ status = bind(fd, (struct sockaddr *)addr, (socklen_t)httpAddrLength(addr));
+
+ /*
+ * Restore the umask and fix permissions...
+ */
+
+ umask(mask);
+ chmod(addr->un.sun_path, 0140777);
+ }
+ else
+#endif /* AF_LOCAL */
+ {
+ _httpAddrSetPort(addr, port);
+
+ status = bind(fd, (struct sockaddr *)addr, (socklen_t)httpAddrLength(addr));
+ }
+
+ if (status)
+ {
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+
+ close(fd);
+
+ return (-1);
+ }
+
+ /*
+ * Listen...
+ */
+
+ if (listen(fd, 5))
+ {
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+
+ close(fd);
+
+ return (-1);
+ }
+
+ /*
+ * Close on exec...
+ */
+
+#ifndef WIN32
+ fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
+#endif /* !WIN32 */
+
+#ifdef SO_NOSIGPIPE
+ /*
+ * Disable SIGPIPE for this socket.
+ */
+
+ val = 1;
+ setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val));
+#endif /* SO_NOSIGPIPE */
+
+ return (fd);
+}
+
+
+/*
* 'httpAddrLocalhost()' - Check for the local loopback address.
*
* @since CUPS 1.2/OS X 10.5@
@@ -162,13 +309,6 @@ httpAddrLocalhost(
}
-#ifdef __sgi
-# define ADDR_CAST (struct sockaddr *)
-#else
-# define ADDR_CAST (char *)
-#endif /* __sgi */
-
-
/*
* 'httpAddrLookup()' - Lookup the hostname associated with the address.
*
@@ -203,7 +343,7 @@ httpAddrLookup(
#ifdef AF_LOCAL
if (addr->addr.sa_family == AF_LOCAL)
{
- strlcpy(name, addr->un.sun_path, namelen);
+ strlcpy(name, addr->un.sun_path, (size_t)namelen);
return (name);
}
#endif /* AF_LOCAL */
@@ -214,7 +354,7 @@ httpAddrLookup(
if (httpAddrLocalhost(addr))
{
- strlcpy(name, "localhost", namelen);
+ strlcpy(name, "localhost", (size_t)namelen);
return (name);
}
@@ -249,8 +389,7 @@ httpAddrLookup(
* do...
*/
- int error = getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen,
- NULL, 0, 0);
+ int error = getnameinfo(&addr->addr, (socklen_t)httpAddrLength(addr), name, (socklen_t)namelen, NULL, 0, 0);
if (error)
{
@@ -267,11 +406,11 @@ httpAddrLookup(
# ifdef AF_INET6
if (addr->addr.sa_family == AF_INET6)
- host = gethostbyaddr(ADDR_CAST &(addr->ipv6.sin6_addr),
+ host = gethostbyaddr((char *)&(addr->ipv6.sin6_addr),
sizeof(struct in_addr), AF_INET6);
else
# endif /* AF_INET6 */
- host = gethostbyaddr(ADDR_CAST &(addr->ipv4.sin_addr),
+ host = gethostbyaddr((char *)&(addr->ipv4.sin_addr),
sizeof(struct in_addr), AF_INET);
if (host == NULL)
@@ -286,7 +425,7 @@ httpAddrLookup(
return (httpAddrString(addr, name, namelen));
}
- strlcpy(name, host->h_name, namelen);
+ strlcpy(name, host->h_name, (size_t)namelen);
}
#endif /* HAVE_GETNAMEINFO */
@@ -297,14 +436,30 @@ httpAddrLookup(
/*
- * '_httpAddrPort()' - Get the port number associated with an address.
+ * 'httpAddrFamily()' - Get the address family of an address.
+ */
+
+int /* O - Address family */
+httpAddrFamily(http_addr_t *addr) /* I - Address */
+{
+ if (addr)
+ return (addr->addr.sa_family);
+ else
+ return (0);
+}
+
+
+/*
+ * 'httpAddrPort()' - Get the port number associated with an address.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
int /* O - Port number */
-_httpAddrPort(http_addr_t *addr) /* I - Address */
+httpAddrPort(http_addr_t *addr) /* I - Address */
{
if (!addr)
- return (ippPort());
+ return (-1);
#ifdef AF_INET6
else if (addr->addr.sa_family == AF_INET6)
return (ntohs(addr->ipv6.sin6_port));
@@ -312,7 +467,7 @@ _httpAddrPort(http_addr_t *addr) /* I - Address */
else if (addr->addr.sa_family == AF_INET)
return (ntohs(addr->ipv4.sin_port));
else
- return (ippPort());
+ return (0);
}
@@ -366,9 +521,9 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
if (addr->addr.sa_family == AF_LOCAL)
{
if (addr->un.sun_path[0] == '/')
- strlcpy(s, addr->un.sun_path, slen);
+ strlcpy(s, addr->un.sun_path, (size_t)slen);
else
- strlcpy(s, "localhost", slen);
+ strlcpy(s, "localhost", (size_t)slen);
}
else
#endif /* AF_LOCAL */
@@ -376,10 +531,9 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
{
unsigned temp; /* Temporary address */
-
temp = ntohl(addr->ipv4.sin_addr.s_addr);
- snprintf(s, slen, "%d.%d.%d.%d", (temp >> 24) & 255,
+ snprintf(s, (size_t)slen, "%d.%d.%d.%d", (temp >> 24) & 255,
(temp >> 16) & 255, (temp >> 8) & 255, temp & 255);
}
#ifdef AF_INET6
@@ -389,8 +543,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
temps[64]; /* Temporary string for address */
# ifdef HAVE_GETNAMEINFO
- if (getnameinfo(&addr->addr, httpAddrLength(addr), temps, sizeof(temps),
- NULL, 0, NI_NUMERICHOST))
+ if (getnameinfo(&addr->addr, (socklen_t)httpAddrLength(addr), temps, sizeof(temps), NULL, 0, NI_NUMERICHOST))
{
/*
* If we get an error back, then the address type is not supported
@@ -421,8 +574,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
{
temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]);
- snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
- (temp >> 16) & 0xffff);
+ snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff);
prefix = ":";
sptr += strlen(sptr);
@@ -430,7 +582,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
if (temp || i == 3 || addr->ipv6.sin6_addr.s6_addr32[i + 1])
{
- snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, temp);
+ snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp);
sptr += strlen(sptr);
}
}
@@ -442,7 +594,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
if (i < 4)
{
- snprintf(sptr, sizeof(temps) - (sptr - temps), "%s:", prefix);
+ snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s:", prefix);
prefix = ":";
sptr += strlen(sptr);
@@ -453,13 +605,11 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
if ((temp & 0xffff0000) ||
(i > 0 && addr->ipv6.sin6_addr.s6_addr32[i - 1]))
{
- snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
- (temp >> 16) & 0xffff);
+ snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff);
sptr += strlen(sptr);
}
- snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
- temp & 0xffff);
+ snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp & 0xffff);
sptr += strlen(sptr);
}
}
@@ -477,7 +627,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
* Empty at end...
*/
- strlcpy(sptr, "::", sizeof(temps) - (sptr - temps));
+ strlcpy(sptr, "::", sizeof(temps) - (size_t)(sptr - temps));
}
}
# endif /* HAVE_GETNAMEINFO */
@@ -486,11 +636,11 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
* Add "[v1." and "]" around IPv6 address to convert to URI form.
*/
- snprintf(s, slen, "[v1.%s]", temps);
+ snprintf(s, (size_t)slen, "[v1.%s]", temps);
}
#endif /* AF_INET6 */
else
- strlcpy(s, "UNKNOWN", slen);
+ strlcpy(s, "UNKNOWN", (size_t)slen);
DEBUG_printf(("1httpAddrString: returning \"%s\"...", s));
@@ -499,6 +649,24 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
/*
+ * 'httpGetAddress()' - Get the address of the connected peer of a connection.
+ *
+ * Returns @code NULL@ if the socket is currently unconnected.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+http_addr_t * /* O - Connected address or @code NULL@ */
+httpGetAddress(http_t *http) /* I - HTTP connection */
+{
+ if (http)
+ return (http->hostaddr);
+ else
+ return (NULL);
+}
+
+
+/*
* 'httpGetHostByName()' - Lookup a hostname or IPv4 address, and return
* address records for the specified name.
*
@@ -547,7 +715,7 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
cg->hostent.h_name = (char *)name;
cg->hostent.h_aliases = NULL;
cg->hostent.h_addrtype = AF_LOCAL;
- cg->hostent.h_length = strlen(name) + 1;
+ cg->hostent.h_length = (int)strlen(name) + 1;
cg->hostent.h_addr_list = cg->ip_ptrs;
cg->ip_ptrs[0] = (char *)name;
cg->ip_ptrs[1] = NULL;
@@ -573,8 +741,9 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
if (ip[0] > 255 || ip[1] > 255 || ip[2] > 255 || ip[3] > 255)
return (NULL); /* Invalid byte ranges! */
- cg->ip_addr = htonl(((((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8) |
- ip[3]));
+ cg->ip_addr = htonl((((((((unsigned)ip[0] << 8) | (unsigned)ip[1]) << 8) |
+ (unsigned)ip[2]) << 8) |
+ (unsigned)ip[3]));
/*
* Fill in the host entry and return it...
@@ -610,7 +779,8 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
* 'httpGetHostname()' - Get the FQDN for the connection or local system.
*
* When "http" points to a connected socket, return the hostname or
- * address that was used in the call to httpConnect() or httpConnectEncrypt().
+ * address that was used in the call to httpConnect() or httpConnectEncrypt(),
+ * or the address of the client for the connection from httpAcceptConnection().
* Otherwise, return the FQDN for the local system using both gethostname()
* and gethostbyname() to get the local hostname with domain.
*
@@ -622,15 +792,19 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */
char *s, /* I - String buffer for name */
int slen) /* I - Size of buffer */
{
- if (!s || slen <= 1)
- return (NULL);
-
if (http)
{
- if (http->hostname[0] == '/')
- strlcpy(s, "localhost", slen);
+ if (!s || slen <= 1)
+ {
+ if (http->hostname[0] == '/')
+ return ("localhost");
+ else
+ return (http->hostname);
+ }
+ else if (http->hostname[0] == '/')
+ strlcpy(s, "localhost", (size_t)slen);
else
- strlcpy(s, http->hostname, slen);
+ strlcpy(s, http->hostname, (size_t)slen);
}
else
{
@@ -638,8 +812,11 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */
* Get the hostname...
*/
- if (gethostname(s, slen) < 0)
- strlcpy(s, "localhost", slen);
+ if (!s || slen <= 1)
+ return (NULL);
+
+ if (gethostname(s, (size_t)slen) < 0)
+ strlcpy(s, "localhost", (size_t)slen);
if (!strchr(s, '.'))
{
@@ -663,7 +840,7 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */
* Append ".local." to the hostname we get...
*/
- snprintf(s, slen, "%s.local.", localStr);
+ snprintf(s, (size_t)slen, "%s.local.", localStr);
}
if (local)
@@ -684,10 +861,17 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */
* Use the resolved hostname...
*/
- strlcpy(s, host->h_name, slen);
+ strlcpy(s, host->h_name, (size_t)slen);
}
#endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */
}
+
+ /*
+ * Make sure .local hostnames end with a period...
+ */
+
+ if (strlen(s) > 6 && !strcmp(s + strlen(s) - 6, ".local"))
+ strlcat(s, ".", (size_t)slen);
}
/*
@@ -699,5 +883,46 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */
/*
- * End of "$Id: http-addr.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'httpResolveHostname()' - Resolve the hostname of the HTTP connection
+ * address.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+const char * /* O - Resolved hostname or @code NULL@ */
+httpResolveHostname(http_t *http, /* I - HTTP connection */
+ char *buffer, /* I - Hostname buffer */
+ size_t bufsize) /* I - Size of buffer */
+{
+ if (!http)
+ return (NULL);
+
+ if (isdigit(http->hostname[0] & 255) || http->hostname[0] == '[')
+ {
+ char temp[1024]; /* Temporary string */
+
+ if (httpAddrLookup(http->hostaddr, temp, sizeof(temp)))
+ strlcpy(http->hostname, temp, sizeof(http->hostname));
+ else
+ return (NULL);
+ }
+
+ if (buffer)
+ {
+ if (http->hostname[0] == '/')
+ strlcpy(buffer, "localhost", bufsize);
+ else
+ strlcpy(buffer, http->hostname, bufsize);
+
+ return (buffer);
+ }
+ else if (http->hostname[0] == '/')
+ return ("localhost");
+ else
+ return (http->hostname);
+}
+
+
+/*
+ * End of "$Id: http-addr.c 12129 2014-08-28 19:26:31Z msweet $".
*/
diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c
index 7160007..b832148 100644
--- a/cups/http-addrlist.c
+++ b/cups/http-addrlist.c
@@ -1,24 +1,18 @@
/*
- * "$Id: http-addrlist.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-addrlist.c 11627 2014-02-20 16:15:09Z msweet $"
*
- * HTTP address list routines for CUPS.
+ * HTTP address list routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * Contents:
- *
- * httpAddrConnect() - Connect to any of the addresses in the list.
- * httpAddrConnect2() - Connect to any of the addresses in the list with a
- * timeout and optional cancel.
- * httpAddrFreeList() - Free an address list.
- * httpAddrGetList() - Get a list of addresses for a hostname.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -58,7 +52,7 @@ httpAddrConnect(
* 'httpAddrConnect2()' - Connect to any of the addresses in the list with a
* timeout and optional cancel.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.7/OS X 10.9@
*/
http_addrlist_t * /* O - Connected address or NULL on failure */
@@ -94,7 +88,7 @@ httpAddrConnect2(
if (!sock)
{
errno = EINVAL;
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
return (NULL);
}
@@ -119,9 +113,9 @@ httpAddrConnect2(
DEBUG_printf(("2httpAddrConnect2: Trying %s:%d...",
httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
- _httpAddrPort(&(addrlist->addr))));
+ httpAddrPort(&(addrlist->addr))));
- if ((*sock = (int)socket(_httpAddrFamily(&(addrlist->addr)), SOCK_STREAM,
+ if ((*sock = (int)socket(httpAddrFamily(&(addrlist->addr)), SOCK_STREAM,
0)) < 0)
{
/*
@@ -138,21 +132,16 @@ httpAddrConnect2(
*/
val = 1;
-#ifdef WIN32
- setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&val,
- sizeof(val));
-#else
- setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
-#endif /* WIN32 */
+ setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, CUPS_SOCAST &val, sizeof(val));
#ifdef SO_REUSEPORT
val = 1;
- setsockopt(*sock, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
+ setsockopt(*sock, SOL_SOCKET, SO_REUSEPORT, CUPS_SOCAST &val, sizeof(val));
#endif /* SO_REUSEPORT */
#ifdef SO_NOSIGPIPE
val = 1;
- setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val));
+ setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val));
#endif /* SO_NOSIGPIPE */
/*
@@ -161,12 +150,7 @@ httpAddrConnect2(
*/
val = 1;
-#ifdef WIN32
- setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&val,
- sizeof(val));
-#else
- setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
-#endif /* WIN32 */
+ setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, CUPS_SOCAST &val, sizeof(val));
#ifdef FD_CLOEXEC
/*
@@ -196,12 +180,11 @@ httpAddrConnect2(
* Then connect...
*/
- if (!connect(*sock, &(addrlist->addr.addr),
- httpAddrLength(&(addrlist->addr))))
+ if (!connect(*sock, &(addrlist->addr.addr), (socklen_t)httpAddrLength(&(addrlist->addr))))
{
DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...",
httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
- _httpAddrPort(&(addrlist->addr))));
+ httpAddrPort(&(addrlist->addr))));
#ifdef O_NONBLOCK
fcntl(*sock, F_SETFL, flags);
@@ -234,11 +217,7 @@ httpAddrConnect2(
DEBUG_puts("1httpAddrConnect2: Canceled connect()");
-# ifdef WIN32
- closesocket(*sock);
-# else
- close(*sock);
-# endif /* WIN32 */
+ httpAddrClose(NULL, *sock);
*sock = -1;
@@ -282,7 +261,7 @@ httpAddrConnect2(
{
DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...",
httpAddrString(&peer, temp, sizeof(temp)),
- _httpAddrPort(&peer)));
+ httpAddrPort(&peer)));
return (addrlist);
}
@@ -295,7 +274,7 @@ httpAddrConnect2(
DEBUG_printf(("1httpAddrConnect2: Unable to connect to %s:%d: %s",
httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
- _httpAddrPort(&(addrlist->addr)), strerror(errno)));
+ httpAddrPort(&(addrlist->addr)), strerror(errno)));
#ifndef WIN32
if (errno == EINPROGRESS)
@@ -306,11 +285,7 @@ httpAddrConnect2(
* Close this socket and move to the next address...
*/
-#ifdef WIN32
- closesocket(*sock);
-#else
- close(*sock);
-#endif /* WIN32 */
+ httpAddrClose(NULL, *sock);
*sock = -1;
addrlist = addrlist->next;
@@ -318,15 +293,65 @@ httpAddrConnect2(
if (!addrlist)
#ifdef WIN32
- _cupsSetError(IPP_SERVICE_UNAVAILABLE, "Connection failed", 0);
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, "Connection failed", 0);
#else
- _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, strerror(errno), 0);
#endif /* WIN32 */
return (addrlist);
}
+
+/*
+ * 'httpAddrCopyList()' - Copy an address list.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+http_addrlist_t * /* O - New address list or @code NULL@ on error */
+httpAddrCopyList(
+ http_addrlist_t *src) /* I - Source address list */
+{
+ http_addrlist_t *dst = NULL, /* First list entry */
+ *prev = NULL, /* Previous list entry */
+ *current = NULL;/* Current list entry */
+
+
+ while (src)
+ {
+ if ((current = malloc(sizeof(http_addrlist_t))) == NULL)
+ {
+ current = dst;
+
+ while (current)
+ {
+ prev = current;
+ current = current->next;
+
+ free(prev);
+ }
+
+ return (NULL);
+ }
+
+ memcpy(current, src, sizeof(http_addrlist_t));
+
+ current->next = NULL;
+
+ if (prev)
+ prev->next = current;
+ else
+ dst = current;
+
+ prev = current;
+ src = src->next;
+ }
+
+ return (dst);
+}
+
+
/*
* 'httpAddrFreeList()' - Free an address list.
*
@@ -423,6 +448,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL)
{
+ addr = first;
first->addr.un.sun_family = AF_LOCAL;
strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path));
}
@@ -508,7 +534,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
if (!temp)
{
httpAddrFreeList(first);
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
return (NULL);
}
@@ -543,7 +569,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
if (error == EAI_FAIL)
cg->need_res_init = 1;
- _cupsSetError(IPP_INTERNAL_ERROR, gai_strerror(error), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gai_strerror(error), 0);
}
#else
@@ -606,9 +632,10 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
return (NULL);
first->addr.ipv4.sin_family = AF_INET;
- first->addr.ipv4.sin_addr.s_addr = htonl(((((((ip[0] << 8) |
- ip[1]) << 8) |
- ip[2]) << 8) | ip[3]));
+ first->addr.ipv4.sin_addr.s_addr = htonl((((((((unsigned)ip[0] << 8) |
+ (unsigned)ip[1]) << 8) |
+ (unsigned)ip[2]) << 8) |
+ (unsigned)ip[3]));
first->addr.ipv4.sin_port = htons(portnum);
}
}
@@ -667,7 +694,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
if (h_errno == NO_RECOVERY)
cg->need_res_init = 1;
- _cupsSetError(IPP_INTERNAL_ERROR, hstrerror(h_errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, hstrerror(h_errno), 0);
}
}
#endif /* HAVE_GETADDRINFO */
@@ -707,7 +734,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
{
httpAddrFreeList(first);
- _cupsSetError(IPP_INTERNAL_ERROR, _("Unknown service name."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown service name."), 1);
return (NULL);
}
@@ -730,7 +757,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -759,7 +786,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -791,7 +818,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -815,7 +842,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -841,5 +868,5 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
/*
- * End of "$Id: http-addrlist.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http-addrlist.c 11627 2014-02-20 16:15:09Z msweet $".
*/
diff --git a/cups/http-private.h b/cups/http-private.h
index a99b381..3393e87 100644
--- a/cups/http-private.h
+++ b/cups/http-private.h
@@ -1,18 +1,18 @@
/*
- * "$Id: http-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-private.h 12645 2015-05-20 01:20:52Z msweet $"
*
- * Private HTTP definitions for CUPS.
+ * Private HTTP definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_HTTP_PRIVATE_H_
@@ -23,6 +23,7 @@
*/
# include "config.h"
+# include <cups/language.h>
# include <stddef.h>
# include <stdlib.h>
@@ -34,11 +35,12 @@
# ifdef WIN32
# include <io.h>
# include <winsock2.h>
+# define CUPS_SOCAST (const char *)
# else
# include <unistd.h>
# include <fcntl.h>
# include <sys/socket.h>
-# define closesocket(f) close(f)
+# define CUPS_SOCAST
# endif /* WIN32 */
# ifdef HAVE_GSSAPI
@@ -58,27 +60,22 @@
# include <Security/Authorization.h>
# endif /* HAVE_AUTHORIZATION_H */
-# if defined(__sgi) || (defined(__APPLE__) && !defined(_SOCKLEN_T))
+# if defined(__APPLE__) && !defined(_SOCKLEN_T)
/*
- * IRIX and MacOS X 10.2.x do not define socklen_t, and in fact use an int instead of
+ * MacOS X 10.2.x does not define socklen_t, and in fact uses an int instead of
* unsigned type for length values...
*/
typedef int socklen_t;
-# endif /* __sgi || (__APPLE__ && !_SOCKLEN_T) */
+# endif /* __APPLE__ && !_SOCKLEN_T */
# include <cups/http.h>
# include "md5-private.h"
# include "ipp-private.h"
-# if defined HAVE_LIBSSL
-# include <openssl/err.h>
-# include <openssl/rand.h>
-# include <openssl/ssl.h>
-# elif defined HAVE_GNUTLS
+# ifdef HAVE_GNUTLS
# include <gnutls/gnutls.h>
# include <gnutls/x509.h>
-# include <gcrypt.h>
# elif defined(HAVE_CDSASSL)
# include <CoreFoundation/CoreFoundation.h>
# include <Security/Security.h>
@@ -96,6 +93,19 @@ typedef int socklen_t;
# include <Security/SecCertificate.h>
# include <Security/SecIdentity.h>
# endif /* HAVE_SECCERTIFICATE_H */
+# ifdef HAVE_SECCERTIFICATEPRIV_H
+# include <Security/SecCertificatePriv.h>
+# else
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
+extern SecCertificateRef SecCertificateCreateWithBytes(CFAllocatorRef allocator, const UInt8 *bytes, CFIndex length);
+extern bool SecCertificateIsValid(SecCertificateRef certificate, CFAbsoluteTime verifyTime);
+extern CFAbsoluteTime SecCertificateNotValidAfter(SecCertificateRef certificate);
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
+# endif /* HAVE_SECCERTIFICATEPRIV_H */
# ifdef HAVE_SECITEMPRIV_H
# include <Security/SecItemPriv.h>
# endif /* HAVE_SECITEMPRIV_H */
@@ -106,11 +116,17 @@ typedef int socklen_t;
# include <Security/SecPolicyPriv.h>
# endif /* HAVE_SECPOLICYPRIV_H */
# elif defined(HAVE_SSPISSL)
-# include "sspi-private.h"
-# endif /* HAVE_LIBSSL */
+# include <wincrypt.h>
+# include <wintrust.h>
+# include <schannel.h>
+# define SECURITY_WIN32
+# include <security.h>
+# include <sspi.h>
+# endif /* HAVE_GNUTLS */
# ifndef WIN32
# include <net/if.h>
+# include <resolv.h>
# ifdef HAVE_GETIFADDRS
# include <ifaddrs.h>
# else
@@ -121,6 +137,10 @@ typedef int socklen_t;
# endif /* HAVE_GETIFADDRS */
# endif /* !WIN32 */
+# ifdef HAVE_LIBZ
+# include <zlib.h>
+# endif /* HAVE_LIBZ */
+
/*
* C++ magic...
@@ -136,40 +156,30 @@ extern "C" {
*/
+#define _HTTP_MAX_SBUFFER 65536 /* Size of (de)compression buffer */
#define _HTTP_RESOLVE_DEFAULT 0 /* Just resolve with default options */
#define _HTTP_RESOLVE_STDERR 1 /* Log resolve progress to stderr */
#define _HTTP_RESOLVE_FQDN 2 /* Resolve to a FQDN */
#define _HTTP_RESOLVE_FAXOUT 4 /* Resolve FaxOut service? */
+#define _HTTP_TLS_NONE 0 /* No TLS options */
+#define _HTTP_TLS_ALLOW_RC4 1 /* Allow RC4 cipher suites */
+#define _HTTP_TLS_ALLOW_SSL3 2 /* Allow SSL 3.0 */
+#define _HTTP_TLS_ALLOW_DH 4 /* Allow DH/DHE key negotiation */
+#define _HTTP_TLS_DENY_TLS10 16 /* Deny TLS 1.0 */
-/*
- * Types and functions for SSL support...
- */
-# if defined HAVE_LIBSSL
/*
- * The OpenSSL library provides its own SSL/TLS context structure for its
- * IO and protocol management. However, we need to provide our own BIO
- * (basic IO) implementation to do timeouts...
+ * Types and functions for SSL support...
*/
-typedef SSL *http_tls_t;
-typedef void *http_tls_credentials_t;
-
-extern BIO_METHOD *_httpBIOMethods(void);
-
-# elif defined HAVE_GNUTLS
+# ifdef HAVE_GNUTLS
/*
* The GNU TLS library is more of a "bare metal" SSL/TLS library...
*/
-typedef gnutls_session http_tls_t;
-typedef void *http_tls_credentials_t;
-
-extern ssize_t _httpReadGNUTLS(gnutls_transport_ptr ptr, void *data,
- size_t length);
-extern ssize_t _httpWriteGNUTLS(gnutls_transport_ptr ptr, const void *data,
- size_t length);
+typedef gnutls_session_t http_tls_t;
+typedef gnutls_certificate_credentials_t *http_tls_credentials_t;
# elif defined(HAVE_CDSASSL)
/*
@@ -180,10 +190,6 @@ extern ssize_t _httpWriteGNUTLS(gnutls_transport_ptr ptr, const void *data,
# if !defined(HAVE_SECBASEPRIV_H) && defined(HAVE_CSSMERRORSTRING) /* Declare prototype for function in that header... */
extern const char *cssmErrorString(int error);
# endif /* !HAVE_SECBASEPRIV_H && HAVE_CSSMERRORSTRING */
-# ifndef HAVE_SECITEMPRIV_H /* Declare constants from that header... */
-extern const CFTypeRef kSecClassCertificate;
-extern const CFTypeRef kSecClassIdentity;
-# endif /* !HAVE_SECITEMPRIV_H */
# if !defined(HAVE_SECIDENTITYSEARCHPRIV_H) && defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) /* Declare prototype for function in that header... */
extern OSStatus SecIdentitySearchCreateWithPolicy(SecPolicyRef policy,
CFStringRef idString, CSSM_KEYUSE keyUsage,
@@ -199,18 +205,31 @@ extern OSStatus SecPolicySetValue(SecPolicyRef policyRef,
typedef SSLContextRef http_tls_t;
typedef CFArrayRef http_tls_credentials_t;
-extern OSStatus _httpReadCDSA(SSLConnectionRef connection, void *data,
- size_t *dataLength);
-extern OSStatus _httpWriteCDSA(SSLConnectionRef connection, const void *data,
- size_t *dataLength);
-
# elif defined(HAVE_SSPISSL)
/*
* Windows' SSPI library gets a CUPS wrapper...
*/
-typedef _sspi_struct_t * http_tls_t;
-typedef void *http_tls_credentials_t;
+typedef struct _http_sspi_s /**** SSPI/SSL data structure ****/
+{
+ CredHandle creds; /* Credentials */
+ CtxtHandle context; /* SSL context */
+ BOOL contextInitialized; /* Is context init'd? */
+ SecPkgContext_StreamSizes streamSizes;/* SSL data stream sizes */
+ BYTE *decryptBuffer; /* Data pre-decryption*/
+ size_t decryptBufferLength; /* Length of decrypt buffer */
+ size_t decryptBufferUsed; /* Bytes used in buffer */
+ BYTE *readBuffer; /* Data post-decryption */
+ int readBufferLength; /* Length of read buffer */
+ int readBufferUsed; /* Bytes used in buffer */
+ BYTE *writeBuffer; /* Data pre-encryption */
+ int writeBufferLength; /* Length of write buffer */
+ PCCERT_CONTEXT localCert, /* Local certificate */
+ remoteCert; /* Remote (peer's) certificate */
+ char error[256]; /* Most recent error message */
+} _http_sspi_t;
+typedef _http_sspi_t *http_tls_t;
+typedef PCCERT_CONTEXT http_tls_credentials_t;
# else
/*
@@ -219,9 +238,25 @@ typedef void *http_tls_credentials_t;
typedef void *http_tls_t;
typedef void *http_tls_credentials_t;
-# endif /* HAVE_LIBSSL */
+# endif /* HAVE_GNUTLS */
-struct _http_s /**** HTTP connection structure. ****/
+typedef enum _http_coding_e /**** HTTP content coding enumeration ****/
+{
+ _HTTP_CODING_IDENTITY, /* No content coding */
+ _HTTP_CODING_GZIP, /* LZ77+gzip decompression */
+ _HTTP_CODING_DEFLATE, /* LZ77+zlib compression */
+ _HTTP_CODING_GUNZIP, /* LZ77+gzip decompression */
+ _HTTP_CODING_INFLATE /* LZ77+zlib decompression */
+} _http_coding_t;
+
+typedef enum _http_mode_e /**** HTTP mode enumeration ****/
+{
+ _HTTP_MODE_CLIENT, /* Client connected to server */
+ _HTTP_MODE_SERVER /* Server connected (accepted) from client */
+} _http_mode_t;
+
+# ifndef _HTTP_NO_PRIVATE
+struct _http_s /**** HTTP connection structure ****/
{
int fd; /* File descriptor for this socket */
int blocking; /* To block or not to block */
@@ -234,31 +269,34 @@ struct _http_s /**** HTTP connection structure. ****/
struct sockaddr_in _hostaddr; /* Address of connected host (deprecated) */
char hostname[HTTP_MAX_HOST],
/* Name of connected host */
- fields[HTTP_FIELD_MAX][HTTP_MAX_VALUE];
- /* Field values */
+ fields[HTTP_FIELD_ACCEPT_ENCODING][HTTP_MAX_VALUE];
+ /* Field values up to Accept-Encoding */
char *data; /* Pointer to data buffer */
http_encoding_t data_encoding; /* Chunked or not */
int _data_remaining;/* Number of bytes left (deprecated) */
int used; /* Number of bytes used in buffer */
char buffer[HTTP_MAX_BUFFER];
/* Buffer for incoming data */
- int auth_type; /* Authentication in use */
+ int _auth_type; /* Authentication in use (deprecated) */
_cups_md5_state_t md5_state; /* MD5 state */
char nonce[HTTP_MAX_VALUE];
/* Nonce value */
int nonce_count; /* Nonce count */
http_tls_t tls; /* TLS state information */
http_encryption_t encryption; /* Encryption requirements */
+
/**** New in CUPS 1.1.19 ****/
fd_set *input_set; /* select() set for httpWait() (deprecated) */
http_status_t expect; /* Expect: header */
char *cookie; /* Cookie value(s) */
+
/**** New in CUPS 1.1.20 ****/
char _authstring[HTTP_MAX_VALUE],
- /* Current Authentication value (deprecated) */
+ /* Current Authorization value (deprecated) */
userpass[HTTP_MAX_VALUE];
/* Username:password string */
int digest_tries; /* Number of tries for digest auth */
+
/**** New in CUPS 1.2 ****/
off_t data_remaining; /* Number of bytes left */
http_addr_t *hostaddr; /* Current host address and port */
@@ -266,10 +304,11 @@ struct _http_s /**** HTTP connection structure. ****/
char wbuffer[HTTP_MAX_BUFFER];
/* Buffer for outgoing data */
int wused; /* Write buffer bytes used */
+
/**** New in CUPS 1.3 ****/
char *field_authorization;
/* Authorization field */
- char *authstring; /* Current authorization field */
+ char *authstring; /* Current Authorization field */
# ifdef HAVE_GSSAPI
gss_OID gssmech; /* Authentication mechanism */
gss_ctx_id_t gssctx; /* Authentication context */
@@ -278,6 +317,7 @@ struct _http_s /**** HTTP connection structure. ****/
# ifdef HAVE_AUTHORIZATION_H
AuthorizationRef auth_ref; /* Authorization ref */
# endif /* HAVE_AUTHORIZATION_H */
+
/**** New in CUPS 1.5 ****/
http_tls_credentials_t tls_credentials;
/* TLS credentials */
@@ -288,7 +328,25 @@ struct _http_s /**** HTTP connection structure. ****/
# ifdef HAVE_GSSAPI
char gsshost[256]; /* Hostname for Kerberos */
# endif /* HAVE_GSSAPI */
+
+ /**** New in CUPS 1.7 ****/
+ int tls_upgrade; /* Non-zero if we are doing an upgrade */
+ _http_mode_t mode; /* _HTTP_MODE_CLIENT or _HTTP_MODE_SERVER */
+ char *accept_encoding,
+ /* Accept-Encoding field */
+ *allow, /* Allow field */
+ *server, /* Server field */
+ *default_accept_encoding,
+ *default_server,
+ *default_user_agent;
+ /* Default field values */
+# ifdef HAVE_LIBZ
+ _http_coding_t coding; /* _HTTP_CODING_xxx */
+ z_stream stream; /* (De)compression stream */
+ Bytef *sbuffer; /* (De)compression buffer */
+# endif /* HAVE_LIBZ */
};
+# endif /* !_HTTP_NO_PRIVATE */
/*
@@ -298,11 +356,6 @@ struct _http_s /**** HTTP connection structure. ****/
# ifndef HAVE_HSTRERROR
extern const char *_cups_hstrerror(int error);
# define hstrerror _cups_hstrerror
-# elif defined(_AIX) || defined(__osf__)
-/*
- * AIX and Tru64 UNIX don't provide a prototype but do provide the function...
- */
-extern const char *hstrerror(int error);
# endif /* !HAVE_HSTRERROR */
@@ -352,16 +405,7 @@ extern void _cups_freeifaddrs(struct ifaddrs *addrs);
* Prototypes...
*/
-#define _httpAddrFamily(addrp) (addrp)->addr.sa_family
-extern int _httpAddrPort(http_addr_t *addr);
extern void _httpAddrSetPort(http_addr_t *addr, int port);
-extern char *_httpAssembleUUID(const char *server, int port,
- const char *name, int number,
- char *buffer, size_t bufsize);
-extern http_t *_httpCreate(const char *host, int port,
- http_addrlist_t *addrlist,
- http_encryption_t encryption,
- int family);
extern http_tls_credentials_t
_httpCreateCredentials(cups_array_t *credentials);
extern char *_httpDecodeURI(char *dst, const char *src,
@@ -370,11 +414,19 @@ extern void _httpDisconnect(http_t *http);
extern char *_httpEncodeURI(char *dst, const char *src,
size_t dstsize);
extern void _httpFreeCredentials(http_tls_credentials_t credentials);
-extern ssize_t _httpPeek(http_t *http, char *buffer, size_t length);
extern const char *_httpResolveURI(const char *uri, char *resolved_uri,
size_t resolved_size, int options,
int (*cb)(void *context),
void *context);
+extern const char *_httpStatus(cups_lang_t *lang, http_status_t status);
+extern void _httpTLSInitialize(void);
+extern size_t _httpTLSPending(http_t *http);
+extern int _httpTLSRead(http_t *http, char *buf, int len);
+extern int _httpTLSSetCredentials(http_t *http);
+extern void _httpTLSSetOptions(int options);
+extern int _httpTLSStart(http_t *http);
+extern void _httpTLSStop(http_t *http);
+extern int _httpTLSWrite(http_t *http, const char *buf, int len);
extern int _httpUpdate(http_t *http, http_status_t *status);
extern int _httpWait(http_t *http, int msec, int usessl);
@@ -390,5 +442,5 @@ extern int _httpWait(http_t *http, int msec, int usessl);
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
/*
- * End of "$Id: http-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http-private.h 12645 2015-05-20 01:20:52Z msweet $".
*/
diff --git a/cups/http-support.c b/cups/http-support.c
index d15d904..1670b02 100644
--- a/cups/http-support.c
+++ b/cups/http-support.c
@@ -1,52 +1,18 @@
/*
- * "$Id: http-support.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-support.c 12970 2015-11-13 20:02:51Z msweet $"
*
- * HTTP support routines for CUPS.
+ * HTTP support routines for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * httpAssembleURI() - Assemble a uniform resource identifier from its
- * components.
- * httpAssembleURIf() - Assemble a uniform resource identifier from its
- * components with a formatted resource.
- * _httpAssembleUUID() - Make a UUID URI conforming to RFC 4122.
- * httpDecode64() - Base64-decode a string.
- * httpDecode64_2() - Base64-decode a string.
- * httpEncode64() - Base64-encode a string.
- * httpEncode64_2() - Base64-encode a string.
- * httpGetDateString() - Get a formatted date/time string from a time value.
- * httpGetDateString2() - Get a formatted date/time string from a time value.
- * httpGetDateTime() - Get a time value from a formatted date/time string.
- * httpSeparate() - Separate a Universal Resource Identifier into its
- * components.
- * httpSeparate2() - Separate a Universal Resource Identifier into its
- * components.
- * httpSeparateURI() - Separate a Universal Resource Identifier into its
- * components.
- * httpStatus() - Return a short string describing a HTTP status
- * code.
- * _cups_hstrerror() - hstrerror() emulation function for Solaris and
- * others.
- * _httpDecodeURI() - Percent-decode a HTTP request URI.
- * _httpEncodeURI() - Percent-encode a HTTP request URI.
- * _httpResolveURI() - Resolve a DNS-SD URI.
- * http_client_cb() - Client callback for resolving URI.
- * http_copy_decode() - Copy and decode a URI.
- * http_copy_encode() - Copy and encode a URI.
- * http_poll_cb() - Wait for input on the specified file descriptors.
- * http_resolve_cb() - Build a device URI for the given service name.
- * http_resolve_cb() - Build a device URI for the given service name.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -83,6 +49,7 @@ typedef struct _http_uribuf_s /* URI buffer */
size_t bufsize; /* Size of buffer */
int options; /* Options passed to _httpResolveURI */
const char *resource; /* Resource from URI */
+ const char *uuid; /* UUID from URI */
} _http_uribuf_t;
@@ -90,7 +57,7 @@ typedef struct _http_uribuf_s /* URI buffer */
* Local globals...
*/
-static const char * const http_days[7] =
+static const char * const http_days[7] =/* Days of the week */
{
"Sun",
"Mon",
@@ -101,7 +68,7 @@ static const char * const http_days[7] =
"Sat"
};
static const char * const http_months[12] =
- {
+ { /* Months of the year */
"Jan",
"Feb",
"Mar",
@@ -115,6 +82,26 @@ static const char * const http_months[12] =
"Nov",
"Dec"
};
+static const char * const http_states[] =
+ { /* HTTP state strings */
+ "HTTP_STATE_ERROR",
+ "HTTP_STATE_WAITING",
+ "HTTP_STATE_OPTIONS",
+ "HTTP_STATE_GET",
+ "HTTP_STATE_GET_SEND",
+ "HTTP_STATE_HEAD",
+ "HTTP_STATE_POST",
+ "HTTP_STATE_POST_RECV",
+ "HTTP_STATE_POST_SEND",
+ "HTTP_STATE_PUT",
+ "HTTP_STATE_PUT_RECV",
+ "HTTP_STATE_DELETE",
+ "HTTP_STATE_TRACE",
+ "HTTP_STATE_CONNECT",
+ "HTTP_STATE_STATUS",
+ "HTTP_STATE_UNKNOWN_METHOD",
+ "HTTP_STATE_UNKNOWN_VERSION"
+ };
/*
@@ -192,7 +179,7 @@ httpAssembleURI(
if (uri)
*uri = '\0';
- return (HTTP_URI_BAD_ARGUMENTS);
+ return (HTTP_URI_STATUS_BAD_ARGUMENTS);
}
/*
@@ -205,10 +192,10 @@ httpAssembleURI(
if (!ptr)
goto assemble_overflow;
- if (!strcmp(scheme, "mailto"))
+ if (!strcmp(scheme, "geo") || !strcmp(scheme, "mailto") || !strcmp(scheme, "tel"))
{
/*
- * mailto: only has :, no //...
+ * geo:, mailto:, and tel: only have :, no //...
*/
if (ptr < end)
@@ -219,7 +206,7 @@ httpAssembleURI(
else
{
/*
- * Schemes other than mailto: all have //...
+ * Schemes other than geo:, mailto:, and tel: typically have //...
*/
if ((ptr + 2) < end)
@@ -371,7 +358,7 @@ httpAssembleURI(
if (port > 0)
{
- snprintf(ptr, end - ptr + 1, ":%d", port);
+ snprintf(ptr, (size_t)(end - ptr + 1), ":%d", port);
ptr += strlen(ptr);
if (ptr >= end)
@@ -421,7 +408,7 @@ httpAssembleURI(
*ptr = '\0';
- return (HTTP_URI_OK);
+ return (HTTP_URI_STATUS_OK);
/*
* Clear the URI string and return an overflow error; I don't usually
@@ -431,7 +418,7 @@ httpAssembleURI(
assemble_overflow:
*uri = '\0';
- return (HTTP_URI_OVERFLOW);
+ return (HTTP_URI_STATUS_OVERFLOW);
}
@@ -474,7 +461,7 @@ httpAssembleURIf(
if (uri)
*uri = '\0';
- return (HTTP_URI_BAD_ARGUMENTS);
+ return (HTTP_URI_STATUS_BAD_ARGUMENTS);
}
/*
@@ -485,10 +472,10 @@ httpAssembleURIf(
bytes = vsnprintf(resource, sizeof(resource), resourcef, ap);
va_end(ap);
- if (bytes >= sizeof(resource))
+ if ((size_t)bytes >= sizeof(resource))
{
*uri = '\0';
- return (HTTP_URI_OVERFLOW);
+ return (HTTP_URI_STATUS_OVERFLOW);
}
else
return (httpAssembleURI(encoding, uri, urilen, scheme, username, host,
@@ -497,18 +484,24 @@ httpAssembleURIf(
/*
- * '_httpAssembleUUID()' - Make a UUID URI conforming to RFC 4122.
+ * 'httpAssembleUUID()' - Assemble a name-based UUID URN conforming to RFC 4122.
+ *
+ * This function creates a unique 128-bit identifying number using the server
+ * name, port number, random data, and optionally an object name and/or object
+ * number. The result is formatted as a UUID URN as defined in RFC 4122.
*
* The buffer needs to be at least 46 bytes in size.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
char * /* I - UUID string */
-_httpAssembleUUID(const char *server, /* I - Server name */
- int port, /* I - Port number */
- const char *name, /* I - Object name or NULL */
- int number, /* I - Object number or 0 */
- char *buffer, /* I - String buffer */
- size_t bufsize) /* I - Size of buffer */
+httpAssembleUUID(const char *server, /* I - Server name */
+ int port, /* I - Port number */
+ const char *name, /* I - Object name or NULL */
+ int number, /* I - Object number or 0 */
+ char *buffer, /* I - String buffer */
+ size_t bufsize) /* I - Size of buffer */
{
char data[1024]; /* Source string for MD5 */
_cups_md5_state_t md5state; /* MD5 state */
@@ -527,7 +520,7 @@ _httpAssembleUUID(const char *server, /* I - Server name */
(unsigned)CUPS_RAND() & 0xffff, (unsigned)CUPS_RAND() & 0xffff);
_cupsMD5Init(&md5state);
- _cupsMD5Append(&md5state, (unsigned char *)data, strlen(data));
+ _cupsMD5Append(&md5state, (unsigned char *)data, (int)strlen(data));
_cupsMD5Finish(&md5state, md5sum);
/*
@@ -583,10 +576,10 @@ httpDecode64_2(char *out, /* I - String to write to */
int *outlen, /* IO - Size of output string */
const char *in) /* I - String to read from */
{
- int pos, /* Bit position */
- base64; /* Value of this character */
- char *outptr, /* Output pointer */
- *outend; /* End of output buffer */
+ int pos; /* Bit position */
+ unsigned base64; /* Value of this character */
+ char *outptr, /* Output pointer */
+ *outend; /* End of output buffer */
/*
@@ -615,11 +608,11 @@ httpDecode64_2(char *out, /* I - String to write to */
*/
if (*in >= 'A' && *in <= 'Z')
- base64 = *in - 'A';
+ base64 = (unsigned)(*in - 'A');
else if (*in >= 'a' && *in <= 'z')
- base64 = *in - 'a' + 26;
+ base64 = (unsigned)(*in - 'a' + 26);
else if (*in >= '0' && *in <= '9')
- base64 = *in - '0' + 52;
+ base64 = (unsigned)(*in - '0' + 52);
else if (*in == '+')
base64 = 62;
else if (*in == '/')
@@ -637,26 +630,26 @@ httpDecode64_2(char *out, /* I - String to write to */
{
case 0 :
if (outptr < outend)
- *outptr = base64 << 2;
+ *outptr = (char)(base64 << 2);
pos ++;
break;
case 1 :
if (outptr < outend)
- *outptr++ |= (base64 >> 4) & 3;
+ *outptr++ |= (char)((base64 >> 4) & 3);
if (outptr < outend)
- *outptr = (base64 << 4) & 255;
+ *outptr = (char)((base64 << 4) & 255);
pos ++;
break;
case 2 :
if (outptr < outend)
- *outptr++ |= (base64 >> 2) & 15;
+ *outptr++ |= (char)((base64 >> 2) & 15);
if (outptr < outend)
- *outptr = (base64 << 6) & 255;
+ *outptr = (char)((base64 << 6) & 255);
pos ++;
break;
case 3 :
if (outptr < outend)
- *outptr++ |= base64;
+ *outptr++ |= (char)base64;
pos = 0;
break;
}
@@ -816,10 +809,7 @@ httpGetDateString2(time_t t, /* I - UNIX time */
tdate = gmtime(&t);
if (tdate)
- snprintf(s, slen, "%s, %02d %s %d %02d:%02d:%02d GMT",
- http_days[tdate->tm_wday], tdate->tm_mday,
- http_months[tdate->tm_mon], tdate->tm_year + 1900,
- tdate->tm_hour, tdate->tm_min, tdate->tm_sec);
+ snprintf(s, (size_t)slen, "%s, %02d %s %d %02d:%02d:%02d GMT", http_days[tdate->tm_wday], tdate->tm_mday, http_months[tdate->tm_mon], tdate->tm_year + 1900, tdate->tm_hour, tdate->tm_min, tdate->tm_sec);
else
s[0] = '\0';
@@ -997,16 +987,16 @@ httpSeparateURI(
if (!uri || !port || !scheme || schemelen <= 0 || !username ||
usernamelen <= 0 || !host || hostlen <= 0 || !resource ||
resourcelen <= 0)
- return (HTTP_URI_BAD_ARGUMENTS);
+ return (HTTP_URI_STATUS_BAD_ARGUMENTS);
if (!*uri)
- return (HTTP_URI_BAD_URI);
+ return (HTTP_URI_STATUS_BAD_URI);
/*
* Grab the scheme portion of the URI...
*/
- status = HTTP_URI_OK;
+ status = HTTP_URI_STATUS_OK;
if (!strncmp(uri, "//", 2))
{
@@ -1014,8 +1004,8 @@ httpSeparateURI(
* Workaround for HP IPP client bug...
*/
- strlcpy(scheme, "ipp", schemelen);
- status = HTTP_URI_MISSING_SCHEME;
+ strlcpy(scheme, "ipp", (size_t)schemelen);
+ status = HTTP_URI_STATUS_MISSING_SCHEME;
}
else if (*uri == '/')
{
@@ -1023,8 +1013,8 @@ httpSeparateURI(
* Filename...
*/
- strlcpy(scheme, "file", schemelen);
- status = HTTP_URI_MISSING_SCHEME;
+ strlcpy(scheme, "file", (size_t)schemelen);
+ status = HTTP_URI_STATUS_MISSING_SCHEME;
}
else
{
@@ -1046,7 +1036,7 @@ httpSeparateURI(
if (*uri != ':')
{
*scheme = '\0';
- return (HTTP_URI_BAD_SCHEME);
+ return (HTTP_URI_STATUS_BAD_SCHEME);
}
uri ++;
@@ -1066,8 +1056,8 @@ httpSeparateURI(
*port = 515;
else if (!strcmp(scheme, "socket")) /* Not yet registered with IANA... */
*port = 9100;
- else if (strcmp(scheme, "file") && strcmp(scheme, "mailto"))
- status = HTTP_URI_UNKNOWN_SCHEME;
+ else if (strcmp(scheme, "file") && strcmp(scheme, "mailto") && strcmp(scheme, "tel"))
+ status = HTTP_URI_STATUS_UNKNOWN_SCHEME;
/*
* Now see if we have a hostname...
@@ -1097,7 +1087,7 @@ httpSeparateURI(
if (!uri)
{
*username = '\0';
- return (HTTP_URI_BAD_USERNAME);
+ return (HTTP_URI_STATUS_BAD_USERNAME);
}
uri ++;
@@ -1128,7 +1118,7 @@ httpSeparateURI(
if (*uri != '.')
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
uri ++;
@@ -1140,7 +1130,7 @@ httpSeparateURI(
if (!uri)
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
/*
@@ -1150,7 +1140,7 @@ httpSeparateURI(
if (*uri != ']')
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
uri ++;
@@ -1176,7 +1166,7 @@ httpSeparateURI(
else if (*ptr != ':' && *ptr != '.' && !isxdigit(*ptr & 255))
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
}
else
@@ -1197,7 +1187,7 @@ httpSeparateURI(
"\\", *ptr)) /* SMB domain */
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
/*
@@ -1210,7 +1200,7 @@ httpSeparateURI(
if (!uri)
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
}
@@ -1222,7 +1212,7 @@ httpSeparateURI(
if (!strcmp(scheme, "file") && strcmp(host, "localhost") && host[0])
{
*host = '\0';
- return (HTTP_URI_BAD_HOSTNAME);
+ return (HTTP_URI_STATUS_BAD_HOSTNAME);
}
/*
@@ -1238,15 +1228,21 @@ httpSeparateURI(
if (!isdigit(uri[1] & 255))
{
*port = 0;
- return (HTTP_URI_BAD_PORT);
+ return (HTTP_URI_STATUS_BAD_PORT);
}
- *port = strtol(uri + 1, (char **)&uri, 10);
+ *port = (int)strtol(uri + 1, (char **)&uri, 10);
+
+ if (*port <= 0 || *port > 65535)
+ {
+ *port = 0;
+ return (HTTP_URI_STATUS_BAD_PORT);
+ }
if (*uri != '/' && *uri)
{
*port = 0;
- return (HTTP_URI_BAD_PORT);
+ return (HTTP_URI_STATUS_BAD_PORT);
}
}
}
@@ -1261,7 +1257,7 @@ httpSeparateURI(
* Hostname but no path...
*/
- status = HTTP_URI_MISSING_RESOURCE;
+ status = HTTP_URI_STATUS_MISSING_RESOURCE;
*resource = '/';
/*
@@ -1296,7 +1292,7 @@ httpSeparateURI(
if (!uri)
{
*resource = '\0';
- return (HTTP_URI_BAD_RESOURCE);
+ return (HTTP_URI_STATUS_BAD_RESOURCE);
}
/*
@@ -1308,95 +1304,107 @@ httpSeparateURI(
/*
- * 'httpStatus()' - Return a short string describing a HTTP status code.
+ * 'httpStateString()' - Return the string describing a HTTP state value.
*
- * The returned string is localized to the current POSIX locale and is based
- * on the status strings defined in RFC 2616.
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+const char * /* O - State string */
+httpStateString(http_state_t state) /* I - HTTP state value */
+{
+ if (state < HTTP_STATE_ERROR || state > HTTP_STATE_UNKNOWN_VERSION)
+ return ("HTTP_STATE_???");
+ else
+ return (http_states[state - HTTP_STATE_ERROR]);
+}
+
+
+/*
+ * '_httpStatus()' - Return the localized string describing a HTTP status code.
+ *
+ * The returned string is localized using the passed message catalog.
*/
const char * /* O - Localized status string */
-httpStatus(http_status_t status) /* I - HTTP status code */
+_httpStatus(cups_lang_t *lang, /* I - Language */
+ http_status_t status) /* I - HTTP status code */
{
const char *s; /* Status string */
- _cups_globals_t *cg = _cupsGlobals(); /* Global data */
-
- if (!cg->lang_default)
- cg->lang_default = cupsLangDefault();
switch (status)
{
- case HTTP_ERROR :
+ case HTTP_STATUS_ERROR :
s = strerror(errno);
break;
- case HTTP_CONTINUE :
+ case HTTP_STATUS_CONTINUE :
s = _("Continue");
break;
- case HTTP_SWITCHING_PROTOCOLS :
+ case HTTP_STATUS_SWITCHING_PROTOCOLS :
s = _("Switching Protocols");
break;
- case HTTP_OK :
+ case HTTP_STATUS_OK :
s = _("OK");
break;
- case HTTP_CREATED :
+ case HTTP_STATUS_CREATED :
s = _("Created");
break;
- case HTTP_ACCEPTED :
+ case HTTP_STATUS_ACCEPTED :
s = _("Accepted");
break;
- case HTTP_NO_CONTENT :
+ case HTTP_STATUS_NO_CONTENT :
s = _("No Content");
break;
- case HTTP_MOVED_PERMANENTLY :
+ case HTTP_STATUS_MOVED_PERMANENTLY :
s = _("Moved Permanently");
break;
- case HTTP_SEE_OTHER :
+ case HTTP_STATUS_SEE_OTHER :
s = _("See Other");
break;
- case HTTP_NOT_MODIFIED :
+ case HTTP_STATUS_NOT_MODIFIED :
s = _("Not Modified");
break;
- case HTTP_BAD_REQUEST :
+ case HTTP_STATUS_BAD_REQUEST :
s = _("Bad Request");
break;
- case HTTP_UNAUTHORIZED :
- case HTTP_AUTHORIZATION_CANCELED :
+ case HTTP_STATUS_UNAUTHORIZED :
+ case HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED :
s = _("Unauthorized");
break;
- case HTTP_FORBIDDEN :
+ case HTTP_STATUS_FORBIDDEN :
s = _("Forbidden");
break;
- case HTTP_NOT_FOUND :
+ case HTTP_STATUS_NOT_FOUND :
s = _("Not Found");
break;
- case HTTP_REQUEST_TOO_LARGE :
+ case HTTP_STATUS_REQUEST_TOO_LARGE :
s = _("Request Entity Too Large");
break;
- case HTTP_URI_TOO_LONG :
+ case HTTP_STATUS_URI_TOO_LONG :
s = _("URI Too Long");
break;
- case HTTP_UPGRADE_REQUIRED :
+ case HTTP_STATUS_UPGRADE_REQUIRED :
s = _("Upgrade Required");
break;
- case HTTP_NOT_IMPLEMENTED :
+ case HTTP_STATUS_NOT_IMPLEMENTED :
s = _("Not Implemented");
break;
- case HTTP_NOT_SUPPORTED :
+ case HTTP_STATUS_NOT_SUPPORTED :
s = _("Not Supported");
break;
- case HTTP_EXPECTATION_FAILED :
+ case HTTP_STATUS_EXPECTATION_FAILED :
s = _("Expectation Failed");
break;
- case HTTP_SERVICE_UNAVAILABLE :
+ case HTTP_STATUS_SERVICE_UNAVAILABLE :
s = _("Service Unavailable");
break;
- case HTTP_SERVER_ERROR :
+ case HTTP_STATUS_SERVER_ERROR :
s = _("Internal Server Error");
break;
- case HTTP_PKI_ERROR :
+ case HTTP_STATUS_CUPS_PKI_ERROR :
s = _("SSL/TLS Negotiation Error");
break;
- case HTTP_WEBIF_DISABLED :
+ case HTTP_STATUS_CUPS_WEBIF_DISABLED :
s = _("Web Interface is Disabled");
break;
@@ -1405,6 +1413,90 @@ httpStatus(http_status_t status) /* I - HTTP status code */
break;
}
+ return (_cupsLangString(lang, s));
+}
+
+
+/*
+ * 'httpStatus()' - Return a short string describing a HTTP status code.
+ *
+ * The returned string is localized to the current POSIX locale and is based
+ * on the status strings defined in RFC 2616.
+ */
+
+const char * /* O - Localized status string */
+httpStatus(http_status_t status) /* I - HTTP status code */
+{
+ _cups_globals_t *cg = _cupsGlobals(); /* Global data */
+
+
+ if (!cg->lang_default)
+ cg->lang_default = cupsLangDefault();
+
+ return (_httpStatus(cg->lang_default, status));
+}
+
+/*
+ * 'httpURIStatusString()' - Return a string describing a URI status code.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+const char * /* O - Localized status string */
+httpURIStatusString(
+ http_uri_status_t status) /* I - URI status code */
+{
+ const char *s; /* Status string */
+ _cups_globals_t *cg = _cupsGlobals(); /* Global data */
+
+
+ if (!cg->lang_default)
+ cg->lang_default = cupsLangDefault();
+
+ switch (status)
+ {
+ case HTTP_URI_STATUS_OVERFLOW :
+ s = _("URI too large");
+ break;
+ case HTTP_URI_STATUS_BAD_ARGUMENTS :
+ s = _("Bad arguments to function");
+ break;
+ case HTTP_URI_STATUS_BAD_RESOURCE :
+ s = _("Bad resource in URI");
+ break;
+ case HTTP_URI_STATUS_BAD_PORT :
+ s = _("Bad port number in URI");
+ break;
+ case HTTP_URI_STATUS_BAD_HOSTNAME :
+ s = _("Bad hostname/address in URI");
+ break;
+ case HTTP_URI_STATUS_BAD_USERNAME :
+ s = _("Bad username in URI");
+ break;
+ case HTTP_URI_STATUS_BAD_SCHEME :
+ s = _("Bad scheme in URI");
+ break;
+ case HTTP_URI_STATUS_BAD_URI :
+ s = _("Bad/empty URI");
+ break;
+ case HTTP_URI_STATUS_OK :
+ s = _("OK");
+ break;
+ case HTTP_URI_STATUS_MISSING_SCHEME :
+ s = _("Missing scheme in URI");
+ break;
+ case HTTP_URI_STATUS_UNKNOWN_SCHEME :
+ s = _("Unknown scheme in URI");
+ break;
+ case HTTP_URI_STATUS_MISSING_RESOURCE :
+ s = _("Missing resource in URI");
+ break;
+
+ default:
+ s = _("Unknown");
+ break;
+ }
+
return (_cupsLangString(cg->lang_default, s));
}
@@ -1500,12 +1592,12 @@ _httpResolveURI(
if ((status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme,
sizeof(scheme), userpass, sizeof(userpass),
hostname, sizeof(hostname), &port, resource,
- sizeof(resource))) < HTTP_URI_OK)
+ sizeof(resource))) < HTTP_URI_STATUS_OK)
#else
if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme,
sizeof(scheme), userpass, sizeof(userpass),
hostname, sizeof(hostname), &port, resource,
- sizeof(resource)) < HTTP_URI_OK)
+ sizeof(resource)) < HTTP_URI_STATUS_OK)
#endif /* DEBUG */
{
if (options & _HTTP_RESOLVE_STDERR)
@@ -1524,7 +1616,9 @@ _httpResolveURI(
{
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
char *regtype, /* Pointer to type in hostname */
- *domain; /* Pointer to domain in hostname */
+ *domain, /* Pointer to domain in hostname */
+ *uuid, /* Pointer to UUID in URI */
+ *uuidend; /* Pointer to end of UUID in URI */
_http_uribuf_t uribuf; /* URI buffer */
int offline = 0; /* offline-report state set? */
# ifdef HAVE_DNSSD
@@ -1532,9 +1626,11 @@ _httpResolveURI(
# pragma comment(lib, "dnssd.lib")
# endif /* WIN32 */
DNSServiceRef ref, /* DNS-SD master service reference */
- domainref, /* DNS-SD service reference for domain */
+ domainref = NULL,/* DNS-SD service reference for domain */
+ ippref = NULL, /* DNS-SD service reference for network IPP */
+ ippsref = NULL, /* DNS-SD service reference for network IPPS */
localref; /* DNS-SD service reference for .local */
- int domainsent = 0; /* Send the domain resolve? */
+ int extrasent = 0; /* Send the domain/IPP/IPPS resolves? */
# ifdef HAVE_POLL
struct pollfd polldata; /* Polling data */
# else /* select() */
@@ -1581,12 +1677,21 @@ _httpResolveURI(
if (domain)
*domain++ = '\0';
+ if ((uuid = strstr(resource, "?uuid=")) != NULL)
+ {
+ *uuid = '\0';
+ uuid += 6;
+ if ((uuidend = strchr(uuid, '&')) != NULL)
+ *uuidend = '\0';
+ }
+
+ resolved_uri[0] = '\0';
+
uribuf.buffer = resolved_uri;
uribuf.bufsize = resolved_size;
uribuf.options = options;
uribuf.resource = resource;
-
- resolved_uri[0] = '\0';
+ uribuf.uuid = uuid;
DEBUG_printf(("6_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", "
"domain=\"%s\"\n", hostname, regtype, domain));
@@ -1602,10 +1707,16 @@ _httpResolveURI(
# ifdef HAVE_DNSSD
if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError)
{
+ uint32_t myinterface = kDNSServiceInterfaceIndexAny;
+ /* Lookup on any interface */
+
+ if (!strcmp(scheme, "ippusb"))
+ myinterface = kDNSServiceInterfaceIndexLocalOnly;
+
localref = ref;
if (DNSServiceResolve(&localref,
- kDNSServiceFlagsShareConnection, 0, hostname, regtype,
- "local.", http_resolve_cb,
+ kDNSServiceFlagsShareConnection, myinterface,
+ hostname, regtype, "local.", http_resolve_cb,
&uribuf) == kDNSServiceErr_NoError)
{
int fds; /* Number of ready descriptors */
@@ -1617,7 +1728,7 @@ _httpResolveURI(
while (time(NULL) < end_time)
{
if (options & _HTTP_RESOLVE_STDERR)
- _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer."));
+ _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer..."));
if (cb && !(*cb)(context))
{
@@ -1636,7 +1747,7 @@ _httpResolveURI(
polldata.fd = DNSServiceRefSockFD(ref);
polldata.events = POLLIN;
- fds = poll(&polldata, 1, 1000 * timeout);
+ fds = poll(&polldata, 1, (int)(1000 * timeout));
# else /* select() */
FD_ZERO(&input_set);
@@ -1668,7 +1779,7 @@ _httpResolveURI(
* comes in, do an additional domain resolution...
*/
- if (domainsent == 0 && domain && _cups_strcasecmp(domain, "local."))
+ if (extrasent == 0 && domain && _cups_strcasecmp(domain, "local."))
{
if (options & _HTTP_RESOLVE_STDERR)
fprintf(stderr,
@@ -1679,10 +1790,36 @@ _httpResolveURI(
domainref = ref;
if (DNSServiceResolve(&domainref,
kDNSServiceFlagsShareConnection,
- 0, hostname, regtype, domain,
+ myinterface, hostname, regtype, domain,
http_resolve_cb,
&uribuf) == kDNSServiceErr_NoError)
- domainsent = 1;
+ extrasent = 1;
+ }
+ else if (extrasent == 0 && !strcmp(scheme, "ippusb"))
+ {
+ if (options & _HTTP_RESOLVE_STDERR)
+ fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"_ipps._tcp\", domain=\"local.\"...\n", hostname);
+
+ ippsref = ref;
+ if (DNSServiceResolve(&ippsref,
+ kDNSServiceFlagsShareConnection,
+ kDNSServiceInterfaceIndexAny, hostname,
+ "_ipps._tcp", domain, http_resolve_cb,
+ &uribuf) == kDNSServiceErr_NoError)
+ extrasent = 1;
+ }
+ else if (extrasent == 1 && !strcmp(scheme, "ippusb"))
+ {
+ if (options & _HTTP_RESOLVE_STDERR)
+ fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"_ipp._tcp\", domain=\"local.\"...\n", hostname);
+
+ ippref = ref;
+ if (DNSServiceResolve(&ippref,
+ kDNSServiceFlagsShareConnection,
+ kDNSServiceInterfaceIndexAny, hostname,
+ "_ipp._tcp", domain, http_resolve_cb,
+ &uribuf) == kDNSServiceErr_NoError)
+ extrasent = 2;
}
/*
@@ -1699,7 +1836,8 @@ _httpResolveURI(
}
else
{
- if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
+ if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError &&
+ resolved_uri[0])
{
uri = resolved_uri;
break;
@@ -1707,8 +1845,15 @@ _httpResolveURI(
}
}
- if (domainsent)
- DNSServiceRefDeallocate(domainref);
+ if (extrasent)
+ {
+ if (domainref)
+ DNSServiceRefDeallocate(domainref);
+ if (ippref)
+ DNSServiceRefDeallocate(ippref);
+ if (ippsref)
+ DNSServiceRefDeallocate(ippsref);
+ }
DNSServiceRefDeallocate(localref);
}
@@ -1807,7 +1952,7 @@ _httpResolveURI(
#endif /* HAVE_DNSSD || HAVE_AVAHI */
if ((options & _HTTP_RESOLVE_STDERR) && !uri)
- _cupsLangPrintFilter(stderr, "ERROR", _("Unable to find printer."));
+ _cupsLangPrintFilter(stderr, "INFO", _("Unable to find printer."));
}
else
{
@@ -1900,7 +2045,7 @@ http_copy_decode(char *dst, /* O - Destination buffer */
else
quoted |= *src - '0';
- *ptr++ = quoted;
+ *ptr++ = (char)quoted;
}
else
{
@@ -2013,6 +2158,31 @@ http_resolve_cb(
txtRecord, context));
/*
+ * If we have a UUID, compare it...
+ */
+
+ if (uribuf->uuid &&
+ (value = TXTRecordGetValuePtr(txtLen, txtRecord, "UUID",
+ &valueLen)) != NULL)
+ {
+ char uuid[256]; /* UUID value */
+
+ memcpy(uuid, value, valueLen);
+ uuid[valueLen] = '\0';
+
+ if (_cups_strcasecmp(uuid, uribuf->uuid))
+ {
+ if (uribuf->options & _HTTP_RESOLVE_STDERR)
+ fprintf(stderr, "DEBUG: Found UUID %s, looking for %s.", uuid,
+ uribuf->uuid);
+
+ DEBUG_printf(("7http_resolve_cb: Found UUID %s, looking for %s.", uuid,
+ uribuf->uuid));
+ return;
+ }
+ }
+
+ /*
* Figure out the scheme from the full name...
*/
@@ -2036,7 +2206,8 @@ http_resolve_cb(
*/
if ((uribuf->options & _HTTP_RESOLVE_FAXOUT) &&
- (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")))
+ (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) &&
+ !TXTRecordGetValuePtr(txtLen, txtRecord, "printer-type", &valueLen))
{
reskey = "rfo";
resdefault = "/ipp/faxout";
@@ -2102,9 +2273,7 @@ http_resolve_cb(
{
for (addr = addrlist; addr; addr = addr->next)
{
- int error = getnameinfo(&(addr->addr.addr),
- httpAddrLength(&(addr->addr)),
- fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
+ int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
if (!error)
{
@@ -2135,12 +2304,9 @@ http_resolve_cb(
if ((!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) &&
!strcmp(uribuf->resource, "/cups"))
- httpAssembleURIf(HTTP_URI_CODING_ALL, uribuf->buffer, uribuf->bufsize,
- scheme, NULL, hostTarget, ntohs(port), "%s?snmp=false",
- resource);
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uribuf->buffer, (int)uribuf->bufsize, scheme, NULL, hostTarget, ntohs(port), "%s?snmp=false", resource);
else
- httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, uribuf->bufsize,
- scheme, NULL, hostTarget, ntohs(port), resource);
+ httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, (int)uribuf->bufsize, scheme, NULL, hostTarget, ntohs(port), resource);
DEBUG_printf(("8http_resolve_cb: Resolved URI is \"%s\"...", uribuf->buffer));
}
@@ -2216,6 +2382,31 @@ http_resolve_cb(
}
/*
+ * If we have a UUID, compare it...
+ */
+
+ if (uribuf->uuid && (pair = avahi_string_list_find(txt, "UUID")) != NULL)
+ {
+ char uuid[256]; /* UUID value */
+
+ avahi_string_list_get_pair(pair, NULL, &value, &valueLen);
+
+ memcpy(uuid, value, valueLen);
+ uuid[valueLen] = '\0';
+
+ if (_cups_strcasecmp(uuid, uribuf->uuid))
+ {
+ if (uribuf->options & _HTTP_RESOLVE_STDERR)
+ fprintf(stderr, "DEBUG: Found UUID %s, looking for %s.", uuid,
+ uribuf->uuid);
+
+ DEBUG_printf(("7http_resolve_cb: Found UUID %s, looking for %s.", uuid,
+ uribuf->uuid));
+ return;
+ }
+ }
+
+ /*
* Figure out the scheme from the full name...
*/
@@ -2252,7 +2443,8 @@ http_resolve_cb(
*/
if ((uribuf->options & _HTTP_RESOLVE_FAXOUT) &&
- (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")))
+ (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) &&
+ !avahi_string_list_find(txt, "printer-type"))
{
reskey = "rfo";
resdefault = "/ipp/faxout";
@@ -2319,9 +2511,7 @@ http_resolve_cb(
{
for (addr = addrlist; addr; addr = addr->next)
{
- int error = getnameinfo(&(addr->addr.addr),
- httpAddrLength(&(addr->addr)),
- fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
+ int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
if (!error)
{
@@ -2360,5 +2550,5 @@ http_resolve_cb(
/*
- * End of "$Id: http-support.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http-support.c 12970 2015-11-13 20:02:51Z msweet $".
*/
diff --git a/cups/http.c b/cups/http.c
index 5c77d3d..e5e7be5 100644
--- a/cups/http.c
+++ b/cups/http.c
@@ -1,123 +1,21 @@
/*
- * "$Id: http.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http.c 12970 2015-11-13 20:02:51Z msweet $"
*
- * HTTP routines for CUPS.
+ * HTTP routines for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * This file contains Kerberos support code, copyright 2006 by
- * Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * httpAddCredential() - Allocates and adds a single credential to an
- * array.
- * _httpBIOMethods() - Get the OpenSSL BIO methods for HTTP
- * connections.
- * httpBlocking() - Set blocking/non-blocking behavior on a
- * connection.
- * httpCheck() - Check to see if there is a pending response
- * from the server.
- * httpClearCookie() - Clear the cookie value(s).
- * httpClearFields() - Clear HTTP request fields.
- * httpClose() - Close an HTTP connection.
- * httpConnect() - Connect to a HTTP server.
- * httpConnectEncrypt() - Connect to a HTTP server using encryption.
- * httpCopyCredentials() - Copy the credentials associated with an
- * encrypted connection.
- * _httpCreate() - Create an unconnected HTTP connection.
- * _httpCreateCredentials() - Create credentials in the internal format.
- * httpDelete() - Send a DELETE request to the server.
- * _httpDisconnect() - Disconnect a HTTP connection.
- * httpEncryption() - Set the required encryption on the link.
- * httpError() - Get the last error on a connection.
- * httpFlush() - Flush data from a HTTP connection.
- * httpFlushWrite() - Flush data in write buffer.
- * _httpFreeCredentials() - Free internal credentials.
- * httpFreeCredentials() - Free an array of credentials.
- * httpGet() - Send a GET request to the server.
- * httpGetAuthString() - Get the current authorization string.
- * httpGetBlocking() - Get the blocking/non-block state of a
- * connection.
- * httpGetCookie() - Get any cookie data from the response.
- * httpGetFd() - Get the file descriptor associated with a
- * connection.
- * httpGetField() - Get a field value from a request/response.
- * httpGetLength() - Get the amount of data remaining from the
- * content-length or transfer-encoding fields.
- * httpGetLength2() - Get the amount of data remaining from the
- * content-length or transfer-encoding fields.
- * httpGets() - Get a line of text from a HTTP connection.
- * httpGetState() - Get the current state of the HTTP request.
- * httpGetStatus() - Get the status of the last HTTP request.
- * httpGetSubField() - Get a sub-field value.
- * httpGetSubField2() - Get a sub-field value.
- * httpGetVersion() - Get the HTTP version at the other end.
- * httpHead() - Send a HEAD request to the server.
- * httpInitialize() - Initialize the HTTP interface library and set
- * the default HTTP proxy (if any).
- * httpOptions() - Send an OPTIONS request to the server.
- * _httpPeek() - Peek at data from a HTTP connection.
- * httpPost() - Send a POST request to the server.
- * httpPrintf() - Print a formatted string to a HTTP connection.
- * httpPut() - Send a PUT request to the server.
- * httpRead() - Read data from a HTTP connection.
- * httpRead2() - Read data from a HTTP connection.
- * _httpReadCDSA() - Read function for the CDSA library.
- * _httpReadGNUTLS() - Read function for the GNU TLS library.
- * httpReconnect() - Reconnect to a HTTP server.
- * httpReconnect2() - Reconnect to a HTTP server with timeout and
- * optional cancel.
- * httpSetAuthString() - Set the current authorization string.
- * httpSetCredentials() - Set the credentials associated with an
- * encrypted connection.
- * httpSetCookie() - Set the cookie value(s).
- * httpSetExpect() - Set the Expect: header in a request.
- * httpSetField() - Set the value of an HTTP header.
- * httpSetLength() - Set the content-length and content-encoding.
- * httpSetTimeout() - Set read/write timeouts and an optional
- * callback.
- * httpTrace() - Send an TRACE request to the server.
- * _httpUpdate() - Update the current HTTP status for incoming
- * data.
- * httpUpdate() - Update the current HTTP state for incoming
- * data.
- * _httpWait() - Wait for data available on a connection (no
- * flush).
- * httpWait() - Wait for data available on a connection.
- * httpWrite() - Write data to a HTTP connection.
- * httpWrite2() - Write data to a HTTP connection.
- * _httpWriteCDSA() - Write function for the CDSA library.
- * _httpWriteGNUTLS() - Write function for the GNU TLS library.
- * http_bio_ctrl() - Control the HTTP connection.
- * http_bio_free() - Free OpenSSL data.
- * http_bio_new() - Initialize an OpenSSL BIO structure.
- * http_bio_puts() - Send a string for OpenSSL.
- * http_bio_read() - Read data for OpenSSL.
- * http_bio_write() - Write data for OpenSSL.
- * http_debug_hex() - Do a hex dump of a buffer.
- * http_field() - Return the field index for a field name.
- * http_read_ssl() - Read from a SSL/TLS connection.
- * http_send() - Send a request with all fields and the trailing
- * blank line.
- * http_set_credentials() - Set the SSL/TLS credentials.
- * http_set_timeout() - Set the socket timeout values.
- * http_set_wait() - Set the default wait value for reads.
- * http_setup_ssl() - Set up SSL/TLS support on a connection.
- * http_shutdown_ssl() - Shut down SSL/TLS on a connection.
- * http_upgrade() - Force upgrade to TLS encryption.
- * http_write() - Write a buffer to a HTTP connection.
- * http_write_chunk() - Write a chunked buffer.
- * http_write_ssl() - Write to a SSL/TLS connection.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -133,7 +31,6 @@
# include <signal.h>
# include <sys/time.h>
# include <sys/resource.h>
-# include <sys/utsname.h>
#endif /* WIN32 */
#ifdef HAVE_POLL
# include <poll.h>
@@ -144,30 +41,34 @@
* Local functions...
*/
+#ifdef HAVE_LIBZ
+static void http_content_coding_finish(http_t *http);
+static void http_content_coding_start(http_t *http,
+ const char *value);
+#endif /* HAVE_LIBZ */
+static http_t *http_create(const char *host, int port,
+ http_addrlist_t *addrlist, int family,
+ http_encryption_t encryption,
+ int blocking, _http_mode_t mode);
#ifdef DEBUG
static void http_debug_hex(const char *prefix, const char *buffer,
int bytes);
#endif /* DEBUG */
-static http_field_t http_field(const char *name);
+static ssize_t http_read(http_t *http, char *buffer, size_t length);
+static ssize_t http_read_buffered(http_t *http, char *buffer, size_t length);
+static ssize_t http_read_chunk(http_t *http, char *buffer, size_t length);
static int http_send(http_t *http, http_state_t request,
const char *uri);
-static int http_write(http_t *http, const char *buffer,
- int length);
-static int http_write_chunk(http_t *http, const char *buffer,
- int length);
-#ifdef HAVE_SSL
-static int http_read_ssl(http_t *http, char *buf, int len);
-# if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
-static int http_set_credentials(http_t *http);
-# endif /* HAVE_CDSASSL ** HAVE_SECCERTIFICATECOPYDATA */
-#endif /* HAVE_SSL */
+static ssize_t http_write(http_t *http, const char *buffer,
+ size_t length);
+static ssize_t http_write_chunk(http_t *http, const char *buffer,
+ size_t length);
+static off_t http_set_length(http_t *http);
static void http_set_timeout(int fd, double timeout);
static void http_set_wait(http_t *http);
+
#ifdef HAVE_SSL
-static int http_setup_ssl(http_t *http);
-static void http_shutdown_ssl(http_t *http);
-static int http_upgrade(http_t *http);
-static int http_write_ssl(http_t *http, const char *buf, int len);
+static int http_tls_upgrade(http_t *http);
#endif /* HAVE_SSL */
@@ -203,55 +104,100 @@ static const char * const http_fields[] =
"Transfer-Encoding",
"Upgrade",
"User-Agent",
- "WWW-Authenticate"
+ "WWW-Authenticate",
+ "Accept-Encoding",
+ "Allow",
+ "Server"
};
-#ifdef DEBUG
-static const char * const http_states[] =
- {
- "HTTP_WAITING",
- "HTTP_OPTIONS",
- "HTTP_GET",
- "HTTP_GET_SEND",
- "HTTP_HEAD",
- "HTTP_POST",
- "HTTP_POST_RECV",
- "HTTP_POST_SEND",
- "HTTP_PUT",
- "HTTP_PUT_RECV",
- "HTTP_DELETE",
- "HTTP_TRACE",
- "HTTP_CLOSE",
- "HTTP_STATUS"
- };
-#endif /* DEBUG */
-#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
/*
- * BIO methods for OpenSSL...
+ * 'httpAcceptConnection()' - Accept a new HTTP client connection from the
+ * specified listening socket.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-static int http_bio_write(BIO *h, const char *buf, int num);
-static int http_bio_read(BIO *h, char *buf, int size);
-static int http_bio_puts(BIO *h, const char *str);
-static long http_bio_ctrl(BIO *h, int cmd, long arg1, void *arg2);
-static int http_bio_new(BIO *h);
-static int http_bio_free(BIO *data);
+http_t * /* O - HTTP connection or @code NULL@ */
+httpAcceptConnection(int fd, /* I - Listen socket file descriptor */
+ int blocking) /* I - 1 if the connection should be
+ blocking, 0 otherwise */
+{
+ http_t *http; /* HTTP connection */
+ http_addrlist_t addrlist; /* Dummy address list */
+ socklen_t addrlen; /* Length of address */
+ int val; /* Socket option value */
-static BIO_METHOD http_bio_methods =
- {
- BIO_TYPE_SOCKET,
- "http",
- http_bio_write,
- http_bio_read,
- http_bio_puts,
- NULL, /* http_bio_gets, */
- http_bio_ctrl,
- http_bio_new,
- http_bio_free,
- NULL,
- };
-#endif /* HAVE_SSL && HAVE_LIBSSL */
+
+ /*
+ * Range check input...
+ */
+
+ if (fd < 0)
+ return (NULL);
+
+ /*
+ * Create the client connection...
+ */
+
+ memset(&addrlist, 0, sizeof(addrlist));
+
+ if ((http = http_create(NULL, 0, &addrlist, AF_UNSPEC,
+ HTTP_ENCRYPTION_IF_REQUESTED, blocking,
+ _HTTP_MODE_SERVER)) == NULL)
+ return (NULL);
+
+ /*
+ * Accept the client and get the remote address...
+ */
+
+ addrlen = sizeof(http_addr_t);
+
+ if ((http->fd = accept(fd, (struct sockaddr *)&(http->addrlist->addr),
+ &addrlen)) < 0)
+ {
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+ httpClose(http);
+
+ return (NULL);
+ }
+
+ http->hostaddr = &(http->addrlist->addr);
+
+ if (httpAddrLocalhost(http->hostaddr))
+ strlcpy(http->hostname, "localhost", sizeof(http->hostname));
+ else
+ httpAddrString(http->hostaddr, http->hostname, sizeof(http->hostname));
+
+#ifdef SO_NOSIGPIPE
+ /*
+ * Disable SIGPIPE for this socket.
+ */
+
+ val = 1;
+ setsockopt(http->fd, SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val));
+#endif /* SO_NOSIGPIPE */
+
+ /*
+ * Using TCP_NODELAY improves responsiveness, especially on systems
+ * with a slow loopback interface. Since we write large buffers
+ * when sending print files and requests, there shouldn't be any
+ * performance penalty for this...
+ */
+
+ val = 1;
+ setsockopt(http->fd, IPPROTO_TCP, TCP_NODELAY, CUPS_SOCAST &val, sizeof(val));
+
+#ifdef FD_CLOEXEC
+ /*
+ * Close this socket when starting another process...
+ */
+
+ fcntl(http->fd, F_SETFD, FD_CLOEXEC);
+#endif /* FD_CLOEXEC */
+
+ return (http);
+}
/*
@@ -289,25 +235,12 @@ httpAddCredential(
}
-#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
-/*
- * '_httpBIOMethods()' - Get the OpenSSL BIO methods for HTTP connections.
- */
-
-BIO_METHOD * /* O - BIO methods for OpenSSL */
-_httpBIOMethods(void)
-{
- return (&http_bio_methods);
-}
-#endif /* HAVE_SSL && HAVE_LIBSSL */
-
-
/*
* 'httpBlocking()' - Set blocking/non-blocking behavior on a connection.
*/
void
-httpBlocking(http_t *http, /* I - Connection to server */
+httpBlocking(http_t *http, /* I - HTTP connection */
int b) /* I - 1 = blocking, 0 = non-blocking */
{
if (http)
@@ -323,7 +256,7 @@ httpBlocking(http_t *http, /* I - Connection to server */
*/
int /* O - 0 = no data, 1 = data available */
-httpCheck(http_t *http) /* I - Connection to server */
+httpCheck(http_t *http) /* I - HTTP connection */
{
return (httpWait(http, 0));
}
@@ -336,7 +269,7 @@ httpCheck(http_t *http) /* I - Connection to server */
*/
void
-httpClearCookie(http_t *http) /* I - Connection to server */
+httpClearCookie(http_t *http) /* I - HTTP connection */
{
if (!http)
return;
@@ -354,15 +287,21 @@ httpClearCookie(http_t *http) /* I - Connection to server */
*/
void
-httpClearFields(http_t *http) /* I - Connection to server */
+httpClearFields(http_t *http) /* I - HTTP connection */
{
+ DEBUG_printf(("httpClearFields(http=%p)", http));
+
if (http)
{
memset(http->fields, 0, sizeof(http->fields));
- if (http->hostname[0] == '/')
- httpSetField(http, HTTP_FIELD_HOST, "localhost");
- else
- httpSetField(http, HTTP_FIELD_HOST, http->hostname);
+
+ if (http->mode == _HTTP_MODE_CLIENT)
+ {
+ if (http->hostname[0] == '/')
+ httpSetField(http, HTTP_FIELD_HOST, "localhost");
+ else
+ httpSetField(http, HTTP_FIELD_HOST, http->hostname);
+ }
if (http->field_authorization)
{
@@ -370,6 +309,24 @@ httpClearFields(http_t *http) /* I - Connection to server */
http->field_authorization = NULL;
}
+ if (http->accept_encoding)
+ {
+ _cupsStrFree(http->accept_encoding);
+ http->accept_encoding = NULL;
+ }
+
+ if (http->allow)
+ {
+ _cupsStrFree(http->allow);
+ http->allow = NULL;
+ }
+
+ if (http->server)
+ {
+ _cupsStrFree(http->server);
+ http->server = NULL;
+ }
+
http->expect = (http_status_t)0;
}
}
@@ -380,7 +337,7 @@ httpClearFields(http_t *http) /* I - Connection to server */
*/
void
-httpClose(http_t *http) /* I - Connection to server */
+httpClose(http_t *http) /* I - HTTP connection */
{
#ifdef HAVE_GSSAPI
OM_uint32 minor_status; /* Minor status code */
@@ -434,9 +391,33 @@ httpClose(http_t *http) /* I - Connection to server */
/*
+ * 'httpCompareCredentials()' - Compare two sets of X.509 credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 if they match, 0 if they do not */
+httpCompareCredentials(
+ cups_array_t *cred1, /* I - First set of X.509 credentials */
+ cups_array_t *cred2) /* I - Second set of X.509 credentials */
+{
+ http_credential_t *temp1, *temp2; /* Temporary credentials */
+
+
+ for (temp1 = (http_credential_t *)cupsArrayFirst(cred1), temp2 = (http_credential_t *)cupsArrayFirst(cred2); temp1 && temp2; temp1 = (http_credential_t *)cupsArrayNext(cred1), temp2 = (http_credential_t *)cupsArrayNext(cred2))
+ if (temp1->datalen != temp2->datalen)
+ return (0);
+ else if (memcmp(temp1->data, temp2->data, temp1->datalen))
+ return (0);
+
+ return (temp1 == temp2);
+}
+
+
+/*
* 'httpConnect()' - Connect to a HTTP server.
*
- * This function is deprecated - use @link httpConnectEncrypt@ instead.
+ * This function is deprecated - use @link httpConnect2@ instead.
*
* @deprecated@
*/
@@ -445,251 +426,80 @@ http_t * /* O - New HTTP connection */
httpConnect(const char *host, /* I - Host to connect to */
int port) /* I - Port number */
{
- return (httpConnectEncrypt(host, port, HTTP_ENCRYPT_IF_REQUESTED));
+ return (httpConnect2(host, port, NULL, AF_UNSPEC,
+ HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL));
}
/*
- * 'httpConnectEncrypt()' - Connect to a HTTP server using encryption.
+ * 'httpConnect2()' - Connect to a HTTP server.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
http_t * /* O - New HTTP connection */
-httpConnectEncrypt(
+httpConnect2(
const char *host, /* I - Host to connect to */
int port, /* I - Port number */
- http_encryption_t encryption) /* I - Type of encryption to use */
+ http_addrlist_t *addrlist, /* I - List of addresses or NULL to lookup */
+ int family, /* I - Address family to use or @code AF_UNSPEC@ for any */
+ http_encryption_t encryption, /* I - Type of encryption to use */
+ int blocking, /* I - 1 for blocking connection, 0 for non-blocking */
+ int msec, /* I - Connection timeout in milliseconds, 0 means don't connect */
+ int *cancel) /* I - Pointer to "cancel" variable */
{
http_t *http; /* New HTTP connection */
- DEBUG_printf(("httpConnectEncrypt(host=\"%s\", port=%d, encryption=%d)",
- host, port, encryption));
+ DEBUG_printf(("httpConnect2(host=\"%s\", port=%d, addrlist=%p, family=%d, "
+ "encryption=%d, blocking=%d, msec=%d, cancel=%p)", host, port,
+ addrlist, family, encryption, blocking, msec, cancel));
/*
* Create the HTTP structure...
*/
- if ((http = _httpCreate(host, port, NULL, encryption, AF_UNSPEC)) == NULL)
+ if ((http = http_create(host, port, addrlist, family, encryption, blocking,
+ _HTTP_MODE_CLIENT)) == NULL)
return (NULL);
/*
- * Connect to the remote system...
+ * Optionally connect to the remote system...
*/
- if (!httpReconnect(http))
+ if (msec == 0 || !httpReconnect2(http, msec, cancel))
return (http);
/*
* Could not connect to any known address - bail out!
*/
- httpAddrFreeList(http->addrlist);
-
- free(http);
+ httpClose(http);
return (NULL);
}
/*
- * 'httpCopyCredentials()' - Copy the credentials associated with an encrypted
- * connection.
+ * 'httpConnectEncrypt()' - Connect to a HTTP server using encryption.
*
- * @since CUPS 1.5/OS X 10.7@
- */
-
-int /* O - Status of call (0 = success) */
-httpCopyCredentials(
- http_t *http, /* I - Connection to server */
- cups_array_t **credentials) /* O - Array of credentials */
-{
-# ifdef HAVE_LIBSSL
-# elif defined(HAVE_GNUTLS)
-# elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
- OSStatus error; /* Error code */
- CFIndex count; /* Number of credentials */
- CFArrayRef peerCerts; /* Peer certificates */
- SecCertificateRef secCert; /* Certificate reference */
- CFDataRef data; /* Certificate data */
- int i; /* Looping var */
-# elif defined(HAVE_SSPISSL)
-# endif /* HAVE_LIBSSL */
-
-
- if (credentials)
- *credentials = NULL;
-
- if (!http || !http->tls || !credentials)
- return (-1);
-
-# ifdef HAVE_LIBSSL
- return (-1);
-
-# elif defined(HAVE_GNUTLS)
- return (-1);
-
-# elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
- if (!(error = SSLCopyPeerCertificates(http->tls, &peerCerts)) && peerCerts)
- {
- if ((*credentials = cupsArrayNew(NULL, NULL)) != NULL)
- {
- for (i = 0, count = CFArrayGetCount(peerCerts); i < count; i++)
- {
- secCert = (SecCertificateRef)CFArrayGetValueAtIndex(peerCerts, i);
- if ((data = SecCertificateCopyData(secCert)))
- {
- httpAddCredential(*credentials, CFDataGetBytePtr(data),
- CFDataGetLength(data));
- CFRelease(data);
- }
- }
- }
-
- CFRelease(peerCerts);
- }
-
- return (error);
-
-# elif defined(HAVE_SSPISSL)
- return (-1);
-
-# else
- return (-1);
-# endif /* HAVE_LIBSSL */
-}
-
-
-/*
- * '_httpCreate()' - Create an unconnected HTTP connection.
+ * This function is now deprecated. Please use the @link httpConnect2@ function
+ * instead.
+ *
+ * @deprecated@
*/
-http_t * /* O - HTTP connection */
-_httpCreate(
- const char *host, /* I - Hostname */
+http_t * /* O - New HTTP connection */
+httpConnectEncrypt(
+ const char *host, /* I - Host to connect to */
int port, /* I - Port number */
- http_addrlist_t *addrlist, /* I - Address list or NULL */
- http_encryption_t encryption, /* I - Encryption to use */
- int family) /* I - Address family or AF_UNSPEC */
+ http_encryption_t encryption) /* I - Type of encryption to use */
{
- http_t *http; /* New HTTP connection */
- char service[255]; /* Service name */
-
-
- DEBUG_printf(("4_httpCreate(host=\"%s\", port=%d, encryption=%d)",
+ DEBUG_printf(("httpConnectEncrypt(host=\"%s\", port=%d, encryption=%d)",
host, port, encryption));
- if (!host)
- return (NULL);
-
- httpInitialize();
-
- /*
- * Lookup the host...
- */
-
- sprintf(service, "%d", port);
-
- if (!addrlist)
- if ((addrlist = httpAddrGetList(host, family, service)) == NULL)
- return (NULL);
-
- /*
- * Allocate memory for the structure...
- */
-
- if ((http = calloc(sizeof(http_t), 1)) == NULL)
- {
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
- httpAddrFreeList(addrlist);
- return (NULL);
- }
-
- /*
- * Initialize the HTTP data...
- */
-
- http->activity = time(NULL);
- http->addrlist = addrlist;
- http->blocking = 1;
- http->fd = -1;
-#ifdef HAVE_GSSAPI
- http->gssctx = GSS_C_NO_CONTEXT;
- http->gssname = GSS_C_NO_NAME;
-#endif /* HAVE_GSSAPI */
- http->version = HTTP_1_1;
-
- strlcpy(http->hostname, host, sizeof(http->hostname));
-
- if (port == 443) /* Always use encryption for https */
- http->encryption = HTTP_ENCRYPT_ALWAYS;
- else
- http->encryption = encryption;
-
- http_set_wait(http);
-
- /*
- * Return the new structure...
- */
-
- return (http);
-}
-
-
-/*
- * '_httpCreateCredentials()' - Create credentials in the internal format.
- */
-
-http_tls_credentials_t /* O - Internal credentials */
-_httpCreateCredentials(
- cups_array_t *credentials) /* I - Array of credentials */
-{
- if (!credentials)
- return (NULL);
-
-# ifdef HAVE_LIBSSL
- return (NULL);
-
-# elif defined(HAVE_GNUTLS)
- return (NULL);
-
-# elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
- CFMutableArrayRef peerCerts; /* Peer credentials reference */
- SecCertificateRef secCert; /* Certificate reference */
- CFDataRef data; /* Credential data reference */
- http_credential_t *credential; /* Credential data */
-
-
- if ((peerCerts = CFArrayCreateMutable(kCFAllocatorDefault,
- cupsArrayCount(credentials),
- &kCFTypeArrayCallBacks)) == NULL)
- return (NULL);
-
- for (credential = (http_credential_t *)cupsArrayFirst(credentials);
- credential;
- credential = (http_credential_t *)cupsArrayNext(credentials))
- {
- if ((data = CFDataCreate(kCFAllocatorDefault, credential->data,
- credential->datalen)))
- {
- if ((secCert = SecCertificateCreateWithData(kCFAllocatorDefault, data))
- != NULL)
- {
- CFArrayAppendValue(peerCerts, secCert);
- CFRelease(secCert);
- }
-
- CFRelease(data);
- }
- }
-
- return (peerCerts);
-
-# elif defined(HAVE_SSPISSL)
- return (NULL);
-
-# else
- return (NULL);
-# endif /* HAVE_LIBSSL */
+ return (httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 30000,
+ NULL));
}
@@ -698,10 +508,10 @@ _httpCreateCredentials(
*/
int /* O - Status of call (0 = success) */
-httpDelete(http_t *http, /* I - Connection to server */
+httpDelete(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI to delete */
{
- return (http_send(http, HTTP_DELETE, uri));
+ return (http_send(http, HTTP_STATE_DELETE, uri));
}
@@ -710,18 +520,14 @@ httpDelete(http_t *http, /* I - Connection to server */
*/
void
-_httpDisconnect(http_t *http) /* I - Connection to server */
+_httpDisconnect(http_t *http) /* I - HTTP connection */
{
#ifdef HAVE_SSL
if (http->tls)
- http_shutdown_ssl(http);
+ _httpTLSStop(http);
#endif /* HAVE_SSL */
-#ifdef WIN32
- closesocket(http->fd);
-#else
- close(http->fd);
-#endif /* WIN32 */
+ httpAddrClose(NULL, http->fd);
http->fd = -1;
}
@@ -732,7 +538,7 @@ _httpDisconnect(http_t *http) /* I - Connection to server */
*/
int /* O - -1 on error, 0 on success */
-httpEncryption(http_t *http, /* I - Connection to server */
+httpEncryption(http_t *http, /* I - HTTP connection */
http_encryption_t e) /* I - New encryption preference */
{
DEBUG_printf(("httpEncryption(http=%p, e=%d)", http, e));
@@ -741,17 +547,31 @@ httpEncryption(http_t *http, /* I - Connection to server */
if (!http)
return (0);
- http->encryption = e;
+ if (http->mode == _HTTP_MODE_CLIENT)
+ {
+ http->encryption = e;
- if ((http->encryption == HTTP_ENCRYPT_ALWAYS && !http->tls) ||
- (http->encryption == HTTP_ENCRYPT_NEVER && http->tls))
- return (httpReconnect(http));
- else if (http->encryption == HTTP_ENCRYPT_REQUIRED && !http->tls)
- return (http_upgrade(http));
+ if ((http->encryption == HTTP_ENCRYPTION_ALWAYS && !http->tls) ||
+ (http->encryption == HTTP_ENCRYPTION_NEVER && http->tls))
+ return (httpReconnect2(http, 30000, NULL));
+ else if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls)
+ return (http_tls_upgrade(http));
+ else
+ return (0);
+ }
else
- return (0);
+ {
+ if (e == HTTP_ENCRYPTION_NEVER && http->tls)
+ return (-1);
+
+ http->encryption = e;
+ if (e != HTTP_ENCRYPTION_IF_REQUESTED && !http->tls)
+ return (_httpTLSStart(http));
+ else
+ return (0);
+ }
#else
- if (e == HTTP_ENCRYPT_ALWAYS || e == HTTP_ENCRYPT_REQUIRED)
+ if (e == HTTP_ENCRYPTION_ALWAYS || e == HTTP_ENCRYPTION_REQUIRED)
return (-1);
else
return (0);
@@ -764,7 +584,7 @@ httpEncryption(http_t *http, /* I - Connection to server */
*/
int /* O - Error code (errno) value */
-httpError(http_t *http) /* I - Connection to server */
+httpError(http_t *http) /* I - HTTP connection */
{
if (http)
return (http->error);
@@ -774,11 +594,30 @@ httpError(http_t *http) /* I - Connection to server */
/*
+ * 'httpFieldValue()' - Return the HTTP field enumeration value for a field
+ * name.
+ */
+
+http_field_t /* O - Field index */
+httpFieldValue(const char *name) /* I - String name */
+{
+ int i; /* Looping var */
+
+
+ for (i = 0; i < HTTP_FIELD_MAX; i ++)
+ if (!_cups_strcasecmp(name, http_fields[i]))
+ return ((http_field_t)i);
+
+ return (HTTP_FIELD_UNKNOWN);
+}
+
+
+/*
* 'httpFlush()' - Flush data from a HTTP connection.
*/
void
-httpFlush(http_t *http) /* I - Connection to server */
+httpFlush(http_t *http) /* I - HTTP connection */
{
char buffer[8192]; /* Junk buffer */
int blocking; /* To block or not to block */
@@ -786,7 +625,14 @@ httpFlush(http_t *http) /* I - Connection to server */
DEBUG_printf(("httpFlush(http=%p), state=%s", http,
- http_states[http->state]));
+ httpStateString(http->state)));
+
+ /*
+ * Nothing to do if we are in the "waiting" state...
+ */
+
+ if (http->state == HTTP_STATE_WAITING)
+ return;
/*
* Temporarily set non-blocking mode so we don't get stuck in httpRead()...
@@ -809,24 +655,28 @@ httpFlush(http_t *http) /* I - Connection to server */
http->blocking = blocking;
- if (http->state == oldstate && http->state != HTTP_WAITING && http->fd >= 0)
+ if (http->state == oldstate && http->state != HTTP_STATE_WAITING &&
+ http->fd >= 0)
{
/*
* Didn't get the data back, so close the current connection.
*/
- http->state = HTTP_WAITING;
+#ifdef HAVE_LIBZ
+ if (http->coding)
+ http_content_coding_finish(http);
+#endif /* HAVE_LIBZ */
+
+ DEBUG_puts("1httpFlush: Setting state to HTTP_STATE_WAITING and closing.");
+
+ http->state = HTTP_STATE_WAITING;
#ifdef HAVE_SSL
if (http->tls)
- http_shutdown_ssl(http);
+ _httpTLSStop(http);
#endif /* HAVE_SSL */
-#ifdef WIN32
- closesocket(http->fd);
-#else
- close(http->fd);
-#endif /* WIN32 */
+ httpAddrClose(NULL, http->fd);
http->fd = -1;
}
@@ -840,12 +690,13 @@ httpFlush(http_t *http) /* I - Connection to server */
*/
int /* O - Bytes written or -1 on error */
-httpFlushWrite(http_t *http) /* I - Connection to server */
+httpFlushWrite(http_t *http) /* I - HTTP connection */
{
- int bytes; /* Bytes written */
+ ssize_t bytes; /* Bytes written */
- DEBUG_printf(("httpFlushWrite(http=%p)", http));
+ DEBUG_printf(("httpFlushWrite(http=%p) data_encoding=%d", http,
+ http ? http->data_encoding : 100));
if (!http || !http->wused)
{
@@ -854,43 +705,16 @@ httpFlushWrite(http_t *http) /* I - Connection to server */
return (0);
}
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
- bytes = http_write_chunk(http, http->wbuffer, http->wused);
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED)
+ bytes = http_write_chunk(http, http->wbuffer, (size_t)http->wused);
else
- bytes = http_write(http, http->wbuffer, http->wused);
+ bytes = http_write(http, http->wbuffer, (size_t)http->wused);
http->wused = 0;
- DEBUG_printf(("1httpFlushWrite: Returning %d, errno=%d.", bytes, errno));
+ DEBUG_printf(("1httpFlushWrite: Returning %d, errno=%d.", (int)bytes, errno));
- return (bytes);
-}
-
-
-/*
- * '_httpFreeCredentials()' - Free internal credentials.
- */
-
-void
-_httpFreeCredentials(
- http_tls_credentials_t credentials) /* I - Internal credentials */
-{
- if (!credentials)
- return;
-
-#ifdef HAVE_LIBSSL
- (void)credentials;
-
-#elif defined(HAVE_GNUTLS)
- (void)credentials;
-
-#elif defined(HAVE_CDSASSL)
- CFRelease(credentials);
-
-#elif defined(HAVE_SSPISSL)
- (void)credentials;
-
-#endif /* HAVE_LIBSSL */
+ return ((int)bytes);
}
@@ -923,10 +747,25 @@ httpFreeCredentials(
*/
int /* O - Status of call (0 = success) */
-httpGet(http_t *http, /* I - Connection to server */
+httpGet(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI to get */
{
- return (http_send(http, HTTP_GET, uri));
+ return (http_send(http, HTTP_STATE_GET, uri));
+}
+
+
+/*
+ * 'httpGetActivity()' - Get the most recent activity for a connection.
+ *
+ * The return value is the UNIX time of the last read or write.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+time_t /* O - Time of last read or write */
+httpGetActivity(http_t *http) /* I - HTTP connection */
+{
+ return (http ? http->activity : 0);
}
@@ -942,7 +781,7 @@ httpGet(http_t *http, /* I - Connection to server */
*/
char * /* O - Authorization string */
-httpGetAuthString(http_t *http) /* I - Connection to server */
+httpGetAuthString(http_t *http) /* I - HTTP connection */
{
if (http)
return (http->authstring);
@@ -958,33 +797,157 @@ httpGetAuthString(http_t *http) /* I - Connection to server */
*/
int /* O - 1 if blocking, 0 if non-blocking */
-httpGetBlocking(http_t *http) /* I - Connection to server */
+httpGetBlocking(http_t *http) /* I - HTTP connection */
{
return (http ? http->blocking : 0);
}
/*
+ * 'httpGetContentEncoding()' - Get a common content encoding, if any, between
+ * the client and server.
+ *
+ * This function uses the value of the Accepts-Encoding HTTP header and must be
+ * called after receiving a response from the server or a request from the
+ * client. The value returned can be use in subsequent requests (for clients)
+ * or in the response (for servers) in order to compress the content stream.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+const char * /* O - Content-Coding value or
+ @code NULL@ for the identity
+ coding. */
+httpGetContentEncoding(http_t *http) /* I - HTTP connection */
+{
+#ifdef HAVE_LIBZ
+ if (http && http->accept_encoding)
+ {
+ int i; /* Looping var */
+ char temp[HTTP_MAX_VALUE], /* Copy of Accepts-Encoding value */
+ *start, /* Start of coding value */
+ *end; /* End of coding value */
+ double qvalue; /* "qvalue" for coding */
+ struct lconv *loc = localeconv(); /* Locale data */
+ static const char * const codings[] =
+ { /* Supported content codings */
+ "deflate",
+ "gzip",
+ "x-deflate",
+ "x-gzip"
+ };
+
+ strlcpy(temp, http->accept_encoding, sizeof(temp));
+
+ for (start = temp; *start; start = end)
+ {
+ /*
+ * Find the end of the coding name...
+ */
+
+ qvalue = 1.0;
+ end = start;
+ while (*end && *end != ';' && *end != ',' && !isspace(*end & 255))
+ end ++;
+
+ if (*end == ';')
+ {
+ /*
+ * Grab the qvalue as needed...
+ */
+
+ if (!strncmp(end, ";q=", 3))
+ qvalue = _cupsStrScand(end + 3, NULL, loc);
+
+ /*
+ * Skip past all attributes...
+ */
+
+ *end++ = '\0';
+ while (*end && *end != ',' && !isspace(*end & 255))
+ end ++;
+ }
+ else if (*end)
+ *end++ = '\0';
+
+ while (*end && isspace(*end & 255))
+ end ++;
+
+ /*
+ * Check value if it matches something we support...
+ */
+
+ if (qvalue <= 0.0)
+ continue;
+
+ for (i = 0; i < (int)(sizeof(codings) / sizeof(codings[0])); i ++)
+ if (!strcmp(start, codings[i]))
+ return (codings[i]);
+ }
+ }
+#endif /* HAVE_LIBZ */
+
+ return (NULL);
+}
+
+
+/*
* 'httpGetCookie()' - Get any cookie data from the response.
*
* @since CUPS 1.1.19/OS X 10.3@
*/
const char * /* O - Cookie data or NULL */
-httpGetCookie(http_t *http) /* I - HTTP connecion */
+httpGetCookie(http_t *http) /* I - HTTP connection */
{
return (http ? http->cookie : NULL);
}
/*
+ * 'httpGetEncryption()' - Get the current encryption mode of a connection.
+ *
+ * This function returns the encryption mode for the connection. Use the
+ * @link httpIsEncrypted@ function to determine whether a TLS session has
+ * been established.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+http_encryption_t /* O - Current encryption mode */
+httpGetEncryption(http_t *http) /* I - HTTP connection */
+{
+ return (http ? http->encryption : HTTP_ENCRYPTION_IF_REQUESTED);
+}
+
+
+/*
+ * 'httpGetExpect()' - Get the value of the Expect header, if any.
+ *
+ * Returns @code HTTP_STATUS_NONE@ if there is no Expect header, otherwise
+ * returns the expected HTTP status code, typically @code HTTP_STATUS_CONTINUE@.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+http_status_t /* O - Expect: status, if any */
+httpGetExpect(http_t *http) /* I - HTTP connection */
+{
+ if (!http)
+ return (HTTP_STATUS_ERROR);
+ else
+ return (http->expect);
+}
+
+
+/*
* 'httpGetFd()' - Get the file descriptor associated with a connection.
*
* @since CUPS 1.2/OS X 10.5@
*/
int /* O - File descriptor or -1 if none */
-httpGetFd(http_t *http) /* I - Connection to server */
+httpGetFd(http_t *http) /* I - HTTP connection */
{
return (http ? http->fd : -1);
}
@@ -995,23 +958,50 @@ httpGetFd(http_t *http) /* I - Connection to server */
*/
const char * /* O - Field value */
-httpGetField(http_t *http, /* I - Connection to server */
+httpGetField(http_t *http, /* I - HTTP connection */
http_field_t field) /* I - Field to get */
{
if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX)
return (NULL);
- else if (field == HTTP_FIELD_AUTHORIZATION &&
- http->field_authorization)
+
+ switch (field)
{
- /*
- * Special case for WWW-Authenticate: as its contents can be
- * longer than HTTP_MAX_VALUE...
- */
+ case HTTP_FIELD_ACCEPT_ENCODING :
+ return (http->accept_encoding);
+
+ case HTTP_FIELD_ALLOW :
+ return (http->allow);
+
+ case HTTP_FIELD_SERVER :
+ return (http->server);
+
+ case HTTP_FIELD_AUTHORIZATION :
+ if (http->field_authorization)
+ {
+ /*
+ * Special case for WWW-Authenticate: as its contents can be
+ * longer than HTTP_MAX_VALUE...
+ */
+
+ return (http->field_authorization);
+ }
- return (http->field_authorization);
+ default :
+ return (http->fields[field]);
}
- else
- return (http->fields[field]);
+}
+
+
+/*
+ * 'httpGetKeepAlive()' - Get the current Keep-Alive state of the connection.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+http_keepalive_t /* O - Keep-Alive state */
+httpGetKeepAlive(http_t *http) /* I - HTTP connection */
+{
+ return (http ? http->keep_alive : HTTP_KEEPALIVE_OFF);
}
@@ -1026,7 +1016,7 @@ httpGetField(http_t *http, /* I - Connection to server */
*/
int /* O - Content length */
-httpGetLength(http_t *http) /* I - Connection to server */
+httpGetLength(http_t *http) /* I - HTTP connection */
{
/*
* Get the read content length and return the 32-bit value.
@@ -1054,10 +1044,13 @@ httpGetLength(http_t *http) /* I - Connection to server */
*/
off_t /* O - Content length */
-httpGetLength2(http_t *http) /* I - Connection to server */
+httpGetLength2(http_t *http) /* I - HTTP connection */
{
+ off_t remaining; /* Remaining length */
+
+
DEBUG_printf(("2httpGetLength2(http=%p), state=%s", http,
- http_states[http->state]));
+ httpStateString(http->state)));
if (!http)
return (-1);
@@ -1065,48 +1058,98 @@ httpGetLength2(http_t *http) /* I - Connection to server */
if (!_cups_strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked"))
{
DEBUG_puts("4httpGetLength2: chunked request!");
-
- http->data_encoding = HTTP_ENCODE_CHUNKED;
- http->data_remaining = 0;
+ remaining = 0;
}
else
{
- http->data_encoding = HTTP_ENCODE_LENGTH;
-
/*
* The following is a hack for HTTP servers that don't send a
- * content-length or transfer-encoding field...
+ * Content-Length or Transfer-Encoding field...
*
- * If there is no content-length then the connection must close
+ * If there is no Content-Length then the connection must close
* after the transfer is complete...
*/
if (!http->fields[HTTP_FIELD_CONTENT_LENGTH][0])
{
/*
- * Default content length is 0 for errors and 2^31-1 for other
- * successful requests...
+ * Default content length is 0 for errors and certain types of operations,
+ * and 2^31-1 for other successful requests...
*/
- if (http->status >= HTTP_MULTIPLE_CHOICES)
- http->data_remaining = 0;
+ if (http->status >= HTTP_STATUS_MULTIPLE_CHOICES ||
+ http->state == HTTP_STATE_OPTIONS ||
+ (http->state == HTTP_STATE_GET && http->mode == _HTTP_MODE_SERVER) ||
+ http->state == HTTP_STATE_HEAD ||
+ (http->state == HTTP_STATE_PUT && http->mode == _HTTP_MODE_CLIENT) ||
+ http->state == HTTP_STATE_DELETE ||
+ http->state == HTTP_STATE_TRACE ||
+ http->state == HTTP_STATE_CONNECT)
+ remaining = 0;
else
- http->data_remaining = 2147483647;
+ remaining = 2147483647;
}
- else
- http->data_remaining = strtoll(http->fields[HTTP_FIELD_CONTENT_LENGTH],
- NULL, 10);
+ else if ((remaining = strtoll(http->fields[HTTP_FIELD_CONTENT_LENGTH],
+ NULL, 10)) < 0)
+ remaining = -1;
DEBUG_printf(("4httpGetLength2: content_length=" CUPS_LLFMT,
- CUPS_LLCAST http->data_remaining));
+ CUPS_LLCAST remaining));
}
- if (http->data_remaining <= INT_MAX)
- http->_data_remaining = (int)http->data_remaining;
- else
- http->_data_remaining = INT_MAX;
+ return (remaining);
+}
+
- return (http->data_remaining);
+/*
+ * 'httpGetPending()' - Get the number of bytes that are buffered for writing.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+size_t /* O - Number of bytes buffered */
+httpGetPending(http_t *http) /* I - HTTP connection */
+{
+ return (http ? (size_t)http->wused : 0);
+}
+
+
+/*
+ * 'httpGetReady()' - Get the number of bytes that can be read without blocking.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+size_t /* O - Number of bytes available */
+httpGetReady(http_t *http) /* I - HTTP connection */
+{
+ if (!http)
+ return (0);
+ else if (http->used > 0)
+ return ((size_t)http->used);
+#ifdef HAVE_SSL
+ else if (http->tls)
+ return (_httpTLSPending(http));
+#endif /* HAVE_SSL */
+
+ return (0);
+}
+
+
+/*
+ * 'httpGetRemaining()' - Get the number of remaining bytes in the message
+ * body or current chunk.
+ *
+ * The @link httpIsChunked@ function can be used to determine whether the
+ * message body is chunked or fixed-length.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+size_t /* O - Remaining bytes */
+httpGetRemaining(http_t *http) /* I - HTTP connection */
+{
+ return (http ? (size_t)http->data_remaining : 0);
}
@@ -1117,19 +1160,19 @@ httpGetLength2(http_t *http) /* I - Connection to server */
char * /* O - Line or NULL */
httpGets(char *line, /* I - Line to read into */
int length, /* I - Max length of buffer */
- http_t *http) /* I - Connection to server */
+ http_t *http) /* I - HTTP connection */
{
- char *lineptr, /* Pointer into line */
- *lineend, /* End of line */
- *bufptr, /* Pointer into input buffer */
- *bufend; /* Pointer to end of buffer */
- int bytes, /* Number of bytes read */
- eol; /* End-of-line? */
+ char *lineptr, /* Pointer into line */
+ *lineend, /* End of line */
+ *bufptr, /* Pointer into input buffer */
+ *bufend; /* Pointer to end of buffer */
+ ssize_t bytes; /* Number of bytes read */
+ int eol; /* End-of-line? */
DEBUG_printf(("2httpGets(line=%p, length=%d, http=%p)", line, length, http));
- if (http == NULL || line == NULL)
+ if (!http || !line || length <= 1)
return (NULL);
/*
@@ -1173,20 +1216,9 @@ httpGets(char *line, /* I - Line to read into */
return (NULL);
}
-#ifdef HAVE_SSL
- if (http->tls)
- bytes = http_read_ssl(http, http->buffer + http->used,
- HTTP_MAX_BUFFER - http->used);
- else
-#endif /* HAVE_SSL */
- bytes = recv(http->fd, http->buffer + http->used,
- HTTP_MAX_BUFFER - http->used, 0);
+ bytes = http_read(http, http->buffer + http->used, (size_t)(HTTP_MAX_BUFFER - http->used));
- DEBUG_printf(("4httpGets: read %d bytes...", bytes));
-
-#ifdef DEBUG
- http_debug_hex("httpGets", http->buffer + http->used, bytes);
-#endif /* DEBUG */
+ DEBUG_printf(("4httpGets: read " CUPS_LLFMT " bytes.", CUPS_LLCAST bytes));
if (bytes < 0)
{
@@ -1246,7 +1278,7 @@ httpGets(char *line, /* I - Line to read into */
* Yup, update the amount used...
*/
- http->used += bytes;
+ http->used += (int)bytes;
}
/*
@@ -1270,7 +1302,7 @@ httpGets(char *line, /* I - Line to read into */
http->used -= (int)(bufptr - http->buffer);
if (http->used > 0)
- memmove(http->buffer, bufptr, http->used);
+ memmove(http->buffer, bufptr, (size_t)http->used);
if (eol)
{
@@ -1299,9 +1331,9 @@ httpGets(char *line, /* I - Line to read into */
*/
http_state_t /* O - HTTP state */
-httpGetState(http_t *http) /* I - Connection to server */
+httpGetState(http_t *http) /* I - HTTP connection */
{
- return (http ? http->state : HTTP_ERROR);
+ return (http ? http->state : HTTP_STATE_ERROR);
}
@@ -1312,9 +1344,9 @@ httpGetState(http_t *http) /* I - Connection to server */
*/
http_status_t /* O - HTTP status */
-httpGetStatus(http_t *http) /* I - Connection to server */
+httpGetStatus(http_t *http) /* I - HTTP connection */
{
- return (http ? http->status : HTTP_ERROR);
+ return (http ? http->status : HTTP_STATUS_ERROR);
}
@@ -1325,7 +1357,7 @@ httpGetStatus(http_t *http) /* I - Connection to server */
*/
char * /* O - Value or NULL */
-httpGetSubField(http_t *http, /* I - Connection to server */
+httpGetSubField(http_t *http, /* I - HTTP connection */
http_field_t field, /* I - Field index */
const char *name, /* I - Name of sub-field */
char *value) /* O - Value string */
@@ -1341,7 +1373,7 @@ httpGetSubField(http_t *http, /* I - Connection to server */
*/
char * /* O - Value or NULL */
-httpGetSubField2(http_t *http, /* I - Connection to server */
+httpGetSubField2(http_t *http, /* I - HTTP connection */
http_field_t field, /* I - Field index */
const char *name, /* I - Name of sub-field */
char *value, /* O - Value string */
@@ -1471,9 +1503,9 @@ httpGetSubField2(http_t *http, /* I - Connection to server */
*/
http_version_t /* O - Version number */
-httpGetVersion(http_t *http) /* I - Connection to server */
+httpGetVersion(http_t *http) /* I - HTTP connection */
{
- return (http ? http->version : HTTP_1_0);
+ return (http ? http->version : HTTP_VERSION_1_0);
}
@@ -1482,11 +1514,11 @@ httpGetVersion(http_t *http) /* I - Connection to server */
*/
int /* O - Status of call (0 = success) */
-httpHead(http_t *http, /* I - Connection to server */
+httpHead(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI for head */
{
DEBUG_printf(("httpHead(http=%p, uri=\"%s\")", http, uri));
- return (http_send(http, HTTP_HEAD, uri));
+ return (http_send(http, HTTP_STATE_HEAD, uri));
}
@@ -1502,10 +1534,6 @@ httpInitialize(void)
#ifdef WIN32
WSADATA winsockdata; /* WinSock data */
#endif /* WIN32 */
-#ifdef HAVE_LIBSSL
- int i; /* Looping var */
- unsigned char data[1024]; /* Seed data */
-#endif /* HAVE_LIBSSL */
_cupsGlobalLock();
@@ -1539,36 +1567,43 @@ httpInitialize(void)
# endif /* !SO_NOSIGPIPE */
#endif /* WIN32 */
-#ifdef HAVE_GNUTLS
- /*
- * Initialize GNU TLS...
- */
-
- gnutls_global_init();
+# ifdef HAVE_SSL
+ _httpTLSInitialize();
+# endif /* HAVE_SSL */
-#elif defined(HAVE_LIBSSL)
- /*
- * Initialize OpenSSL...
- */
+ initialized = 1;
+ _cupsGlobalUnlock();
+}
- SSL_load_error_strings();
- SSL_library_init();
- /*
- * Using the current time is a dubious random seed, but on some systems
- * it is the best we can do (on others, this seed isn't even used...)
- */
+/*
+ * 'httpIsChunked()' - Report whether a message body is chunked.
+ *
+ * This function returns non-zero if the message body is composed of
+ * variable-length chunks.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
- CUPS_SRAND(time(NULL));
+int /* O - 1 if chunked, 0 if not */
+httpIsChunked(http_t *http) /* I - HTTP connection */
+{
+ return (http ? http->data_encoding == HTTP_ENCODING_CHUNKED : 0);
+}
- for (i = 0; i < sizeof(data); i ++)
- data[i] = CUPS_RAND();
- RAND_seed(data, sizeof(data));
-#endif /* HAVE_GNUTLS */
+/*
+ * 'httpIsEncrypted()' - Report whether a connection is encrypted.
+ *
+ * This function returns non-zero if the connection is currently encrypted.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
- initialized = 1;
- _cupsGlobalUnlock();
+int /* O - 1 if encrypted, 0 if not */
+httpIsEncrypted(http_t *http) /* I - HTTP connection */
+{
+ return (http ? http->tls != NULL : 0);
}
@@ -1577,33 +1612,35 @@ httpInitialize(void)
*/
int /* O - Status of call (0 = success) */
-httpOptions(http_t *http, /* I - Connection to server */
+httpOptions(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI for options */
{
- return (http_send(http, HTTP_OPTIONS, uri));
+ return (http_send(http, HTTP_STATE_OPTIONS, uri));
}
/*
- * '_httpPeek()' - Peek at data from a HTTP connection.
+ * 'httpPeek()' - Peek at data from a HTTP connection.
*
* This function copies available data from the given HTTP connection, reading
* a buffer as needed. The data is still available for reading using
* @link httpRead@ or @link httpRead2@.
*
* For non-blocking connections the usual timeouts apply.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
ssize_t /* O - Number of bytes copied */
-_httpPeek(http_t *http, /* I - Connection to server */
- char *buffer, /* I - Buffer for data */
- size_t length) /* I - Maximum number of bytes */
+httpPeek(http_t *http, /* I - HTTP connection */
+ char *buffer, /* I - Buffer for data */
+ size_t length) /* I - Maximum number of bytes */
{
ssize_t bytes; /* Bytes read */
char len[32]; /* Length string */
- DEBUG_printf(("_httpPeek(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
+ DEBUG_printf(("httpPeek(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
http, buffer, CUPS_LLCAST length));
if (http == NULL || buffer == NULL)
@@ -1615,55 +1652,80 @@ _httpPeek(http_t *http, /* I - Connection to server */
if (length <= 0)
return (0);
- if (http->data_encoding == HTTP_ENCODE_CHUNKED &&
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED &&
http->data_remaining <= 0)
{
- DEBUG_puts("2_httpPeek: Getting chunk length...");
+ DEBUG_puts("2httpPeek: Getting chunk length...");
if (httpGets(len, sizeof(len), http) == NULL)
{
- DEBUG_puts("1_httpPeek: Could not get length!");
+ DEBUG_puts("1httpPeek: Could not get length!");
return (0);
}
+ if (!len[0])
+ {
+ DEBUG_puts("1httpPeek: Blank chunk length, trying again...");
+ if (!httpGets(len, sizeof(len), http))
+ {
+ DEBUG_puts("1httpPeek: Could not get chunk length.");
+ return (0);
+ }
+ }
+
http->data_remaining = strtoll(len, NULL, 16);
+
if (http->data_remaining < 0)
{
- DEBUG_puts("1_httpPeek: Negative chunk length!");
+ DEBUG_puts("1httpPeek: Negative chunk length!");
return (0);
}
}
- DEBUG_printf(("2_httpPeek: data_remaining=" CUPS_LLFMT,
+ DEBUG_printf(("2httpPeek: data_remaining=" CUPS_LLFMT,
CUPS_LLCAST http->data_remaining));
- if (http->data_remaining <= 0)
+ if (http->data_remaining <= 0 && http->data_encoding != HTTP_ENCODING_FIELDS)
{
/*
* A zero-length chunk ends a transfer; unless we are reading POST
* data, go idle...
*/
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
+#ifdef HAVE_LIBZ
+ if (http->coding >= _HTTP_CODING_GUNZIP)
+ http_content_coding_finish(http);
+#endif /* HAVE_LIBZ */
+
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED)
httpGets(len, sizeof(len), http);
- if (http->state == HTTP_POST_RECV)
+ if (http->state == HTTP_STATE_POST_RECV)
http->state ++;
else
- http->state = HTTP_WAITING;
+ http->state = HTTP_STATE_STATUS;
+
+ DEBUG_printf(("1httpPeek: 0-length chunk, set state to %s.",
+ httpStateString(http->state)));
/*
* Prevent future reads for this request...
*/
- http->data_encoding = HTTP_ENCODE_LENGTH;
+ http->data_encoding = HTTP_ENCODING_FIELDS;
return (0);
}
else if (length > (size_t)http->data_remaining)
length = (size_t)http->data_remaining;
+#ifdef HAVE_LIBZ
+ if (http->used == 0 &&
+ (http->coding == _HTTP_CODING_IDENTITY ||
+ (http->coding >= _HTTP_CODING_GUNZIP && http->stream.avail_in == 0)))
+#else
if (http->used == 0)
+#endif /* HAVE_LIBZ */
{
/*
* Buffer small reads for better performance...
@@ -1682,72 +1744,99 @@ _httpPeek(http_t *http, /* I - Connection to server */
}
}
- if (http->data_remaining > sizeof(http->buffer))
+ if ((size_t)http->data_remaining > sizeof(http->buffer))
buflen = sizeof(http->buffer);
else
- buflen = http->data_remaining;
+ buflen = (ssize_t)http->data_remaining;
- DEBUG_printf(("2_httpPeek: Reading %d bytes into buffer.", (int)buflen));
+ DEBUG_printf(("2httpPeek: Reading %d bytes into buffer.", (int)buflen));
+ bytes = http_read(http, http->buffer, (size_t)buflen);
- do
+ DEBUG_printf(("2httpPeek: Read " CUPS_LLFMT " bytes into buffer.",
+ CUPS_LLCAST bytes));
+ if (bytes > 0)
{
-#ifdef HAVE_SSL
- if (http->tls)
- bytes = http_read_ssl(http, http->buffer, buflen);
- else
-#endif /* HAVE_SSL */
- bytes = recv(http->fd, http->buffer, buflen, 0);
+#ifdef DEBUG
+ http_debug_hex("httpPeek", http->buffer, (int)bytes);
+#endif /* DEBUG */
- if (bytes < 0)
- {
-#ifdef WIN32
- if (WSAGetLastError() != WSAEINTR)
- {
- http->error = WSAGetLastError();
- return (-1);
- }
- else if (WSAGetLastError() == WSAEWOULDBLOCK)
- {
- if (!http->timeout_cb ||
- !(*http->timeout_cb)(http, http->timeout_data))
- {
- http->error = WSAEWOULDBLOCK;
- return (-1);
- }
- }
-#else
- if (errno == EWOULDBLOCK || errno == EAGAIN)
- {
- if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
- {
- http->error = errno;
- return (-1);
- }
- else if (!http->timeout_cb && errno != EAGAIN)
- {
- http->error = errno;
- return (-1);
- }
- }
- else if (errno != EINTR)
- {
- http->error = errno;
- return (-1);
- }
-#endif /* WIN32 */
- }
+ http->used = (int)bytes;
}
- while (bytes < 0);
+ }
- DEBUG_printf(("2_httpPeek: Read " CUPS_LLFMT " bytes into buffer.",
- CUPS_LLCAST bytes));
+#ifdef HAVE_LIBZ
+ if (http->coding >= _HTTP_CODING_GUNZIP)
+ {
+# ifdef HAVE_INFLATECOPY
+ int zerr; /* Decompressor error */
+ z_stream stream; /* Copy of decompressor stream */
+
+ if (http->used > 0 && http->stream.avail_in < HTTP_MAX_BUFFER)
+ {
+ size_t buflen = buflen = HTTP_MAX_BUFFER - http->stream.avail_in;
+ /* Number of bytes to copy */
+
+ if (http->stream.avail_in > 0 &&
+ http->stream.next_in > http->sbuffer)
+ memmove(http->sbuffer, http->stream.next_in, http->stream.avail_in);
+
+ http->stream.next_in = http->sbuffer;
+
+ if (buflen > (size_t)http->data_remaining)
+ buflen = (size_t)http->data_remaining;
+
+ if (buflen > (size_t)http->used)
+ buflen = (size_t)http->used;
+
+ DEBUG_printf(("1httpPeek: Copying %d more bytes of data into "
+ "decompression buffer.", (int)buflen));
+
+ memcpy(http->sbuffer + http->stream.avail_in, http->buffer, buflen);
+ http->stream.avail_in += buflen;
+ http->used -= (int)buflen;
+ http->data_remaining -= (off_t)buflen;
+
+ if (http->used > 0)
+ memmove(http->buffer, http->buffer + buflen, (size_t)http->used);
+ }
+
+ DEBUG_printf(("2httpPeek: length=%d, avail_in=%d", (int)length,
+ (int)http->stream.avail_in));
+
+ if (inflateCopy(&stream, &(http->stream)) != Z_OK)
+ {
+ DEBUG_puts("2httpPeek: Unable to copy decompressor stream.");
+ http->error = ENOMEM;
+ return (-1);
+ }
+
+ stream.next_out = (Bytef *)buffer;
+ stream.avail_out = (uInt)length;
+
+ zerr = inflate(&stream, Z_SYNC_FLUSH);
+ inflateEnd(&stream);
+
+ if (zerr < Z_OK)
+ {
+ DEBUG_printf(("2httpPeek: zerr=%d", zerr));
#ifdef DEBUG
- http_debug_hex("_httpPeek", http->buffer, (int)bytes);
+ http_debug_hex("2httpPeek", (char *)http->sbuffer, (int)http->stream.avail_in);
#endif /* DEBUG */
- http->used = bytes;
- }
+ http->error = EIO;
+ return (-1);
+ }
+ bytes = (ssize_t)(length - http->stream.avail_out);
+
+# else
+ DEBUG_puts("2httpPeek: No inflateCopy on this platform, httpPeek does not "
+ "work with compressed streams.");
+ return (-1);
+# endif /* HAVE_INFLATECOPY */
+ }
+ else
+#endif /* HAVE_LIBZ */
if (http->used > 0)
{
if (length > (size_t)http->used)
@@ -1755,7 +1844,7 @@ _httpPeek(http_t *http, /* I - Connection to server */
bytes = (ssize_t)length;
- DEBUG_printf(("2_httpPeek: grabbing %d bytes from input buffer...",
+ DEBUG_printf(("2httpPeek: grabbing %d bytes from input buffer...",
(int)bytes));
memcpy(buffer, http->buffer, length);
@@ -1783,10 +1872,6 @@ _httpPeek(http_t *http, /* I - Connection to server */
return (0);
}
-#ifdef DEBUG
- http_debug_hex("_httpPeek", buffer, (int)bytes);
-#endif /* DEBUG */
-
return (bytes);
}
@@ -1796,10 +1881,10 @@ _httpPeek(http_t *http, /* I - Connection to server */
*/
int /* O - Status of call (0 = success) */
-httpPost(http_t *http, /* I - Connection to server */
+httpPost(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI for post */
{
- return (http_send(http, HTTP_POST, uri));
+ return (http_send(http, HTTP_STATE_POST, uri));
}
@@ -1810,11 +1895,11 @@ httpPost(http_t *http, /* I - Connection to server */
*/
int /* O - Number of bytes written */
-httpPrintf(http_t *http, /* I - Connection to server */
+httpPrintf(http_t *http, /* I - HTTP connection */
const char *format, /* I - printf-style format string */
...) /* I - Additional args as needed */
{
- int bytes; /* Number of bytes to write */
+ ssize_t bytes; /* Number of bytes to write */
char buf[16384]; /* Buffer for formatted string */
va_list ap; /* Variable argument pointer */
@@ -1825,10 +1910,10 @@ httpPrintf(http_t *http, /* I - Connection to server */
bytes = vsnprintf(buf, sizeof(buf), format, ap);
va_end(ap);
- DEBUG_printf(("3httpPrintf: %s", buf));
+ DEBUG_printf(("3httpPrintf: (" CUPS_LLFMT " bytes) %s", CUPS_LLCAST bytes, buf));
- if (http->data_encoding == HTTP_ENCODE_FIELDS)
- return (httpWrite2(http, buf, bytes));
+ if (http->data_encoding == HTTP_ENCODING_FIELDS)
+ return ((int)httpWrite2(http, buf, (size_t)bytes));
else
{
if (http->wused)
@@ -1839,7 +1924,7 @@ httpPrintf(http_t *http, /* I - Connection to server */
return (-1);
}
- return (http_write(http, buf, bytes));
+ return ((int)http_write(http, buf, (size_t)bytes));
}
}
@@ -1849,11 +1934,11 @@ httpPrintf(http_t *http, /* I - Connection to server */
*/
int /* O - Status of call (0 = success) */
-httpPut(http_t *http, /* I - Connection to server */
+httpPut(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI to put */
{
DEBUG_printf(("httpPut(http=%p, uri=\"%s\")", http, uri));
- return (http_send(http, HTTP_PUT, uri));
+ return (http_send(http, HTTP_STATE_PUT, uri));
}
@@ -1867,11 +1952,11 @@ httpPut(http_t *http, /* I - Connection to server */
*/
int /* O - Number of bytes read */
-httpRead(http_t *http, /* I - Connection to server */
+httpRead(http_t *http, /* I - HTTP connection */
char *buffer, /* I - Buffer for data */
int length) /* I - Maximum number of bytes */
{
- return ((int)httpRead2(http, buffer, length));
+ return ((int)httpRead2(http, buffer, (size_t)length));
}
@@ -1882,16 +1967,25 @@ httpRead(http_t *http, /* I - Connection to server */
*/
ssize_t /* O - Number of bytes read */
-httpRead2(http_t *http, /* I - Connection to server */
+httpRead2(http_t *http, /* I - HTTP connection */
char *buffer, /* I - Buffer for data */
size_t length) /* I - Maximum number of bytes */
{
ssize_t bytes; /* Bytes read */
- char len[32]; /* Length string */
- DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
- http, buffer, CUPS_LLCAST length));
+#ifdef HAVE_LIBZ
+ DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT
+ ") coding=%d data_encoding=%d data_remaining=" CUPS_LLFMT,
+ http, buffer, CUPS_LLCAST length,
+ http->coding,
+ http->data_encoding, CUPS_LLCAST http->data_remaining));
+#else
+ DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT
+ ") data_encoding=%d data_remaining=" CUPS_LLFMT,
+ http, buffer, CUPS_LLCAST length,
+ http->data_encoding, CUPS_LLCAST http->data_remaining));
+#endif /* HAVE_LIBZ */
if (http == NULL || buffer == NULL)
return (-1);
@@ -1902,399 +1996,358 @@ httpRead2(http_t *http, /* I - Connection to server */
if (length <= 0)
return (0);
- if (http->data_encoding == HTTP_ENCODE_CHUNKED &&
- http->data_remaining <= 0)
+#ifdef HAVE_LIBZ
+ if (http->coding >= _HTTP_CODING_GUNZIP)
{
- DEBUG_puts("2httpRead2: Getting chunk length...");
-
- if (httpGets(len, sizeof(len), http) == NULL)
- {
- DEBUG_puts("1httpRead2: Could not get length!");
- return (0);
- }
-
- http->data_remaining = strtoll(len, NULL, 16);
- if (http->data_remaining < 0)
+ do
{
- DEBUG_puts("1httpRead2: Negative chunk length!");
- return (0);
- }
- }
-
- DEBUG_printf(("2httpRead2: data_remaining=" CUPS_LLFMT,
- CUPS_LLCAST http->data_remaining));
-
- if (http->data_remaining <= 0)
- {
- /*
- * A zero-length chunk ends a transfer; unless we are reading POST
- * data, go idle...
- */
-
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
- httpGets(len, sizeof(len), http);
+ if (http->stream.avail_in > 0)
+ {
+ int zerr; /* Decompressor error */
- if (http->state == HTTP_POST_RECV)
- http->state ++;
- else
- http->state = HTTP_WAITING;
+ DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d",
+ (int)http->stream.avail_in, (int)length));
- /*
- * Prevent future reads for this request...
- */
+ http->stream.next_out = (Bytef *)buffer;
+ http->stream.avail_out = (uInt)length;
- http->data_encoding = HTTP_ENCODE_LENGTH;
+ if ((zerr = inflate(&(http->stream), Z_SYNC_FLUSH)) < Z_OK)
+ {
+ DEBUG_printf(("2httpRead2: zerr=%d", zerr));
+#ifdef DEBUG
+ http_debug_hex("2httpRead2", (char *)http->sbuffer, (int)http->stream.avail_in);
+#endif /* DEBUG */
- return (0);
- }
- else if (length > (size_t)http->data_remaining)
- length = (size_t)http->data_remaining;
+ http->error = EIO;
+ return (-1);
+ }
- if (http->used == 0 && length <= 256)
- {
- /*
- * Buffer small reads for better performance...
- */
+ bytes = (ssize_t)(length - http->stream.avail_out);
- ssize_t buflen; /* Length of read for buffer */
+ DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d, bytes=%d",
+ http->stream.avail_in, http->stream.avail_out,
+ (int)bytes));
+ }
+ else
+ bytes = 0;
- if (!http->blocking)
- {
- while (!httpWait(http, http->wait_value))
+ if (bytes == 0)
{
- if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
- continue;
+ ssize_t buflen = HTTP_MAX_BUFFER - (ssize_t)http->stream.avail_in;
+ /* Additional bytes for buffer */
- return (0);
- }
- }
+ if (buflen > 0)
+ {
+ if (http->stream.avail_in > 0 &&
+ http->stream.next_in > http->sbuffer)
+ memmove(http->sbuffer, http->stream.next_in, http->stream.avail_in);
- if (http->data_remaining > sizeof(http->buffer))
- buflen = sizeof(http->buffer);
- else
- buflen = http->data_remaining;
+ http->stream.next_in = http->sbuffer;
- DEBUG_printf(("2httpRead2: Reading %d bytes into buffer.", (int)buflen));
+ DEBUG_printf(("1httpRead2: Reading up to %d more bytes of data into "
+ "decompression buffer.", (int)buflen));
- do
- {
-#ifdef HAVE_SSL
- if (http->tls)
- bytes = http_read_ssl(http, http->buffer, buflen);
- else
-#endif /* HAVE_SSL */
- bytes = recv(http->fd, http->buffer, buflen, 0);
+ if (http->data_remaining > 0)
+ {
+ if (buflen > http->data_remaining)
+ buflen = (ssize_t)http->data_remaining;
- if (bytes < 0)
- {
-#ifdef WIN32
- if (WSAGetLastError() != WSAEINTR)
- {
- http->error = WSAGetLastError();
- return (-1);
- }
- else if (WSAGetLastError() == WSAEWOULDBLOCK)
- {
- if (!http->timeout_cb ||
- !(*http->timeout_cb)(http, http->timeout_data))
- {
- http->error = WSAEWOULDBLOCK;
- return (-1);
- }
- }
-#else
- if (errno == EWOULDBLOCK || errno == EAGAIN)
- {
- if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
- {
- http->error = errno;
- return (-1);
- }
- else if (!http->timeout_cb && errno != EAGAIN)
- {
- http->error = errno;
- return (-1);
- }
- }
- else if (errno != EINTR)
- {
- http->error = errno;
- return (-1);
- }
-#endif /* WIN32 */
- }
- }
- while (bytes < 0);
+ bytes = http_read_buffered(http, (char *)http->sbuffer + http->stream.avail_in, (size_t)buflen);
+ }
+ else if (http->data_encoding == HTTP_ENCODING_CHUNKED)
+ bytes = http_read_chunk(http, (char *)http->sbuffer + http->stream.avail_in, (size_t)buflen);
+ else
+ bytes = 0;
- DEBUG_printf(("2httpRead2: Read " CUPS_LLFMT " bytes into buffer.",
- CUPS_LLCAST bytes));
-#ifdef DEBUG
- http_debug_hex("httpRead2", http->buffer, (int)bytes);
-#endif /* DEBUG */
+ if (bytes < 0)
+ return (bytes);
+ else if (bytes == 0)
+ break;
- http->used = bytes;
- }
+ DEBUG_printf(("1httpRead2: Adding " CUPS_LLFMT " bytes to "
+ "decompression buffer.", CUPS_LLCAST bytes));
- if (http->used > 0)
- {
- if (length > (size_t)http->used)
- length = (size_t)http->used;
+ http->data_remaining -= bytes;
+ http->stream.avail_in += (uInt)bytes;
- bytes = (ssize_t)length;
+ if (http->data_remaining <= 0 &&
+ http->data_encoding == HTTP_ENCODING_CHUNKED)
+ {
+ /*
+ * Read the trailing blank line now...
+ */
- DEBUG_printf(("2httpRead2: grabbing %d bytes from input buffer...",
- (int)bytes));
+ char len[32]; /* Length string */
- memcpy(buffer, http->buffer, length);
- http->used -= (int)length;
+ httpGets(len, sizeof(len), http);
+ }
- if (http->used > 0)
- memmove(http->buffer, http->buffer + length, http->used);
+ bytes = 0;
+ }
+ else
+ return (0);
+ }
+ }
+ while (bytes == 0);
}
-#ifdef HAVE_SSL
- else if (http->tls)
+ else
+#endif /* HAVE_LIBZ */
+ if (http->data_remaining == 0 && http->data_encoding == HTTP_ENCODING_CHUNKED)
{
- if (!http->blocking)
+ if ((bytes = http_read_chunk(http, buffer, length)) > 0)
{
- while (!httpWait(http, http->wait_value))
+ http->data_remaining -= bytes;
+
+ if (http->data_remaining <= 0)
{
- if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
- continue;
+ /*
+ * Read the trailing blank line now...
+ */
- return (0);
- }
- }
+ char len[32]; /* Length string */
- while ((bytes = (ssize_t)http_read_ssl(http, buffer, (int)length)) < 0)
- {
-#ifdef WIN32
- if (WSAGetLastError() == WSAEWOULDBLOCK)
- {
- if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data))
- break;
+ httpGets(len, sizeof(len), http);
}
- else if (WSAGetLastError() != WSAEINTR)
- break;
-#else
- if (errno == EWOULDBLOCK || errno == EAGAIN)
- {
- if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
- break;
- else if (!http->timeout_cb && errno != EAGAIN)
- break;
- }
- else if (errno != EINTR)
- break;
-#endif /* WIN32 */
}
}
-#endif /* HAVE_SSL */
- else
+ else if (http->data_remaining <= 0)
{
- if (!http->blocking)
- {
- while (!httpWait(http, http->wait_value))
- {
- if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
- continue;
+ /*
+ * No more data to read...
+ */
- return (0);
- }
- }
+ return (0);
+ }
+ else
+ {
+ DEBUG_printf(("1httpRead2: Reading up to %d bytes into buffer.",
+ (int)length));
- DEBUG_printf(("2httpRead2: reading " CUPS_LLFMT " bytes from socket...",
- CUPS_LLCAST length));
+ if (length > (size_t)http->data_remaining)
+ length = (size_t)http->data_remaining;
-#ifdef WIN32
- while ((bytes = (ssize_t)recv(http->fd, buffer, (int)length, 0)) < 0)
- {
- if (WSAGetLastError() == WSAEWOULDBLOCK)
- {
- if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data))
- break;
- }
- else if (WSAGetLastError() != WSAEINTR)
- break;
- }
-#else
- while ((bytes = recv(http->fd, buffer, length, 0)) < 0)
+ if ((bytes = http_read_buffered(http, buffer, length)) > 0)
{
- if (errno == EWOULDBLOCK || errno == EAGAIN)
+ http->data_remaining -= bytes;
+
+ if (http->data_remaining <= 0 &&
+ http->data_encoding == HTTP_ENCODING_CHUNKED)
{
- if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
- break;
- else if (!http->timeout_cb && errno != EAGAIN)
- break;
+ /*
+ * Read the trailing blank line now...
+ */
+
+ char len[32]; /* Length string */
+
+ httpGets(len, sizeof(len), http);
}
- else if (errno != EINTR)
- break;
}
-#endif /* WIN32 */
-
- DEBUG_printf(("2httpRead2: read " CUPS_LLFMT " bytes from socket...",
- CUPS_LLCAST bytes));
-#ifdef DEBUG
- http_debug_hex("httpRead2", buffer, (int)bytes);
-#endif /* DEBUG */
}
- if (bytes > 0)
- {
- http->data_remaining -= bytes;
-
- if (http->data_remaining <= INT_MAX)
- http->_data_remaining = (int)http->data_remaining;
- else
- http->_data_remaining = INT_MAX;
- }
- else if (bytes < 0)
- {
-#ifdef WIN32
- if (WSAGetLastError() == WSAEINTR)
- bytes = 0;
- else
- http->error = WSAGetLastError();
-#else
- if (errno == EINTR || (errno == EAGAIN && !http->timeout_cb))
- bytes = 0;
- else
- http->error = errno;
-#endif /* WIN32 */
- }
- else
+ if (
+#ifdef HAVE_LIBZ
+ (http->coding == _HTTP_CODING_IDENTITY ||
+ (http->coding >= _HTTP_CODING_GUNZIP && http->stream.avail_in == 0)) &&
+#endif /* HAVE_LIBZ */
+ ((http->data_remaining <= 0 &&
+ http->data_encoding == HTTP_ENCODING_LENGTH) ||
+ (http->data_encoding == HTTP_ENCODING_CHUNKED && bytes == 0)))
{
- http->error = EPIPE;
- return (0);
- }
+#ifdef HAVE_LIBZ
+ if (http->coding >= _HTTP_CODING_GUNZIP)
+ http_content_coding_finish(http);
+#endif /* HAVE_LIBZ */
- if (http->data_remaining == 0)
- {
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
- httpGets(len, sizeof(len), http);
- else if (http->state == HTTP_POST_RECV)
+ if (http->state == HTTP_STATE_POST_RECV)
http->state ++;
+ else if (http->state == HTTP_STATE_GET_SEND ||
+ http->state == HTTP_STATE_POST_SEND)
+ http->state = HTTP_STATE_WAITING;
else
- http->state = HTTP_WAITING;
+ http->state = HTTP_STATE_STATUS;
+
+ DEBUG_printf(("1httpRead2: End of content, set state to %s.",
+ httpStateString(http->state)));
}
return (bytes);
}
-#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
/*
- * '_httpReadCDSA()' - Read function for the CDSA library.
+ * 'httpReadRequest()' - Read a HTTP request from a connection.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-OSStatus /* O - -1 on error, 0 on success */
-_httpReadCDSA(
- SSLConnectionRef connection, /* I - SSL/TLS connection */
- void *data, /* I - Data buffer */
- size_t *dataLength) /* IO - Number of bytes */
+http_state_t /* O - New state of connection */
+httpReadRequest(http_t *http, /* I - HTTP connection */
+ char *uri, /* I - URI buffer */
+ size_t urilen) /* I - Size of URI buffer */
{
- OSStatus result; /* Return value */
- ssize_t bytes; /* Number of bytes read */
- http_t *http; /* HTTP connection */
+ char line[4096], /* HTTP request line */
+ *req_method, /* HTTP request method */
+ *req_uri, /* HTTP request URI */
+ *req_version; /* HTTP request version number string */
- http = (http_t *)connection;
+ /*
+ * Range check input...
+ */
- if (!http->blocking)
- {
- /*
- * Make sure we have data before we read...
- */
+ DEBUG_printf(("httpReadRequest(http=%p, uri=%p, urilen=" CUPS_LLFMT ")",
+ http, uri, CUPS_LLCAST urilen));
- while (!_httpWait(http, http->wait_value, 0))
- {
- if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
- continue;
+ if (uri)
+ *uri = '\0';
- http->error = ETIMEDOUT;
- return (-1);
- }
+ if (!http || !uri || urilen < 1)
+ {
+ DEBUG_puts("1httpReadRequest: Bad arguments, returning HTTP_STATE_ERROR.");
+ return (HTTP_STATE_ERROR);
}
-
- do
+ else if (http->state != HTTP_STATE_WAITING)
{
- bytes = recv(http->fd, data, *dataLength, 0);
+ DEBUG_printf(("1httpReadRequest: Bad state %s, returning HTTP_STATE_ERROR.",
+ httpStateString(http->state)));
+ return (HTTP_STATE_ERROR);
}
- while (bytes == -1 && (errno == EINTR || errno == EAGAIN));
- if (bytes == *dataLength)
+ /*
+ * Reset state...
+ */
+
+ httpClearFields(http);
+
+ http->activity = time(NULL);
+ http->data_encoding = HTTP_ENCODING_FIELDS;
+ http->data_remaining = 0;
+ http->keep_alive = HTTP_KEEPALIVE_OFF;
+ http->status = HTTP_STATUS_OK;
+ http->version = HTTP_VERSION_1_1;
+
+ /*
+ * Read a line from the socket...
+ */
+
+ if (!httpGets(line, sizeof(line), http))
{
- result = 0;
+ DEBUG_puts("1httpReadRequest: Unable to read, returning HTTP_STATE_ERROR");
+ return (HTTP_STATE_ERROR);
}
- else if (bytes > 0)
+
+ if (!line[0])
{
- *dataLength = bytes;
- result = errSSLWouldBlock;
+ DEBUG_puts("1httpReadRequest: Blank line, returning HTTP_STATE_WAITING");
+ return (HTTP_STATE_WAITING);
}
- else
- {
- *dataLength = 0;
- if (bytes == 0)
- result = errSSLClosedGraceful;
- else if (errno == EAGAIN)
- result = errSSLWouldBlock;
- else
- result = errSSLClosedAbort;
+ DEBUG_printf(("1httpReadRequest: %s", line));
+
+ /*
+ * Parse it...
+ */
+
+ req_method = line;
+ req_uri = line;
+
+ while (*req_uri && !isspace(*req_uri & 255))
+ req_uri ++;
+
+ if (!*req_uri)
+ {
+ DEBUG_puts("1httpReadRequest: No request URI.");
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No request URI."), 1);
+ return (HTTP_STATE_ERROR);
}
- return (result);
-}
-#endif /* HAVE_SSL && HAVE_CDSASSL */
+ *req_uri++ = '\0';
+ while (*req_uri && isspace(*req_uri & 255))
+ req_uri ++;
-#if defined(HAVE_SSL) && defined(HAVE_GNUTLS)
-/*
- * '_httpReadGNUTLS()' - Read function for the GNU TLS library.
- */
+ req_version = req_uri;
-ssize_t /* O - Number of bytes read or -1 on error */
-_httpReadGNUTLS(
- gnutls_transport_ptr ptr, /* I - Connection to server */
- void *data, /* I - Buffer */
- size_t length) /* I - Number of bytes to read */
-{
- http_t *http; /* HTTP connection */
- ssize_t bytes; /* Bytes read */
+ while (*req_version && !isspace(*req_version & 255))
+ req_version ++;
+ if (!*req_version)
+ {
+ DEBUG_puts("1httpReadRequest: No request protocol version.");
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No request protocol version."), 1);
+ return (HTTP_STATE_ERROR);
+ }
- DEBUG_printf(("6_httpReadGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data, (int)length));
+ *req_version++ = '\0';
- http = (http_t *)ptr;
+ while (*req_version && isspace(*req_version & 255))
+ req_version ++;
- if (!http->blocking)
+ /*
+ * Validate...
+ */
+
+ if (!strcmp(req_method, "OPTIONS"))
+ http->state = HTTP_STATE_OPTIONS;
+ else if (!strcmp(req_method, "GET"))
+ http->state = HTTP_STATE_GET;
+ else if (!strcmp(req_method, "HEAD"))
+ http->state = HTTP_STATE_HEAD;
+ else if (!strcmp(req_method, "POST"))
+ http->state = HTTP_STATE_POST;
+ else if (!strcmp(req_method, "PUT"))
+ http->state = HTTP_STATE_PUT;
+ else if (!strcmp(req_method, "DELETE"))
+ http->state = HTTP_STATE_DELETE;
+ else if (!strcmp(req_method, "TRACE"))
+ http->state = HTTP_STATE_TRACE;
+ else if (!strcmp(req_method, "CONNECT"))
+ http->state = HTTP_STATE_CONNECT;
+ else
{
- /*
- * Make sure we have data before we read...
- */
+ DEBUG_printf(("1httpReadRequest: Unknown method \"%s\".", req_method));
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown request method."), 1);
+ return (HTTP_STATE_UNKNOWN_METHOD);
+ }
- while (!_httpWait(http, http->wait_value, 0))
- {
- if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
- continue;
+ DEBUG_printf(("1httpReadRequest: Set state to %s.",
+ httpStateString(http->state)));
- http->error = ETIMEDOUT;
- return (-1);
- }
+ if (!strcmp(req_version, "HTTP/1.0"))
+ {
+ http->version = HTTP_VERSION_1_0;
+ http->keep_alive = HTTP_KEEPALIVE_OFF;
+ }
+ else if (!strcmp(req_version, "HTTP/1.1"))
+ {
+ http->version = HTTP_VERSION_1_1;
+ http->keep_alive = HTTP_KEEPALIVE_ON;
+ }
+ else
+ {
+ DEBUG_printf(("1httpReadRequest: Unknown version \"%s\".", req_version));
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown request version."), 1);
+ return (HTTP_STATE_UNKNOWN_VERSION);
}
- bytes = recv(http->fd, data, length, 0);
- DEBUG_printf(("6_httpReadGNUTLS: bytes=%d", (int)bytes));
- return (bytes);
+ DEBUG_printf(("1httpReadRequest: URI is \"%s\".", req_uri));
+ strlcpy(uri, req_uri, urilen);
+
+ return (http->state);
}
-#endif /* HAVE_SSL && HAVE_GNUTLS */
/*
* 'httpReconnect()' - Reconnect to a HTTP server.
+ *
+ * This function is deprecated. Please use the @link httpReconnect2@ function
+ * instead.
+ *
+ * @deprecated@
*/
int /* O - 0 on success, non-zero on failure */
-httpReconnect(http_t *http) /* I - Connection to server */
+httpReconnect(http_t *http) /* I - HTTP connection */
{
DEBUG_printf(("httpReconnect(http=%p)", http));
@@ -2308,7 +2361,7 @@ httpReconnect(http_t *http) /* I - Connection to server */
*/
int /* O - 0 on success, non-zero on failure */
-httpReconnect2(http_t *http, /* I - Connection to server */
+httpReconnect2(http_t *http, /* I - HTTP connection */
int msec, /* I - Timeout in milliseconds */
int *cancel) /* I - Pointer to "cancel" variable */
{
@@ -2324,7 +2377,7 @@ httpReconnect2(http_t *http, /* I - Connection to server */
if (!http)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (-1);
}
@@ -2332,7 +2385,7 @@ httpReconnect2(http_t *http, /* I - Connection to server */
if (http->tls)
{
DEBUG_puts("2httpReconnect2: Shutting down SSL/TLS...");
- http_shutdown_ssl(http);
+ _httpTLSStop(http);
}
#endif /* HAVE_SSL */
@@ -2344,11 +2397,7 @@ httpReconnect2(http_t *http, /* I - Connection to server */
{
DEBUG_printf(("2httpReconnect2: Closing socket %d...", http->fd));
-#ifdef WIN32
- closesocket(http->fd);
-#else
- close(http->fd);
-#endif /* WIN32 */
+ httpAddrClose(NULL, http->fd);
http->fd = -1;
}
@@ -2357,15 +2406,13 @@ httpReconnect2(http_t *http, /* I - Connection to server */
* Reset all state (except fields, which may be reused)...
*/
- http->state = HTTP_WAITING;
- http->status = HTTP_CONTINUE;
- http->version = HTTP_1_1;
+ http->state = HTTP_STATE_WAITING;
+ http->version = HTTP_VERSION_1_1;
http->keep_alive = HTTP_KEEPALIVE_OFF;
memset(&http->_hostaddr, 0, sizeof(http->_hostaddr));
- http->data_encoding = HTTP_ENCODE_LENGTH;
+ http->data_encoding = HTTP_ENCODING_FIELDS;
http->_data_remaining = 0;
http->used = 0;
- http->expect = 0;
http->data_remaining = 0;
http->hostaddr = NULL;
http->wused = 0;
@@ -2378,7 +2425,7 @@ httpReconnect2(http_t *http, /* I - Connection to server */
for (current = http->addrlist; current; current = current->next)
DEBUG_printf(("2httpReconnect2: Address %s:%d",
httpAddrString(&(current->addr), temp, sizeof(temp)),
- _httpAddrPort(&(current->addr))));
+ httpAddrPort(&(current->addr))));
#endif /* DEBUG */
if ((addr = httpAddrConnect2(http->addrlist, &(http->fd), msec,
@@ -2393,7 +2440,7 @@ httpReconnect2(http_t *http, /* I - Connection to server */
#else
http->error = errno;
#endif /* WIN32 */
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
DEBUG_printf(("1httpReconnect2: httpAddrConnect failed: %s",
strerror(http->error)));
@@ -2410,30 +2457,26 @@ httpReconnect2(http_t *http, /* I - Connection to server */
http->error = 0;
#ifdef HAVE_SSL
- if (http->encryption == HTTP_ENCRYPT_ALWAYS)
+ if (http->encryption == HTTP_ENCRYPTION_ALWAYS)
{
/*
* Always do encryption via SSL.
*/
- if (http_setup_ssl(http) != 0)
+ if (_httpTLSStart(http) != 0)
{
-# ifdef WIN32
- closesocket(http->fd);
-# else
- close(http->fd);
-# endif /* WIN32 */
+ httpAddrClose(NULL, http->fd);
return (-1);
}
}
- else if (http->encryption == HTTP_ENCRYPT_REQUIRED)
- return (http_upgrade(http));
+ else if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls_upgrade)
+ return (http_tls_upgrade(http));
#endif /* HAVE_SSL */
DEBUG_printf(("1httpReconnect2: Connected to %s:%d...",
httpAddrString(http->hostaddr, temp, sizeof(temp)),
- _httpAddrPort(http->hostaddr)));
+ httpAddrPort(http->hostaddr)));
return (0);
}
@@ -2451,7 +2494,7 @@ httpReconnect2(http_t *http, /* I - Connection to server */
*/
void
-httpSetAuthString(http_t *http, /* I - Connection to server */
+httpSetAuthString(http_t *http, /* I - HTTP connection */
const char *scheme, /* I - Auth scheme (NULL to clear it) */
const char *data) /* I - Auth data (NULL for none) */
{
@@ -2473,10 +2516,10 @@ httpSetAuthString(http_t *http, /* I - Connection to server */
* Set the current authorization string...
*/
- int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1;
+ size_t len = strlen(scheme) + (data ? strlen(data) + 1 : 0) + 1;
char *temp;
- if (len > (int)sizeof(http->_authstring))
+ if (len > sizeof(http->_authstring))
{
if ((temp = malloc(len)) == NULL)
len = sizeof(http->_authstring);
@@ -2508,15 +2551,17 @@ httpSetAuthString(http_t *http, /* I - Connection to server */
*/
int /* O - Status of call (0 = success) */
-httpSetCredentials(http_t *http, /* I - Connection to server */
+httpSetCredentials(http_t *http, /* I - HTTP connection */
cups_array_t *credentials) /* I - Array of credentials */
{
if (!http || cupsArrayCount(credentials) < 1)
return (-1);
+#ifdef HAVE_SSL
_httpFreeCredentials(http->tls_credentials);
http->tls_credentials = _httpCreateCredentials(credentials);
+#endif /* HAVE_SSL */
return (http->tls_credentials ? 0 : -1);
}
@@ -2546,17 +2591,71 @@ httpSetCookie(http_t *http, /* I - Connection */
/*
+ * 'httpSetDefaultField()' - Set the default value of an HTTP header.
+ *
+ * Currently only @code HTTP_FIELD_ACCEPT_ENCODING@, @code HTTP_FIELD_SERVER@,
+ * and @code HTTP_FIELD_USER_AGENT@ can be set.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+void
+httpSetDefaultField(http_t *http, /* I - HTTP connection */
+ http_field_t field, /* I - Field index */
+ const char *value)/* I - Value */
+{
+ DEBUG_printf(("httpSetDefaultField(http=%p, field=%d(%s), value=\"%s\")",
+ http, field, http_fields[field], value));
+
+ if (!http)
+ return;
+
+ switch (field)
+ {
+ case HTTP_FIELD_ACCEPT_ENCODING :
+ if (http->default_accept_encoding)
+ _cupsStrFree(http->default_accept_encoding);
+
+ http->default_accept_encoding = value ? _cupsStrAlloc(value) : NULL;
+ break;
+
+ case HTTP_FIELD_SERVER :
+ if (http->default_server)
+ _cupsStrFree(http->default_server);
+
+ http->default_server = value ? _cupsStrAlloc(value) : NULL;
+ break;
+
+ case HTTP_FIELD_USER_AGENT :
+ if (http->default_user_agent)
+ _cupsStrFree(http->default_user_agent);
+
+ http->default_user_agent = value ? _cupsStrAlloc(value) : NULL;
+ break;
+
+ default :
+ DEBUG_puts("1httpSetDefaultField: Ignored.");
+ break;
+ }
+}
+
+
+/*
* 'httpSetExpect()' - Set the Expect: header in a request.
*
- * Currently only HTTP_CONTINUE is supported for the "expect" argument.
+ * Currently only @code HTTP_STATUS_CONTINUE@ is supported for the "expect"
+ * argument.
*
* @since CUPS 1.2/OS X 10.5@
*/
void
-httpSetExpect(http_t *http, /* I - Connection to server */
- http_status_t expect) /* I - HTTP status to expect (HTTP_CONTINUE) */
+httpSetExpect(http_t *http, /* I - HTTP connection */
+ http_status_t expect) /* I - HTTP status to expect
+ (@code HTTP_STATUS_CONTINUE@) */
{
+ DEBUG_printf(("httpSetExpect(http=%p, expect=%d)", http, expect));
+
if (http)
http->expect = expect;
}
@@ -2567,17 +2666,59 @@ httpSetExpect(http_t *http, /* I - Connection to server */
*/
void
-httpSetField(http_t *http, /* I - Connection to server */
+httpSetField(http_t *http, /* I - HTTP connection */
http_field_t field, /* I - Field index */
const char *value) /* I - Value */
{
+ DEBUG_printf(("httpSetField(http=%p, field=%d(%s), value=\"%s\")", http,
+ field, http_fields[field], value));
+
if (http == NULL ||
field < HTTP_FIELD_ACCEPT_LANGUAGE ||
- field > HTTP_FIELD_WWW_AUTHENTICATE ||
+ field >= HTTP_FIELD_MAX ||
value == NULL)
return;
- strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
+ switch (field)
+ {
+ case HTTP_FIELD_ACCEPT_ENCODING :
+ if (http->accept_encoding)
+ _cupsStrFree(http->accept_encoding);
+
+ http->accept_encoding = _cupsStrAlloc(value);
+ break;
+
+ case HTTP_FIELD_ALLOW :
+ if (http->allow)
+ _cupsStrFree(http->allow);
+
+ http->allow = _cupsStrAlloc(value);
+ break;
+
+ case HTTP_FIELD_SERVER :
+ if (http->server)
+ _cupsStrFree(http->server);
+
+ http->server = _cupsStrAlloc(value);
+ break;
+
+ case HTTP_FIELD_WWW_AUTHENTICATE :
+ /* CUPS STR #4503 - don't override WWW-Authenticate for unknown auth schemes */
+ if (http->fields[HTTP_FIELD_WWW_AUTHENTICATE][0] &&
+ _cups_strncasecmp(value, "Basic ", 6) &&
+ _cups_strncasecmp(value, "Digest ", 7) &&
+ _cups_strncasecmp(value, "Negotiate ", 10))
+ {
+ DEBUG_printf(("1httpSetField: Ignoring unknown auth scheme in \"%s\".", value));
+ return;
+ }
+
+ /* Fall through to copy */
+
+ default :
+ strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
+ break;
+ }
if (field == HTTP_FIELD_AUTHORIZATION)
{
@@ -2629,6 +2770,30 @@ httpSetField(http_t *http, /* I - Connection to server */
}
}
}
+#ifdef HAVE_LIBZ
+ else if (field == HTTP_FIELD_CONTENT_ENCODING &&
+ http->data_encoding != HTTP_ENCODING_FIELDS)
+ {
+ DEBUG_puts("1httpSetField: Calling http_content_coding_start.");
+ http_content_coding_start(http, value);
+ }
+#endif /* HAVE_LIBZ */
+}
+
+
+/*
+ * 'httpSetKeepAlive()' - Set the current Keep-Alive state of a connection.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+void
+httpSetKeepAlive(
+ http_t *http, /* I - HTTP connection */
+ http_keepalive_t keep_alive) /* I - New Keep-Alive value */
+{
+ if (http)
+ http->keep_alive = keep_alive;
}
@@ -2639,15 +2804,19 @@ httpSetField(http_t *http, /* I - Connection to server */
*/
void
-httpSetLength(http_t *http, /* I - Connection to server */
+httpSetLength(http_t *http, /* I - HTTP connection */
size_t length) /* I - Length (0 for chunked) */
{
+ DEBUG_printf(("httpSetLength(http=%p, length=" CUPS_LLFMT ")", http,
+ CUPS_LLCAST length));
+
if (!http)
return;
if (!length)
{
- strcpy(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked");
+ strlcpy(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked",
+ HTTP_MAX_VALUE);
http->fields[HTTP_FIELD_CONTENT_LENGTH][0] = '\0';
}
else
@@ -2670,7 +2839,7 @@ httpSetLength(http_t *http, /* I - Connection to server */
void
httpSetTimeout(
- http_t *http, /* I - Connection to server */
+ http_t *http, /* I - HTTP connection */
double timeout, /* I - Number of seconds for timeout,
must be greater than 0 */
http_timeout_cb_t cb, /* I - Callback function or NULL */
@@ -2691,14 +2860,39 @@ httpSetTimeout(
/*
+ * 'httpShutdown()' - Shutdown one side of an HTTP connection.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+void
+httpShutdown(http_t *http) /* I - HTTP connection */
+{
+ if (!http || http->fd < 0)
+ return;
+
+#ifdef HAVE_SSL
+ if (http->tls)
+ _httpTLSStop(http);
+#endif /* HAVE_SSL */
+
+#ifdef WIN32
+ shutdown(http->fd, SD_RECEIVE); /* Microsoft-ism... */
+#else
+ shutdown(http->fd, SHUT_RD);
+#endif /* WIN32 */
+}
+
+
+/*
* 'httpTrace()' - Send an TRACE request to the server.
*/
int /* O - Status of call (0 = success) */
-httpTrace(http_t *http, /* I - Connection to server */
+httpTrace(http_t *http, /* I - HTTP connection */
const char *uri) /* I - URI for trace */
{
- return (http_send(http, HTTP_TRACE, uri));
+ return (http_send(http, HTTP_STATE_TRACE, uri));
}
@@ -2710,7 +2904,7 @@ httpTrace(http_t *http, /* I - Connection to server */
*/
int /* O - 1 to continue, 0 to stop */
-_httpUpdate(http_t *http, /* I - Connection to server */
+_httpUpdate(http_t *http, /* I - HTTP connection */
http_status_t *status) /* O - Current HTTP status */
{
char line[32768], /* Line from connection... */
@@ -2720,7 +2914,7 @@ _httpUpdate(http_t *http, /* I - Connection to server */
DEBUG_printf(("_httpUpdate(http=%p, status=%p), state=%s", http, status,
- http_states[http->state]));
+ httpStateString(http->state)));
/*
* Grab a single line from the connection...
@@ -2728,7 +2922,7 @@ _httpUpdate(http_t *http, /* I - Connection to server */
if (!httpGets(line, sizeof(line), http))
{
- *status = HTTP_ERROR;
+ *status = HTTP_STATUS_ERROR;
return (0);
}
@@ -2740,62 +2934,76 @@ _httpUpdate(http_t *http, /* I - Connection to server */
* Blank line means the start of the data section (if any). Return
* the result code, too...
*
- * If we get status 100 (HTTP_CONTINUE), then we *don't* change states.
- * Instead, we just return HTTP_CONTINUE to the caller and keep on
- * tryin'...
+ * If we get status 100 (HTTP_STATUS_CONTINUE), then we *don't* change
+ * states. Instead, we just return HTTP_STATUS_CONTINUE to the caller and
+ * keep on tryin'...
*/
- if (http->status == HTTP_CONTINUE)
+ if (http->status == HTTP_STATUS_CONTINUE)
{
*status = http->status;
return (0);
}
- if (http->status < HTTP_BAD_REQUEST)
+ if (http->status < HTTP_STATUS_BAD_REQUEST)
http->digest_tries = 0;
#ifdef HAVE_SSL
- if (http->status == HTTP_SWITCHING_PROTOCOLS && !http->tls)
+ if (http->status == HTTP_STATUS_SWITCHING_PROTOCOLS && !http->tls)
{
- if (http_setup_ssl(http) != 0)
+ if (_httpTLSStart(http) != 0)
{
-# ifdef WIN32
- closesocket(http->fd);
-# else
- close(http->fd);
-# endif /* WIN32 */
+ httpAddrClose(NULL, http->fd);
- *status = http->status = HTTP_ERROR;
+ *status = http->status = HTTP_STATUS_ERROR;
return (0);
}
- *status = HTTP_CONTINUE;
+ *status = HTTP_STATUS_CONTINUE;
return (0);
}
#endif /* HAVE_SSL */
- httpGetLength2(http);
+ if (http_set_length(http) < 0)
+ {
+ DEBUG_puts("1_httpUpdate: Bad Content-Length.");
+ http->error = EINVAL;
+ http->status = *status = HTTP_STATUS_ERROR;
+ return (0);
+ }
switch (http->state)
{
- case HTTP_GET :
- case HTTP_POST :
- case HTTP_POST_RECV :
- case HTTP_PUT :
+ case HTTP_STATE_GET :
+ case HTTP_STATE_POST :
+ case HTTP_STATE_POST_RECV :
+ case HTTP_STATE_PUT :
http->state ++;
- case HTTP_POST_SEND :
- case HTTP_HEAD :
+
+ DEBUG_printf(("1_httpUpdate: Set state to %s.",
+ httpStateString(http->state)));
+
+ case HTTP_STATE_POST_SEND :
+ case HTTP_STATE_HEAD :
break;
default :
- http->state = HTTP_WAITING;
+ http->state = HTTP_STATE_WAITING;
+
+ DEBUG_puts("1_httpUpdate: Reset state to HTTP_STATE_WAITING.");
break;
}
+#ifdef HAVE_LIBZ
+ DEBUG_puts("1_httpUpdate: Calling http_content_coding_start.");
+ http_content_coding_start(http,
+ httpGetField(http, HTTP_FIELD_CONTENT_ENCODING));
+#endif /* HAVE_LIBZ */
+
*status = http->status;
return (0);
}
- else if (!strncmp(line, "HTTP/", 5))
+ else if (!strncmp(line, "HTTP/", 5) && http->mode == _HTTP_MODE_CLIENT)
{
/*
* Got the beginning of a response...
@@ -2805,10 +3013,12 @@ _httpUpdate(http_t *http, /* I - Connection to server */
if (sscanf(line, "HTTP/%d.%d%d", &major, &minor, &intstatus) != 3)
{
- *status = http->status = HTTP_ERROR;
+ *status = http->status = HTTP_STATUS_ERROR;
return (0);
}
+ httpClearFields(http);
+
http->version = (http_version_t)(major * 100 + minor);
*status = http->status = (http_status_t)intstatus;
}
@@ -2822,6 +3032,8 @@ _httpUpdate(http_t *http, /* I - Connection to server */
while (_cups_isspace(*value))
value ++;
+ DEBUG_printf(("1_httpUpdate: Header %s: %s", line, value));
+
/*
* Be tolerants of servers that send unknown attribute fields...
*/
@@ -2842,7 +3054,7 @@ _httpUpdate(http_t *http, /* I - Connection to server */
httpSetCookie(http, value);
}
- else if ((field = http_field(line)) != HTTP_FIELD_UNKNOWN)
+ else if ((field = httpFieldValue(line)) != HTTP_FIELD_UNKNOWN)
httpSetField(http, field, value);
#ifdef DEBUG
else
@@ -2852,7 +3064,8 @@ _httpUpdate(http_t *http, /* I - Connection to server */
else
{
DEBUG_printf(("1_httpUpdate: Bad response line \"%s\"!", line));
- *status = http->status = HTTP_ERROR;
+ http->error = EINVAL;
+ http->status = *status = HTTP_STATUS_ERROR;
return (0);
}
@@ -2865,13 +3078,13 @@ _httpUpdate(http_t *http, /* I - Connection to server */
*/
http_status_t /* O - HTTP status */
-httpUpdate(http_t *http) /* I - Connection to server */
+httpUpdate(http_t *http) /* I - HTTP connection */
{
http_status_t status; /* Request status */
DEBUG_printf(("httpUpdate(http=%p), state=%s", http,
- http_states[http->state]));
+ httpStateString(http->state)));
/*
* Flush pending data, if any...
@@ -2882,15 +3095,15 @@ httpUpdate(http_t *http) /* I - Connection to server */
DEBUG_puts("2httpUpdate: flushing buffer...");
if (httpFlushWrite(http) < 0)
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
* If we haven't issued any commands, then there is nothing to "update"...
*/
- if (http->state == HTTP_WAITING)
- return (HTTP_CONTINUE);
+ if (http->state == HTTP_STATE_WAITING)
+ return (HTTP_STATUS_CONTINUE);
/*
* Grab all of the lines we can from the connection...
@@ -2902,7 +3115,7 @@ httpUpdate(http_t *http) /* I - Connection to server */
* See if there was an error...
*/
- if (http->error == EPIPE && http->status > HTTP_CONTINUE)
+ if (http->error == EPIPE && http->status > HTTP_STATUS_CONTINUE)
{
DEBUG_printf(("1httpUpdate: Returning status %d...", http->status));
return (http->status);
@@ -2912,8 +3125,8 @@ httpUpdate(http_t *http) /* I - Connection to server */
{
DEBUG_printf(("1httpUpdate: socket error %d - %s", http->error,
strerror(http->error)));
- http->status = HTTP_ERROR;
- return (HTTP_ERROR);
+ http->status = HTTP_STATUS_ERROR;
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -2929,7 +3142,7 @@ httpUpdate(http_t *http) /* I - Connection to server */
*/
int /* O - 1 if data is available, 0 otherwise */
-_httpWait(http_t *http, /* I - Connection to server */
+_httpWait(http_t *http, /* I - HTTP connection */
int msec, /* I - Milliseconds to wait */
int usessl) /* I - Use SSL context? */
{
@@ -2955,32 +3168,10 @@ _httpWait(http_t *http, /* I - Connection to server */
*/
#ifdef HAVE_SSL
- if (http->tls && usessl)
+ if (http->tls && _httpTLSPending(http))
{
-# ifdef HAVE_LIBSSL
- if (SSL_pending(http->tls))
- {
- DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data.");
- return (1);
- }
-
-# elif defined(HAVE_GNUTLS)
- if (gnutls_record_check_pending(http->tls))
- {
- DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data.");
- return (1);
- }
-
-# elif defined(HAVE_CDSASSL)
- size_t bytes; /* Bytes that are available */
-
- if (!SSLGetBufferedReadSize(http->tls, &bytes) &&
- bytes > 0)
- {
- DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data.");
- return (1);
- }
-# endif /* HAVE_LIBSSL */
+ DEBUG_puts("5_httpWait: Return 1 since there is pending TLS data.");
+ return (1);
}
#endif /* HAVE_SSL */
@@ -3040,7 +3231,7 @@ _httpWait(http_t *http, /* I - Connection to server */
*/
int /* O - 1 if data is available, 0 otherwise */
-httpWait(http_t *http, /* I - Connection to server */
+httpWait(http_t *http, /* I - HTTP connection */
int msec) /* I - Milliseconds to wait */
{
/*
@@ -3058,6 +3249,14 @@ httpWait(http_t *http, /* I - Connection to server */
return (1);
}
+#ifdef HAVE_LIBZ
+ if (http->coding >= _HTTP_CODING_GUNZIP && http->stream.avail_in > 0)
+ {
+ DEBUG_puts("3httpWait: Returning 1 since there is buffered data ready.");
+ return (1);
+ }
+#endif /* HAVE_LIBZ */
+
/*
* Flush pending data, if any...
*/
@@ -3088,11 +3287,11 @@ httpWait(http_t *http, /* I - Connection to server */
*/
int /* O - Number of bytes written */
-httpWrite(http_t *http, /* I - Connection to server */
+httpWrite(http_t *http, /* I - HTTP connection */
const char *buffer, /* I - Buffer for data */
int length) /* I - Number of bytes to write */
{
- return ((int)httpWrite2(http, buffer, length));
+ return ((int)httpWrite2(http, buffer, (size_t)length));
}
@@ -3103,7 +3302,7 @@ httpWrite(http_t *http, /* I - Connection to server */
*/
ssize_t /* O - Number of bytes written */
-httpWrite2(http_t *http, /* I - Connection to server */
+httpWrite2(http_t *http, /* I - HTTP connection */
const char *buffer, /* I - Buffer for data */
size_t length) /* I - Number of bytes to write */
{
@@ -3117,8 +3316,11 @@ httpWrite2(http_t *http, /* I - Connection to server */
* Range check input...
*/
- if (http == NULL || buffer == NULL)
+ if (!http || !buffer)
+ {
+ DEBUG_puts("1httpWrite2: Returning -1 due to bad input.");
return (-1);
+ }
/*
* Mark activity on the connection...
@@ -3130,9 +3332,60 @@ httpWrite2(http_t *http, /* I - Connection to server */
* Buffer small writes for better performance...
*/
+#ifdef HAVE_LIBZ
+ if (http->coding == _HTTP_CODING_GZIP || http->coding == _HTTP_CODING_DEFLATE)
+ {
+ DEBUG_printf(("1httpWrite2: http->coding=%d", http->coding));
+
+ if (length == 0)
+ {
+ http_content_coding_finish(http);
+ bytes = 0;
+ }
+ else
+ {
+ size_t slen; /* Bytes to write */
+ ssize_t sret; /* Bytes written */
+
+ http->stream.next_in = (Bytef *)buffer;
+ http->stream.avail_in = (uInt)length;
+
+ while (deflate(&(http->stream), Z_NO_FLUSH) == Z_OK)
+ {
+ DEBUG_printf(("1httpWrite2: avail_out=%d", http->stream.avail_out));
+
+ if (http->stream.avail_out > 0)
+ continue;
+
+ slen = _HTTP_MAX_SBUFFER - http->stream.avail_out;
+
+ DEBUG_printf(("1httpWrite2: Writing intermediate chunk, len=%d", (int)slen));
+
+ if (slen > 0 && http->data_encoding == HTTP_ENCODING_CHUNKED)
+ sret = http_write_chunk(http, (char *)http->sbuffer, slen);
+ else if (slen > 0)
+ sret = http_write(http, (char *)http->sbuffer, slen);
+ else
+ sret = 0;
+
+ if (sret < 0)
+ {
+ DEBUG_puts("1httpWrite2: Unable to write, returning -1.");
+ return (-1);
+ }
+
+ http->stream.next_out = (Bytef *)http->sbuffer;
+ http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+ }
+
+ bytes = (ssize_t)length;
+ }
+ }
+ else
+#endif /* HAVE_LIBZ */
if (length > 0)
{
- if (http->wused && (length + http->wused) > sizeof(http->wbuffer))
+ if (http->wused && (length + (size_t)http->wused) > sizeof(http->wbuffer))
{
DEBUG_printf(("2httpWrite2: Flushing buffer (wused=%d, length="
CUPS_LLFMT ")", http->wused, CUPS_LLCAST length));
@@ -3140,8 +3393,7 @@ httpWrite2(http_t *http, /* I - Connection to server */
httpFlushWrite(http);
}
- if ((length + http->wused) <= sizeof(http->wbuffer) &&
- length < sizeof(http->wbuffer))
+ if ((length + (size_t)http->wused) <= sizeof(http->wbuffer) && length < sizeof(http->wbuffer))
{
/*
* Write to buffer...
@@ -3163,16 +3415,16 @@ httpWrite2(http_t *http, /* I - Connection to server */
DEBUG_printf(("2httpWrite2: Writing " CUPS_LLFMT " bytes to socket...",
CUPS_LLCAST length));
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
- bytes = (ssize_t)http_write_chunk(http, buffer, (int)length);
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED)
+ bytes = (ssize_t)http_write_chunk(http, buffer, length);
else
- bytes = (ssize_t)http_write(http, buffer, (int)length);
+ bytes = (ssize_t)http_write(http, buffer, length);
DEBUG_printf(("2httpWrite2: Wrote " CUPS_LLFMT " bytes...",
CUPS_LLCAST bytes));
}
- if (http->data_encoding == HTTP_ENCODE_LENGTH)
+ if (http->data_encoding == HTTP_ENCODING_LENGTH)
http->data_remaining -= bytes;
}
else
@@ -3182,20 +3434,26 @@ httpWrite2(http_t *http, /* I - Connection to server */
* Handle end-of-request processing...
*/
- if ((http->data_encoding == HTTP_ENCODE_CHUNKED && length == 0) ||
- (http->data_encoding == HTTP_ENCODE_LENGTH && http->data_remaining == 0))
+ if ((http->data_encoding == HTTP_ENCODING_CHUNKED && length == 0) ||
+ (http->data_encoding == HTTP_ENCODING_LENGTH && http->data_remaining == 0))
{
/*
* Finished with the transfer; unless we are sending POST or PUT
* data, go idle...
*/
- DEBUG_puts("2httpWrite: changing states...");
+#ifdef HAVE_LIBZ
+ if (http->coding == _HTTP_CODING_GZIP || http->coding == _HTTP_CODING_DEFLATE)
+ http_content_coding_finish(http);
+#endif /* HAVE_LIBZ */
if (http->wused)
- httpFlushWrite(http);
+ {
+ if (httpFlushWrite(http) < 0)
+ return (-1);
+ }
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED)
{
/*
* Send a 0-length chunk at the end of the request...
@@ -3207,238 +3465,543 @@ httpWrite2(http_t *http, /* I - Connection to server */
* Reset the data state...
*/
- http->data_encoding = HTTP_ENCODE_LENGTH;
+ http->data_encoding = HTTP_ENCODING_FIELDS;
http->data_remaining = 0;
}
+
+ if (http->state == HTTP_STATE_POST_RECV)
+ http->state ++;
+ else if (http->state == HTTP_STATE_POST_SEND ||
+ http->state == HTTP_STATE_GET_SEND)
+ http->state = HTTP_STATE_WAITING;
+ else
+ http->state = HTTP_STATE_STATUS;
+
+ DEBUG_printf(("2httpWrite2: Changed state to %s.",
+ httpStateString(http->state)));
}
+ DEBUG_printf(("1httpWrite2: Returning " CUPS_LLFMT ".", CUPS_LLCAST bytes));
+
return (bytes);
}
-#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
/*
- * '_httpWriteCDSA()' - Write function for the CDSA library.
+ * 'httpWriteResponse()' - Write a HTTP response to a client connection.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-OSStatus /* O - -1 on error, 0 on success */
-_httpWriteCDSA(
- SSLConnectionRef connection, /* I - SSL/TLS connection */
- const void *data, /* I - Data buffer */
- size_t *dataLength) /* IO - Number of bytes */
+int /* O - 0 on success, -1 on error */
+httpWriteResponse(http_t *http, /* I - HTTP connection */
+ http_status_t status) /* I - Status code */
{
- OSStatus result; /* Return value */
- ssize_t bytes; /* Number of bytes read */
- http_t *http; /* HTTP connection */
+ http_encoding_t old_encoding; /* Old data_encoding value */
+ off_t old_remaining; /* Old data_remaining value */
- http = (http_t *)connection;
+ /*
+ * Range check input...
+ */
- do
+ DEBUG_printf(("httpWriteResponse(http=%p, status=%d)", http, status));
+
+ if (!http || status < HTTP_STATUS_CONTINUE)
{
- bytes = write(http->fd, data, *dataLength);
+ DEBUG_puts("1httpWriteResponse: Bad input.");
+ return (-1);
}
- while (bytes == -1 && (errno == EINTR || errno == EAGAIN));
- if (bytes == *dataLength)
+ /*
+ * Set the various standard fields if they aren't already...
+ */
+
+ if (!http->fields[HTTP_FIELD_DATE][0])
+ httpSetField(http, HTTP_FIELD_DATE, httpGetDateString(time(NULL)));
+
+ if (status >= HTTP_STATUS_BAD_REQUEST && http->keep_alive)
{
- result = 0;
+ http->keep_alive = HTTP_KEEPALIVE_OFF;
+ httpSetField(http, HTTP_FIELD_KEEP_ALIVE, "");
}
- else if (bytes >= 0)
+
+ if (http->version == HTTP_VERSION_1_1)
{
- *dataLength = bytes;
- result = errSSLWouldBlock;
+ if (!http->fields[HTTP_FIELD_CONNECTION][0])
+ {
+ if (http->keep_alive)
+ httpSetField(http, HTTP_FIELD_CONNECTION, "Keep-Alive");
+ else
+ httpSetField(http, HTTP_FIELD_CONNECTION, "close");
+ }
+
+ if (http->keep_alive && !http->fields[HTTP_FIELD_KEEP_ALIVE][0])
+ httpSetField(http, HTTP_FIELD_KEEP_ALIVE, "timeout=10");
}
- else
+
+#ifdef HAVE_SSL
+ if (status == HTTP_STATUS_UPGRADE_REQUIRED ||
+ status == HTTP_STATUS_SWITCHING_PROTOCOLS)
{
- *dataLength = 0;
+ if (!http->fields[HTTP_FIELD_CONNECTION][0])
+ httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade");
- if (errno == EAGAIN)
- result = errSSLWouldBlock;
- else
- result = errSSLClosedAbort;
+ if (!http->fields[HTTP_FIELD_UPGRADE][0])
+ httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0");
+
+ if (!http->fields[HTTP_FIELD_CONTENT_LENGTH][0])
+ httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, "0");
}
+#endif /* HAVE_SSL */
- return (result);
-}
-#endif /* HAVE_SSL && HAVE_CDSASSL */
+ if (!http->server)
+ httpSetField(http, HTTP_FIELD_SERVER,
+ http->default_server ? http->default_server : CUPS_MINIMAL);
+ /*
+ * Set the Accept-Encoding field if it isn't already...
+ */
-#if defined(HAVE_SSL) && defined(HAVE_GNUTLS)
-/*
- * '_httpWriteGNUTLS()' - Write function for the GNU TLS library.
- */
+ if (!http->accept_encoding)
+ httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING,
+ http->default_accept_encoding ? http->default_accept_encoding :
+#ifdef HAVE_LIBZ
+ "gzip, deflate, identity");
+#else
+ "identity");
+#endif /* HAVE_LIBZ */
-ssize_t /* O - Number of bytes written or -1 on error */
-_httpWriteGNUTLS(
- gnutls_transport_ptr ptr, /* I - Connection to server */
- const void *data, /* I - Data buffer */
- size_t length) /* I - Number of bytes to write */
-{
- ssize_t bytes; /* Bytes written */
+ /*
+ * Send the response header...
+ */
+ old_encoding = http->data_encoding;
+ old_remaining = http->data_remaining;
+ http->data_encoding = HTTP_ENCODING_FIELDS;
- DEBUG_printf(("6_httpWriteGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data,
- (int)length));
-#ifdef DEBUG
- http_debug_hex("_httpWriteGNUTLS", data, (int)length);
-#endif /* DEBUG */
+ if (httpPrintf(http, "HTTP/%d.%d %d %s\r\n", http->version / 100,
+ http->version % 100, (int)status, httpStatus(status)) < 0)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+
+ if (status != HTTP_STATUS_CONTINUE)
+ {
+ /*
+ * 100 Continue doesn't have the rest of the response headers...
+ */
- bytes = send(((http_t *)ptr)->fd, data, length, 0);
- DEBUG_printf(("_httpWriteGNUTLS: bytes=%d", (int)bytes));
+ int i; /* Looping var */
+ const char *value; /* Field value */
- return (bytes);
+ for (i = 0; i < HTTP_FIELD_MAX; i ++)
+ {
+ if ((value = httpGetField(http, i)) != NULL && *value)
+ {
+ if (httpPrintf(http, "%s: %s\r\n", http_fields[i], value) < 1)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+ }
+ }
+
+ if (http->cookie)
+ {
+ if (strchr(http->cookie, ';'))
+ {
+ if (httpPrintf(http, "Set-Cookie: %s\r\n", http->cookie) < 1)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+ }
+ else if (httpPrintf(http, "Set-Cookie: %s; path=/; httponly;%s\r\n", http->cookie, http->tls ? " secure;" : "") < 1)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+ }
+
+ /*
+ * "Click-jacking" defense (STR #4492)...
+ */
+
+ if (httpPrintf(http, "X-Frame-Options: DENY\r\n"
+ "Content-Security-Policy: frame-ancestors 'none'\r\n") < 1)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+ }
+
+ if (httpWrite2(http, "\r\n", 2) < 2)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+
+ if (httpFlushWrite(http) < 0)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ return (-1);
+ }
+
+ if (status == HTTP_STATUS_CONTINUE ||
+ status == HTTP_STATUS_SWITCHING_PROTOCOLS)
+ {
+ /*
+ * Restore the old data_encoding and data_length values...
+ */
+
+ http->data_encoding = old_encoding;
+ http->data_remaining = old_remaining;
+
+ if (old_remaining <= INT_MAX)
+ http->_data_remaining = (int)old_remaining;
+ else
+ http->_data_remaining = INT_MAX;
+ }
+ else if (http->state == HTTP_STATE_OPTIONS ||
+ http->state == HTTP_STATE_HEAD ||
+ http->state == HTTP_STATE_PUT ||
+ http->state == HTTP_STATE_TRACE ||
+ http->state == HTTP_STATE_CONNECT ||
+ http->state == HTTP_STATE_STATUS)
+ {
+ DEBUG_printf(("1httpWriteResponse: Resetting state to HTTP_STATE_WAITING, "
+ "was %s.", httpStateString(http->state)));
+ http->state = HTTP_STATE_WAITING;
+ }
+ else
+ {
+ /*
+ * Force data_encoding and data_length to be set according to the response
+ * headers...
+ */
+
+ http_set_length(http);
+
+ if (http->data_encoding == HTTP_ENCODING_LENGTH && http->data_remaining == 0)
+ {
+ DEBUG_printf(("1httpWriteResponse: Resetting state to HTTP_STATE_WAITING, "
+ "was %s.", httpStateString(http->state)));
+ http->state = HTTP_STATE_WAITING;
+ return (0);
+ }
+
+#ifdef HAVE_LIBZ
+ /*
+ * Then start any content encoding...
+ */
+
+ DEBUG_puts("1httpWriteResponse: Calling http_content_coding_start.");
+ http_content_coding_start(http,
+ httpGetField(http, HTTP_FIELD_CONTENT_ENCODING));
+#endif /* HAVE_LIBZ */
+
+ }
+
+ return (0);
}
-#endif /* HAVE_SSL && HAVE_GNUTLS */
-#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
+#ifdef HAVE_LIBZ
/*
- * 'http_bio_ctrl()' - Control the HTTP connection.
+ * 'http_content_coding_finish()' - Finish doing any content encoding.
*/
-static long /* O - Result/data */
-http_bio_ctrl(BIO *h, /* I - BIO data */
- int cmd, /* I - Control command */
- long arg1, /* I - First argument */
- void *arg2) /* I - Second argument */
+static void
+http_content_coding_finish(
+ http_t *http) /* I - HTTP connection */
{
- switch (cmd)
+ int zerr; /* Compression status */
+ Byte dummy[1]; /* Dummy read buffer */
+ size_t bytes; /* Number of bytes to write */
+
+
+ DEBUG_printf(("http_content_coding_finish(http=%p)", http));
+ DEBUG_printf(("1http_content_coding_finishing: http->coding=%d", http->coding));
+
+ switch (http->coding)
{
- default :
- return (0);
+ case _HTTP_CODING_DEFLATE :
+ case _HTTP_CODING_GZIP :
+ http->stream.next_in = dummy;
+ http->stream.avail_in = 0;
- case BIO_CTRL_RESET :
- h->ptr = NULL;
- return (0);
+ do
+ {
+ zerr = deflate(&(http->stream), Z_FINISH);
+ bytes = _HTTP_MAX_SBUFFER - http->stream.avail_out;
- case BIO_C_SET_FILE_PTR :
- h->ptr = arg2;
- h->init = 1;
- return (1);
+ if (bytes > 0)
+ {
+ DEBUG_printf(("1http_content_coding_finish: Writing trailing chunk, len=%d", (int)bytes));
- case BIO_C_GET_FILE_PTR :
- if (arg2)
- {
- *((void **)arg2) = h->ptr;
- return (1);
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED)
+ http_write_chunk(http, (char *)http->sbuffer, bytes);
+ else
+ http_write(http, (char *)http->sbuffer, bytes);
+ }
+
+ http->stream.next_out = (Bytef *)http->sbuffer;
+ http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
}
- else
- return (0);
+ while (zerr == Z_OK);
- case BIO_CTRL_DUP :
- case BIO_CTRL_FLUSH :
- return (1);
+ deflateEnd(&(http->stream));
+
+ free(http->sbuffer);
+ http->sbuffer = NULL;
+
+ if (http->wused)
+ httpFlushWrite(http);
+ break;
+
+ case _HTTP_CODING_INFLATE :
+ case _HTTP_CODING_GUNZIP :
+ inflateEnd(&(http->stream));
+ free(http->sbuffer);
+ http->sbuffer = NULL;
+ break;
+
+ default :
+ break;
}
+
+ http->coding = _HTTP_CODING_IDENTITY;
}
/*
- * 'http_bio_free()' - Free OpenSSL data.
+ * 'http_content_coding_start()' - Start doing content encoding.
*/
-static int /* O - 1 on success, 0 on failure */
-http_bio_free(BIO *h) /* I - BIO data */
+static void
+http_content_coding_start(
+ http_t *http, /* I - HTTP connection */
+ const char *value) /* I - Value of Content-Encoding */
{
- if (!h)
- return (0);
+ int zerr; /* Error/status */
+ _http_coding_t coding; /* Content coding value */
+
- if (h->shutdown)
+ DEBUG_printf(("http_content_coding_start(http=%p, value=\"%s\")", http,
+ value));
+
+ if (http->coding != _HTTP_CODING_IDENTITY)
{
- h->init = 0;
- h->flags = 0;
+ DEBUG_printf(("1http_content_coding_start: http->coding already %d.",
+ http->coding));
+ return;
+ }
+ else if (!strcmp(value, "x-gzip") || !strcmp(value, "gzip"))
+ {
+ if (http->state == HTTP_STATE_GET_SEND ||
+ http->state == HTTP_STATE_POST_SEND)
+ coding = http->mode == _HTTP_MODE_SERVER ? _HTTP_CODING_GZIP :
+ _HTTP_CODING_GUNZIP;
+ else if (http->state == HTTP_STATE_POST_RECV ||
+ http->state == HTTP_STATE_PUT_RECV)
+ coding = http->mode == _HTTP_MODE_CLIENT ? _HTTP_CODING_GZIP :
+ _HTTP_CODING_GUNZIP;
+ else
+ {
+ DEBUG_puts("1http_content_coding_start: Not doing content coding.");
+ return;
+ }
+ }
+ else if (!strcmp(value, "x-deflate") || !strcmp(value, "deflate"))
+ {
+ if (http->state == HTTP_STATE_GET_SEND ||
+ http->state == HTTP_STATE_POST_SEND)
+ coding = http->mode == _HTTP_MODE_SERVER ? _HTTP_CODING_DEFLATE :
+ _HTTP_CODING_INFLATE;
+ else if (http->state == HTTP_STATE_POST_RECV ||
+ http->state == HTTP_STATE_PUT_RECV)
+ coding = http->mode == _HTTP_MODE_CLIENT ? _HTTP_CODING_DEFLATE :
+ _HTTP_CODING_INFLATE;
+ else
+ {
+ DEBUG_puts("1http_content_coding_start: Not doing content coding.");
+ return;
+ }
+ }
+ else
+ {
+ DEBUG_puts("1http_content_coding_start: Not doing content coding.");
+ return;
}
- return (1);
-}
+ memset(&(http->stream), 0, sizeof(http->stream));
+ switch (coding)
+ {
+ case _HTTP_CODING_DEFLATE :
+ case _HTTP_CODING_GZIP :
+ if (http->wused)
+ httpFlushWrite(http);
+
+ if ((http->sbuffer = malloc(_HTTP_MAX_SBUFFER)) == NULL)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ http->error = errno;
+ return;
+ }
-/*
- * 'http_bio_new()' - Initialize an OpenSSL BIO structure.
- */
+ /*
+ * Window size for compression is 11 bits - optimal based on PWG Raster
+ * sample files on pwg.org. -11 is raw deflate, 27 is gzip, per ZLIB
+ * documentation.
+ */
+
+ if ((zerr = deflateInit2(&(http->stream), Z_DEFAULT_COMPRESSION,
+ Z_DEFLATED,
+ coding == _HTTP_CODING_DEFLATE ? -11 : 27, 7,
+ Z_DEFAULT_STRATEGY)) < Z_OK)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
+ return;
+ }
+
+ http->stream.next_out = (Bytef *)http->sbuffer;
+ http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+ break;
-static int /* O - 1 on success, 0 on failure */
-http_bio_new(BIO *h) /* I - BIO data */
-{
- if (!h)
- return (0);
+ case _HTTP_CODING_INFLATE :
+ case _HTTP_CODING_GUNZIP :
+ if ((http->sbuffer = malloc(_HTTP_MAX_SBUFFER)) == NULL)
+ {
+ http->status = HTTP_STATUS_ERROR;
+ http->error = errno;
+ return;
+ }
+
+ /*
+ * Window size for decompression is up to 15 bits (maximum supported).
+ * -15 is raw inflate, 31 is gunzip, per ZLIB documentation.
+ */
+
+ if ((zerr = inflateInit2(&(http->stream),
+ coding == _HTTP_CODING_INFLATE ? -15 : 31))
+ < Z_OK)
+ {
+ free(http->sbuffer);
+ http->sbuffer = NULL;
+ http->status = HTTP_STATUS_ERROR;
+ http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
+ return;
+ }
+
+ http->stream.avail_in = 0;
+ http->stream.next_in = http->sbuffer;
+ break;
- h->init = 0;
- h->num = 0;
- h->ptr = NULL;
- h->flags = 0;
+ default :
+ break;
+ }
- return (1);
+ http->coding = coding;
+
+ DEBUG_printf(("1http_content_coding_start: http->coding now %d.",
+ http->coding));
}
+#endif /* HAVE_LIBZ */
/*
- * 'http_bio_puts()' - Send a string for OpenSSL.
+ * 'http_create()' - Create an unconnected HTTP connection.
*/
-static int /* O - Bytes written */
-http_bio_puts(BIO *h, /* I - BIO data */
- const char *str) /* I - String to write */
+static http_t * /* O - HTTP connection */
+http_create(
+ const char *host, /* I - Hostname */
+ int port, /* I - Port number */
+ http_addrlist_t *addrlist, /* I - Address list or NULL */
+ int family, /* I - Address family or AF_UNSPEC */
+ http_encryption_t encryption, /* I - Encryption to use */
+ int blocking, /* I - 1 for blocking mode */
+ _http_mode_t mode) /* I - _HTTP_MODE_CLIENT or _SERVER */
{
-#ifdef WIN32
- return (send(((http_t *)h->ptr)->fd, str, (int)strlen(str), 0));
-#else
- return (send(((http_t *)h->ptr)->fd, str, strlen(str), 0));
-#endif /* WIN32 */
-}
+ http_t *http; /* New HTTP connection */
+ char service[255]; /* Service name */
+ http_addrlist_t *myaddrlist = NULL; /* My address list */
-/*
- * 'http_bio_read()' - Read data for OpenSSL.
- */
+ DEBUG_printf(("4http_create(host=\"%s\", port=%d, addrlist=%p, family=%d, "
+ "encryption=%d, blocking=%d, mode=%d)", host, port, addrlist,
+ family, encryption, blocking, mode));
-static int /* O - Bytes read */
-http_bio_read(BIO *h, /* I - BIO data */
- char *buf, /* I - Buffer */
- int size) /* I - Number of bytes to read */
-{
- http_t *http; /* HTTP connection */
+ if (!host && mode == _HTTP_MODE_CLIENT)
+ return (NULL);
+ httpInitialize();
- http = (http_t *)h->ptr;
+ /*
+ * Lookup the host...
+ */
- if (!http->blocking)
+ if (addrlist)
{
- /*
- * Make sure we have data before we read...
- */
+ myaddrlist = httpAddrCopyList(addrlist);
+ }
+ else
+ {
+ snprintf(service, sizeof(service), "%d", port);
- while (!_httpWait(http, http->wait_value, 0))
- {
- if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
- continue;
+ myaddrlist = httpAddrGetList(host, family, service);
+ }
-#ifdef WIN32
- http->error = WSAETIMEDOUT;
-#else
- http->error = ETIMEDOUT;
-#endif /* WIN32 */
+ if (!myaddrlist)
+ return (NULL);
- return (-1);
- }
+ /*
+ * Allocate memory for the structure...
+ */
+
+ if ((http = calloc(sizeof(http_t), 1)) == NULL)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
+ httpAddrFreeList(addrlist);
+ return (NULL);
}
- return (recv(http->fd, buf, size, 0));
-}
+ /*
+ * Initialize the HTTP data...
+ */
+ http->mode = mode;
+ http->activity = time(NULL);
+ http->addrlist = myaddrlist;
+ http->blocking = blocking;
+ http->fd = -1;
+#ifdef HAVE_GSSAPI
+ http->gssctx = GSS_C_NO_CONTEXT;
+ http->gssname = GSS_C_NO_NAME;
+#endif /* HAVE_GSSAPI */
+ http->status = HTTP_STATUS_CONTINUE;
+ http->version = HTTP_VERSION_1_1;
-/*
- * 'http_bio_write()' - Write data for OpenSSL.
- */
+ if (host)
+ strlcpy(http->hostname, host, sizeof(http->hostname));
-static int /* O - Bytes written */
-http_bio_write(BIO *h, /* I - BIO data */
- const char *buf, /* I - Buffer to write */
- int num) /* I - Number of bytes to write */
-{
- return (send(((http_t *)h->ptr)->fd, buf, num, 0));
+ if (port == 443) /* Always use encryption for https */
+ http->encryption = HTTP_ENCRYPTION_ALWAYS;
+ else
+ http->encryption = encryption;
+
+ http_set_wait(http);
+
+ /*
+ * Return the new structure...
+ */
+
+ return (http);
}
-#endif /* HAVE_SSL && HAVE_LIBSSL */
#ifdef DEBUG
@@ -3469,16 +4032,16 @@ http_debug_hex(const char *prefix, /* I - Prefix for line */
for (i = 0; i < bytes; i += 16)
{
for (j = 0, ptr = start; j < 16 && (i + j) < bytes; j ++, ptr += 2)
- sprintf(ptr, "%02X", buffer[i + j] & 255);
+ snprintf(ptr, 3, "%02X", buffer[i + j] & 255);
while (j < 16)
{
- strcpy(ptr, " ");
+ memcpy(ptr, " ", 3);
ptr += 2;
j ++;
}
- strcpy(ptr, " ");
+ memcpy(ptr, " ", 3);
ptr += 2;
for (j = 0; j < 16 && (i + j) < bytes; j ++)
@@ -3488,7 +4051,7 @@ http_debug_hex(const char *prefix, /* I - Prefix for line */
if (ch < ' ' || ch >= 127)
ch = '.';
- *ptr++ = ch;
+ *ptr++ = (char)ch;
}
*ptr = '\0';
@@ -3499,127 +4062,244 @@ http_debug_hex(const char *prefix, /* I - Prefix for line */
/*
- * 'http_field()' - Return the field index for a field name.
+ * 'http_read()' - Read a buffer from a HTTP connection.
+ *
+ * This function does the low-level read from the socket, retrying and timing
+ * out as needed.
*/
-static http_field_t /* O - Field index */
-http_field(const char *name) /* I - String name */
+static ssize_t /* O - Number of bytes read or -1 on error */
+http_read(http_t *http, /* I - HTTP connection */
+ char *buffer, /* I - Buffer */
+ size_t length) /* I - Maximum bytes to read */
{
- int i; /* Looping var */
+ ssize_t bytes; /* Bytes read */
- for (i = 0; i < HTTP_FIELD_MAX; i ++)
- if (_cups_strcasecmp(name, http_fields[i]) == 0)
- return ((http_field_t)i);
+ DEBUG_printf(("http_read(http=%p, buffer=%p, length=" CUPS_LLFMT ")", http,
+ buffer, CUPS_LLCAST length));
- return (HTTP_FIELD_UNKNOWN);
-}
+ if (!http->blocking)
+ {
+ while (!httpWait(http, http->wait_value))
+ {
+ if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
+ continue;
+ DEBUG_puts("2http_read: Timeout.");
+ return (0);
+ }
+ }
+ DEBUG_printf(("2http_read: Reading %d bytes into buffer.", (int)length));
+
+ do
+ {
#ifdef HAVE_SSL
+ if (http->tls)
+ bytes = _httpTLSRead(http, buffer, (int)length);
+ else
+#endif /* HAVE_SSL */
+ bytes = recv(http->fd, buffer, length, 0);
+
+ if (bytes < 0)
+ {
+#ifdef WIN32
+ if (WSAGetLastError() != WSAEINTR)
+ {
+ http->error = WSAGetLastError();
+ return (-1);
+ }
+ else if (WSAGetLastError() == WSAEWOULDBLOCK)
+ {
+ if (!http->timeout_cb ||
+ !(*http->timeout_cb)(http, http->timeout_data))
+ {
+ http->error = WSAEWOULDBLOCK;
+ return (-1);
+ }
+ }
+#else
+ DEBUG_printf(("2http_read: %s", strerror(errno)));
+
+ if (errno == EWOULDBLOCK || errno == EAGAIN)
+ {
+ if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
+ {
+ http->error = errno;
+ return (-1);
+ }
+ else if (!http->timeout_cb && errno != EAGAIN)
+ {
+ http->error = errno;
+ return (-1);
+ }
+ }
+ else if (errno != EINTR)
+ {
+ http->error = errno;
+ return (-1);
+ }
+#endif /* WIN32 */
+ }
+ }
+ while (bytes < 0);
+
+ DEBUG_printf(("2http_read: Read " CUPS_LLFMT " bytes into buffer.",
+ CUPS_LLCAST bytes));
+#ifdef DEBUG
+ if (bytes > 0)
+ http_debug_hex("http_read", buffer, (int)bytes);
+#endif /* DEBUG */
+
+ if (bytes < 0)
+ {
+#ifdef WIN32
+ if (WSAGetLastError() == WSAEINTR)
+ bytes = 0;
+ else
+ http->error = WSAGetLastError();
+#else
+ if (errno == EINTR || (errno == EAGAIN && !http->timeout_cb))
+ bytes = 0;
+ else
+ http->error = errno;
+#endif /* WIN32 */
+ }
+ else if (bytes == 0)
+ {
+ http->error = EPIPE;
+ return (0);
+ }
+
+ return (bytes);
+}
+
+
/*
- * 'http_read_ssl()' - Read from a SSL/TLS connection.
+ * 'http_read_buffered()' - Do a buffered read from a HTTP connection.
+ *
+ * This function reads data from the HTTP buffer or from the socket, as needed.
*/
-static int /* O - Bytes read */
-http_read_ssl(http_t *http, /* I - Connection to server */
- char *buf, /* I - Buffer to store data */
- int len) /* I - Length of buffer */
+static ssize_t /* O - Number of bytes read or -1 on error */
+http_read_buffered(http_t *http, /* I - HTTP connection */
+ char *buffer, /* I - Buffer */
+ size_t length) /* I - Maximum bytes to read */
{
-# if defined(HAVE_LIBSSL)
- return (SSL_read((SSL *)(http->tls), buf, len));
-
-# elif defined(HAVE_GNUTLS)
- ssize_t result; /* Return value */
+ ssize_t bytes; /* Bytes read */
- result = gnutls_record_recv(http->tls, buf, len);
+ DEBUG_printf(("http_read_buffered(http=%p, buffer=%p, length=" CUPS_LLFMT
+ ") used=%d",
+ http, buffer, CUPS_LLCAST length, http->used));
- if (result < 0 && !errno)
+ if (http->used > 0)
{
- /*
- * Convert GNU TLS error to errno value...
- */
+ if (length > (size_t)http->used)
+ bytes = (ssize_t)http->used;
+ else
+ bytes = (ssize_t)length;
- switch (result)
- {
- case GNUTLS_E_INTERRUPTED :
- errno = EINTR;
- break;
+ DEBUG_printf(("2http_read: Grabbing %d bytes from input buffer.",
+ (int)bytes));
- case GNUTLS_E_AGAIN :
- errno = EAGAIN;
- break;
+ memcpy(buffer, http->buffer, (size_t)bytes);
+ http->used -= (int)bytes;
- default :
- errno = EPIPE;
- break;
- }
-
- result = -1;
+ if (http->used > 0)
+ memmove(http->buffer, http->buffer + bytes, (size_t)http->used);
}
+ else
+ bytes = http_read(http, buffer, length);
+
+ return (bytes);
+}
- return ((int)result);
-# elif defined(HAVE_CDSASSL)
- int result; /* Return value */
- OSStatus error; /* Error info */
- size_t processed; /* Number of bytes processed */
+/*
+ * 'http_read_chunk()' - Read a chunk from a HTTP connection.
+ *
+ * This function reads and validates the chunk length, then does a buffered read
+ * returning the number of bytes placed in the buffer.
+ */
+static ssize_t /* O - Number of bytes read or -1 on error */
+http_read_chunk(http_t *http, /* I - HTTP connection */
+ char *buffer, /* I - Buffer */
+ size_t length) /* I - Maximum bytes to read */
+{
+ DEBUG_printf(("http_read_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
+ http, buffer, CUPS_LLCAST length));
- error = SSLRead(http->tls, buf, len, &processed);
- DEBUG_printf(("6http_read_ssl: error=%d, processed=%d", (int)error,
- (int)processed));
- switch (error)
+ if (http->data_remaining <= 0)
{
- case 0 :
- result = (int)processed;
- break;
+ char len[32]; /* Length string */
- case errSSLWouldBlock :
- if (processed)
- result = (int)processed;
- else
- {
- result = -1;
- errno = EINTR;
- }
- break;
+ if (!httpGets(len, sizeof(len), http))
+ {
+ DEBUG_puts("1http_read_chunk: Could not get chunk length.");
+ return (0);
+ }
- case errSSLClosedGraceful :
- default :
- if (processed)
- result = (int)processed;
- else
- {
- result = -1;
- errno = EPIPE;
- }
- break;
+ if (!len[0])
+ {
+ DEBUG_puts("1http_read_chunk: Blank chunk length, trying again...");
+ if (!httpGets(len, sizeof(len), http))
+ {
+ DEBUG_puts("1http_read_chunk: Could not get chunk length.");
+ return (0);
+ }
+ }
+
+ http->data_remaining = strtoll(len, NULL, 16);
+
+ if (http->data_remaining < 0)
+ {
+ DEBUG_printf(("1http_read_chunk: Negative chunk length \"%s\" ("
+ CUPS_LLFMT ")", len, CUPS_LLCAST http->data_remaining));
+ return (0);
+ }
+
+ DEBUG_printf(("2http_read_chunk: Got chunk length \"%s\" (" CUPS_LLFMT ")",
+ len, CUPS_LLCAST http->data_remaining));
+
+ if (http->data_remaining == 0)
+ {
+ /*
+ * 0-length chunk, grab trailing blank line...
+ */
+
+ httpGets(len, sizeof(len), http);
+ }
}
- return (result);
+ DEBUG_printf(("2http_read_chunk: data_remaining=" CUPS_LLFMT,
+ CUPS_LLCAST http->data_remaining));
-# elif defined(HAVE_SSPISSL)
- return _sspiRead((_sspi_struct_t*) http->tls, buf, len);
-# endif /* HAVE_LIBSSL */
+ if (http->data_remaining <= 0)
+ return (0);
+ else if (length > (size_t)http->data_remaining)
+ length = (size_t)http->data_remaining;
+
+ return (http_read_buffered(http, buffer, length));
}
-#endif /* HAVE_SSL */
/*
* 'http_send()' - Send a request with all fields and the trailing blank line.
*/
-static int /* O - 0 on success, non-zero on error */
-http_send(http_t *http, /* I - Connection to server */
- http_state_t request, /* I - Request code */
- const char *uri) /* I - URI */
+static int /* O - 0 on success, non-zero on error */
+http_send(http_t *http, /* I - HTTP connection */
+ http_state_t request, /* I - Request code */
+ const char *uri) /* I - URI */
{
- int i; /* Looping var */
- char buf[1024]; /* Encoded URI buffer */
- static const char * const codes[] =
- { /* Request code strings */
+ int i; /* Looping var */
+ char buf[1024]; /* Encoded URI buffer */
+ const char *value; /* Field value */
+ static const char * const codes[] = /* Request code strings */
+ {
NULL,
"OPTIONS",
"GET",
@@ -3632,11 +4312,13 @@ http_send(http_t *http, /* I - Connection to server */
NULL,
"DELETE",
"TRACE",
- "CLOSE"
+ "CLOSE",
+ NULL,
+ NULL
};
- DEBUG_printf(("7http_send(http=%p, request=HTTP_%s, uri=\"%s\")",
+ DEBUG_printf(("4http_send(http=%p, request=HTTP_%s, uri=\"%s\")",
http, codes[request], uri));
if (http == NULL || uri == NULL)
@@ -3648,38 +4330,19 @@ http_send(http_t *http, /* I - Connection to server */
if (!http->fields[HTTP_FIELD_USER_AGENT][0])
{
-#ifdef WIN32
- SYSTEM_INFO sysinfo; /* System information */
- OSVERSIONEX version; /* OS version info */
-
- version.dwOSVersionInfoSize = sizeof(OSVERSIONEX);
- GetVersionInfoEx(&version);
- GetNativeSystemInfo(&sysinfo);
-
- snprintf(buf, sizeof(buf), CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0",
- version.major, version.minor,
- sysinfo.wProcessorArchitecture
- == PROCESSOR_ARCHITECTURE_AMD64 ? "amd64" :
- sysinfo.wProcessorArchitecture
- == PROCESSOR_ARCHITECTURE_ARM ? "arm" :
- sysinfo.wProcessorArchitecture
- == PROCESSOR_ARCHITECTURE_IA64 ? "ia64" :
- sysinfo.wProcessorArchitecture
- == PROCESSOR_ARCHITECTURE_INTEL ? "intel" :
- "unknown");
-
-#else
- struct utsname name; /* uname info */
-
- uname(&name);
+ if (http->default_user_agent)
+ httpSetField(http, HTTP_FIELD_USER_AGENT, http->default_user_agent);
+ else
+ httpSetField(http, HTTP_FIELD_USER_AGENT, cupsUserAgent());
+ }
- snprintf(buf, sizeof(buf), CUPS_MINIMAL " (%s %s; %s) IPP/2.0",
- name.sysname, name.release, name.machine);
-#endif /* WIN32 */
+ /*
+ * Set the Accept-Encoding field if it isn't already...
+ */
- DEBUG_printf(("8http_send: Default User-Agent: %s", buf));
- httpSetField(http, HTTP_FIELD_USER_AGENT, buf);
- }
+ if (!http->accept_encoding && http->default_accept_encoding)
+ httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING,
+ http->default_accept_encoding);
/*
* Encode the URI as needed...
@@ -3691,9 +4354,15 @@ http_send(http_t *http, /* I - Connection to server */
* See if we had an error the last time around; if so, reconnect...
*/
- if (http->status == HTTP_ERROR || http->status >= HTTP_BAD_REQUEST)
- if (httpReconnect(http))
+ if (http->fd < 0 || http->status == HTTP_STATUS_ERROR ||
+ http->status >= HTTP_STATUS_BAD_REQUEST)
+ {
+ DEBUG_printf(("5http_send: Reconnecting, fd=%d, status=%d, tls_upgrade=%d",
+ http->fd, http->status, http->tls_upgrade));
+
+ if (httpReconnect2(http, 30000, NULL))
return (-1);
+ }
/*
* Flush any written data that is pending...
@@ -3702,7 +4371,7 @@ http_send(http_t *http, /* I - Connection to server */
if (http->wused)
{
if (httpFlushWrite(http) < 0)
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
return (-1);
}
@@ -3711,46 +4380,44 @@ http_send(http_t *http, /* I - Connection to server */
*/
http->state = request;
- http->data_encoding = HTTP_ENCODE_FIELDS;
+ http->data_encoding = HTTP_ENCODING_FIELDS;
- if (request == HTTP_POST || request == HTTP_PUT)
+ if (request == HTTP_STATE_POST || request == HTTP_STATE_PUT)
http->state ++;
- http->status = HTTP_CONTINUE;
+ http->status = HTTP_STATUS_CONTINUE;
#ifdef HAVE_SSL
- if (http->encryption == HTTP_ENCRYPT_REQUIRED && !http->tls)
+ if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls)
{
httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade");
- httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.0,SSL/2.0,SSL/3.0");
+ httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0");
}
#endif /* HAVE_SSL */
if (httpPrintf(http, "%s %s HTTP/1.1\r\n", codes[request], buf) < 1)
{
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
return (-1);
}
for (i = 0; i < HTTP_FIELD_MAX; i ++)
- if (http->fields[i][0] != '\0')
+ if ((value = httpGetField(http, i)) != NULL && *value)
{
- DEBUG_printf(("9http_send: %s: %s", http_fields[i],
- httpGetField(http, i)));
+ DEBUG_printf(("5http_send: %s: %s", http_fields[i], value));
if (i == HTTP_FIELD_HOST)
{
- if (httpPrintf(http, "Host: %s:%d\r\n", httpGetField(http, i),
- _httpAddrPort(http->hostaddr)) < 1)
+ if (httpPrintf(http, "Host: %s:%d\r\n", value,
+ httpAddrPort(http->hostaddr)) < 1)
{
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
return (-1);
}
}
- else if (httpPrintf(http, "%s: %s\r\n", http_fields[i],
- httpGetField(http, i)) < 1)
+ else if (httpPrintf(http, "%s: %s\r\n", http_fields[i], value) < 1)
{
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
return (-1);
}
}
@@ -3758,28 +4425,32 @@ http_send(http_t *http, /* I - Connection to server */
if (http->cookie)
if (httpPrintf(http, "Cookie: $Version=0; %s\r\n", http->cookie) < 1)
{
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
return (-1);
}
- if (http->expect == HTTP_CONTINUE &&
- (http->state == HTTP_POST_RECV || http->state == HTTP_PUT_RECV))
+ DEBUG_printf(("5http_send: expect=%d, mode=%d, state=%d", http->expect,
+ http->mode, http->state));
+
+ if (http->expect == HTTP_STATUS_CONTINUE && http->mode == _HTTP_MODE_CLIENT &&
+ (http->state == HTTP_STATE_POST_RECV ||
+ http->state == HTTP_STATE_PUT_RECV))
if (httpPrintf(http, "Expect: 100-continue\r\n") < 1)
{
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
return (-1);
}
if (httpPrintf(http, "\r\n") < 1)
{
- http->status = HTTP_ERROR;
+ http->status = HTTP_STATUS_ERROR;
return (-1);
}
if (httpFlushWrite(http) < 0)
return (-1);
- httpGetLength2(http);
+ http_set_length(http);
httpClearFields(http);
/*
@@ -3802,44 +4473,57 @@ http_send(http_t *http, /* I - Connection to server */
}
-#ifdef HAVE_SSL
-# if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
/*
- * 'http_set_credentials()' - Set the SSL/TLS credentials.
+ * 'http_set_length()' - Set the data_encoding and data_remaining values.
*/
-static int /* O - Status of connection */
-http_set_credentials(http_t *http) /* I - Connection to server */
+static off_t /* O - Remainder or -1 on error */
+http_set_length(http_t *http) /* I - Connection */
{
- _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
- OSStatus error = 0; /* Error code */
- http_tls_credentials_t credentials = NULL;
- /* TLS credentials */
+ off_t remaining; /* Remainder */
- DEBUG_printf(("7http_set_credentials(%p)", http));
+ DEBUG_printf(("http_set_length(http=%p) mode=%d state=%s", http, http->mode,
+ httpStateString(http->state)));
- /*
- * Prefer connection specific credentials...
- */
+ if ((remaining = httpGetLength2(http)) >= 0)
+ {
+ if (http->mode == _HTTP_MODE_SERVER &&
+ http->state != HTTP_STATE_GET_SEND &&
+ http->state != HTTP_STATE_PUT &&
+ http->state != HTTP_STATE_POST &&
+ http->state != HTTP_STATE_POST_SEND)
+ {
+ DEBUG_puts("1http_set_length: Not setting data_encoding/remaining.");
+ return (remaining);
+ }
- if ((credentials = http->tls_credentials) == NULL)
- credentials = cg->tls_credentials;
+ if (!_cups_strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING],
+ "chunked"))
+ {
+ DEBUG_puts("1http_set_length: Setting data_encoding to "
+ "HTTP_ENCODING_CHUNKED.");
+ http->data_encoding = HTTP_ENCODING_CHUNKED;
+ }
+ else
+ {
+ DEBUG_puts("1http_set_length: Setting data_encoding to "
+ "HTTP_ENCODING_LENGTH.");
+ http->data_encoding = HTTP_ENCODING_LENGTH;
+ }
- if (credentials)
- {
- error = SSLSetCertificate(http->tls, credentials);
- DEBUG_printf(("4http_set_credentials: SSLSetCertificate, error=%d",
- (int)error));
+ DEBUG_printf(("1http_set_length: Setting data_remaining to " CUPS_LLFMT ".",
+ CUPS_LLCAST remaining));
+ http->data_remaining = remaining;
+
+ if (remaining <= INT_MAX)
+ http->_data_remaining = (int)remaining;
+ else
+ http->_data_remaining = INT_MAX;
}
- else
- DEBUG_puts("4http_set_credentials: No credentials to set.");
- return (error);
+ return (remaining);
}
-# endif /* HAVE_CDSASSL && HAVE_SECCERTIFICATECOPYDATA */
-#endif /* HAVE_SSL */
-
/*
* 'http_set_timeout()' - Set the socket timeout values.
@@ -3853,8 +4537,8 @@ http_set_timeout(int fd, /* I - File descriptor */
DWORD tv = (DWORD)(timeout * 1000);
/* Timeout in milliseconds */
- setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
- setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
+ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CUPS_SOCAST &tv, sizeof(tv));
+ setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, CUPS_SOCAST &tv, sizeof(tv));
#else
struct timeval tv; /* Timeout in secs and usecs */
@@ -3862,8 +4546,8 @@ http_set_timeout(int fd, /* I - File descriptor */
tv.tv_sec = (int)timeout;
tv.tv_usec = (int)(1000000 * fmod(timeout, 1.0));
- setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
- setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
+ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CUPS_SOCAST &tv, sizeof(tv));
+ setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, CUPS_SOCAST &tv, sizeof(tv));
#endif /* WIN32 */
}
@@ -3873,7 +4557,7 @@ http_set_timeout(int fd, /* I - File descriptor */
*/
static void
-http_set_wait(http_t *http) /* I - Connection to server */
+http_set_wait(http_t *http) /* I - HTTP connection */
{
if (http->blocking)
{
@@ -3889,526 +4573,17 @@ http_set_wait(http_t *http) /* I - Connection to server */
#ifdef HAVE_SSL
/*
- * 'http_setup_ssl()' - Set up SSL/TLS support on a connection.
- */
-
-static int /* O - 0 on success, -1 on failure */
-http_setup_ssl(http_t *http) /* I - Connection to server */
-{
- int any_root; /* Allow any root */
- char hostname[256], /* Hostname */
- *hostptr; /* Pointer into hostname */
- _cups_globals_t *cg = _cupsGlobals();
- /* Pointer to library globals */
-# ifdef HAVE_LIBSSL
- SSL_CTX *context; /* Context for encryption */
- BIO *bio; /* BIO data */
- const char *message = NULL;/* Error message */
-# elif defined(HAVE_GNUTLS)
- int status; /* Status of handshake */
- gnutls_certificate_client_credentials *credentials;
- /* TLS credentials */
-# elif defined(HAVE_CDSASSL)
- OSStatus error; /* Error code */
- const char *message = NULL;/* Error message */
-# ifdef HAVE_SECCERTIFICATECOPYDATA
- cups_array_t *credentials; /* Credentials array */
- cups_array_t *names; /* CUPS distinguished names */
- CFArrayRef dn_array; /* CF distinguished names array */
- CFIndex count; /* Number of credentials */
- CFDataRef data; /* Certificate data */
- int i; /* Looping var */
- http_credential_t *credential; /* Credential data */
-# endif /* HAVE_SECCERTIFICATECOPYDATA */
-# elif defined(HAVE_SSPISSL)
- TCHAR username[256]; /* Username returned from GetUserName() */
- TCHAR commonName[256];/* Common name for certificate */
- DWORD dwSize; /* 32 bit size */
-# endif /* HAVE_LIBSSL */
-
-
- DEBUG_printf(("7http_setup_ssl(http=%p)", http));
-
- /*
- * Always allow self-signed certificates for the local loopback address...
- */
-
- if (httpAddrLocalhost(http->hostaddr))
- {
- any_root = 1;
- strlcpy(hostname, "localhost", sizeof(hostname));
- }
- else
- {
- /*
- * Otherwise use the system-wide setting and make sure the hostname we have
- * does not end in a trailing dot.
- */
-
- any_root = cg->any_root;
-
- strlcpy(hostname, http->hostname, sizeof(hostname));
- if ((hostptr = hostname + strlen(hostname) - 1) >= hostname &&
- *hostptr == '.')
- *hostptr = '\0';
- }
-
-# ifdef HAVE_LIBSSL
- (void)any_root;
-
- context = SSL_CTX_new(SSLv23_client_method());
-
- SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */
-
- bio = BIO_new(_httpBIOMethods());
- BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)http);
-
- http->tls = SSL_new(context);
- SSL_set_bio(http->tls, bio, bio);
-
-# ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
- SSL_set_tlsext_host_name(http->tls, hostname);
-# endif /* HAVE_SSL_SET_TLSEXT_HOST_NAME */
-
- if (SSL_connect(http->tls) != 1)
- {
- unsigned long error; /* Error code */
-
- while ((error = ERR_get_error()) != 0)
- {
- message = ERR_error_string(error, NULL);
- DEBUG_printf(("8http_setup_ssl: %s", message));
- }
-
- SSL_CTX_free(context);
- SSL_free(http->tls);
- http->tls = NULL;
-
-# ifdef WIN32
- http->error = WSAGetLastError();
-# else
- http->error = errno;
-# endif /* WIN32 */
- http->status = HTTP_ERROR;
-
- if (!message)
- message = _("Unable to establish a secure connection to host.");
-
- _cupsSetError(IPP_PKI_ERROR, message, 1);
-
- return (-1);
- }
-
-# elif defined(HAVE_GNUTLS)
- (void)any_root;
-
- credentials = (gnutls_certificate_client_credentials *)
- malloc(sizeof(gnutls_certificate_client_credentials));
- if (credentials == NULL)
- {
- DEBUG_printf(("8http_setup_ssl: Unable to allocate credentials: %s",
- strerror(errno)));
- http->error = errno;
- http->status = HTTP_ERROR;
- _cupsSetHTTPError(HTTP_ERROR);
-
- return (-1);
- }
-
- gnutls_certificate_allocate_credentials(credentials);
-
- gnutls_init(&http->tls, GNUTLS_CLIENT);
- gnutls_set_default_priority(http->tls);
- gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, hostname,
- strlen(hostname));
- gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials);
- gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr)http);
- gnutls_transport_set_pull_function(http->tls, _httpReadGNUTLS);
- gnutls_transport_set_push_function(http->tls, _httpWriteGNUTLS);
-
- while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS)
- {
- DEBUG_printf(("8http_setup_ssl: gnutls_handshake returned %d (%s)",
- status, gnutls_strerror(status)));
-
- if (gnutls_error_is_fatal(status))
- {
- http->error = EIO;
- http->status = HTTP_ERROR;
-
- _cupsSetError(IPP_PKI_ERROR, gnutls_strerror(status), 0);
-
- gnutls_deinit(http->tls);
- gnutls_certificate_free_credentials(*credentials);
- free(credentials);
- http->tls = NULL;
-
- return (-1);
- }
- }
-
- http->tls_credentials = credentials;
-
-# elif defined(HAVE_CDSASSL)
- if ((error = SSLNewContext(false, &http->tls)))
- {
- http->error = errno;
- http->status = HTTP_ERROR;
- _cupsSetHTTPError(HTTP_ERROR);
-
- return (-1);
- }
-
- error = SSLSetConnection(http->tls, http);
- DEBUG_printf(("4http_setup_ssl: SSLSetConnection, error=%d", (int)error));
-
- if (!error)
- {
- error = SSLSetIOFuncs(http->tls, _httpReadCDSA, _httpWriteCDSA);
- DEBUG_printf(("4http_setup_ssl: SSLSetIOFuncs, error=%d", (int)error));
- }
-
- if (!error)
- {
- error = SSLSetAllowsAnyRoot(http->tls, any_root);
- DEBUG_printf(("4http_setup_ssl: SSLSetAllowsAnyRoot(%d), error=%d",
- any_root, (int)error));
- }
-
- if (!error)
- {
- error = SSLSetAllowsExpiredCerts(http->tls, cg->expired_certs);
- DEBUG_printf(("4http_setup_ssl: SSLSetAllowsExpiredCerts(%d), error=%d",
- cg->expired_certs, (int)error));
- }
-
- if (!error)
- {
- error = SSLSetAllowsExpiredRoots(http->tls, cg->expired_root);
- DEBUG_printf(("4http_setup_ssl: SSLSetAllowsExpiredRoots(%d), error=%d",
- cg->expired_root, (int)error));
- }
-
- /*
- * In general, don't verify certificates since things like the common name
- * often do not match...
- */
-
- if (!error)
- {
- error = SSLSetEnableCertVerify(http->tls, false);
- DEBUG_printf(("4http_setup_ssl: SSLSetEnableCertVerify, error=%d",
- (int)error));
- }
-
-# ifdef HAVE_SECCERTIFICATECOPYDATA
- if (!error)
- {
- if (cg->client_cert_cb)
- {
- error = SSLSetSessionOption(http->tls,
- kSSLSessionOptionBreakOnCertRequested, true);
- DEBUG_printf(("4http_setup_ssl: kSSLSessionOptionBreakOnCertRequested, "
- "error=%d", (int)error));
- }
- else
- {
- error = http_set_credentials(http);
- DEBUG_printf(("4http_setup_ssl: http_set_credentials, error=%d",
- (int)error));
- }
- }
-
- /*
- * If there's a server certificate callback installed let it evaluate the
- * certificate(s) during the handshake...
- */
-
- if (!error && cg->server_cert_cb != NULL)
- {
- error = SSLSetSessionOption(http->tls,
- kSSLSessionOptionBreakOnServerAuth, true);
- DEBUG_printf(("4http_setup_ssl: kSSLSessionOptionBreakOnServerAuth, "
- "error=%d", (int)error));
- }
-# endif /* HAVE_SECCERTIFICATECOPYDATA */
-
- /*
- * Let the server know which hostname/domain we are trying to connect to
- * in case it wants to serve up a certificate with a matching common name.
- */
-
- if (!error)
- {
- error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname));
-
- DEBUG_printf(("4http_setup_ssl: SSLSetPeerDomainName, error=%d",
- (int)error));
- }
-
- if (!error)
- {
- int done = 0; /* Are we done yet? */
-
- while (!error && !done)
- {
- error = SSLHandshake(http->tls);
-
- DEBUG_printf(("4http_setup_ssl: SSLHandshake returned %d.", (int)error));
-
- switch (error)
- {
- case noErr :
- done = 1;
- break;
-
- case errSSLWouldBlock :
- error = noErr; /* Force a retry */
- usleep(1000); /* in 1 millisecond */
- break;
-
-# ifdef HAVE_SECCERTIFICATECOPYDATA
- case errSSLServerAuthCompleted :
- error = 0;
- if (cg->server_cert_cb)
- {
- error = httpCopyCredentials(http, &credentials);
- if (!error)
- {
- error = (cg->server_cert_cb)(http, http->tls, credentials,
- cg->server_cert_data);
- httpFreeCredentials(credentials);
- }
-
- DEBUG_printf(("4http_setup_ssl: Server certificate callback "
- "returned %d.", (int)error));
- }
- break;
-
- case errSSLClientCertRequested :
- error = 0;
-
- if (cg->client_cert_cb)
- {
- names = NULL;
- if (!(error = SSLCopyDistinguishedNames(http->tls, &dn_array)) &&
- dn_array)
- {
- if ((names = cupsArrayNew(NULL, NULL)) != NULL)
- {
- for (i = 0, count = CFArrayGetCount(dn_array); i < count; i++)
- {
- data = (CFDataRef)CFArrayGetValueAtIndex(dn_array, i);
-
- if ((credential = malloc(sizeof(*credential))) != NULL)
- {
- credential->datalen = CFDataGetLength(data);
- if ((credential->data = malloc(credential->datalen)))
- {
- memcpy((void *)credential->data, CFDataGetBytePtr(data),
- credential->datalen);
- cupsArrayAdd(names, credential);
- }
- else
- free(credential);
- }
- }
- }
-
- CFRelease(dn_array);
- }
-
- if (!error)
- {
- error = (cg->client_cert_cb)(http, http->tls, names,
- cg->client_cert_data);
-
- DEBUG_printf(("4http_setup_ssl: Client certificate callback "
- "returned %d.", (int)error));
- }
-
- httpFreeCredentials(names);
- }
- break;
-# endif /* HAVE_SECCERTIFICATECOPYDATA */
-
- case errSSLUnknownRootCert :
- message = _("Unable to establish a secure connection to host "
- "(untrusted certificate).");
- break;
-
- case errSSLNoRootCert :
- message = _("Unable to establish a secure connection to host "
- "(self-signed certificate).");
- break;
-
- case errSSLCertExpired :
- message = _("Unable to establish a secure connection to host "
- "(expired certificate).");
- break;
-
- case errSSLCertNotYetValid :
- message = _("Unable to establish a secure connection to host "
- "(certificate not yet valid).");
- break;
-
- case errSSLHostNameMismatch :
- message = _("Unable to establish a secure connection to host "
- "(host name mismatch).");
- break;
-
- case errSSLXCertChainInvalid :
- message = _("Unable to establish a secure connection to host "
- "(certificate chain invalid).");
- break;
-
- case errSSLConnectionRefused :
- message = _("Unable to establish a secure connection to host "
- "(peer dropped connection before responding).");
- break;
-
- default :
- break;
- }
- }
- }
-
- if (error)
- {
- http->error = error;
- http->status = HTTP_ERROR;
- errno = ECONNREFUSED;
-
- SSLDisposeContext(http->tls);
- http->tls = NULL;
-
- /*
- * If an error string wasn't set by the callbacks use a generic one...
- */
-
- if (!message)
-#ifdef HAVE_CSSMERRORSTRING
- message = cssmErrorString(error);
-#else
- message = _("Unable to establish a secure connection to host.");
-#endif /* HAVE_CSSMERRORSTRING */
-
- _cupsSetError(IPP_PKI_ERROR, message, 1);
-
- return (-1);
- }
-
-# elif defined(HAVE_SSPISSL)
- http->tls = _sspiAlloc();
-
- if (!http->tls)
- {
- _cupsSetHTTPError(HTTP_ERROR);
- return (-1);
- }
-
- http->tls->sock = http->fd;
- dwSize = sizeof(username) / sizeof(TCHAR);
- GetUserName(username, &dwSize);
- _sntprintf_s(commonName, sizeof(commonName) / sizeof(TCHAR),
- sizeof(commonName) / sizeof(TCHAR), TEXT("CN=%s"), username);
-
- if (!_sspiGetCredentials(http->tls_credentials, L"ClientContainer",
- commonName, FALSE))
- {
- _sspiFree(http->tls_credentials);
- http->tls_credentials = NULL;
-
- http->error = EIO;
- http->status = HTTP_ERROR;
-
- _cupsSetError(IPP_PKI_ERROR,
- _("Unable to establish a secure connection to host."), 1);
-
- return (-1);
- }
-
- _sspiSetAllowsAnyRoot(http->tls_credentials, any_root);
- _sspiSetAllowsExpiredCerts(http->tls_credentials, TRUE);
-
- if (!_sspiConnect(http->tls_credentials, hostname))
- {
- _sspiFree(http->tls_credentials);
- http->tls_credentials = NULL;
-
- http->error = EIO;
- http->status = HTTP_ERROR;
-
- _cupsSetError(IPP_PKI_ERROR,
- _("Unable to establish a secure connection to host."), 1);
-
- return (-1);
- }
-# endif /* HAVE_CDSASSL */
-
- return (0);
-}
-
-
-/*
- * 'http_shutdown_ssl()' - Shut down SSL/TLS on a connection.
- */
-
-static void
-http_shutdown_ssl(http_t *http) /* I - Connection to server */
-{
-# ifdef HAVE_LIBSSL
- SSL_CTX *context; /* Context for encryption */
-
- context = SSL_get_SSL_CTX(http->tls);
-
- SSL_shutdown(http->tls);
- SSL_CTX_free(context);
- SSL_free(http->tls);
-
-# elif defined(HAVE_GNUTLS)
- gnutls_certificate_client_credentials *credentials;
- /* TLS credentials */
-
- credentials = (gnutls_certificate_client_credentials *)(http->tls_credentials);
-
- gnutls_bye(http->tls, GNUTLS_SHUT_RDWR);
- gnutls_deinit(http->tls);
- gnutls_certificate_free_credentials(*credentials);
- free(credentials);
-
-# elif defined(HAVE_CDSASSL)
- while (SSLClose(http->tls) == errSSLWouldBlock)
- usleep(1000);
-
- SSLDisposeContext(http->tls);
-
- if (http->tls_credentials)
- CFRelease(http->tls_credentials);
-
-# elif defined(HAVE_SSPISSL)
- _sspiFree(http->tls_credentials);
-# endif /* HAVE_LIBSSL */
-
- http->tls = NULL;
- http->tls_credentials = NULL;
-}
-#endif /* HAVE_SSL */
-
-
-#ifdef HAVE_SSL
-/*
- * 'http_upgrade()' - Force upgrade to TLS encryption.
+ * 'http_tls_upgrade()' - Force upgrade to TLS encryption.
*/
static int /* O - Status of connection */
-http_upgrade(http_t *http) /* I - Connection to server */
+http_tls_upgrade(http_t *http) /* I - HTTP connection */
{
int ret; /* Return value */
http_t myhttp; /* Local copy of HTTP data */
- DEBUG_printf(("7http_upgrade(%p)", http));
+ DEBUG_printf(("7http_tls_upgrade(%p)", http));
/*
* Flush the connection to make sure any previous "Upgrade" message
@@ -4429,11 +4604,12 @@ http_upgrade(http_t *http) /* I - Connection to server */
* encryption on the link...
*/
+ http->tls_upgrade = 1;
http->field_authorization = NULL; /* Don't free the auth string */
httpClearFields(http);
httpSetField(http, HTTP_FIELD_CONNECTION, "upgrade");
- httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2, TLS/1.1, TLS/1.0, SSL/3.0");
+ httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0");
if ((ret = httpOptions(http, "*")) == 0)
{
@@ -4441,7 +4617,7 @@ http_upgrade(http_t *http) /* I - Connection to server */
* Wait for the secure connection...
*/
- while (httpUpdate(http) == HTTP_CONTINUE);
+ while (httpUpdate(http) == HTTP_STATUS_CONTINUE);
}
/*
@@ -4455,6 +4631,7 @@ http_upgrade(http_t *http) /* I - Connection to server */
http->expect = myhttp.expect;
http->field_authorization = myhttp.field_authorization;
http->digest_tries = myhttp.digest_tries;
+ http->tls_upgrade = 0;
/*
* See if we actually went secure...
@@ -4466,13 +4643,10 @@ http_upgrade(http_t *http) /* I - Connection to server */
* Server does not support HTTP upgrade...
*/
- DEBUG_puts("8http_upgrade: Server does not support HTTP upgrade!");
+ DEBUG_puts("8http_tls_upgrade: Server does not support HTTP upgrade!");
-# ifdef WIN32
- closesocket(http->fd);
-# else
- close(http->fd);
-# endif
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, _("Encryption is not supported."), 1);
+ httpAddrClose(NULL, http->fd);
http->fd = -1;
@@ -4488,17 +4662,17 @@ http_upgrade(http_t *http) /* I - Connection to server */
* 'http_write()' - Write a buffer to a HTTP connection.
*/
-static int /* O - Number of bytes written */
-http_write(http_t *http, /* I - Connection to server */
+static ssize_t /* O - Number of bytes written */
+http_write(http_t *http, /* I - HTTP connection */
const char *buffer, /* I - Buffer for data */
- int length) /* I - Number of bytes to write */
+ size_t length) /* I - Number of bytes to write */
{
- int tbytes, /* Total bytes sent */
- bytes; /* Bytes sent */
+ ssize_t tbytes, /* Total bytes sent */
+ bytes; /* Bytes sent */
- DEBUG_printf(("2http_write(http=%p, buffer=%p, length=%d)", http, buffer,
- length));
+ DEBUG_printf(("2http_write(http=%p, buffer=%p, length=" CUPS_LLFMT ")", http,
+ buffer, CUPS_LLCAST length));
http->error = 0;
tbytes = 0;
@@ -4565,13 +4739,13 @@ http_write(http_t *http, /* I - Connection to server */
#ifdef HAVE_SSL
if (http->tls)
- bytes = http_write_ssl(http, buffer, length);
+ bytes = _httpTLSWrite(http, buffer, (int)length);
else
#endif /* HAVE_SSL */
bytes = send(http->fd, buffer, length, 0);
- DEBUG_printf(("3http_write: Write of %d bytes returned %d.", (int)length,
- (int)bytes));
+ DEBUG_printf(("3http_write: Write of " CUPS_LLFMT " bytes returned "
+ CUPS_LLFMT ".", CUPS_LLCAST length, CUPS_LLCAST bytes));
if (bytes < 0)
{
@@ -4619,14 +4793,14 @@ http_write(http_t *http, /* I - Connection to server */
buffer += bytes;
tbytes += bytes;
- length -= bytes;
+ length -= (size_t)bytes;
}
#ifdef DEBUG
- http_debug_hex("http_write", buffer - tbytes, tbytes);
+ http_debug_hex("http_write", buffer - tbytes, (int)tbytes);
#endif /* DEBUG */
- DEBUG_printf(("3http_write: Returning %d.", tbytes));
+ DEBUG_printf(("3http_write: Returning " CUPS_LLFMT ".", CUPS_LLCAST tbytes));
return (tbytes);
}
@@ -4636,38 +4810,38 @@ http_write(http_t *http, /* I - Connection to server */
* 'http_write_chunk()' - Write a chunked buffer.
*/
-static int /* O - Number bytes written */
-http_write_chunk(http_t *http, /* I - Connection to server */
+static ssize_t /* O - Number bytes written */
+http_write_chunk(http_t *http, /* I - HTTP connection */
const char *buffer, /* I - Buffer to write */
- int length) /* I - Length of buffer */
+ size_t length) /* I - Length of buffer */
{
- char header[255]; /* Chunk header */
- int bytes; /* Bytes written */
+ char header[16]; /* Chunk header */
+ ssize_t bytes; /* Bytes written */
- DEBUG_printf(("7http_write_chunk(http=%p, buffer=%p, length=%d)",
- http, buffer, length));
+ DEBUG_printf(("7http_write_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
+ http, buffer, CUPS_LLCAST length));
/*
* Write the chunk header, data, and trailer.
*/
- sprintf(header, "%x\r\n", length);
- if (http_write(http, header, (int)strlen(header)) < 0)
+ snprintf(header, sizeof(header), "%x\r\n", (unsigned)length);
+ if (http_write(http, header, strlen(header)) < 0)
{
- DEBUG_puts("8http_write_chunk: http_write of length failed!");
+ DEBUG_puts("8http_write_chunk: http_write of length failed.");
return (-1);
}
if ((bytes = http_write(http, buffer, length)) < 0)
{
- DEBUG_puts("8http_write_chunk: http_write of buffer failed!");
+ DEBUG_puts("8http_write_chunk: http_write of buffer failed.");
return (-1);
}
if (http_write(http, "\r\n", 2) < 0)
{
- DEBUG_puts("8http_write_chunk: http_write of CR LF failed!");
+ DEBUG_puts("8http_write_chunk: http_write of CR LF failed.");
return (-1);
}
@@ -4675,96 +4849,6 @@ http_write_chunk(http_t *http, /* I - Connection to server */
}
-#ifdef HAVE_SSL
-/*
- * 'http_write_ssl()' - Write to a SSL/TLS connection.
- */
-
-static int /* O - Bytes written */
-http_write_ssl(http_t *http, /* I - Connection to server */
- const char *buf, /* I - Buffer holding data */
- int len) /* I - Length of buffer */
-{
- ssize_t result; /* Return value */
-
-
- DEBUG_printf(("2http_write_ssl(http=%p, buf=%p, len=%d)", http, buf, len));
-
-# if defined(HAVE_LIBSSL)
- result = SSL_write((SSL *)(http->tls), buf, len);
-
-# elif defined(HAVE_GNUTLS)
- result = gnutls_record_send(http->tls, buf, len);
-
- if (result < 0 && !errno)
- {
- /*
- * Convert GNU TLS error to errno value...
- */
-
- switch (result)
- {
- case GNUTLS_E_INTERRUPTED :
- errno = EINTR;
- break;
-
- case GNUTLS_E_AGAIN :
- errno = EAGAIN;
- break;
-
- default :
- errno = EPIPE;
- break;
- }
-
- result = -1;
- }
-
-# elif defined(HAVE_CDSASSL)
- OSStatus error; /* Error info */
- size_t processed; /* Number of bytes processed */
-
-
- error = SSLWrite(http->tls, buf, len, &processed);
-
- switch (error)
- {
- case 0 :
- result = (int)processed;
- break;
-
- case errSSLWouldBlock :
- if (processed)
- result = (int)processed;
- else
- {
- result = -1;
- errno = EINTR;
- }
- break;
-
- case errSSLClosedGraceful :
- default :
- if (processed)
- result = (int)processed;
- else
- {
- result = -1;
- errno = EPIPE;
- }
- break;
- }
-# elif defined(HAVE_SSPISSL)
- return _sspiWrite((_sspi_struct_t *)http->tls, (void *)buf, len);
-# endif /* HAVE_LIBSSL */
-
- DEBUG_printf(("3http_write_ssl: Returning %d.", (int)result));
-
- return ((int)result);
-}
-#endif /* HAVE_SSL */
-
-
/*
- * End of "$Id: http.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http.c 12970 2015-11-13 20:02:51Z msweet $".
*/
diff --git a/cups/http.h b/cups/http.h
index a882ff7..a451a2c 100644
--- a/cups/http.h
+++ b/cups/http.h
@@ -1,18 +1,18 @@
/*
- * "$Id: http.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http.h 12848 2015-08-26 18:51:57Z msweet $"
*
- * Hyper-Text Transport Protocol definitions for CUPS.
+ * Hyper-Text Transport Protocol definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_HTTP_H_
@@ -36,9 +36,6 @@ typedef off_t ssize_t; /* @private@ */
# include <winsock2.h>
# include <ws2tcpip.h>
# else
-# ifdef __sgi
-# define INET6 /* IRIX IPv6 support... */
-# endif /* __sgi */
# include <unistd.h>
# include <sys/time.h>
# include <sys/socket.h>
@@ -90,8 +87,6 @@ extern "C" {
# define s6_addr32 _S6_un._S6_u32
# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)|| defined(__DragonFly__)
# define s6_addr32 __u6_addr.__u6_addr32
-# elif defined(__osf__)
-# define s6_addr32 s6_un.sa6_laddr
# elif defined(WIN32)
/*
* Windows only defines byte and 16-bit word members of the union and
@@ -129,17 +124,30 @@ typedef enum http_auth_e /**** HTTP authentication types ****/
typedef enum http_encoding_e /**** HTTP transfer encoding values ****/
{
- HTTP_ENCODE_LENGTH, /* Data is sent with Content-Length */
- HTTP_ENCODE_CHUNKED, /* Data is chunked */
- HTTP_ENCODE_FIELDS /* Sending HTTP fields */
+ HTTP_ENCODING_LENGTH, /* Data is sent with Content-Length */
+ HTTP_ENCODING_CHUNKED, /* Data is chunked */
+ HTTP_ENCODING_FIELDS /* Sending HTTP fields */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define HTTP_ENCODE_LENGTH HTTP_ENCODING_LENGTH
+# define HTTP_ENCODE_CHUNKED HTTP_ENCODING_CHUNKED
+# define HTTP_ENCODE_FIELDS HTTP_ENCODING_FIELDS
+# endif /* !_CUPS_NO_DEPRECATED */
} http_encoding_t;
typedef enum http_encryption_e /**** HTTP encryption values ****/
{
- HTTP_ENCRYPT_IF_REQUESTED, /* Encrypt if requested (TLS upgrade) */
- HTTP_ENCRYPT_NEVER, /* Never encrypt */
- HTTP_ENCRYPT_REQUIRED, /* Encryption is required (TLS upgrade) */
- HTTP_ENCRYPT_ALWAYS /* Always encrypt (SSL) */
+ HTTP_ENCRYPTION_IF_REQUESTED, /* Encrypt if requested (TLS upgrade) */
+ HTTP_ENCRYPTION_NEVER, /* Never encrypt */
+ HTTP_ENCRYPTION_REQUIRED, /* Encryption is required (TLS upgrade) */
+ HTTP_ENCRYPTION_ALWAYS /* Always encrypt (SSL) */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define HTTP_ENCRYPT_IF_REQUESTED HTTP_ENCRYPTION_IF_REQUESTED
+# define HTTP_ENCRYPT_NEVER HTTP_ENCRYPTION_NEVER
+# define HTTP_ENCRYPT_REQUIRED HTTP_ENCRYPTION_REQUIRED
+# define HTTP_ENCRYPT_ALWAYS HTTP_ENCRYPTION_ALWAYS
+# endif /* !_CUPS_NO_DEPRECATED */
} http_encryption_t;
typedef enum http_field_e /**** HTTP field names ****/
@@ -172,6 +180,9 @@ typedef enum http_field_e /**** HTTP field names ****/
HTTP_FIELD_UPGRADE, /* Upgrade field */
HTTP_FIELD_USER_AGENT, /* User-Agent field */
HTTP_FIELD_WWW_AUTHENTICATE, /* WWW-Authenticate field */
+ HTTP_FIELD_ACCEPT_ENCODING, /* Accepting-Encoding field @since CUPS 1.7/OS X 10.9@ */
+ HTTP_FIELD_ALLOW, /* Allow field @since CUPS 1.7/OS X 10.9@ */
+ HTTP_FIELD_SERVER, /* Server field @since CUPS 1.7/OS X 10.9@ */
HTTP_FIELD_MAX /* Maximum field index */
} http_field_t;
@@ -185,90 +196,191 @@ typedef enum http_state_e /**** HTTP state values; states
**** are server-oriented...
****/
{
- HTTP_WAITING, /* Waiting for command */
- HTTP_OPTIONS, /* OPTIONS command, waiting for blank line */
- HTTP_GET, /* GET command, waiting for blank line */
- HTTP_GET_SEND, /* GET command, sending data */
- HTTP_HEAD, /* HEAD command, waiting for blank line */
- HTTP_POST, /* POST command, waiting for blank line */
- HTTP_POST_RECV, /* POST command, receiving data */
- HTTP_POST_SEND, /* POST command, sending data */
- HTTP_PUT, /* PUT command, waiting for blank line */
- HTTP_PUT_RECV, /* PUT command, receiving data */
- HTTP_DELETE, /* DELETE command, waiting for blank line */
- HTTP_TRACE, /* TRACE command, waiting for blank line */
- HTTP_CLOSE, /* CLOSE command, waiting for blank line */
- HTTP_STATUS /* Command complete, sending status */
+ HTTP_STATE_ERROR = -1, /* Error on socket */
+ HTTP_STATE_WAITING, /* Waiting for command */
+ HTTP_STATE_OPTIONS, /* OPTIONS command, waiting for blank line */
+ HTTP_STATE_GET, /* GET command, waiting for blank line */
+ HTTP_STATE_GET_SEND, /* GET command, sending data */
+ HTTP_STATE_HEAD, /* HEAD command, waiting for blank line */
+ HTTP_STATE_POST, /* POST command, waiting for blank line */
+ HTTP_STATE_POST_RECV, /* POST command, receiving data */
+ HTTP_STATE_POST_SEND, /* POST command, sending data */
+ HTTP_STATE_PUT, /* PUT command, waiting for blank line */
+ HTTP_STATE_PUT_RECV, /* PUT command, receiving data */
+ HTTP_STATE_DELETE, /* DELETE command, waiting for blank line */
+ HTTP_STATE_TRACE, /* TRACE command, waiting for blank line */
+ HTTP_STATE_CONNECT, /* CONNECT command, waiting for blank line */
+ HTTP_STATE_STATUS, /* Command complete, sending status */
+ HTTP_STATE_UNKNOWN_METHOD, /* Unknown request method, waiting for blank line @since CUPS 1.7/OS X 10.9@ */
+ HTTP_STATE_UNKNOWN_VERSION /* Unknown request method, waiting for blank line @since CUPS 1.7/OS X 10.9@ */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define HTTP_WAITING HTTP_STATE_WAITING
+# define HTTP_OPTIONS HTTP_STATE_OPTIONS
+# define HTTP_GET HTTP_STATE_GET
+# define HTTP_GET_SEND HTTP_STATE_GET_SEND
+# define HTTP_HEAD HTTP_STATE_HEAD
+# define HTTP_POST HTTP_STATE_POST
+# define HTTP_POST_RECV HTTP_STATE_POST_RECV
+# define HTTP_POST_SEND HTTP_STATE_POST_SEND
+# define HTTP_PUT HTTP_STATE_PUT
+# define HTTP_PUT_RECV HTTP_STATE_PUT_RECV
+# define HTTP_DELETE HTTP_STATE_DELETE
+# define HTTP_TRACE HTTP_STATE_TRACE
+# define HTTP_CLOSE HTTP_STATE_CONNECT
+# define HTTP_STATUS HTTP_STATE_STATUS
+# endif /* !_CUPS_NO_DEPRECATED */
} http_state_t;
typedef enum http_status_e /**** HTTP status codes ****/
{
- HTTP_ERROR = -1, /* An error response from httpXxxx() */
-
- HTTP_CONTINUE = 100, /* Everything OK, keep going... */
- HTTP_SWITCHING_PROTOCOLS, /* HTTP upgrade to TLS/SSL */
-
- HTTP_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */
- HTTP_CREATED, /* PUT command was successful */
- HTTP_ACCEPTED, /* DELETE command was successful */
- HTTP_NOT_AUTHORITATIVE, /* Information isn't authoritative */
- HTTP_NO_CONTENT, /* Successful command, no new data */
- HTTP_RESET_CONTENT, /* Content was reset/recreated */
- HTTP_PARTIAL_CONTENT, /* Only a partial file was recieved/sent */
-
- HTTP_MULTIPLE_CHOICES = 300, /* Multiple files match request */
- HTTP_MOVED_PERMANENTLY, /* Document has moved permanently */
- HTTP_MOVED_TEMPORARILY, /* Document has moved temporarily */
- HTTP_SEE_OTHER, /* See this other link... */
- HTTP_NOT_MODIFIED, /* File not modified */
- HTTP_USE_PROXY, /* Must use a proxy to access this URI */
-
- HTTP_BAD_REQUEST = 400, /* Bad request */
- HTTP_UNAUTHORIZED, /* Unauthorized to access host */
- HTTP_PAYMENT_REQUIRED, /* Payment required */
- HTTP_FORBIDDEN, /* Forbidden to access this URI */
- HTTP_NOT_FOUND, /* URI was not found */
- HTTP_METHOD_NOT_ALLOWED, /* Method is not allowed */
- HTTP_NOT_ACCEPTABLE, /* Not Acceptable */
- HTTP_PROXY_AUTHENTICATION, /* Proxy Authentication is Required */
- HTTP_REQUEST_TIMEOUT, /* Request timed out */
- HTTP_CONFLICT, /* Request is self-conflicting */
- HTTP_GONE, /* Server has gone away */
- HTTP_LENGTH_REQUIRED, /* A content length or encoding is required */
- HTTP_PRECONDITION, /* Precondition failed */
- HTTP_REQUEST_TOO_LARGE, /* Request entity too large */
- HTTP_URI_TOO_LONG, /* URI too long */
- HTTP_UNSUPPORTED_MEDIATYPE, /* The requested media type is unsupported */
- HTTP_REQUESTED_RANGE, /* The requested range is not satisfiable */
- HTTP_EXPECTATION_FAILED, /* The expectation given in an Expect header field was not met */
- HTTP_UPGRADE_REQUIRED = 426, /* Upgrade to SSL/TLS required */
-
- HTTP_SERVER_ERROR = 500, /* Internal server error */
- HTTP_NOT_IMPLEMENTED, /* Feature not implemented */
- HTTP_BAD_GATEWAY, /* Bad gateway */
- HTTP_SERVICE_UNAVAILABLE, /* Service is unavailable */
- HTTP_GATEWAY_TIMEOUT, /* Gateway connection timed out */
- HTTP_NOT_SUPPORTED, /* HTTP version not supported */
-
- HTTP_AUTHORIZATION_CANCELED = 1000, /* User canceled authorization @since CUPS 1.4@ */
- HTTP_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
- HTTP_WEBIF_DISABLED /* Web interface is disabled @private@ */
+ HTTP_STATUS_ERROR = -1, /* An error response from httpXxxx() */
+ HTTP_STATUS_NONE = 0, /* No Expect value @since CUPS 1.7/OS X 10.9@ */
+
+ HTTP_STATUS_CONTINUE = 100, /* Everything OK, keep going... */
+ HTTP_STATUS_SWITCHING_PROTOCOLS, /* HTTP upgrade to TLS/SSL */
+
+ HTTP_STATUS_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */
+ HTTP_STATUS_CREATED, /* PUT command was successful */
+ HTTP_STATUS_ACCEPTED, /* DELETE command was successful */
+ HTTP_STATUS_NOT_AUTHORITATIVE, /* Information isn't authoritative */
+ HTTP_STATUS_NO_CONTENT, /* Successful command, no new data */
+ HTTP_STATUS_RESET_CONTENT, /* Content was reset/recreated */
+ HTTP_STATUS_PARTIAL_CONTENT, /* Only a partial file was received/sent */
+
+ HTTP_STATUS_MULTIPLE_CHOICES = 300, /* Multiple files match request */
+ HTTP_STATUS_MOVED_PERMANENTLY, /* Document has moved permanently */
+ HTTP_STATUS_MOVED_TEMPORARILY, /* Document has moved temporarily */
+ HTTP_STATUS_SEE_OTHER, /* See this other link... */
+ HTTP_STATUS_NOT_MODIFIED, /* File not modified */
+ HTTP_STATUS_USE_PROXY, /* Must use a proxy to access this URI */
+
+ HTTP_STATUS_BAD_REQUEST = 400, /* Bad request */
+ HTTP_STATUS_UNAUTHORIZED, /* Unauthorized to access host */
+ HTTP_STATUS_PAYMENT_REQUIRED, /* Payment required */
+ HTTP_STATUS_FORBIDDEN, /* Forbidden to access this URI */
+ HTTP_STATUS_NOT_FOUND, /* URI was not found */
+ HTTP_STATUS_METHOD_NOT_ALLOWED, /* Method is not allowed */
+ HTTP_STATUS_NOT_ACCEPTABLE, /* Not Acceptable */
+ HTTP_STATUS_PROXY_AUTHENTICATION, /* Proxy Authentication is Required */
+ HTTP_STATUS_REQUEST_TIMEOUT, /* Request timed out */
+ HTTP_STATUS_CONFLICT, /* Request is self-conflicting */
+ HTTP_STATUS_GONE, /* Server has gone away */
+ HTTP_STATUS_LENGTH_REQUIRED, /* A content length or encoding is required */
+ HTTP_STATUS_PRECONDITION, /* Precondition failed */
+ HTTP_STATUS_REQUEST_TOO_LARGE, /* Request entity too large */
+ HTTP_STATUS_URI_TOO_LONG, /* URI too long */
+ HTTP_STATUS_UNSUPPORTED_MEDIATYPE, /* The requested media type is unsupported */
+ HTTP_STATUS_REQUESTED_RANGE, /* The requested range is not satisfiable */
+ HTTP_STATUS_EXPECTATION_FAILED, /* The expectation given in an Expect header field was not met */
+ HTTP_STATUS_UPGRADE_REQUIRED = 426, /* Upgrade to SSL/TLS required */
+
+ HTTP_STATUS_SERVER_ERROR = 500, /* Internal server error */
+ HTTP_STATUS_NOT_IMPLEMENTED, /* Feature not implemented */
+ HTTP_STATUS_BAD_GATEWAY, /* Bad gateway */
+ HTTP_STATUS_SERVICE_UNAVAILABLE, /* Service is unavailable */
+ HTTP_STATUS_GATEWAY_TIMEOUT, /* Gateway connection timed out */
+ HTTP_STATUS_NOT_SUPPORTED, /* HTTP version not supported */
+
+ HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED = 1000,
+ /* User canceled authorization @since CUPS 1.4@ */
+ HTTP_STATUS_CUPS_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
+ HTTP_STATUS_CUPS_WEBIF_DISABLED /* Web interface is disabled @private@ */
+
+# ifndef _CUPS_NO_DEPRECATED
+/* Old names for this enumeration */
+# define HTTP_ERROR HTTP_STATUS_ERROR
+
+# define HTTP_CONTINUE HTTP_STATUS_CONTINUE
+# define HTTP_SWITCHING_PROTOCOLS HTTP_STATUS_SWITCHING_PROTOCOLS
+
+# define HTTP_OK HTTP_STATUS_OK
+# define HTTP_CREATED HTTP_STATUS_CREATED
+# define HTTP_ACCEPTED HTTP_STATUS_ACCEPTED
+# define HTTP_NOT_AUTHORITATIVE HTTP_STATUS_NOT_AUTHORITATIVE
+# define HTTP_NO_CONTENT HTTP_STATUS_NO_CONTENT
+# define HTTP_RESET_CONTENT HTTP_STATUS_RESET_CONTENT
+# define HTTP_PARTIAL_CONTENT HTTP_STATUS_PARTIAL_CONTENT
+
+# define HTTP_MULTIPLE_CHOICES HTTP_STATUS_MULTIPLE_CHOICES
+# define HTTP_MOVED_PERMANENTLY HTTP_STATUS_MOVED_PERMANENTLY
+# define HTTP_MOVED_TEMPORARILY HTTP_STATUS_MOVED_TEMPORARILY
+# define HTTP_SEE_OTHER HTTP_STATUS_SEE_OTHER
+# define HTTP_NOT_MODIFIED HTTP_STATUS_NOT_MODIFIED
+# define HTTP_USE_PROXY HTTP_STATUS_USE_PROXY
+
+# define HTTP_BAD_REQUEST HTTP_STATUS_BAD_REQUEST
+# define HTTP_UNAUTHORIZED HTTP_STATUS_UNAUTHORIZED
+# define HTTP_PAYMENT_REQUIRED HTTP_STATUS_PAYMENT_REQUIRED
+# define HTTP_FORBIDDEN HTTP_STATUS_FORBIDDEN
+# define HTTP_NOT_FOUND HTTP_STATUS_NOT_FOUND
+# define HTTP_METHOD_NOT_ALLOWED HTTP_STATUS_METHOD_NOT_ALLOWED
+# define HTTP_NOT_ACCEPTABLE HTTP_STATUS_NOT_ACCEPTABLE
+# define HTTP_PROXY_AUTHENTICATION HTTP_STATUS_PROXY_AUTHENTICATION
+# define HTTP_REQUEST_TIMEOUT HTTP_STATUS_REQUEST_TIMEOUT
+# define HTTP_CONFLICT HTTP_STATUS_CONFLICT
+# define HTTP_GONE HTTP_STATUS_GONE
+# define HTTP_LENGTH_REQUIRED HTTP_STATUS_LENGTH_REQUIRED
+# define HTTP_PRECONDITION HTTP_STATUS_PRECONDITION
+# define HTTP_REQUEST_TOO_LARGE HTTP_STATUS_REQUEST_TOO_LARGE
+# define HTTP_URI_TOO_LONG HTTP_STATUS_URI_TOO_LONG
+# define HTTP_UNSUPPORTED_MEDIATYPE HTTP_STATUS_UNSUPPORTED_MEDIATYPE
+# define HTTP_REQUESTED_RANGE HTTP_STATUS_REQUESTED_RANGE
+# define HTTP_EXPECTATION_FAILED HTTP_STATUS_EXPECTATION_FAILED
+# define HTTP_UPGRADE_REQUIRED HTTP_STATUS_UPGRADE_REQUIRED
+
+# define HTTP_SERVER_ERROR HTTP_STATUS_SERVER_ERROR
+# define HTTP_NOT_IMPLEMENTED HTTP_STATUS_NOT_IMPLEMENTED
+# define HTTP_BAD_GATEWAY HTTP_STATUS_BAD_GATEWAY
+# define HTTP_SERVICE_UNAVAILABLE HTTP_STATUS_SERVICE_UNAVAILABLE
+# define HTTP_GATEWAY_TIMEOUT HTTP_STATUS_GATEWAY_TIMEOUT
+# define HTTP_NOT_SUPPORTED HTTP_STATUS_NOT_SUPPORTED
+
+# define HTTP_AUTHORIZATION_CANCELED HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED
+# define HTTP_PKI_ERROR HTTP_STATUS_CUPS_PKI_ERROR
+# define HTTP_WEBIF_DISABLED HTTP_STATUS_CUPS_WEBIF_DISABLED
+# endif /* !_CUPS_NO_DEPRECATED */
} http_status_t;
+typedef enum http_trust_e /**** Level of trust for credentials @since CUPS 2.0/OS 10.10@ */
+{
+ HTTP_TRUST_OK = 0, /* Credentials are OK/trusted */
+ HTTP_TRUST_INVALID, /* Credentials are invalid */
+ HTTP_TRUST_CHANGED, /* Credentials have changed */
+ HTTP_TRUST_EXPIRED, /* Credentials are expired */
+ HTTP_TRUST_RENEWED, /* Credentials have been renewed */
+ HTTP_TRUST_UNKNOWN, /* Credentials are unknown/new */
+} http_trust_t;
+
typedef enum http_uri_status_e /**** URI separation status @since CUPS 1.2@ ****/
{
- HTTP_URI_OVERFLOW = -8, /* URI buffer for httpAssembleURI is too small */
- HTTP_URI_BAD_ARGUMENTS = -7, /* Bad arguments to function (error) */
- HTTP_URI_BAD_RESOURCE = -6, /* Bad resource in URI (error) */
- HTTP_URI_BAD_PORT = -5, /* Bad port number in URI (error) */
- HTTP_URI_BAD_HOSTNAME = -4, /* Bad hostname in URI (error) */
- HTTP_URI_BAD_USERNAME = -3, /* Bad username in URI (error) */
- HTTP_URI_BAD_SCHEME = -2, /* Bad scheme in URI (error) */
- HTTP_URI_BAD_URI = -1, /* Bad/empty URI (error) */
- HTTP_URI_OK = 0, /* URI decoded OK */
- HTTP_URI_MISSING_SCHEME, /* Missing scheme in URI (warning) */
- HTTP_URI_UNKNOWN_SCHEME, /* Unknown scheme in URI (warning) */
- HTTP_URI_MISSING_RESOURCE /* Missing resource in URI (warning) */
+ HTTP_URI_STATUS_OVERFLOW = -8, /* URI buffer for httpAssembleURI is too small */
+ HTTP_URI_STATUS_BAD_ARGUMENTS = -7, /* Bad arguments to function (error) */
+ HTTP_URI_STATUS_BAD_RESOURCE = -6, /* Bad resource in URI (error) */
+ HTTP_URI_STATUS_BAD_PORT = -5, /* Bad port number in URI (error) */
+ HTTP_URI_STATUS_BAD_HOSTNAME = -4, /* Bad hostname in URI (error) */
+ HTTP_URI_STATUS_BAD_USERNAME = -3, /* Bad username in URI (error) */
+ HTTP_URI_STATUS_BAD_SCHEME = -2, /* Bad scheme in URI (error) */
+ HTTP_URI_STATUS_BAD_URI = -1, /* Bad/empty URI (error) */
+ HTTP_URI_STATUS_OK = 0, /* URI decoded OK */
+ HTTP_URI_STATUS_MISSING_SCHEME, /* Missing scheme in URI (warning) */
+ HTTP_URI_STATUS_UNKNOWN_SCHEME, /* Unknown scheme in URI (warning) */
+ HTTP_URI_STATUS_MISSING_RESOURCE /* Missing resource in URI (warning) */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define HTTP_URI_OVERFLOW HTTP_URI_STATUS_OVERFLOW
+# define HTTP_URI_BAD_ARGUMENTS HTTP_URI_STATUS_BAD_ARGUMENTS
+# define HTTP_URI_BAD_RESOURCE HTTP_URI_STATUS_BAD_RESOURCE
+# define HTTP_URI_BAD_PORT HTTP_URI_STATUS_BAD_PORT
+# define HTTP_URI_BAD_HOSTNAME HTTP_URI_STATUS_BAD_HOSTNAME
+# define HTTP_URI_BAD_USERNAME HTTP_URI_STATUS_BAD_USERNAME
+# define HTTP_URI_BAD_SCHEME HTTP_URI_STATUS_BAD_SCHEME
+# define HTTP_URI_BAD_URI HTTP_URI_STATUS_BAD_URI
+# define HTTP_URI_OK HTTP_URI_STATUS_OK
+# define HTTP_URI_MISSING_SCHEME HTTP_URI_STATUS_MISSING_SCHEME
+# define HTTP_URI_UNKNOWN_SCHEME HTTP_URI_STATUS_UNKNOWN_SCHEME
+# define HTTP_URI_MISSING_RESOURCE HTTP_URI_STATUS_MISSING_RESOURCE
+# endif /* !_CUPS_NO_DEPRECATED */
} http_uri_status_t;
typedef enum http_uri_coding_e /**** URI en/decode flags ****/
@@ -285,9 +397,15 @@ typedef enum http_uri_coding_e /**** URI en/decode flags ****/
typedef enum http_version_e /**** HTTP version numbers ****/
{
- HTTP_0_9 = 9, /* HTTP/0.9 */
- HTTP_1_0 = 100, /* HTTP/1.0 */
- HTTP_1_1 = 101 /* HTTP/1.1 */
+ HTTP_VERSION_0_9 = 9, /* HTTP/0.9 */
+ HTTP_VERSION_1_0 = 100, /* HTTP/1.0 */
+ HTTP_VERSION_1_1 = 101 /* HTTP/1.1 */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define HTTP_0_9 HTTP_VERSION_0_9
+# define HTTP_1_0 HTTP_VERSION_1_0
+# define HTTP_1_1 HTTP_VERSION_1_1
+# endif /* !_CUPS_NO_DEPRECATED */
} http_version_t;
typedef union _http_addr_u /**** Socket address union, which
@@ -338,9 +456,11 @@ extern void httpBlocking(http_t *http, int b);
extern int httpCheck(http_t *http);
extern void httpClearFields(http_t *http);
extern void httpClose(http_t *http);
-extern http_t *httpConnect(const char *host, int port);
+extern http_t *httpConnect(const char *host, int port)
+ _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead.");
extern http_t *httpConnectEncrypt(const char *host, int port,
- http_encryption_t encryption);
+ http_encryption_t encryption)
+ _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead.");
extern int httpDelete(http_t *http, const char *uri);
extern int httpEncryption(http_t *http, http_encryption_t e);
extern int httpError(http_t *http);
@@ -360,20 +480,20 @@ extern int httpPost(http_t *http, const char *uri);
extern int httpPrintf(http_t *http, const char *format, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
extern int httpPut(http_t *http, const char *uri);
-extern int httpRead(http_t *http, char *buffer, int length) _CUPS_DEPRECATED;
-extern int httpReconnect(http_t *http);
+extern int httpRead(http_t *http, char *buffer, int length) _CUPS_DEPRECATED_MSG("Use httpRead2 instead.");
+extern int httpReconnect(http_t *http) _CUPS_DEPRECATED_1_6_MSG("Use httpReconnect2 instead.");
extern void httpSeparate(const char *uri, char *method,
char *username, char *host, int *port,
- char *resource) _CUPS_DEPRECATED;
+ char *resource) _CUPS_DEPRECATED_MSG("Use httpSeparateURI instead.");
extern void httpSetField(http_t *http, http_field_t field,
const char *value);
extern const char *httpStatus(http_status_t status);
extern int httpTrace(http_t *http, const char *uri);
extern http_status_t httpUpdate(http_t *http);
-extern int httpWrite(http_t *http, const char *buffer, int length) _CUPS_DEPRECATED;
-extern char *httpEncode64(char *out, const char *in) _CUPS_DEPRECATED;
-extern char *httpDecode64(char *out, const char *in) _CUPS_DEPRECATED;
-extern int httpGetLength(http_t *http) _CUPS_DEPRECATED;
+extern int httpWrite(http_t *http, const char *buffer, int length) _CUPS_DEPRECATED_MSG("Use httpWrite2 instead.");
+extern char *httpEncode64(char *out, const char *in) _CUPS_DEPRECATED_MSG("Use httpEncode64_2 instead.");
+extern char *httpDecode64(char *out, const char *in) _CUPS_DEPRECATED_MSG("Use httpDecode64_2 instead.");
+extern int httpGetLength(http_t *http) _CUPS_DEPRECATED_MSG("Use httpGetLength2 instead.");
extern char *httpMD5(const char *, const char *, const char *,
char [33]);
extern char *httpMD5Final(const char *, const char *, const char *,
@@ -394,7 +514,7 @@ extern void httpSeparate2(const char *uri,
char *method, int methodlen,
char *username, int usernamelen,
char *host, int hostlen, int *port,
- char *resource, int resourcelen) _CUPS_DEPRECATED;
+ char *resource, int resourcelen) _CUPS_DEPRECATED_MSG("Use httpSeparateURI instead.");
/**** New in CUPS 1.2/OS X 10.5 ****/
extern int httpAddrAny(const http_addr_t *addr) _CUPS_API_1_2;
@@ -473,6 +593,59 @@ extern int httpReconnect2(http_t *http, int msec, int *cancel)
_CUPS_API_1_6;
+/**** New in CUPS 1.7/OS X 10.9 ****/
+extern http_t *httpAcceptConnection(int fd, int blocking)
+ _CUPS_API_1_7;
+extern http_addrlist_t *httpAddrCopyList(http_addrlist_t *src) _CUPS_API_1_7;
+extern int httpAddrListen(http_addr_t *addr, int port)
+ _CUPS_API_1_7;
+extern int httpAddrPort(http_addr_t *addr) _CUPS_API_1_7;
+extern char *httpAssembleUUID(const char *server, int port,
+ const char *name, int number,
+ char *buffer, size_t bufsize)
+ _CUPS_API_1_7;
+extern http_t *httpConnect2(const char *host, int port,
+ http_addrlist_t *addrlist,
+ int family, http_encryption_t encryption,
+ int blocking, int msec, int *cancel)
+ _CUPS_API_1_7;
+extern const char *httpGetContentEncoding(http_t *http) _CUPS_API_1_7;
+extern http_status_t httpGetExpect(http_t *http) _CUPS_API_1_7;
+extern ssize_t httpPeek(http_t *http, char *buffer, size_t length)
+ _CUPS_API_1_7;
+extern http_state_t httpReadRequest(http_t *http, char *resource,
+ size_t resourcelen) _CUPS_API_1_7;
+extern void httpSetDefaultField(http_t *http, http_field_t field,
+ const char *value) _CUPS_API_1_7;
+extern http_state_t httpWriteResponse(http_t *http,
+ http_status_t status) _CUPS_API_1_7;
+
+/* New in CUPS 2.0/OS X 10.10 */
+extern int httpAddrClose(http_addr_t *addr, int fd) _CUPS_API_2_0;
+extern int httpAddrFamily(http_addr_t *addr) _CUPS_API_2_0;
+extern int httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2) _CUPS_API_2_0;
+extern int httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name);
+extern time_t httpCredentialsGetExpiration(cups_array_t *credentials) _CUPS_API_2_0;
+extern http_trust_t httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name) _CUPS_API_2_0;
+extern size_t httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize) _CUPS_API_2_0;
+extern http_field_t httpFieldValue(const char *name) _CUPS_API_2_0;
+extern time_t httpGetActivity(http_t *http) _CUPS_API_2_0;
+extern http_addr_t *httpGetAddress(http_t *http) _CUPS_API_2_0;
+extern http_encryption_t httpGetEncryption(http_t *http) _CUPS_API_2_0;
+extern http_keepalive_t httpGetKeepAlive(http_t *http) _CUPS_API_2_0;
+extern size_t httpGetPending(http_t *http) _CUPS_API_2_0;
+extern size_t httpGetReady(http_t *http) _CUPS_API_2_0;
+extern size_t httpGetRemaining(http_t *http) _CUPS_API_2_0;
+extern int httpIsChunked(http_t *http) _CUPS_API_2_0;
+extern int httpIsEncrypted(http_t *http) _CUPS_API_2_0;
+extern int httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name) _CUPS_API_2_0;
+extern const char *httpResolveHostname(http_t *http, char *buffer, size_t bufsize) _CUPS_API_2_0;
+extern int httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name) _CUPS_API_2_0;
+extern void httpSetKeepAlive(http_t *http, http_keepalive_t keep_alive) _CUPS_API_2_0;
+extern void httpShutdown(http_t *http) _CUPS_API_2_0;
+extern const char *httpStateString(http_state_t state) _CUPS_API_2_0;
+extern const char *httpURIStatusString(http_uri_status_t status) _CUPS_API_2_0;
+
/*
* C++ magic...
*/
@@ -483,5 +656,5 @@ extern int httpReconnect2(http_t *http, int msec, int *cancel)
#endif /* !_CUPS_HTTP_H_ */
/*
- * End of "$Id: http.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http.h 12848 2015-08-26 18:51:57Z msweet $".
*/
diff --git a/cups/ipp-private.h b/cups/ipp-private.h
index abf2d23..262baf7 100644
--- a/cups/ipp-private.h
+++ b/cups/ipp-private.h
@@ -1,18 +1,18 @@
/*
- * "$Id: ipp-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp-private.h 11558 2014-02-06 18:33:34Z msweet $"
*
- * Private IPP definitions for CUPS.
+ * Private IPP definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_IPP_PRIVATE_H_
@@ -54,6 +54,7 @@ typedef struct /**** Attribute mapping data ****/
ipp_tag_t group_tag; /* Group tag for this attribute */
ipp_tag_t alt_group_tag; /* Alternate group tag for this
* attribute */
+ const ipp_op_t *operations; /* Allowed operations for this attr */
} _ipp_option_t;
@@ -61,9 +62,11 @@ typedef struct /**** Attribute mapping data ****/
* Prototypes for private functions...
*/
+#ifdef DEBUG
+extern const char *_ippCheckOptions(void);
+#endif /* DEBUG */
extern _ipp_option_t *_ippFindOption(const char *name);
-
/*
* C++ magic...
*/
@@ -74,5 +77,5 @@ extern _ipp_option_t *_ippFindOption(const char *name);
#endif /* !_CUPS_IPP_H_ */
/*
- * End of "$Id: ipp-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp-private.h 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/ipp-support.c b/cups/ipp-support.c
index 815828b..6a5d940 100644
--- a/cups/ipp-support.c
+++ b/cups/ipp-support.c
@@ -1,34 +1,18 @@
/*
- * "$Id: ipp-support.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp-support.c 12666 2015-05-25 19:38:09Z msweet $"
*
- * Internet Printing Protocol support functions for CUPS.
+ * Internet Printing Protocol support functions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * ippAttributeString() - Convert the attribute's value to a string.
- * ippEnumString() - Return a string corresponding to the enum value.
- * ippEnumValue() - Return the value associated with a given enum
- * string.
- * ippErrorString() - Return a name for the given status code.
- * ippErrorValue() - Return a status code for the given name.
- * ippOpString() - Return a name for the given operation id.
- * ippOpValue() - Return an operation id for the given name.
- * ippPort() - Return the default IPP port number.
- * ippSetPort() - Set the default port number.
- * ippTagString() - Return the tag name corresponding to a tag value.
- * ippTagValue() - Return the tag value corresponding to a tag name.
- * ipp_col_string() - Convert a collection to a string.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -42,6 +26,14 @@
* Local globals...
*/
+static const char * const ipp_states[] =
+ {
+ "IPP_STATE_ERROR",
+ "IPP_STATE_IDLE",
+ "IPP_STATE_HEADER",
+ "IPP_STATE_ATTRIBUTE",
+ "IPP_STATE_DATA"
+ };
static const char * const ipp_status_oks[] = /* "OK" status codes */
{ /* (name) = abandoned standard value */
"successful-ok",
@@ -82,7 +74,48 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */
"client-error-document-password-error",
"client-error-document-permission-error",
"client-error-document-security-error",
- "client-error-document-unprintable-error"
+ "client-error-document-unprintable-error",
+ "client-error-account-info-needed",
+ "client-error-account-closed",
+ "client-error-account-limit-reached",
+ "client-error-account-authorization-failed"
+ },
+ * const ipp_status_480s[] = /* Vendor client errors */
+ {
+ /* 0x0480 - 0x048F */
+ "0x0480",
+ "0x0481",
+ "0x0482",
+ "0x0483",
+ "0x0484",
+ "0x0485",
+ "0x0486",
+ "0x0487",
+ "0x0488",
+ "0x0489",
+ "0x048A",
+ "0x048B",
+ "0x048C",
+ "0x048D",
+ "0x048E",
+ "0x048F",
+ /* 0x0490 - 0x049F */
+ "0x0490",
+ "0x0491",
+ "0x0492",
+ "0x0493",
+ "0x0494",
+ "0x0495",
+ "0x0496",
+ "0x0497",
+ "0x0498",
+ "0x0499",
+ "0x049A",
+ "0x049B",
+ "cups-error-account-info-needed",
+ "cups-error-account-closed",
+ "cups-error-account-limit-reached",
+ "cups-error-account-authorization-failed"
},
* const ipp_status_500s[] = /* Server errors */
{
@@ -102,15 +135,15 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */
},
* const ipp_status_1000s[] = /* CUPS internal */
{
- "cups-authorization-canceled",
+ "cups-authentication-canceled",
"cups-pki-error",
"cups-upgrade-required"
};
static const char * const ipp_std_ops[] =
{
/* 0x0000 - 0x000f */
- "0x00",
- "0x01",
+ "0x0000",
+ "0x0001",
"Print-Job",
"Print-URI",
"Validate-Job",
@@ -124,7 +157,7 @@ static const char * const ipp_std_ops[] =
"Hold-Job",
"Release-Job",
"Restart-Job",
- "0x0f",
+ "0x000f",
/* 0x0010 - 0x001f */
"Pause-Printer",
@@ -133,8 +166,8 @@ static const char * const ipp_std_ops[] =
"Set-Printer-Attributes",
"Set-Job-Attributes",
"Get-Printer-Supported-Values",
- "Create-Printer-Subscription",
- "Create-Job-Subscription",
+ "Create-Printer-Subscriptions",
+ "Create-Job-Subscriptions",
"Get-Subscription-Attributes",
"Get-Subscriptions",
"Renew-Subscription",
@@ -162,10 +195,10 @@ static const char * const ipp_std_ops[] =
"Suspend-Current-Job",
"Resume-Job",
- /* 0x0030 - 0x003d */
+ /* 0x0030 - 0x003f */
"Promote-Job",
"Schedule-Job-After",
- "0x32",
+ "0x0032",
"Cancel-Document",
"Get-Document-Attributes",
"Get-Documents",
@@ -176,7 +209,22 @@ static const char * const ipp_std_ops[] =
"Resubmit-Job",
"Close-Job",
"Identify-Printer",
- "Validate-Document"
+ "Validate-Document",
+ "Send-Hardcopy-Document",
+ "Acknowledge-Document",
+
+ /* 0x0040 - 0x004a */
+ "Acknowledge-Identify-Printer",
+ "Acknowledge-Job",
+ "Fetch-Document",
+ "Fetch-Job",
+ "Get-Output-Device-Attributes",
+ "Update-Active-Jobs",
+ "Deregister-Output-Device",
+ "Update-Document-Status",
+ "Update-Job-Status",
+ "Update-Output-Device-Attributes",
+ "Get-Next-Document-Data"
},
* const ipp_cups_ops[] =
{
@@ -291,7 +339,7 @@ static const char * const ipp_document_states[] =
"pending",
"4",
"processing",
- "6",
+ "processing-stopped", /* IPPSIX */
"canceled",
"aborted",
"completed"
@@ -310,8 +358,8 @@ static const char * const ipp_document_states[] =
"bale",
"booklet-maker",
"jog-offset",
- "15",
- "16",
+ "coat", /* Finishings 2.0 */
+ "laminate", /* Finishings 2.0 */
"17",
"18",
"19",
@@ -327,10 +375,10 @@ static const char * const ipp_document_states[] =
"staple-dual-top",
"staple-dual-right",
"staple-dual-bottom",
- "32",
- "33",
- "34",
- "35",
+ "staple-triple-left", /* Finishings 2.0 */
+ "staple-triple-top", /* Finishings 2.0 */
+ "staple-triple-right",/* Finishings 2.0 */
+ "staple-triple-bottom",/* Finishings 2.0 */
"36",
"37",
"38",
@@ -358,7 +406,155 @@ static const char * const ipp_document_states[] =
"trim-after-pages",
"trim-after-documents",
"trim-after-copies",
- "trim-after-job"
+ "trim-after-job",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "punch-top-left", /* Finishings 2.0 */
+ "punch-bottom-left", /* Finishings 2.0 */
+ "punch-top-right", /* Finishings 2.0 */
+ "punch-bottom-right", /* Finishings 2.0 */
+ "punch-dual-left", /* Finishings 2.0 */
+ "punch-dual-top", /* Finishings 2.0 */
+ "punch-dual-right", /* Finishings 2.0 */
+ "punch-dual-bottom", /* Finishings 2.0 */
+ "punch-triple-left", /* Finishings 2.0 */
+ "punch-triple-top", /* Finishings 2.0 */
+ "punch-triple-right", /* Finishings 2.0 */
+ "punch-triple-bottom",/* Finishings 2.0 */
+ "punch-quad-left", /* Finishings 2.0 */
+ "punch-quad-top", /* Finishings 2.0 */
+ "punch-quad-right", /* Finishings 2.0 */
+ "punch-quad-bottom", /* Finishings 2.0 */
+ "86",
+ "87",
+ "88",
+ "89",
+ "fold-accordian", /* Finishings 2.0 */
+ "fold-double-gate", /* Finishings 2.0 */
+ "fold-gate", /* Finishings 2.0 */
+ "fold-half", /* Finishings 2.0 */
+ "fold-half-z", /* Finishings 2.0 */
+ "fold-left-gate", /* Finishings 2.0 */
+ "fold-letter", /* Finishings 2.0 */
+ "fold-parallel", /* Finishings 2.0 */
+ "fold-poster", /* Finishings 2.0 */
+ "fold-right-gate", /* Finishings 2.0 */
+ "fold-z" /* Finishings 2.0 */
+ },
+ * const ipp_finishings_vendor[] =
+ {
+ /* 0x40000000 to 0x4000000F */
+ "0x40000000",
+ "0x40000001",
+ "0x40000002",
+ "0x40000003",
+ "0x40000004",
+ "0x40000005",
+ "0x40000006",
+ "0x40000007",
+ "0x40000008",
+ "0x40000009",
+ "0x4000000A",
+ "0x4000000B",
+ "0x4000000C",
+ "0x4000000D",
+ "0x4000000E",
+ "0x4000000F",
+ /* 0x40000010 to 0x4000001F */
+ "0x40000010",
+ "0x40000011",
+ "0x40000012",
+ "0x40000013",
+ "0x40000014",
+ "0x40000015",
+ "0x40000016",
+ "0x40000017",
+ "0x40000018",
+ "0x40000019",
+ "0x4000001A",
+ "0x4000001B",
+ "0x4000001C",
+ "0x4000001D",
+ "0x4000001E",
+ "0x4000001F",
+ /* 0x40000020 to 0x4000002F */
+ "0x40000020",
+ "0x40000021",
+ "0x40000022",
+ "0x40000023",
+ "0x40000024",
+ "0x40000025",
+ "0x40000026",
+ "0x40000027",
+ "0x40000028",
+ "0x40000029",
+ "0x4000002A",
+ "0x4000002B",
+ "0x4000002C",
+ "0x4000002D",
+ "0x4000002E",
+ "0x4000002F",
+ /* 0x40000030 to 0x4000003F */
+ "0x40000030",
+ "0x40000031",
+ "0x40000032",
+ "0x40000033",
+ "0x40000034",
+ "0x40000035",
+ "0x40000036",
+ "0x40000037",
+ "0x40000038",
+ "0x40000039",
+ "0x4000003A",
+ "0x4000003B",
+ "0x4000003C",
+ "0x4000003D",
+ "0x4000003E",
+ "0x4000003F",
+ /* 0x40000040 - 0x4000004F */
+ "0x40000040",
+ "0x40000041",
+ "0x40000042",
+ "0x40000043",
+ "0x40000044",
+ "0x40000045",
+ "cups-punch-top-left",
+ "cups-punch-bottom-left",
+ "cups-punch-top-right",
+ "cups-punch-bottom-right",
+ "cups-punch-dual-left",
+ "cups-punch-dual-top",
+ "cups-punch-dual-right",
+ "cups-punch-dual-bottom",
+ "cups-punch-triple-left",
+ "cups-punch-triple-top",
+ /* 0x40000050 - 0x4000005F */
+ "cups-punch-triple-right",
+ "cups-punch-triple-bottom",
+ "cups-punch-quad-left",
+ "cups-punch-quad-top",
+ "cups-punch-quad-right",
+ "cups-punch-quad-bottom",
+ "0x40000056",
+ "0x40000057",
+ "0x40000058",
+ "0x40000059",
+ "cups-fold-accordian",
+ "cups-fold-double-gate",
+ "cups-fold-gate",
+ "cups-fold-half",
+ "cups-fold-half-z",
+ "cups-fold-left-gate",
+ /* 0x40000060 - 0x40000064 */
+ "cups-fold-letter",
+ "cups-fold-parallel",
+ "cups-fold-poster",
+ "cups-fold-right-gate",
+ "cups-fold-z"
},
* const ipp_job_collation_types[] =
{ /* job-collation-type enums */
@@ -381,7 +577,8 @@ static const char * const ipp_document_states[] =
"portrait",
"landscape",
"reverse-landscape",
- "reverse-portrait"
+ "reverse-portrait",
+ "none"
},
* const ipp_print_qualities[] =
{ /* print-quality enums */
@@ -424,7 +621,8 @@ ippAttributeString(
char *bufptr, /* Pointer into buffer */
*bufend, /* End of buffer */
temp[256]; /* Temporary string */
- const char *ptr; /* Pointer into string */
+ const char *ptr, /* Pointer into string */
+ *end; /* Pointer to end of string */
_ipp_value_t *val; /* Current value */
@@ -452,59 +650,57 @@ ippAttributeString(
bufptr ++;
}
- switch (attr->value_tag & ~IPP_TAG_COPY)
+ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
{
case IPP_TAG_ENUM :
ptr = ippEnumString(attr->name, val->integer);
if (buffer && bufptr < bufend)
- strlcpy(bufptr, ptr, bufend - bufptr + 1);
+ strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1));
bufptr += strlen(ptr);
break;
case IPP_TAG_INTEGER :
if (buffer && bufptr < bufend)
- bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d", val->integer);
+ bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d", val->integer);
else
bufptr += snprintf(temp, sizeof(temp), "%d", val->integer);
break;
case IPP_TAG_BOOLEAN :
if (buffer && bufptr < bufend)
- strlcpy(bufptr, val->boolean ? "true" : "false",
- bufend - bufptr + 1);
+ strlcpy(bufptr, val->boolean ? "true" : "false", (size_t)(bufend - bufptr + 1));
bufptr += val->boolean ? 4 : 5;
break;
case IPP_TAG_RANGE :
if (buffer && bufptr < bufend)
- bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d-%d",
- val->range.lower, val->range.upper);
+ bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d-%d", val->range.lower, val->range.upper);
else
- bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower,
- val->range.upper);
+ bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, val->range.upper);
break;
case IPP_TAG_RESOLUTION :
- if (buffer && bufptr < bufend)
- bufptr += snprintf(bufptr, bufend - bufptr + 1, "%dx%d%s",
- val->resolution.xres, val->resolution.yres,
- val->resolution.units == IPP_RES_PER_INCH ?
- "dpi" : "dpcm");
+ if (val->resolution.xres == val->resolution.yres)
+ {
+ if (buffer && bufptr < bufend)
+ bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ else
+ bufptr += snprintf(temp, sizeof(temp), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ }
+ else if (buffer && bufptr < bufend)
+ bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
else
- bufptr += snprintf(temp, sizeof(temp), "%dx%d%s",
- val->resolution.xres, val->resolution.yres,
- val->resolution.units == IPP_RES_PER_INCH ?
- "dpi" : "dpcm");
+ bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
break;
case IPP_TAG_DATE :
{
unsigned year; /* Year */
- year = (val->date[0] << 8) + val->date[1];
+ year = ((unsigned)val->date[0] << 8) + (unsigned)val->date[1];
if (val->date[9] == 0 && val->date[10] == 0)
snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ",
@@ -518,7 +714,7 @@ ippAttributeString(
val->date[10]);
if (buffer && bufptr < bufend)
- strlcpy(bufptr, temp, bufend - bufptr + 1);
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1));
bufptr += strlen(temp);
}
@@ -562,7 +758,7 @@ ippAttributeString(
bufptr ++;
if (buffer && bufptr < bufend)
- strlcpy(bufptr, val->string.language, bufend - bufptr);
+ strlcpy(bufptr, val->string.language, (size_t)(bufend - bufptr));
bufptr += strlen(val->string.language);
if (buffer && bufptr < bufend)
@@ -573,14 +769,14 @@ ippAttributeString(
case IPP_TAG_BEGIN_COLLECTION :
if (buffer && bufptr < bufend)
- bufptr += ipp_col_string(val->collection, bufptr,
- bufend - bufptr + 1);
+ bufptr += ipp_col_string(val->collection, bufptr, (size_t)(bufend - bufptr + 1));
else
bufptr += ipp_col_string(val->collection, NULL, 0);
break;
case IPP_TAG_STRING :
- for (ptr = val->string.text; *ptr; ptr ++)
+ for (ptr = val->unknown.data, end = ptr + val->unknown.length;
+ ptr < end; ptr ++)
{
if (*ptr == '\\' || _cups_isspace(*ptr))
{
@@ -595,11 +791,9 @@ ippAttributeString(
else if (!isprint(*ptr & 255))
{
if (buffer && bufptr < bufend)
- bufptr += snprintf(bufptr, bufend - bufptr + 1, "\\%03o",
- *ptr & 255);
+ bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *ptr & 255);
else
- bufptr += snprintf(temp, sizeof(temp), "\\%03o",
- *ptr & 255);
+ bufptr += snprintf(temp, sizeof(temp), "\\%03o", *ptr & 255);
}
else
{
@@ -613,7 +807,7 @@ ippAttributeString(
default :
ptr = ippTagString(attr->value_tag);
if (buffer && bufptr < bufend)
- strlcpy(bufptr, ptr, bufend - bufptr + 1);
+ strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1));
bufptr += strlen(ptr);
break;
}
@@ -624,7 +818,954 @@ ippAttributeString(
else if (bufend)
*bufend = '\0';
- return (bufptr - buffer);
+ return ((size_t)(bufptr - buffer));
+}
+
+
+/*
+ * 'ippCreateRequestedArray()' - Create a CUPS array of attribute names from the
+ * given requested-attributes attribute.
+ *
+ * This function creates a (sorted) CUPS array of attribute names matching the
+ * list of "requested-attribute" values supplied in an IPP request. All IANA-
+ * registered values are supported in addition to the CUPS IPP extension
+ * attributes.
+ *
+ * The @code request@ parameter specifies the request message that was read from
+ * the client.
+ *
+ * @code NULL@ is returned if all attributes should be returned. Otherwise, the
+ * result is a sorted array of attribute names, where @code cupsArrayFind(array,
+ * "attribute-name")@ will return a non-NULL pointer. The array must be freed
+ * using the @code cupsArrayDelete@ function.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+cups_array_t * /* O - CUPS array or @code NULL@ if all */
+ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
+{
+ int i, j, /* Looping vars */
+ count, /* Number of values */
+ added; /* Was name added? */
+ ipp_attribute_t *requested; /* requested-attributes attribute */
+ cups_array_t *ra; /* Requested attributes array */
+ const char *value; /* Current value */
+ /* The following lists come from the current IANA IPP registry of attributes */
+ static const char * const document_description[] =
+ { /* document-description group */
+ "compression",
+ "copies-actual",
+ "cover-back-actual",
+ "cover-front-actual",
+ "current-page-order",
+ "date-time-at-completed",
+ "date-time-at-creation",
+ "date-time-at-processing",
+ "detailed-status-messages",
+ "document-access-errors",
+ "document-charset",
+ "document-digital-signature",
+ "document-format",
+ "document-format-details",
+ "document-format-detected",
+ "document-format-version",
+ "document-format-version-detected",
+ "document-job-id",
+ "document-job-uri",
+ "document-message",
+ "document-metadata",
+ "document-name",
+ "document-natural-language",
+ "document-number",
+ "document-printer-uri",
+ "document-state",
+ "document-state-message",
+ "document-state-reasons",
+ "document-uri",
+ "document-uuid",
+ "errors-count",
+ "finishings-actual",
+ "finishings-col-actual",
+ "force-front-side-actual",
+ "imposition-template-actual",
+ "impressions",
+ "impressions-completed",
+ "impressions-completed-current-copy",
+ "insert-sheet-actual",
+ "k-octets",
+ "k-octets-processed",
+ "last-document",
+ "media-actual",
+ "media-col-actual",
+ "media-input-tray-check-actual",
+ "media-sheets",
+ "media-sheets-completed",
+ "more-info",
+ "number-up-actual",
+ "orientation-requested-actual",
+ "output-bin-actual",
+ "output-device-assigned",
+ "overrides-actual",
+ "page-delivery-actual",
+ "page-order-received-actual",
+ "page-ranges-actual",
+ "pages",
+ "pages-completed",
+ "pages-completed-current-copy",
+ "presentation-direction-number-up-actual",
+ "print-color-mode-actual",
+ "print-content-optimize-actual",
+ "print-quality-actual",
+ "print-rendering-intent-actual",
+ "print-scaling-actual", /* IPP Paid Printing */
+ "printer-resolution-actual",
+ "printer-up-time",
+ "separator-sheets-actual",
+ "sheet-completed-copy-number",
+ "sides-actual",
+ "time-at-completed",
+ "time-at-creation",
+ "time-at-processing",
+ "x-image-position-actual",
+ "x-image-shift-actual",
+ "x-side1-image-shift-actual",
+ "x-side2-image-shift-actual",
+ "y-image-position-actual",
+ "y-image-shift-actual",
+ "y-side1-image-shift-actual",
+ "y-side2-image-shift-actual"
+ };
+ static const char * const document_template[] =
+ { /* document-template group */
+ "copies",
+ "copies-default",
+ "copies-supported",
+ "cover-back",
+ "cover-back-default",
+ "cover-back-supported",
+ "cover-front",
+ "cover-front-default",
+ "cover-front-supported",
+ "feed-orientation",
+ "feed-orientation-default",
+ "feed-orientation-supported",
+ "finishings",
+ "finishings-col",
+ "finishings-col-default",
+ "finishings-col-supported",
+ "finishings-default",
+ "finishings-supported",
+ "font-name-requested",
+ "font-name-requested-default",
+ "font-name-requested-supported",
+ "font-size-requested",
+ "font-size-requested-default",
+ "font-size-requested-supported",
+ "force-front-side",
+ "force-front-side-default",
+ "force-front-side-supported",
+ "imposition-template",
+ "imposition-template-default",
+ "imposition-template-supported",
+ "insert-after-page-number-supported",
+ "insert-count-supported",
+ "insert-sheet",
+ "insert-sheet-default",
+ "insert-sheet-supported",
+ "max-stitching-locations-supported",
+ "media",
+ "media-back-coating-supported",
+ "media-bottom-margin-supported",
+ "media-col",
+ "media-col-default",
+ "media-col-supported",
+ "media-color-supported",
+ "media-default",
+ "media-front-coating-supported",
+ "media-grain-supported",
+ "media-hole-count-supported",
+ "media-info-supported",
+ "media-input-tray-check",
+ "media-input-tray-check-default",
+ "media-input-tray-check-supported",
+ "media-key-supported",
+ "media-left-margin-supported",
+ "media-order-count-supported",
+ "media-pre-printed-supported",
+ "media-recycled-supported",
+ "media-right-margin-supported",
+ "media-size-supported",
+ "media-source-supported",
+ "media-supported",
+ "media-thickness-supported",
+ "media-top-margin-supported",
+ "media-type-supported",
+ "media-weight-metric-supported",
+ "multiple-document-handling",
+ "multiple-document-handling-default",
+ "multiple-document-handling-supported",
+ "number-up",
+ "number-up-default",
+ "number-up-supported",
+ "orientation-requested",
+ "orientation-requested-default",
+ "orientation-requested-supported",
+ "output-mode", /* CUPS extension */
+ "output-mode-default", /* CUPS extension */
+ "output-mode-supported", /* CUPS extension */
+ "overrides",
+ "overrides-supported",
+ "page-delivery",
+ "page-delivery-default",
+ "page-delivery-supported",
+ "page-order-received",
+ "page-order-received-default",
+ "page-order-received-supported",
+ "page-ranges",
+ "page-ranges-supported",
+ "pages-per-subset",
+ "pages-per-subset-supported",
+ "pdl-init-file",
+ "pdl-init-file-default",
+ "pdl-init-file-entry-supported",
+ "pdl-init-file-location-supported",
+ "pdl-init-file-name-subdirectory-supported",
+ "pdl-init-file-name-supported",
+ "pdl-init-file-supported",
+ "presentation-direction-number-up",
+ "presentation-direction-number-up-default",
+ "presentation-direction-number-up-supported",
+ "print-color-mode",
+ "print-color-mode-default",
+ "print-color-mode-supported",
+ "print-content-optimize",
+ "print-content-optimize-default",
+ "print-content-optimize-supported",
+ "print-quality",
+ "print-quality-default",
+ "print-quality-supported",
+ "print-rendering-intent",
+ "print-rendering-intent-default",
+ "print-rendering-intent-supported",
+ "print-scaling", /* IPP Paid Printing */
+ "print-scaling-default", /* IPP Paid Printing */
+ "print-scaling-supported", /* IPP Paid Printing */
+ "printer-resolution",
+ "printer-resolution-default",
+ "printer-resolution-supported",
+ "separator-sheets",
+ "separator-sheets-default",
+ "separator-sheets-supported",
+ "sheet-collate",
+ "sheet-collate-default",
+ "sheet-collate-supported",
+ "sides",
+ "sides-default",
+ "sides-supported",
+ "stitching-locations-supported",
+ "stitching-offset-supported",
+ "x-image-position",
+ "x-image-position-default",
+ "x-image-position-supported",
+ "x-image-shift",
+ "x-image-shift-default",
+ "x-image-shift-supported",
+ "x-side1-image-shift",
+ "x-side1-image-shift-default",
+ "x-side1-image-shift-supported",
+ "x-side2-image-shift",
+ "x-side2-image-shift-default",
+ "x-side2-image-shift-supported",
+ "y-image-position",
+ "y-image-position-default",
+ "y-image-position-supported",
+ "y-image-shift",
+ "y-image-shift-default",
+ "y-image-shift-supported",
+ "y-side1-image-shift",
+ "y-side1-image-shift-default",
+ "y-side1-image-shift-supported",
+ "y-side2-image-shift",
+ "y-side2-image-shift-default",
+ "y-side2-image-shift-supported"
+ };
+ static const char * const job_description[] =
+ { /* job-description group */
+ "compression-supplied",
+ "copies-actual",
+ "cover-back-actual",
+ "cover-front-actual",
+ "current-page-order",
+ "date-time-at-completed",
+ "date-time-at-creation",
+ "date-time-at-processing",
+ "destination-statuses",
+ "document-charset-supplied",
+ "document-digital-signature-supplied",
+ "document-format-details-supplied",
+ "document-format-supplied",
+ "document-message-supplied",
+ "document-metadata",
+ "document-name-supplied",
+ "document-natural-language-supplied",
+ "document-overrides-actual",
+ "errors-count",
+ "finishings-actual",
+ "finishings-col-actual",
+ "force-front-side-actual",
+ "imposition-template-actual",
+ "impressions-completed-current-copy",
+ "insert-sheet-actual",
+ "job-account-id-actual",
+ "job-accounting-sheets-actual",
+ "job-accounting-user-id-actual",
+ "job-attribute-fidelity",
+ "job-charge-info", /* CUPS extension */
+ "job-collation-type",
+ "job-collation-type-actual",
+ "job-copies-actual",
+ "job-cover-back-actual",
+ "job-cover-front-actual",
+ "job-detailed-status-message",
+ "job-document-access-errors",
+ "job-error-sheet-actual",
+ "job-finishings-actual",
+ "job-finishings-col-actual",
+ "job-hold-until-actual",
+ "job-id",
+ "job-impressions",
+ "job-impressions-completed",
+ "job-k-octets",
+ "job-k-octets-processed",
+ "job-mandatory-attributes",
+ "job-media-progress", /* CUPS extension */
+ "job-media-sheets",
+ "job-media-sheets-completed",
+ "job-message-from-operator",
+ "job-more-info",
+ "job-name",
+ "job-originating-host-name", /* CUPS extension */
+ "job-originating-user-name",
+ "job-originating-user-uri",
+ "job-pages",
+ "job-pages-completed",
+ "job-pages-completed-current-copy",
+ "job-printer-state-message", /* CUPS extension */
+ "job-printer-state-reasons", /* CUPS extension */
+ "job-printer-up-time",
+ "job-printer-uri",
+ "job-priority-actual",
+ "job-save-printer-make-and-model",
+ "job-sheet-message-actual",
+ "job-sheets-actual",
+ "job-sheets-col-actual",
+ "job-state",
+ "job-state-message",
+ "job-state-reasons",
+ "job-uri",
+ "job-uuid",
+ "media-actual",
+ "media-col-actual",
+ "media-check-input-tray-actual",
+ "multiple-document-handling-actual",
+ "number-of-documents",
+ "number-of-intervening-jobs",
+ "number-up-actual",
+ "orientation-requested-actual",
+ "original-requesting-user-name",
+ "output-bin-actual",
+ "output-device-assigned",
+ "overrides-actual",
+ "page-delivery-actual",
+ "page-order-received-actual",
+ "page-ranges-actual",
+ "presentation-direction-number-up-actual",
+ "print-color-mode-actual",
+ "print-content-optimize-actual",
+ "print-quality-actual",
+ "print-rendering-intent-actual",
+ "print-scaling-actual", /* IPP Paid Printing */
+ "printer-resolution-actual",
+ "separator-sheets-actual",
+ "sheet-collate-actual",
+ "sheet-completed-copy-number",
+ "sheet-completed-document-number",
+ "sides-actual",
+ "time-at-completed",
+ "time-at-creation",
+ "time-at-processing",
+ "warnings-count",
+ "x-image-position-actual",
+ "x-image-shift-actual",
+ "x-side1-image-shift-actual",
+ "x-side2-image-shift-actual",
+ "y-image-position-actual",
+ "y-image-shift-actual",
+ "y-side1-image-shift-actual",
+ "y-side2-image-shift-actual"
+ };
+ static const char * const job_template[] =
+ { /* job-template group */
+ "confirmation-sheet-print", /* IPP FaxOut */
+ "confirmation-sheet-print-default",
+ "copies",
+ "copies-default",
+ "copies-supported",
+ "cover-back",
+ "cover-back-default",
+ "cover-back-supported",
+ "cover-front",
+ "cover-front-default",
+ "cover-front-supported",
+ "cover-sheet-info", /* IPP FaxOut */
+ "cover-sheet-info-default",
+ "cover-sheet-info-supported",
+ "destination-uri-schemes-supported",/* IPP FaxOut */
+ "destination-uris", /* IPP FaxOut */
+ "destination-uris-supported",
+ "feed-orientation",
+ "feed-orientation-default",
+ "feed-orientation-supported",
+ "finishings",
+ "finishings-col",
+ "finishings-col-default",
+ "finishings-col-supported",
+ "finishings-default",
+ "finishings-supported",
+ "font-name-requested",
+ "font-name-requested-default",
+ "font-name-requested-supported",
+ "font-size-requested",
+ "font-size-requested-default",
+ "font-size-requested-supported",
+ "force-front-side",
+ "force-front-side-default",
+ "force-front-side-supported",
+ "imposition-template",
+ "imposition-template-default",
+ "imposition-template-supported",
+ "insert-after-page-number-supported",
+ "insert-count-supported",
+ "insert-sheet",
+ "insert-sheet-default",
+ "insert-sheet-supported",
+ "job-account-id",
+ "job-account-id-default",
+ "job-account-id-supported",
+ "job-accounting-sheets"
+ "job-accounting-sheets-default"
+ "job-accounting-sheets-supported"
+ "job-accounting-user-id",
+ "job-accounting-user-id-default",
+ "job-accounting-user-id-supported",
+ "job-copies",
+ "job-copies-default",
+ "job-copies-supported",
+ "job-cover-back",
+ "job-cover-back-default",
+ "job-cover-back-supported",
+ "job-cover-front",
+ "job-cover-front-default",
+ "job-cover-front-supported",
+ "job-delay-output-until",
+ "job-delay-output-until-default",
+ "job-delay-output-until-supported",
+ "job-delay-output-until-time",
+ "job-delay-output-until-time-default",
+ "job-delay-output-until-time-supported",
+ "job-error-action",
+ "job-error-action-default",
+ "job-error-action-supported",
+ "job-error-sheet",
+ "job-error-sheet-default",
+ "job-error-sheet-supported",
+ "job-finishings",
+ "job-finishings-col",
+ "job-finishings-col-default",
+ "job-finishings-col-supported",
+ "job-finishings-default",
+ "job-finishings-supported",
+ "job-hold-until",
+ "job-hold-until-default",
+ "job-hold-until-supported",
+ "job-hold-until-time",
+ "job-hold-until-time-default",
+ "job-hold-until-time-supported",
+ "job-message-to-operator",
+ "job-message-to-operator-default",
+ "job-message-to-operator-supported",
+ "job-phone-number",
+ "job-phone-number-default",
+ "job-phone-number-supported",
+ "job-priority",
+ "job-priority-default",
+ "job-priority-supported",
+ "job-recipient-name",
+ "job-recipient-name-default",
+ "job-recipient-name-supported",
+ "job-save-disposition",
+ "job-save-disposition-default",
+ "job-save-disposition-supported",
+ "job-sheets",
+ "job-sheets-col",
+ "job-sheets-col-default",
+ "job-sheets-col-supported",
+ "job-sheets-default",
+ "job-sheets-supported",
+ "logo-uri-schemes-supported",
+ "max-save-info-supported",
+ "max-stitching-locations-supported",
+ "media",
+ "media-back-coating-supported",
+ "media-bottom-margin-supported",
+ "media-col",
+ "media-col-default",
+ "media-col-supported",
+ "media-color-supported",
+ "media-default",
+ "media-front-coating-supported",
+ "media-grain-supported",
+ "media-hole-count-supported",
+ "media-info-supported",
+ "media-input-tray-check",
+ "media-input-tray-check-default",
+ "media-input-tray-check-supported",
+ "media-key-supported",
+ "media-left-margin-supported",
+ "media-order-count-supported",
+ "media-pre-printed-supported",
+ "media-recycled-supported",
+ "media-right-margin-supported",
+ "media-size-supported",
+ "media-source-supported",
+ "media-supported",
+ "media-thickness-supported",
+ "media-top-margin-supported",
+ "media-type-supported",
+ "media-weight-metric-supported",
+ "multiple-document-handling",
+ "multiple-document-handling-default",
+ "multiple-document-handling-supported",
+ "number-of-retries", /* IPP FaxOut */
+ "number-of-retries-default",
+ "number-of-retries-supported",
+ "number-up",
+ "number-up-default",
+ "number-up-supported",
+ "orientation-requested",
+ "orientation-requested-default",
+ "orientation-requested-supported",
+ "output-bin",
+ "output-bin-default",
+ "output-bin-supported",
+ "output-device",
+ "output-device-default",
+ "output-device-supported",
+ "output-mode", /* CUPS extension */
+ "output-mode-default", /* CUPS extension */
+ "output-mode-supported", /* CUPS extension */
+ "overrides",
+ "overrides-supported",
+ "page-delivery",
+ "page-delivery-default",
+ "page-delivery-supported",
+ "page-order-received",
+ "page-order-received-default",
+ "page-order-received-supported",
+ "page-ranges",
+ "page-ranges-supported",
+ "pages-per-subset",
+ "pages-per-subset-supported",
+ "pdl-init-file",
+ "pdl-init-file-default",
+ "pdl-init-file-entry-supported",
+ "pdl-init-file-location-supported",
+ "pdl-init-file-name-subdirectory-supported",
+ "pdl-init-file-name-supported",
+ "pdl-init-file-supported",
+ "presentation-direction-number-up",
+ "presentation-direction-number-up-default",
+ "presentation-direction-number-up-supported",
+ "print-color-mode",
+ "print-color-mode-default",
+ "print-color-mode-supported",
+ "print-content-optimize",
+ "print-content-optimize-default",
+ "print-content-optimize-supported",
+ "print-quality",
+ "print-quality-default",
+ "print-quality-supported",
+ "print-rendering-intent",
+ "print-rendering-intent-default",
+ "print-rendering-intent-supported",
+ "print-scaling", /* IPP Paid Printing */
+ "print-scaling-default", /* IPP Paid Printing */
+ "print-scaling-supported", /* IPP Paid Printing */
+ "printer-resolution",
+ "printer-resolution-default",
+ "printer-resolution-supported",
+ "proof-print",
+ "proof-print-default",
+ "proof-print-supported",
+ "retry-interval", /* IPP FaxOut */
+ "retry-interval-default",
+ "retry-interval-supported",
+ "retry-timeout", /* IPP FaxOut */
+ "retry-timeout-default",
+ "retry-timeout-supported",
+ "save-disposition-supported",
+ "save-document-format-default",
+ "save-document-format-supported",
+ "save-location-default",
+ "save-location-supported",
+ "save-name-subdirectory-supported",
+ "save-name-supported",
+ "separator-sheets",
+ "separator-sheets-default",
+ "separator-sheets-supported",
+ "sheet-collate",
+ "sheet-collate-default",
+ "sheet-collate-supported",
+ "sides",
+ "sides-default",
+ "sides-supported",
+ "stitching-locations-supported",
+ "stitching-offset-supported",
+ "x-image-position",
+ "x-image-position-default",
+ "x-image-position-supported",
+ "x-image-shift",
+ "x-image-shift-default",
+ "x-image-shift-supported",
+ "x-side1-image-shift",
+ "x-side1-image-shift-default",
+ "x-side1-image-shift-supported",
+ "x-side2-image-shift",
+ "x-side2-image-shift-default",
+ "x-side2-image-shift-supported",
+ "y-image-position",
+ "y-image-position-default",
+ "y-image-position-supported",
+ "y-image-shift",
+ "y-image-shift-default",
+ "y-image-shift-supported",
+ "y-side1-image-shift",
+ "y-side1-image-shift-default",
+ "y-side1-image-shift-supported",
+ "y-side2-image-shift",
+ "y-side2-image-shift-default",
+ "y-side2-image-shift-supported"
+ };
+ static const char * const printer_description[] =
+ { /* printer-description group */
+ "auth-info-required", /* CUPS extension */
+ "charset-configured",
+ "charset-supported",
+ "color-supported",
+ "compression-supported",
+ "device-service-count",
+ "device-uri", /* CUPS extension */
+ "device-uuid",
+ "document-charset-default",
+ "document-charset-supported",
+ "document-creation-attributes-supported",
+ "document-digital-signature-default",
+ "document-digital-signature-supported",
+ "document-format-default",
+ "document-format-details-default",
+ "document-format-details-supported",
+ "document-format-supported",
+ "document-format-varying-attributes",
+ "document-format-version-default",
+ "document-format-version-supported",
+ "document-natural-language-default",
+ "document-natural-language-supported",
+ "document-password-supported",
+ "generated-natural-language-supported",
+ "identify-actions-default",
+ "identify-actions-supported",
+ "input-source-supported",
+ "ipp-features-supported",
+ "ipp-versions-supported",
+ "ippget-event-life",
+ "job-authorization-uri-supported", /* CUPS extension */
+ "job-constraints-supported",
+ "job-creation-attributes-supported",
+ "job-finishings-col-ready",
+ "job-finishings-ready",
+ "job-ids-supported",
+ "job-impressions-supported",
+ "job-k-limit", /* CUPS extension */
+ "job-k-octets-supported",
+ "job-media-sheets-supported",
+ "job-page-limit", /* CUPS extension */
+ "job-password-encryption-supported",
+ "job-password-supported",
+ "job-quota-period", /* CUPS extension */
+ "job-resolvers-supported",
+ "job-settable-attributes-supported",
+ "job-spooling-supported",
+ "jpeg-k-octets-supported", /* CUPS extension */
+ "jpeg-x-dimension-supported", /* CUPS extension */
+ "jpeg-y-dimension-supported", /* CUPS extension */
+ "landscape-orientation-requested-preferred",
+ /* CUPS extension */
+ "marker-change-time", /* CUPS extension */
+ "marker-colors", /* CUPS extension */
+ "marker-high-levels", /* CUPS extension */
+ "marker-levels", /* CUPS extension */
+ "marker-low-levels", /* CUPS extension */
+ "marker-message", /* CUPS extension */
+ "marker-names", /* CUPS extension */
+ "marker-types", /* CUPS extension */
+ "media-col-ready",
+ "media-ready",
+ "member-names", /* CUPS extension */
+ "member-uris", /* CUPS extension */
+ "multiple-destination-uris-supported",/* IPP FaxOut */
+ "multiple-document-jobs-supported",
+ "multiple-operation-time-out",
+ "multiple-operation-time-out-action",
+ "natural-language-configured",
+ "operations-supported",
+ "pages-per-minute",
+ "pages-per-minute-color",
+ "pdf-k-octets-supported", /* CUPS extension */
+ "pdf-versions-supported", /* CUPS extension */
+ "pdl-override-supported",
+ "port-monitor", /* CUPS extension */
+ "port-monitor-supported", /* CUPS extension */
+ "preferred-attributes-supported",
+ "printer-alert",
+ "printer-alert-description",
+ "printer-charge-info",
+ "printer-charge-info-uri",
+ "printer-commands", /* CUPS extension */
+ "printer-current-time",
+ "printer-detailed-status-messages",
+ "printer-device-id",
+ "printer-dns-sd-name", /* CUPS extension */
+ "printer-driver-installer",
+ "printer-fax-log-uri", /* IPP FaxOut */
+ "printer-fax-modem-info", /* IPP FaxOut */
+ "printer-fax-modem-name", /* IPP FaxOut */
+ "printer-fax-modem-number", /* IPP FaxOut */
+ "printer-firmware-name", /* PWG 5110.1 */
+ "printer-firmware-patches", /* PWG 5110.1 */
+ "printer-firmware-string-version", /* PWG 5110.1 */
+ "printer-firmware-version", /* PWG 5110.1 */
+ "printer-geo-location",
+ "printer-get-attributes-supported",
+ "printer-icc-profiles",
+ "printer-icons",
+ "printer-info",
+ "printer-input-tray", /* IPP JPS3 */
+ "printer-is-accepting-jobs",
+ "printer-is-shared", /* CUPS extension */
+ "printer-kind", /* IPP Paid Printing */
+ "printer-location",
+ "printer-make-and-model",
+ "printer-mandatory-job-attributes",
+ "printer-message-date-time",
+ "printer-message-from-operator",
+ "printer-message-time",
+ "printer-more-info",
+ "printer-more-info-manufacturer",
+ "printer-name",
+ "printer-native-formats",
+ "printer-organization",
+ "printer-organizational-unit",
+ "printer-output-tray", /* IPP JPS3 */
+ "printer-settable-attributes-supported",
+ "printer-state",
+ "printer-state-change-date-time",
+ "printer-state-change-time",
+ "printer-state-message",
+ "printer-state-reasons",
+ "printer-supply",
+ "printer-supply-description",
+ "printer-supply-info-uri",
+ "printer-type", /* CUPS extension */
+ "printer-up-time",
+ "printer-uri-supported",
+ "printer-uuid",
+ "printer-xri-supported",
+ "pwg-raster-document-resolution-supported",
+ "pwg-raster-document-sheet-back",
+ "pwg-raster-document-type-supported",
+ "queued-job-count",
+ "reference-uri-schemes-supported",
+ "repertoire-supported",
+ "requesting-user-name-allowed", /* CUPS extension */
+ "requesting-user-name-denied", /* CUPS extension */
+ "requesting-user-uri-supported",
+ "subordinate-printers-supported",
+ "urf-supported", /* CUPS extension */
+ "uri-authentication-supported",
+ "uri-security-supported",
+ "user-defined-value-supported",
+ "which-jobs-supported",
+ "xri-authentication-supported",
+ "xri-security-supported",
+ "xri-uri-scheme-supported"
+ };
+ static const char * const subscription_description[] =
+ { /* subscription-description group */
+ "notify-job-id",
+ "notify-lease-expiration-time",
+ "notify-printer-up-time",
+ "notify-printer-uri",
+ "notify-sequence-number",
+ "notify-subscriber-user-name",
+ "notify-subscriber-user-uri",
+ "notify-subscription-id",
+ "subscriptions-uuid"
+ };
+ static const char * const subscription_template[] =
+ { /* subscription-template group */
+ "notify-attributes",
+ "notify-attributes-supported",
+ "notify-charset",
+ "notify-events",
+ "notify-events-default",
+ "notify-events-supported",
+ "notify-lease-duration",
+ "notify-lease-duration-default",
+ "notify-lease-duration-supported",
+ "notify-max-events-supported",
+ "notify-natural-language",
+ "notify-pull-method",
+ "notify-pull-method-supported",
+ "notify-recipient-uri",
+ "notify-schemes-supported",
+ "notify-time-interval",
+ "notify-user-data"
+ };
+
+
+ /*
+ * Get the requested-attributes attribute...
+ */
+
+ if ((requested = ippFindAttribute(request, "requested-attributes",
+ IPP_TAG_KEYWORD)) == NULL)
+ {
+ /*
+ * The Get-Jobs operation defaults to "job-id" and "job-uri", all others
+ * default to "all"...
+ */
+
+ if (ippGetOperation(request) == IPP_OP_GET_JOBS)
+ {
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+ cupsArrayAdd(ra, "job-id");
+ cupsArrayAdd(ra, "job-uri");
+
+ return (ra);
+ }
+ else
+ return (NULL);
+ }
+
+ /*
+ * If the attribute contains a single "all" keyword, return NULL...
+ */
+
+ count = ippGetCount(requested);
+ if (count == 1 && !strcmp(ippGetString(requested, 0, NULL), "all"))
+ return (NULL);
+
+ /*
+ * Create an array using "strcmp" as the comparison function...
+ */
+
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+ for (i = 0; i < count; i ++)
+ {
+ added = 0;
+ value = ippGetString(requested, i, NULL);
+
+ if (!strcmp(value, "document-description") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(document_description) /
+ sizeof(document_description[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)document_description[j]);
+
+ added = 1;
+ }
+
+ if (!strcmp(value, "document-template") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(document_template) / sizeof(document_template[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)document_template[j]);
+
+ added = 1;
+ }
+
+ if (!strcmp(value, "job-description") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(job_description) / sizeof(job_description[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)job_description[j]);
+
+ added = 1;
+ }
+
+ if (!strcmp(value, "job-template") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(job_template) / sizeof(job_template[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)job_template[j]);
+
+ added = 1;
+ }
+
+ if (!strcmp(value, "printer-description") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(printer_description) /
+ sizeof(printer_description[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)printer_description[j]);
+
+ added = 1;
+ }
+
+ if (!strcmp(value, "subscription-description") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(subscription_description) /
+ sizeof(subscription_description[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)subscription_description[j]);
+
+ added = 1;
+ }
+
+ if (!strcmp(value, "subscription-template") || !strcmp(value, "all"))
+ {
+ for (j = 0;
+ j < (int)(sizeof(subscription_template) /
+ sizeof(subscription_template[0]));
+ j ++)
+ cupsArrayAdd(ra, (void *)subscription_template[j]);
+
+ added = 1;
+ }
+
+ if (!added)
+ cupsArrayAdd(ra, (void *)value);
+ }
+
+ return (ra);
}
@@ -648,14 +1789,24 @@ ippEnumString(const char *attrname, /* I - Attribute name */
enumvalue < (3 + (int)(sizeof(ipp_document_states) /
sizeof(ipp_document_states[0]))))
return (ipp_document_states[enumvalue - 3]);
- else if ((!strcmp(attrname, "finishings") ||
- !strcmp(attrname, "finishings-actual") ||
- !strcmp(attrname, "finishings-default") ||
- !strcmp(attrname, "finishings-ready") ||
- !strcmp(attrname, "finishings-supported")) &&
- enumvalue >= 3 &&
- enumvalue < (3 + (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0]))))
- return (ipp_finishings[enumvalue - 3]);
+ else if (!strcmp(attrname, "finishings") ||
+ !strcmp(attrname, "finishings-actual") ||
+ !strcmp(attrname, "finishings-default") ||
+ !strcmp(attrname, "finishings-ready") ||
+ !strcmp(attrname, "finishings-supported") ||
+ !strcmp(attrname, "job-finishings") ||
+ !strcmp(attrname, "job-finishings-default") ||
+ !strcmp(attrname, "job-finishings-supported"))
+ {
+ if (enumvalue >= 3 &&
+ enumvalue < (3 + (int)(sizeof(ipp_finishings) /
+ sizeof(ipp_finishings[0]))))
+ return (ipp_finishings[enumvalue - 3]);
+ else if (enumvalue >= 0x40000000 &&
+ enumvalue <= (0x40000000 + (int)(sizeof(ipp_finishings_vendor) /
+ sizeof(ipp_finishings_vendor[0]))))
+ return (ipp_finishings_vendor[enumvalue - 0x40000000]);
+ }
else if ((!strcmp(attrname, "job-collation-type") ||
!strcmp(attrname, "job-collation-type-actual")) &&
enumvalue >= 3 &&
@@ -663,8 +1814,8 @@ ippEnumString(const char *attrname, /* I - Attribute name */
sizeof(ipp_job_collation_types[0]))))
return (ipp_job_collation_types[enumvalue - 3]);
else if (!strcmp(attrname, "job-state") &&
- enumvalue >= IPP_JOB_PENDING && enumvalue <= IPP_JOB_COMPLETED)
- return (ipp_job_states[enumvalue - IPP_JOB_PENDING]);
+ enumvalue >= IPP_JSTATE_PENDING && enumvalue <= IPP_JSTATE_COMPLETED)
+ return (ipp_job_states[enumvalue - IPP_JSTATE_PENDING]);
else if (!strcmp(attrname, "operations-supported"))
return (ippOpString((ipp_op_t)enumvalue));
else if ((!strcmp(attrname, "orientation-requested") ||
@@ -684,8 +1835,8 @@ ippEnumString(const char *attrname, /* I - Attribute name */
sizeof(ipp_print_qualities[0]))))
return (ipp_print_qualities[enumvalue - 3]);
else if (!strcmp(attrname, "printer-state") &&
- enumvalue >= IPP_PRINTER_IDLE && enumvalue <= IPP_PRINTER_STOPPED)
- return (ipp_printer_states[enumvalue - IPP_PRINTER_IDLE]);
+ enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED)
+ return (ipp_printer_states[enumvalue - IPP_PSTATE_IDLE]);
/*
* Not a standard enum value, just return the decimal equivalent...
@@ -714,7 +1865,7 @@ ippEnumValue(const char *attrname, /* I - Attribute name */
*/
if (isdigit(*enumstring & 255))
- return (strtol(enumstring, NULL, 0));
+ return ((int)strtol(enumstring, NULL, 0));
/*
* Otherwise look up the string...
@@ -731,6 +1882,13 @@ ippEnumValue(const char *attrname, /* I - Attribute name */
!strcmp(attrname, "finishings-ready") ||
!strcmp(attrname, "finishings-supported"))
{
+ for (i = 0;
+ i < (int)(sizeof(ipp_finishings_vendor) /
+ sizeof(ipp_finishings_vendor[0]));
+ i ++)
+ if (!strcmp(enumstring, ipp_finishings_vendor[i]))
+ return (i + 0x40000000);
+
num_strings = (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0]));
strings = ipp_finishings;
}
@@ -795,18 +1953,25 @@ ippErrorString(ipp_status_t error) /* I - Error status */
* See if the error code is a known value...
*/
- if (error >= IPP_OK && error <= IPP_OK_EVENTS_COMPLETE)
+ if (error >= IPP_STATUS_OK && error <= IPP_STATUS_OK_EVENTS_COMPLETE)
return (ipp_status_oks[error]);
- else if (error == IPP_REDIRECTION_OTHER_SITE)
+ else if (error == IPP_STATUS_REDIRECTION_OTHER_SITE)
return ("redirection-other-site");
- else if (error == CUPS_SEE_OTHER)
+ else if (error == IPP_STATUS_CUPS_SEE_OTHER)
return ("cups-see-other");
- else if (error >= IPP_BAD_REQUEST && error <= IPP_PRINT_SUPPORT_FILE_NOT_FOUND)
- return (ipp_status_400s[error - IPP_BAD_REQUEST]);
- else if (error >= IPP_INTERNAL_ERROR && error <= IPP_PRINTER_IS_DEACTIVATED)
- return (ipp_status_500s[error - IPP_INTERNAL_ERROR]);
- else if (error >= IPP_AUTHENTICATION_CANCELED && error <= IPP_UPGRADE_REQUIRED)
- return (ipp_status_1000s[error - IPP_AUTHENTICATION_CANCELED]);
+ else if (error >= IPP_STATUS_ERROR_BAD_REQUEST &&
+ error <= IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED)
+ return (ipp_status_400s[error - IPP_STATUS_ERROR_BAD_REQUEST]);
+ else if (error >= 0x480 &&
+ error <= IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
+ return (ipp_status_480s[error - 0x0480]);
+ else if (error >= IPP_STATUS_ERROR_INTERNAL &&
+ error <= IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS)
+ return (ipp_status_500s[error - IPP_STATUS_ERROR_INTERNAL]);
+ else if (error >= IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED &&
+ error <= IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED)
+ return (ipp_status_1000s[error -
+ IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED]);
/*
* No, build an "0xxxxx" error string...
@@ -827,7 +1992,7 @@ ippErrorString(ipp_status_t error) /* I - Error status */
ipp_status_t /* O - IPP status code */
ippErrorValue(const char *name) /* I - Name */
{
- int i;
+ size_t i; /* Looping var */
for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++)
@@ -835,15 +2000,19 @@ ippErrorValue(const char *name) /* I - Name */
return ((ipp_status_t)i);
if (!_cups_strcasecmp(name, "redirection-other-site"))
- return (IPP_REDIRECTION_OTHER_SITE);
+ return (IPP_STATUS_REDIRECTION_OTHER_SITE);
if (!_cups_strcasecmp(name, "cups-see-other"))
- return (CUPS_SEE_OTHER);
+ return (IPP_STATUS_CUPS_SEE_OTHER);
for (i = 0; i < (sizeof(ipp_status_400s) / sizeof(ipp_status_400s[0])); i ++)
if (!_cups_strcasecmp(name, ipp_status_400s[i]))
return ((ipp_status_t)(i + 0x400));
+ for (i = 0; i < (sizeof(ipp_status_480s) / sizeof(ipp_status_480s[0])); i ++)
+ if (!_cups_strcasecmp(name, ipp_status_480s[i]))
+ return ((ipp_status_t)(i + 0x480));
+
for (i = 0; i < (sizeof(ipp_status_500s) / sizeof(ipp_status_500s[0])); i ++)
if (!_cups_strcasecmp(name, ipp_status_500s[i]))
return ((ipp_status_t)(i + 0x500));
@@ -872,13 +2041,13 @@ ippOpString(ipp_op_t op) /* I - Operation ID */
* See if the operation ID is a known value...
*/
- if (op >= IPP_PRINT_JOB && op <= IPP_CLOSE_JOB)
+ if (op >= IPP_OP_PRINT_JOB && op <= IPP_OP_VALIDATE_DOCUMENT)
return (ipp_std_ops[op]);
- else if (op == IPP_PRIVATE)
+ else if (op == IPP_OP_PRIVATE)
return ("windows-ext");
- else if (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD)
- return (ipp_cups_ops[op - CUPS_GET_DEFAULT]);
- else if (op == CUPS_GET_DOCUMENT)
+ else if (op >= IPP_OP_CUPS_GET_DEFAULT && op <= IPP_OP_CUPS_GET_PPD)
+ return (ipp_cups_ops[op - IPP_OP_CUPS_GET_DEFAULT]);
+ else if (op == IPP_OP_CUPS_GET_DOCUMENT)
return (ipp_cups_ops2[0]);
/*
@@ -900,7 +2069,7 @@ ippOpString(ipp_op_t op) /* I - Operation ID */
ipp_op_t /* O - Operation ID */
ippOpValue(const char *name) /* I - Textual name */
{
- int i;
+ size_t i; /* Looping var */
if (!strncmp(name, "0x", 2))
@@ -911,7 +2080,7 @@ ippOpValue(const char *name) /* I - Textual name */
return ((ipp_op_t)i);
if (!_cups_strcasecmp(name, "windows-ext"))
- return (IPP_PRIVATE);
+ return (IPP_OP_PRIVATE);
for (i = 0; i < (sizeof(ipp_cups_ops) / sizeof(ipp_cups_ops[0])); i ++)
if (!_cups_strcasecmp(name, ipp_cups_ops[i]))
@@ -921,13 +2090,19 @@ ippOpValue(const char *name) /* I - Textual name */
if (!_cups_strcasecmp(name, ipp_cups_ops2[i]))
return ((ipp_op_t)(i + 0x4027));
+ if (!_cups_strcasecmp(name, "Create-Job-Subscription"))
+ return (IPP_OP_CREATE_JOB_SUBSCRIPTIONS);
+
+ if (!_cups_strcasecmp(name, "Create-Printer-Subscription"))
+ return (IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS);
+
if (!_cups_strcasecmp(name, "CUPS-Add-Class"))
- return (CUPS_ADD_MODIFY_CLASS);
+ return (IPP_OP_CUPS_ADD_MODIFY_CLASS);
if (!_cups_strcasecmp(name, "CUPS-Add-Printer"))
- return (CUPS_ADD_MODIFY_PRINTER);
+ return (IPP_OP_CUPS_ADD_MODIFY_PRINTER);
- return ((ipp_op_t)-1);
+ return (IPP_OP_CUPS_INVALID);
}
@@ -966,6 +2141,22 @@ ippSetPort(int p) /* I - Port number to use */
/*
+ * 'ippStateString()' - Return the name corresponding to a state value.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+const char * /* O - State name */
+ippStateString(ipp_state_t state) /* I - State value */
+{
+ if (state >= IPP_STATE_ERROR && state <= IPP_STATE_DATA)
+ return (ipp_states[state - IPP_STATE_ERROR]);
+ else
+ return ("UNKNOWN");
+}
+
+
+/*
* 'ippTagString()' - Return the tag name corresponding to a tag value.
*
* The returned names are defined in RFC 2911 and 3382.
@@ -976,7 +2167,7 @@ ippSetPort(int p) /* I - Port number to use */
const char * /* O - Tag name */
ippTagString(ipp_tag_t tag) /* I - Tag value */
{
- tag &= IPP_TAG_MASK;
+ tag &= IPP_TAG_CUPS_MASK;
if (tag < (ipp_tag_t)(sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])))
return (ipp_tag_names[tag]);
@@ -996,7 +2187,7 @@ ippTagString(ipp_tag_t tag) /* I - Tag value */
ipp_tag_t /* O - Tag value */
ippTagValue(const char *name) /* I - Tag name */
{
- int i; /* Looping var */
+ size_t i; /* Looping var */
for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++)
@@ -1046,6 +2237,14 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */
ipp_attribute_t *attr; /* Current member attribute */
+ if (!col)
+ {
+ if (buffer)
+ *buffer = '\0';
+
+ return (0);
+ }
+
bufptr = buffer;
bufend = buffer + bufsize - 1;
@@ -1060,12 +2259,12 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */
prefix = ' ';
if (buffer && bufptr < bufend)
- bufptr += snprintf(bufptr, bufend - bufptr + 1, "%s=", attr->name);
+ bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%s=", attr->name);
else
bufptr += strlen(attr->name) + 1;
if (buffer && bufptr < bufend)
- bufptr += ippAttributeString(attr, bufptr, bufend - bufptr + 1);
+ bufptr += ippAttributeString(attr, bufptr, (size_t)(bufend - bufptr + 1));
else
bufptr += ippAttributeString(attr, temp, sizeof(temp));
}
@@ -1081,10 +2280,10 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */
*bufptr = '}';
bufptr ++;
- return (bufptr - buffer);
+ return ((size_t)(bufptr - buffer));
}
/*
- * End of "$Id: ipp-support.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp-support.c 12666 2015-05-25 19:38:09Z msweet $".
*/
diff --git a/cups/ipp.c b/cups/ipp.c
index 1a8beed..5e7b730 100644
--- a/cups/ipp.c
+++ b/cups/ipp.c
@@ -1,109 +1,18 @@
/*
- * "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * Internet Printing Protocol functions for CUPS.
- *
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsBufferGet() - Get a read/write buffer.
- * _cupsBufferRelease() - Release a read/write buffer.
- * ippAddBoolean() - Add a boolean attribute to an IPP message.
- * ippAddBooleans() - Add an array of boolean values.
- * ippAddCollection() - Add a collection value.
- * ippAddCollections() - Add an array of collection values.
- * ippAddDate() - Add a date attribute to an IPP message.
- * ippAddInteger() - Add a integer attribute to an IPP message.
- * ippAddIntegers() - Add an array of integer values.
- * ippAddOctetString() - Add an octetString value to an IPP message.
- * ippAddOutOfBand() - Add an out-of-band value to an IPP message.
- * ippAddRange() - Add a range of values to an IPP message.
- * ippAddRanges() - Add ranges of values to an IPP message.
- * ippAddResolution() - Add a resolution value to an IPP message.
- * ippAddResolutions() - Add resolution values to an IPP message.
- * ippAddSeparator() - Add a group separator to an IPP message.
- * ippAddString() - Add a language-encoded string to an IPP message.
- * ippAddStrings() - Add language-encoded strings to an IPP message.
- * ippCopyAttribute() - Copy an attribute.
- * ippCopyAttributes() - Copy attributes from one IPP message to another.
- * ippDateToTime() - Convert from RFC 1903 Date/Time format to UNIX
- * time in seconds.
- * ippDelete() - Delete an IPP message.
- * ippDeleteAttribute() - Delete a single attribute in an IPP message.
- * ippDeleteValues() - Delete values in an attribute.
- * ippFindAttribute() - Find a named attribute in a request.
- * ippFindNextAttribute() - Find the next named attribute in a request.
- * ippFirstAttribute() - Return the first attribute in the message.
- * ippGetBoolean() - Get a boolean value for an attribute.
- * ippGetCollection() - Get a collection value for an attribute.
- * ippGetCount() - Get the number of values in an attribute.
- * ippGetDate() - Get a date value for an attribute.
- * ippGetGroupTag() - Get the group associated with an attribute.
- * ippGetInteger() - Get the integer/enum value for an attribute.
- * ippGetName() - Get the attribute name.
- * ippGetOperation() - Get the operation ID in an IPP message.
- * ippGetRange() - Get a rangeOfInteger value from an attribute.
- * ippGetRequestId() - Get the request ID from an IPP message.
- * ippGetResolution() - Get a resolution value for an attribute.
- * ippGetStatusCode() - Get the status code from an IPP response or event
- * message.
- * ippGetString() - Get the string and optionally the language code
- * for an attribute.
- * ippGetValueTag() - Get the value tag for an attribute.
- * ippGetVersion() - Get the major and minor version number from an
- * IPP message.
- * ippLength() - Compute the length of an IPP message.
- * ippNextAttribute() - Return the next attribute in the message.
- * ippNew() - Allocate a new IPP message.
- * ippNewRequest() - Allocate a new IPP request message.
- * ippRead() - Read data for an IPP message from a HTTP
- * connection.
- * ippReadFile() - Read data for an IPP message from a file.
- * ippReadIO() - Read data for an IPP message.
- * ippSetBoolean() - Set a boolean value in an attribute.
- * ippSetCollection() - Set a collection value in an attribute.
- * ippSetDate() - Set a date value in an attribute.
- * ippSetGroupTag() - Set the group tag of an attribute.
- * ippSetInteger() - Set an integer or enum value in an attribute.
- * ippSetName() - Set the name of an attribute.
- * ippSetOperation() - Set the operation ID in an IPP request message.
- * ippSetRange() - Set a rangeOfInteger value in an attribute.
- * ippSetRequestId() - Set the request ID in an IPP message.
- * ippSetResolution() - Set a resolution value in an attribute.
- * ippSetState() - Set the current state of the IPP message.
- * ippSetStatusCode() - Set the status code in an IPP response or event
- * message.
- * ippSetString() - Set a string value in an attribute.
- * ippSetValueTag() - Set the value tag of an attribute.
- * ippSetVersion() - Set the version number in an IPP message.
- * ippTimeToDate() - Convert from UNIX time to RFC 1903 format.
- * ippWrite() - Write data for an IPP message to a HTTP
- * connection.
- * ippWriteFile() - Write data for an IPP message to a file.
- * ippWriteIO() - Write data for an IPP message.
- * ipp_add_attr() - Add a new attribute to the message.
- * ipp_free_values() - Free attribute values.
- * ipp_get_code() - Convert a C locale/charset name into an IPP
- * language/charset code.
- * ipp_lang_code() - Convert a C locale name into an IPP language
- * code.
- * ipp_length() - Compute the length of an IPP message or
- * collection value.
- * ipp_read_http() - Semi-blocking read on a HTTP connection...
- * ipp_read_file() - Read IPP data from a file.
- * ipp_set_value() - Get the value element from an attribute,
- * expanding it as needed.
- * ipp_write_file() - Write IPP data to a file.
+ * "$Id: ipp.c 12468 2015-02-01 04:50:43Z msweet $"
+ *
+ * Internet Printing Protocol functions for CUPS.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -111,6 +20,7 @@
*/
#include "cups-private.h"
+#include <regex.h>
#ifdef WIN32
# include <io.h>
#endif /* WIN32 */
@@ -136,6 +46,8 @@ static ssize_t ipp_read_http(http_t *http, ipp_uchar_t *buffer,
size_t length);
static ssize_t ipp_read_file(int *fd, ipp_uchar_t *buffer,
size_t length);
+static void ipp_set_error(ipp_status_t status, const char *format,
+ ...);
static _ipp_value_t *ipp_set_value(ipp_t *ipp, ipp_attribute_t **attr,
int element);
static ssize_t ipp_write_file(int *fd, ipp_uchar_t *buffer,
@@ -196,8 +108,8 @@ _cupsBufferRelease(char *b) /* I - Buffer to release */
/*
* 'ippAddBoolean()' - Add a boolean attribute to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -242,8 +154,8 @@ ippAddBoolean(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddBooleans()' - Add an array of boolean values.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -299,8 +211,8 @@ ippAddBooleans(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddCollection()' - Add a collection value.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -350,8 +262,8 @@ ippAddCollection(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddCollections()' - Add an array of collection values.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -414,8 +326,8 @@ ippAddCollections(
/*
* 'ippAddDate()' - Add a date attribute to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -460,8 +372,8 @@ ippAddDate(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddInteger()' - Add a integer attribute to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -487,7 +399,7 @@ ippAddInteger(ipp_t *ipp, /* I - IPP message */
"name=\"%s\", value=%d)", ipp, group, ippTagString(group),
value_tag, ippTagString(value_tag), name, value));
- value_tag &= IPP_TAG_MASK;
+ value_tag &= IPP_TAG_CUPS_MASK;
/*
* Special-case for legacy usage: map out-of-band attributes to new ippAddOutOfBand
@@ -528,8 +440,8 @@ ippAddInteger(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddIntegers()' - Add an array of integer values.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -559,7 +471,7 @@ ippAddIntegers(ipp_t *ipp, /* I - IPP message */
group, ippTagString(group), value_tag, ippTagString(value_tag), name,
num_values, values));
- value_tag &= IPP_TAG_MASK;
+ value_tag &= IPP_TAG_CUPS_MASK;
/*
* Range check input...
@@ -600,8 +512,8 @@ ippAddIntegers(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddOctetString()' - Add an octetString value to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -623,7 +535,8 @@ ippAddOctetString(ipp_t *ipp, /* I - IPP message */
if (!ipp || !name || group < IPP_TAG_ZERO ||
- group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE)
+ group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE ||
+ datalen < 0 || datalen > IPP_MAX_LENGTH)
return (NULL);
if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_STRING, 1)) == NULL)
@@ -637,13 +550,13 @@ ippAddOctetString(ipp_t *ipp, /* I - IPP message */
if (data)
{
- if ((attr->values[0].unknown.data = malloc(datalen)) == NULL)
+ if ((attr->values[0].unknown.data = malloc((size_t)datalen)) == NULL)
{
ippDeleteAttribute(ipp, attr);
return (NULL);
}
- memcpy(attr->values[0].unknown.data, data, datalen);
+ memcpy(attr->values[0].unknown.data, data, (size_t)datalen);
}
/*
@@ -657,8 +570,8 @@ ippAddOctetString(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddOutOfBand()' - Add an out-of-band value to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -685,7 +598,7 @@ ippAddOutOfBand(ipp_t *ipp, /* I - IPP message */
"name=\"%s\")", ipp, group, ippTagString(group), value_tag,
ippTagString(value_tag), name));
- value_tag &= IPP_TAG_MASK;
+ value_tag &= IPP_TAG_CUPS_MASK;
/*
* Range check input...
@@ -713,8 +626,8 @@ ippAddOutOfBand(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddRange()' - Add a range of values to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -764,8 +677,8 @@ ippAddRange(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddRanges()' - Add ranges of values to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -825,8 +738,8 @@ ippAddRanges(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddResolution()' - Add a resolution value to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -878,8 +791,8 @@ ippAddResolution(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddResolutions()' - Add resolution values to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -942,8 +855,8 @@ ippAddResolutions(ipp_t *ipp, /* I - IPP message */
/*
* 'ippAddSeparator()' - Add a group separator to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*/
ipp_attribute_t * /* O - New attribute */
@@ -969,8 +882,8 @@ ippAddSeparator(ipp_t *ipp) /* I - IPP message */
/*
* 'ippAddString()' - Add a language-encoded string to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -999,7 +912,8 @@ ippAddString(ipp_t *ipp, /* I - IPP message */
{
ipp_tag_t temp_tag; /* Temporary value tag (masked) */
ipp_attribute_t *attr; /* New attribute */
- char code[32]; /* Charset/language code buffer */
+ char code[IPP_MAX_LANGUAGE];
+ /* Charset/language code buffer */
DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), "
@@ -1011,7 +925,7 @@ ippAddString(ipp_t *ipp, /* I - IPP message */
* Range check input...
*/
- temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_MASK);
+ temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK);
#if 0
if (!ipp || !name || group < IPP_TAG_ZERO ||
@@ -1033,13 +947,13 @@ ippAddString(ipp_t *ipp, /* I - IPP message */
* See if we need to map charset, language, or locale values...
*/
- if (language && ((int)value_tag & IPP_TAG_COPY) &&
+ if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) &&
strcmp(language, ipp_lang_code(language, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
- else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_COPY) &&
+ else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST) &&
strcmp(value, ipp_get_code(value, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
- else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_COPY) &&
+ else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST) &&
strcmp(value, ipp_lang_code(value, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
@@ -1054,7 +968,7 @@ ippAddString(ipp_t *ipp, /* I - IPP message */
* Initialize the attribute data...
*/
- if ((int)value_tag & IPP_TAG_COPY)
+ if ((int)value_tag & IPP_TAG_CUPS_CONST)
{
attr->values[0].string.language = (char *)language;
attr->values[0].string.text = (char *)value;
@@ -1083,10 +997,225 @@ ippAddString(ipp_t *ipp, /* I - IPP message */
/*
+ * 'ippAddStringf()' - Add a formatted string to an IPP message.
+ *
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
+ *
+ * The @code group@ parameter specifies the IPP attribute group tag: none
+ * (@code IPP_TAG_ZERO@, for member attributes), document
+ * (@code IPP_TAG_DOCUMENT@), event notification
+ * (@code IPP_TAG_EVENT_NOTIFICATION@), operation (@code IPP_TAG_OPERATION@),
+ * printer (@code IPP_TAG_PRINTER@), subscription (@code IPP_TAG_SUBSCRIPTION@),
+ * or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@).
+ *
+ * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword
+ * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType
+ * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage
+ * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage
+ * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme
+ * (@code IPP_TAG_URISCHEME@).
+ *
+ * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage
+ * and textWithLanguage string values and must be @code NULL@ for all other
+ * string values.
+ *
+ * The @code format@ parameter uses formatting characters compatible with the
+ * printf family of standard functions. Additional arguments follow it as
+ * needed. The formatted string is truncated as needed to the maximum length of
+ * the corresponding value type.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+ipp_attribute_t * /* O - New attribute */
+ippAddStringf(ipp_t *ipp, /* I - IPP message */
+ ipp_tag_t group, /* I - IPP group */
+ ipp_tag_t value_tag, /* I - Type of attribute */
+ const char *name, /* I - Name of attribute */
+ const char *language, /* I - Language code (@code NULL@ for default) */
+ const char *format, /* I - Printf-style format string */
+ ...) /* I - Additional arguments as needed */
+{
+ ipp_attribute_t *attr; /* New attribute */
+ va_list ap; /* Argument pointer */
+
+
+ va_start(ap, format);
+ attr = ippAddStringfv(ipp, group, value_tag, name, language, format, ap);
+ va_end(ap);
+
+ return (attr);
+}
+
+
+/*
+ * 'ippAddStringfv()' - Add a formatted string to an IPP message.
+ *
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
+ *
+ * The @code group@ parameter specifies the IPP attribute group tag: none
+ * (@code IPP_TAG_ZERO@, for member attributes), document
+ * (@code IPP_TAG_DOCUMENT@), event notification
+ * (@code IPP_TAG_EVENT_NOTIFICATION@), operation (@code IPP_TAG_OPERATION@),
+ * printer (@code IPP_TAG_PRINTER@), subscription (@code IPP_TAG_SUBSCRIPTION@),
+ * or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@).
+ *
+ * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword
+ * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType
+ * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage
+ * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage
+ * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme
+ * (@code IPP_TAG_URISCHEME@).
+ *
+ * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage
+ * and textWithLanguage string values and must be @code NULL@ for all other
+ * string values.
+ *
+ * The @code format@ parameter uses formatting characters compatible with the
+ * printf family of standard functions. Additional arguments are passed in the
+ * stdarg pointer @code ap@. The formatted string is truncated as needed to the
+ * maximum length of the corresponding value type.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+ipp_attribute_t * /* O - New attribute */
+ippAddStringfv(ipp_t *ipp, /* I - IPP message */
+ ipp_tag_t group, /* I - IPP group */
+ ipp_tag_t value_tag, /* I - Type of attribute */
+ const char *name, /* I - Name of attribute */
+ const char *language, /* I - Language code (@code NULL@ for default) */
+ const char *format, /* I - Printf-style format string */
+ va_list ap) /* I - Additional arguments */
+{
+ char buffer[IPP_MAX_TEXT + 4];
+ /* Formatted text string */
+ ssize_t bytes, /* Length of formatted value */
+ max_bytes; /* Maximum number of bytes for value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!ipp || !name || group < IPP_TAG_ZERO ||
+ group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE ||
+ (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
+ value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
+ !format)
+ return (NULL);
+
+ if ((value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG)
+ != (language != NULL))
+ return (NULL);
+
+ /*
+ * Format the string...
+ */
+
+ if (!strcmp(format, "%s"))
+ {
+ /*
+ * Optimize the simple case...
+ */
+
+ const char *s = va_arg(ap, char *);
+
+ if (!s)
+ s = "(null)";
+
+ bytes = (ssize_t)strlen(s);
+ strlcpy(buffer, s, sizeof(buffer));
+ }
+ else
+ {
+ /*
+ * Do a full formatting of the message...
+ */
+
+ if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0)
+ return (NULL);
+ }
+
+ /*
+ * Limit the length of the string...
+ */
+
+ switch (value_tag)
+ {
+ default :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ max_bytes = IPP_MAX_TEXT;
+ break;
+
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ max_bytes = IPP_MAX_NAME;
+ break;
+
+ case IPP_TAG_CHARSET :
+ max_bytes = IPP_MAX_CHARSET;
+ break;
+
+ case IPP_TAG_KEYWORD :
+ max_bytes = IPP_MAX_KEYWORD;
+ break;
+
+ case IPP_TAG_LANGUAGE :
+ max_bytes = IPP_MAX_LANGUAGE;
+ break;
+
+ case IPP_TAG_MIMETYPE :
+ max_bytes = IPP_MAX_MIMETYPE;
+ break;
+
+ case IPP_TAG_URI :
+ max_bytes = IPP_MAX_URI;
+ break;
+
+ case IPP_TAG_URISCHEME :
+ max_bytes = IPP_MAX_URISCHEME;
+ break;
+ }
+
+ if (bytes >= max_bytes)
+ {
+ char *bufmax, /* Buffer at max_bytes */
+ *bufptr; /* Pointer into buffer */
+
+ bufptr = buffer + strlen(buffer) - 1;
+ bufmax = buffer + max_bytes - 1;
+
+ while (bufptr > bufmax)
+ {
+ if (*bufptr & 0x80)
+ {
+ while ((*bufptr & 0xc0) == 0x80 && bufptr > buffer)
+ bufptr --;
+ }
+
+ bufptr --;
+ }
+
+ *bufptr = '\0';
+ }
+
+ /*
+ * Add the formatted string and return...
+ */
+
+ return (ippAddString(ipp, group, value_tag, name, language, buffer));
+}
+
+
+/*
* 'ippAddStrings()' - Add language-encoded strings to an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code group@ parameter specifies the IPP attribute group tag: none
* (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@),
@@ -1131,7 +1260,7 @@ ippAddStrings(
* Range check input...
*/
- temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_MASK);
+ temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK);
#if 0
if (!ipp || !name || group < IPP_TAG_ZERO ||
@@ -1155,10 +1284,10 @@ ippAddStrings(
* See if we need to map charset, language, or locale values...
*/
- if (language && ((int)value_tag & IPP_TAG_COPY) &&
+ if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) &&
strcmp(language, ipp_lang_code(language, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
- else if (values && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_COPY))
+ else if (values && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST))
{
for (i = 0; i < num_values; i ++)
if (strcmp(values[i], ipp_get_code(values[i], code, sizeof(code))))
@@ -1167,7 +1296,7 @@ ippAddStrings(
break;
}
}
- else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_COPY))
+ else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST))
{
for (i = 0; i < num_values; i ++)
if (strcmp(values[i], ipp_lang_code(values[i], code, sizeof(code))))
@@ -1196,7 +1325,7 @@ ippAddStrings(
{
if (value == attr->values)
{
- if ((int)value_tag & IPP_TAG_COPY)
+ if ((int)value_tag & IPP_TAG_CUPS_CONST)
value->string.language = (char *)language;
else
value->string.language = _cupsStrAlloc(ipp_lang_code(language, code,
@@ -1208,7 +1337,7 @@ ippAddStrings(
if (values)
{
- if ((int)value_tag & IPP_TAG_COPY)
+ if ((int)value_tag & IPP_TAG_CUPS_CONST)
value->string.text = (char *)*values++;
else if (value_tag == IPP_TAG_CHARSET)
value->string.text = _cupsStrAlloc(ipp_get_code(*values++, code, sizeof(code)));
@@ -1224,6 +1353,133 @@ ippAddStrings(
/*
+ * 'ippContainsInteger()' - Determine whether an attribute contains the
+ * specified value or is within the list of ranges.
+ *
+ * Returns non-zero when the attribute contains either a matching integer or
+ * enum value, or the value falls within one of the rangeOfInteger values for
+ * the attribute.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on a match, 0 on no match */
+ippContainsInteger(
+ ipp_attribute_t *attr, /* I - Attribute */
+ int value) /* I - Integer/enum value */
+{
+ int i; /* Looping var */
+ _ipp_value_t *avalue; /* Current attribute value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!attr)
+ return (0);
+
+ if (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM &&
+ attr->value_tag != IPP_TAG_RANGE)
+ return (0);
+
+ /*
+ * Compare...
+ */
+
+ if (attr->value_tag == IPP_TAG_RANGE)
+ {
+ for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++)
+ if (value >= avalue->range.lower && value <= avalue->range.upper)
+ return (1);
+ }
+ else
+ {
+ for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++)
+ if (value == avalue->integer)
+ return (1);
+ }
+
+ return (0);
+}
+
+
+/*
+ * 'ippContainsString()' - Determine whether an attribute contains the
+ * specified string value.
+ *
+ * Returns non-zero when the attribute contains a matching charset, keyword,
+ * language, mimeMediaType, name, text, URI, or URI scheme value.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on a match, 0 on no match */
+ippContainsString(
+ ipp_attribute_t *attr, /* I - Attribute */
+ const char *value) /* I - String value */
+{
+ int i; /* Looping var */
+ _ipp_value_t *avalue; /* Current attribute value */
+
+
+ DEBUG_printf(("ippContainsString(attr=%p, value=\"%s\")", attr, value));
+
+ /*
+ * Range check input...
+ */
+
+ if (!attr || !value)
+ {
+ DEBUG_puts("1ippContainsString: Returning 0 (bad input)");
+ return (0);
+ }
+
+ /*
+ * Compare...
+ */
+
+ DEBUG_printf(("1ippContainsString: attr %s, %s with %d values.",
+ attr->name, ippTagString(attr->value_tag),
+ attr->num_values));
+
+ switch (attr->value_tag & IPP_TAG_CUPS_MASK)
+ {
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ for (i = attr->num_values, avalue = attr->values;
+ i > 0;
+ i --, avalue ++)
+ {
+ DEBUG_printf(("1ippContainsString: value[%d]=\"%s\"",
+ attr->num_values - i, avalue->string.text));
+
+ if (!strcmp(value, avalue->string.text))
+ {
+ DEBUG_puts("1ippContainsString: Returning 1 (match)");
+ return (1);
+ }
+ }
+
+ default :
+ break;
+ }
+
+ DEBUG_puts("1ippContainsString: Returning 0 (no match)");
+
+ return (0);
+}
+
+
+/*
* 'ippCopyAttribute()' - Copy an attribute.
*
* The specified attribute, @code attr@, is copied to the destination IPP message.
@@ -1261,9 +1517,9 @@ ippCopyAttribute(
* Copy it...
*/
- quickcopy = quickcopy ? IPP_TAG_COPY : 0;
+ quickcopy = quickcopy ? IPP_TAG_CUPS_CONST : 0;
- switch (srcattr->value_tag & ~IPP_TAG_COPY)
+ switch (srcattr->value_tag & ~IPP_TAG_CUPS_CONST)
{
case IPP_TAG_ZERO :
dstattr = ippAddSeparator(dst);
@@ -1316,7 +1572,7 @@ ippCopyAttribute(
i --, srcval ++, dstval ++)
dstval->string.text = srcval->string.text;
}
- else if (srcattr->value_tag & IPP_TAG_COPY)
+ else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
{
for (i = srcattr->num_values, srcval = srcattr->values,
dstval = dstattr->values;
@@ -1393,7 +1649,7 @@ ippCopyAttribute(
dstval->string.text = srcval->string.text;
}
}
- else if (srcattr->value_tag & IPP_TAG_COPY)
+ else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
{
for (i = srcattr->num_values, srcval = srcattr->values,
dstval = dstattr->values;
@@ -1456,10 +1712,10 @@ ippCopyAttribute(
if (dstval->unknown.length > 0)
{
- if ((dstval->unknown.data = malloc(dstval->unknown.length)) == NULL)
+ if ((dstval->unknown.data = malloc((size_t)dstval->unknown.length)) == NULL)
dstval->unknown.length = 0;
else
- memcpy(dstval->unknown.data, srcval->unknown.data, dstval->unknown.length);
+ memcpy(dstval->unknown.data, srcval->unknown.data, (size_t)dstval->unknown.length);
}
}
break; /* anti-compiler-warning-code */
@@ -1472,7 +1728,7 @@ ippCopyAttribute(
/*
* 'ippCopyAttributes()' - Copy attributes from one IPP message to another.
*
- * Zero or more attributes are copied from the source IPP message, @code@ src, to the
+ * Zero or more attributes are copied from the source IPP message, @code src@, to the
* destination IPP message, @code dst@. When @code quickcopy@ is non-zero, a "shallow"
* reference copy of the attribute is created - this should only be done as long as the
* original source IPP message will not be freed for the life of the destination.
@@ -1727,6 +1983,10 @@ ippDeleteValues(
/*
* 'ippFindAttribute()' - Find a named attribute in a request.
+ *
+ * Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+ * of attribute and member names separated by slashes, for example
+ * "media-col/media-size".
*/
ipp_attribute_t * /* O - Matching attribute */
@@ -1745,6 +2005,7 @@ ippFindAttribute(ipp_t *ipp, /* I - IPP message */
*/
ipp->current = NULL;
+ ipp->atend = 0;
/*
* Search for the attribute...
@@ -1756,6 +2017,10 @@ ippFindAttribute(ipp_t *ipp, /* I - IPP message */
/*
* 'ippFindNextAttribute()' - Find the next named attribute in a request.
+ *
+ * Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+ * of attribute and member names separated by slashes, for example
+ * "media-col/media-size".
*/
ipp_attribute_t * /* O - Matching attribute */
@@ -1763,8 +2028,11 @@ ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */
const char *name, /* I - Name of attribute */
ipp_tag_t type) /* I - Type of attribute */
{
- ipp_attribute_t *attr; /* Current atttribute */
+ ipp_attribute_t *attr, /* Current atttribute */
+ *childattr; /* Child attribute */
ipp_tag_t value_tag; /* Value tag */
+ char parent[1024], /* Parent attribute name */
+ *child = NULL; /* Child attribute name */
DEBUG_printf(("2ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))",
@@ -1773,7 +2041,60 @@ ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */
if (!ipp || !name)
return (NULL);
- if (ipp->current)
+ DEBUG_printf(("3ippFindNextAttribute: atend=%d", ipp->atend));
+
+ if (ipp->atend)
+ return (NULL);
+
+ if (strchr(name, '/'))
+ {
+ /*
+ * Search for child attribute...
+ */
+
+ strlcpy(parent, name, sizeof(parent));
+ if ((child = strchr(parent, '/')) == NULL)
+ {
+ DEBUG_puts("3ippFindNextAttribute: Attribute name too long.");
+ return (NULL);
+ }
+
+ *child++ = '\0';
+
+ if (ipp->current && ipp->current->name && ipp->current->value_tag == IPP_TAG_BEGIN_COLLECTION && !strcmp(parent, ipp->current->name))
+ {
+ while (ipp->curindex < ipp->current->num_values)
+ {
+ if ((childattr = ippFindNextAttribute(ipp->current->values[ipp->curindex].collection, child, type)) != NULL)
+ return (childattr);
+
+ ipp->curindex ++;
+ if (ipp->curindex < ipp->current->num_values && ipp->current->values[ipp->curindex].collection)
+ ipp->current->values[ipp->curindex].collection->current = NULL;
+ }
+
+ ipp->prev = ipp->current;
+ ipp->current = ipp->current->next;
+ ipp->curindex = 0;
+
+ if (!ipp->current)
+ {
+ ipp->atend = 1;
+ return (NULL);
+ }
+ }
+
+ if (!ipp->current)
+ {
+ ipp->prev = NULL;
+ ipp->current = ipp->attrs;
+ ipp->curindex = 0;
+ }
+
+ name = parent;
+ attr = ipp->current;
+ }
+ else if (ipp->current)
{
ipp->prev = ipp->current;
attr = ipp->current->next;
@@ -1789,21 +2110,36 @@ ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */
DEBUG_printf(("4ippFindAttribute: attr=%p, name=\"%s\"", attr,
attr->name));
- value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
+ value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK);
if (attr->name != NULL && _cups_strcasecmp(attr->name, name) == 0 &&
- (value_tag == type || type == IPP_TAG_ZERO ||
+ (value_tag == type || type == IPP_TAG_ZERO || name == parent ||
(value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) ||
(value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME)))
{
ipp->current = attr;
- return (attr);
+ if (name == parent && attr->value_tag == IPP_TAG_BEGIN_COLLECTION)
+ {
+ int i; /* Looping var */
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if ((childattr = ippFindAttribute(attr->values[i].collection, child, type)) != NULL)
+ {
+ attr->values[0].collection->curindex = i;
+ return (childattr);
+ }
+ }
+ }
+ else
+ return (attr);
}
}
ipp->current = NULL;
ipp->prev = NULL;
+ ipp->atend = 1;
return (NULL);
}
@@ -1842,7 +2178,7 @@ ippFirstAttribute(ipp_t *ipp) /* I - IPP message */
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Boolean value or -1 on error */
+int /* O - Boolean value or 0 on error */
ippGetBoolean(ipp_attribute_t *attr, /* I - IPP attribute */
int element) /* I - Value number (0-based) */
{
@@ -1852,7 +2188,7 @@ ippGetBoolean(ipp_attribute_t *attr, /* I - IPP attribute */
if (!attr || attr->value_tag != IPP_TAG_BOOLEAN ||
element < 0 || element >= attr->num_values)
- return (-1);
+ return (0);
/*
* Return the value...
@@ -1898,7 +2234,7 @@ ippGetCollection(
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Number of values or -1 on error */
+int /* O - Number of values or 0 on error */
ippGetCount(ipp_attribute_t *attr) /* I - IPP attribute */
{
/*
@@ -1906,7 +2242,7 @@ ippGetCount(ipp_attribute_t *attr) /* I - IPP attribute */
*/
if (!attr)
- return (-1);
+ return (0);
/*
* Return the number of values...
@@ -1978,7 +2314,7 @@ ippGetGroupTag(ipp_attribute_t *attr) /* I - IPP attribute */
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Value or -1 on error */
+int /* O - Value or 0 on error */
ippGetInteger(ipp_attribute_t *attr, /* I - IPP attribute */
int element) /* I - Value number (0-based) */
{
@@ -1988,7 +2324,7 @@ ippGetInteger(ipp_attribute_t *attr, /* I - IPP attribute */
if (!attr || (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM) ||
element < 0 || element >= attr->num_values)
- return (-1);
+ return (0);
/*
* Return the value...
@@ -2023,12 +2359,51 @@ ippGetName(ipp_attribute_t *attr) /* I - IPP attribute */
/*
+ * 'ippGetOctetString()' - Get an octetString value from an IPP attribute.
+ *
+ * The @code element@ parameter specifies which value to get from 0 to
+ * @link ippGetCount(attr)@ - 1.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+void * /* O - Pointer to octetString data */
+ippGetOctetString(
+ ipp_attribute_t *attr, /* I - IPP attribute */
+ int element, /* I - Value number (0-based) */
+ int *datalen) /* O - Length of octetString data */
+{
+ /*
+ * Range check input...
+ */
+
+ if (!attr || attr->value_tag != IPP_TAG_STRING ||
+ element < 0 || element >= attr->num_values)
+ {
+ if (datalen)
+ *datalen = 0;
+
+ return (NULL);
+ }
+
+ /*
+ * Return the values...
+ */
+
+ if (datalen)
+ *datalen = attr->values[element].unknown.length;
+
+ return (attr->values[element].unknown.data);
+}
+
+
+/*
* 'ippGetOperation()' - Get the operation ID in an IPP message.
*
* @since CUPS 1.6/OS X 10.8@
*/
-ipp_op_t /* O - Operation ID or -1 on error */
+ipp_op_t /* O - Operation ID or 0 on error */
ippGetOperation(ipp_t *ipp) /* I - IPP request message */
{
/*
@@ -2036,7 +2411,7 @@ ippGetOperation(ipp_t *ipp) /* I - IPP request message */
*/
if (!ipp)
- return ((ipp_op_t)-1);
+ return ((ipp_op_t)0);
/*
* Return the value...
@@ -2055,7 +2430,7 @@ ippGetOperation(ipp_t *ipp) /* I - IPP request message */
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Lower value of range or -1 */
+int /* O - Lower value of range or 0 */
ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */
int element, /* I - Value number (0-based) */
int *uppervalue)/* O - Upper value of range */
@@ -2068,9 +2443,9 @@ ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */
element < 0 || element >= attr->num_values)
{
if (uppervalue)
- *uppervalue = -1;
+ *uppervalue = 0;
- return (-1);
+ return (0);
}
/*
@@ -2090,7 +2465,7 @@ ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Request ID or -1 on error */
+int /* O - Request ID or 0 on error */
ippGetRequestId(ipp_t *ipp) /* I - IPP message */
{
/*
@@ -2098,7 +2473,7 @@ ippGetRequestId(ipp_t *ipp) /* I - IPP message */
*/
if (!ipp)
- return (-1);
+ return (0);
/*
* Return the request ID...
@@ -2117,7 +2492,7 @@ ippGetRequestId(ipp_t *ipp) /* I - IPP message */
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Horizontal/cross feed resolution or -1 */
+int /* O - Horizontal/cross feed resolution or 0 */
ippGetResolution(
ipp_attribute_t *attr, /* I - IPP attribute */
int element, /* I - Value number (0-based) */
@@ -2130,7 +2505,15 @@ ippGetResolution(
if (!attr || attr->value_tag != IPP_TAG_RESOLUTION ||
element < 0 || element >= attr->num_values)
- return (-1);
+ {
+ if (yres)
+ *yres = 0;
+
+ if (units)
+ *units = (ipp_res_t)0;
+
+ return (0);
+ }
/*
* Return the value...
@@ -2160,7 +2543,7 @@ ippGetState(ipp_t *ipp) /* I - IPP message */
*/
if (!ipp)
- return (IPP_IDLE);
+ return (IPP_STATE_IDLE);
/*
* Return the value...
@@ -2184,7 +2567,7 @@ ippGetStatusCode(ipp_t *ipp) /* I - IPP response or event message */
*/
if (!ipp)
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
/*
* Return the value...
@@ -2248,7 +2631,7 @@ ippGetValueTag(ipp_attribute_t *attr) /* I - IPP attribute */
* Return the value...
*/
- return (attr->value_tag);
+ return (attr->value_tag & IPP_TAG_CUPS_MASK);
}
@@ -2258,7 +2641,7 @@ ippGetValueTag(ipp_attribute_t *attr) /* I - IPP attribute */
* @since CUPS 1.6/OS X 10.8@
*/
-int /* O - Major version number or -1 on error */
+int /* O - Major version number or 0 on error */
ippGetVersion(ipp_t *ipp, /* I - IPP message */
int *minor) /* O - Minor version number or @code NULL@ */
{
@@ -2269,9 +2652,9 @@ ippGetVersion(ipp_t *ipp, /* I - IPP message */
if (!ipp)
{
if (minor)
- *minor = -1;
+ *minor = 0;
- return (-1);
+ return (0);
}
/*
@@ -2343,8 +2726,8 @@ ippNew(void)
if (cg->server_version == 0)
_cupsSetDefaults();
- temp->request.any.version[0] = cg->server_version / 10;
- temp->request.any.version[1] = cg->server_version % 10;
+ temp->request.any.version[0] = (ipp_uchar_t)(cg->server_version / 10);
+ temp->request.any.version[1] = (ipp_uchar_t)(cg->server_version % 10);
temp->use = 1;
}
@@ -2419,6 +2802,114 @@ ippNewRequest(ipp_op_t op) /* I - Operation code */
/*
+ * 'ippNewResponse()' - Allocate a new IPP response message.
+ *
+ * The new response message is initialized with the same version-number,
+ * request-id, attributes-charset, and attributes-natural-language as the
+ * provided request message. If the attributes-charset or
+ * attributes-natural-language attributes are missing from the request,
+ * "utf-8" and a value derived from the current locale are substituted,
+ * respectively.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+ipp_t * /* O - IPP response message */
+ippNewResponse(ipp_t *request) /* I - IPP request message */
+{
+ ipp_t *response; /* IPP response message */
+ ipp_attribute_t *attr; /* Current attribute */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!request)
+ return (NULL);
+
+ /*
+ * Create a new IPP message...
+ */
+
+ if ((response = ippNew()) == NULL)
+ return (NULL);
+
+ /*
+ * Copy the request values over to the response...
+ */
+
+ response->request.status.version[0] = request->request.op.version[0];
+ response->request.status.version[1] = request->request.op.version[1];
+ response->request.status.request_id = request->request.op.request_id;
+
+ /*
+ * The first attribute MUST be attributes-charset...
+ */
+
+ attr = request->attrs;
+
+ if (attr && attr->name && !strcmp(attr->name, "attributes-charset") &&
+ attr->group_tag == IPP_TAG_OPERATION &&
+ attr->value_tag == IPP_TAG_CHARSET &&
+ attr->num_values == 1)
+ {
+ /*
+ * Copy charset from request...
+ */
+
+ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, attr->values[0].string.text);
+ }
+ else
+ {
+ /*
+ * Use "utf-8" as the default...
+ */
+
+ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, "utf-8");
+ }
+
+ /*
+ * Then attributes-natural-language...
+ */
+
+ if (attr)
+ attr = attr->next;
+
+ if (attr && attr->name &&
+ !strcmp(attr->name, "attributes-natural-language") &&
+ attr->group_tag == IPP_TAG_OPERATION &&
+ attr->value_tag == IPP_TAG_LANGUAGE &&
+ attr->num_values == 1)
+ {
+ /*
+ * Copy language from request...
+ */
+
+ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL,
+ attr->values[0].string.text);
+ }
+ else
+ {
+ /*
+ * Use the language from the current locale...
+ */
+
+ cups_lang_t *language = cupsLangDefault();
+ /* Current locale */
+
+ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL, language->language);
+ }
+
+ return (response);
+}
+
+
+/*
* 'ippRead()' - Read data for an IPP message from a HTTP connection.
*/
@@ -2430,7 +2921,7 @@ ippRead(http_t *http, /* I - HTTP connection */
http, ipp, CUPS_LLCAST (http ? http->data_remaining : -1)));
if (!http)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
DEBUG_printf(("2ippRead: http->state=%d, http->used=%d", http->state,
http->used));
@@ -2471,7 +2962,7 @@ ippReadIO(void *src, /* I - Data source */
{
int n; /* Length of data */
unsigned char *buffer, /* Data buffer */
- string[IPP_MAX_NAME],
+ string[IPP_MAX_TEXT],
/* Small string buffer */
*bufptr; /* Pointer into buffer */
ipp_attribute_t *attr; /* Current attribute */
@@ -2482,23 +2973,23 @@ ippReadIO(void *src, /* I - Data source */
DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)",
src, cb, blocking, parent, ipp));
- DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_ERROR));
+ DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_STATE_ERROR));
if (!src || !ipp)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
{
DEBUG_puts("1ippReadIO: Unable to get read buffer.");
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
switch (ipp->state)
{
- case IPP_IDLE :
+ case IPP_STATE_IDLE :
ipp->state ++; /* Avoid common problem... */
- case IPP_HEADER :
+ case IPP_STATE_HEADER :
if (parent == NULL)
{
/*
@@ -2509,7 +3000,7 @@ ippReadIO(void *src, /* I - Data source */
{
DEBUG_puts("1ippReadIO: Unable to read header.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
@@ -2529,7 +3020,7 @@ ippReadIO(void *src, /* I - Data source */
ipp->request.any.request_id));
}
- ipp->state = IPP_ATTRIBUTE;
+ ipp->state = IPP_STATE_ATTRIBUTE;
ipp->current = NULL;
ipp->curtag = IPP_TAG_ZERO;
ipp->prev = ipp->last;
@@ -2541,14 +3032,14 @@ ippReadIO(void *src, /* I - Data source */
if (!blocking)
break;
- case IPP_ATTRIBUTE :
+ case IPP_STATE_ATTRIBUTE :
for (;;)
{
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p",
@@ -2569,22 +3060,22 @@ ippReadIO(void *src, /* I - Data source */
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
tag = (ipp_tag_t)((((((buffer[0] << 8) | buffer[1]) << 8) |
buffer[2]) << 8) | buffer[3]);
- if (tag & IPP_TAG_COPY)
+ if (tag & IPP_TAG_CUPS_CONST)
{
/*
* Fail if the high bit is set in the tag...
*/
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
DEBUG_printf(("1ippReadIO: bad tag 0x%x.", tag));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
@@ -2596,7 +3087,7 @@ ippReadIO(void *src, /* I - Data source */
DEBUG_puts("2ippReadIO: IPP_TAG_END.");
- ipp->state = IPP_DATA;
+ ipp->state = IPP_STATE_DATA;
break;
}
else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
@@ -2628,17 +3119,17 @@ ippReadIO(void *src, /* I - Data source */
{
DEBUG_puts("1ippReadIO: unable to read name length.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
n = (buffer[0] << 8) | buffer[1];
if (n >= IPP_BUF_SIZE)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP name larger than 32767 bytes."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP name larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad name length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippReadIO: name length=%d", n));
@@ -2652,14 +3143,14 @@ ippReadIO(void *src, /* I - Data source */
if (ipp->current == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP attribute has no name."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute has no name."), 1);
DEBUG_puts("1ippReadIO: Attribute without name and no current.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
attr = ipp->current;
- value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
+ value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK);
/*
* Make sure we aren't adding a new value of a different
@@ -2688,14 +3179,14 @@ ippReadIO(void *src, /* I - Data source */
(tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) &&
tag != IPP_TAG_NOVALUE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if (value_tag != tag)
@@ -2715,14 +3206,14 @@ ippReadIO(void *src, /* I - Data source */
if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE)
@@ -2738,14 +3229,14 @@ ippReadIO(void *src, /* I - Data source */
}
else if (value_tag != tag)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
@@ -2755,7 +3246,7 @@ ippReadIO(void *src, /* I - Data source */
if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL)
{
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
else if (tag == IPP_TAG_MEMBERNAME)
@@ -2766,10 +3257,10 @@ ippReadIO(void *src, /* I - Data source */
if (n)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP member name is not empty."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1);
DEBUG_puts("1ippReadIO: member name not empty.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if (ipp->current)
@@ -2778,10 +3269,10 @@ ippReadIO(void *src, /* I - Data source */
attr = ipp->current = ipp_add_attr(ipp, NULL, ipp->curtag, IPP_TAG_ZERO, 1);
if (!attr)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p",
@@ -2795,11 +3286,11 @@ ippReadIO(void *src, /* I - Data source */
* New attribute; read the name and add it...
*/
- if ((*cb)(src, buffer, n) < n)
+ if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: unable to read name.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
buffer[n] = '\0';
@@ -2810,10 +3301,10 @@ ippReadIO(void *src, /* I - Data source */
if ((attr = ipp->current = ipp_add_attr(ipp, (char *)buffer, ipp->curtag, tag,
1)) == NULL)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, "
@@ -2831,7 +3322,7 @@ ippReadIO(void *src, /* I - Data source */
{
DEBUG_puts("1ippReadIO: unable to read value length.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
n = (buffer[0] << 8) | buffer[1];
@@ -2839,11 +3330,11 @@ ippReadIO(void *src, /* I - Data source */
if (n >= IPP_BUF_SIZE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP value larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
switch (tag)
@@ -2853,21 +3344,21 @@ ippReadIO(void *src, /* I - Data source */
if (n != 4)
{
if (tag == IPP_TAG_INTEGER)
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP integer value not 4 bytes."), 1);
else
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP enum value not 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad integer value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("1ippReadIO: Unable to read integer value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) |
@@ -2882,21 +3373,21 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_BOOLEAN :
if (n != 1)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP boolean value not 1 byte."),
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP boolean value not 1 byte."),
1);
DEBUG_printf(("1ippReadIO: bad boolean value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Unable to read boolean value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- value->boolean = buffer[0];
+ value->boolean = (char)buffer[0];
break;
case IPP_TAG_NOVALUE :
@@ -2927,11 +3418,11 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_MIMETYPE :
if (n > 0)
{
- if ((*cb)(src, buffer, n) < n)
+ if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: unable to read string value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
@@ -2943,35 +3434,35 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_DATE :
if (n != 11)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP date value not 11 bytes."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP date value not 11 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad date value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, value->date, 11) < 11)
{
DEBUG_puts("1ippReadIO: Unable to read date value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
break;
case IPP_TAG_RESOLUTION :
if (n != 9)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP resolution value not 9 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad resolution value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 9) < 9)
{
DEBUG_puts("1ippReadIO: Unable to read resolution value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
value->resolution.xres =
@@ -2987,19 +3478,19 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_RANGE :
if (n != 8)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP rangeOfInteger value not 8 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad rangeOfInteger value length "
"%d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("1ippReadIO: Unable to read range value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
value->range.lower =
@@ -3015,25 +3506,25 @@ ippReadIO(void *src, /* I - Data source */
if (n < 4)
{
if (tag == IPP_TAG_TEXTLANG)
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP textWithLanguage value less than "
"minimum 4 bytes."), 1);
else
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP nameWithLanguage value less than "
"minimum 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad stringWithLanguage value "
"length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- if ((*cb)(src, buffer, n) < n)
+ if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read string w/language "
"value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -3050,18 +3541,26 @@ ippReadIO(void *src, /* I - Data source */
n = (bufptr[0] << 8) | bufptr[1];
- if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) ||
- n >= sizeof(string))
+ if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) || n >= (int)sizeof(string))
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP language length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad language value length %d.",
n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
+ }
+ else if (n >= IPP_MAX_LANGUAGE)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
+ _("IPP language length too large."), 1);
+ DEBUG_printf(("1ippReadIO: bad language value length %d.",
+ n));
+ _cupsBufferRelease((char *)buffer);
+ return (IPP_STATE_ERROR);
}
- memcpy(string, bufptr + 2, n);
+ memcpy(string, bufptr + 2, (size_t)n);
string[n] = '\0';
value->string.language = _cupsStrAlloc((char *)string);
@@ -3071,11 +3570,11 @@ ippReadIO(void *src, /* I - Data source */
if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE))
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP string length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad string value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr[2 + n] = '\0';
@@ -3091,19 +3590,19 @@ ippReadIO(void *src, /* I - Data source */
if (n > 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP begCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: begCollection tag with value length "
"> 0.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_ERROR)
+ if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_STATE_ERROR)
{
DEBUG_puts("1ippReadIO: Unable to read collection value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
break;
@@ -3112,15 +3611,15 @@ ippReadIO(void *src, /* I - Data source */
if (n > 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP endCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: endCollection tag with value length "
"> 0.");
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_puts("1ippReadIO: endCollection tag...");
- return (ipp->state = IPP_DATA);
+ return (ipp->state = IPP_STATE_DATA);
case IPP_TAG_MEMBERNAME :
/*
@@ -3130,25 +3629,25 @@ ippReadIO(void *src, /* I - Data source */
if (!attr)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP memberName with no attribute."), 1);
DEBUG_puts("1ippReadIO: Member name without attribute.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
else if (n == 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP memberName value is empty."), 1);
DEBUG_puts("1ippReadIO: Empty member name value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- else if ((*cb)(src, buffer, n) < n)
+ else if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read member name value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
buffer[n] = '\0';
@@ -3166,22 +3665,33 @@ ippReadIO(void *src, /* I - Data source */
break;
default : /* Other unsupported values */
+ if (tag == IPP_TAG_STRING && n > IPP_MAX_LENGTH)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
+ _("IPP octetString length too large."), 1);
+ DEBUG_printf(("1ippReadIO: bad octetString value length %d.",
+ n));
+ _cupsBufferRelease((char *)buffer);
+ return (IPP_STATE_ERROR);
+ }
+
value->unknown.length = n;
+
if (n > 0)
{
- if ((value->unknown.data = malloc(n)) == NULL)
+ if ((value->unknown.data = malloc((size_t)n)) == NULL)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: Unable to allocate value");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- if ((*cb)(src, value->unknown.data, n) < n)
+ if ((*cb)(src, value->unknown.data, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read unsupported value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
else
@@ -3198,7 +3708,7 @@ ippReadIO(void *src, /* I - Data source */
}
break;
- case IPP_DATA :
+ case IPP_STATE_DATA :
break;
default :
@@ -3215,8 +3725,8 @@ ippReadIO(void *src, /* I - Data source */
/*
* 'ippSetBoolean()' - Set a boolean value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3227,7 +3737,7 @@ ippReadIO(void *src, /* I - Data source */
*/
int /* O - 1 on success, 0 on failure */
-ippSetBoolean(ipp_t *ipp, /* IO - IPP message */
+ippSetBoolean(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
int boolvalue)/* I - Boolean value */
@@ -3248,7 +3758,7 @@ ippSetBoolean(ipp_t *ipp, /* IO - IPP message */
*/
if ((value = ipp_set_value(ipp, attr, element)) != NULL)
- value->boolean = boolvalue;
+ value->boolean = (char)boolvalue;
return (value != NULL);
}
@@ -3257,8 +3767,8 @@ ippSetBoolean(ipp_t *ipp, /* IO - IPP message */
/*
* 'ippSetCollection()' - Set a collection value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3270,7 +3780,7 @@ ippSetBoolean(ipp_t *ipp, /* IO - IPP message */
int /* O - 1 on success, 0 on failure */
ippSetCollection(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
ipp_t *colvalue) /* I - Collection value */
@@ -3306,8 +3816,8 @@ ippSetCollection(
/*
* 'ippSetDate()' - Set a date value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3318,7 +3828,7 @@ ippSetCollection(
*/
int /* O - 1 on success, 0 on failure */
-ippSetDate(ipp_t *ipp, /* IO - IPP message */
+ippSetDate(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
const ipp_uchar_t *datevalue)/* I - Date value */
@@ -3348,8 +3858,8 @@ ippSetDate(ipp_t *ipp, /* IO - IPP message */
/*
* 'ippSetGroupTag()' - Set the group tag of an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3364,7 +3874,7 @@ ippSetDate(ipp_t *ipp, /* IO - IPP message */
int /* O - 1 on success, 0 on failure */
ippSetGroupTag(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - Attribute */
ipp_tag_t group_tag) /* I - Group tag */
{
@@ -3372,7 +3882,8 @@ ippSetGroupTag(
* Range check input - group tag must be 0x01 to 0x0F, per RFC 2911...
*/
- if (!ipp || !attr || group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END ||
+ if (!ipp || !attr || !*attr ||
+ group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END ||
group_tag >= IPP_TAG_UNSUPPORTED_VALUE)
return (0);
@@ -3389,8 +3900,8 @@ ippSetGroupTag(
/*
* 'ippSetInteger()' - Set an integer or enum value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3401,7 +3912,7 @@ ippSetGroupTag(
*/
int /* O - 1 on success, 0 on failure */
-ippSetInteger(ipp_t *ipp, /* IO - IPP message */
+ippSetInteger(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
int intvalue) /* I - Integer/enum value */
@@ -3432,8 +3943,8 @@ ippSetInteger(ipp_t *ipp, /* IO - IPP message */
/*
* 'ippSetName()' - Set the name of an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3441,7 +3952,7 @@ ippSetInteger(ipp_t *ipp, /* IO - IPP message */
*/
int /* O - 1 on success, 0 on failure */
-ippSetName(ipp_t *ipp, /* IO - IPP message */
+ippSetName(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
const char *name) /* I - Attribute name */
{
@@ -3472,10 +3983,98 @@ ippSetName(ipp_t *ipp, /* IO - IPP message */
/*
+ * 'ippSetOctetString()' - Set an octetString value in an IPP attribute.
+ *
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
+ *
+ * The @code attr@ parameter may be modified as a result of setting the value.
+ *
+ * The @code element@ parameter specifies which value to set from 0 to
+ * @link ippGetCount(attr)@.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on success, 0 on failure */
+ippSetOctetString(
+ ipp_t *ipp, /* I - IPP message */
+ ipp_attribute_t **attr, /* IO - IPP attribute */
+ int element, /* I - Value number (0-based) */
+ const void *data, /* I - Pointer to octetString data */
+ int datalen) /* I - Length of octetString data */
+{
+ _ipp_value_t *value; /* Current value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_STRING ||
+ element < 0 || element > (*attr)->num_values ||
+ datalen < 0 || datalen > IPP_MAX_LENGTH)
+ return (0);
+
+ /*
+ * Set the value and return...
+ */
+
+ if ((value = ipp_set_value(ipp, attr, element)) != NULL)
+ {
+ if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST)
+ {
+ /*
+ * Just copy the pointer...
+ */
+
+ value->unknown.data = (void *)data;
+ value->unknown.length = datalen;
+ }
+ else
+ {
+ /*
+ * Copy the data...
+ */
+
+ if (value->unknown.data)
+ {
+ /*
+ * Free previous data...
+ */
+
+ free(value->unknown.data);
+
+ value->unknown.data = NULL;
+ value->unknown.length = 0;
+ }
+
+ if (datalen > 0)
+ {
+ void *temp; /* Temporary data pointer */
+
+ if ((temp = malloc((size_t)datalen)) != NULL)
+ {
+ memcpy(temp, data, (size_t)datalen);
+
+ value->unknown.data = temp;
+ value->unknown.length = datalen;
+ }
+ else
+ return (0);
+ }
+ }
+ }
+
+ return (value != NULL);
+}
+
+
+/*
* 'ippSetOperation()' - Set the operation ID in an IPP request message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* @since CUPS 1.6/OS X 10.8@
*/
@@ -3504,8 +4103,8 @@ ippSetOperation(ipp_t *ipp, /* I - IPP request message */
/*
* 'ippSetRange()' - Set a rangeOfInteger value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3516,7 +4115,7 @@ ippSetOperation(ipp_t *ipp, /* I - IPP request message */
*/
int /* O - 1 on success, 0 on failure */
-ippSetRange(ipp_t *ipp, /* IO - IPP message */
+ippSetRange(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
int lowervalue, /* I - Lower bound for range */
@@ -3550,8 +4149,8 @@ ippSetRange(ipp_t *ipp, /* IO - IPP message */
/*
* 'ippSetRequestId()' - Set the request ID in an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code request_id@ parameter must be greater than 0.
*
@@ -3584,8 +4183,8 @@ ippSetRequestId(ipp_t *ipp, /* I - IPP message */
/*
* 'ippSetResolution()' - Set a resolution value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3597,7 +4196,7 @@ ippSetRequestId(ipp_t *ipp, /* I - IPP message */
int /* O - 1 on success, 0 on failure */
ippSetResolution(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
ipp_res_t unitsvalue, /* I - Resolution units */
@@ -3662,8 +4261,8 @@ ippSetState(ipp_t *ipp, /* I - IPP message */
/*
* 'ippSetStatusCode()' - Set the status code in an IPP response or event message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* @since CUPS 1.6/OS X 10.8@
*/
@@ -3692,8 +4291,8 @@ ippSetStatusCode(ipp_t *ipp, /* I - IPP response or event message */
/*
* 'ippSetString()' - Set a string value in an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3704,7 +4303,7 @@ ippSetStatusCode(ipp_t *ipp, /* I - IPP response or event message */
*/
int /* O - 1 on success, 0 on failure */
-ippSetString(ipp_t *ipp, /* IO - IPP message */
+ippSetString(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
const char *strvalue) /* I - String value */
@@ -3734,7 +4333,7 @@ ippSetString(ipp_t *ipp, /* IO - IPP message */
if (element > 0)
value->string.language = (*attr)->values[0].string.language;
- if ((int)((*attr)->value_tag) & IPP_TAG_COPY)
+ if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST)
value->string.text = (char *)strvalue;
else if ((temp = _cupsStrAlloc(strvalue)) != NULL)
{
@@ -3752,10 +4351,196 @@ ippSetString(ipp_t *ipp, /* IO - IPP message */
/*
+ * 'ippSetStringf()' - Set a formatted string value of an attribute.
+ *
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
+ *
+ * The @code attr@ parameter may be modified as a result of setting the value.
+ *
+ * The @code element@ parameter specifies which value to set from 0 to
+ * @link ippGetCount(attr)@.
+ *
+ * The @code format@ parameter uses formatting characters compatible with the
+ * printf family of standard functions. Additional arguments follow it as
+ * needed. The formatted string is truncated as needed to the maximum length of
+ * the corresponding value type.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on success, 0 on failure */
+ippSetStringf(ipp_t *ipp, /* I - IPP message */
+ ipp_attribute_t **attr, /* IO - IPP attribute */
+ int element, /* I - Value number (0-based) */
+ const char *format, /* I - Printf-style format string */
+ ...) /* I - Additional arguments as needed */
+{
+ int ret; /* Return value */
+ va_list ap; /* Pointer to additional arguments */
+
+
+ va_start(ap, format);
+ ret = ippSetStringfv(ipp, attr, element, format, ap);
+ va_end(ap);
+
+ return (ret);
+}
+
+
+/*
+ * 'ippSetStringf()' - Set a formatted string value of an attribute.
+ *
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
+ *
+ * The @code attr@ parameter may be modified as a result of setting the value.
+ *
+ * The @code element@ parameter specifies which value to set from 0 to
+ * @link ippGetCount(attr)@.
+ *
+ * The @code format@ parameter uses formatting characters compatible with the
+ * printf family of standard functions. Additional arguments follow it as
+ * needed. The formatted string is truncated as needed to the maximum length of
+ * the corresponding value type.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 on success, 0 on failure */
+ippSetStringfv(ipp_t *ipp, /* I - IPP message */
+ ipp_attribute_t **attr, /* IO - IPP attribute */
+ int element, /* I - Value number (0-based) */
+ const char *format, /* I - Printf-style format string */
+ va_list ap) /* I - Pointer to additional arguments */
+{
+ ipp_tag_t value_tag; /* Value tag */
+ char buffer[IPP_MAX_TEXT + 4];
+ /* Formatted text string */
+ ssize_t bytes, /* Length of formatted value */
+ max_bytes; /* Maximum number of bytes for value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (attr && *attr)
+ value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK;
+ else
+ value_tag = IPP_TAG_ZERO;
+
+ if (!ipp || !attr || !*attr ||
+ (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
+ value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
+ !format)
+ return (0);
+
+ /*
+ * Format the string...
+ */
+
+ if (!strcmp(format, "%s"))
+ {
+ /*
+ * Optimize the simple case...
+ */
+
+ const char *s = va_arg(ap, char *);
+
+ if (!s)
+ s = "(null)";
+
+ bytes = (ssize_t)strlen(s);
+ strlcpy(buffer, s, sizeof(buffer));
+ }
+ else
+ {
+ /*
+ * Do a full formatting of the message...
+ */
+
+ if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0)
+ return (0);
+ }
+
+ /*
+ * Limit the length of the string...
+ */
+
+ switch (value_tag)
+ {
+ default :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ max_bytes = IPP_MAX_TEXT;
+ break;
+
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ max_bytes = IPP_MAX_NAME;
+ break;
+
+ case IPP_TAG_CHARSET :
+ max_bytes = IPP_MAX_CHARSET;
+ break;
+
+ case IPP_TAG_KEYWORD :
+ max_bytes = IPP_MAX_KEYWORD;
+ break;
+
+ case IPP_TAG_LANGUAGE :
+ max_bytes = IPP_MAX_LANGUAGE;
+ break;
+
+ case IPP_TAG_MIMETYPE :
+ max_bytes = IPP_MAX_MIMETYPE;
+ break;
+
+ case IPP_TAG_URI :
+ max_bytes = IPP_MAX_URI;
+ break;
+
+ case IPP_TAG_URISCHEME :
+ max_bytes = IPP_MAX_URISCHEME;
+ break;
+ }
+
+ if (bytes >= max_bytes)
+ {
+ char *bufmax, /* Buffer at max_bytes */
+ *bufptr; /* Pointer into buffer */
+
+ bufptr = buffer + strlen(buffer) - 1;
+ bufmax = buffer + max_bytes - 1;
+
+ while (bufptr > bufmax)
+ {
+ if (*bufptr & 0x80)
+ {
+ while ((*bufptr & 0xc0) == 0x80 && bufptr > buffer)
+ bufptr --;
+ }
+
+ bufptr --;
+ }
+
+ *bufptr = '\0';
+ }
+
+ /*
+ * Set the formatted string and return...
+ */
+
+ return (ippSetString(ipp, attr, element, buffer));
+}
+
+
+/*
* 'ippSetValueTag()' - Set the value tag of an attribute.
*
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
@@ -3776,7 +4561,7 @@ ippSetString(ipp_t *ipp, /* IO - IPP message */
int /* O - 1 on success, 0 on failure */
ippSetValueTag(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
ipp_tag_t value_tag) /* I - Value tag */
{
@@ -3792,7 +4577,7 @@ ippSetValueTag(
* Range check input...
*/
- if (!ipp || !attr)
+ if (!ipp || !attr || !*attr)
return (0);
/*
@@ -3806,7 +4591,7 @@ ippSetValueTag(
* Otherwise implement changes as needed...
*/
- temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_MASK);
+ temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_CUPS_MASK);
switch (value_tag)
{
@@ -3852,7 +4637,7 @@ ippSetValueTag(
temp_tag != IPP_TAG_MIMETYPE)
return (0);
- (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_COPY));
+ (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_CUPS_CONST));
break;
case IPP_TAG_NAMELANG :
@@ -3893,7 +4678,7 @@ ippSetValueTag(
i --, value ++)
value->string.language = (*attr)->values[0].string.language;
- if ((int)(*attr)->value_tag & IPP_TAG_COPY)
+ if ((int)(*attr)->value_tag & IPP_TAG_CUPS_CONST)
{
/*
* Make copies of all values...
@@ -3923,8 +4708,8 @@ ippSetValueTag(
/*
* 'ippSetVersion()' - Set the version number in an IPP message.
*
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
* The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.
*
@@ -3947,8 +4732,8 @@ ippSetVersion(ipp_t *ipp, /* I - IPP message */
* Set the version number...
*/
- ipp->request.any.version[0] = major;
- ipp->request.any.version[1] = minor;
+ ipp->request.any.version[0] = (ipp_uchar_t)major;
+ ipp->request.any.version[1] = (ipp_uchar_t)minor;
return (1);
}
@@ -3986,13 +4771,13 @@ ippTimeToDate(time_t t) /* I - UNIX time value */
unixdate = gmtime(&t);
unixdate->tm_year += 1900;
- date[0] = unixdate->tm_year >> 8;
- date[1] = unixdate->tm_year;
- date[2] = unixdate->tm_mon + 1;
- date[3] = unixdate->tm_mday;
- date[4] = unixdate->tm_hour;
- date[5] = unixdate->tm_min;
- date[6] = unixdate->tm_sec;
+ date[0] = (ipp_uchar_t)(unixdate->tm_year >> 8);
+ date[1] = (ipp_uchar_t)(unixdate->tm_year);
+ date[2] = (ipp_uchar_t)(unixdate->tm_mon + 1);
+ date[3] = (ipp_uchar_t)unixdate->tm_mday;
+ date[4] = (ipp_uchar_t)unixdate->tm_hour;
+ date[5] = (ipp_uchar_t)unixdate->tm_min;
+ date[6] = (ipp_uchar_t)unixdate->tm_sec;
date[7] = 0;
date[8] = '+';
date[9] = 0;
@@ -4003,6 +4788,672 @@ ippTimeToDate(time_t t) /* I - UNIX time value */
/*
+ * 'ippValidateAttribute()' - Validate the contents of an attribute.
+ *
+ * This function validates the contents of an attribute based on the name and
+ * value tag. 1 is returned if the attribute is valid, 0 otherwise. On
+ * failure, cupsLastErrorString() is set to a human-readable message.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 if valid, 0 otherwise */
+ippValidateAttribute(
+ ipp_attribute_t *attr) /* I - Attribute */
+{
+ int i; /* Looping var */
+ char scheme[64], /* Scheme from URI */
+ userpass[256], /* Username/password from URI */
+ hostname[256], /* Hostname from URI */
+ resource[1024]; /* Resource from URI */
+ int port, /* Port number from URI */
+ uri_status; /* URI separation status */
+ const char *ptr; /* Pointer into string */
+ ipp_attribute_t *colattr; /* Collection attribute */
+ regex_t re; /* Regular expression */
+ ipp_uchar_t *date; /* Current date value */
+ static const char * const uri_status_strings[] =
+ { /* URI status strings */
+ "URI too large",
+ "Bad arguments to function",
+ "Bad resource in URI",
+ "Bad port number in URI",
+ "Bad hostname/address in URI",
+ "Bad username in URI",
+ "Bad scheme in URI",
+ "Bad/empty URI",
+ "OK",
+ "Missing scheme in URI",
+ "Unknown scheme in URI",
+ "Missing resource in URI"
+ };
+
+
+ /*
+ * Skip separators.
+ */
+
+ if (!attr->name)
+ return (1);
+
+ /*
+ * Validate the attribute name.
+ */
+
+ for (ptr = attr->name; *ptr; ptr ++)
+ if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' && *ptr != '_')
+ break;
+
+ if (*ptr || ptr == attr->name)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad attribute name - invalid character "
+ "(RFC 2911 section 4.1.3)."), attr->name);
+ return (0);
+ }
+
+ if ((ptr - attr->name) > 255)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad attribute name - bad length %d "
+ "(RFC 2911 section 4.1.3)."), attr->name,
+ (int)(ptr - attr->name));
+ return (0);
+ }
+
+ switch (attr->value_tag)
+ {
+ case IPP_TAG_INTEGER :
+ break;
+
+ case IPP_TAG_BOOLEAN :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].boolean != 0 &&
+ attr->values[i].boolean != 1)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad boolen value %d "
+ "(RFC 2911 section 4.1.11)."), attr->name,
+ attr->values[i].boolean);
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_ENUM :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].integer < 1)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad enum value %d - out of range "
+ "(RFC 2911 section 4.1.4)."), attr->name,
+ attr->values[i].integer);
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_STRING :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].unknown.length > IPP_MAX_OCTETSTRING)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad octetString value - bad length %d "
+ "(RFC 2911 section 4.1.10)."), attr->name,
+ attr->values[i].unknown.length);
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_DATE :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ date = attr->values[i].date;
+
+ if (date[2] < 1 || date[2] > 12)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime month %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[2]);
+ return (0);
+ }
+
+ if (date[3] < 1 || date[3] > 31)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime day %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[3]);
+ return (0);
+ }
+
+ if (date[4] > 23)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime hours %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[4]);
+ return (0);
+ }
+
+ if (date[5] > 59)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime minutes %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[5]);
+ return (0);
+ }
+
+ if (date[6] > 60)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime seconds %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[6]);
+ return (0);
+ }
+
+ if (date[7] > 9)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime deciseconds %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[7]);
+ return (0);
+ }
+
+ if (date[8] != '-' && date[8] != '+')
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime UTC sign '%c' "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[8]);
+ return (0);
+ }
+
+ if (date[9] > 11)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime UTC hours %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[9]);
+ return (0);
+ }
+
+ if (date[10] > 59)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad dateTime UTC minutes %u "
+ "(RFC 2911 section 4.1.14)."), attr->name, date[10]);
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_RESOLUTION :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].resolution.xres <= 0)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad resolution value %dx%d%s - cross "
+ "feed resolution must be positive "
+ "(RFC 2911 section 4.1.15)."), attr->name,
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.yres,
+ attr->values[i].resolution.units ==
+ IPP_RES_PER_INCH ? "dpi" :
+ attr->values[i].resolution.units ==
+ IPP_RES_PER_CM ? "dpcm" : "unknown");
+ return (0);
+ }
+
+ if (attr->values[i].resolution.yres <= 0)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad resolution value %dx%d%s - feed "
+ "resolution must be positive "
+ "(RFC 2911 section 4.1.15)."), attr->name,
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.yres,
+ attr->values[i].resolution.units ==
+ IPP_RES_PER_INCH ? "dpi" :
+ attr->values[i].resolution.units ==
+ IPP_RES_PER_CM ? "dpcm" : "unknown");
+ return (0);
+ }
+
+ if (attr->values[i].resolution.units != IPP_RES_PER_INCH &&
+ attr->values[i].resolution.units != IPP_RES_PER_CM)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad resolution value %dx%d%s - bad "
+ "units value (RFC 2911 section 4.1.15)."),
+ attr->name, attr->values[i].resolution.xres,
+ attr->values[i].resolution.yres,
+ attr->values[i].resolution.units ==
+ IPP_RES_PER_INCH ? "dpi" :
+ attr->values[i].resolution.units ==
+ IPP_RES_PER_CM ? "dpcm" : "unknown");
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_RANGE :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].range.lower > attr->values[i].range.upper)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad rangeOfInteger value %d-%d - lower "
+ "greater than upper (RFC 2911 section 4.1.13)."),
+ attr->name, attr->values[i].range.lower,
+ attr->values[i].range.upper);
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_BEGIN_COLLECTION :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ for (colattr = attr->values[i].collection->attrs;
+ colattr;
+ colattr = colattr->next)
+ {
+ if (!ippValidateAttribute(colattr))
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+ {
+ if ((*ptr & 0xe0) == 0xc0)
+ {
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ }
+ else if ((*ptr & 0xf0) == 0xe0)
+ {
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ }
+ else if ((*ptr & 0xf8) == 0xf0)
+ {
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ }
+ else if (*ptr & 0x80)
+ break;
+ }
+
+ if (*ptr)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad text value \"%s\" - bad UTF-8 "
+ "sequence (RFC 2911 section 4.1.1)."), attr->name,
+ attr->values[i].string.text);
+ return (0);
+ }
+
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_TEXT - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad text value \"%s\" - bad length %d "
+ "(RFC 2911 section 4.1.1)."), attr->name,
+ attr->values[i].string.text,
+ (int)(ptr - attr->values[i].string.text));
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+ {
+ if ((*ptr & 0xe0) == 0xc0)
+ {
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ }
+ else if ((*ptr & 0xf0) == 0xe0)
+ {
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ }
+ else if ((*ptr & 0xf8) == 0xf0)
+ {
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ ptr ++;
+ if ((*ptr & 0xc0) != 0x80)
+ break;
+ }
+ else if (*ptr & 0x80)
+ break;
+ }
+
+ if (*ptr)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad name value \"%s\" - bad UTF-8 "
+ "sequence (RFC 2911 section 4.1.2)."), attr->name,
+ attr->values[i].string.text);
+ return (0);
+ }
+
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_NAME - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad name value \"%s\" - bad length %d "
+ "(RFC 2911 section 4.1.2)."), attr->name,
+ attr->values[i].string.text,
+ (int)(ptr - attr->values[i].string.text));
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_KEYWORD :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+ if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' &&
+ *ptr != '_')
+ break;
+
+ if (*ptr || ptr == attr->values[i].string.text)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad keyword value \"%s\" - invalid "
+ "character (RFC 2911 section 4.1.3)."),
+ attr->name, attr->values[i].string.text);
+ return (0);
+ }
+
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_KEYWORD - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad keyword value \"%s\" - bad "
+ "length %d (RFC 2911 section 4.1.3)."),
+ attr->name, attr->values[i].string.text,
+ (int)(ptr - attr->values[i].string.text));
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_URI :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL,
+ attr->values[i].string.text,
+ scheme, sizeof(scheme),
+ userpass, sizeof(userpass),
+ hostname, sizeof(hostname),
+ &port, resource, sizeof(resource));
+
+ if (uri_status < HTTP_URI_STATUS_OK)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad URI value \"%s\" - %s "
+ "(RFC 2911 section 4.1.5)."), attr->name,
+ attr->values[i].string.text,
+ uri_status_strings[uri_status -
+ HTTP_URI_STATUS_OVERFLOW]);
+ return (0);
+ }
+
+ if (strlen(attr->values[i].string.text) > (IPP_MAX_URI - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad URI value \"%s\" - bad length %d "
+ "(RFC 2911 section 4.1.5)."), attr->name,
+ attr->values[i].string.text,
+ (int)strlen(attr->values[i].string.text));
+ }
+ }
+ break;
+
+ case IPP_TAG_URISCHEME :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ ptr = attr->values[i].string.text;
+ if (islower(*ptr & 255))
+ {
+ for (ptr ++; *ptr; ptr ++)
+ if (!islower(*ptr & 255) && !isdigit(*ptr & 255) &&
+ *ptr != '+' && *ptr != '-' && *ptr != '.')
+ break;
+ }
+
+ if (*ptr || ptr == attr->values[i].string.text)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad uriScheme value \"%s\" - bad "
+ "characters (RFC 2911 section 4.1.6)."),
+ attr->name, attr->values[i].string.text);
+ return (0);
+ }
+
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_URISCHEME - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad uriScheme value \"%s\" - bad "
+ "length %d (RFC 2911 section 4.1.6)."),
+ attr->name, attr->values[i].string.text,
+ (int)(ptr - attr->values[i].string.text));
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_CHARSET :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+ if (!isprint(*ptr & 255) || isupper(*ptr & 255) ||
+ isspace(*ptr & 255))
+ break;
+
+ if (*ptr || ptr == attr->values[i].string.text)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad charset value \"%s\" - bad "
+ "characters (RFC 2911 section 4.1.7)."),
+ attr->name, attr->values[i].string.text);
+ return (0);
+ }
+
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_CHARSET - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad charset value \"%s\" - bad "
+ "length %d (RFC 2911 section 4.1.7)."),
+ attr->name, attr->values[i].string.text,
+ (int)(ptr - attr->values[i].string.text));
+ return (0);
+ }
+ }
+ break;
+
+ case IPP_TAG_LANGUAGE :
+ /*
+ * The following regular expression is derived from the ABNF for
+ * language tags in RFC 4646. All I can say is that this is the
+ * easiest way to check the values...
+ */
+
+ if ((i = regcomp(&re,
+ "^("
+ "(([a-z]{2,3}(-[a-z][a-z][a-z]){0,3})|[a-z]{4,8})"
+ /* language */
+ "(-[a-z][a-z][a-z][a-z]){0,1}" /* script */
+ "(-([a-z][a-z]|[0-9][0-9][0-9])){0,1}" /* region */
+ "(-([a-z]{5,8}|[0-9][0-9][0-9]))*" /* variant */
+ "(-[a-wy-z](-[a-z0-9]{2,8})+)*" /* extension */
+ "(-x(-[a-z0-9]{1,8})+)*" /* privateuse */
+ "|"
+ "x(-[a-z0-9]{1,8})+" /* privateuse */
+ "|"
+ "[a-z]{1,3}(-[a-z][0-9]{2,8}){1,2}" /* grandfathered */
+ ")$",
+ REG_NOSUB | REG_EXTENDED)) != 0)
+ {
+ char temp[256]; /* Temporary error string */
+
+ regerror(i, &re, temp, sizeof(temp));
+ ipp_set_error(IPP_STATUS_ERROR_INTERNAL,
+ _("Unable to compile naturalLanguage regular "
+ "expression: %s."), temp);
+ return (0);
+ }
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad naturalLanguage value \"%s\" - bad "
+ "characters (RFC 2911 section 4.1.8)."),
+ attr->name, attr->values[i].string.text);
+ regfree(&re);
+ return (0);
+ }
+
+ if (strlen(attr->values[i].string.text) > (IPP_MAX_LANGUAGE - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad naturalLanguage value \"%s\" - bad "
+ "length %d (RFC 2911 section 4.1.8)."),
+ attr->name, attr->values[i].string.text,
+ (int)strlen(attr->values[i].string.text));
+ regfree(&re);
+ return (0);
+ }
+ }
+
+ regfree(&re);
+ break;
+
+ case IPP_TAG_MIMETYPE :
+ /*
+ * The following regular expression is derived from the ABNF for
+ * MIME media types in RFC 2045 and 4288. All I can say is that this is
+ * the easiest way to check the values...
+ */
+
+ if ((i = regcomp(&re,
+ "^"
+ "[-a-zA-Z0-9!#$&.+^_]{1,127}" /* type-name */
+ "/"
+ "[-a-zA-Z0-9!#$&.+^_]{1,127}" /* subtype-name */
+ "(;[-a-zA-Z0-9!#$&.+^_]{1,127}=" /* parameter= */
+ "([-a-zA-Z0-9!#$&.+^_]{1,127}|\"[^\"]*\"))*"
+ /* value */
+ "$",
+ REG_NOSUB | REG_EXTENDED)) != 0)
+ {
+ char temp[256]; /* Temporary error string */
+
+ regerror(i, &re, temp, sizeof(temp));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("Unable to compile mimeMediaType regular "
+ "expression: %s."), temp);
+ return (0);
+ }
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad mimeMediaType value \"%s\" - bad "
+ "characters (RFC 2911 section 4.1.9)."),
+ attr->name, attr->values[i].string.text);
+ regfree(&re);
+ return (0);
+ }
+
+ if (strlen(attr->values[i].string.text) > (IPP_MAX_MIMETYPE - 1))
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+ _("\"%s\": Bad mimeMediaType value \"%s\" - bad "
+ "length %d (RFC 2911 section 4.1.9)."),
+ attr->name, attr->values[i].string.text,
+ (int)strlen(attr->values[i].string.text));
+ regfree(&re);
+ return (0);
+ }
+ }
+
+ regfree(&re);
+ break;
+
+ default :
+ break;
+ }
+
+ return (1);
+}
+
+
+/*
+ * 'ippValidateAttributes()' - Validate all attributes in an IPP message.
+ *
+ * This function validates the contents of the IPP message, including each
+ * attribute. Like @link ippValidateAttribute@, cupsLastErrorString() is set
+ * to a human-readable message on failure.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+int /* O - 1 if valid, 0 otherwise */
+ippValidateAttributes(ipp_t *ipp) /* I - IPP message */
+{
+ ipp_attribute_t *attr; /* Current attribute */
+
+
+ if (!ipp)
+ return (1);
+
+ for (attr = ipp->attrs; attr; attr = attr->next)
+ if (!ippValidateAttribute(attr))
+ return (0);
+
+ return (1);
+}
+
+
+/*
* 'ippWrite()' - Write data for an IPP message to a HTTP connection.
*/
@@ -4013,7 +5464,7 @@ ippWrite(http_t *http, /* I - HTTP connection */
DEBUG_printf(("ippWrite(http=%p, ipp=%p)", http, ipp));
if (!http)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
return (ippWriteIO(http, (ipp_iocb_t)httpWrite2, http->blocking, NULL, ipp));
}
@@ -4031,7 +5482,7 @@ ippWriteFile(int fd, /* I - HTTP data */
{
DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)", fd, ipp));
- ipp->state = IPP_IDLE;
+ ipp->state = IPP_STATE_IDLE;
return (ippWriteIO(&fd, (ipp_iocb_t)ipp_write_file, 1, NULL, ipp));
}
@@ -4062,20 +5513,20 @@ ippWriteIO(void *dst, /* I - Destination */
dst, cb, blocking, parent, ipp));
if (!dst || !ipp)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
{
DEBUG_puts("1ippWriteIO: Unable to get write buffer");
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
switch (ipp->state)
{
- case IPP_IDLE :
+ case IPP_STATE_IDLE :
ipp->state ++; /* Avoid common problem... */
- case IPP_HEADER :
+ case IPP_STATE_HEADER :
if (parent == NULL)
{
/*
@@ -4091,12 +5542,12 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = ipp->request.any.version[0];
*bufptr++ = ipp->request.any.version[1];
- *bufptr++ = ipp->request.any.op_status >> 8;
- *bufptr++ = ipp->request.any.op_status;
- *bufptr++ = ipp->request.any.request_id >> 24;
- *bufptr++ = ipp->request.any.request_id >> 16;
- *bufptr++ = ipp->request.any.request_id >> 8;
- *bufptr++ = ipp->request.any.request_id;
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.op_status >> 8);
+ *bufptr++ = (ipp_uchar_t)ipp->request.any.op_status;
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 24);
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 16);
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 8);
+ *bufptr++ = (ipp_uchar_t)ipp->request.any.request_id;
DEBUG_printf(("2ippWriteIO: version=%d.%d", buffer[0], buffer[1]));
DEBUG_printf(("2ippWriteIO: op_status=%04x",
@@ -4104,11 +5555,11 @@ ippWriteIO(void *dst, /* I - Destination */
DEBUG_printf(("2ippWriteIO: request_id=%d",
ipp->request.any.request_id));
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP header...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
@@ -4117,7 +5568,7 @@ ippWriteIO(void *dst, /* I - Destination */
* in the request/response, with no current group.
*/
- ipp->state = IPP_ATTRIBUTE;
+ ipp->state = IPP_STATE_ATTRIBUTE;
ipp->current = ipp->attrs;
ipp->curtag = IPP_TAG_ZERO;
@@ -4130,7 +5581,7 @@ ippWriteIO(void *dst, /* I - Destination */
if (!blocking)
break;
- case IPP_ATTRIBUTE :
+ case IPP_STATE_ATTRIBUTE :
while (ipp->current != NULL)
{
/*
@@ -4157,7 +5608,7 @@ ippWriteIO(void *dst, /* I - Destination */
DEBUG_printf(("2ippWriteIO: wrote group tag=%x(%s)",
attr->group_tag, ippTagString(attr->group_tag)));
- *bufptr++ = attr->group_tag;
+ *bufptr++ = (ipp_uchar_t)attr->group_tag;
}
else if (attr->group_tag == IPP_TAG_ZERO)
continue;
@@ -4187,7 +5638,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
@@ -4202,17 +5653,17 @@ ippWriteIO(void *dst, /* I - Destination */
if (attr->value_tag > 0xff)
{
*bufptr++ = IPP_TAG_EXTENSION;
- *bufptr++ = attr->value_tag >> 24;
- *bufptr++ = attr->value_tag >> 16;
- *bufptr++ = attr->value_tag >> 8;
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 24);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 16);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 8);
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
}
else
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
- memcpy(bufptr, attr->name, n);
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
+ memcpy(bufptr, attr->name, (size_t)n);
bufptr += n;
}
else
@@ -4226,7 +5677,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
@@ -4245,21 +5696,21 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = IPP_TAG_MEMBERNAME;
*bufptr++ = 0;
*bufptr++ = 0;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
- memcpy(bufptr, attr->name, n);
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
+ memcpy(bufptr, attr->name, (size_t)n);
bufptr += n;
if (attr->value_tag > 0xff)
{
*bufptr++ = IPP_TAG_EXTENSION;
- *bufptr++ = attr->value_tag >> 24;
- *bufptr++ = attr->value_tag >> 16;
- *bufptr++ = attr->value_tag >> 8;
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 24);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 16);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 8);
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
}
else
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
@@ -4269,7 +5720,7 @@ ippWriteIO(void *dst, /* I - Destination */
* Now write the attribute value(s)...
*/
- switch (attr->value_tag & ~IPP_TAG_COPY)
+ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
{
case IPP_TAG_UNSUPPORTED_VALUE :
case IPP_TAG_DEFAULT :
@@ -4290,12 +5741,12 @@ ippWriteIO(void *dst, /* I - Destination */
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 9)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4308,7 +5759,7 @@ ippWriteIO(void *dst, /* I - Destination */
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4322,10 +5773,10 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = 0;
*bufptr++ = 4;
- *bufptr++ = value->integer >> 24;
- *bufptr++ = value->integer >> 16;
- *bufptr++ = value->integer >> 8;
- *bufptr++ = value->integer;
+ *bufptr++ = (ipp_uchar_t)(value->integer >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->integer >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->integer >> 8);
+ *bufptr++ = (ipp_uchar_t)value->integer;
}
break;
@@ -4336,12 +5787,12 @@ ippWriteIO(void *dst, /* I - Destination */
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 6)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4354,7 +5805,7 @@ ippWriteIO(void *dst, /* I - Destination */
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4367,7 +5818,7 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = 0;
*bufptr++ = 1;
- *bufptr++ = value->boolean;
+ *bufptr++ = (ipp_uchar_t)value->boolean;
}
break;
@@ -4397,18 +5848,18 @@ ippWriteIO(void *dst, /* I - Destination */
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4422,7 +5873,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_printf(("1ippWriteIO: String too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippWriteIO: writing string=%d,\"%s\"", n,
@@ -4430,12 +5881,12 @@ ippWriteIO(void *dst, /* I - Destination */
if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4451,12 +5902,12 @@ ippWriteIO(void *dst, /* I - Destination */
* Put the 2-byte length and string characters in the buffer.
*/
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
if (n > 0)
{
- memcpy(bufptr, value->string.text, n);
+ memcpy(bufptr, value->string.text, (size_t)n);
bufptr += n;
}
}
@@ -4469,12 +5920,12 @@ ippWriteIO(void *dst, /* I - Destination */
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 16)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4487,7 +5938,7 @@ ippWriteIO(void *dst, /* I - Destination */
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4514,12 +5965,12 @@ ippWriteIO(void *dst, /* I - Destination */
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 14)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4532,7 +5983,7 @@ ippWriteIO(void *dst, /* I - Destination */
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4548,15 +5999,15 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = 0;
*bufptr++ = 9;
- *bufptr++ = value->resolution.xres >> 24;
- *bufptr++ = value->resolution.xres >> 16;
- *bufptr++ = value->resolution.xres >> 8;
- *bufptr++ = value->resolution.xres;
- *bufptr++ = value->resolution.yres >> 24;
- *bufptr++ = value->resolution.yres >> 16;
- *bufptr++ = value->resolution.yres >> 8;
- *bufptr++ = value->resolution.yres;
- *bufptr++ = value->resolution.units;
+ *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 8);
+ *bufptr++ = (ipp_uchar_t)value->resolution.xres;
+ *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 8);
+ *bufptr++ = (ipp_uchar_t)value->resolution.yres;
+ *bufptr++ = (ipp_uchar_t)value->resolution.units;
}
break;
@@ -4567,12 +6018,12 @@ ippWriteIO(void *dst, /* I - Destination */
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 13)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4585,7 +6036,7 @@ ippWriteIO(void *dst, /* I - Destination */
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4600,14 +6051,14 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = 0;
*bufptr++ = 8;
- *bufptr++ = value->range.lower >> 24;
- *bufptr++ = value->range.lower >> 16;
- *bufptr++ = value->range.lower >> 8;
- *bufptr++ = value->range.lower;
- *bufptr++ = value->range.upper >> 24;
- *bufptr++ = value->range.upper >> 16;
- *bufptr++ = value->range.upper >> 8;
- *bufptr++ = value->range.upper;
+ *bufptr++ = (ipp_uchar_t)(value->range.lower >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->range.lower >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->range.lower >> 8);
+ *bufptr++ = (ipp_uchar_t)value->range.lower;
+ *bufptr++ = (ipp_uchar_t)(value->range.upper >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->range.upper >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->range.upper >> 8);
+ *bufptr++ = (ipp_uchar_t)value->range.upper;
}
break;
@@ -4626,18 +6077,18 @@ ippWriteIO(void *dst, /* I - Destination */
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4665,25 +6116,25 @@ ippWriteIO(void *dst, /* I - Destination */
DEBUG_printf(("1ippWriteIO: text/nameWithLanguage value "
"too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
/* Length of entire value */
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Length of language */
if (value->string.language != NULL)
@@ -4691,13 +6142,13 @@ ippWriteIO(void *dst, /* I - Destination */
else
n = 0;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Language */
if (n > 0)
{
- memcpy(bufptr, value->string.language, n);
+ memcpy(bufptr, value->string.language, (size_t)n);
bufptr += n;
}
@@ -4707,13 +6158,13 @@ ippWriteIO(void *dst, /* I - Destination */
else
n = 0;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Text */
if (n > 0)
{
- memcpy(bufptr, value->string.text, n);
+ memcpy(bufptr, value->string.text, (size_t)n);
bufptr += n;
}
}
@@ -4733,12 +6184,12 @@ ippWriteIO(void *dst, /* I - Destination */
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 5)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4751,7 +6202,7 @@ ippWriteIO(void *dst, /* I - Destination */
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4763,12 +6214,12 @@ ippWriteIO(void *dst, /* I - Destination */
*bufptr++ = 0;
*bufptr++ = 0;
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
@@ -4777,14 +6228,14 @@ ippWriteIO(void *dst, /* I - Destination */
* Then write the collection attribute...
*/
- value->collection->state = IPP_IDLE;
+ value->collection->state = IPP_STATE_IDLE;
if (ippWriteIO(dst, cb, 1, ipp,
- value->collection) == IPP_ERROR)
+ value->collection) == IPP_STATE_ERROR)
{
DEBUG_puts("1ippWriteIO: Unable to write collection value");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
break;
@@ -4803,18 +6254,18 @@ ippWriteIO(void *dst, /* I - Destination */
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
@@ -4833,30 +6284,30 @@ ippWriteIO(void *dst, /* I - Destination */
DEBUG_printf(("1ippWriteIO: Data length too long (%d)",
n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
/* Length of unknown value */
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Value */
if (n > 0)
{
- memcpy(bufptr, value->unknown.data, n);
+ memcpy(bufptr, value->unknown.data, (size_t)n);
bufptr += n;
}
}
@@ -4869,11 +6320,11 @@ ippWriteIO(void *dst, /* I - Destination */
if (bufptr > buffer)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippWriteIO: wrote %d bytes",
@@ -4881,10 +6332,11 @@ ippWriteIO(void *dst, /* I - Destination */
}
/*
- * If blocking is disabled, stop here...
+ * If blocking is disabled and we aren't at the end of the attribute
+ * list, stop here...
*/
- if (!blocking)
+ if (!blocking && ipp->current)
break;
}
@@ -4910,18 +6362,18 @@ ippWriteIO(void *dst, /* I - Destination */
n = 5;
}
- if ((*cb)(dst, buffer, n) < 0)
+ if ((*cb)(dst, buffer, (size_t)n) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP end-tag...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- ipp->state = IPP_DATA;
+ ipp->state = IPP_STATE_DATA;
}
break;
- case IPP_DATA :
+ case IPP_STATE_DATA :
break;
default :
@@ -4969,7 +6421,7 @@ ipp_add_attr(ipp_t *ipp, /* I - IPP message */
alloc_values = (num_values + IPP_MAX_VALUES - 1) & ~(IPP_MAX_VALUES - 1);
attr = calloc(sizeof(ipp_attribute_t) +
- (alloc_values - 1) * sizeof(_ipp_value_t), 1);
+ (size_t)(alloc_values - 1) * sizeof(_ipp_value_t), 1);
if (attr)
{
@@ -5019,7 +6471,7 @@ ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */
DEBUG_printf(("4ipp_free_values(attr=%p, element=%d, count=%d)", attr,
element, count));
- if (!(attr->value_tag & IPP_TAG_COPY))
+ if (!(attr->value_tag & IPP_TAG_CUPS_CONST))
{
/*
* Free values as needed...
@@ -5101,7 +6553,7 @@ ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */
if ((element + count) < attr->num_values)
memmove(attr->values + element, attr->values + element + count,
- (attr->num_values - count - element) * sizeof(_ipp_value_t));
+ (size_t)(attr->num_values - count - element) * sizeof(_ipp_value_t));
attr->num_values -= count;
}
@@ -5133,7 +6585,7 @@ ipp_get_code(const char *value, /* I - Locale/charset string */
if (*value == '_')
*bufptr++ = '-';
else
- *bufptr++ = _cups_tolower(*value);
+ *bufptr++ = (char)_cups_tolower(*value);
*bufptr = '\0';
@@ -5223,18 +6675,21 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */
DEBUG_printf(("5ipp_length: attr->name=\"%s\", attr->num_values=%d, "
"bytes=" CUPS_LLFMT, attr->name, attr->num_values, CUPS_LLCAST bytes));
- if (attr->value_tag < IPP_TAG_EXTENSION)
- bytes += attr->num_values; /* Value tag for each value */
+ if ((attr->value_tag & ~IPP_TAG_CUPS_CONST) < IPP_TAG_EXTENSION)
+ bytes += (size_t)attr->num_values;/* Value tag for each value */
else
- bytes += 5 * attr->num_values; /* Value tag for each value */
- bytes += 2 * attr->num_values; /* Name lengths */
- bytes += (int)strlen(attr->name); /* Name */
- bytes += 2 * attr->num_values; /* Value lengths */
+ bytes += (size_t)(5 * attr->num_values);
+ /* Value tag for each value */
+ bytes += (size_t)(2 * attr->num_values);
+ /* Name lengths */
+ bytes += strlen(attr->name); /* Name */
+ bytes += (size_t)(2 * attr->num_values);
+ /* Value lengths */
if (collection)
bytes += 5; /* Add membername overhead */
- switch (attr->value_tag & ~IPP_TAG_COPY)
+ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
{
case IPP_TAG_UNSUPPORTED_VALUE :
case IPP_TAG_DEFAULT :
@@ -5247,11 +6702,11 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- bytes += 4 * attr->num_values;
+ bytes += (size_t)(4 * attr->num_values);
break;
case IPP_TAG_BOOLEAN :
- bytes += attr->num_values;
+ bytes += (size_t)attr->num_values;
break;
case IPP_TAG_TEXT :
@@ -5270,20 +6725,21 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */
break;
case IPP_TAG_DATE :
- bytes += 11 * attr->num_values;
+ bytes += (size_t)(11 * attr->num_values);
break;
case IPP_TAG_RESOLUTION :
- bytes += 9 * attr->num_values;
+ bytes += (size_t)(9 * attr->num_values);
break;
case IPP_TAG_RANGE :
- bytes += 8 * attr->num_values;
+ bytes += (size_t)(8 * attr->num_values);
break;
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
- bytes += 4 * attr->num_values;/* Charset + text length */
+ bytes += (size_t)(4 * attr->num_values);
+ /* Charset + text length */
for (i = 0, value = attr->values;
i < attr->num_values;
@@ -5308,7 +6764,7 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */
for (i = 0, value = attr->values;
i < attr->num_values;
i ++, value ++)
- bytes += value->unknown.length;
+ bytes += (size_t)value->unknown.length;
break;
}
}
@@ -5338,8 +6794,8 @@ ipp_read_http(http_t *http, /* I - Client connection */
ipp_uchar_t *buffer, /* O - Buffer for data */
size_t length) /* I - Total length */
{
- int tbytes, /* Total bytes read */
- bytes; /* Bytes read this pass */
+ ssize_t tbytes, /* Total bytes read */
+ bytes; /* Bytes read this pass */
DEBUG_printf(("7ipp_read_http(http=%p, buffer=%p, length=%d)",
@@ -5353,10 +6809,9 @@ ipp_read_http(http_t *http, /* I - Client connection */
tbytes < (int)length;
tbytes += bytes, buffer += bytes)
{
- DEBUG_printf(("9ipp_read_http: tbytes=%d, http->state=%d", tbytes,
- http->state));
+ DEBUG_printf(("9ipp_read_http: tbytes=" CUPS_LLFMT ", http->state=%d", CUPS_LLCAST tbytes, http->state));
- if (http->state == HTTP_WAITING)
+ if (http->state == HTTP_STATE_WAITING)
break;
if (http->used == 0 && !http->blocking)
@@ -5375,8 +6830,24 @@ ipp_read_http(http_t *http, /* I - Client connection */
break;
}
}
+ else if (http->used == 0 && http->timeout_value > 0)
+ {
+ /*
+ * Wait up to timeout seconds for more data on blocking sockets...
+ */
+
+ if (!httpWait(http, (int)(1000 * http->timeout_value)))
+ {
+ /*
+ * Signal no data...
+ */
+
+ bytes = -1;
+ break;
+ }
+ }
- if ((bytes = httpRead2(http, (char *)buffer, length - tbytes)) < 0)
+ if ((bytes = httpRead2(http, (char *)buffer, length - (size_t)tbytes)) < 0)
{
#ifdef WIN32
break;
@@ -5398,7 +6869,7 @@ ipp_read_http(http_t *http, /* I - Client connection */
if (tbytes == 0 && bytes < 0)
tbytes = -1;
- DEBUG_printf(("8ipp_read_http: Returning %d bytes", tbytes));
+ DEBUG_printf(("8ipp_read_http: Returning " CUPS_LLFMT " bytes", CUPS_LLCAST tbytes));
return (tbytes);
}
@@ -5422,6 +6893,29 @@ ipp_read_file(int *fd, /* I - File descriptor */
/*
+ * 'ipp_set_error()' - Set a formatted, localized error string.
+ */
+
+static void
+ipp_set_error(ipp_status_t status, /* I - Status code */
+ const char *format, /* I - Printf-style error string */
+ ...) /* I - Additional arguments as needed */
+{
+ va_list ap; /* Pointer to additional args */
+ char buffer[2048]; /* Message buffer */
+ cups_lang_t *lang = cupsLangDefault();
+ /* Current language */
+
+
+ va_start(ap, format);
+ vsnprintf(buffer, sizeof(buffer), _cupsLangString(lang, format), ap);
+ va_end(ap);
+
+ _cupsSetError(status, buffer, 0);
+}
+
+
+/*
* 'ipp_set_value()' - Get the value element from an attribute, expanding it as
* needed.
*/
@@ -5474,10 +6968,9 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */
* Reallocate memory...
*/
- if ((temp = realloc(temp, sizeof(ipp_attribute_t) +
- (alloc_values - 1) * sizeof(_ipp_value_t))) == NULL)
+ if ((temp = realloc(temp, sizeof(ipp_attribute_t) + (size_t)(alloc_values - 1) * sizeof(_ipp_value_t))) == NULL)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("4ipp_set_value: Unable to resize attribute.");
return (NULL);
}
@@ -5486,8 +6979,7 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */
* Zero the new memory...
*/
- memset(temp->values + temp->num_values, 0,
- (alloc_values - temp->num_values) * sizeof(_ipp_value_t));
+ memset(temp->values + temp->num_values, 0, (size_t)(alloc_values - temp->num_values) * sizeof(_ipp_value_t));
if (temp != *attr)
{
@@ -5520,7 +7012,7 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */
*/
*attr = temp;
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP attribute is not a member of the message."), 1);
DEBUG_puts("4ipp_set_value: Unable to find attribute in message.");
return (NULL);
@@ -5570,5 +7062,5 @@ ipp_write_file(int *fd, /* I - File descriptor */
/*
- * End of "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp.c 12468 2015-02-01 04:50:43Z msweet $".
*/
diff --git a/cups/ipp.h b/cups/ipp.h
index b9de668..9fccd11 100644
--- a/cups/ipp.h
+++ b/cups/ipp.h
@@ -1,18 +1,18 @@
/*
- * "$Id: ipp.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp.h 12666 2015-05-25 19:38:09Z msweet $"
*
- * Internet Printing Protocol definitions for CUPS.
+ * Internet Printing Protocol definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_IPP_H_
@@ -23,6 +23,7 @@
*/
# include "http.h"
+# include <stdarg.h>
/*
@@ -54,10 +55,25 @@ extern "C" {
* Common limits...
*/
+# define IPP_MAX_CHARSET 64 /* Maximum length of charset values w/nul */
+# define IPP_MAX_KEYWORD 256 /* Maximum length of keyword values w/nul */
+# define IPP_MAX_LANGUAGE 64 /* Maximum length of naturalLanguage values w/nul */
# define IPP_MAX_LENGTH 32767 /* Maximum size of any single value */
-# define IPP_MAX_NAME 256 /* Maximum length of common name values */
+# define IPP_MAX_MIMETYPE 256 /* Maximum length of mimeMediaType values w/nul */
+# define IPP_MAX_NAME 256 /* Maximum length of common name values w/nul */
+# define IPP_MAX_OCTETSTRING 1023 /* Maximum length of octetString values w/o nul */
+# define IPP_MAX_TEXT 1024 /* Maximum length of text values w/nul */
+# define IPP_MAX_URI 1024 /* Maximum length of uri values w/nul */
+# define IPP_MAX_URISCHEME 64 /* Maximum length of uriScheme values w/nul */
# define IPP_MAX_VALUES 8 /* Power-of-2 allocation increment */
+/*
+ * Macro to flag a text string attribute as "const" (static storage) vs.
+ * allocated.
+ */
+
+# define IPP_CONST_TAG(x) (ipp_tag_t)(IPP_TAG_CUPS_CONST | (x))
+
/*
* Types and structures...
@@ -65,14 +81,22 @@ extern "C" {
typedef enum ipp_dstate_e /**** Document states ****/
{
- IPP_DOCUMENT_PENDING = 3,
- IPP_DOCUMENT_PROCESSING = 5,
- IPP_DOCUMENT_CANCELED = 7,
- IPP_DOCUMENT_ABORTED,
- IPP_DOCUMENT_COMPLETED
+ IPP_DOCUMENT_PENDING = 3, /* Document is pending */
+ IPP_DOCUMENT_PROCESSING = 5, /* Document is processing */
+ IPP_DOCUMENT_CANCELED = 7, /* Document is canceled */
+ IPP_DOCUMENT_ABORTED, /* Document is aborted */
+ IPP_DOCUMENT_COMPLETED /* Document is completed */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_DOCUMENT_PENDING IPP_DSTATE_PENDING
+# define IPP_DOCUMENT_PROCESSING IPP_DSTATE_PROCESSING
+# define IPP_DOCUMENT_CANCELED IPP_DSTATE_CANCELED
+# define IPP_DOCUMENT_ABORTED IPP_DSTATE_ABORTED
+# define IPP_DOCUMENT_COMPLETED IPP_DSTATE_COMPLETED
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_dstate_t;
-typedef enum ipp_finish_e /**** Finishings ****/
+typedef enum ipp_finishings_e /**** Finishings ****/
{
IPP_FINISHINGS_NONE = 3, /* No finishing */
IPP_FINISHINGS_STAPLE, /* Staple (any location) */
@@ -85,7 +109,9 @@ typedef enum ipp_finish_e /**** Finishings ****/
IPP_FINISHINGS_TRIM, /* Trim (any type) */
IPP_FINISHINGS_BALE, /* Bale (any type) */
IPP_FINISHINGS_BOOKLET_MAKER, /* Fold to make booklet */
- IPP_FINISHINGS_JOB_OFFSET, /* Offset for binding (any type) */
+ IPP_FINISHINGS_JOG_OFFSET, /* Offset for binding (any type) */
+ IPP_FINISHINGS_COAT, /* Apply protective liquid or powder coating */
+ IPP_FINISHINGS_LAMINATE, /* Apply protective (solid) material */
IPP_FINISHINGS_STAPLE_TOP_LEFT = 20, /* Staple top left corner */
IPP_FINISHINGS_STAPLE_BOTTOM_LEFT, /* Staple bottom left corner */
IPP_FINISHINGS_STAPLE_TOP_RIGHT, /* Staple top right corner */
@@ -98,6 +124,10 @@ typedef enum ipp_finish_e /**** Finishings ****/
IPP_FINISHINGS_STAPLE_DUAL_TOP, /* Two staples on top */
IPP_FINISHINGS_STAPLE_DUAL_RIGHT, /* Two staples on right */
IPP_FINISHINGS_STAPLE_DUAL_BOTTOM, /* Two staples on bottom */
+ IPP_FINISHINGS_STAPLE_TRIPLE_LEFT, /* Three staples on left */
+ IPP_FINISHINGS_STAPLE_TRIPLE_TOP, /* Three staples on top */
+ IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT, /* Three staples on right */
+ IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM, /* Three staples on bottom */
IPP_FINISHINGS_BIND_LEFT = 50, /* Bind on left */
IPP_FINISHINGS_BIND_TOP, /* Bind on top */
IPP_FINISHINGS_BIND_RIGHT, /* Bind on right */
@@ -105,126 +135,319 @@ typedef enum ipp_finish_e /**** Finishings ****/
IPP_FINISHINGS_TRIM_AFTER_PAGES = 60, /* Trim output after each page */
IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS, /* Trim output after each document */
IPP_FINISHINGS_TRIM_AFTER_COPIES, /* Trim output after each copy */
- IPP_FINISHINGS_TRIM_AFTER_JOB /* Trim output after job */
-} ipp_finish_t;
+ IPP_FINISHINGS_TRIM_AFTER_JOB, /* Trim output after job */
+ IPP_FINISHINGS_PUNCH_TOP_LEFT = 70, /* Punch 1 hole top left */
+ IPP_FINISHINGS_PUNCH_BOTTOM_LEFT, /* Punch 1 hole bottom left */
+ IPP_FINISHINGS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right */
+ IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT, /* Punch 1 hole bottom right */
+ IPP_FINISHINGS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side */
+ IPP_FINISHINGS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge */
+ IPP_FINISHINGS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side */
+ IPP_FINISHINGS_PUNCH_DUAL_BOTTOM, /* Punch 2 holes bottom edge */
+ IPP_FINISHINGS_PUNCH_TRIPLE_LEFT, /* Punch 3 holes left side */
+ IPP_FINISHINGS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge */
+ IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT, /* Punch 3 holes right side */
+ IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM, /* Punch 3 holes bottom edge */
+ IPP_FINISHINGS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side */
+ IPP_FINISHINGS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge */
+ IPP_FINISHINGS_PUNCH_QUAD_RIGHT, /* Punch 4 holes right side */
+ IPP_FINISHINGS_PUNCH_QUAD_BOTTOM, /* Punch 4 holes bottom edge */
+ IPP_FINISHINGS_FOLD_ACCORDIAN = 90, /* Accordian-fold the paper vertically into four sections */
+ IPP_FINISHINGS_FOLD_DOUBLE_GATE, /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
+ IPP_FINISHINGS_FOLD_GATE, /* Fold the top and bottom quarters of the paper towards the midline */
+ IPP_FINISHINGS_FOLD_HALF, /* Fold the paper in half vertically */
+ IPP_FINISHINGS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically */
+ IPP_FINISHINGS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline */
+ IPP_FINISHINGS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold*/
+ IPP_FINISHINGS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections */
+ IPP_FINISHINGS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */
+ IPP_FINISHINGS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline */
+ IPP_FINISHINGS_FOLD_Z, /* Fold the paper vertically into three sections, forming a Z */
+
+ /* CUPS extensions for finishings (pre-standard versions of values above) */
+ IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT = 0x40000046,
+ /* Punch 1 hole top left */
+ IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left */
+ IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right */
+ IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT,
+ /* Punch 1 hole bottom right */
+ IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side */
+ IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge */
+ IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side */
+ IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge */
+ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side */
+ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge */
+ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT,
+ /* Punch 3 holes right side */
+ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM,
+ /* Punch 3 holes bottom edge */
+ IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side */
+ IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge */
+ IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT, /* Punch 4 holes right side */
+ IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge */
+
+ IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN = 0x4000005A,
+ /* Accordian-fold the paper vertically into four sections */
+ IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE, /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
+ IPP_FINISHINGS_CUPS_FOLD_GATE, /* Fold the top and bottom quarters of the paper towards the midline */
+ IPP_FINISHINGS_CUPS_FOLD_HALF, /* Fold the paper in half vertically */
+ IPP_FINISHINGS_CUPS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically */
+ IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline */
+ IPP_FINISHINGS_CUPS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold*/
+ IPP_FINISHINGS_CUPS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections */
+ IPP_FINISHINGS_CUPS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */
+ IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline */
+ IPP_FINISHINGS_CUPS_FOLD_Z /* Fold the paper vertically into three sections, forming a Z */
+} ipp_finishings_t;
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_FINISHINGS_JOB_OFFSET IPP_FINISHINGS_JOG_OFFSET
+ /* Long-time misspelling... */
+typedef enum ipp_finishings_e ipp_finish_t;
+# endif /* !_CUPS_NO_DEPRECATED */
typedef enum ipp_jcollate_e /**** Job collation types ****/
{
- IPP_JOB_UNCOLLATED_SHEETS = 3,
- IPP_JOB_COLLATED_DOCUMENTS,
- IPP_JOB_UNCOLLATED_DOCUMENTS
+ IPP_JCOLLATE_UNCOLLATED_SHEETS = 3,
+ IPP_JCOLLATE_COLLATED_DOCUMENTS,
+ IPP_JCOLLATE_UNCOLLATED_DOCUMENTS
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_JOB_UNCOLLATED_SHEETS IPP_JCOLLATE_UNCOLLATED_SHEETS
+# define IPP_JOB_COLLATED_DOCUMENTS IPP_JCOLLATE_COLLATED_DOCUMENTS
+# define IPP_JOB_UNCOLLATED_DOCUMENTS IPP_JCOLLATE_UNCOLLATED_DOCUMENTS
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_jcollate_t;
typedef enum ipp_jstate_e /**** Job states ****/
{
- IPP_JOB_PENDING = 3, /* Job is waiting to be printed */
- IPP_JOB_HELD, /* Job is held for printing */
- IPP_JOB_PROCESSING, /* Job is currently printing */
- IPP_JOB_STOPPED, /* Job has been stopped */
- IPP_JOB_CANCELED, /* Job has been canceled */
- IPP_JOB_ABORTED, /* Job has aborted due to error */
- IPP_JOB_COMPLETED /* Job has completed successfully */
+ IPP_JSTATE_PENDING = 3, /* Job is waiting to be printed */
+ IPP_JSTATE_HELD, /* Job is held for printing */
+ IPP_JSTATE_PROCESSING, /* Job is currently printing */
+ IPP_JSTATE_STOPPED, /* Job has been stopped */
+ IPP_JSTATE_CANCELED, /* Job has been canceled */
+ IPP_JSTATE_ABORTED, /* Job has aborted due to error */
+ IPP_JSTATE_COMPLETED /* Job has completed successfully */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_JOB_PENDING IPP_JSTATE_PENDING
+# define IPP_JOB_HELD IPP_JSTATE_HELD
+# define IPP_JOB_PROCESSING IPP_JSTATE_PROCESSING
+# define IPP_JOB_STOPPED IPP_JSTATE_STOPPED
+# define IPP_JOB_CANCELED IPP_JSTATE_CANCELED
+# define IPP_JOB_ABORTED IPP_JSTATE_ABORTED
+# define IPP_JOB_COMPLETED IPP_JSTATE_COMPLETED
/* Legacy name for canceled state */
-#define IPP_JOB_CANCELLED IPP_JOB_CANCELED
+# define IPP_JOB_CANCELLED IPP_JSTATE_CANCELED
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_jstate_t;
typedef enum ipp_op_e /**** IPP operations ****/
{
IPP_OP_CUPS_INVALID = -1, /* Invalid operation name for @link ippOpValue@ */
- IPP_PRINT_JOB = 0x0002, /* Print a single file */
- IPP_PRINT_URI, /* Print a single URL @private@ */
- IPP_VALIDATE_JOB, /* Validate job options */
- IPP_CREATE_JOB, /* Create an empty print job */
- IPP_SEND_DOCUMENT, /* Add a file to a job */
- IPP_SEND_URI, /* Add a URL to a job @private@ */
- IPP_CANCEL_JOB, /* Cancel a job */
- IPP_GET_JOB_ATTRIBUTES, /* Get job attributes */
- IPP_GET_JOBS, /* Get a list of jobs */
- IPP_GET_PRINTER_ATTRIBUTES, /* Get printer attributes */
- IPP_HOLD_JOB, /* Hold a job for printing */
- IPP_RELEASE_JOB, /* Release a job for printing */
- IPP_RESTART_JOB, /* Reprint a job */
- IPP_PAUSE_PRINTER = 0x0010, /* Stop a printer */
- IPP_RESUME_PRINTER, /* Start a printer */
- IPP_PURGE_JOBS, /* Cancel all jobs */
- IPP_SET_PRINTER_ATTRIBUTES, /* Set printer attributes @private@ */
- IPP_SET_JOB_ATTRIBUTES, /* Set job attributes */
- IPP_GET_PRINTER_SUPPORTED_VALUES, /* Get supported attribute values */
- IPP_CREATE_PRINTER_SUBSCRIPTION, /* Create a printer subscription @since CUPS 1.2/OS X 10.5@ */
- IPP_CREATE_JOB_SUBSCRIPTION, /* Create a job subscription @since CUPS 1.2/OS X 10.5@ */
- IPP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get subscription attributes @since CUPS 1.2/OS X 10.5@ */
- IPP_GET_SUBSCRIPTIONS, /* Get list of subscriptions @since CUPS 1.2/OS X 10.5@ */
- IPP_RENEW_SUBSCRIPTION, /* Renew a printer subscription @since CUPS 1.2/OS X 10.5@ */
- IPP_CANCEL_SUBSCRIPTION, /* Cancel a subscription @since CUPS 1.2/OS X 10.5@ */
- IPP_GET_NOTIFICATIONS, /* Get notification events @since CUPS 1.2/OS X 10.5@ */
- IPP_SEND_NOTIFICATIONS, /* Send notification events @private@ */
- IPP_GET_RESOURCE_ATTRIBUTES, /* Get resource attributes @private@ */
- IPP_GET_RESOURCE_DATA, /* Get resource data @private@ */
- IPP_GET_RESOURCES, /* Get list of resources @private@ */
- IPP_GET_PRINT_SUPPORT_FILES, /* Get printer support files @private@ */
- IPP_ENABLE_PRINTER, /* Start a printer */
- IPP_DISABLE_PRINTER, /* Stop a printer */
- IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB, /* Stop printer after the current job @private@ */
- IPP_HOLD_NEW_JOBS, /* Hold new jobs @private@ */
- IPP_RELEASE_HELD_NEW_JOBS, /* Release new jobs @private@ */
- IPP_DEACTIVATE_PRINTER, /* Stop a printer @private@ */
- IPP_ACTIVATE_PRINTER, /* Start a printer @private@ */
- IPP_RESTART_PRINTER, /* Restart a printer @private@ */
- IPP_SHUTDOWN_PRINTER, /* Turn a printer off @private@ */
- IPP_STARTUP_PRINTER, /* Turn a printer on @private@ */
- IPP_REPROCESS_JOB, /* Reprint a job @private@ */
- IPP_CANCEL_CURRENT_JOB, /* Cancel the current job @private@ */
- IPP_SUSPEND_CURRENT_JOB, /* Suspend the current job @private@ */
- IPP_RESUME_JOB, /* Resume the current job @private@ */
- IPP_PROMOTE_JOB, /* Promote a job to print sooner @private@ */
- IPP_SCHEDULE_JOB_AFTER, /* Schedule a job to print after another @private@ */
- IPP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document @private@ */
- IPP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes @private@ */
- IPP_GET_DOCUMENTS, /* Get-Documents @private@ */
- IPP_DELETE_DOCUMENT, /* Delete-Document @private@ */
- IPP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes @private@ */
- IPP_CANCEL_JOBS, /* Cancel-Jobs */
- IPP_CANCEL_MY_JOBS, /* Cancel-My-Jobs */
- IPP_RESUBMIT_JOB, /* Resubmit-Job */
- IPP_CLOSE_JOB, /* Close-Job */
- IPP_IDENTIFY_PRINTER, /* Identify-Printer (proposed IPP JPS3) */
- IPP_VALIDATE_DOCUMENT, /* Validate-Document (proposed IPP JPS3) */
- IPP_PRIVATE = 0x4000, /* Reserved @private@ */
- CUPS_GET_DEFAULT, /* Get the default printer */
- CUPS_GET_PRINTERS, /* Get a list of printers and/or classes */
- CUPS_ADD_MODIFY_PRINTER, /* Add or modify a printer */
- CUPS_DELETE_PRINTER, /* Delete a printer */
- CUPS_GET_CLASSES, /* Get a list of classes @deprecated@ */
- CUPS_ADD_MODIFY_CLASS, /* Add or modify a class */
- CUPS_DELETE_CLASS, /* Delete a class */
- CUPS_ACCEPT_JOBS, /* Accept new jobs on a printer */
- CUPS_REJECT_JOBS, /* Reject new jobs on a printer */
- CUPS_SET_DEFAULT, /* Set the default printer */
- CUPS_GET_DEVICES, /* Get a list of supported devices */
- CUPS_GET_PPDS, /* Get a list of supported drivers */
- CUPS_MOVE_JOB, /* Move a job to a different printer */
- CUPS_AUTHENTICATE_JOB, /* Authenticate a job @since CUPS 1.2/OS X 10.5@ */
- CUPS_GET_PPD, /* Get a PPD file @since CUPS 1.3/OS X 10.5@ */
- CUPS_GET_DOCUMENT = 0x4027 /* Get a document file @since CUPS 1.4/OS X 10.6@ */
-
- /* Legacy names for the add operations */
-#define CUPS_ADD_PRINTER CUPS_ADD_MODIFY_PRINTER
-#define CUPS_ADD_CLASS CUPS_ADD_MODIFY_CLASS
+ IPP_OP_CUPS_NONE = 0, /* No operation @private@ */
+ IPP_OP_PRINT_JOB = 0x0002, /* Print a single file */
+ IPP_OP_PRINT_URI, /* Print a single URL */
+ IPP_OP_VALIDATE_JOB, /* Validate job options */
+ IPP_OP_CREATE_JOB, /* Create an empty print job */
+ IPP_OP_SEND_DOCUMENT, /* Add a file to a job */
+ IPP_OP_SEND_URI, /* Add a URL to a job */
+ IPP_OP_CANCEL_JOB, /* Cancel a job */
+ IPP_OP_GET_JOB_ATTRIBUTES, /* Get job attributes */
+ IPP_OP_GET_JOBS, /* Get a list of jobs */
+ IPP_OP_GET_PRINTER_ATTRIBUTES, /* Get printer attributes */
+ IPP_OP_HOLD_JOB, /* Hold a job for printing */
+ IPP_OP_RELEASE_JOB, /* Release a job for printing */
+ IPP_OP_RESTART_JOB, /* Reprint a job */
+ IPP_OP_PAUSE_PRINTER = 0x0010, /* Stop a printer */
+ IPP_OP_RESUME_PRINTER, /* Start a printer */
+ IPP_OP_PURGE_JOBS, /* Cancel all jobs */
+ IPP_OP_SET_PRINTER_ATTRIBUTES, /* Set printer attributes */
+ IPP_OP_SET_JOB_ATTRIBUTES, /* Set job attributes */
+ IPP_OP_GET_PRINTER_SUPPORTED_VALUES, /* Get supported attribute values */
+ IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, /* Create one or more printer subscriptions @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_CREATE_JOB_SUBSCRIPTIONS, /* Create one of more job subscriptions @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get subscription attributes @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_GET_SUBSCRIPTIONS, /* Get list of subscriptions @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_RENEW_SUBSCRIPTION, /* Renew a printer subscription @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_CANCEL_SUBSCRIPTION, /* Cancel a subscription @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_GET_NOTIFICATIONS, /* Get notification events @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_SEND_NOTIFICATIONS, /* Send notification events @private@ */
+ IPP_OP_GET_RESOURCE_ATTRIBUTES, /* Get resource attributes @private@ */
+ IPP_OP_GET_RESOURCE_DATA, /* Get resource data @private@ */
+ IPP_OP_GET_RESOURCES, /* Get list of resources @private@ */
+ IPP_OP_GET_PRINT_SUPPORT_FILES, /* Get printer support files @private@ */
+ IPP_OP_ENABLE_PRINTER, /* Start a printer */
+ IPP_OP_DISABLE_PRINTER, /* Stop a printer */
+ IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB,
+ /* Stop printer after the current job */
+ IPP_OP_HOLD_NEW_JOBS, /* Hold new jobs */
+ IPP_OP_RELEASE_HELD_NEW_JOBS, /* Release new jobs */
+ IPP_OP_DEACTIVATE_PRINTER, /* Stop a printer */
+ IPP_OP_ACTIVATE_PRINTER, /* Start a printer */
+ IPP_OP_RESTART_PRINTER, /* Restart a printer */
+ IPP_OP_SHUTDOWN_PRINTER, /* Turn a printer off */
+ IPP_OP_STARTUP_PRINTER, /* Turn a printer on */
+ IPP_OP_REPROCESS_JOB, /* Reprint a job */
+ IPP_OP_CANCEL_CURRENT_JOB, /* Cancel the current job */
+ IPP_OP_SUSPEND_CURRENT_JOB, /* Suspend the current job */
+ IPP_OP_RESUME_JOB, /* Resume the current job */
+ IPP_OP_PROMOTE_JOB, /* Promote a job to print sooner */
+ IPP_OP_SCHEDULE_JOB_AFTER, /* Schedule a job to print after another */
+ IPP_OP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document */
+ IPP_OP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes */
+ IPP_OP_GET_DOCUMENTS, /* Get-Documents */
+ IPP_OP_DELETE_DOCUMENT, /* Delete-Document */
+ IPP_OP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes */
+ IPP_OP_CANCEL_JOBS, /* Cancel-Jobs */
+ IPP_OP_CANCEL_MY_JOBS, /* Cancel-My-Jobs */
+ IPP_OP_RESUBMIT_JOB, /* Resubmit-Job */
+ IPP_OP_CLOSE_JOB, /* Close-Job */
+ IPP_OP_IDENTIFY_PRINTER, /* Identify-Printer */
+ IPP_OP_VALIDATE_DOCUMENT, /* Validate-Document */
+ IPP_OP_SEND_HARDCOPY_DOCUMENT, /* Send-Hardcopy-Document */
+ IPP_OP_ACKNOWLEDGE_DOCUMENT, /* Acknowledge-Document */
+ IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, /* Acknowledge-Identify-Printer */
+ IPP_OP_ACKNOWLEDGE_JOB, /* Acknowledge-Job */
+ IPP_OP_FETCH_DOCUMENT, /* Fetch-Document */
+ IPP_OP_FETCH_JOB, /* Fetch-Job */
+ IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, /* Get-Output-Device-Attributes */
+ IPP_OP_UPDATE_ACTIVE_JOBS, /* Update-Active-Jobs */
+ IPP_OP_DEREGISTER_OUTPUT_DEVICE, /* Deregister-Output-Device */
+ IPP_OP_UPDATE_DOCUMENT_STATUS, /* Update-Document-Status */
+ IPP_OP_UPDATE_JOB_STATUS, /* Update-Job-Status */
+ IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES,
+ /* Update-Output-Device-Attributes */
+ IPP_OP_GET_NEXT_DOCUMENT_DATA, /* Get-Next-Document-Data */
+
+ IPP_OP_PRIVATE = 0x4000, /* Reserved @private@ */
+ IPP_OP_CUPS_GET_DEFAULT, /* Get the default printer */
+ IPP_OP_CUPS_GET_PRINTERS, /* Get a list of printers and/or classes */
+ IPP_OP_CUPS_ADD_MODIFY_PRINTER, /* Add or modify a printer */
+ IPP_OP_CUPS_DELETE_PRINTER, /* Delete a printer */
+ IPP_OP_CUPS_GET_CLASSES, /* Get a list of classes @deprecated@ */
+ IPP_OP_CUPS_ADD_MODIFY_CLASS, /* Add or modify a class */
+ IPP_OP_CUPS_DELETE_CLASS, /* Delete a class */
+ IPP_OP_CUPS_ACCEPT_JOBS, /* Accept new jobs on a printer */
+ IPP_OP_CUPS_REJECT_JOBS, /* Reject new jobs on a printer */
+ IPP_OP_CUPS_SET_DEFAULT, /* Set the default printer */
+ IPP_OP_CUPS_GET_DEVICES, /* Get a list of supported devices */
+ IPP_OP_CUPS_GET_PPDS, /* Get a list of supported drivers */
+ IPP_OP_CUPS_MOVE_JOB, /* Move a job to a different printer */
+ IPP_OP_CUPS_AUTHENTICATE_JOB, /* Authenticate a job @since CUPS 1.2/OS X 10.5@ */
+ IPP_OP_CUPS_GET_PPD, /* Get a PPD file @since CUPS 1.3/OS X 10.5@ */
+ IPP_OP_CUPS_GET_DOCUMENT = 0x4027 /* Get a document file @since CUPS 1.4/OS X 10.6@ */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_PRINT_JOB IPP_OP_PRINT_JOB
+# define IPP_PRINT_URI IPP_OP_PRINT_URI
+# define IPP_VALIDATE_JOB IPP_OP_VALIDATE_JOB
+# define IPP_CREATE_JOB IPP_OP_CREATE_JOB
+# define IPP_SEND_DOCUMENT IPP_OP_SEND_DOCUMENT
+# define IPP_SEND_URI IPP_OP_SEND_URI
+# define IPP_CANCEL_JOB IPP_OP_CANCEL_JOB
+# define IPP_GET_JOB_ATTRIBUTES IPP_OP_GET_JOB_ATTRIBUTES
+# define IPP_GET_JOBS IPP_OP_GET_JOBS
+# define IPP_GET_PRINTER_ATTRIBUTES IPP_OP_GET_PRINTER_ATTRIBUTES
+# define IPP_HOLD_JOB IPP_OP_HOLD_JOB
+# define IPP_RELEASE_JOB IPP_OP_RELEASE_JOB
+# define IPP_RESTART_JOB IPP_OP_RESTART_JOB
+# define IPP_PAUSE_PRINTER IPP_OP_PAUSE_PRINTER
+# define IPP_RESUME_PRINTER IPP_OP_RESUME_PRINTER
+# define IPP_PURGE_JOBS IPP_OP_PURGE_JOBS
+# define IPP_SET_PRINTER_ATTRIBUTES IPP_OP_SET_PRINTER_ATTRIBUTES
+# define IPP_SET_JOB_ATTRIBUTES IPP_OP_SET_JOB_ATTRIBUTES
+# define IPP_GET_PRINTER_SUPPORTED_VALUES IPP_OP_GET_PRINTER_SUPPORTED_VALUES
+# define IPP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS
+# define IPP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS
+# define IPP_OP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS
+# define IPP_OP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS
+# define IPP_GET_SUBSCRIPTION_ATTRIBUTES IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES
+# define IPP_GET_SUBSCRIPTIONS IPP_OP_GET_SUBSCRIPTIONS
+# define IPP_RENEW_SUBSCRIPTION IPP_OP_RENEW_SUBSCRIPTION
+# define IPP_CANCEL_SUBSCRIPTION IPP_OP_CANCEL_SUBSCRIPTION
+# define IPP_GET_NOTIFICATIONS IPP_OP_GET_NOTIFICATIONS
+# define IPP_SEND_NOTIFICATIONS IPP_OP_SEND_NOTIFICATIONS
+# define IPP_GET_RESOURCE_ATTRIBUTES IPP_OP_GET_RESOURCE_ATTRIBUTES
+# define IPP_GET_RESOURCE_DATA IPP_OP_GET_RESOURCE_DATA
+# define IPP_GET_RESOURCES IPP_OP_GET_RESOURCES
+# define IPP_GET_PRINT_SUPPORT_FILES IPP_OP_GET_PRINT_SUPPORT_FILES
+# define IPP_ENABLE_PRINTER IPP_OP_ENABLE_PRINTER
+# define IPP_DISABLE_PRINTER IPP_OP_DISABLE_PRINTER
+# define IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB
+# define IPP_HOLD_NEW_JOBS IPP_OP_HOLD_NEW_JOBS
+# define IPP_RELEASE_HELD_NEW_JOBS IPP_OP_RELEASE_HELD_NEW_JOBS
+# define IPP_DEACTIVATE_PRINTER IPP_OP_DEACTIVATE_PRINTER
+# define IPP_ACTIVATE_PRINTER IPP_OP_ACTIVATE_PRINTER
+# define IPP_RESTART_PRINTER IPP_OP_RESTART_PRINTER
+# define IPP_SHUTDOWN_PRINTER IPP_OP_SHUTDOWN_PRINTER
+# define IPP_STARTUP_PRINTER IPP_OP_STARTUP_PRINTER
+# define IPP_REPROCESS_JOB IPP_OP_REPROCESS_JOB
+# define IPP_CANCEL_CURRENT_JOB IPP_OP_CANCEL_CURRENT_JOB
+# define IPP_SUSPEND_CURRENT_JOB IPP_OP_SUSPEND_CURRENT_JOB
+# define IPP_RESUME_JOB IPP_OP_RESUME_JOB
+# define IPP_PROMOTE_JOB IPP_OP_PROMOTE_JOB
+# define IPP_SCHEDULE_JOB_AFTER IPP_OP_SCHEDULE_JOB_AFTER
+# define IPP_CANCEL_DOCUMENT IPP_OP_CANCEL_DOCUMENT
+# define IPP_GET_DOCUMENT_ATTRIBUTES IPP_OP_GET_DOCUMENT_ATTRIBUTES
+# define IPP_GET_DOCUMENTS IPP_OP_GET_DOCUMENTS
+# define IPP_DELETE_DOCUMENT IPP_OP_DELETE_DOCUMENT
+# define IPP_SET_DOCUMENT_ATTRIBUTES IPP_OP_SET_DOCUMENT_ATTRIBUTES
+# define IPP_CANCEL_JOBS IPP_OP_CANCEL_JOBS
+# define IPP_CANCEL_MY_JOBS IPP_OP_CANCEL_MY_JOBS
+# define IPP_RESUBMIT_JOB IPP_OP_RESUBMIT_JOB
+# define IPP_CLOSE_JOB IPP_OP_CLOSE_JOB
+# define IPP_IDENTIFY_PRINTER IPP_OP_IDENTIFY_PRINTER
+# define IPP_VALIDATE_DOCUMENT IPP_OP_VALIDATE_DOCUMENT
+# define IPP_PRIVATE IPP_OP_PRIVATE
+# define CUPS_GET_DEFAULT IPP_OP_CUPS_GET_DEFAULT
+# define CUPS_GET_PRINTERS IPP_OP_CUPS_GET_PRINTERS
+# define CUPS_ADD_MODIFY_PRINTER IPP_OP_CUPS_ADD_MODIFY_PRINTER
+# define CUPS_DELETE_PRINTER IPP_OP_CUPS_DELETE_PRINTER
+# define CUPS_GET_CLASSES IPP_OP_CUPS_GET_CLASSES
+# define CUPS_ADD_MODIFY_CLASS IPP_OP_CUPS_ADD_MODIFY_CLASS
+# define CUPS_DELETE_CLASS IPP_OP_CUPS_DELETE_CLASS
+# define CUPS_ACCEPT_JOBS IPP_OP_CUPS_ACCEPT_JOBS
+# define CUPS_REJECT_JOBS IPP_OP_CUPS_REJECT_JOBS
+# define CUPS_SET_DEFAULT IPP_OP_CUPS_SET_DEFAULT
+# define CUPS_GET_DEVICES IPP_OP_CUPS_GET_DEVICES
+# define CUPS_GET_PPDS IPP_OP_CUPS_GET_PPDS
+# define CUPS_MOVE_JOB IPP_OP_CUPS_MOVE_JOB
+# define CUPS_AUTHENTICATE_JOB IPP_OP_CUPS_AUTHENTICATE_JOB
+# define CUPS_GET_PPD IPP_OP_CUPS_GET_PPD
+# define CUPS_GET_DOCUMENT IPP_OP_CUPS_GET_DOCUMENT
+ /* Legacy names */
+# define CUPS_ADD_PRINTER IPP_OP_CUPS_ADD_MODIFY_PRINTER
+# define CUPS_ADD_CLASS IPP_OP_CUPS_ADD_MODIFY_CLASS
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_op_t;
typedef enum ipp_orient_e /**** Orientation values ****/
{
- IPP_PORTRAIT = 3, /* No rotation */
- IPP_LANDSCAPE, /* 90 degrees counter-clockwise */
- IPP_REVERSE_LANDSCAPE, /* 90 degrees clockwise */
- IPP_REVERSE_PORTRAIT /* 180 degrees */
+ IPP_ORIENT_PORTRAIT = 3, /* No rotation */
+ IPP_ORIENT_LANDSCAPE, /* 90 degrees counter-clockwise */
+ IPP_ORIENT_REVERSE_LANDSCAPE, /* 90 degrees clockwise */
+ IPP_ORIENT_REVERSE_PORTRAIT, /* 180 degrees */
+ IPP_ORIENT_NONE /* No rotation */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_PORTRAIT IPP_ORIENT_PORTRAIT
+# define IPP_LANDSCAPE IPP_ORIENT_LANDSCAPE
+# define IPP_REVERSE_LANDSCAPE IPP_ORIENT_REVERSE_LANDSCAPE
+# define IPP_REVERSE_PORTRAIT IPP_ORIENT_REVERSE_PORTRAIT
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_orient_t;
typedef enum ipp_pstate_e /**** Printer states ****/
{
- IPP_PRINTER_IDLE = 3, /* Printer is idle */
- IPP_PRINTER_PROCESSING, /* Printer is working */
- IPP_PRINTER_STOPPED /* Printer is stopped */
+ IPP_PSTATE_IDLE = 3, /* Printer is idle */
+ IPP_PSTATE_PROCESSING, /* Printer is working */
+ IPP_PSTATE_STOPPED /* Printer is stopped */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_PRINTER_IDLE IPP_PSTATE_IDLE
+# define IPP_PRINTER_PROCESSING IPP_PSTATE_PROCESSING
+# define IPP_PRINTER_STOPPED IPP_PSTATE_STOPPED
+# endif /* _CUPS_NO_DEPRECATED */
} ipp_pstate_t;
typedef enum ipp_quality_e /**** Qualities ****/
@@ -242,76 +465,169 @@ typedef enum ipp_res_e /**** Resolution units ****/
typedef enum ipp_state_e /**** IPP states ****/
{
- IPP_ERROR = -1, /* An error occurred */
- IPP_IDLE, /* Nothing is happening/request completed */
- IPP_HEADER, /* The request header needs to be sent/received */
- IPP_ATTRIBUTE, /* One or more attributes need to be sent/received */
- IPP_DATA /* IPP request data needs to be sent/received */
+ IPP_STATE_ERROR = -1, /* An error occurred */
+ IPP_STATE_IDLE, /* Nothing is happening/request completed */
+ IPP_STATE_HEADER, /* The request header needs to be sent/received */
+ IPP_STATE_ATTRIBUTE, /* One or more attributes need to be sent/received */
+ IPP_STATE_DATA /* IPP request data needs to be sent/received */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_ERROR IPP_STATE_ERROR
+# define IPP_IDLE IPP_STATE_IDLE
+# define IPP_HEADER IPP_STATE_HEADER
+# define IPP_ATTRIBUTE IPP_STATE_ATTRIBUTE
+# define IPP_DATA IPP_STATE_DATA
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_state_t;
typedef enum ipp_status_e /**** IPP status codes ****/
{
IPP_STATUS_CUPS_INVALID = -1, /* Invalid status name for @link ippErrorValue@ */
- IPP_OK = 0x0000, /* successful-ok */
- IPP_OK_SUBST, /* successful-ok-ignored-or-substituted-attributes */
- IPP_OK_CONFLICT, /* successful-ok-conflicting-attributes */
- IPP_OK_IGNORED_SUBSCRIPTIONS, /* successful-ok-ignored-subscriptions */
- IPP_OK_IGNORED_NOTIFICATIONS, /* successful-ok-ignored-notifications @private@ */
- IPP_OK_TOO_MANY_EVENTS, /* successful-ok-too-many-events */
- IPP_OK_BUT_CANCEL_SUBSCRIPTION, /* successful-ok-but-cancel-subscription @private@ */
- IPP_OK_EVENTS_COMPLETE, /* successful-ok-events-complete */
- IPP_REDIRECTION_OTHER_SITE = 0x200, /* redirection-other-site @private@ */
- CUPS_SEE_OTHER = 0x280, /* cups-see-other */
- IPP_BAD_REQUEST = 0x0400, /* client-error-bad-request */
- IPP_FORBIDDEN, /* client-error-forbidden */
- IPP_NOT_AUTHENTICATED, /* client-error-not-authenticated */
- IPP_NOT_AUTHORIZED, /* client-error-not-authorized */
- IPP_NOT_POSSIBLE, /* client-error-not-possible */
- IPP_TIMEOUT, /* client-error-timeout */
- IPP_NOT_FOUND, /* client-error-not-found */
- IPP_GONE, /* client-error-gone */
- IPP_REQUEST_ENTITY, /* client-error-request-entity-too-large */
- IPP_REQUEST_VALUE, /* client-error-request-value-too-long */
- IPP_DOCUMENT_FORMAT, /* client-error-document-format-not-supported */
- IPP_ATTRIBUTES, /* client-error-attributes-or-values-not-supported */
- IPP_URI_SCHEME, /* client-error-uri-scheme-not-supported */
- IPP_CHARSET, /* client-error-charset-not-supported */
- IPP_CONFLICT, /* client-error-conflicting-attributes */
- IPP_COMPRESSION_NOT_SUPPORTED, /* client-error-compression-not-supported */
- IPP_COMPRESSION_ERROR, /* client-error-compression-error */
- IPP_DOCUMENT_FORMAT_ERROR, /* client-error-document-format-error */
- IPP_DOCUMENT_ACCESS_ERROR, /* client-error-document-access-error */
- IPP_ATTRIBUTES_NOT_SETTABLE, /* client-error-attributes-not-settable */
- IPP_IGNORED_ALL_SUBSCRIPTIONS, /* client-error-ignored-all-subscriptions */
- IPP_TOO_MANY_SUBSCRIPTIONS, /* client-error-too-many-subscriptions */
- IPP_IGNORED_ALL_NOTIFICATIONS, /* client-error-ignored-all-notifications @private@ */
- IPP_PRINT_SUPPORT_FILE_NOT_FOUND, /* client-error-print-support-file-not-found @private@ */
- IPP_DOCUMENT_PASSWORD_ERROR, /* client-error-document-password-error */
- IPP_DOCUMENT_PERMISSION_ERROR, /* client-error-document-permission-error */
- IPP_DOCUMENT_SECURITY_ERROR, /* client-error-document-security-error */
- IPP_DOCUMENT_UNPRINTABLE_ERROR, /* client-error-document-unprintable-error */
-
- IPP_INTERNAL_ERROR = 0x0500, /* server-error-internal-error */
- IPP_OPERATION_NOT_SUPPORTED, /* server-error-operation-not-supported */
- IPP_SERVICE_UNAVAILABLE, /* server-error-service-unavailable */
- IPP_VERSION_NOT_SUPPORTED, /* server-error-version-not-supported */
- IPP_DEVICE_ERROR, /* server-error-device-error */
- IPP_TEMPORARY_ERROR, /* server-error-temporary-error */
- IPP_NOT_ACCEPTING, /* server-error-not-accepting-jobs */
- IPP_PRINTER_BUSY, /* server-error-busy */
- IPP_ERROR_JOB_CANCELED, /* server-error-job-canceled */
- IPP_MULTIPLE_JOBS_NOT_SUPPORTED, /* server-error-multiple-document-jobs-not-supported */
- IPP_PRINTER_IS_DEACTIVATED, /* server-error-printer-is-deactivated */
- IPP_TOO_MANY_JOBS, /* server-error-too-many-jobs */
- IPP_TOO_MANY_DOCUMENTS, /* server-error-too-many-documents */
-
- IPP_AUTHENTICATION_CANCELED = 0x1000, /* Authentication canceled by user @since CUPS 1.5/OS X 10.7@ */
- IPP_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
- IPP_UPGRADE_REQUIRED /* TLS upgrade required */
-
- /* Legacy name for canceled status */
-#define IPP_ERROR_JOB_CANCELLED IPP_ERROR_JOB_CANCELED
-
+ IPP_STATUS_OK = 0x0000, /* successful-ok */
+ IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED, /* successful-ok-ignored-or-substituted-attributes */
+ IPP_STATUS_OK_CONFLICTING, /* successful-ok-conflicting-attributes */
+ IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS, /* successful-ok-ignored-subscriptions */
+ IPP_STATUS_OK_IGNORED_NOTIFICATIONS, /* successful-ok-ignored-notifications @private@ */
+ IPP_STATUS_OK_TOO_MANY_EVENTS, /* successful-ok-too-many-events */
+ IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION,/* successful-ok-but-cancel-subscription @private@ */
+ IPP_STATUS_OK_EVENTS_COMPLETE, /* successful-ok-events-complete */
+ IPP_STATUS_REDIRECTION_OTHER_SITE = 0x0200,
+ /* redirection-other-site @private@ */
+ IPP_STATUS_CUPS_SEE_OTHER = 0x0280, /* cups-see-other */
+ IPP_STATUS_ERROR_BAD_REQUEST = 0x0400,/* client-error-bad-request */
+ IPP_STATUS_ERROR_FORBIDDEN, /* client-error-forbidden */
+ IPP_STATUS_ERROR_NOT_AUTHENTICATED, /* client-error-not-authenticated */
+ IPP_STATUS_ERROR_NOT_AUTHORIZED, /* client-error-not-authorized */
+ IPP_STATUS_ERROR_NOT_POSSIBLE, /* client-error-not-possible */
+ IPP_STATUS_ERROR_TIMEOUT, /* client-error-timeout */
+ IPP_STATUS_ERROR_NOT_FOUND, /* client-error-not-found */
+ IPP_STATUS_ERROR_GONE, /* client-error-gone */
+ IPP_STATUS_ERROR_REQUEST_ENTITY, /* client-error-request-entity-too-large */
+ IPP_STATUS_ERROR_REQUEST_VALUE, /* client-error-request-value-too-long */
+ IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED,
+ /* client-error-document-format-not-supported */
+ IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,/* client-error-attributes-or-values-not-supported */
+ IPP_STATUS_ERROR_URI_SCHEME, /* client-error-uri-scheme-not-supported */
+ IPP_STATUS_ERROR_CHARSET, /* client-error-charset-not-supported */
+ IPP_STATUS_ERROR_CONFLICTING, /* client-error-conflicting-attributes */
+ IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED,
+ /* client-error-compression-not-supported */
+ IPP_STATUS_ERROR_COMPRESSION_ERROR, /* client-error-compression-error */
+ IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR,
+ /* client-error-document-format-error */
+ IPP_STATUS_ERROR_DOCUMENT_ACCESS, /* client-error-document-access-error */
+ IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE,
+ /* client-error-attributes-not-settable */
+ IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS,
+ /* client-error-ignored-all-subscriptions */
+ IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS,
+ /* client-error-too-many-subscriptions */
+ IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS,
+ /* client-error-ignored-all-notifications @private@ */
+ IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND,
+ /* client-error-print-support-file-not-found @private@ */
+ IPP_STATUS_ERROR_DOCUMENT_PASSWORD, /* client-error-document-password-error */
+ IPP_STATUS_ERROR_DOCUMENT_PERMISSION, /* client-error-document-permission-error */
+ IPP_STATUS_ERROR_DOCUMENT_SECURITY, /* client-error-document-security-error */
+ IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE,/* client-error-document-unprintable-error */
+ IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED, /* client-error-account-info-needed */
+ IPP_STATUS_ERROR_ACCOUNT_CLOSED, /* client-error-account-closed */
+ IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED,
+ /* client-error-account-limit-reached */
+ IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED,
+ /* client-error-account-authorization-failed */
+
+ /* Legacy status codes for paid printing */
+ IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED = 0x049C,
+ /* cups-error-account-info-needed @deprecated@ */
+ IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED, /* cups-error-account-closed @deprecate@ */
+ IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED,
+ /* cups-error-account-limit-reached @deprecated@ */
+ IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED,
+ /* cups-error-account-authorization-failed @deprecated@ */
+
+ IPP_STATUS_ERROR_INTERNAL = 0x0500, /* server-error-internal-error */
+ IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED,
+ /* server-error-operation-not-supported */
+ IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, /* server-error-service-unavailable */
+ IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED,
+ /* server-error-version-not-supported */
+ IPP_STATUS_ERROR_DEVICE, /* server-error-device-error */
+ IPP_STATUS_ERROR_TEMPORARY, /* server-error-temporary-error */
+ IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS, /* server-error-not-accepting-jobs */
+ IPP_STATUS_ERROR_BUSY, /* server-error-busy */
+ IPP_STATUS_ERROR_JOB_CANCELED, /* server-error-job-canceled */
+ IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
+ /* server-error-multiple-document-jobs-not-supported */
+ IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED,
+ /* server-error-printer-is-deactivated */
+ IPP_STATUS_ERROR_TOO_MANY_JOBS, /* server-error-too-many-jobs */
+ IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS, /* server-error-too-many-documents */
+
+ /* These are internal and never sent over the wire... */
+ IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000,
+ /* cups-authentication-canceled - Authentication canceled by user @since CUPS 1.5/OS X 10.7@ */
+ IPP_STATUS_ERROR_CUPS_PKI, /* cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
+ IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_OK IPP_STATUS_OK
+# define IPP_OK_SUBST IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED
+# define IPP_OK_CONFLICT IPP_STATUS_OK_CONFLICTING
+# define IPP_OK_IGNORED_SUBSCRIPTIONS IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS
+# define IPP_OK_IGNORED_NOTIFICATIONS IPP_STATUS_OK_IGNORED_NOTIFICATIONS
+# define IPP_OK_TOO_MANY_EVENTS IPP_STATUS_OK_TOO_MANY_EVENTS
+# define IPP_OK_BUT_CANCEL_SUBSCRIPTION IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION
+# define IPP_OK_EVENTS_COMPLETE IPP_STATUS_OK_EVENTS_COMPLETE
+# define IPP_REDIRECTION_OTHER_SITE IPP_STATUS_REDIRECTION_OTHER_SITE
+# define CUPS_SEE_OTHER IPP_STATUS_CUPS_SEE_OTHER
+# define IPP_BAD_REQUEST IPP_STATUS_ERROR_BAD_REQUEST
+# define IPP_FORBIDDEN IPP_STATUS_ERROR_FORBIDDEN
+# define IPP_NOT_AUTHENTICATED IPP_STATUS_ERROR_NOT_AUTHENTICATED
+# define IPP_NOT_AUTHORIZED IPP_STATUS_ERROR_NOT_AUTHORIZED
+# define IPP_NOT_POSSIBLE IPP_STATUS_ERROR_NOT_POSSIBLE
+# define IPP_TIMEOUT IPP_STATUS_ERROR_TIMEOUT
+# define IPP_NOT_FOUND IPP_STATUS_ERROR_NOT_FOUND
+# define IPP_GONE IPP_STATUS_ERROR_GONE
+# define IPP_REQUEST_ENTITY IPP_STATUS_ERROR_REQUEST_ENTITY
+# define IPP_REQUEST_VALUE IPP_STATUS_ERROR_REQUEST_VALUE
+# define IPP_DOCUMENT_FORMAT IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED
+# define IPP_ATTRIBUTES IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES
+# define IPP_URI_SCHEME IPP_STATUS_ERROR_URI_SCHEME
+# define IPP_CHARSET IPP_STATUS_ERROR_CHARSET
+# define IPP_CONFLICT IPP_STATUS_ERROR_CONFLICTING
+# define IPP_COMPRESSION_NOT_SUPPORTED IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED
+# define IPP_COMPRESSION_ERROR IPP_STATUS_ERROR_COMPRESSION_ERROR
+# define IPP_DOCUMENT_FORMAT_ERROR IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR
+# define IPP_DOCUMENT_ACCESS_ERROR IPP_STATUS_ERROR_DOCUMENT_ACCESS
+# define IPP_ATTRIBUTES_NOT_SETTABLE IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE
+# define IPP_IGNORED_ALL_SUBSCRIPTIONS IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS
+# define IPP_TOO_MANY_SUBSCRIPTIONS IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS
+# define IPP_IGNORED_ALL_NOTIFICATIONS IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS
+# define IPP_PRINT_SUPPORT_FILE_NOT_FOUND IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND
+# define IPP_DOCUMENT_PASSWORD_ERROR IPP_STATUS_ERROR_DOCUMENT_PASSWORD
+# define IPP_DOCUMENT_PERMISSION_ERROR IPP_STATUS_ERROR_DOCUMENT_PERMISSION
+# define IPP_DOCUMENT_SECURITY_ERROR IPP_STATUS_ERROR_DOCUMENT_SECURITY
+# define IPP_DOCUMENT_UNPRINTABLE_ERROR IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE
+# define IPP_INTERNAL_ERROR IPP_STATUS_ERROR_INTERNAL
+# define IPP_OPERATION_NOT_SUPPORTED IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED
+# define IPP_SERVICE_UNAVAILABLE IPP_STATUS_ERROR_SERVICE_UNAVAILABLE
+# define IPP_VERSION_NOT_SUPPORTED IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED
+# define IPP_DEVICE_ERROR IPP_STATUS_ERROR_DEVICE
+# define IPP_TEMPORARY_ERROR IPP_STATUS_ERROR_TEMPORARY
+# define IPP_NOT_ACCEPTING IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS
+# define IPP_PRINTER_BUSY IPP_STATUS_ERROR_BUSY
+# define IPP_ERROR_JOB_CANCELED IPP_STATUS_ERROR_JOB_CANCELED
+# define IPP_MULTIPLE_JOBS_NOT_SUPPORTED IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED
+# define IPP_PRINTER_IS_DEACTIVATED IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED
+# define IPP_TOO_MANY_JOBS IPP_STATUS_ERROR_TOO_MANY_JOBS
+# define IPP_TOO_MANY_DOCUMENTS IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS
+# define IPP_AUTHENTICATION_CANCELED IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED
+# define IPP_PKI_ERROR IPP_STATUS_ERROR_CUPS_PKI
+# define IPP_UPGRADE_REQUIRED IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED
+ /* Legacy name for canceled status */
+# define IPP_ERROR_JOB_CANCELLED IPP_STATUS_ERROR_JOB_CANCELED
+# endif /* _CUPS_NO_DEPRECATED */
} ipp_status_t;
typedef enum ipp_tag_e /**** Format tags for attributes ****/
@@ -356,9 +672,14 @@ typedef enum ipp_tag_e /**** Format tags for attributes ****/
IPP_TAG_MIMETYPE, /* MIME media type value */
IPP_TAG_MEMBERNAME, /* Collection member name value */
IPP_TAG_EXTENSION = 0x7f, /* Extension point for 32-bit tags */
- IPP_TAG_MASK = 0x7fffffff, /* Mask for copied attribute values @private@ */
+ IPP_TAG_CUPS_MASK = 0x7fffffff, /* Mask for copied attribute values @private@ */
/* The following expression is used to avoid compiler warnings with +/-0x80000000 */
- IPP_TAG_COPY = -0x7fffffff-1 /* Bitflag for copied attribute values @private@ */
+ IPP_TAG_CUPS_CONST = -0x7fffffff-1 /* Bitflag for copied/const attribute values @private@ */
+
+# ifndef _CUPS_NO_DEPRECATED
+# define IPP_TAG_MASK IPP_TAG_CUPS_MASK
+# define IPP_TAG_COPY IPP_TAG_CUPS_CONST
+# endif /* !_CUPS_NO_DEPRECATED */
} ipp_tag_t;
typedef unsigned char ipp_uchar_t; /**** Unsigned 8-bit integer/character ****/
@@ -379,12 +700,18 @@ typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr);
* Please use the new accessor functions available in CUPS 1.6 and later, as
* these definitions will be moved to a private header file in a future release.
*
- * Define _IPP_PRIVATE_STRUCTURES to cause the private IPP structures to be
+ * Define _IPP_PRIVATE_STRUCTURES to 1 to cause the private IPP structures to be
* exposed in CUPS 1.6. This happens automatically on OS X when compiling for
* a deployment target of 10.7 or earlier.
+ *
+ * Define _IPP_PRIVATE_STRUCTURES to 0 to prevent the private IPP structures
+ * from being exposed. This is useful when migrating existing code to the new
+ * accessors.
*/
-# if defined(_CUPS_SOURCE) || defined(_CUPS_IPP_PRIVATE_H_)
+# ifdef _IPP_PRIVATE_STRUCTURES
+ /* Somebody has overridden the value */
+# elif defined(_CUPS_SOURCE) || defined(_CUPS_IPP_PRIVATE_H_)
/* Building CUPS */
# define _IPP_PRIVATE_STRUCTURES 1
# elif defined(__APPLE__)
@@ -395,9 +722,11 @@ typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr);
/* Building for 10.7 and earlier */
# define _IPP_PRIVATE_STRUCTURES 1
# endif /* MAC_OS_X_VERSION_10_8 && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 */
+# else
+# define _IPP_PRIVATE_STRUCTURES 0
# endif /* _CUPS_SOURCE || _CUPS_IPP_PRIVATE_H_ */
-# ifdef _IPP_PRIVATE_STRUCTURES
+# if _IPP_PRIVATE_STRUCTURES
typedef union _ipp_request_u /**** Request Header ****/
{
struct /* Any Header */
@@ -494,6 +823,9 @@ struct _ipp_s /**** IPP Request/Response/Notification ****/
/**** New in CUPS 1.4.4 ****/
int use; /* Use count @since CUPS 1.4.4/OS X 10.6.?@ */
+/**** New in CUPS 2.0 ****/
+ int atend, /* At end of list? */
+ curindex; /* Current attribute index for hierarchical search */
};
# endif /* _IPP_PRIVATE_STRUCTURES */
@@ -656,6 +988,41 @@ extern int ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr,
extern int ippSetVersion(ipp_t *ipp, int major, int minor)
_CUPS_API_1_6;
+/**** New in CUPS 1.7 ****/
+extern ipp_attribute_t *ippAddStringf(ipp_t *ipp, ipp_tag_t group,
+ ipp_tag_t value_tag, const char *name,
+ const char *language, const char *format,
+ ...) _CUPS_API_1_7;
+extern ipp_attribute_t *ippAddStringfv(ipp_t *ipp, ipp_tag_t group,
+ ipp_tag_t value_tag, const char *name,
+ const char *language,
+ const char *format, va_list ap)
+ _CUPS_API_1_7;
+extern int ippContainsInteger(ipp_attribute_t *attr, int value)
+ _CUPS_API_1_7;
+extern int ippContainsString(ipp_attribute_t *attr,
+ const char *value) _CUPS_API_1_7;
+extern cups_array_t *ippCreateRequestedArray(ipp_t *request) _CUPS_API_1_7;
+extern void *ippGetOctetString(ipp_attribute_t *attr, int element,
+ int *datalen) _CUPS_API_1_7;
+extern ipp_t *ippNewResponse(ipp_t *request) _CUPS_API_1_7;
+extern int ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr,
+ int element, const void *data,
+ int datalen) _CUPS_API_1_7;
+extern int ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr,
+ int element, const char *format,
+ ...) _CUPS_API_1_7;
+extern int ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr,
+ int element, const char *format,
+ va_list ap) _CUPS_API_1_7;
+extern int ippValidateAttribute(ipp_attribute_t *attr)
+ _CUPS_API_1_7;
+extern int ippValidateAttributes(ipp_t *ipp) _CUPS_API_1_7;
+
+
+/**** New in CUPS 2.0 ****/
+extern const char *ippStateString(ipp_state_t state) _CUPS_API_2_0;
+
/*
* C++ magic...
@@ -667,5 +1034,5 @@ extern int ippSetVersion(ipp_t *ipp, int major, int minor)
#endif /* !_CUPS_IPP_H_ */
/*
- * End of "$Id: ipp.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp.h 12666 2015-05-25 19:38:09Z msweet $".
*/
diff --git a/cups/langprintf.c b/cups/langprintf.c
index 54cef2c..420ca7e 100644
--- a/cups/langprintf.c
+++ b/cups/langprintf.c
@@ -1,27 +1,18 @@
/*
- * "$Id: langprintf.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: langprintf.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Localized printf/puts functions for CUPS.
+ * Localized printf/puts functions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 2002-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2002-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsLangPrintError() - Print a message followed by a standard error.
- * _cupsLangPrintFilter() - Print a formatted filter message string to a file.
- * _cupsLangPrintf() - Print a formatted message string to a file.
- * _cupsLangPuts() - Print a static message string to a file.
- * _cupsSetLocale() - Set the current locale and transcode the
- * command-line.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -39,7 +30,7 @@ void
_cupsLangPrintError(const char *prefix, /* I - Non-localized message prefix */
const char *message)/* I - Message */
{
- int bytes; /* Number of bytes formatted */
+ ssize_t bytes; /* Number of bytes formatted */
int last_errno; /* Last error */
char buffer[2048], /* Message buffer */
*bufptr, /* Pointer into buffer */
@@ -81,7 +72,7 @@ _cupsLangPrintError(const char *prefix, /* I - Non-localized message prefix */
else
bufptr = buffer;
- snprintf(bufptr, sizeof(buffer) - (bufptr - buffer),
+ snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer),
/* TRANSLATORS: Message is "subject: error" */
_cupsLangString(cg->lang_default, _("%s: %s")),
_cupsLangString(cg->lang_default, message), strerror(last_errno));
@@ -95,7 +86,7 @@ _cupsLangPrintError(const char *prefix, /* I - Non-localized message prefix */
cg->lang_default->encoding);
if (bytes > 0)
- fwrite(output, 1, bytes, stderr);
+ fwrite(output, 1, (size_t)bytes, stderr);
}
@@ -110,7 +101,7 @@ _cupsLangPrintFilter(
const char *message, /* I - Message string to use */
...) /* I - Additional arguments as needed */
{
- int bytes; /* Number of bytes formatted */
+ ssize_t bytes; /* Number of bytes formatted */
char temp[2048], /* Temporary format buffer */
buffer[2048], /* Message buffer */
output[8192]; /* Output buffer */
@@ -152,9 +143,9 @@ _cupsLangPrintFilter(
*/
if (bytes > 0)
- return ((int)fwrite(output, 1, bytes, fp));
+ return ((int)fwrite(output, 1, (size_t)bytes, fp));
else
- return (bytes);
+ return ((int)bytes);
}
@@ -167,7 +158,7 @@ _cupsLangPrintf(FILE *fp, /* I - File to write to */
const char *message, /* I - Message string to use */
...) /* I - Additional arguments as needed */
{
- int bytes; /* Number of bytes formatted */
+ ssize_t bytes; /* Number of bytes formatted */
char buffer[2048], /* Message buffer */
output[8192]; /* Output buffer */
va_list ap; /* Pointer to additional arguments */
@@ -209,9 +200,9 @@ _cupsLangPrintf(FILE *fp, /* I - File to write to */
*/
if (bytes > 0)
- return ((int)fwrite(output, 1, bytes, fp));
+ return ((int)fwrite(output, 1, (size_t)bytes, fp));
else
- return (bytes);
+ return ((int)bytes);
}
@@ -223,7 +214,7 @@ int /* O - Number of bytes written */
_cupsLangPuts(FILE *fp, /* I - File to write to */
const char *message) /* I - Message string to use */
{
- int bytes; /* Number of bytes formatted */
+ ssize_t bytes; /* Number of bytes formatted */
char output[8192]; /* Message buffer */
_cups_globals_t *cg; /* Global data */
@@ -248,18 +239,16 @@ _cupsLangPuts(FILE *fp, /* I - File to write to */
(cups_utf8_t *)_cupsLangString(cg->lang_default,
message),
sizeof(output) - 4, cg->lang_default->encoding);
- bytes += cupsUTF8ToCharset(output + bytes, (cups_utf8_t *)"\n",
- sizeof(output) - bytes,
- cg->lang_default->encoding);
+ bytes += cupsUTF8ToCharset(output + bytes, (cups_utf8_t *)"\n", (int)(sizeof(output) - (size_t)bytes), cg->lang_default->encoding);
/*
* Write the string and return the number of bytes written...
*/
if (bytes > 0)
- return ((int)fwrite(output, 1, bytes, fp));
+ return ((int)fwrite(output, 1, (size_t)bytes, fp));
else
- return (bytes);
+ return ((int)bytes);
}
@@ -301,10 +290,10 @@ _cupsSetLocale(char *argv[]) /* IO - Command-line arguments */
if ((charset = strchr(new_lc_time, '.')) == NULL)
charset = new_lc_time + strlen(new_lc_time);
- strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (charset - new_lc_time));
+ strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (size_t)(charset - new_lc_time));
}
else
- strcpy(new_lc_time, "C");
+ strlcpy(new_lc_time, "C", sizeof(new_lc_time));
setlocale(LC_TIME, new_lc_time);
#endif /* LC_TIME */
@@ -348,5 +337,5 @@ _cupsSetLocale(char *argv[]) /* IO - Command-line arguments */
/*
- * End of "$Id: langprintf.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: langprintf.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/language-private.h b/cups/language-private.h
index 8b44b8b..93cdf08 100644
--- a/cups/language-private.h
+++ b/cups/language-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: language-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: language-private.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Private localization support for CUPS.
*
@@ -82,5 +82,5 @@ extern void _cupsSetLocale(char *argv[]);
#endif /* !_CUPS_LANGUAGE_PRIVATE_H_ */
/*
- * End of "$Id: language-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: language-private.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/language.c b/cups/language.c
index b35a865..8579787 100644
--- a/cups/language.c
+++ b/cups/language.c
@@ -1,43 +1,18 @@
/*
- * "$Id: language.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: language.c 12841 2015-08-10 17:07:30Z msweet $"
*
- * I18N/language support for CUPS.
+ * I18N/language support for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsAppleLanguage() - Get the Apple language identifier associated with
- * a locale ID.
- * _cupsEncodingName() - Return the character encoding name string for the
- * given encoding enumeration.
- * cupsLangDefault() - Return the default language.
- * cupsLangEncoding() - Return the character encoding (us-ascii, etc.)
- * for the given language.
- * cupsLangFlush() - Flush all language data out of the cache.
- * cupsLangFree() - Free language data.
- * cupsLangGet() - Get a language.
- * _cupsLangString() - Get a message string.
- * _cupsMessageFree() - Free a messages array.
- * _cupsMessageLoad() - Load a .po file into a messages array.
- * _cupsMessageLookup() - Lookup a message string.
- * _cupsMessageNew() - Make a new message catalog array.
- * appleLangDefault() - Get the default locale string.
- * appleMessageLoad() - Load a message catalog from a localizable bundle.
- * cups_cache_lookup() - Lookup a language in the cache...
- * cups_message_compare() - Compare two messages.
- * cups_message_free() - Free a message.
- * cups_message_load() - Load the message catalog for a language.
- * cups_unquote() - Unquote characters in strings...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -134,7 +109,7 @@ static const char * const lang_encodings[] =
"unknown", "unknown",
"euc-cn", "euc-jp",
"euc-kr", "euc-tw",
- "jis-x0213"
+ "shift_jisx0213"
};
#ifdef __APPLE__
@@ -227,8 +202,8 @@ _cupsAppleLanguage(const char *locale, /* I - Locale ID */
*/
language[2] = '_';
- language[3] = toupper(language[3] & 255);
- language[4] = toupper(language[4] & 255);
+ language[3] = (char)toupper(language[3] & 255);
+ language[4] = (char)toupper(language[4] & 255);
}
break;
}
@@ -253,7 +228,7 @@ _cupsAppleLanguage(const char *locale, /* I - Locale ID */
if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString(
kCFAllocatorDefault, localeid)) != NULL)
{
- CFStringGetCString(langid, language, langsize, kCFStringEncodingASCII);
+ CFStringGetCString(langid, language, (CFIndex)langsize, kCFStringEncodingASCII);
CFRelease(langid);
}
@@ -278,8 +253,8 @@ const char * /* O - Character encoding */
_cupsEncodingName(
cups_encoding_t encoding) /* I - Encoding value */
{
- if (encoding < 0 ||
- encoding >= (sizeof(lang_encodings) / sizeof(const char *)))
+ if (encoding < CUPS_US_ASCII ||
+ encoding >= (cups_encoding_t)(sizeof(lang_encodings) / sizeof(lang_encodings[0])))
{
DEBUG_printf(("1_cupsEncodingName(encoding=%d) = out of range (\"%s\")",
encoding, lang_encodings[0]));
@@ -446,7 +421,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
* Set the character set to UTF-8...
*/
- strcpy(charset, "UTF8");
+ strlcpy(charset, "UTF8", sizeof(charset));
/*
* Apple's setlocale doesn't give us the user's localization
@@ -582,7 +557,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
*/
if (!charset[0])
- strcpy(charset, "UTF8");
+ strlcpy(charset, "UTF8", sizeof(charset));
/*
* Parse the language string passed in to a locale string. "C" is the
@@ -597,7 +572,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
if (language == NULL || !language[0] ||
!strcmp(language, "POSIX"))
- strcpy(langname, "C");
+ strlcpy(langname, "C", sizeof(langname));
else
{
/*
@@ -608,7 +583,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
if (*language == '_' || *language == '-' || *language == '.')
break;
else if (ptr < (langname + sizeof(langname) - 1))
- *ptr++ = tolower(*language & 255);
+ *ptr++ = (char)tolower(*language & 255);
*ptr = '\0';
@@ -622,7 +597,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
if (*language == '.')
break;
else if (ptr < (country + sizeof(country) - 1))
- *ptr++ = toupper(*language & 255);
+ *ptr++ = (char)toupper(*language & 255);
*ptr = '\0';
}
@@ -635,7 +610,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
for (language ++, ptr = charset; *language; language ++)
if (_cups_isalnum(*language) && ptr < (charset + sizeof(charset) - 1))
- *ptr++ = toupper(*language & 255);
+ *ptr++ = (char)toupper(*language & 255);
*ptr = '\0';
}
@@ -646,7 +621,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
if (strlen(langname) != 2)
{
- strcpy(langname, "C");
+ strlcpy(langname, "C", sizeof(langname));
country[0] = '\0';
charset[0] = '\0';
}
@@ -701,7 +676,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
if (country[0])
snprintf(real, sizeof(real), "%s_%s", langname, country);
else
- strcpy(real, langname);
+ strlcpy(real, langname, sizeof(real));
_cupsMutexLock(&lang_mutex);
@@ -846,7 +821,8 @@ _cupsMessageLoad(const char *filename, /* I - Message catalog to load */
char s[4096], /* String buffer */
*ptr, /* Pointer into buffer */
*temp; /* New string */
- int length; /* Length of combined strings */
+ size_t length, /* Length of combined strings */
+ ptrlen; /* Length of string */
DEBUG_printf(("4_cupsMessageLoad(filename=\"%s\")", filename));
@@ -977,10 +953,10 @@ _cupsMessageLoad(const char *filename, /* I - Message catalog to load */
* Append to current string...
*/
- length = (int)strlen(m->str ? m->str : m->id);
+ length = strlen(m->str ? m->str : m->id);
+ ptrlen = strlen(ptr);
- if ((temp = realloc(m->str ? m->str : m->id,
- length + strlen(ptr) + 1)) == NULL)
+ if ((temp = realloc(m->str ? m->str : m->id, length + ptrlen + 1)) == NULL)
{
if (m->str)
free(m->str);
@@ -995,25 +971,25 @@ _cupsMessageLoad(const char *filename, /* I - Message catalog to load */
{
/*
* Copy the new portion to the end of the msgstr string - safe
- * to use strcpy because the buffer is allocated to the correct
+ * to use memcpy because the buffer is allocated to the correct
* size...
*/
m->str = temp;
- strcpy(m->str + length, ptr);
+ memcpy(m->str + length, ptr, ptrlen + 1);
}
else
{
/*
* Copy the new portion to the end of the msgid string - safe
- * to use strcpy because the buffer is allocated to the correct
+ * to use memcpy because the buffer is allocated to the correct
* size...
*/
m->id = temp;
- strcpy(m->id + length, ptr);
+ memcpy(m->id + length, ptr, ptrlen + 1);
}
}
else if (!strncmp(s, "msgstr", 6) && m)
@@ -1163,7 +1139,7 @@ appleLangDefault(void)
int i; /* Looping var */
CFBundleRef bundle; /* Main bundle (if any) */
CFArrayRef bundleList; /* List of localizations in bundle */
- CFPropertyListRef localizationList;
+ CFPropertyListRef localizationList = NULL;
/* List of localization data */
CFStringRef languageName; /* Current name */
CFStringRef localeName; /* Canonical from of name */
@@ -1182,24 +1158,67 @@ appleLangDefault(void)
{
if (getenv("SOFTWARE") != NULL && (lang = getenv("LANG")) != NULL)
{
+ DEBUG_printf(("3appleLangDefault: Using LANG=%s", lang));
strlcpy(cg->language, lang, sizeof(cg->language));
return (cg->language);
}
else if ((bundle = CFBundleGetMainBundle()) != NULL &&
(bundleList = CFBundleCopyBundleLocalizations(bundle)) != NULL)
{
- localizationList =
- CFBundleCopyPreferredLocalizationsFromArray(bundleList);
+ CFURLRef resources = CFBundleCopyResourcesDirectoryURL(bundle);
+
+ DEBUG_puts("3appleLangDefault: Getting localizationList from bundle.");
+
+ if (resources)
+ {
+ CFStringRef cfpath = CFURLCopyPath(resources);
+ char path[1024];
+
+ if (cfpath)
+ {
+ /*
+ * See if we have an Info.plist file in the bundle...
+ */
+
+ CFStringGetCString(cfpath, path, sizeof(path), kCFStringEncodingUTF8);
+ DEBUG_printf(("3appleLangDefault: Got a resource URL (\"%s\")", path));
+ strlcat(path, "Contents/Info.plist", sizeof(path));
+
+ if (!access(path, R_OK))
+ localizationList = CFBundleCopyPreferredLocalizationsFromArray(bundleList);
+ else
+ DEBUG_puts("3appleLangDefault: No Info.plist, ignoring resource URL...");
+
+ CFRelease(cfpath);
+ }
+
+ CFRelease(resources);
+ }
+ else
+ DEBUG_puts("3appleLangDefault: No resource URL.");
CFRelease(bundleList);
}
- else
+
+ if (!localizationList)
+ {
+ DEBUG_puts("3appleLangDefault: Getting localizationList from preferences.");
+
localizationList =
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
kCFPreferencesCurrentApplication);
+ }
if (localizationList)
{
+#ifdef DEBUG
+ if (CFGetTypeID(localizationList) == CFArrayGetTypeID())
+ DEBUG_printf(("3appleLangDefault: Got localizationList, %d entries.",
+ (int)CFArrayGetCount(localizationList)));
+ else
+ DEBUG_puts("3appleLangDefault: Got localizationList but not an array.");
+#endif /* DEBUG */
+
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
CFArrayGetCount(localizationList) > 0)
{
@@ -1217,7 +1236,7 @@ appleLangDefault(void)
kCFStringEncodingASCII);
CFRelease(localeName);
- DEBUG_printf(("9appleLangDefault: cg->language=\"%s\"",
+ DEBUG_printf(("3appleLangDefault: cg->language=\"%s\"",
cg->language));
/*
@@ -1231,7 +1250,7 @@ appleLangDefault(void)
{
if (!strcmp(cg->language, apple_language_locale[i].language))
{
- DEBUG_printf(("9appleLangDefault: mapping \"%s\" to \"%s\"...",
+ DEBUG_printf(("3appleLangDefault: mapping \"%s\" to \"%s\"...",
cg->language, apple_language_locale[i].locale));
strlcpy(cg->language, apple_language_locale[i].locale,
sizeof(cg->language));
@@ -1249,6 +1268,8 @@ appleLangDefault(void)
if (!strchr(cg->language, '.'))
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
}
+ else
+ DEBUG_puts("3appleLangDefault: Unable to get localeName.");
}
}
@@ -1260,8 +1281,13 @@ appleLangDefault(void)
*/
if (!cg->language[0])
+ {
+ DEBUG_puts("3appleLangDefault: Defaulting to en_US.");
strlcpy(cg->language, "en_US.UTF-8", sizeof(cg->language));
+ }
}
+ else
+ DEBUG_printf(("3appleLangDefault: Using previous locale \"%s\".", cg->language));
/*
* Return the cached locale...
@@ -1280,7 +1306,8 @@ static cups_array_t * /* O - Message catalog */
appleMessageLoad(const char *locale) /* I - Locale ID */
{
char filename[1024], /* Path to cups.strings file */
- applelang[256]; /* Apple language ID */
+ applelang[256], /* Apple language ID */
+ baselang[3]; /* Base language */
CFURLRef url; /* URL to cups.strings file */
CFReadStreamRef stream = NULL; /* File stream */
CFPropertyListRef plist = NULL; /* Localization file */
@@ -1298,6 +1325,18 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
snprintf(filename, sizeof(filename),
CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings",
_cupsAppleLanguage(locale, applelang, sizeof(applelang)));
+
+ if (access(filename, 0))
+ {
+ /*
+ * <rdar://problem/22086642>
+ *
+ * Try with original locale string...
+ */
+
+ snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale);
+ }
+
DEBUG_printf(("1appleMessageLoad: filename=\"%s\"", filename));
if (access(filename, 0))
@@ -1320,6 +1359,28 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
locale = "Japanese";
else if (!strncmp(locale, "es", 2))
locale = "Spanish";
+ else if (!strcmp(locale, "zh_HK"))
+ {
+ /*
+ * <rdar://problem/22130168>
+ *
+ * Try zh_TW first, then zh... Sigh...
+ */
+
+ if (!access(CUPS_BUNDLEDIR "/Resources/zh_TW.lproj/cups.strings", 0))
+ locale = "zh_TW";
+ else
+ locale = "zh";
+ }
+ else if (strstr(locale, "_") != NULL || strstr(locale, "-") != NULL)
+ {
+ /*
+ * Drop country code, just try language...
+ */
+
+ strlcpy(baselang, locale, sizeof(baselang));
+ locale = baselang;
+ }
snprintf(filename, sizeof(filename),
CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale);
@@ -1328,7 +1389,7 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
(UInt8 *)filename,
- strlen(filename), false);
+ (CFIndex)strlen(filename), false);
if (url)
{
stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url);
@@ -1563,5 +1624,5 @@ cups_unquote(char *d, /* O - Unquoted string */
/*
- * End of "$Id: language.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: language.c 12841 2015-08-10 17:07:30Z msweet $".
*/
diff --git a/cups/language.h b/cups/language.h
index d2ad208..4fcf9e8 100644
--- a/cups/language.h
+++ b/cups/language.h
@@ -1,5 +1,5 @@
/*
- * "$Id: language.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: language.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Multi-language support for CUPS.
*
@@ -111,5 +111,5 @@ extern cups_lang_t *cupsLangGet(const char *language);
#endif /* !_CUPS_LANGUAGE_H_ */
/*
- * End of "$Id: language.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: language.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/libcups2.def b/cups/libcups2.def
index ef22daa..66ab4ad 100644
--- a/cups/libcups2.def
+++ b/cups/libcups2.def
@@ -1,382 +1,539 @@
-LIBRARY libcups2
-VERSION 2.9
-EXPORTS
-_cupsBufferGet
-_cupsBufferRelease
-_cupsGet1284Values
-_cupsGetDests
-_cupsGetPassword
-_cupsGlobals
-_cupsLangPrintError
-_cupsLangPrintf
-_cupsLangPuts
-_cupsLangString
-_cupsMD5Append
-_cupsMD5Finish
-_cupsMD5Init
-_cupsMessageFree
-_cupsMessageLoad
-_cupsMessageLookup
-_cupsMutexLock
-_cupsMutexUnlock
-_cupsNextDelay
-_cupsSetError
-_cupsSetLocale
-_cupsStrAlloc
-_cupsStrFlush
-_cupsStrFormatd
-_cupsStrFree
-_cupsStrRetain
-_cupsStrScand
-_cupsStrStatistics
-_cups_strcasecmp
-_cups_strncasecmp
-_cups_strcpy
-_cups_strlcat
-_cups_strlcpy
-_httpAddrPort
-_httpAddrSetPort
-_httpAssembleUUID
-_httpCreate
-_httpEncodeURI
-_httpPeek
-_httpResolveURI
-_httpWait
-_ippFindOption
-_ppdCacheCreateWithFile
-_ppdCacheCreateWithPPD
-_ppdCacheDestroy
-_ppdCacheGetBin
-_ppdCacheGetInputSlot
-_ppdCacheGetMediaType
-_ppdCacheGetOutputBin
-_ppdCacheGetPageSize
-_ppdCacheGetSize
-_ppdCacheGetSource
-_ppdCacheGetType
-_ppdCacheWriteFile
-_ppdFreeLanguages
-_ppdGetEncoding
-_ppdGetLanguages
-_ppdHashName
-_ppdLocalizedAttr
-_ppdNormalizeMakeAndModel
-_ppdOpen
-_ppdOpenFile
-_ppdParseOptions
-_pwgGenerateSize
-_pwgInitSize
-_pwgMediaForLegacy
-_pwgMediaForPPD
-_pwgMediaForPWG
-_pwgMediaForSize
-_pwgMediaTypeForType
-_pwgPageSizeForMedia
-cupsAddDest
-cupsAddOption
-cupsAdminCreateWindowsPPD
-cupsAdminExportSamba
-cupsArrayAdd
-cupsArrayClear
-cupsArrayCount
-cupsArrayCurrent
-cupsArrayDelete
-cupsArrayDup
-cupsArrayFind
-cupsArrayFirst
-cupsArrayGetIndex
-cupsArrayGetInsert
-cupsArrayIndex
-cupsArrayInsert
-cupsArrayLast
-cupsArrayNew
-cupsArrayNew2
-cupsArrayNew3
-cupsArrayNext
-cupsArrayPrev
-cupsArrayRemove
-cupsArrayRestore
-cupsArraySave
-cupsArrayUserData
-cupsCancelJob
-cupsCharsetToUTF8
-cupsDirClose
-cupsDirOpen
-cupsDirRead
-cupsDirRewind
-cupsDoAuthentication
-cupsDoFileRequest
-cupsDoIORequest
-cupsDoRequest
-cupsEncodeOptions
-cupsEncodeOptions2
-cupsEncryption
-cupsFileClose
-cupsFileCompression
-cupsFileEOF
-cupsFileFind
-cupsFileFlush
-cupsFileGetChar
-cupsFileGetConf
-cupsFileGetLine
-cupsFileGets
-cupsFileLock
-cupsFileNumber
-cupsFileOpen
-cupsFileOpenFd
-cupsFilePeekChar
-cupsFilePrintf
-cupsFilePutChar
-cupsFilePuts
-cupsFileRead
-cupsFileRewind
-cupsFileSeek
-cupsFileStderr
-cupsFileStdin
-cupsFileStdout
-cupsFileTell
-cupsFileUnlock
-cupsFileWrite
-cupsFreeDests
-cupsFreeJobs
-cupsFreeOptions
-cupsGetClasses
-cupsGetDefault
-cupsGetDefault2
-cupsGetDest
-cupsGetDests
-cupsGetDests2
-cupsGetFd
-cupsGetFile
-cupsGetJobs
-cupsGetJobs2
-cupsGetOption
-cupsGetPPD
-cupsGetPPD2
-cupsGetPassword
-cupsGetPrinters
-cupsGetResponse
-cupsLangDefault
-cupsLangEncoding
-cupsLangFlush
-cupsLangFree
-cupsLangGet
-cupsLastError
-cupsLastErrorString
-cupsMarkOptions
-cupsNotifySubject
-cupsNotifyText
-cupsParseOptions
-cupsPrintFile
-cupsPrintFile2
-cupsPrintFiles
-cupsPrintFiles2
-cupsPutFd
-cupsPutFile
-cupsRemoveOption
-cupsResolveConflicts
-cupsSendRequest
-cupsServer
-cupsSetClientCertCB
-cupsSetCredentials
-cupsSetDests
-cupsSetDests2
-cupsSetEncryption
-cupsSetPasswordCB
-cupsSetServer
-cupsSetServerCertCB
-cupsSetUser
-cupsTempFd
-cupsTempFile
-cupsTempFile2
-cupsUTF32ToUTF8
-cupsUTF8ToCharset
-cupsUTF8ToUTF32
-cupsUser
-cupsWriteRequestData
-httpAddCredential
-httpAddrAny
-httpAddrConnect
-httpAddrEqual
-httpAddrFreeList
-httpAddrGetList
-httpAddrLength
-httpAddrLocalhost
-httpAddrLookup
-httpAddrString
-httpAssembleURI
-httpAssembleURIf
-httpBlocking
-httpCheck
-httpClearCookie
-httpClearFields
-httpClose
-httpConnect
-httpConnectEncrypt
-httpCopyCredentials
-httpDecode64
-httpDecode64_2
-httpDelete
-httpEncode64
-httpEncode64_2
-httpEncryption
-httpError
-httpFlush
-httpFlushWrite
-httpFreeCredentials
-httpGet
-httpGetBlocking
-httpGetCookie
-httpGetDateString
-httpGetDateString2
-httpGetDateTime
-httpGetFd
-httpGetField
-httpGetHostByName
-httpGetHostname
-httpGetLength
-httpGetLength2
-httpGetStatus
-httpGetSubField
-httpGetSubField2
-httpGets
-httpHead
-httpInitialize
-httpMD5
-httpMD5Final
-httpMD5String
-httpOptions
-httpPost
-httpPrintf
-httpPut
-httpRead
-httpRead2
-httpReconnect
-httpSeparate
-httpSeparate2
-httpSeparateURI
-httpSetCookie
-httpSetCredentials
-httpSetExpect
-httpSetField
-httpSetLength
-httpSetTimeout
-httpStatus
-httpTrace
-httpUpdate
-httpWait
-httpWrite
-httpWrite2
-ippAddBoolean
-ippAddBooleans
-ippAddCollection
-ippAddCollections
-ippAddDate
-ippAddInteger
-ippAddIntegers
-ippAddOctetString
-ippAddOutOfBand
-ippAddRange
-ippAddRanges
-ippAddResolution
-ippAddResolutions
-ippAddSeparator
-ippAddString
-ippAddStrings
-ippAttributeString
-ippCopyAttribute
-ippCopyAttributes
-ippDateToTime
-ippDelete
-ippDeleteAttribute
-ippDeleteValues
-ippEnumString
-ippEnumValue
-ippErrorString
-ippErrorValue
-ippFindAttribute
-ippFindNextAttribute
-ippFirstAttribute
-ippGetBoolean
-ippGetCollection
-ippGetCount
-ippGetDate
-ippGetGroupTag
-ippGetInteger
-ippGetName
-ippGetOperation
-ippGetRange
-ippGetRequestId
-ippGetResolution
-ippGetState
-ippGetStatusCode
-ippGetString
-ippGetValueTag
-ippGetVersion
-ippLength
-ippNew
-ippNewRequest
-ippNextAttribute
-ippOpString
-ippOpValue
-ippPort
-ippRead
-ippReadFile
-ippReadIO
-ippSetPort
-ippSetBoolean
-ippSetCollection
-ippSetDate
-ippSetGroupTag
-ippSetInteger
-ippSetName
-ippSetOperation
-ippSetRange
-ippSetRequestId
-ippSetResolution
-ippSetState
-ippSetStatusCode
-ippSetString
-ippSetValueTag
-ippSetVersion
-ippTagString
-ippTagValue
-ippTimeToDate
-ippWrite
-ippWriteFile
-ippWriteIO
-ppdClose
-ppdCollect
-ppdCollect2
-ppdConflicts
-ppdEmit
-ppdEmitAfterOrder
-ppdEmitFd
-ppdEmitJCL
-ppdEmitJCLEnd
-ppdEmitString
-ppdErrorString
-ppdFindAttr
-ppdFindChoice
-ppdFindCustomOption
-ppdFindCustomParam
-ppdFindMarkedChoice
-ppdFindNextAttr
-ppdFindOption
-ppdFirstCustomParam
-ppdFirstOption
-ppdIsMarked
-ppdLastError
-ppdLocalize
-ppdMarkDefaults
-ppdMarkOption
-ppdNextCustomParam
-ppdNextOption
-ppdOpen
-ppdOpen2
-ppdOpenFd
-ppdOpenFile
-ppdPageLength
-ppdPageSize
-ppdPageWidth
-ppdSetConformance
+LIBRARY libcups2
+VERSION 2.11
+EXPORTS
+_cupsArrayAddStrings
+_cupsArrayNewStrings
+_cupsBufferGet
+_cupsBufferRelease
+_cupsCharmapFlush
+_cupsConnect
+_cupsEncodingName
+_cupsGet1284Values
+_cupsGetDestResource
+_cupsGetDests
+_cupsGetPassword
+_cupsGlobalLock
+_cupsGlobalUnlock
+_cupsGlobals
+_cupsLangPrintError
+_cupsLangPrintf
+_cupsLangPuts
+_cupsLangString
+_cupsMD5Append
+_cupsMD5Finish
+_cupsMD5Init
+_cupsMessageFree
+_cupsMessageLoad
+_cupsMessageLookup
+_cupsMessageNew
+_cupsMutexInit
+_cupsMutexLock
+_cupsMutexUnlock
+_cupsNextDelay
+_cupsRWInit
+_cupsRWLockRead
+_cupsRWLockWrite
+_cupsRWUnlock
+_cupsSNMPClose
+_cupsSNMPCopyOID
+_cupsSNMPDefaultCommunity
+_cupsSNMPIsOID
+_cupsSNMPIsOIDPrefixed
+_cupsSNMPOIDToString
+_cupsSNMPOpen
+_cupsSNMPRead
+_cupsSNMPSetDebug
+_cupsSNMPStringToOID
+_cupsSNMPWalk
+_cupsSNMPWrite
+_cupsSetDefaults
+_cupsSetError
+_cupsSetHTTPError
+_cupsSetLocale
+_cupsStrAlloc
+_cupsStrDate
+_cupsStrFlush
+_cupsStrFormatd
+_cupsStrFree
+_cupsStrRetain
+_cupsStrScand
+_cupsStrStatistics
+_cupsThreadCreate
+_cupsUserDefault
+_cups_strcasecmp
+_cups_strcpy
+_cups_strcpy
+_cups_strlcat
+_cups_strlcpy
+_cups_strncasecmp
+_httpAddrSetPort
+_httpCreateCredentials
+_httpDecodeURI
+_httpDisconnect
+_httpEncodeURI
+_httpFreeCredentials
+_httpResolveURI
+_httpStatus
+_httpTLSInitialize
+_httpTLSPending
+_httpTLSRead
+_httpTLSStart
+_httpTLSStop
+_httpTLSWrite
+_httpUpdate
+_httpWait
+_ippCheckOptions
+_ippFindOption
+_ppdCacheCreateWithFile
+_ppdCacheCreateWithPPD
+_ppdCacheDestroy
+_ppdCacheGetBin
+_ppdCacheGetFinishingOptions
+_ppdCacheGetFinishingValues
+_ppdCacheGetInputSlot
+_ppdCacheGetMediaType
+_ppdCacheGetOutputBin
+_ppdCacheGetPageSize
+_ppdCacheGetSize
+_ppdCacheGetSource
+_ppdCacheGetType
+_ppdCacheWriteFile
+_ppdFreeLanguages
+_ppdGetEncoding
+_ppdGetLanguages
+_ppdHashName
+_ppdLocalizedAttr
+_ppdNormalizeMakeAndModel
+_ppdOpen
+_ppdOpenFile
+_ppdParseOptions
+_pwgGenerateSize
+_pwgInitSize
+_pwgInputSlotForSource
+_pwgMediaForLegacy
+_pwgMediaForPPD
+_pwgMediaForPWG
+_pwgMediaForSize
+_pwgMediaNearSize
+_pwgMediaTable
+_pwgMediaTypeForType
+_pwgPageSizeForMedia
+cupsAddDest
+cupsAddOption
+cupsAdminCreateWindowsPPD
+cupsAdminExportSamba
+cupsAdminGetServerSettings
+cupsAdminSetServerSettings
+cupsArrayAdd
+cupsArrayClear
+cupsArrayCount
+cupsArrayCurrent
+cupsArrayDelete
+cupsArrayDup
+cupsArrayFind
+cupsArrayFirst
+cupsArrayGetIndex
+cupsArrayGetInsert
+cupsArrayIndex
+cupsArrayInsert
+cupsArrayLast
+cupsArrayNew
+cupsArrayNew2
+cupsArrayNew3
+cupsArrayNext
+cupsArrayPrev
+cupsArrayRemove
+cupsArrayRestore
+cupsArraySave
+cupsArrayUserData
+cupsCancelDestJob
+cupsCancelJob
+cupsCancelJob2
+cupsCharsetToUTF8
+cupsCheckDestSupported
+cupsCloseDestJob
+cupsConnectDest
+cupsCopyDest
+cupsCopyDestConflicts
+cupsCopyDestInfo
+cupsCreateDestJob
+cupsCreateJob
+cupsDirClose
+cupsDirOpen
+cupsDirRead
+cupsDirRewind
+cupsDoAuthentication
+cupsDoFileRequest
+cupsDoIORequest
+cupsDoRequest
+cupsEncodeOptions
+cupsEncodeOptions2
+cupsEncryption
+cupsEnumDests
+cupsFileClose
+cupsFileCompression
+cupsFileEOF
+cupsFileFind
+cupsFileFlush
+cupsFileGetChar
+cupsFileGetConf
+cupsFileGetLine
+cupsFileGets
+cupsFileLock
+cupsFileNumber
+cupsFileOpen
+cupsFileOpenFd
+cupsFilePeekChar
+cupsFilePrintf
+cupsFilePutChar
+cupsFilePutConf
+cupsFilePuts
+cupsFileRead
+cupsFileRewind
+cupsFileSeek
+cupsFileStderr
+cupsFileStdin
+cupsFileStdout
+cupsFileTell
+cupsFileUnlock
+cupsFileWrite
+cupsFindDestDefault
+cupsFindDestReady
+cupsFindDestSupported
+cupsFinishDestDocument
+cupsFinishDocument
+cupsFreeDestInfo
+cupsFreeDests
+cupsFreeJobs
+cupsFreeOptions
+cupsGetClasses
+cupsGetConflicts
+cupsGetDefault
+cupsGetDefault2
+cupsGetDest
+cupsGetDestMediaByIndex
+cupsGetDestMediaByName
+cupsGetDestMediaBySize
+cupsGetDestMediaCount
+cupsGetDestMediaDefault
+cupsGetDestWithURI
+cupsGetDests
+cupsGetDests2
+cupsGetDevices
+cupsGetFd
+cupsGetFile
+cupsGetJobs
+cupsGetJobs2
+cupsGetNamedDest
+cupsGetOption
+cupsGetPPD
+cupsGetPPD2
+cupsGetPPD3
+cupsGetPassword
+cupsGetPassword2
+cupsGetPrinters
+cupsGetResponse
+cupsGetServerPPD
+cupsLangDefault
+cupsLangEncoding
+cupsLangFlush
+cupsLangFree
+cupsLangGet
+cupsLastError
+cupsLastErrorString
+cupsLocalizeDestMedia
+cupsLocalizeDestOption
+cupsLocalizeDestValue
+cupsMakeServerCredentials
+cupsMarkOptions
+cupsNotifySubject
+cupsNotifyText
+cupsParseOptions
+cupsPrintFile
+cupsPrintFile2
+cupsPrintFiles
+cupsPrintFiles2
+cupsPutFd
+cupsPutFile
+cupsReadResponseData
+cupsRemoveDest
+cupsRemoveOption
+cupsResolveConflicts
+cupsSendRequest
+cupsServer
+cupsSetClientCertCB
+cupsSetCredentials
+cupsSetDefaultDest
+cupsSetDests
+cupsSetDests2
+cupsSetEncryption
+cupsSetPasswordCB
+cupsSetPasswordCB2
+cupsSetServer
+cupsSetServerCertCB
+cupsSetServerCredentials
+cupsSetUser
+cupsSetUserAgent
+cupsStartDestDocument
+cupsStartDocument
+cupsTempFd
+cupsTempFile
+cupsTempFile2
+cupsUTF32ToUTF8
+cupsUTF8ToCharset
+cupsUTF8ToUTF32
+cupsUser
+cupsUserAgent
+cupsWriteRequestData
+httpAcceptConnection
+httpAddCredential
+httpAddrAny
+httpAddrClose
+httpAddrConnect
+httpAddrConnect2
+httpAddrCopyList
+httpAddrEqual
+httpAddrFamily
+httpAddrFreeList
+httpAddrGetList
+httpAddrLength
+httpAddrListen
+httpAddrLocalhost
+httpAddrLookup
+httpAddrPort
+httpAddrString
+httpAssembleURI
+httpAssembleURIf
+httpAssembleUUID
+httpBlocking
+httpCheck
+httpClearCookie
+httpClearFields
+httpClose
+httpCompareCredentials
+httpConnect
+httpConnect2
+httpConnectEncrypt
+httpCopyCredentials
+httpCredentialsAreValidForName
+httpCredentialsGetExpiration
+httpCredentialsGetTrust
+httpCredentialsString
+httpDecode64
+httpDecode64_2
+httpDelete
+httpEncode64
+httpEncode64_2
+httpEncryption
+httpError
+httpFieldValue
+httpFlush
+httpFlushWrite
+httpFreeCredentials
+httpGet
+httpGetActivity
+httpGetAddress
+httpGetAuthString
+httpGetBlocking
+httpGetContentEncoding
+httpGetCookie
+httpGetDateString
+httpGetDateString2
+httpGetDateTime
+httpGetEncryption
+httpGetExpect
+httpGetFd
+httpGetField
+httpGetHostByName
+httpGetHostname
+httpGetKeepAlive
+httpGetLength
+httpGetLength2
+httpGetPending
+httpGetReady
+httpGetRemaining
+httpGetState
+httpGetStatus
+httpGetSubField
+httpGetSubField2
+httpGetVersion
+httpGets
+httpHead
+httpInitialize
+httpIsChunked
+httpIsEncrypted
+httpLoadCredentials
+httpMD5
+httpMD5Final
+httpMD5String
+httpOptions
+httpPeek
+httpPost
+httpPrintf
+httpPut
+httpRead
+httpRead2
+httpReadRequest
+httpReconnect
+httpReconnect2
+httpResolveHostname
+httpSaveCredentials
+httpSeparate
+httpSeparate2
+httpSeparateURI
+httpSetAuthString
+httpSetCookie
+httpSetCredentials
+httpSetDefaultField
+httpSetExpect
+httpSetField
+httpSetKeepAlive
+httpSetLength
+httpSetTimeout
+httpShutdown
+httpStateString
+httpStatus
+httpTrace
+httpURIStatusString
+httpUpdate
+httpWait
+httpWrite
+httpWrite2
+httpWriteResponse
+ippAddBoolean
+ippAddBooleans
+ippAddCollection
+ippAddCollections
+ippAddDate
+ippAddInteger
+ippAddIntegers
+ippAddOctetString
+ippAddOutOfBand
+ippAddRange
+ippAddRanges
+ippAddResolution
+ippAddResolutions
+ippAddSeparator
+ippAddString
+ippAddStringf
+ippAddStringfv
+ippAddStrings
+ippAttributeString
+ippContainsInteger
+ippContainsString
+ippCopyAttribute
+ippCopyAttributes
+ippCreateRequestedArray
+ippDateToTime
+ippDelete
+ippDeleteAttribute
+ippDeleteValues
+ippEnumString
+ippEnumValue
+ippErrorString
+ippErrorValue
+ippFindAttribute
+ippFindNextAttribute
+ippFirstAttribute
+ippGetBoolean
+ippGetCollection
+ippGetCount
+ippGetDate
+ippGetGroupTag
+ippGetInteger
+ippGetName
+ippGetOctetString
+ippGetOperation
+ippGetRange
+ippGetRequestId
+ippGetResolution
+ippGetState
+ippGetStatusCode
+ippGetString
+ippGetValueTag
+ippGetVersion
+ippLength
+ippNew
+ippNewRequest
+ippNewResponse
+ippNextAttribute
+ippOpString
+ippOpValue
+ippPort
+ippRead
+ippReadFile
+ippReadIO
+ippSetBoolean
+ippSetCollection
+ippSetDate
+ippSetGroupTag
+ippSetInteger
+ippSetName
+ippSetOctetString
+ippSetOperation
+ippSetPort
+ippSetRange
+ippSetRequestId
+ippSetResolution
+ippSetState
+ippSetStatusCode
+ippSetString
+ippSetStringf
+ippSetStringfv
+ippSetValueTag
+ippSetVersion
+ippStateString
+ippTagString
+ippTagValue
+ippTimeToDate
+ippValidateAttribute
+ippValidateAttributes
+ippWrite
+ippWriteFile
+ippWriteIO
+ppdClose
+ppdCollect
+ppdCollect2
+ppdConflicts
+ppdEmit
+ppdEmitAfterOrder
+ppdEmitFd
+ppdEmitJCL
+ppdEmitJCLEnd
+ppdEmitString
+ppdErrorString
+ppdFindAttr
+ppdFindChoice
+ppdFindCustomOption
+ppdFindCustomParam
+ppdFindMarkedChoice
+ppdFindNextAttr
+ppdFindOption
+ppdFirstCustomParam
+ppdFirstOption
+ppdInstallableConflict
+ppdIsMarked
+ppdLastError
+ppdLocalize
+ppdLocalizeAttr
+ppdLocalizeIPPReason
+ppdLocalizeMarkerName
+ppdMarkDefaults
+ppdMarkOption
+ppdNextCustomParam
+ppdNextOption
+ppdOpen
+ppdOpen2
+ppdOpenFd
+ppdOpenFile
+ppdPageLength
+ppdPageSize
+ppdPageSizeLimits
+ppdPageWidth
+ppdSetConformance
+pwgFormatSizeName
+pwgInitSize
+pwgMediaForLegacy
+pwgMediaForPPD
+pwgMediaForPWG
+pwgMediaForSize
diff --git a/cups/libcups_s.exp b/cups/libcups_s.exp
deleted file mode 100644
index b8b2207..0000000
--- a/cups/libcups_s.exp
+++ /dev/null
@@ -1,85 +0,0 @@
-_cups_debug_fd
-_cupsBufferGet
-_cupsBufferRelease
-_cupsGet1284Values
-_cupsGetDests
-_cupsGetPassword
-_cupsGlobals
-_cupsLangPrintError
-_cupsLangPrintf
-_cupsLangPuts
-_cupsLangString
-_cupsMD5Append
-_cupsMD5Finish
-_cupsMD5Init
-_cupsMessageFree
-_cupsMessageLoad
-_cupsMessageLookup
-_cupsNextDelay
-_cupsSetError
-_cupsSetLocale
-_cupsSNMPClose
-_cupsSNMPCopyOID
-_cupsSNMPDefaultCommunity
-_cupsSNMPIsOID
-_cupsSNMPIsOIDPrefixed
-_cupsSNMPOIDToString
-_cupsSNMPOpen
-_cupsSNMPRead
-_cupsSNMPSetDebug
-_cupsSNMPStringToOID
-_cupsSNMPWalk
-_cupsSNMPWrite
-_cupsStrAlloc
-_cupsStrFlush
-_cupsStrFormatd
-_cupsStrFree
-_cupsStrRetain
-_cupsStrScand
-_cupsStrStatistics
-_cups_getifaddrs
-_cups_freeifaddrs
-_cups_strcpy
-_cups_strlcat
-_cups_strlcpy
-_httpAddrPort
-_httpAddrSetPort
-_httpAssembleUUID
-_httpBIOMethods
-_httpCreate
-_httpEncodeURI
-_httpPeek
-_httpResolveURI
-_httpSetTimeout
-_httpWait
-_ippFindOption
-_ppdFreeLanguages
-_ppdGetEncoding
-_ppdGetLanguages
-_ppdHashName
-_ppdLocalizedAttr
-_ppdNormalizeMakeAndModel
-_ppdOpen
-_ppdOpenFile
-_ppdParseOptions
-_pwgCreateWithFile
-_pwgDestroy
-_pwgWriteFile
-_pwgGenerateSize
-_pwgInitSize
-_pwgMediaForLegacy
-_pwgMediaForPPD
-_pwgMediaForPWG
-_pwgMediaForSize
-_pwgCreateWithPPD
-_pwgGetBin
-_pwgGetInputSlot
-_pwgGetMediaType
-_pwgGetOutputBin
-_pwgGetPageSize
-_pwgGetSize
-_pwgGetSource
-_pwgGetType
-_pwgInputSlotForSource
-_pwgMediaTypeForType
-_pwgPageSizeForMedia
diff --git a/cups/localize.c b/cups/localize.c
index 30ccda4..23faa55 100644
--- a/cups/localize.c
+++ b/cups/localize.c
@@ -1,42 +1,27 @@
/*
- * "$Id: localize.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: localize.c 12834 2015-08-06 13:56:32Z msweet $"
*
- * PPD localization routines for CUPS.
+ * PPD localization routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
*
- * This code and any derivative of it may be used and distributed
- * freely under the terms of the GNU General Public License when
- * used with GNU Ghostscript or its derivatives. Use of the code
- * (or any derivative of it) with software other than GNU
- * GhostScript (or its derivatives) is governed by the CUPS license
- * agreement.
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU Ghostscript or its derivatives. Use of the code
+ * (or any derivative of it) with software other than GNU
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * ppdLocalize() - Localize the PPD file to the current locale.
- * ppdLocalizeAttr() - Localize an attribute.
- * ppdLocalizeIPPReason() - Get the localized version of a cupsIPPReason
- * attribute.
- * ppdLocalizeMarkerName() - Get the localized version of a marker-names
- * attribute value.
- * _ppdFreeLanguages() - Free an array of languages from _ppdGetLanguages.
- * _ppdGetLanguages() - Get an array of languages from a PPD file.
- * _ppdHashName() - Generate a hash value for a device or profile
- * name.
- * _ppdLocalizedAttr() - Find a localized attribute.
- * ppd_ll_CC() - Get the current locale names.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -51,7 +36,7 @@
* Local functions...
*/
-static cups_lang_t *ppd_ll_CC(char *ll_CC, int ll_CC_size);
+static cups_lang_t *ppd_ll_CC(char *ll_CC, size_t ll_CC_size);
/*
@@ -263,8 +248,8 @@ ppdLocalizeIPPReason(
*bufptr, /* Pointer into buffer */
*bufend, /* Pointer to end of buffer */
*valptr; /* Pointer into value */
- int ch, /* Hex-encoded character */
- schemelen; /* Length of scheme name */
+ int ch; /* Hex-encoded character */
+ size_t schemelen; /* Length of scheme name */
/*
@@ -303,14 +288,14 @@ ppdLocalizeIPPReason(
const char *message = NULL; /* Localized message */
if (!strncmp(reason, "media-needed", 12))
- message = _("The paper tray needs to be filled.");
+ message = _("Load paper.");
else if (!strncmp(reason, "media-jam", 9))
- message = _("There is a paper jam.");
+ message = _("Paper jam.");
else if (!strncmp(reason, "offline", 7) ||
!strncmp(reason, "shutdown", 8))
message = _("The printer is not connected.");
else if (!strncmp(reason, "toner-low", 9))
- message = _("The printer is running low on toner.");
+ message = _("The printer is low on toner.");
else if (!strncmp(reason, "toner-empty", 11))
message = _("The printer may be out of toner.");
else if (!strncmp(reason, "cover-open", 10))
@@ -320,19 +305,19 @@ ppdLocalizeIPPReason(
else if (!strncmp(reason, "door-open", 9))
message = _("The printer's door is open.");
else if (!strncmp(reason, "input-tray-missing", 18))
- message = _("The paper tray is missing.");
+ message = _("Paper tray is missing.");
else if (!strncmp(reason, "media-low", 9))
- message = _("The paper tray is almost empty.");
+ message = _("Paper tray is almost empty.");
else if (!strncmp(reason, "media-empty", 11))
- message = _("The paper tray is empty.");
+ message = _("Paper tray is empty.");
else if (!strncmp(reason, "output-tray-missing", 19))
- message = _("The output bin is missing.");
+ message = _("Output bin is missing.");
else if (!strncmp(reason, "output-area-almost-full", 23))
- message = _("The output bin is almost full.");
+ message = _("Output bin is almost full.");
else if (!strncmp(reason, "output-area-full", 16))
- message = _("The output bin is full.");
+ message = _("Output bin is full.");
else if (!strncmp(reason, "marker-supply-low", 17))
- message = _("The printer is running low on ink.");
+ message = _("The printer is low on ink.");
else if (!strncmp(reason, "marker-supply-empty", 19))
message = _("The printer may be out of ink.");
else if (!strncmp(reason, "marker-waste-almost-full", 24))
@@ -405,9 +390,9 @@ ppdLocalizeIPPReason(
valptr ++;
if (isdigit(*valptr & 255))
- *bufptr++ = ch | (*valptr - '0');
+ *bufptr++ = (char)(ch | (*valptr - '0'));
else
- *bufptr++ = ch | (tolower(*valptr) - 'a' + 10);
+ *bufptr++ = (char)(ch | (tolower(*valptr) - 'a' + 10));
valptr ++;
}
else if (*valptr == '+')
@@ -644,8 +629,8 @@ _ppdGetLanguages(ppd_file_t *ppd) /* I - PPD file */
unsigned /* O - Hash value */
_ppdHashName(const char *name) /* I - Name to hash */
{
- int mult; /* Multiplier */
- unsigned hash = 0; /* Hash value */
+ unsigned mult, /* Multiplier */
+ hash = 0; /* Hash value */
for (mult = 1; *name && mult <= 128; mult ++, name ++)
@@ -679,8 +664,23 @@ _ppdLocalizedAttr(ppd_file_t *ppd, /* I - PPD file */
snprintf(lkeyword, sizeof(lkeyword), "%s.%s", ll_CC, keyword);
if ((attr = ppdFindAttr(ppd, lkeyword, spec)) == NULL)
{
- snprintf(lkeyword, sizeof(lkeyword), "%2.2s.%s", ll_CC, keyword);
- attr = ppdFindAttr(ppd, lkeyword, spec);
+ /*
+ * <rdar://problem/22130168>
+ *
+ * Hong Kong locale needs special handling... Sigh...
+ */
+
+ if (!strcmp(ll_CC, "zh_HK"))
+ {
+ snprintf(lkeyword, sizeof(lkeyword), "zh_TW.%s", keyword);
+ attr = ppdFindAttr(ppd, lkeyword, spec);
+ }
+
+ if (!attr)
+ {
+ snprintf(lkeyword, sizeof(lkeyword), "%2.2s.%s", ll_CC, keyword);
+ attr = ppdFindAttr(ppd, lkeyword, spec);
+ }
if (!attr)
{
@@ -727,8 +727,8 @@ _ppdLocalizedAttr(ppd_file_t *ppd, /* I - PPD file */
*/
static cups_lang_t * /* O - Current language */
-ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
- int ll_CC_size) /* I - Size of country-specific name */
+ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
+ size_t ll_CC_size) /* I - Size of country-specific name */
{
cups_lang_t *lang; /* Current language */
@@ -775,5 +775,5 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
/*
- * End of "$Id: localize.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: localize.c 12834 2015-08-06 13:56:32Z msweet $".
*/
diff --git a/cups/mark.c b/cups/mark.c
index 86bcc09..0c27628 100644
--- a/cups/mark.c
+++ b/cups/mark.c
@@ -1,39 +1,20 @@
/*
- * "$Id: mark.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mark.c 12258 2014-11-19 12:38:44Z msweet $"
*
- * Option marking routines for CUPS.
+ * Option marking routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsMarkOptions() - Mark command-line options in a PPD file.
- * ppdFindChoice() - Return a pointer to an option choice.
- * ppdFindMarkedChoice() - Return the marked choice for the specified option.
- * ppdFindOption() - Return a pointer to the specified option.
- * ppdIsMarked() - Check to see if an option is marked.
- * ppdMarkDefaults() - Mark all default options in the PPD file.
- * ppdMarkOption() - Mark an option in a PPD file and return the number
- * of conflicts.
- * ppdFirstOption() - Return the first option in the PPD file.
- * ppdNextOption() - Return the next option in the PPD file.
- * _ppdParseOptions() - Parse options from a PPD file.
- * ppd_debug_marked() - Output the marked array to stdout...
- * ppd_defaults() - Set the defaults for this group and all sub-groups.
- * ppd_mark_choices() - Mark one or more option choices from a string.
- * ppd_mark_option() - Quickly mark an option without checking for
- * conflicts.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -143,7 +124,7 @@ cupsMarkOptions(
* Extract the sub-option from the string...
*/
- for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
+ for (ptr = s; *val && *val != ',' && (size_t)(ptr - s) < (sizeof(s) - 1);)
*ptr++ = *val++;
*ptr++ = '\0';
@@ -195,7 +176,7 @@ cupsMarkOptions(
if (print_quality)
{
- pwg_pq = atoi(print_quality) - IPP_QUALITY_DRAFT;
+ pwg_pq = (_pwg_print_quality_t)(atoi(print_quality) - IPP_QUALITY_DRAFT);
if (pwg_pq < _PWG_PRINT_QUALITY_DRAFT)
pwg_pq = _PWG_PRINT_QUALITY_DRAFT;
else if (pwg_pq > _PWG_PRINT_QUALITY_HIGH)
@@ -316,7 +297,7 @@ cupsMarkOptions(
if (!isdigit(*ptr & 255))
break;
- if ((j = strtol(ptr, &ptr, 10)) < 3)
+ if ((j = (int)strtol(ptr, &ptr, 10)) < 3)
break;
/*
@@ -533,6 +514,12 @@ ppdMarkDefaults(ppd_file_t *ppd) /* I - PPD file record */
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
ppd_defaults(ppd, g);
+
+ /*
+ * Finally, tag any conflicts (API compatibility) once at the end.
+ */
+
+ ppdConflicts(ppd);
}
@@ -729,7 +716,7 @@ ppd_defaults(ppd_file_t *ppd, /* I - PPD file */
for (i = g->num_options, o = g->options; i > 0; i --, o ++)
if (_cups_strcasecmp(o->keyword, "PageRegion") != 0)
- ppdMarkOption(ppd, o->keyword, o->defchoice);
+ ppd_mark_option(ppd, o->keyword, o->defchoice);
for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++)
ppd_defaults(ppd, sg);
@@ -1097,5 +1084,5 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
/*
- * End of "$Id: mark.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mark.c 12258 2014-11-19 12:38:44Z msweet $".
*/
diff --git a/cups/md5-private.h b/cups/md5-private.h
index 5fe826c..7b94642 100644
--- a/cups/md5-private.h
+++ b/cups/md5-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: md5-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: md5-private.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Private MD5 definitions for CUPS.
*
@@ -75,5 +75,5 @@ void _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]);
#endif /* !_CUPS_MD5_PRIVATE_H_ */
/*
- * End of "$Id: md5-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: md5-private.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/md5.c b/cups/md5.c
index 9078938..8c87ac7 100644
--- a/cups/md5.c
+++ b/cups/md5.c
@@ -1,31 +1,30 @@
/*
- * "$Id: md5.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: md5.c 12124 2014-08-28 15:37:22Z msweet $"
*
- * Private MD5 implementation for CUPS.
+ * Private MD5 implementation for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 2005 by Easy Software Products
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2005 by Easy Software Products
+ * Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
*
- * Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
*
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
*
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
*
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- * L. Peter Deutsch
- * ghost@aladdin.com
+ * L. Peter Deutsch
+ * ghost@aladdin.com
*/
/*
Independent implementation of MD5 (RFC 1321).
@@ -133,7 +132,8 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
int i;
for (i = 0; i < 16; ++i, xp += 4)
- X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
+ X[i] = (unsigned)xp[0] + ((unsigned)xp[1] << 8) +
+ ((unsigned)xp[2] << 16) + ((unsigned)xp[3] << 24);
#else /* !ARCH_IS_BIG_ENDIAN */
@@ -291,7 +291,7 @@ _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
return;
/* Update the message length. */
- pms->count[1] += nbytes >> 29;
+ pms->count[1] += (unsigned)nbytes >> 29;
pms->count[0] += nbits;
if (pms->count[0] < nbits)
pms->count[1]++;
@@ -300,7 +300,7 @@ _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
if (offset) {
int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
- memcpy(pms->buf + offset, p, copy);
+ memcpy(pms->buf + offset, p, (size_t)copy);
if (offset + copy < 64)
return;
p += copy;
@@ -314,7 +314,7 @@ _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
/* Process a final partial block. */
if (left)
- memcpy(pms->buf, p, left);
+ memcpy(pms->buf, p, (size_t)left);
}
void
@@ -333,7 +333,7 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
for (i = 0; i < 8; ++i)
data[i] = (unsigned char)(pms->count[i >> 2] >> ((i & 3) << 3));
/* Pad to 56 bytes mod 64. */
- _cupsMD5Append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
+ _cupsMD5Append(pms, pad, (int)((55 - (pms->count[0] >> 3)) & 63) + 1);
/* Append the length. */
_cupsMD5Append(pms, data, 8);
for (i = 0; i < 16; ++i)
@@ -342,5 +342,5 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
/*
- * End of "$Id: md5.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: md5.c 12124 2014-08-28 15:37:22Z msweet $".
*/
diff --git a/cups/md5passwd.c b/cups/md5passwd.c
index b18e384..135282c 100644
--- a/cups/md5passwd.c
+++ b/cups/md5passwd.c
@@ -1,5 +1,5 @@
/*
- * "$Id: md5passwd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: md5passwd.c 10996 2013-05-29 11:51:34Z msweet $"
*
* MD5 password support for CUPS.
*
@@ -138,5 +138,5 @@ httpMD5String(const unsigned char *sum, /* I - MD5 sum data */
/*
- * End of "$Id: md5passwd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: md5passwd.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/notify.c b/cups/notify.c
index d07745d..7e5cebb 100644
--- a/cups/notify.c
+++ b/cups/notify.c
@@ -1,9 +1,9 @@
/*
- * "$Id: notify.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: notify.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Notification routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 2005-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -83,25 +83,25 @@ cupsNotifySubject(cups_lang_t *lang, /* I - Language data */
switch (job_state->values[0].integer)
{
- case IPP_JOB_PENDING :
+ case IPP_JSTATE_PENDING :
state = _cupsLangString(lang, _("pending"));
break;
- case IPP_JOB_HELD :
+ case IPP_JSTATE_HELD :
state = _cupsLangString(lang, _("held"));
break;
- case IPP_JOB_PROCESSING :
+ case IPP_JSTATE_PROCESSING :
state = _cupsLangString(lang, _("processing"));
break;
- case IPP_JOB_STOPPED :
+ case IPP_JSTATE_STOPPED :
state = _cupsLangString(lang, _("stopped"));
break;
- case IPP_JOB_CANCELED :
+ case IPP_JSTATE_CANCELED :
state = _cupsLangString(lang, _("canceled"));
break;
- case IPP_JOB_ABORTED :
+ case IPP_JSTATE_ABORTED :
state = _cupsLangString(lang, _("aborted"));
break;
- case IPP_JOB_COMPLETED :
+ case IPP_JSTATE_COMPLETED :
state = _cupsLangString(lang, _("completed"));
break;
default :
@@ -127,13 +127,13 @@ cupsNotifySubject(cups_lang_t *lang, /* I - Language data */
switch (printer_state->values[0].integer)
{
- case IPP_PRINTER_IDLE :
+ case IPP_PSTATE_IDLE :
state = _cupsLangString(lang, _("idle"));
break;
- case IPP_PRINTER_PROCESSING :
+ case IPP_PSTATE_PROCESSING :
state = _cupsLangString(lang, _("processing"));
break;
- case IPP_PRINTER_STOPPED :
+ case IPP_PSTATE_STOPPED :
state = _cupsLangString(lang, _("stopped"));
break;
default :
@@ -198,5 +198,5 @@ cupsNotifyText(cups_lang_t *lang, /* I - Language data */
/*
- * End of "$Id: notify.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: notify.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/options.c b/cups/options.c
index b1b2d41..49b16f1 100644
--- a/cups/options.c
+++ b/cups/options.c
@@ -1,29 +1,18 @@
/*
- * "$Id: options.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: options.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Option routines for CUPS.
+ * Option routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsAddOption() - Add an option to an option array.
- * cupsFreeOptions() - Free all memory used by options.
- * cupsGetOption() - Get an option value.
- * cupsParseOptions() - Parse options from a command-line argument.
- * cupsRemoveOption() - Remove an option from an option array.
- * _cupsGet1284Values() - Get 1284 device ID keys and values.
- * cups_compare_options() - Compare two options.
- * cups_find_option() - Find an option using a binary search.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -99,10 +88,9 @@ cupsAddOption(const char *name, /* I - Name of option */
if (num_options == 0)
temp = (cups_option_t *)malloc(sizeof(cups_option_t));
else
- temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) *
- (num_options + 1));
+ temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) * (size_t)(num_options + 1));
- if (temp == NULL)
+ if (!temp)
{
DEBUG_puts("3cupsAddOption: Unable to expand option array, returning 0");
return (0);
@@ -114,8 +102,7 @@ cupsAddOption(const char *name, /* I - Name of option */
{
DEBUG_printf(("4cupsAddOption: Shifting %d options...",
(int)(num_options - insert)));
- memmove(temp + insert + 1, temp + insert,
- (num_options - insert) * sizeof(cups_option_t));
+ memmove(temp + insert + 1, temp + insert, (size_t)(num_options - insert) * sizeof(cups_option_t));
}
temp += insert;
@@ -487,7 +474,7 @@ cupsRemoveOption(
_cupsStrFree(option->value);
if (i > 0)
- memmove(option, option + 1, i * sizeof(cups_option_t));
+ memmove(option, option + 1, (size_t)i * sizeof(cups_option_t));
}
/*
@@ -707,5 +694,5 @@ cups_find_option(
/*
- * End of "$Id: options.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: options.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/page.c b/cups/page.c
index ab3eec4..7c496c6 100644
--- a/cups/page.c
+++ b/cups/page.c
@@ -1,5 +1,5 @@
/*
- * "$Id: page.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: page.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Page size functions for CUPS.
*
@@ -392,5 +392,5 @@ ppdPageLength(ppd_file_t *ppd, /* I - PPD file */
/*
- * End of "$Id: page.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: page.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
index 2905051..49589f2 100644
--- a/cups/ppd-cache.c
+++ b/cups/ppd-cache.c
@@ -1,49 +1,17 @@
/*
- * "$Id: ppd-cache.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd-cache.c 12980 2015-11-17 21:23:32Z msweet $"
*
- * PPD cache implementation for CUPS.
+ * PPD cache implementation for CUPS.
*
- * Copyright 2010-2012 by Apple Inc.
+ * Copyright 2010-2015 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _ppdCacheCreateWithFile() - Create PPD cache and mapping data from a
- * written file.
- * _ppdCacheCreateWithPPD() - Create PWG mapping data from a PPD file.
- * _ppdCacheDestroy() - Free all memory used for PWG mapping data.
- * _ppdCacheGetBin() - Get the PWG output-bin keyword associated with
- * a PPD OutputBin.
- * _ppdCacheGetInputSlot() - Get the PPD InputSlot associated with the job
- * attributes or a keyword string.
- * _ppdCacheGetMediaType() - Get the PPD MediaType associated with the job
- * attributes or a keyword string.
- * _ppdCacheGetOutputBin() - Get the PPD OutputBin associated with the
- * keyword string.
- * _ppdCacheGetPageSize() - Get the PPD PageSize associated with the job
- * attributes or a keyword string.
- * _ppdCacheGetSize() - Get the PWG size associated with a PPD
- * PageSize.
- * _ppdCacheGetSource() - Get the PWG media-source associated with a PPD
- * InputSlot.
- * _ppdCacheGetType() - Get the PWG media-type associated with a PPD
- * MediaType.
- * _ppdCacheWriteFile() - Write PWG mapping data to a file.
- * _pwgInputSlotForSource() - Get the InputSlot name for the given PWG
- * media-source.
- * _pwgMediaTypeForType() - Get the MediaType name for the given PWG
- * media-type.
- * _pwgPageSizeForMedia() - Get the PageSize name for the given media.
- * pwg_ppdize_name() - Convert an IPP keyword to a PPD keyword.
- * pwg_unppdize_name() - Convert a PPD keyword to a lowercase IPP
- * keyword.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -68,12 +36,329 @@
static int pwg_compare_finishings(_pwg_finishings_t *a,
_pwg_finishings_t *b);
static void pwg_free_finishings(_pwg_finishings_t *f);
+static void pwg_free_material(_pwg_material_t *m);
static void pwg_ppdize_name(const char *ipp, char *name, size_t namesize);
+static void pwg_ppdize_resolution(ipp_attribute_t *attr, int element, int *xres, int *yres, char *name, size_t namesize);
static void pwg_unppdize_name(const char *ppd, char *name, size_t namesize,
const char *dashchars);
/*
+ * '_cupsConvertOptions()' - Convert printer options to standard IPP attributes.
+ *
+ * This functions converts PPD and CUPS-specific options to their standard IPP
+ * attributes and values and adds them to the specified IPP request.
+ */
+
+int /* O - New number of copies */
+_cupsConvertOptions(ipp_t *request, /* I - IPP request */
+ ppd_file_t *ppd, /* I - PPD file */
+ _ppd_cache_t *pc, /* I - PPD cache info */
+ ipp_attribute_t *media_col_sup,
+ /* I - media-col-supported values */
+ ipp_attribute_t *doc_handling_sup,
+ /* I - multiple-document-handling-supported values */
+ ipp_attribute_t *print_color_mode_sup,
+ /* I - Printer supports print-color-mode */
+ const char *user, /* I - User info */
+ const char *format, /* I - document-format value */
+ int copies, /* I - Number of copies */
+ int num_options, /* I - Number of options */
+ cups_option_t *options) /* I - Options */
+{
+ int i; /* Looping var */
+ const char *keyword; /* PWG keyword */
+ pwg_size_t *size; /* PWG media size */
+ ipp_t *media_col, /* media-col value */
+ *media_size; /* media-size value */
+ const char *media_source, /* media-source value */
+ *media_type, /* media-type value */
+ *collate_str, /* multiple-document-handling value */
+ *color_attr_name, /* Supported color attribute */
+ *mandatory; /* Mandatory attributes */
+ int num_finishings = 0, /* Number of finishing values */
+ finishings[10]; /* Finishing enum values */
+ ppd_choice_t *choice; /* Marked choice */
+
+
+ /*
+ * Send standard IPP attributes...
+ */
+
+ if (pc->password && (keyword = cupsGetOption("job-password", num_options, options)) != NULL && ippGetOperation(request) != IPP_OP_VALIDATE_JOB)
+ {
+ ippAddOctetString(request, IPP_TAG_OPERATION, "job-password", keyword, (int)strlen(keyword));
+
+ if ((keyword = cupsGetOption("job-password-encryption", num_options, options)) == NULL)
+ keyword = "none";
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "job-password-encryption", NULL, keyword);
+ }
+
+ if (pc->account_id)
+ {
+ if ((keyword = cupsGetOption("job-account-id", num_options, options)) == NULL)
+ keyword = cupsGetOption("job-billing", num_options, options);
+
+ if (keyword)
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-account-id", NULL, keyword);
+ }
+
+ if (pc->accounting_user_id)
+ {
+ if ((keyword = cupsGetOption("job-accounting-user-id", num_options, options)) == NULL)
+ keyword = user;
+
+ if (keyword)
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-accounting-user-id", NULL, keyword);
+ }
+
+ for (mandatory = (const char *)cupsArrayFirst(pc->mandatory); mandatory; mandatory = (const char *)cupsArrayNext(pc->mandatory))
+ {
+ if (strcmp(mandatory, "copies") &&
+ strcmp(mandatory, "destination-uris") &&
+ strcmp(mandatory, "finishings") &&
+ strcmp(mandatory, "job-account-id") &&
+ strcmp(mandatory, "job-accounting-user-id") &&
+ strcmp(mandatory, "job-password") &&
+ strcmp(mandatory, "job-password-encryption") &&
+ strcmp(mandatory, "media") &&
+ strncmp(mandatory, "media-col", 9) &&
+ strcmp(mandatory, "multiple-document-handling") &&
+ strcmp(mandatory, "output-bin") &&
+ strcmp(mandatory, "print-color-mode") &&
+ strcmp(mandatory, "print-quality") &&
+ strcmp(mandatory, "sides") &&
+ (keyword = cupsGetOption(mandatory, num_options, options)) != NULL)
+ {
+ _ipp_option_t *opt = _ippFindOption(mandatory);
+ /* Option type */
+ ipp_tag_t value_tag = opt ? opt->value_tag : IPP_TAG_NAME;
+ /* Value type */
+
+ switch (value_tag)
+ {
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ ippAddInteger(request, IPP_TAG_JOB, value_tag, mandatory, atoi(keyword));
+ break;
+ case IPP_TAG_BOOLEAN :
+ ippAddBoolean(request, IPP_TAG_JOB, mandatory, !_cups_strcasecmp(keyword, "true"));
+ break;
+ case IPP_TAG_RANGE :
+ {
+ int lower, upper; /* Range */
+
+ if (sscanf(keyword, "%d-%d", &lower, &upper) != 2)
+ lower = upper = atoi(keyword);
+
+ ippAddRange(request, IPP_TAG_JOB, mandatory, lower, upper);
+ }
+ break;
+ case IPP_TAG_STRING :
+ ippAddOctetString(request, IPP_TAG_JOB, mandatory, keyword, (int)strlen(keyword));
+ break;
+ default :
+ if (!strcmp(mandatory, "print-color-mode") && !strcmp(keyword, "monochrome"))
+ {
+ if (ippContainsString(print_color_mode_sup, "auto-monochrome"))
+ keyword = "auto-monochrome";
+ else if (ippContainsString(print_color_mode_sup, "process-monochrome") && !ippContainsString(print_color_mode_sup, "monochrome"))
+ keyword = "process-monochrome";
+ }
+
+ ippAddString(request, IPP_TAG_JOB, value_tag, mandatory, NULL, keyword);
+ break;
+ }
+ }
+ }
+
+ if ((keyword = cupsGetOption("PageSize", num_options, options)) == NULL)
+ keyword = cupsGetOption("media", num_options, options);
+
+ if ((size = _ppdCacheGetSize(pc, keyword)) != NULL)
+ {
+ /*
+ * Add a media-col value...
+ */
+
+ media_size = ippNew();
+ ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER,
+ "x-dimension", size->width);
+ ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER,
+ "y-dimension", size->length);
+
+ media_col = ippNew();
+ ippAddCollection(media_col, IPP_TAG_ZERO, "media-size", media_size);
+
+ media_source = _ppdCacheGetSource(pc, cupsGetOption("InputSlot",
+ num_options,
+ options));
+ media_type = _ppdCacheGetType(pc, cupsGetOption("MediaType",
+ num_options,
+ options));
+
+ for (i = 0; i < media_col_sup->num_values; i ++)
+ {
+ if (!strcmp(media_col_sup->values[i].string.text, "media-left-margin"))
+ ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-left-margin", size->left);
+ else if (!strcmp(media_col_sup->values[i].string.text, "media-bottom-margin"))
+ ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-bottom-margin", size->bottom);
+ else if (!strcmp(media_col_sup->values[i].string.text, "media-right-margin"))
+ ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-right-margin", size->right);
+ else if (!strcmp(media_col_sup->values[i].string.text, "media-top-margin"))
+ ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-top-margin", size->top);
+ else if (!strcmp(media_col_sup->values[i].string.text, "media-source") && media_source)
+ ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, "media-source", NULL, media_source);
+ else if (!strcmp(media_col_sup->values[i].string.text, "media-type") && media_type)
+ ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, "media-type", NULL, media_type);
+ }
+
+ ippAddCollection(request, IPP_TAG_JOB, "media-col", media_col);
+ }
+
+ if ((keyword = cupsGetOption("output-bin", num_options, options)) == NULL)
+ {
+ if ((choice = ppdFindMarkedChoice(ppd, "OutputBin")) != NULL)
+ keyword = _ppdCacheGetBin(pc, choice->choice);
+ }
+
+ if (keyword)
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-bin", NULL, keyword);
+
+ color_attr_name = print_color_mode_sup ? "print-color-mode" : "output-mode";
+
+ if ((keyword = cupsGetOption("print-color-mode", num_options, options)) == NULL)
+ {
+ if ((choice = ppdFindMarkedChoice(ppd, "ColorModel")) != NULL)
+ {
+ if (!_cups_strcasecmp(choice->choice, "Gray"))
+ keyword = "monochrome";
+ else
+ keyword = "color";
+ }
+ }
+
+ if (keyword && !strcmp(keyword, "monochrome"))
+ {
+ if (ippContainsString(print_color_mode_sup, "auto-monochrome"))
+ keyword = "auto-monochrome";
+ else if (ippContainsString(print_color_mode_sup, "process-monochrome") && !ippContainsString(print_color_mode_sup, "monochrome"))
+ keyword = "process-monochrome";
+ }
+
+ if (keyword)
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, color_attr_name, NULL, keyword);
+
+ if ((keyword = cupsGetOption("print-quality", num_options, options)) != NULL)
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", atoi(keyword));
+ else if ((choice = ppdFindMarkedChoice(ppd, "cupsPrintQuality")) != NULL)
+ {
+ if (!_cups_strcasecmp(choice->choice, "draft"))
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_DRAFT);
+ else if (!_cups_strcasecmp(choice->choice, "normal"))
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_NORMAL);
+ else if (!_cups_strcasecmp(choice->choice, "high"))
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_HIGH);
+ }
+
+ if ((keyword = cupsGetOption("sides", num_options, options)) != NULL)
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, keyword);
+ else if (pc->sides_option && (choice = ppdFindMarkedChoice(ppd, pc->sides_option)) != NULL)
+ {
+ if (!_cups_strcasecmp(choice->choice, pc->sides_1sided))
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "one-sided");
+ else if (!_cups_strcasecmp(choice->choice, pc->sides_2sided_long))
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "two-sided-long-edge");
+ if (!_cups_strcasecmp(choice->choice, pc->sides_2sided_short))
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "two-sided-short-edge");
+ }
+
+ /*
+ * Copies...
+ */
+
+ if ((keyword = cupsGetOption("multiple-document-handling", num_options, options)) != NULL)
+ {
+ if (strstr(keyword, "uncollated"))
+ keyword = "false";
+ else
+ keyword = "true";
+ }
+ else if ((keyword = cupsGetOption("collate", num_options, options)) == NULL)
+ keyword = "true";
+
+ if (format)
+ {
+ if (!_cups_strcasecmp(format, "image/gif") ||
+ !_cups_strcasecmp(format, "image/jp2") ||
+ !_cups_strcasecmp(format, "image/jpeg") ||
+ !_cups_strcasecmp(format, "image/png") ||
+ !_cups_strcasecmp(format, "image/tiff") ||
+ !_cups_strncasecmp(format, "image/x-", 8))
+ {
+ /*
+ * Collation makes no sense for single page image formats...
+ */
+
+ keyword = "false";
+ }
+ else if (!_cups_strncasecmp(format, "image/", 6) ||
+ !_cups_strcasecmp(format, "application/vnd.cups-raster"))
+ {
+ /*
+ * Multi-page image formats will have copies applied by the upstream
+ * filters...
+ */
+
+ copies = 1;
+ }
+ }
+
+ if (doc_handling_sup)
+ {
+ if (!_cups_strcasecmp(keyword, "true"))
+ collate_str = "separate-documents-collated-copies";
+ else
+ collate_str = "separate-documents-uncollated-copies";
+
+ for (i = 0; i < doc_handling_sup->num_values; i ++)
+ {
+ if (!strcmp(doc_handling_sup->values[i].string.text, collate_str))
+ {
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "multiple-document-handling", NULL, collate_str);
+ break;
+ }
+ }
+
+ if (i >= doc_handling_sup->num_values)
+ copies = 1;
+ }
+
+ /*
+ * Map finishing options...
+ */
+
+ num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options, (int)(sizeof(finishings) / sizeof(finishings[0])), finishings);
+ if (num_finishings > 0)
+ {
+ ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", num_finishings, finishings);
+
+ if (copies > 1 && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL)
+ {
+ /*
+ * Send job-pages-per-set attribute to apply finishings correctly...
+ */
+
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / copies);
+ }
+ }
+
+ return (copies);
+}
+
+
+/*
* '_ppdCacheCreateWithFile()' - Create PPD cache and mapping data from a
* written file.
*
@@ -88,8 +373,8 @@ _ppdCacheCreateWithFile(
{
cups_file_t *fp; /* File */
_ppd_cache_t *pc; /* PWG mapping data */
- _pwg_size_t *size; /* Current size */
- _pwg_map_t *map; /* Current map */
+ pwg_size_t *size; /* Current size */
+ pwg_map_t *map; /* Current map */
_pwg_finishings_t *finishings; /* Current finishings option */
int linenum, /* Current line number */
num_bins, /* Number of bins in file */
@@ -118,7 +403,7 @@ _ppdCacheCreateWithFile(
if (!filename)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (NULL);
}
@@ -128,7 +413,7 @@ _ppdCacheCreateWithFile(
if ((fp = cupsFileOpen(filename, "r")) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
return (NULL);
}
@@ -138,7 +423,7 @@ _ppdCacheCreateWithFile(
if (!cupsFileGets(fp, line, sizeof(line)))
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
DEBUG_puts("_ppdCacheCreateWithFile: Unable to read first line.");
cupsFileClose(fp);
return (NULL);
@@ -146,7 +431,7 @@ _ppdCacheCreateWithFile(
if (strncmp(line, "#CUPS-PPD-CACHE-", 16))
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
DEBUG_printf(("_ppdCacheCreateWithFile: Wrong first line \"%s\".", line));
cupsFileClose(fp);
return (NULL);
@@ -154,7 +439,7 @@ _ppdCacheCreateWithFile(
if (atoi(line + 16) != _PPD_CACHE_VERSION)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Out of date PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Out of date PPD cache file."), 1);
DEBUG_printf(("_ppdCacheCreateWithFile: Cache file has version %s, "
"expected %d.", line + 16, _PPD_CACHE_VERSION));
cupsFileClose(fp);
@@ -167,7 +452,7 @@ _ppdCacheCreateWithFile(
if ((pc = calloc(1, sizeof(_ppd_cache_t))) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
DEBUG_puts("_ppdCacheCreateWithFile: Unable to allocate _ppd_cache_t.");
goto create_error;
}
@@ -193,9 +478,56 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Missing value on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
+ else if (!_cups_strcasecmp(line, "3D"))
+ {
+ pc->cups_3d = _cupsStrAlloc(value);
+ }
+ else if (!_cups_strcasecmp(line, "LayerOrder"))
+ {
+ pc->cups_layer_order = _cupsStrAlloc(value);
+ }
+ else if (!_cups_strcasecmp(line, "Accuracy"))
+ {
+ sscanf(value, "%d%d%d", pc->cups_accuracy + 0, pc->cups_accuracy + 1, pc->cups_accuracy + 2);
+ }
+ else if (!_cups_strcasecmp(line, "Volume"))
+ {
+ sscanf(value, "%d%d%d", pc->cups_volume + 0, pc->cups_volume + 1, pc->cups_volume + 2);
+ }
+ else if (!_cups_strcasecmp(line, "Material"))
+ {
+ /*
+ * Material key "name" name=value ... name=value
+ */
+
+ if ((valueptr = strchr(value, ' ')) != NULL)
+ {
+ _pwg_material_t *material = (_pwg_material_t *)calloc(1, sizeof(_pwg_material_t));
+
+ *valueptr++ = '\0';
+
+ material->key = _cupsStrAlloc(value);
+
+ if (*valueptr == '\"')
+ {
+ value = valueptr + 1;
+ if ((valueptr = strchr(value, '\"')) != NULL)
+ {
+ *valueptr++ = '\0';
+ material->name = _cupsStrAlloc(value);
+ material->num_props = cupsParseOptions(valueptr, 0, &material->props);
+ }
+ }
+
+ if (!pc->materials)
+ pc->materials = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_material);
+
+ cupsArrayAdd(pc->materials, material);
+ }
+ }
else if (!_cups_strcasecmp(line, "Filter"))
{
if (!pc->filters)
@@ -231,13 +563,13 @@ _ppdCacheCreateWithFile(
if (attrs && *attrs)
{
DEBUG_puts("_ppdCacheCreateWithFile: IPP listed multiple times.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
else if (length <= 0)
{
DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP length.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -250,10 +582,10 @@ _ppdCacheCreateWithFile(
*attrs = ippNew();
if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL,
- *attrs) != IPP_DATA)
+ *attrs) != IPP_STATE_DATA)
{
DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
}
@@ -269,7 +601,7 @@ _ppdCacheCreateWithFile(
if (cupsFileTell(fp) != (pos + length))
{
DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
}
@@ -278,7 +610,7 @@ _ppdCacheCreateWithFile(
if (num_bins > 0)
{
DEBUG_puts("_ppdCacheCreateWithFile: NumBins listed multiple times.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -286,15 +618,15 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumBins value %d on line "
"%d.", num_sizes, linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
- if ((pc->bins = calloc(num_bins, sizeof(_pwg_map_t))) == NULL)
+ if ((pc->bins = calloc((size_t)num_bins, sizeof(pwg_map_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d bins.",
num_sizes));
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
goto create_error;
}
}
@@ -303,7 +635,7 @@ _ppdCacheCreateWithFile(
if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2)
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad Bin on line %d.", linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -311,7 +643,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Too many Bin's on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -326,7 +658,7 @@ _ppdCacheCreateWithFile(
if (num_sizes > 0)
{
DEBUG_puts("_ppdCacheCreateWithFile: NumSizes listed multiple times.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -334,17 +666,17 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSizes value %d on line "
"%d.", num_sizes, linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
if (num_sizes > 0)
{
- if ((pc->sizes = calloc(num_sizes, sizeof(_pwg_size_t))) == NULL)
+ if ((pc->sizes = calloc((size_t)num_sizes, sizeof(pwg_size_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d sizes.",
num_sizes));
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
goto create_error;
}
}
@@ -355,7 +687,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Too many Size's on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -367,7 +699,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad Size on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -382,7 +714,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Too many CustomSize's on line "
"%d.", linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -394,16 +726,16 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad CustomSize on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
- _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
- pc->custom_max_width, pc->custom_max_length);
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
+ pc->custom_max_width, pc->custom_max_length, NULL);
pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
- _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
- pc->custom_min_width, pc->custom_min_length);
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
+ pc->custom_min_width, pc->custom_min_length, NULL);
pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
}
else if (!_cups_strcasecmp(line, "SourceOption"))
@@ -416,7 +748,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_puts("_ppdCacheCreateWithFile: NumSources listed multiple "
"times.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -424,15 +756,15 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSources value %d on "
"line %d.", num_sources, linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
- if ((pc->sources = calloc(num_sources, sizeof(_pwg_map_t))) == NULL)
+ if ((pc->sources = calloc((size_t)num_sources, sizeof(pwg_map_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d sources.",
num_sources));
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
goto create_error;
}
}
@@ -442,7 +774,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad Source on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -450,7 +782,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Too many Source's on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -465,7 +797,7 @@ _ppdCacheCreateWithFile(
if (num_types > 0)
{
DEBUG_puts("_ppdCacheCreateWithFile: NumTypes listed multiple times.");
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -473,15 +805,15 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumTypes value %d on "
"line %d.", num_types, linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
- if ((pc->types = calloc(num_types, sizeof(_pwg_map_t))) == NULL)
+ if ((pc->types = calloc((size_t)num_types, sizeof(pwg_map_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d types.",
num_types));
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
goto create_error;
}
}
@@ -491,7 +823,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad Type on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -499,7 +831,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Too many Type's on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -526,7 +858,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Bad Preset on line %d.",
linenum));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -553,7 +885,7 @@ _ppdCacheCreateWithFile(
if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL)
goto create_error;
- finishings->value = strtol(value, &valueptr, 10);
+ finishings->value = (ipp_finishings_t)strtol(value, &valueptr, 10);
finishings->num_options = cupsParseOptions(valueptr, 0,
&(finishings->options));
@@ -561,6 +893,30 @@ _ppdCacheCreateWithFile(
}
else if (!_cups_strcasecmp(line, "MaxCopies"))
pc->max_copies = atoi(value);
+ else if (!_cups_strcasecmp(line, "ChargeInfoURI"))
+ pc->charge_info_uri = _cupsStrAlloc(value);
+ else if (!_cups_strcasecmp(line, "JobAccountId"))
+ pc->account_id = !_cups_strcasecmp(value, "true");
+ else if (!_cups_strcasecmp(line, "JobAccountingUserId"))
+ pc->accounting_user_id = !_cups_strcasecmp(value, "true");
+ else if (!_cups_strcasecmp(line, "JobPassword"))
+ pc->password = _cupsStrAlloc(value);
+ else if (!_cups_strcasecmp(line, "Mandatory"))
+ {
+ if (pc->mandatory)
+ _cupsArrayAddStrings(pc->mandatory, value, ' ');
+ else
+ pc->mandatory = _cupsArrayNewStrings(value, ' ');
+ }
+ else if (!_cups_strcasecmp(line, "SupportFile"))
+ {
+ if (!pc->support_files)
+ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
+ (cups_acopy_func_t)_cupsStrAlloc,
+ (cups_afree_func_t)_cupsStrFree);
+
+ cupsArrayAdd(pc->support_files, value);
+ }
else
{
DEBUG_printf(("_ppdCacheCreateWithFile: Unknown %s on line %d.", line,
@@ -572,7 +928,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sizes (%d < %d).",
pc->num_sizes, num_sizes));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -580,7 +936,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sources (%d < %d).",
pc->num_sources, num_sources));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -588,7 +944,7 @@ _ppdCacheCreateWithFile(
{
DEBUG_printf(("_ppdCacheCreateWithFile: Not enough types (%d < %d).",
pc->num_types, num_types));
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
goto create_error;
}
@@ -630,24 +986,24 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
*color_model, /* ColorModel option */
*duplex; /* Duplex option */
ppd_choice_t *choice; /* Current InputSlot/MediaType */
- _pwg_map_t *map; /* Current source/type map */
+ pwg_map_t *map; /* Current source/type map */
ppd_attr_t *ppd_attr; /* Current PPD preset attribute */
int num_options; /* Number of preset options and props */
cups_option_t *options; /* Preset options and properties */
ppd_size_t *ppd_size; /* Current PPD size */
- _pwg_size_t *pwg_size; /* Current PWG size */
+ pwg_size_t *pwg_size; /* Current PWG size */
char pwg_keyword[3 + PPD_MAX_NAME + 1 + 12 + 1 + 12 + 3],
/* PWG keyword string */
ppd_name[PPD_MAX_NAME];
/* Normalized PPD name */
const char *pwg_name; /* Standard PWG media name */
- _pwg_media_t *pwg_media; /* PWG media data */
+ pwg_media_t *pwg_media; /* PWG media data */
_pwg_print_color_mode_t pwg_print_color_mode;
/* print-color-mode index */
_pwg_print_quality_t pwg_print_quality;
/* print-quality index */
int similar; /* Are the old and new size similar? */
- _pwg_size_t *old_size; /* Current old size */
+ pwg_size_t *old_size; /* Current old size */
int old_imageable, /* Old imageable length in 2540ths */
old_borderless, /* Old borderless state */
old_known_pwg; /* Old PWG name is well-known */
@@ -660,7 +1016,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
new_imageable, /* New imageable length in 2540ths */
new_borderless, /* New borderless state */
new_known_pwg; /* New PWG name is well-known */
- _pwg_size_t *new_size; /* New size to add, if any */
+ pwg_size_t *new_size; /* New size to add, if any */
const char *filter; /* Current filter */
_pwg_finishings_t *finishings; /* Current finishings value */
@@ -690,10 +1046,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
if (ppd->num_sizes > 0)
{
- if ((pc->sizes = calloc(ppd->num_sizes, sizeof(_pwg_size_t))) == NULL)
+ if ((pc->sizes = calloc((size_t)ppd->num_sizes, sizeof(pwg_size_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d "
- "_pwg_size_t's.", ppd->num_sizes));
+ "pwg_size_t's.", ppd->num_sizes));
goto create_error;
}
@@ -712,7 +1068,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* Convert the PPD size name to the corresponding PWG keyword name.
*/
- if ((pwg_media = _pwgMediaForPPD(ppd_size->name)) != NULL)
+ if ((pwg_media = pwgMediaForPPD(ppd_size->name)) != NULL)
{
/*
* Standard name, do we have conflicts?
@@ -747,9 +1103,9 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
new_known_pwg = 0;
pwg_unppdize_name(ppd_size->name, ppd_name, sizeof(ppd_name), "_.");
- _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name,
- _PWG_FROMPTS(ppd_size->width),
- _PWG_FROMPTS(ppd_size->length));
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name,
+ PWG_FROM_POINTS(ppd_size->width),
+ PWG_FROM_POINTS(ppd_size->length), NULL);
}
/*
@@ -758,16 +1114,17 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* dimensions that are <= 0...
*/
- if ((pwg_media = _pwgMediaForSize(_PWG_FROMPTS(ppd_size->width),
- _PWG_FROMPTS(ppd_size->length))) == NULL)
+ if ((pwg_media = _pwgMediaNearSize(PWG_FROM_POINTS(ppd_size->width),
+ PWG_FROM_POINTS(ppd_size->length),
+ 0)) == NULL)
continue;
new_width = pwg_media->width;
new_length = pwg_media->length;
- new_left = _PWG_FROMPTS(ppd_size->left);
- new_bottom = _PWG_FROMPTS(ppd_size->bottom);
- new_right = _PWG_FROMPTS(ppd_size->width - ppd_size->right);
- new_top = _PWG_FROMPTS(ppd_size->length - ppd_size->top);
+ new_left = PWG_FROM_POINTS(ppd_size->left);
+ new_bottom = PWG_FROM_POINTS(ppd_size->bottom);
+ new_right = PWG_FROM_POINTS(ppd_size->width - ppd_size->right);
+ new_top = PWG_FROM_POINTS(ppd_size->length - ppd_size->top);
new_imageable = new_length - new_top - new_bottom;
new_borderless = new_bottom == 0 && new_top == 0 &&
new_left == 0 && new_right == 0;
@@ -836,24 +1193,24 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* Generate custom size data...
*/
- _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
- _PWG_FROMPTS(ppd->custom_max[0]),
- _PWG_FROMPTS(ppd->custom_max[1]));
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
+ PWG_FROM_POINTS(ppd->custom_max[0]),
+ PWG_FROM_POINTS(ppd->custom_max[1]), NULL);
pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
- pc->custom_max_width = _PWG_FROMPTS(ppd->custom_max[0]);
- pc->custom_max_length = _PWG_FROMPTS(ppd->custom_max[1]);
+ pc->custom_max_width = PWG_FROM_POINTS(ppd->custom_max[0]);
+ pc->custom_max_length = PWG_FROM_POINTS(ppd->custom_max[1]);
- _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
- _PWG_FROMPTS(ppd->custom_min[0]),
- _PWG_FROMPTS(ppd->custom_min[1]));
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
+ PWG_FROM_POINTS(ppd->custom_min[0]),
+ PWG_FROM_POINTS(ppd->custom_min[1]), NULL);
pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
- pc->custom_min_width = _PWG_FROMPTS(ppd->custom_min[0]);
- pc->custom_min_length = _PWG_FROMPTS(ppd->custom_min[1]);
+ pc->custom_min_width = PWG_FROM_POINTS(ppd->custom_min[0]);
+ pc->custom_min_length = PWG_FROM_POINTS(ppd->custom_min[1]);
- pc->custom_size.left = _PWG_FROMPTS(ppd->custom_margins[0]);
- pc->custom_size.bottom = _PWG_FROMPTS(ppd->custom_margins[1]);
- pc->custom_size.right = _PWG_FROMPTS(ppd->custom_margins[2]);
- pc->custom_size.top = _PWG_FROMPTS(ppd->custom_margins[3]);
+ pc->custom_size.left = PWG_FROM_POINTS(ppd->custom_margins[0]);
+ pc->custom_size.bottom = PWG_FROM_POINTS(ppd->custom_margins[1]);
+ pc->custom_size.right = PWG_FROM_POINTS(ppd->custom_margins[2]);
+ pc->custom_size.top = PWG_FROM_POINTS(ppd->custom_margins[3]);
}
/*
@@ -867,11 +1224,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
{
pc->source_option = _cupsStrAlloc(input_slot->keyword);
- if ((pc->sources = calloc(input_slot->num_choices,
- sizeof(_pwg_map_t))) == NULL)
+ if ((pc->sources = calloc((size_t)input_slot->num_choices, sizeof(pwg_map_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d "
- "_pwg_map_t's for InputSlot.", input_slot->num_choices));
+ "pwg_map_t's for InputSlot.", input_slot->num_choices));
goto create_error;
}
@@ -929,11 +1285,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
if ((media_type = ppdFindOption(ppd, "MediaType")) != NULL)
{
- if ((pc->types = calloc(media_type->num_choices,
- sizeof(_pwg_map_t))) == NULL)
+ if ((pc->types = calloc((size_t)media_type->num_choices, sizeof(pwg_map_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d "
- "_pwg_map_t's for MediaType.", media_type->num_choices));
+ "pwg_map_t's for MediaType.", media_type->num_choices));
goto create_error;
}
@@ -994,11 +1349,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
if ((output_bin = ppdFindOption(ppd, "OutputBin")) != NULL)
{
- if ((pc->bins = calloc(output_bin->num_choices,
- sizeof(_pwg_map_t))) == NULL)
+ if ((pc->bins = calloc((size_t)output_bin->num_choices, sizeof(pwg_map_t))) == NULL)
{
DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d "
- "_pwg_map_t's for OutputBin.", output_bin->num_choices));
+ "pwg_map_t's for OutputBin.", output_bin->num_choices));
goto create_error;
}
@@ -1178,7 +1532,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
num_options = pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR]
[pwg_print_quality];
- options = calloc(sizeof(cups_option_t), num_options);
+ options = calloc(sizeof(cups_option_t), (size_t)num_options);
if (options)
{
@@ -1347,7 +1701,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL)
goto create_error;
- finishings->value = atoi(ppd_attr->spec);
+ finishings->value = (ipp_finishings_t)atoi(ppd_attr->spec);
finishings->num_options = _ppdParseOptions(ppd_attr->value, 0,
&(finishings->options),
_PPD_PARSE_OPTIONS);
@@ -1370,6 +1724,78 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
pc->max_copies = 9999;
/*
+ * cupsChargeInfoURI, cupsJobAccountId, cupsJobAccountingUserId,
+ * cupsJobPassword, and cupsMandatory.
+ */
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsChargeInfoURI", NULL)) != NULL)
+ pc->charge_info_uri = _cupsStrAlloc(ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsJobAccountId", NULL)) != NULL)
+ pc->account_id = !_cups_strcasecmp(ppd_attr->value, "true");
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsJobAccountingUserId", NULL)) != NULL)
+ pc->accounting_user_id = !_cups_strcasecmp(ppd_attr->value, "true");
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsJobPassword", NULL)) != NULL)
+ pc->password = _cupsStrAlloc(ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL)
+ pc->mandatory = _cupsArrayNewStrings(ppd_attr->value, ' ');
+
+ /*
+ * Support files...
+ */
+
+ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
+ (cups_acopy_func_t)_cupsStrAlloc,
+ (cups_afree_func_t)_cupsStrFree);
+
+ for (ppd_attr = ppdFindAttr(ppd, "cupsICCProfile", NULL);
+ ppd_attr;
+ ppd_attr = ppdFindNextAttr(ppd, "cupsICCProfile", NULL))
+ cupsArrayAdd(pc->support_files, ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "APPrinterIconPath", NULL)) != NULL)
+ cupsArrayAdd(pc->support_files, ppd_attr->value);
+
+ /*
+ * 3D stuff...
+ */
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cups3D", NULL)) != NULL)
+ pc->cups_3d = _cupsStrAlloc(ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsLayerOrder", NULL)) != NULL)
+ pc->cups_layer_order = _cupsStrAlloc(ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsAccuracy", NULL)) != NULL)
+ sscanf(ppd_attr->value, "%d%d%d", pc->cups_accuracy + 0, pc->cups_accuracy + 1, pc->cups_accuracy + 2);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsVolume", NULL)) != NULL)
+ sscanf(ppd_attr->value, "%d%d%d", pc->cups_volume + 0, pc->cups_volume + 1, pc->cups_volume + 2);
+
+ for (ppd_attr = ppdFindAttr(ppd, "cupsMaterial", NULL);
+ ppd_attr;
+ ppd_attr = ppdFindNextAttr(ppd, "cupsMaterial", NULL))
+ {
+ /*
+ * *cupsMaterial key/name: "name=value ... name=value"
+ */
+
+ _pwg_material_t *material = (_pwg_material_t *)calloc(1, sizeof(_pwg_material_t));
+
+ material->key = _cupsStrAlloc(ppd_attr->name);
+ material->name = _cupsStrAlloc(ppd_attr->text);
+ material->num_props = cupsParseOptions(ppd_attr->value, 0, &material->props);
+
+ if (!pc->materials)
+ pc->materials = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_material);
+
+ cupsArrayAdd(pc->materials, material);
+ }
+
+ /*
* Return the cache data...
*/
@@ -1381,7 +1807,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
create_error:
- _cupsSetError(IPP_INTERNAL_ERROR, _("Out of memory."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Out of memory."), 1);
_ppdCacheDestroy(pc);
return (NULL);
@@ -1396,8 +1822,8 @@ void
_ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
{
int i; /* Looping var */
- _pwg_map_t *map; /* Current map */
- _pwg_size_t *size; /* Current size */
+ pwg_map_t *map; /* Current map */
+ pwg_size_t *size; /* Current size */
/*
@@ -1469,6 +1895,18 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
cupsArrayDelete(pc->prefilters);
cupsArrayDelete(pc->finishings);
+ _cupsStrFree(pc->charge_info_uri);
+ _cupsStrFree(pc->password);
+
+ cupsArrayDelete(pc->mandatory);
+
+ cupsArrayDelete(pc->support_files);
+
+ _cupsStrFree(pc->cups_3d);
+ _cupsStrFree(pc->cups_layer_order);
+
+ cupsArrayDelete(pc->materials);
+
free(pc);
}
@@ -1513,11 +1951,11 @@ _ppdCacheGetBin(
int /* O - New number of options */
_ppdCacheGetFinishingOptions(
- _ppd_cache_t *pc, /* I - PPD cache and mapping data */
- ipp_t *job, /* I - Job attributes or NULL */
- ipp_finish_t value, /* I - IPP finishings value of IPP_FINISHINGS_NONE */
- int num_options, /* I - Number of options */
- cups_option_t **options) /* IO - Options */
+ _ppd_cache_t *pc, /* I - PPD cache and mapping data */
+ ipp_t *job, /* I - Job attributes or NULL */
+ ipp_finishings_t value, /* I - IPP finishings value of IPP_FINISHINGS_NONE */
+ int num_options, /* I - Number of options */
+ cups_option_t **options) /* IO - Options */
{
int i; /* Looping var */
_pwg_finishings_t *f, /* PWG finishings options */
@@ -1544,7 +1982,7 @@ _ppdCacheGetFinishingOptions(
for (i = 0; i < num_values; i ++)
{
- key.value = ippGetInteger(attr, i);
+ key.value = (ipp_finishings_t)ippGetInteger(attr, i);
if ((f = cupsArrayFind(pc->finishings, &key)) != NULL)
{
@@ -1598,8 +2036,13 @@ _ppdCacheGetFinishingValues(
* Range check input...
*/
+ DEBUG_printf(("_ppdCacheGetFinishingValues(pc=%p, num_options=%d, options=%p, max_values=%d, values=%p)", pc, num_options, options, max_values, values));
+
if (!pc || !pc->finishings || num_options < 1 || max_values < 1 || !values)
+ {
+ DEBUG_puts("_ppdCacheGetFinishingValues: Bad arguments, returning 0.");
return (0);
+ }
/*
* Go through the finishings options and see what is set...
@@ -1609,13 +2052,24 @@ _ppdCacheGetFinishingValues(
f;
f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings))
{
+ DEBUG_printf(("_ppdCacheGetFinishingValues: Checking %d (%s)", f->value, ippEnumString("finishings", f->value)));
+
for (i = f->num_options, option = f->options; i > 0; i --, option ++)
+ {
+ DEBUG_printf(("_ppdCacheGetFinishingValues: %s=%s?", option->name, option->value));
+
if ((val = cupsGetOption(option->name, num_options, options)) == NULL ||
_cups_strcasecmp(option->value, val))
+ {
+ DEBUG_puts("_ppdCacheGetFinishingValues: NO");
break;
+ }
+ }
if (i == 0)
{
+ DEBUG_printf(("_ppdCacheGetFinishingValues: Adding %d.", f->value));
+
values[num_values ++] = f->value;
if (num_values >= max_values)
@@ -1623,6 +2077,8 @@ _ppdCacheGetFinishingValues(
}
}
+ DEBUG_printf(("_ppdCacheGetFinishingValues: Returning %d.", num_values));
+
return (num_values);
}
@@ -1653,7 +2109,7 @@ _ppdCacheGetInputSlot(
ipp_attribute_t *media_col, /* media-col attribute */
*media_source; /* media-source attribute */
- _pwg_size_t size; /* Dimensional size */
+ pwg_size_t size; /* Dimensional size */
int margins_set; /* Were the margins set? */
media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION);
@@ -1668,7 +2124,7 @@ _ppdCacheGetInputSlot(
keyword = ippGetString(media_source, 0, NULL);
}
- else if (_pwgInitSize(&size, job, &margins_set))
+ else if (pwgInitSize(&size, job, &margins_set))
{
/*
* For media <= 5x7, look for a photo tray...
@@ -1792,7 +2248,7 @@ _ppdCacheGetPageSize(
int *exact) /* O - 1 if exact match, 0 otherwise */
{
int i; /* Looping var */
- _pwg_size_t *size, /* Current size */
+ pwg_size_t *size, /* Current size */
*closest, /* Closest size */
jobsize; /* Size data from job */
int margins_set, /* Were the margins set? */
@@ -1880,7 +2336,7 @@ _ppdCacheGetPageSize(
* media-col.
*/
- if (!_pwgInitSize(&jobsize, job, &margins_set))
+ if (!pwgInitSize(&jobsize, job, &margins_set))
return (NULL);
}
else
@@ -1889,12 +2345,12 @@ _ppdCacheGetPageSize(
* Get the size using a media keyword...
*/
- _pwg_media_t *media; /* Media definition */
+ pwg_media_t *media; /* Media definition */
- if ((media = _pwgMediaForPWG(keyword)) == NULL)
- if ((media = _pwgMediaForLegacy(keyword)) == NULL)
- if ((media = _pwgMediaForPPD(keyword)) == NULL)
+ if ((media = pwgMediaForPWG(keyword)) == NULL)
+ if ((media = pwgMediaForLegacy(keyword)) == NULL)
+ if ((media = pwgMediaForPPD(keyword)) == NULL)
return (NULL);
jobsize.width = media->width;
@@ -1987,7 +2443,7 @@ _ppdCacheGetPageSize(
*/
snprintf(pc->custom_ppd_size, sizeof(pc->custom_ppd_size), "Custom.%dx%d",
- (int)_PWG_TOPTS(jobsize.width), (int)_PWG_TOPTS(jobsize.length));
+ (int)PWG_TO_POINTS(jobsize.width), (int)PWG_TO_POINTS(jobsize.length));
if (margins_set && exact)
{
@@ -2023,14 +2479,14 @@ _ppdCacheGetPageSize(
* '_ppdCacheGetSize()' - Get the PWG size associated with a PPD PageSize.
*/
-_pwg_size_t * /* O - PWG size or NULL */
+pwg_size_t * /* O - PWG size or NULL */
_ppdCacheGetSize(
_ppd_cache_t *pc, /* I - PPD cache and mapping data */
const char *page_size) /* I - PPD PageSize */
{
int i; /* Looping var */
- _pwg_media_t *media; /* Media */
- _pwg_size_t *size; /* Current size */
+ pwg_media_t *media; /* Media */
+ pwg_size_t *size; /* Current size */
/*
@@ -2116,9 +2572,9 @@ _ppdCacheGetSize(
* Look up standard sizes...
*/
- if ((media = _pwgMediaForPPD(page_size)) == NULL)
- if ((media = _pwgMediaForLegacy(page_size)) == NULL)
- media = _pwgMediaForPWG(page_size);
+ if ((media = pwgMediaForPPD(page_size)) == NULL)
+ if ((media = pwgMediaForLegacy(page_size)) == NULL)
+ media = pwgMediaForPWG(page_size);
if (media)
{
@@ -2143,7 +2599,7 @@ _ppdCacheGetSource(
const char *input_slot) /* I - PPD InputSlot */
{
int i; /* Looping var */
- _pwg_map_t *source; /* Current source */
+ pwg_map_t *source; /* Current source */
/*
@@ -2172,7 +2628,7 @@ _ppdCacheGetType(
const char *media_type) /* I - PPD MediaType */
{
int i; /* Looping var */
- _pwg_map_t *type; /* Current type */
+ pwg_map_t *type; /* Current type */
/*
@@ -2202,12 +2658,13 @@ _ppdCacheWriteFile(
{
int i, j, k; /* Looping vars */
cups_file_t *fp; /* Output file */
- _pwg_size_t *size; /* Current size */
- _pwg_map_t *map; /* Current map */
+ pwg_size_t *size; /* Current size */
+ pwg_map_t *map; /* Current map */
_pwg_finishings_t *f; /* Current finishing option */
cups_option_t *option; /* Current option */
const char *value; /* Filter/pre-filter value */
char newfile[1024]; /* New filename */
+ _pwg_material_t *m; /* Material */
/*
@@ -2216,7 +2673,7 @@ _ppdCacheWriteFile(
if (!pc || !filename)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -2227,7 +2684,7 @@ _ppdCacheWriteFile(
snprintf(newfile, sizeof(newfile), "%s.N", filename);
if ((fp = cupsFileOpen(newfile, "w9")) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
return (0);
}
@@ -2361,6 +2818,60 @@ _ppdCacheWriteFile(
cupsFilePrintf(fp, "MaxCopies %d\n", pc->max_copies);
/*
+ * Accounting/quota/PIN/managed printing values...
+ */
+
+ if (pc->charge_info_uri)
+ cupsFilePutConf(fp, "ChargeInfoURI", pc->charge_info_uri);
+
+ cupsFilePrintf(fp, "AccountId %s\n", pc->account_id ? "true" : "false");
+ cupsFilePrintf(fp, "AccountingUserId %s\n",
+ pc->accounting_user_id ? "true" : "false");
+
+ if (pc->password)
+ cupsFilePutConf(fp, "Password", pc->password);
+
+ for (value = (char *)cupsArrayFirst(pc->mandatory);
+ value;
+ value = (char *)cupsArrayNext(pc->mandatory))
+ cupsFilePutConf(fp, "Mandatory", value);
+
+ /*
+ * Support files...
+ */
+
+ for (value = (char *)cupsArrayFirst(pc->support_files);
+ value;
+ value = (char *)cupsArrayNext(pc->support_files))
+ cupsFilePutConf(fp, "SupportFile", value);
+
+ /*
+ * 3D stuff...
+ */
+
+ if (pc->cups_3d)
+ cupsFilePutConf(fp, "3D", pc->cups_3d);
+
+ if (pc->cups_layer_order)
+ cupsFilePutConf(fp, "LayerOrder", pc->cups_layer_order);
+
+ if (pc->cups_accuracy[0] || pc->cups_accuracy[0] || pc->cups_accuracy[2])
+ cupsFilePrintf(fp, "Accuracy %d %d %d\n", pc->cups_accuracy[0], pc->cups_accuracy[1], pc->cups_accuracy[2]);
+
+ if (pc->cups_volume[0] || pc->cups_volume[0] || pc->cups_volume[2])
+ cupsFilePrintf(fp, "Volume %d %d %d\n", pc->cups_volume[0], pc->cups_volume[1], pc->cups_volume[2]);
+
+ for (m = (_pwg_material_t *)cupsArrayFirst(pc->materials);
+ m;
+ m = (_pwg_material_t *)cupsArrayNext(pc->materials))
+ {
+ cupsFilePrintf(fp, "Material %s \"%s\"", m->key, m->name);
+ for (i = 0; i < m->num_props; i ++)
+ cupsFilePrintf(fp, " %s=%s", m->props[i].name, m->props[i].value);
+ cupsFilePuts(fp, "\n");
+ }
+
+ /*
* IPP attributes, if any...
*/
@@ -2368,7 +2879,7 @@ _ppdCacheWriteFile(
{
cupsFilePrintf(fp, "IPP " CUPS_LLFMT "\n", CUPS_LLCAST ippLength(attrs));
- attrs->state = IPP_IDLE;
+ attrs->state = IPP_STATE_IDLE;
ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, attrs);
}
@@ -2388,6 +2899,604 @@ _ppdCacheWriteFile(
/*
+ * '_ppdCreateFromIPP()' - Create a PPD file describing the capabilities
+ * of an IPP printer.
+ */
+
+char * /* O - PPD filename or NULL on error */
+_ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
+ size_t bufsize, /* I - Size of filename buffer */
+ ipp_t *response) /* I - Get-Printer-Attributes response */
+{
+ cups_file_t *fp; /* PPD file */
+ ipp_attribute_t *attr, /* xxx-supported */
+ *defattr, /* xxx-default */
+ *x_dim, *y_dim; /* Media dimensions */
+ ipp_t *media_size; /* Media size collection */
+ char make[256], /* Make and model */
+ *model, /* Model name */
+ ppdname[PPD_MAX_NAME];
+ /* PPD keyword */
+ int i, j, /* Looping vars */
+ count, /* Number of values */
+ bottom, /* Largest bottom margin */
+ left, /* Largest left margin */
+ right, /* Largest right margin */
+ top; /* Largest top margin */
+ pwg_media_t *pwg; /* PWG media size */
+ int xres, yres; /* Resolution values */
+ struct lconv *loc = localeconv();
+ /* Locale data */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (buffer)
+ *buffer = '\0';
+
+ if (!buffer || bufsize < 1 || !response)
+ return (NULL);
+
+ /*
+ * Open a temporary file for the PPD...
+ */
+
+ if ((fp = cupsTempFile2(buffer, (int)bufsize)) == NULL)
+ return (NULL);
+
+ /*
+ * Standard stuff for PPD file...
+ */
+
+ cupsFilePuts(fp, "*PPD-Adobe: \"4.3\"\n");
+ cupsFilePuts(fp, "*FormatVersion: \"4.3\"\n");
+ cupsFilePrintf(fp, "*FileVersion: \"%d.%d\"\n", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR);
+ cupsFilePuts(fp, "*LanguageVersion: English\n");
+ cupsFilePuts(fp, "*LanguageEncoding: ISOLatin1\n");
+ cupsFilePuts(fp, "*PSVersion: \"(3010.000) 0\"\n");
+ cupsFilePuts(fp, "*LanguageLevel: \"3\"\n");
+ cupsFilePuts(fp, "*FileSystem: False\n");
+ cupsFilePuts(fp, "*PCFileName: \"ippeve.ppd\"\n");
+
+ if ((attr = ippFindAttribute(response, "printer-make-and-model", IPP_TAG_TEXT)) != NULL)
+ strlcpy(make, ippGetString(attr, 0, NULL), sizeof(make));
+ else
+ strlcpy(make, "Unknown Printer", sizeof(make));
+
+ if (!_cups_strncasecmp(make, "Hewlett Packard ", 16) ||
+ !_cups_strncasecmp(make, "Hewlett-Packard ", 16))
+ {
+ model = make + 16;
+ strlcpy(make, "HP", sizeof(make));
+ }
+ else if ((model = strchr(make, ' ')) != NULL)
+ *model++ = '\0';
+ else
+ model = make;
+
+ cupsFilePrintf(fp, "*Manufacturer: \"%s\"\n", make);
+ cupsFilePrintf(fp, "*ModelName: \"%s\"\n", model);
+ cupsFilePrintf(fp, "*Product: \"(%s)\"\n", model);
+ cupsFilePrintf(fp, "*NickName: \"%s\"\n", model);
+ cupsFilePrintf(fp, "*ShortNickName: \"%s\"\n", model);
+
+ if ((attr = ippFindAttribute(response, "color-supported", IPP_TAG_BOOLEAN)) != NULL && ippGetBoolean(attr, 0))
+ cupsFilePuts(fp, "*ColorDevice: True\n");
+ else
+ cupsFilePuts(fp, "*ColorDevice: False\n");
+
+ cupsFilePrintf(fp, "*cupsVersion: %d.%d\n", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR);
+ cupsFilePuts(fp, "*cupsSNMPSupplies: False\n");
+ cupsFilePuts(fp, "*cupsLanguages: \"en\"\n");
+
+ /*
+ * Filters...
+ */
+
+ if ((attr = ippFindAttribute(response, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL)
+ {
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ const char *format = ippGetString(attr, i, NULL);
+ /* PDL */
+
+ if (!_cups_strcasecmp(format, "application/pdf"))
+ cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n");
+ else if (!_cups_strcasecmp(format, "application/postscript"))
+ cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-postscript application/postscript 10 -\"\n");
+ else if (_cups_strcasecmp(format, "application/octet-stream") && _cups_strcasecmp(format, "application/vnd.hp-pcl") && _cups_strcasecmp(format, "text/plain"))
+ cupsFilePrintf(fp, "*cupsFilter2: \"%s %s 10 -\"\n", format, format);
+ }
+ }
+
+ /*
+ * PageSize/PageRegion/ImageableArea/PaperDimension
+ */
+
+ if ((attr = ippFindAttribute(response, "media-bottom-margin-supported", IPP_TAG_INTEGER)) != NULL)
+ {
+ for (i = 1, bottom = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++)
+ if (ippGetInteger(attr, i) > bottom)
+ bottom = ippGetInteger(attr, i);
+ }
+ else
+ bottom = 1270;
+
+ if ((attr = ippFindAttribute(response, "media-left-margin-supported", IPP_TAG_INTEGER)) != NULL)
+ {
+ for (i = 1, left = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++)
+ if (ippGetInteger(attr, i) > left)
+ left = ippGetInteger(attr, i);
+ }
+ else
+ left = 635;
+
+ if ((attr = ippFindAttribute(response, "media-right-margin-supported", IPP_TAG_INTEGER)) != NULL)
+ {
+ for (i = 1, right = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++)
+ if (ippGetInteger(attr, i) > right)
+ right = ippGetInteger(attr, i);
+ }
+ else
+ right = 635;
+
+ if ((attr = ippFindAttribute(response, "media-top-margin-supported", IPP_TAG_INTEGER)) != NULL)
+ {
+ for (i = 1, top = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++)
+ if (ippGetInteger(attr, i) > top)
+ top = ippGetInteger(attr, i);
+ }
+ else
+ top = 1270;
+
+ if ((defattr = ippFindAttribute(response, "media-col-default", IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ {
+ if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ {
+ media_size = ippGetCollection(attr, 0);
+ x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER);
+ y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER);
+
+ if (x_dim && y_dim)
+ {
+ pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+ strlcpy(ppdname, pwg->ppd, sizeof(ppdname));
+ }
+ else
+ strlcpy(ppdname, "Unknown", sizeof(ppdname));
+ }
+ else
+ strlcpy(ppdname, "Unknown", sizeof(ppdname));
+ }
+
+ if ((attr = ippFindAttribute(response, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ {
+ cupsFilePrintf(fp, "*OpenUI *PageSize: PickOne\n"
+ "*OrderDependency: 10 AnySetup *PageSize\n"
+ "*DefaultPageSize: %s\n", ppdname);
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ media_size = ippGetCollection(attr, i);
+ x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER);
+ y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER);
+
+ if (x_dim && y_dim)
+ {
+ char twidth[256], /* Width string */
+ tlength[256]; /* Length string */
+
+ pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+
+ _cupsStrFormatd(twidth, twidth + sizeof(twidth), pwg->width * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(tlength, tlength + sizeof(tlength), pwg->length * 72.0 / 2540.0, loc);
+
+ cupsFilePrintf(fp, "*PageSize %s: \"<</PageSize[%s %s]>>setpagedevice\"\n", pwg->ppd, twidth, tlength);
+ }
+ }
+ cupsFilePuts(fp, "*CloseUI: *PageSize\n");
+
+ cupsFilePrintf(fp, "*OpenUI *PageRegion: PickOne\n"
+ "*OrderDependency: 10 AnySetup *PageRegion\n"
+ "*DefaultPageRegion: %s\n", ppdname);
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ media_size = ippGetCollection(attr, i);
+ x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER);
+ y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER);
+
+ if (x_dim && y_dim)
+ {
+ char twidth[256], /* Width string */
+ tlength[256]; /* Length string */
+
+ pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+
+ _cupsStrFormatd(twidth, twidth + sizeof(twidth), pwg->width * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(tlength, tlength + sizeof(tlength), pwg->length * 72.0 / 2540.0, loc);
+
+ cupsFilePrintf(fp, "*PageRegion %s: \"<</PageSize[%s %s]>>setpagedevice\"\n", pwg->ppd, twidth, tlength);
+ }
+ }
+ cupsFilePuts(fp, "*CloseUI: *PageRegion\n");
+
+ cupsFilePrintf(fp, "*DefaultImageableArea: %s\n"
+ "*DefaultPaperDimension: %s\n", ppdname, ppdname);
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ media_size = ippGetCollection(attr, i);
+ x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER);
+ y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER);
+
+ if (x_dim && y_dim)
+ {
+ char tleft[256], /* Left string */
+ tbottom[256], /* Bottom string */
+ tright[256], /* Right string */
+ ttop[256], /* Top string */
+ twidth[256], /* Width string */
+ tlength[256]; /* Length string */
+
+ pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+
+ _cupsStrFormatd(tleft, tleft + sizeof(tleft), left * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(tbottom, tbottom + sizeof(tbottom), bottom * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(tright, tright + sizeof(tright), (pwg->width - right) * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(ttop, ttop + sizeof(ttop), (pwg->length - top) * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(twidth, twidth + sizeof(twidth), pwg->width * 72.0 / 2540.0, loc);
+ _cupsStrFormatd(tlength, tlength + sizeof(tlength), pwg->length * 72.0 / 2540.0, loc);
+
+ cupsFilePrintf(fp, "*ImageableArea %s: \"%s %s %s %s\"\n", pwg->ppd, tleft, tbottom, tright, ttop);
+ cupsFilePrintf(fp, "*PaperDimension %s: \"%s %s\"\n", pwg->ppd, twidth, tlength);
+ }
+ }
+ }
+
+ /*
+ * InputSlot...
+ */
+
+ if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-source", IPP_TAG_KEYWORD)) != NULL)
+ pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname));
+ else
+ strlcpy(ppdname, "Unknown", sizeof(ppdname));
+
+ if ((attr = ippFindAttribute(response, "media-source-supported", IPP_TAG_KEYWORD)) != NULL && (count = ippGetCount(attr)) > 1)
+ {
+ static const char * const sources[][2] =
+ {
+ { "Auto", "Automatic" },
+ { "Main", "Main" },
+ { "Alternate", "Alternate" },
+ { "LargeCapacity", "Large Capacity" },
+ { "Manual", "Manual" },
+ { "Envelope", "Envelope" },
+ { "Disc", "Disc" },
+ { "Photo", "Photo" },
+ { "Hagaki", "Hagaki" },
+ { "MainRoll", "Main Roll" },
+ { "AlternateRoll", "Alternate Roll" },
+ { "Top", "Top" },
+ { "Middle", "Middle" },
+ { "Bottom", "Bottom" },
+ { "Side", "Side" },
+ { "Left", "Left" },
+ { "Right", "Right" },
+ { "Center", "Center" },
+ { "Rear", "Rear" },
+ { "ByPassTray", "Multipurpose" },
+ { "Tray1", "Tray 1" },
+ { "Tray2", "Tray 2" },
+ { "Tray3", "Tray 3" },
+ { "Tray4", "Tray 4" },
+ { "Tray5", "Tray 5" },
+ { "Tray6", "Tray 6" },
+ { "Tray7", "Tray 7" },
+ { "Tray8", "Tray 8" },
+ { "Tray9", "Tray 9" },
+ { "Tray10", "Tray 10" },
+ { "Tray11", "Tray 11" },
+ { "Tray12", "Tray 12" },
+ { "Tray13", "Tray 13" },
+ { "Tray14", "Tray 14" },
+ { "Tray15", "Tray 15" },
+ { "Tray16", "Tray 16" },
+ { "Tray17", "Tray 17" },
+ { "Tray18", "Tray 18" },
+ { "Tray19", "Tray 19" },
+ { "Tray20", "Tray 20" },
+ { "Roll1", "Roll 1" },
+ { "Roll2", "Roll 2" },
+ { "Roll3", "Roll 3" },
+ { "Roll4", "Roll 4" },
+ { "Roll5", "Roll 5" },
+ { "Roll6", "Roll 6" },
+ { "Roll7", "Roll 7" },
+ { "Roll8", "Roll 8" },
+ { "Roll9", "Roll 9" },
+ { "Roll10", "Roll 10" }
+ };
+
+ cupsFilePrintf(fp, "*OpenUI *InputSlot: PickOne\n"
+ "*OrderDependency: 10 AnySetup *InputSlot\n"
+ "*DefaultInputSlot: %s\n", ppdname);
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ pwg_ppdize_name(ippGetString(attr, i, NULL), ppdname, sizeof(ppdname));
+
+ for (j = 0; j < (int)(sizeof(sources) / sizeof(sources[0])); j ++)
+ if (!strcmp(sources[j][0], ppdname))
+ {
+ cupsFilePrintf(fp, "*InputSlot %s/%s: \"<</MediaPosition %d>>setpagedevice\"\n", ppdname, sources[j][1], j);
+ break;
+ }
+ }
+ cupsFilePuts(fp, "*CloseUI: *InputSlot\n");
+ }
+
+ /*
+ * MediaType...
+ */
+
+ if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-type", IPP_TAG_KEYWORD)) != NULL)
+ pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname));
+ else
+ strlcpy(ppdname, "Unknown", sizeof(ppdname));
+
+ if ((attr = ippFindAttribute(response, "media-type-supported", IPP_TAG_KEYWORD)) != NULL && (count = ippGetCount(attr)) > 1)
+ {
+ static const char * const types[][2] =
+ { /* Media type strings (far from complete) */
+ { "Auto", "Automatic" },
+ { "Cardstock", "Cardstock" },
+ { "Disc", "CD/DVD/Bluray" },
+ { "Envelope", "Envelope" },
+ { "Labels", "Label" },
+ { "Other", "Other" },
+ { "Photographic", "Photo" },
+ { "PhotographicGlossy", "Glossy Photo" },
+ { "PhotographicHighGloss", "High-Gloss Photo" },
+ { "PhotographicMatte", "Matte Photo" },
+ { "PhotographicSatin", "Satin Photo" },
+ { "PhotographicSemiGloss", "Semi-Gloss Photo" },
+ { "Stationery", "Plain Paper" },
+ { "StationeryLetterhead", "Letterhead" },
+ { "Transparency", "Transparency" }
+ };
+
+ cupsFilePrintf(fp, "*OpenUI *MediaType: PickOne\n"
+ "*OrderDependency: 10 AnySetup *MediaType\n"
+ "*DefaultMediaType: %s\n", ppdname);
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ pwg_ppdize_name(ippGetString(attr, i, NULL), ppdname, sizeof(ppdname));
+
+ for (j = 0; j < (int)(sizeof(types) / sizeof(types[0])); j ++)
+ if (!strcmp(types[j][0], ppdname))
+ {
+ cupsFilePrintf(fp, "*MediaType %s/%s: \"<</MediaType(%s)>>setpagedevice\"\n", ppdname, types[j][1], ppdname);
+ break;
+ }
+
+ if (j >= (int)(sizeof(types) / sizeof(types[0])))
+ cupsFilePrintf(fp, "*MediaType %s: \"<</MediaType(%s)>>setpagedevice\"\n", ppdname, ppdname);
+
+ }
+ cupsFilePuts(fp, "*CloseUI: *MediaType\n");
+ }
+
+ /*
+ * ColorModel...
+ */
+
+ if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(response, "print-color-mode-supported", IPP_TAG_KEYWORD);
+
+ if (attr)
+ {
+ const char *default_color = NULL; /* Default */
+
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ const char *keyword = ippGetString(attr, i, NULL);
+ /* Keyword for color/bit depth */
+
+ if (!strcmp(keyword, "black_1") || !strcmp(keyword, "bi-level") || !strcmp(keyword, "process-bi-level"))
+ {
+ if (!default_color)
+ cupsFilePuts(fp, "*OpenUI *ColorModel/Color Mode: PickOne\n"
+ "*OrderDependency: 10 AnySetup *ColorModel\n");
+
+ cupsFilePuts(fp, "*ColorModel FastGray/Fast Grayscale: \"<</cupsColorSpace 3/cupsBitsPerColor 1/cupsColorOrder 0/cupsCompression 0>>setpagedevice\"\n");
+
+ if (!default_color)
+ default_color = "FastGray";
+ }
+ else if (!strcmp(keyword, "sgray_8") || !strcmp(keyword, "monochrome") || !strcmp(keyword, "process-monochrome"))
+ {
+ if (!default_color)
+ cupsFilePuts(fp, "*OpenUI *ColorModel/Color Mode: PickOne\n"
+ "*OrderDependency: 10 AnySetup *ColorModel\n");
+
+ cupsFilePuts(fp, "*ColorModel Gray/Grayscale: \"<</cupsColorSpace 18/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0>>setpagedevice\"\n");
+
+ if (!default_color || !strcmp(default_color, "FastGray"))
+ default_color = "Gray";
+ }
+ else if (!strcmp(keyword, "srgb_8") || !strcmp(keyword, "color"))
+ {
+ if (!default_color)
+ cupsFilePuts(fp, "*OpenUI *ColorModel/Color Mode: PickOne\n"
+ "*OrderDependency: 10 AnySetup *ColorModel\n");
+
+ cupsFilePuts(fp, "*ColorModel RGB/Color: \"<</cupsColorSpace 19/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0>>setpagedevice\"\n");
+
+ default_color = "RGB";
+ }
+ }
+
+ if (default_color)
+ {
+ cupsFilePrintf(fp, "*DefaultColorModel: %s\n", default_color);
+ cupsFilePuts(fp, "*CloseUI: *ColorModel\n");
+ }
+ }
+
+ /*
+ * Duplex...
+ */
+
+ if ((attr = ippFindAttribute(response, "sides-supported", IPP_TAG_KEYWORD)) != NULL && ippContainsString(attr, "two-sided-long-edge"))
+ {
+ cupsFilePuts(fp, "*OpenUI *Duplex/2-Sided Printing: PickOne\n"
+ "*OrderDependency: 10 AnySetup *Duplex\n"
+ "*DefaultDuplex: None\n"
+ "*Duplex None/Off (1-Sided): \"<</Duplex false>>setpagedevice\"\n"
+ "*Duplex DuplexNoTumble/Long-Edge (Portrait): \"<</Duplex true/Tumble false>>setpagedevice\"\n"
+ "*Duplex DuplexTumble/Short-Edge (Landscape): \"<</Duplex true/Tumble true>>setpagedevice\"\n"
+ "*CloseUI: *Duplex\n");
+
+ if ((attr = ippFindAttribute(response, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD)) != NULL)
+ {
+ const char *keyword = ippGetString(attr, 0, NULL);
+ /* Keyword value */
+
+ if (!strcmp(keyword, "flipped"))
+ cupsFilePuts(fp, "*cupsBackSide: Flipped\n");
+ else if (!strcmp(keyword, "manual-tumble"))
+ cupsFilePuts(fp, "*cupsBackSide: ManualTumble\n");
+ else if (!strcmp(keyword, "normal"))
+ cupsFilePuts(fp, "*cupsBackSide: Normal\n");
+ else
+ cupsFilePuts(fp, "*cupsBackSide: Rotated\n");
+ }
+ else if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL)
+ {
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ const char *dm = ippGetString(attr, i, NULL);
+ /* DM value */
+
+ if (!_cups_strcasecmp(dm, "DM1"))
+ {
+ cupsFilePuts(fp, "*cupsBackSide: Normal\n");
+ break;
+ }
+ else if (!_cups_strcasecmp(dm, "DM2"))
+ {
+ cupsFilePuts(fp, "*cupsBackSide: Flipped\n");
+ break;
+ }
+ else if (!_cups_strcasecmp(dm, "DM3"))
+ {
+ cupsFilePuts(fp, "*cupsBackSide: Rotated\n");
+ break;
+ }
+ else if (!_cups_strcasecmp(dm, "DM4"))
+ {
+ cupsFilePuts(fp, "*cupsBackSide: ManualTumble\n");
+ break;
+ }
+ }
+ }
+ }
+
+ /*
+ * cupsPrintQuality and DefaultResolution...
+ */
+
+ if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL)
+ {
+ count = ippGetCount(attr);
+
+ pwg_ppdize_resolution(attr, count / 2, &xres, &yres, ppdname, sizeof(ppdname));
+ cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname);
+
+ cupsFilePuts(fp, "*OpenUI *cupsPrintQuality/Print Quality: PickOne\n"
+ "*OrderDependency: 10 AnySetup *cupsPrintQuality\n"
+ "*DefaultcupsPrintQuality: Normal\n");
+ if (count > 2)
+ {
+ pwg_ppdize_resolution(attr, 0, &xres, &yres, NULL, 0);
+ cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<</HWResolution[%d %d]>>setpagedevice\"\n", xres, yres);
+ }
+ pwg_ppdize_resolution(attr, count / 2, &xres, &yres, NULL, 0);
+ cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<</HWResolution[%d %d]>>setpagedevice\"\n", xres, yres);
+ if (count > 1)
+ {
+ pwg_ppdize_resolution(attr, count - 1, &xres, &yres, NULL, 0);
+ cupsFilePrintf(fp, "*cupsPrintQuality High: \"<</HWResolution[%d %d]>>setpagedevice\"\n", xres, yres);
+ }
+
+ cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n");
+ }
+ else if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL)
+ {
+ int lowdpi = 0, hidpi = 0; /* Lower and higher resolution */
+
+ for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ {
+ const char *rs = ippGetString(attr, i, NULL);
+ /* RS value */
+
+ if (_cups_strncasecmp(rs, "RS", 2))
+ continue;
+
+ lowdpi = atoi(rs + 2);
+ if ((rs = strrchr(rs, '-')) != NULL)
+ hidpi = atoi(rs + 1);
+ else
+ hidpi = lowdpi;
+ break;
+ }
+
+ if (lowdpi == 0)
+ {
+ /*
+ * Invalid "urf-supported" value...
+ */
+
+ cupsFilePuts(fp, "*DefaultResolution: 300dpi\n");
+ }
+ else
+ {
+ /*
+ * Generate print qualities based on low and high DPIs...
+ */
+
+ cupsFilePrintf(fp, "*DefaultResolution: %ddpi\n", lowdpi);
+
+ cupsFilePuts(fp, "*OpenUI *cupsPrintQuality/Print Quality: PickOne\n"
+ "*OrderDependency: 10 AnySetup *cupsPrintQuality\n"
+ "*DefaultcupsPrintQuality: Normal\n");
+ if ((lowdpi & 1) == 0)
+ cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<</HWResolution[%d %d]>>setpagedevice\"\n", lowdpi, lowdpi / 2);
+ cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<</HWResolution[%d %d]>>setpagedevice\"\n", lowdpi, lowdpi);
+ if (hidpi > lowdpi)
+ cupsFilePrintf(fp, "*cupsPrintQuality High: \"<</HWResolution[%d %d]>>setpagedevice\"\n", hidpi, hidpi);
+ cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n");
+ }
+ }
+ else if ((attr = ippFindAttribute(response, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL)
+ {
+ pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname));
+ cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname);
+ }
+ else
+ cupsFilePuts(fp, "*DefaultResolution: 300dpi\n");
+
+ /*
+ * Close up and return...
+ */
+
+ cupsFileClose(fp);
+
+ return (buffer);
+}
+
+
+/*
* '_pwgInputSlotForSource()' - Get the InputSlot name for the given PWG
* media-source.
*/
@@ -2489,7 +3598,7 @@ _pwgMediaTypeForType(
const char * /* O - PageSize name */
_pwgPageSizeForMedia(
- _pwg_media_t *media, /* I - Media */
+ pwg_media_t *media, /* I - Media */
char *name, /* I - PageSize name buffer */
size_t namesize) /* I - Size of name buffer */
{
@@ -2525,8 +3634,8 @@ _pwgPageSizeForMedia(
* Use a name of the form "wNNNhNNN"...
*/
- snprintf(name, namesize, "w%dh%d", (int)_PWG_TOPTS(media->width),
- (int)_PWG_TOPTS(media->length));
+ snprintf(name, namesize, "w%dh%d", (int)PWG_TO_POINTS(media->width),
+ (int)PWG_TO_POINTS(media->length));
}
else
{
@@ -2534,7 +3643,7 @@ _pwgPageSizeForMedia(
* Copy the size name from class_sizename_dimensions...
*/
- memcpy(name, sizeptr + 1, dimptr - sizeptr - 1);
+ memcpy(name, sizeptr + 1, (size_t)(dimptr - sizeptr - 1));
name[dimptr - sizeptr - 1] = '\0';
}
@@ -2551,7 +3660,7 @@ pwg_compare_finishings(
_pwg_finishings_t *a, /* I - First finishings value */
_pwg_finishings_t *b) /* I - Second finishings value */
{
- return (b->value - a->value);
+ return ((int)b->value - (int)a->value);
}
@@ -2569,6 +3678,22 @@ pwg_free_finishings(
/*
+ * 'pwg_free_material()' - Free a material value.
+ */
+
+static void
+pwg_free_material(_pwg_material_t *m) /* I - Material value */
+{
+ _cupsStrFree(m->key);
+ _cupsStrFree(m->name);
+
+ cupsFreeOptions(m->num_props, m->props);
+
+ free(m);
+}
+
+
+/*
* 'pwg_ppdize_name()' - Convert an IPP keyword to a PPD keyword.
*/
@@ -2581,14 +3706,14 @@ pwg_ppdize_name(const char *ipp, /* I - IPP keyword */
*end; /* End of name buffer */
- *name = toupper(*ipp++);
+ *name = (char)toupper(*ipp++);
for (ptr = name + 1, end = name + namesize - 1; *ipp && ptr < end;)
{
if (*ipp == '-' && _cups_isalpha(ipp[1]))
{
ipp ++;
- *ptr++ = toupper(*ipp++ & 255);
+ *ptr++ = (char)toupper(*ipp++ & 255);
}
else
*ptr++ = *ipp++;
@@ -2599,6 +3724,40 @@ pwg_ppdize_name(const char *ipp, /* I - IPP keyword */
/*
+ * 'pwg_ppdize_resolution()' - Convert PWG resolution values to PPD values.
+ */
+
+static void
+pwg_ppdize_resolution(
+ ipp_attribute_t *attr, /* I - Attribute to convert */
+ int element, /* I - Element to convert */
+ int *xres, /* O - X resolution in DPI */
+ int *yres, /* O - Y resolution in DPI */
+ char *name, /* I - Name buffer */
+ size_t namesize) /* I - Size of name buffer */
+{
+ ipp_res_t units; /* Units for resolution */
+
+
+ *xres = ippGetResolution(attr, element, yres, &units);
+
+ if (units == IPP_RES_PER_CM)
+ {
+ *xres = (int)(*xres * 2.54);
+ *yres = (int)(*yres * 2.54);
+ }
+
+ if (name && namesize > 4)
+ {
+ if (*xres == *yres)
+ snprintf(name, namesize, "%ddpi", *xres);
+ else
+ snprintf(name, namesize, "%dx%ddpi", *xres, *yres);
+ }
+}
+
+
+/*
* 'pwg_unppdize_name()' - Convert a PPD keyword to a lowercase IPP keyword.
*/
@@ -2612,10 +3771,29 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
*end; /* End of name buffer */
+ if (_cups_islower(*ppd))
+ {
+ /*
+ * Already lowercase name, use as-is?
+ */
+
+ const char *ppdptr; /* Pointer into PPD keyword */
+
+ for (ppdptr = ppd + 1; *ppdptr; ppdptr ++)
+ if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr))
+ break;
+
+ if (!*ppdptr)
+ {
+ strlcpy(name, ppd, namesize);
+ return;
+ }
+ }
+
for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++)
{
if (_cups_isalnum(*ppd) || *ppd == '-')
- *ptr++ = tolower(*ppd & 255);
+ *ptr++ = (char)tolower(*ppd & 255);
else if (strchr(dashchars, *ppd))
*ptr++ = '-';
else
@@ -2624,6 +3802,8 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) &&
_cups_isupper(ppd[1]) && ptr < end)
*ptr++ = '-';
+ else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255))
+ *ptr++ = '-';
}
*ptr = '\0';
@@ -2631,5 +3811,5 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
/*
- * End of "$Id: ppd-cache.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd-cache.c 12980 2015-11-17 21:23:32Z msweet $".
*/
diff --git a/cups/ppd-private.h b/cups/ppd-private.h
index 2a2696c..126ae49 100644
--- a/cups/ppd-private.h
+++ b/cups/ppd-private.h
@@ -1,27 +1,27 @@
/*
- * "$Id: ppd-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd-private.h 12733 2015-06-12 01:21:05Z msweet $"
*
- * Private PPD definitions for CUPS.
+ * Private PPD definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
*
- * This code and any derivative of it may be used and distributed
- * freely under the terms of the GNU General Public License when
- * used with GNU Ghostscript or its derivatives. Use of the code
- * (or any derivative of it) with software other than GNU
- * GhostScript (or its derivatives) is governed by the CUPS license
- * agreement.
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU Ghostscript or its derivatives. Use of the code
+ * (or any derivative of it) with software other than GNU
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_PPD_PRIVATE_H_
@@ -49,7 +49,7 @@ extern "C" {
* Constants...
*/
-# define _PPD_CACHE_VERSION 3 /* Version number in cache file */
+# define _PPD_CACHE_VERSION 7 /* Version number in cache file */
/*
@@ -104,17 +104,25 @@ typedef enum _pwg_print_quality_e /**** PWG print-quality values ****/
typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/
{
- ipp_finish_t value; /* finishings value */
- int num_options; /* Number of options to apply */
- cups_option_t *options; /* Options to apply */
+ ipp_finishings_t value; /* finishings value */
+ int num_options; /* Number of options to apply */
+ cups_option_t *options; /* Options to apply */
} _pwg_finishings_t;
+typedef struct _pwg_material_s /**** PWG material mapping data ****/
+{
+ char *key, /* material-key value */
+ *name; /* material-name value */
+ int num_props; /* Number of properties */
+ cups_option_t *props; /* Material properties */
+} _pwg_material_t;
+
struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
{
int num_bins; /* Number of output bins */
- _pwg_map_t *bins; /* Output bins */
+ pwg_map_t *bins; /* Output bins */
int num_sizes; /* Number of media sizes */
- _pwg_size_t *sizes; /* Media sizes */
+ pwg_size_t *sizes; /* Media sizes */
int custom_max_width, /* Maximum custom width in 2540ths */
custom_max_length, /* Maximum custom length in 2540ths */
custom_min_width, /* Minimum custom width in 2540ths */
@@ -122,12 +130,12 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
char *custom_max_keyword, /* Maximum custom size PWG keyword */
*custom_min_keyword, /* Minimum custom size PWG keyword */
custom_ppd_size[41]; /* Custom PPD size name */
- _pwg_size_t custom_size; /* Custom size record */
+ pwg_size_t custom_size; /* Custom size record */
char *source_option; /* PPD option for media source */
int num_sources; /* Number of media sources */
- _pwg_map_t *sources; /* Media sources */
+ pwg_map_t *sources; /* Media sources */
int num_types; /* Number of media types */
- _pwg_map_t *types; /* Media types */
+ pwg_map_t *types; /* Media types */
int num_presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX];
/* Number of print-color-mode/print-quality options */
cups_option_t *presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX];
@@ -141,7 +149,18 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
*prefilters; /* cupsPreFilter values */
int single_file; /* cupsSingleFile value */
cups_array_t *finishings; /* cupsIPPFinishings values */
- int max_copies; /* cupsMaxCopies value */
+ int max_copies, /* cupsMaxCopies value */
+ account_id, /* cupsJobAccountId value */
+ accounting_user_id; /* cupsJobAccountingUserId value */
+ char *password; /* cupsJobPassword value */
+ cups_array_t *mandatory; /* cupsMandatory value */
+ char *charge_info_uri; /* cupsChargeInfoURI value */
+ cups_array_t *support_files; /* Support files - ICC profiles, etc. */
+ char *cups_3d, /* cups3D value */
+ *cups_layer_order; /* cupsLayerOrder value */
+ int cups_accuracy[3]; /* cupsAccuracy value - x, y, and z in nanometers */
+ int cups_volume[3]; /* cupsVolume value - x, y, and z in millimeters */
+ cups_array_t *materials; /* cupsMaterial values */
};
@@ -149,18 +168,23 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
* Prototypes...
*/
+extern int _cupsConvertOptions(ipp_t *request, ppd_file_t *ppd, _ppd_cache_t *pc, ipp_attribute_t *media_col_sup, ipp_attribute_t *doc_handling_sup, ipp_attribute_t *print_color_mode_sup, const char *user, const char *format, int copies, int num_options, cups_option_t *options);
extern _ppd_cache_t *_ppdCacheCreateWithFile(const char *filename,
ipp_t **attrs);
extern _ppd_cache_t *_ppdCacheCreateWithPPD(ppd_file_t *ppd);
extern void _ppdCacheDestroy(_ppd_cache_t *pc);
extern const char *_ppdCacheGetBin(_ppd_cache_t *pc,
const char *output_bin);
-extern int _ppdCacheGetFinishingOptions(_ppd_cache_t *pc, ipp_t *job,
- ipp_finish_t value, int num_options,
+extern int _ppdCacheGetFinishingOptions(_ppd_cache_t *pc,
+ ipp_t *job,
+ ipp_finishings_t value,
+ int num_options,
cups_option_t **options);
-extern int _ppdCacheGetFinishingValues(_ppd_cache_t *pc, int num_options,
+extern int _ppdCacheGetFinishingValues(_ppd_cache_t *pc,
+ int num_options,
cups_option_t *options,
- int max_values, int *values);
+ int max_values,
+ int *values);
extern const char *_ppdCacheGetInputSlot(_ppd_cache_t *pc, ipp_t *job,
const char *keyword);
extern const char *_ppdCacheGetMediaType(_ppd_cache_t *pc, ipp_t *job,
@@ -169,7 +193,7 @@ extern const char *_ppdCacheGetOutputBin(_ppd_cache_t *pc,
const char *keyword);
extern const char *_ppdCacheGetPageSize(_ppd_cache_t *pc, ipp_t *job,
const char *keyword, int *exact);
-extern _pwg_size_t *_ppdCacheGetSize(_ppd_cache_t *pc,
+extern pwg_size_t *_ppdCacheGetSize(_ppd_cache_t *pc,
const char *page_size);
extern const char *_ppdCacheGetSource(_ppd_cache_t *pc,
const char *input_slot);
@@ -177,6 +201,7 @@ extern const char *_ppdCacheGetType(_ppd_cache_t *pc,
const char *media_type);
extern int _ppdCacheWriteFile(_ppd_cache_t *pc,
const char *filename, ipp_t *attrs);
+extern char *_ppdCreateFromIPP(char *buffer, size_t bufsize, ipp_t *response);
extern void _ppdFreeLanguages(cups_array_t *languages);
extern cups_encoding_t _ppdGetEncoding(const char *name);
extern cups_array_t *_ppdGetLanguages(ppd_file_t *ppd);
@@ -197,7 +222,7 @@ extern const char *_pwgInputSlotForSource(const char *media_source,
char *name, size_t namesize);
extern const char *_pwgMediaTypeForType(const char *media_type,
char *name, size_t namesize);
-extern const char *_pwgPageSizeForMedia(_pwg_media_t *media,
+extern const char *_pwgPageSizeForMedia(pwg_media_t *media,
char *name, size_t namesize);
@@ -211,5 +236,5 @@ extern const char *_pwgPageSizeForMedia(_pwg_media_t *media,
#endif /* !_CUPS_PPD_PRIVATE_H_ */
/*
- * End of "$Id: ppd-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd-private.h 12733 2015-06-12 01:21:05Z msweet $".
*/
diff --git a/cups/ppd.c b/cups/ppd.c
index dd8097d..4afc4bb 100644
--- a/cups/ppd.c
+++ b/cups/ppd.c
@@ -1,61 +1,27 @@
/*
- * "$Id: ppd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd.c 12848 2015-08-26 18:51:57Z msweet $"
*
- * PPD file routines for CUPS.
+ * PPD file routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
*
- * This code and any derivative of it may be used and distributed
- * freely under the terms of the GNU General Public License when
- * used with GNU Ghostscript or its derivatives. Use of the code
- * (or any derivative of it) with software other than GNU
- * GhostScript (or its derivatives) is governed by the CUPS license
- * agreement.
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU Ghostscript or its derivatives. Use of the code
+ * (or any derivative of it) with software other than GNU
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * ppdClose() - Free all memory used by the PPD file.
- * ppdErrorString() - Returns the text assocated with a status.
- * _ppdGetEncoding() - Get the CUPS encoding value for the given
- * LanguageEncoding.
- * ppdLastError() - Return the status from the last ppdOpen*().
- * ppdOpen() - Read a PPD file into memory.
- * _ppdOpen() - Read a PPD file into memory.
- * ppdOpen2() - Read a PPD file into memory.
- * ppdOpenFd() - Read a PPD file into memory.
- * _ppdOpenFile() - Read a PPD file into memory.
- * ppdOpenFile() - Read a PPD file into memory.
- * ppdSetConformance() - Set the conformance level for PPD files.
- * ppd_add_attr() - Add an attribute to the PPD data.
- * ppd_add_choice() - Add a choice to an option.
- * ppd_add_size() - Add a page size.
- * ppd_compare_attrs() - Compare two attributes.
- * ppd_compare_choices() - Compare two choices...
- * ppd_compare_coptions() - Compare two custom options.
- * ppd_compare_options() - Compare two options.
- * ppd_decode() - Decode a string value...
- * ppd_free_filters() - Free the filters array.
- * ppd_free_group() - Free a single UI group.
- * ppd_free_option() - Free a single option.
- * ppd_get_coption() - Get a custom option record.
- * ppd_get_cparam() - Get a custom parameter record.
- * ppd_get_group() - Find or create the named group as needed.
- * ppd_get_option() - Find or create the named option as needed.
- * ppd_hash_option() - Generate a hash of the option name...
- * ppd_read() - Read a line from a PPD file, skipping comment
- * lines as necessary.
- * ppd_update_filters() - Update the filters array as needed.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -70,14 +36,6 @@
* Definitions...
*/
-#if defined(WIN32) || defined(__EMX__)
-# define READ_BINARY "rb" /* Open a binary file for reading */
-# define WRITE_BINARY "wb" /* Open a binary file for writing */
-#else
-# define READ_BINARY "r" /* Open a binary file for reading */
-# define WRITE_BINARY "w" /* Open a binary file for writing */
-#endif /* WIN32 || __EMX__ */
-
#define ppd_free(p) if (p) free(p) /* Safe free macro */
#define PPD_KEYWORD 1 /* Line contained a keyword */
@@ -325,7 +283,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
/*
- * 'ppdErrorString()' - Returns the text assocated with a status.
+ * 'ppdErrorString()' - Returns the text associated with a status.
*
* @since CUPS 1.1.19/OS X 10.3@
*/
@@ -460,10 +418,10 @@ _ppdOpen(
char custom_name[PPD_MAX_NAME];
/* CustomFoo attribute name */
ppd_attr_t *custom_attr; /* CustomFoo attribute */
- char ll[4], /* Language + '.' */
- ll_CC[7]; /* Language + country + '.' */
- size_t ll_len = 0, /* Language length */
- ll_CC_len = 0; /* Language + country length */
+ char ll[7], /* Base language + '.' */
+ ll_CC[7]; /* Language w/country + '.' */
+ size_t ll_len = 0, /* Base language length */
+ ll_CC_len = 0; /* Language w/country length */
static const char * const ui_keywords[] =
{
#ifdef CUPS_USE_FULL_UI_KEYWORDS_LIST
@@ -561,7 +519,17 @@ _ppdOpen(
return (NULL);
snprintf(ll_CC, sizeof(ll_CC), "%s.", lang->language);
- snprintf(ll, sizeof(ll), "%2.2s.", lang->language);
+
+ /*
+ * <rdar://problem/22130168>
+ *
+ * Need to use a different base language for some locales...
+ */
+
+ if (!strcmp(lang->language, "zh_HK"))
+ strlcpy(ll, "zh_TW.", sizeof(ll));
+ else
+ snprintf(ll, sizeof(ll), "%2.2s.", lang->language);
ll_CC_len = strlen(ll_CC);
ll_len = strlen(ll);
@@ -872,8 +840,7 @@ _ppdOpen(
if (ppd->num_profiles == 0)
profile = malloc(sizeof(ppd_profile_t));
else
- profile = realloc(ppd->profiles, sizeof(ppd_profile_t) *
- (ppd->num_profiles + 1));
+ profile = realloc(ppd->profiles, sizeof(ppd_profile_t) * (size_t)(ppd->num_profiles + 1));
if (!profile)
{
@@ -907,7 +874,7 @@ _ppdOpen(
if (ppd->num_filters == 0)
filter = malloc(sizeof(char *));
else
- filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1));
+ filter = realloc(ppd->filters, sizeof(char *) * (size_t)(ppd->num_filters + 1));
if (filter == NULL)
{
@@ -937,8 +904,7 @@ _ppdOpen(
if (ppd->num_fonts == 0)
tempfonts = (char **)malloc(sizeof(char *));
else
- tempfonts = (char **)realloc(ppd->fonts,
- sizeof(char *) * (ppd->num_fonts + 1));
+ tempfonts = (char **)realloc(ppd->fonts, sizeof(char *) * (size_t)(ppd->num_fonts + 1));
if (tempfonts == NULL)
{
@@ -1173,7 +1139,7 @@ _ppdOpen(
}
ppd->num_emulations = count;
- if ((ppd->emulations = calloc(count, sizeof(ppd_emul_t))) == NULL)
+ if ((ppd->emulations = calloc((size_t)count, sizeof(ppd_emul_t))) == NULL)
{
cg->ppd_status = PPD_ALLOC_ERROR;
@@ -1264,7 +1230,7 @@ _ppdOpen(
ppd->patches = temp;
- strcpy(ppd->patches + strlen(ppd->patches), string);
+ memcpy(ppd->patches + strlen(ppd->patches), string, strlen(string) + 1);
}
}
else if (!strcmp(keyword, "OpenUI"))
@@ -1378,7 +1344,7 @@ _ppdOpen(
*/
if (!_cups_strcasecmp(name, "PageRegion"))
- strcpy(custom_name, "CustomPageSize");
+ strlcpy(custom_name, "CustomPageSize", sizeof(custom_name));
else
snprintf(custom_name, sizeof(custom_name), "Custom%s", name);
@@ -1697,8 +1663,7 @@ _ppdOpen(
if (ppd->num_consts == 0)
constraint = calloc(2, sizeof(ppd_const_t));
else
- constraint = realloc(ppd->consts,
- (ppd->num_consts + 2) * sizeof(ppd_const_t));
+ constraint = realloc(ppd->consts, (size_t)(ppd->num_consts + 2) * sizeof(ppd_const_t));
if (constraint == NULL)
{
@@ -1944,9 +1909,9 @@ _ppdOpen(
cupsCharsetToUTF8((cups_utf8_t *)choice->text, text,
sizeof(choice->text), encoding);
else if (!strcmp(name, "True"))
- strcpy(choice->text, _("Yes"));
+ strlcpy(choice->text, _("Yes"), sizeof(choice->text));
else if (!strcmp(name, "False"))
- strcpy(choice->text, _("No"));
+ strlcpy(choice->text, _("No"), sizeof(choice->text));
else
strlcpy(choice->text, name, sizeof(choice->text));
@@ -2282,7 +2247,7 @@ ppd_add_attr(ppd_file_t *ppd, /* I - PPD file data */
if (ppd->num_attrs == 0)
ptr = malloc(sizeof(ppd_attr_t *));
else
- ptr = realloc(ppd->attrs, (ppd->num_attrs + 1) * sizeof(ppd_attr_t *));
+ ptr = realloc(ppd->attrs, (size_t)(ppd->num_attrs + 1) * sizeof(ppd_attr_t *));
if (ptr == NULL)
return (NULL);
@@ -2334,8 +2299,7 @@ ppd_add_choice(ppd_option_t *option, /* I - Option */
if (option->num_choices == 0)
choice = malloc(sizeof(ppd_choice_t));
else
- choice = realloc(option->choices,
- sizeof(ppd_choice_t) * (option->num_choices + 1));
+ choice = realloc(option->choices, sizeof(ppd_choice_t) * (size_t)(option->num_choices + 1));
if (choice == NULL)
return (NULL);
@@ -2365,7 +2329,7 @@ ppd_add_size(ppd_file_t *ppd, /* I - PPD file */
if (ppd->num_sizes == 0)
size = malloc(sizeof(ppd_size_t));
else
- size = realloc(ppd->sizes, sizeof(ppd_size_t) * (ppd->num_sizes + 1));
+ size = realloc(ppd->sizes, sizeof(ppd_size_t) * (size_t)(ppd->num_sizes + 1));
if (size == NULL)
return (NULL);
@@ -2454,9 +2418,9 @@ ppd_decode(char *string) /* I - String to decode */
while (isxdigit(*inptr & 255))
{
if (_cups_isalpha(*inptr))
- *outptr = (tolower(*inptr) - 'a' + 10) << 4;
+ *outptr = (char)((tolower(*inptr) - 'a' + 10) << 4);
else
- *outptr = (*inptr - '0') << 4;
+ *outptr = (char)((*inptr - '0') << 4);
inptr ++;
@@ -2464,9 +2428,9 @@ ppd_decode(char *string) /* I - String to decode */
break;
if (_cups_isalpha(*inptr))
- *outptr |= tolower(*inptr) - 'a' + 10;
+ *outptr |= (char)(tolower(*inptr) - 'a' + 10);
else
- *outptr |= *inptr - '0';
+ *outptr |= (char)(*inptr - '0');
inptr ++;
outptr ++;
@@ -2687,8 +2651,7 @@ ppd_get_group(ppd_file_t *ppd, /* I - PPD file */
if (ppd->num_groups == 0)
group = malloc(sizeof(ppd_group_t));
else
- group = realloc(ppd->groups,
- (ppd->num_groups + 1) * sizeof(ppd_group_t));
+ group = realloc(ppd->groups, (size_t)(ppd->num_groups + 1) * sizeof(ppd_group_t));
if (group == NULL)
{
@@ -2736,8 +2699,7 @@ ppd_get_option(ppd_group_t *group, /* I - Group */
if (group->num_options == 0)
option = malloc(sizeof(ppd_option_t));
else
- option = realloc(group->options,
- (group->num_options + 1) * sizeof(ppd_option_t));
+ option = realloc(group->options, (size_t)(group->num_options + 1) * sizeof(ppd_option_t));
if (option == NULL)
return (NULL);
@@ -2917,7 +2879,7 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
* Any other character...
*/
- *lineptr++ = ch;
+ *lineptr++ = (char)ch;
col ++;
if (col > (PPD_MAX_LINE - 1))
@@ -3370,7 +3332,7 @@ ppd_update_filters(ppd_file_t *ppd,/* I - PPD file */
if (ppd->num_filters == 0)
filter = malloc(sizeof(char *));
else
- filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1));
+ filter = realloc(ppd->filters, sizeof(char *) * (size_t)(ppd->num_filters + 1));
if (filter == NULL)
{
@@ -3394,5 +3356,5 @@ ppd_update_filters(ppd_file_t *ppd,/* I - PPD file */
/*
- * End of "$Id: ppd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd.c 12848 2015-08-26 18:51:57Z msweet $".
*/
diff --git a/cups/ppd.h b/cups/ppd.h
index b8fa365..d234a59 100644
--- a/cups/ppd.h
+++ b/cups/ppd.h
@@ -1,5 +1,5 @@
/*
- * "$Id: ppd.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd.h 11056 2013-06-25 14:27:30Z msweet $"
*
* PostScript Printer Description definitions for CUPS.
*
@@ -7,7 +7,7 @@
* -D_PPD_DEPRECATED="" TO YOUR COMPILE OPTIONS. THIS HEADER AND THESE
* FUNCTIONS WILL BE REMOVED IN A FUTURE RELEASE OF CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -56,19 +56,7 @@ extern "C" {
*/
# ifndef _PPD_DEPRECATED
-# if defined(__APPLE__)
-# if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8
- /* Building for OS X 10.7 and earlier */
-# define _PPD_DEPRECATED
-# elif !defined(MAC_OS_X_VERSION_10_8)
- /* Building for OS X 10.7 and earlier */
-# define _PPD_DEPRECATED
-# else
-# define _PPD_DEPRECATED _CUPS_DEPRECATED
-# endif /* MAC_OS_X_VERSION_10_8 && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 */
-# else
-# define _PPD_DEPRECATED _CUPS_DEPRECATED
-# endif /* __APPLE__ */
+# define _PPD_DEPRECATED _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead.")
# endif /* !_PPD_DEPRECATED */
@@ -375,32 +363,39 @@ typedef struct ppd_file_s /**** PPD File ****/
*/
extern int cupsMarkOptions(ppd_file_t *ppd, int num_options,
- cups_option_t *options);
-extern void ppdClose(ppd_file_t *ppd);
+ cups_option_t *options) _PPD_DEPRECATED;
+extern void ppdClose(ppd_file_t *ppd) _PPD_DEPRECATED;
extern int ppdCollect(ppd_file_t *ppd, ppd_section_t section,
- ppd_choice_t ***choices);
-extern int ppdConflicts(ppd_file_t *ppd);
+ ppd_choice_t ***choices) _PPD_DEPRECATED;
+extern int ppdConflicts(ppd_file_t *ppd) _PPD_DEPRECATED;
extern int ppdEmit(ppd_file_t *ppd, FILE *fp,
- ppd_section_t section);
+ ppd_section_t section) _PPD_DEPRECATED;
extern int ppdEmitFd(ppd_file_t *ppd, int fd,
- ppd_section_t section);
+ ppd_section_t section) _PPD_DEPRECATED;
extern int ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id,
- const char *user, const char *title);
-extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *option);
+ const char *user, const char *title)
+ _PPD_DEPRECATED;
+extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *option)
+ _PPD_DEPRECATED;
extern ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd,
- const char *keyword);
-extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *keyword);
+ const char *keyword)
+ _PPD_DEPRECATED;
+extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *keyword)
+ _PPD_DEPRECATED;
extern int ppdIsMarked(ppd_file_t *ppd, const char *keyword,
- const char *option);
-extern void ppdMarkDefaults(ppd_file_t *ppd);
+ const char *option) _PPD_DEPRECATED;
+extern void ppdMarkDefaults(ppd_file_t *ppd) _PPD_DEPRECATED;
extern int ppdMarkOption(ppd_file_t *ppd, const char *keyword,
- const char *option);
-extern ppd_file_t *ppdOpen(FILE *fp);
-extern ppd_file_t *ppdOpenFd(int fd);
-extern ppd_file_t *ppdOpenFile(const char *filename);
-extern float ppdPageLength(ppd_file_t *ppd, const char *name);
-extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name);
-extern float ppdPageWidth(ppd_file_t *ppd, const char *name);
+ const char *option) _PPD_DEPRECATED;
+extern ppd_file_t *ppdOpen(FILE *fp) _PPD_DEPRECATED;
+extern ppd_file_t *ppdOpenFd(int fd) _PPD_DEPRECATED;
+extern ppd_file_t *ppdOpenFile(const char *filename) _PPD_DEPRECATED;
+extern float ppdPageLength(ppd_file_t *ppd, const char *name)
+ _PPD_DEPRECATED;
+extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name)
+ _PPD_DEPRECATED;
+extern float ppdPageWidth(ppd_file_t *ppd, const char *name)
+ _PPD_DEPRECATED;
/**** New in CUPS 1.1.19 ****/
extern const char *ppdErrorString(ppd_status_t status) _PPD_DEPRECATED;
@@ -420,14 +415,17 @@ extern int ppdCollect2(ppd_file_t *ppd, ppd_section_t section,
extern int ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp,
ppd_section_t section, int limit,
float min_order) _PPD_DEPRECATED;
-extern int ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp) _PPD_DEPRECATED;
+extern int ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp)
+ _PPD_DEPRECATED;
extern char *ppdEmitString(ppd_file_t *ppd, ppd_section_t section,
float min_order) _PPD_DEPRECATED;
extern ppd_coption_t *ppdFindCustomOption(ppd_file_t *ppd,
- const char *keyword) _PPD_DEPRECATED;
+ const char *keyword)
+ _PPD_DEPRECATED;
extern ppd_cparam_t *ppdFindCustomParam(ppd_coption_t *opt,
const char *name) _PPD_DEPRECATED;
-extern ppd_cparam_t *ppdFirstCustomParam(ppd_coption_t *opt) _PPD_DEPRECATED;
+extern ppd_cparam_t *ppdFirstCustomParam(ppd_coption_t *opt)
+ _PPD_DEPRECATED;
extern ppd_option_t *ppdFirstOption(ppd_file_t *ppd) _PPD_DEPRECATED;
extern ppd_cparam_t *ppdNextCustomParam(ppd_coption_t *opt) _PPD_DEPRECATED;
extern ppd_option_t *ppdNextOption(ppd_file_t *ppd) _PPD_DEPRECATED;
@@ -445,7 +443,7 @@ extern const char *ppdLocalizeIPPReason(ppd_file_t *ppd,
extern int cupsGetConflicts(ppd_file_t *ppd, const char *option,
const char *choice,
cups_option_t **options)
- _PPD_DEPRECATED;
+ _PPD_DEPRECATED;
extern int cupsResolveConflicts(ppd_file_t *ppd,
const char *option,
const char *choice,
@@ -455,7 +453,7 @@ extern int cupsResolveConflicts(ppd_file_t *ppd,
extern int ppdInstallableConflict(ppd_file_t *ppd,
const char *option,
const char *choice)
- _PPD_DEPRECATED;
+ _PPD_DEPRECATED;
extern ppd_attr_t *ppdLocalizeAttr(ppd_file_t *ppd, const char *keyword,
const char *spec) _PPD_DEPRECATED;
extern const char *ppdLocalizeMarkerName(ppd_file_t *ppd,
@@ -476,5 +474,5 @@ extern int ppdPageSizeLimits(ppd_file_t *ppd,
#endif /* !_CUPS_PPD_H_ */
/*
- * End of "$Id: ppd.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd.h 11056 2013-06-25 14:27:30Z msweet $".
*/
diff --git a/cups/pwg-media.c b/cups/pwg-media.c
index 54574f1..f1e2b0f 100644
--- a/cups/pwg-media.c
+++ b/cups/pwg-media.c
@@ -1,33 +1,17 @@
/*
- * "$Id: pwg-media.c 11241 2013-08-14 20:41:32Z msweet $"
+ * "$Id: pwg-media.c 11881 2014-05-16 20:59:22Z msweet $"
*
- * PWG media name API implementation for CUPS.
+ * PWG media name API implementation for CUPS.
*
- * Copyright 2009-2013 by Apple Inc.
+ * Copyright 2009-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _pwgFormatInches() - Convert and format PWG units as inches.
- * _pwgFormatMillimeters() - Convert and format PWG units as millimeters.
- * _pwgGenerateSize() - Generate a PWG size keyword.
- * _pwgInitSize() - Initialize a PWG size using IPP job template
- * attributes.
- * _pwgMediaForLegacy() - Find a PWG media size by ISO/IPP legacy name.
- * _pwgMediaForPPD() - Find a PWG media size by Adobe PPD name.
- * _pwgMediaForPWG() - Find a PWG media size by 5101.1 self-describing
- * name.
- * _pwgMediaForSize() - Get the PWG media name for a given size.
- * pwg_compare_legacy() - Compare two sizes using the legacy names.
- * pwg_compare_ppd() - Compare two sizes using the PPD names.
- * pwg_compare_pwg() - Compare two sizes using the PWG names.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -50,16 +34,20 @@
* Local functions...
*/
-static int pwg_compare_legacy(_pwg_media_t *a, _pwg_media_t *b);
-static int pwg_compare_pwg(_pwg_media_t *a, _pwg_media_t *b);
-static int pwg_compare_ppd(_pwg_media_t *a, _pwg_media_t *b);
+static int pwg_compare_legacy(pwg_media_t *a, pwg_media_t *b);
+static int pwg_compare_pwg(pwg_media_t *a, pwg_media_t *b);
+static int pwg_compare_ppd(pwg_media_t *a, pwg_media_t *b);
+static char *pwg_format_inches(char *buf, size_t bufsize, int val);
+static char *pwg_format_millimeters(char *buf, size_t bufsize, int val);
+static int pwg_scan_measurement(const char *buf, char **bufptr, int numer,
+ int denom);
/*
* Local globals...
*/
-static _pwg_media_t const cups_pwg_media[] =
+static pwg_media_t const cups_pwg_media[] =
{ /* Media size lookup table */
/* North American Standard Sheet Media Sizes */
_PWG_MEDIA_IN("na_index-3x5_3x5in", NULL, "3x5", 3, 5),
@@ -87,6 +75,7 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_IN("na_fanfold-eur_8.5x12in", NULL, "FanFoldGerman", 8.5, 12),
_PWG_MEDIA_IN("na_letter-plus_8.5x12.69in", NULL, "LetterPlus", 8.5, 12.69),
_PWG_MEDIA_IN("na_foolscap_8.5x13in", NULL, "FanFoldGermanLegal", 8.5, 13),
+ _PWG_MEDIA_IN("na_oficio_8.5x13.4in", NULL, "Oficio", 8.5, 13.4),
_PWG_MEDIA_IN("na_legal_8.5x14in", "na-legal", "Legal", 8.5, 14),
_PWG_MEDIA_IN("na_super-a_8.94x14in", NULL, "SuperA", 8.94, 14),
_PWG_MEDIA_IN("na_9x11_9x11in", "na-9x11-envelope", "9x11", 9, 11),
@@ -117,10 +106,6 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_IN("na_arch-e_36x48in", "arch-e", "ARCHE", 36, 48),
_PWG_MEDIA_IN("na_f_44x68in", NULL, "AnsiF", 44, 68),
- /* Chinese Standard Sheet Media Inch Sizes */
- _PWG_MEDIA_IN("roc_16k_7.75x10.75in", NULL, "roc16k", 7.75, 10.75),
- _PWG_MEDIA_IN("roc_8k_10.75x15.5in", NULL, "roc8k", 10.75, 15.5),
-
/* ISO Standard Sheet Media Sizes */
_PWG_MEDIA_MM("iso_a10_26x37mm", "iso-a10", "A10", 26, 37),
_PWG_MEDIA_MM("iso_a9_37x52mm", "iso-a9", "A9", 37, 52),
@@ -183,6 +168,10 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_MM("iso_c1_648x917mm", "iso-c1", "EnvC1", 648, 917),
_PWG_MEDIA_MM("iso_c0_917x1297mm", "iso-c0", "EnvC0", 917, 1297),
_PWG_MEDIA_MM("iso_dl_110x220mm", "iso-designated", "EnvDL", 110, 220),
+ _PWG_MEDIA_MM("iso_ra4_215x305mm", "iso-ra4", NULL, 215, 305),
+ _PWG_MEDIA_MM("iso_sra4_225x320mm", "iso-sra4", NULL, 225, 320),
+ _PWG_MEDIA_MM("iso_ra3_305x430mm", "iso-ra3", NULL, 305, 430),
+ _PWG_MEDIA_MM("iso_sra3_320x450mm", "iso-sra3", NULL, 320, 450),
_PWG_MEDIA_MM("iso_ra2_430x610mm", "iso-ra2", NULL, 430, 610),
_PWG_MEDIA_MM("iso_sra2_450x640mm", "iso-sra2", NULL, 450, 640),
_PWG_MEDIA_MM("iso_ra1_610x860mm", "iso-ra1", NULL, 610, 860),
@@ -203,22 +192,27 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_MM("jis_b1_728x1030mm", "jis-b1", "B1", 728, 1030),
_PWG_MEDIA_MM("jis_b0_1030x1456mm", "jis-b0", "B0", 1030, 1456),
_PWG_MEDIA_MM("jis_exec_216x330mm", NULL, NULL, 216, 330),
+ _PWG_MEDIA_MM("jpn_kaku2_240x332mm", NULL, "EnvKaku2", 240, 332),
+ _PWG_MEDIA_MM("jpn_kaku3_216x277mm", NULL, "EnvKaku3", 216, 277),
+ _PWG_MEDIA_MM("jpn_kaku4_197x267mm", NULL, "EnvKaku4", 197, 267),
+ _PWG_MEDIA_MM("jpn_kaku5_190x240mm", NULL, "EnvKaku5", 190, 240),
+ _PWG_MEDIA_MM("jpn_kaku7_142x205mm", NULL, "EnvKaku7", 142, 205),
+ _PWG_MEDIA_MM("jpn_kaku8_119x197mm", NULL, "EnvKaku8", 119, 197),
_PWG_MEDIA_MM("jpn_chou4_90x205mm", NULL, "EnvChou4", 90, 205),
_PWG_MEDIA_MM("jpn_hagaki_100x148mm", NULL, "Postcard", 100, 148),
_PWG_MEDIA_MM("jpn_you4_105x235mm", NULL, "EnvYou4", 105, 235),
_PWG_MEDIA_MM("jpn_you6_98x190mm", NULL, "EnvYou6", 98, 190),
_PWG_MEDIA_MM("jpn_chou2_111.1x146mm", NULL, NULL, 111.1, 146),
_PWG_MEDIA_MM("jpn_chou3_120x235mm", NULL, "EnvChou3", 120, 235),
+ _PWG_MEDIA_MM("jpn_chou40_90x225mm", NULL, "EnvChou40", 90, 225),
_PWG_MEDIA_MM("jpn_oufuku_148x200mm", NULL, "DoublePostcardRotated", 148, 200),
_PWG_MEDIA_MM("jpn_kahu_240x322.1mm", NULL, NULL, 240, 322.1),
- _PWG_MEDIA_MM("jpn_kaku2_240x332mm", NULL, "EnvKaku2", 240, 332),
/* Chinese Standard Sheet Media Sizes */
_PWG_MEDIA_MM("prc_32k_97x151mm", NULL, "PRC32K", 97, 151),
_PWG_MEDIA_MM("prc_1_102x165mm", NULL, "EnvPRC1", 102, 165),
_PWG_MEDIA_MM("prc_2_102x176mm", NULL, "EnvPRC2", 102, 176),
_PWG_MEDIA_MM("prc_4_110x208mm", NULL, "EnvPRC4", 110, 208),
- _PWG_MEDIA_MM("prc_5_110x220mm", NULL, "EnvPRC5", 110, 220),
_PWG_MEDIA_MM("prc_8_120x309mm", NULL, "EnvPRC8", 120, 309),
_PWG_MEDIA_MM("prc_6_120x320mm", NULL, NULL, 120, 320),
_PWG_MEDIA_MM("prc_16k_146x215mm", NULL, "PRC16K", 146, 215),
@@ -227,6 +221,10 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_MM("om_pa-kai_267x389mm", NULL, NULL, 267, 389),
_PWG_MEDIA_MM("om_dai-pa-kai_275x395mm", NULL, NULL, 275, 395),
+ /* Chinese Standard Sheet Media Inch Sizes */
+ _PWG_MEDIA_IN("roc_16k_7.75x10.75in", NULL, "roc16k", 7.75, 10.75),
+ _PWG_MEDIA_IN("roc_8k_10.75x15.5in", NULL, "roc8k", 10.75, 15.5),
+
/* Other English Standard Sheet Media Sizes */
_PWG_MEDIA_IN("oe_photo-l_3.5x5in", NULL, "3.5x5", 3.5, 5),
@@ -236,136 +234,133 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_MM("om_large-photo_200x300", NULL, "om_large-photo", 200, 300),
_PWG_MEDIA_MM("om_folio_210x330mm", "folio", "Folio", 210, 330),
_PWG_MEDIA_MM("om_folio-sp_215x315mm", NULL, "FolioSP", 215, 315),
- _PWG_MEDIA_MM("om_invite_220x220mm", NULL, "EnvInvite", 220, 220)
+ _PWG_MEDIA_MM("om_invite_220x220mm", NULL, "EnvInvite", 220, 220),
+ _PWG_MEDIA_MM("om_small-photo_100x200mm", NULL, "om_wide-photo", 100, 200)
};
/*
- * '_pwgFormatInches()' - Convert and format PWG units as inches.
+ * 'pwgFormatSizeName()' - Generate a PWG self-describing media size name.
+ *
+ * This function generates a PWG self-describing media size name of the form
+ * "prefix_name_WIDTHxLENGTHunits". The prefix is typically "custom" or "roll"
+ * for user-supplied sizes but can also be "disc", "iso", "jis", "jpn", "na",
+ * "oe", "om", "prc", or "roc". A value of @code NULL@ automatically chooses
+ * "oe" or "om" depending on the units.
+ *
+ * The size name may only contain lowercase letters, numbers, "-", and ".". If
+ * @code NULL@ is passed, the size name will contain the formatted dimensions.
+ *
+ * The width and length are specified in hundredths of millimeters, equivalent
+ * to 1/100000th of a meter or 1/2540th of an inch. The width, length, and
+ * units used for the generated size name are calculated automatically if the
+ * units string is @code NULL@, otherwise inches ("in") or millimeters ("mm")
+ * are used.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-char * /* O - String */
-_pwgFormatInches(char *buf, /* I - Buffer */
- size_t bufsize, /* I - Size of buffer */
- int val) /* I - Value in hundredths of millimeters */
+int /* O - 1 on success, 0 on failure */
+pwgFormatSizeName(char *keyword, /* I - Keyword buffer */
+ size_t keysize, /* I - Size of keyword buffer */
+ const char *prefix, /* I - Prefix for PWG size or @code NULL@ for automatic */
+ const char *name, /* I - Size name or @code NULL@ */
+ int width, /* I - Width of page in 2540ths */
+ int length, /* I - Length of page in 2540ths */
+ const char *units) /* I - Units - "in", "mm", or @code NULL@ for automatic */
{
- int thousandths, /* Thousandths of inches */
- integer, /* Integer portion */
- fraction; /* Fractional portion */
+ char usize[12 + 1 + 12 + 3], /* Unit size: NNNNNNNNNNNNxNNNNNNNNNNNNuu */
+ *uptr; /* Pointer into unit size */
+ char *(*format)(char *, size_t, int);
+ /* Formatting function */
/*
- * Convert hundredths of millimeters to thousandths of inches and round to
- * the nearest thousandth.
+ * Range check input...
*/
- thousandths = (val * 1000 + 1270) / 2540;
- integer = thousandths / 1000;
- fraction = thousandths % 1000;
+ DEBUG_printf(("pwgFormatSize(keyword=%p, keysize=" CUPS_LLFMT
+ ", prefix=\"%s\", name=\"%s\", width=%d, length=%d, "
+ "units=\"%s\")", keyword, CUPS_LLCAST keysize, prefix, name,
+ width, length, units));
- /*
- * Format as a pair of integers (avoids locale stuff), avoiding trailing
- * zeros...
- */
+ if (keyword)
+ *keyword = '\0';
- if (fraction == 0)
- snprintf(buf, bufsize, "%d", integer);
- else if (fraction % 10)
- snprintf(buf, bufsize, "%d.%03d", integer, fraction);
- else if (fraction % 100)
- snprintf(buf, bufsize, "%d.%02d", integer, fraction / 10);
- else
- snprintf(buf, bufsize, "%d.%01d", integer, fraction / 100);
-
- return (buf);
-}
-
-
-/*
- * '_pwgFormatMillimeters()' - Convert and format PWG units as millimeters.
- */
-
-char * /* O - String */
-_pwgFormatMillimeters(char *buf, /* I - Buffer */
- size_t bufsize, /* I - Size of buffer */
- int val) /* I - Value in hundredths of millimeters */
-{
- int integer, /* Integer portion */
- fraction; /* Fractional portion */
-
-
- /*
- * Convert hundredths of millimeters to integer and fractional portions.
- */
+ if (!keyword || keysize < 32 || width < 0 || length < 0 ||
+ (units && strcmp(units, "in") && strcmp(units, "mm")))
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid media name arguments."),
+ 1);
+ return (0);
+ }
- integer = val / 100;
- fraction = val % 100;
+ if (name)
+ {
+ /*
+ * Validate name...
+ */
- /*
- * Format as a pair of integers (avoids locale stuff), avoiding trailing
- * zeros...
- */
+ const char *nameptr; /* Pointer into name */
- if (fraction == 0)
- snprintf(buf, bufsize, "%d", integer);
- else if (fraction % 10)
- snprintf(buf, bufsize, "%d.%02d", integer, fraction);
+ for (nameptr = name; *nameptr; nameptr ++)
+ if (!(*nameptr >= 'a' && *nameptr <= 'z') &&
+ !(*nameptr >= '0' && *nameptr <= '9') &&
+ *nameptr != '.' && *nameptr != '-')
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
+ _("Invalid media name arguments."), 1);
+ return (0);
+ }
+ }
else
- snprintf(buf, bufsize, "%d.%01d", integer, fraction / 10);
-
- return (buf);
-}
+ name = usize;
-/*
- * '_pwgGenerateSize()' - Generate a PWG size keyword.
- */
+ if (!units)
+ {
+ if ((width % 635) == 0 && (length % 635) == 0)
+ {
+ /*
+ * Use inches since the size is a multiple of 1/4 inch.
+ */
-void
-_pwgGenerateSize(char *keyword, /* I - Keyword buffer */
- size_t keysize, /* I - Size of keyword buffer */
- const char *prefix, /* I - Prefix for PWG size or NULL */
- const char *name, /* I - Size name or NULL */
- int width, /* I - Width of page in 2540ths */
- int length) /* I - Length of page in 2540ths */
-{
- const char *units; /* Units to report */
- char usize[12 + 1 + 12 + 3], /* Unit size: NNNNNNNNNNNNxNNNNNNNNNNNNuu */
- *uptr; /* Pointer into unit size */
- char *(*format)(char *, size_t, int);
- /* Formatting function */
+ units = "in";
+ }
+ else
+ {
+ /*
+ * Use millimeters since the size is not a multiple of 1/4 inch.
+ */
+ units = "mm";
+ }
+ }
- if ((width % 635) == 0 && (length % 635) == 0)
+ if (!strcmp(units, "in"))
{
- /*
- * Use inches since the size is a multiple of 1/4 inch.
- */
-
- units = "in";
- format = _pwgFormatInches;
+ format = pwg_format_inches;
if (!prefix)
prefix = "oe";
}
else
{
- /*
- * Use millimeters since the size is not a multiple of 1/4 inch.
- */
-
- units = "mm";
- format = _pwgFormatMillimeters;
+ format = pwg_format_millimeters;
if (!prefix)
prefix = "om";
}
+ /*
+ * Format the size string...
+ */
+
uptr = usize;
- (*format)(uptr, sizeof(usize) - (uptr - usize), width);
+ (*format)(uptr, sizeof(usize) - (size_t)(uptr - usize), width);
uptr += strlen(uptr);
*uptr++ = 'x';
- (*format)(uptr, sizeof(usize) - (uptr - usize), length);
+ (*format)(uptr, sizeof(usize) - (size_t)(uptr - usize), length);
uptr += strlen(uptr);
/*
@@ -374,25 +369,40 @@ _pwgGenerateSize(char *keyword, /* I - Keyword buffer */
memcpy(uptr, units, 3);
- if (!name)
- name = usize;
-
/*
* Format the name...
*/
snprintf(keyword, keysize, "%s_%s_%s", prefix, name, usize);
+
+ return (1);
}
+/* For OS X 10.8 and earlier... */
+void _pwgGenerateSize(char *keyword, size_t keysize, const char *prefix,
+ const char *name, int width, int length)
+{ pwgFormatSizeName(keyword, keysize, prefix, name, width, length, NULL); }
+
/*
- * '_pwgInitSize()' - Initialize a PWG size using IPP job template attributes.
+ * 'pwgInitSize()' - Initialize a pwg_size_t structure using IPP Job Template
+ * attributes.
+ *
+ * This function initializes a pwg_size_t structure from an IPP "media" or
+ * "media-col" attribute in the specified IPP message. 0 is returned if neither
+ * attribute is found in the message or the values are not valid.
+ *
+ * The "margins_set" variable is initialized to 1 if any "media-xxx-margin"
+ * member attribute was specified in the "media-col" Job Template attribute,
+ * otherwise it is initialized to 0.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-int /* O - 1 if size was initialize, 0 otherwise */
-_pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
- ipp_t *job, /* I - Job template attributes */
- int *margins_set) /* O - 1 if margins were set, 0 otherwise */
+int /* O - 1 if size was initialized, 0 otherwise */
+pwgInitSize(pwg_size_t *size, /* I - Size to initialize */
+ ipp_t *job, /* I - Job template attributes */
+ int *margins_set) /* O - 1 if margins were set, 0 otherwise */
{
ipp_attribute_t *media, /* media attribute */
*media_bottom_margin, /* media-bottom-margin member attribute */
@@ -403,7 +413,7 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
*media_top_margin, /* media-top-margin member attribute */
*x_dimension, /* x-dimension member attribute */
*y_dimension; /* y-dimension member attribute */
- _pwg_media_t *pwg; /* PWG media value */
+ pwg_media_t *pwg; /* PWG media value */
/*
@@ -417,7 +427,7 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
* Look for media-col and then media...
*/
- memset(size, 0, sizeof(_pwg_size_t));
+ memset(size, 0, sizeof(pwg_size_t));
*margins_set = 0;
if ((media_col = ippFindAttribute(job, "media-col",
@@ -448,20 +458,20 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
}
else if (!x_dimension)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("Missing x-dimension in media-size."), 1);
return (0);
}
else if (!y_dimension)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("Missing y-dimension in media-size."), 1);
return (0);
}
}
else
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Missing media-size in media-col."),
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing media-size in media-col."),
1);
return (0);
}
@@ -496,18 +506,18 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
if ((media = ippFindAttribute(job, "PageSize", IPP_TAG_NAME)) == NULL)
media = ippFindAttribute(job, "PageRegion", IPP_TAG_NAME);
- if (media)
+ if (media && media->values[0].string.text)
{
const char *name = media->values[0].string.text;
/* Name string */
- if ((pwg = _pwgMediaForPWG(name)) == NULL)
+ if ((pwg = pwgMediaForPWG(name)) == NULL)
{
/*
* Not a PWG name, try a legacy name...
*/
- if ((pwg = _pwgMediaForLegacy(name)) == NULL)
+ if ((pwg = pwgMediaForLegacy(name)) == NULL)
{
/*
* Not a legacy name, try a PPD name...
@@ -515,7 +525,7 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
const char *suffix; /* Suffix on media string */
- pwg = _pwgMediaForPPD(name);
+ pwg = pwgMediaForPPD(name);
if (pwg &&
(suffix = name + strlen(name) - 10 /* .FullBleed */) > name &&
!_cups_strcasecmp(suffix, ".FullBleed"))
@@ -536,13 +546,13 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
}
else
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Unsupported media value."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unsupported media value."), 1);
return (0);
}
}
else
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Missing media or media-col."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing media or media-col."), 1);
return (0);
}
}
@@ -550,16 +560,24 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
return (1);
}
+/* For OS X 10.8 and earlier */
+int _pwgInitSize(pwg_size_t *size, ipp_t *job, int *margins_set)
+{ return (pwgInitSize(size, job, margins_set)); }
+
/*
- * '_pwgMediaForLegacy()' - Find a PWG media size by ISO/IPP legacy name.
+ * 'pwgMediaForLegacy()' - Find a PWG media size by ISO/IPP legacy name.
+ *
+ * The "name" argument specifies the legacy ISO media size name, for example
+ * "iso-a4" or "na-letter".
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-_pwg_media_t * /* O - Matching size or NULL */
-_pwgMediaForLegacy(
- const char *legacy) /* I - Legacy size name */
+pwg_media_t * /* O - Matching size or NULL */
+pwgMediaForLegacy(const char *legacy) /* I - Legacy size name */
{
- _pwg_media_t key; /* Search key */
+ pwg_media_t key; /* Search key */
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
@@ -577,13 +595,13 @@ _pwgMediaForLegacy(
if (!cg->leg_size_lut)
{
int i; /* Looping var */
- _pwg_media_t *size; /* Current size */
+ pwg_media_t *size; /* Current size */
cg->leg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_legacy,
NULL);
for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])),
- size = (_pwg_media_t *)cups_pwg_media;
+ size = (pwg_media_t *)cups_pwg_media;
i > 0;
i --, size ++)
if (size->legacy)
@@ -595,18 +613,33 @@ _pwgMediaForLegacy(
*/
key.legacy = legacy;
- return ((_pwg_media_t *)cupsArrayFind(cg->leg_size_lut, &key));
+ return ((pwg_media_t *)cupsArrayFind(cg->leg_size_lut, &key));
}
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForLegacy(const char *legacy)
+{ return (pwgMediaForLegacy(legacy)); }
+
/*
- * '_pwgMediaForPPD()' - Find a PWG media size by Adobe PPD name.
+ * 'pwgMediaForPPD()' - Find a PWG media size by Adobe PPD name.
+ *
+ * The "ppd" argument specifies an Adobe page size name as defined in Table B.1
+ * of the Adobe PostScript Printer Description File Format Specification Version
+ * 4.3.
+ *
+ * If the name is non-standard, the returned PWG media size is stored in
+ * thread-local storage and is overwritten by each call to the function in the
+ * thread. Custom names can be of the form "Custom.WIDTHxLENGTH[units]" or
+ * "WIDTHxLENGTH[units]".
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-_pwg_media_t * /* O - Matching size or NULL */
-_pwgMediaForPPD(const char *ppd) /* I - PPD size name */
+pwg_media_t * /* O - Matching size or NULL */
+pwgMediaForPPD(const char *ppd) /* I - PPD size name */
{
- _pwg_media_t key, /* Search key */
+ pwg_media_t key, /* Search key */
*size; /* Matching size */
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
@@ -629,7 +662,7 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
cg->ppd_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_ppd, NULL);
for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])),
- size = (_pwg_media_t *)cups_pwg_media;
+ size = (pwg_media_t *)cups_pwg_media;
i > 0;
i --, size ++)
if (size->ppd)
@@ -641,7 +674,7 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
*/
key.ppd = ppd;
- if ((size = (_pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL)
+ if ((size = (pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL)
{
/*
* See if the name is of the form:
@@ -655,77 +688,101 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
* [Custom.]WIDTHxLENGTHpt[.FullBleed] - Size in points [borderless]
*/
- double w, l, /* Width and length of page */
- factor; /* Unit scaling factor */
+ int w, l, /* Width and length of page */
+ numer, /* Unit scaling factor */
+ denom; /* ... */
char *ptr; /* Pointer into name */
- struct lconv *loc; /* Locale data */
+ const char *units; /* Pointer to units */
int custom; /* Custom page size? */
+
if (!_cups_strncasecmp(ppd, "Custom.", 7))
{
custom = 1;
- factor = 2540.0 / 72.0;
+ numer = 2540;
+ denom = 72;
ptr = (char *)ppd + 7;
}
else
{
custom = 0;
- factor = 2540.0;
+ numer = 2540;
+ denom = 1;
ptr = (char *)ppd;
}
- loc = localeconv();
- w = _cupsStrScand(ptr, &ptr, loc);
+ /*
+ * Find any units in the size...
+ */
- if (ptr && ptr > ppd && *ptr == 'x')
+ units = strchr(ptr, '.');
+ while (units && isdigit(units[1] & 255))
+ units = strchr(units + 1, '.');
+
+ if (units)
+ units -= 2;
+ else
+ units = ptr + strlen(ptr) - 2;
+
+ if (units > ptr)
{
- l = _cupsStrScand(ptr + 1, &ptr, loc);
-
- if (ptr &&
- (!*ptr ||
- !_cups_strcasecmp(ptr, "FullBleed") ||
- !_cups_strcasecmp(ptr, ".FullBleed") ||
- !_cups_strcasecmp(ptr, "cm") ||
- !_cups_strcasecmp(ptr, "cm.FullBleed") ||
- !_cups_strcasecmp(ptr, "ft") ||
- !_cups_strcasecmp(ptr, "ft.FullBleed") ||
- !_cups_strcasecmp(ptr, "in") ||
- !_cups_strcasecmp(ptr, "in.FullBleed") ||
- !_cups_strcasecmp(ptr, "m") ||
- !_cups_strcasecmp(ptr, "m.FullBleed") ||
- !_cups_strcasecmp(ptr, "mm") ||
- !_cups_strcasecmp(ptr, "mm.FullBleed") ||
- !_cups_strcasecmp(ptr, "pt") ||
- !_cups_strcasecmp(ptr, "pt.FullBleed")))
+ if (isdigit(*units & 255) || *units == '.')
+ units ++;
+
+ if (!_cups_strncasecmp(units, "cm", 2))
{
- size = &(cg->pwg_media);
-
- if (!_cups_strncasecmp(ptr, "cm", 2))
- factor = 1000.0;
- else if (!_cups_strncasecmp(ptr, "ft", 2))
- factor = 2540.0 * 12.0;
- else if (!_cups_strncasecmp(ptr, "in", 2))
- factor = 2540.0;
- else if (!_cups_strncasecmp(ptr, "mm", 2))
- factor = 100.0;
- else if (*ptr == 'm' || *ptr == 'M')
- factor = 100000.0;
- else if (!_cups_strncasecmp(ptr, "pt", 2))
- factor = 2540.0 / 72.0;
+ numer = 1000;
+ denom = 1;
+ }
+ else if (!_cups_strncasecmp(units, "ft", 2))
+ {
+ numer = 2540 * 12;
+ denom = 1;
+ }
+ else if (!_cups_strncasecmp(units, "in", 2))
+ {
+ numer = 2540;
+ denom = 1;
+ }
+ else if (!_cups_strncasecmp(units, "mm", 2))
+ {
+ numer = 100;
+ denom = 1;
+ }
+ else if (*units == 'm' || *units == 'M')
+ {
+ numer = 100000;
+ denom = 1;
+ }
+ else if (!_cups_strncasecmp(units, "pt", 2))
+ {
+ numer = 2540;
+ denom = 72;
+ }
+ }
+ w = pwg_scan_measurement(ptr, &ptr, numer, denom);
+
+ if (ptr && ptr > ppd && *ptr == 'x')
+ {
+ l = pwg_scan_measurement(ptr + 1, &ptr, numer, denom);
+
+ if (ptr)
+ {
/*
* Not a standard size; convert it to a PWG custom name of the form:
*
* [oe|om]_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu
*/
- size->width = (int)(w * factor);
- size->length = (int)(l * factor);
+ size = &(cg->pwg_media);
+ size->width = w;
+ size->length = l;
size->pwg = cg->pwg_name;
- _pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name),
- custom ? "custom" : NULL, custom ? ppd + 7 : NULL,
- size->width, size->length);
+ pwgFormatSizeName(cg->pwg_name, sizeof(cg->pwg_name),
+ custom ? "custom" : NULL, custom ? ppd + 7 : NULL,
+ size->width, size->length, NULL);
}
}
}
@@ -733,16 +790,29 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
return (size);
}
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForPPD(const char *ppd)
+{ return (pwgMediaForPPD(ppd)); }
+
/*
- * '_pwgMediaForPWG()' - Find a PWG media size by 5101.1 self-describing name.
+ * 'pwgMediaForPWG()' - Find a PWG media size by 5101.1 self-describing name.
+ *
+ * The "pwg" argument specifies a self-describing media size name of the form
+ * "prefix_name_WIDTHxLENGTHunits" as defined in PWG 5101.1.
+ *
+ * If the name is non-standard, the returned PWG media size is stored in
+ * thread-local storage and is overwritten by each call to the function in the
+ * thread.
+ *
+ * @since CUPS 1.7/OS X 10.9@
*/
-_pwg_media_t * /* O - Matching size or NULL */
-_pwgMediaForPWG(const char *pwg) /* I - PWG size name */
+pwg_media_t * /* O - Matching size or NULL */
+pwgMediaForPWG(const char *pwg) /* I - PWG size name */
{
char *ptr; /* Pointer into name */
- _pwg_media_t key, /* Search key */
+ pwg_media_t key, /* Search key */
*size; /* Matching size */
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
@@ -765,7 +835,7 @@ _pwgMediaForPWG(const char *pwg) /* I - PWG size name */
cg->pwg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_pwg, NULL);
for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])),
- size = (_pwg_media_t *)cups_pwg_media;
+ size = (pwg_media_t *)cups_pwg_media;
i > 0;
i --, size ++)
cupsArrayAdd(cg->pwg_size_lut, size);
@@ -776,7 +846,7 @@ _pwgMediaForPWG(const char *pwg) /* I - PWG size name */
*/
key.pwg = pwg;
- if ((size = (_pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL &&
+ if ((size = (pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL &&
(ptr = (char *)strchr(pwg, '_')) != NULL &&
(ptr = (char *)strchr(ptr + 1, '_')) != NULL)
{
@@ -787,31 +857,29 @@ _pwgMediaForPWG(const char *pwg) /* I - PWG size name */
* class_name_WWWxHHHmm
*/
- double w, l; /* Width and length of page */
- struct lconv *loc; /* Locale data */
+ int w, l; /* Width and length of page */
+ int numer; /* Scale factor for units */
+ const char *units = ptr + strlen(ptr) - 2;
+ /* Units from size */
ptr ++;
- loc = localeconv();
- w = _cupsStrScand(ptr, &ptr, loc);
+
+ if (units >= ptr && !strcmp(units, "in"))
+ numer = 2540;
+ else
+ numer = 100;
+
+ w = pwg_scan_measurement(ptr, &ptr, numer, 1);
if (ptr && *ptr == 'x')
{
- l = _cupsStrScand(ptr + 1, &ptr, loc);
+ l = pwg_scan_measurement(ptr + 1, &ptr, numer, 1);
- if (ptr && (!strcmp(ptr, "in") || !strcmp(ptr, "mm")))
+ if (ptr)
{
- size = &(cg->pwg_media);
-
- if (!strcmp(ptr, "mm"))
- {
- size->width = (int)(w * 100 + 0.5);
- size->length = (int)(l * 100 + 0.5);
- }
- else
- {
- size->width = (int)(w * 2540 + 0.5);
- size->length = (int)(l * 2540 + 0.5);
- }
+ size = &(cg->pwg_media);
+ size->width = w;
+ size->length = l;
strlcpy(cg->pwg_name, pwg, sizeof(cg->pwg_name));
size->pwg = cg->pwg_name;
@@ -822,17 +890,48 @@ _pwgMediaForPWG(const char *pwg) /* I - PWG size name */
return (size);
}
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForPWG(const char *pwg)
+{ return (pwgMediaForPWG(pwg)); }
+
+
+/*
+ * 'pwgMediaForSize()' - Get the PWG media size for the given dimensions.
+ *
+ * The "width" and "length" are in hundredths of millimeters, equivalent to
+ * 1/100000th of a meter or 1/2540th of an inch.
+ *
+ * If the dimensions are non-standard, the returned PWG media size is stored in
+ * thread-local storage and is overwritten by each call to the function in the
+ * thread.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+pwg_media_t * /* O - PWG media name */
+pwgMediaForSize(int width, /* I - Width in hundredths of millimeters */
+ int length) /* I - Length in hundredths of millimeters */
+{
+ /*
+ * Adobe uses a size matching algorithm with an epsilon of 5 points, which
+ * is just about 176/2540ths...
+ */
+
+ return (_pwgMediaNearSize(width, length, 176));
+}
+
/*
- * '_pwgMediaForSize()' - Get the PWG media name for a given size.
+ * '_pwgMediaNearSize()' - Get the PWG media size within the given tolerance.
*/
-_pwg_media_t * /* O - PWG media name */
-_pwgMediaForSize(int width, /* I - Width in 2540ths */
- int length) /* I - Length in 2540ths */
+pwg_media_t * /* O - PWG media name */
+_pwgMediaNearSize(int width, /* I - Width in hundredths of millimeters */
+ int length, /* I - Length in hundredths of millimeters */
+ int epsilon) /* I - Match within this tolernace. PWG units */
{
int i; /* Looping var */
- _pwg_media_t *media, /* Current media */
+ pwg_media_t *media, /* Current media */
*best_media = NULL; /* Best match */
int dw, dl, /* Difference in width and length */
best_dw = 999, /* Best difference in width and length */
@@ -852,21 +951,17 @@ _pwgMediaForSize(int width, /* I - Width in 2540ths */
*/
for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])),
- media = (_pwg_media_t *)cups_pwg_media;
+ media = (pwg_media_t *)cups_pwg_media;
i > 0;
i --, media ++)
{
- /*
- * Adobe uses a size matching algorithm with an epsilon of 5 points, which
- * is just about 176/2540ths...
- */
dw = abs(media->width - width);
dl = abs(media->length - length);
if (!dw && !dl)
return (media);
- else if (dw < 176 && dl < 176)
+ else if (dw <= epsilon && dl <= epsilon)
{
if (dw <= best_dw && dl <= best_dl)
{
@@ -886,8 +981,8 @@ _pwgMediaForSize(int width, /* I - Width in 2540ths */
* custom_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu
*/
- _pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name), "custom", NULL, width,
- length);
+ pwgFormatSizeName(cg->pwg_name, sizeof(cg->pwg_name), "custom", NULL, width,
+ length, NULL);
cg->pwg_media.pwg = cg->pwg_name;
cg->pwg_media.width = width;
@@ -896,14 +991,31 @@ _pwgMediaForSize(int width, /* I - Width in 2540ths */
return (&(cg->pwg_media));
}
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForSize(int width, int length)
+{ return (pwgMediaForSize(width, length)); }
+
+
+/*
+ * '_pwgMediaTable()' - Return the internal media size table.
+ */
+
+const pwg_media_t * /* O - Pointer to first entry */
+_pwgMediaTable(size_t *num_media) /* O - Number of entries */
+{
+ *num_media = sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0]);
+
+ return (cups_pwg_media);
+}
+
/*
* 'pwg_compare_legacy()' - Compare two sizes using the legacy names.
*/
static int /* O - Result of comparison */
-pwg_compare_legacy(_pwg_media_t *a, /* I - First size */
- _pwg_media_t *b) /* I - Second size */
+pwg_compare_legacy(pwg_media_t *a, /* I - First size */
+ pwg_media_t *b) /* I - Second size */
{
return (strcmp(a->legacy, b->legacy));
}
@@ -914,8 +1026,8 @@ pwg_compare_legacy(_pwg_media_t *a, /* I - First size */
*/
static int /* O - Result of comparison */
-pwg_compare_ppd(_pwg_media_t *a, /* I - First size */
- _pwg_media_t *b) /* I - Second size */
+pwg_compare_ppd(pwg_media_t *a, /* I - First size */
+ pwg_media_t *b) /* I - Second size */
{
return (strcmp(a->ppd, b->ppd));
}
@@ -926,13 +1038,147 @@ pwg_compare_ppd(_pwg_media_t *a, /* I - First size */
*/
static int /* O - Result of comparison */
-pwg_compare_pwg(_pwg_media_t *a, /* I - First size */
- _pwg_media_t *b) /* I - Second size */
+pwg_compare_pwg(pwg_media_t *a, /* I - First size */
+ pwg_media_t *b) /* I - Second size */
{
return (strcmp(a->pwg, b->pwg));
}
/*
- * End of "$Id: pwg-media.c 11241 2013-08-14 20:41:32Z msweet $".
+ * 'pwg_format_inches()' - Convert and format PWG units as inches.
+ */
+
+static char * /* O - String */
+pwg_format_inches(char *buf, /* I - Buffer */
+ size_t bufsize, /* I - Size of buffer */
+ int val) /* I - Value in hundredths of millimeters */
+{
+ int thousandths, /* Thousandths of inches */
+ integer, /* Integer portion */
+ fraction; /* Fractional portion */
+
+
+ /*
+ * Convert hundredths of millimeters to thousandths of inches and round to
+ * the nearest thousandth.
+ */
+
+ thousandths = (val * 1000 + 1270) / 2540;
+ integer = thousandths / 1000;
+ fraction = thousandths % 1000;
+
+ /*
+ * Format as a pair of integers (avoids locale stuff), avoiding trailing
+ * zeros...
+ */
+
+ if (fraction == 0)
+ snprintf(buf, bufsize, "%d", integer);
+ else if (fraction % 10)
+ snprintf(buf, bufsize, "%d.%03d", integer, fraction);
+ else if (fraction % 100)
+ snprintf(buf, bufsize, "%d.%02d", integer, fraction / 10);
+ else
+ snprintf(buf, bufsize, "%d.%01d", integer, fraction / 100);
+
+ return (buf);
+}
+
+
+/*
+ * 'pwg_format_millimeters()' - Convert and format PWG units as millimeters.
+ */
+
+static char * /* O - String */
+pwg_format_millimeters(char *buf, /* I - Buffer */
+ size_t bufsize, /* I - Size of buffer */
+ int val) /* I - Value in hundredths of millimeters */
+{
+ int integer, /* Integer portion */
+ fraction; /* Fractional portion */
+
+
+ /*
+ * Convert hundredths of millimeters to integer and fractional portions.
+ */
+
+ integer = val / 100;
+ fraction = val % 100;
+
+ /*
+ * Format as a pair of integers (avoids locale stuff), avoiding trailing
+ * zeros...
+ */
+
+ if (fraction == 0)
+ snprintf(buf, bufsize, "%d", integer);
+ else if (fraction % 10)
+ snprintf(buf, bufsize, "%d.%02d", integer, fraction);
+ else
+ snprintf(buf, bufsize, "%d.%01d", integer, fraction / 10);
+
+ return (buf);
+}
+
+
+/*
+ * 'pwg_scan_measurement()' - Scan a measurement in inches or millimeters.
+ *
+ * The "factor" argument specifies the scale factor for the units to convert to
+ * hundredths of millimeters. The returned value is NOT rounded but is an
+ * exact conversion of the fraction value (no floating point is used).
+ */
+
+static int /* O - Hundredths of millimeters */
+pwg_scan_measurement(
+ const char *buf, /* I - Number string */
+ char **bufptr, /* O - First byte after the number */
+ int numer, /* I - Numerator from units */
+ int denom) /* I - Denominator from units */
+{
+ int value = 0, /* Measurement value */
+ fractional = 0, /* Fractional value */
+ divisor = 1, /* Fractional divisor */
+ digits = 10 * numer * denom; /* Maximum fractional value to read */
+
+
+ /*
+ * Scan integer portion...
+ */
+
+ while (*buf >= '0' && *buf <= '9')
+ value = value * 10 + (*buf++) - '0';
+
+ if (*buf == '.')
+ {
+ /*
+ * Scan fractional portion...
+ */
+
+ buf ++;
+
+ while (divisor < digits && *buf >= '0' && *buf <= '9')
+ {
+ fractional = fractional * 10 + (*buf++) - '0';
+ divisor *= 10;
+ }
+
+ /*
+ * Skip trailing digits that won't contribute...
+ */
+
+ while (*buf >= '0' && *buf <= '9')
+ buf ++;
+ }
+
+ if (bufptr)
+ *bufptr = (char *)buf;
+
+ return (value * numer / denom + fractional * numer / denom / divisor);
+}
+
+
+/*
+ * End of "$Id: pwg-media.c 11881 2014-05-16 20:59:22Z msweet $".
*/
diff --git a/cups/pwg-private.h b/cups/pwg-private.h
index 113a1e7..3e086db 100644
--- a/cups/pwg-private.h
+++ b/cups/pwg-private.h
@@ -1,9 +1,9 @@
/*
- * "$Id: pwg-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: pwg-private.h 11826 2014-04-23 00:38:21Z msweet $"
*
* Private PWG media API definitions for CUPS.
*
- * Copyright 2009-2012 by Apple Inc.
+ * Copyright 2009-2013 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -35,63 +35,38 @@ extern "C" {
/*
- * Macros...
+ * Deprecated stuff for prior users of the private PWG media API...
*/
-/* Convert from points to 2540ths */
-# define _PWG_FROMPTS(n) (int)(((n) * 2540 + 36) / 72)
-/* Convert from 2540ths to points */
-# define _PWG_TOPTS(n) ((n) * 72.0 / 2540.0)
-
-
-/*
- * Types and structures...
- */
-
-typedef struct _pwg_map_s /**** Map element - PPD to/from PWG */
-{
- char *pwg, /* PWG media keyword */
- *ppd; /* PPD option keyword */
-} _pwg_map_t;
-
-typedef struct _pwg_media_s /**** Common media size data ****/
-{
- const char *pwg, /* PWG 5101.1 "self describing" name */
- *legacy, /* IPP/ISO legacy name */
- *ppd; /* Standard Adobe PPD name */
- int width, /* Width in 2540ths */
- length; /* Length in 2540ths */
-} _pwg_media_t;
-
-typedef struct _pwg_size_s /**** Size element - PPD to/from PWG */
-{
- _pwg_map_t map; /* Map element */
- int width, /* Width in 2540ths */
- length, /* Length in 2540ths */
- left, /* Left margin in 2540ths */
- bottom, /* Bottom margin in 2540ths */
- right, /* Right margin in 2540ths */
- top; /* Top margin in 2540ths */
-} _pwg_size_t;
+# ifndef _CUPS_NO_DEPRECATED
+typedef struct pwg_map_s _pwg_map_t;
+typedef struct pwg_media_s _pwg_media_t;
+typedef struct pwg_size_s _pwg_size_t;
+# endif /* _CUPS_NO_DEPRECATED */
/*
* Functions...
*/
-extern char *_pwgFormatInches(char *buf, size_t bufsize, int val);
-extern char *_pwgFormatMillimeters(char *buf, size_t bufsize,
- int val);
extern void _pwgGenerateSize(char *keyword, size_t keysize,
const char *prefix,
const char *name,
- int width, int length);
-extern int _pwgInitSize(_pwg_size_t *size, ipp_t *job,
- int *margins_set);
-extern _pwg_media_t *_pwgMediaForLegacy(const char *legacy);
-extern _pwg_media_t *_pwgMediaForPPD(const char *ppd);
-extern _pwg_media_t *_pwgMediaForPWG(const char *pwg);
-extern _pwg_media_t *_pwgMediaForSize(int width, int length);
+ int width, int length)
+ _CUPS_INTERNAL_MSG("Use pwgFormatSizeName instead.");
+extern int _pwgInitSize(pwg_size_t *size, ipp_t *job,
+ int *margins_set)
+ _CUPS_INTERNAL_MSG("Use pwgInitSize instead.");
+extern pwg_media_t *_pwgMediaForLegacy(const char *legacy)
+ _CUPS_INTERNAL_MSG("Use pwgMediaForLegacy instead.");
+extern pwg_media_t *_pwgMediaForPPD(const char *ppd)
+ _CUPS_INTERNAL_MSG("Use pwgMediaForPPD instead.");
+extern pwg_media_t *_pwgMediaForPWG(const char *pwg)
+ _CUPS_INTERNAL_MSG("Use pwgMediaForPWG instead.");
+extern pwg_media_t *_pwgMediaForSize(int width, int length)
+ _CUPS_INTERNAL_MSG("Use pwgMediaForSize instead.");
+extern const pwg_media_t *_pwgMediaTable(size_t *num_media);
+extern pwg_media_t *_pwgMediaNearSize(int width, int length, int epsilon);
# ifdef __cplusplus
}
@@ -100,5 +75,5 @@ extern _pwg_media_t *_pwgMediaForSize(int width, int length);
#endif /* !_CUPS_PWG_PRIVATE_H_ */
/*
- * End of "$Id: pwg-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: pwg-private.h 11826 2014-04-23 00:38:21Z msweet $".
*/
diff --git a/cups/pwg.h b/cups/pwg.h
new file mode 100644
index 0000000..43e0e1c
--- /dev/null
+++ b/cups/pwg.h
@@ -0,0 +1,94 @@
+/*
+ * "$Id: pwg.h 4274 2013-04-09 20:10:23Z msweet $"
+ *
+ * PWG media API definitions for CUPS.
+ *
+ * Copyright 2009-2013 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_PWG_H_
+# define _CUPS_PWG_H_
+
+
+/*
+ * C++ magic...
+ */
+
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
+
+
+/*
+ * Macros...
+ */
+
+/* Convert from points to hundredths of millimeters */
+# define PWG_FROM_POINTS(n) (int)(((n) * 2540 + 36) / 72)
+/* Convert from hundredths of millimeters to points */
+# define PWG_TO_POINTS(n) ((n) * 72.0 / 2540.0)
+
+
+/*
+ * Types and structures...
+ */
+
+typedef struct pwg_map_s /**** Map element - PPD to/from PWG */
+{
+ char *pwg, /* PWG media keyword */
+ *ppd; /* PPD option keyword */
+} pwg_map_t;
+
+typedef struct pwg_media_s /**** Common media size data ****/
+{
+ const char *pwg, /* PWG 5101.1 "self describing" name */
+ *legacy, /* IPP/ISO legacy name */
+ *ppd; /* Standard Adobe PPD name */
+ int width, /* Width in 2540ths */
+ length; /* Length in 2540ths */
+} pwg_media_t;
+
+typedef struct pwg_size_s /**** Size element - PPD to/from PWG */
+{
+ pwg_map_t map; /* Map element */
+ int width, /* Width in 2540ths */
+ length, /* Length in 2540ths */
+ left, /* Left margin in 2540ths */
+ bottom, /* Bottom margin in 2540ths */
+ right, /* Right margin in 2540ths */
+ top; /* Top margin in 2540ths */
+} pwg_size_t;
+
+
+/*
+ * Functions...
+ */
+
+extern int pwgFormatSizeName(char *keyword, size_t keysize,
+ const char *prefix, const char *name,
+ int width, int length,
+ const char *units) _CUPS_API_1_7;
+extern int pwgInitSize(pwg_size_t *size, ipp_t *job,
+ int *margins_set) _CUPS_API_1_7;
+extern pwg_media_t *pwgMediaForLegacy(const char *legacy) _CUPS_API_1_7;
+extern pwg_media_t *pwgMediaForPPD(const char *ppd) _CUPS_API_1_7;
+extern pwg_media_t *pwgMediaForPWG(const char *pwg) _CUPS_API_1_7;
+extern pwg_media_t *pwgMediaForSize(int width, int length) _CUPS_API_1_7;
+
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
+
+#endif /* !_CUPS_PWG_H_ */
+
+/*
+ * End of "$Id: pwg.h 4274 2013-04-09 20:10:23Z msweet $".
+ */
diff --git a/cups/raster-private.h b/cups/raster-private.h
index 77ec7c2..ebd5d72 100644
--- a/cups/raster-private.h
+++ b/cups/raster-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: raster-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: raster-private.h 3794 2012-04-23 22:44:16Z msweet $"
*
* Private image library definitions for CUPS.
*
@@ -62,5 +62,5 @@ extern void _cupsRasterClearError(void);
#endif /* !_CUPS_RASTER_PRIVATE_H_ */
/*
- * End of "$Id: raster-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: raster-private.h 3794 2012-04-23 22:44:16Z msweet $".
*/
diff --git a/cups/raster.h b/cups/raster.h
index c638f5a..dde34f2 100644
--- a/cups/raster.h
+++ b/cups/raster.h
@@ -1,5 +1,5 @@
/*
- * "$Id: raster.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: raster.h 4027 2012-11-16 01:00:05Z msweet $"
*
* Raster file definitions for CUPS.
*
@@ -368,11 +368,11 @@ typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t l
extern void cupsRasterClose(cups_raster_t *r);
extern cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode);
extern unsigned cupsRasterReadHeader(cups_raster_t *r,
- cups_page_header_t *h) _CUPS_DEPRECATED;
+ cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterReadHeader2 instead.");
extern unsigned cupsRasterReadPixels(cups_raster_t *r,
unsigned char *p, unsigned len);
extern unsigned cupsRasterWriteHeader(cups_raster_t *r,
- cups_page_header_t *h) _CUPS_DEPRECATED;
+ cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterWriteHeader2 instead.");
extern unsigned cupsRasterWritePixels(cups_raster_t *r,
unsigned char *p, unsigned len);
@@ -401,5 +401,5 @@ extern cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx,
#endif /* !_CUPS_RASTER_H_ */
/*
- * End of "$Id: raster.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: raster.h 4027 2012-11-16 01:00:05Z msweet $".
*/
diff --git a/cups/request.c b/cups/request.c
index 9afe1e5..8f51317 100644
--- a/cups/request.c
+++ b/cups/request.c
@@ -1,34 +1,18 @@
/*
- * "$Id: request.c 11176 2013-07-23 13:24:57Z msweet $"
+ * "$Id: request.c 11866 2014-05-09 20:20:16Z msweet $"
*
- * IPP utilities for CUPS.
+ * IPP utilities for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsDoFileRequest() - Do an IPP request with a file.
- * cupsDoIORequest() - Do an IPP request with file descriptors.
- * cupsDoRequest() - Do an IPP request.
- * cupsGetResponse() - Get a response to an IPP request.
- * cupsLastError() - Return the last IPP status code.
- * cupsLastErrorString() - Return the last IPP status-message.
- * _cupsNextDelay() - Return the next retry delay value.
- * cupsReadResponseData() - Read additional data after the IPP response.
- * cupsSendRequest() - Send an IPP request.
- * cupsWriteRequestData() - Write additional data after an IPP request.
- * _cupsConnect() - Get the default server connection...
- * _cupsSetError() - Set the last IPP status code and status-message.
- * _cupsSetHTTPError() - Set the last error using the HTTP status.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -46,6 +30,9 @@
#ifndef O_BINARY
# define O_BINARY 0
#endif /* O_BINARY */
+#ifndef MSG_DONTWAIT
+# define MSG_DONTWAIT 0
+#endif /* !MSG_DONTWAIT */
/*
@@ -79,7 +66,7 @@ cupsDoFileRequest(http_t *http, /* I - Connection to server or @code CUPS_HT
* Can't get file information!
*/
- _cupsSetError(errno == ENOENT ? IPP_NOT_FOUND : IPP_NOT_AUTHORIZED,
+ _cupsSetError(errno == ENOENT ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED,
NULL, 0);
ippDelete(request);
@@ -126,7 +113,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
size_t length = 0; /* Content-Length value */
http_status_t status; /* Status of HTTP request */
struct stat fileinfo; /* File information */
- int bytes; /* Number of bytes read/written */
+ ssize_t bytes; /* Number of bytes read/written */
char buffer[32768]; /* Output buffer */
@@ -143,7 +130,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
{
ippDelete(request);
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (NULL);
}
@@ -172,7 +159,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Can't get file information!
*/
- _cupsSetError(errno == EBADF ? IPP_NOT_FOUND : IPP_NOT_AUTHORIZED,
+ _cupsSetError(errno == EBADF ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED,
NULL, 0);
ippDelete(request);
@@ -192,7 +179,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
ippDelete(request);
- _cupsSetError(IPP_NOT_POSSIBLE, strerror(EISDIR), 0);
+ _cupsSetError(IPP_STATUS_ERROR_NOT_POSSIBLE, strerror(EISDIR), 0);
return (NULL);
}
@@ -202,7 +189,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
length = 0; /* Chunk when piping */
else
#endif /* !WIN32 */
- length = ippLength(request) + fileinfo.st_size;
+ length = ippLength(request) + (size_t)fileinfo.st_size;
}
else
length = ippLength(request);
@@ -233,7 +220,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_printf(("2cupsDoIORequest: status=%d", status));
- if (status == HTTP_CONTINUE && request->state == IPP_DATA && infile >= 0)
+ if (status == HTTP_STATUS_CONTINUE && request->state == IPP_STATE_DATA && infile >= 0)
{
DEBUG_puts("2cupsDoIORequest: file write...");
@@ -246,10 +233,10 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
#endif /* WIN32 */
lseek(infile, 0, SEEK_SET);
- while ((bytes = (int)read(infile, buffer, sizeof(buffer))) > 0)
+ while ((bytes = read(infile, buffer, sizeof(buffer))) > 0)
{
- if ((status = cupsWriteRequestData(http, buffer, bytes))
- != HTTP_CONTINUE)
+ if ((status = cupsWriteRequestData(http, buffer, (size_t)bytes))
+ != HTTP_STATUS_CONTINUE)
break;
}
}
@@ -258,7 +245,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Get the server's response...
*/
- if (status != HTTP_ERROR)
+ if (status <= HTTP_STATUS_CONTINUE || status == HTTP_STATUS_OK)
{
response = cupsGetResponse(http, resource);
status = httpGetStatus(http);
@@ -266,9 +253,9 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_printf(("2cupsDoIORequest: status=%d", status));
- if (status == HTTP_ERROR ||
- (status >= HTTP_BAD_REQUEST && status != HTTP_UNAUTHORIZED &&
- status != HTTP_UPGRADE_REQUIRED))
+ if (status == HTTP_STATUS_ERROR ||
+ (status >= HTTP_STATUS_BAD_REQUEST && status != HTTP_STATUS_UNAUTHORIZED &&
+ status != HTTP_STATUS_UPGRADE_REQUIRED))
{
_cupsSetHTTPError(status);
break;
@@ -280,12 +267,12 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Write trailing data to file...
*/
- while ((bytes = (int)httpRead2(http, buffer, sizeof(buffer))) > 0)
- if (write(outfile, buffer, bytes) < bytes)
+ while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
+ if (write(outfile, buffer, (size_t)bytes) < bytes)
break;
}
- if (http->state != HTTP_WAITING)
+ if (http->state != HTTP_STATE_WAITING)
{
/*
* Flush any remaining data...
@@ -347,22 +334,37 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_printf(("cupsGetResponse(http=%p, resource=\"%s\")", http, resource));
+ DEBUG_printf(("1cupsGetResponse: http->state=%d", http ? http->state : HTTP_STATE_ERROR));
/*
* Connect to the default server as needed...
*/
if (!http)
- http = _cupsConnect();
+ {
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Pointer to library globals */
+
+ if ((http = cg->http) == NULL)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection."), 1);
+ DEBUG_puts("1cupsGetResponse: No active connection - returning NULL.");
+ return (NULL);
+ }
+ }
- if (!http || (http->state != HTTP_POST_RECV && http->state != HTTP_POST_SEND))
+ if (http->state != HTTP_STATE_POST_RECV && http->state != HTTP_STATE_POST_SEND)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No request sent."), 1);
+ DEBUG_puts("1cupsGetResponse: Not in POST state - returning NULL.");
return (NULL);
+ }
/*
* Check for an unfinished chunked request...
*/
- if (http->data_encoding == HTTP_ENCODE_CHUNKED)
+ if (http->data_encoding == HTTP_ENCODING_CHUNKED)
{
/*
* Send a 0-length chunk to finish off the request...
@@ -385,11 +387,11 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
{
status = httpUpdate(http);
}
- while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);
+ while (status == HTTP_STATUS_CONTINUE);
DEBUG_printf(("2cupsGetResponse: status=%d", status));
- if (status == HTTP_OK)
+ if (status == HTTP_STATUS_OK)
{
/*
* Get the IPP response...
@@ -397,11 +399,11 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
response = ippNew();
- while ((state = ippRead(http, response)) != IPP_DATA)
- if (state == IPP_ERROR)
+ while ((state = ippRead(http, response)) != IPP_STATE_DATA)
+ if (state == IPP_STATE_ERROR)
break;
- if (state == IPP_ERROR)
+ if (state == IPP_STATE_ERROR)
{
/*
* Flush remaining data and delete the response...
@@ -414,11 +416,11 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
ippDelete(response);
response = NULL;
- http->status = status = HTTP_ERROR;
+ http->status = status = HTTP_STATUS_ERROR;
http->error = EINVAL;
}
}
- else if (status != HTTP_ERROR)
+ else if (status != HTTP_STATUS_ERROR)
{
/*
* Flush any error message...
@@ -430,7 +432,7 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Then handle encryption and authentication...
*/
- if (status == HTTP_UNAUTHORIZED)
+ if (status == HTTP_STATUS_UNAUTHORIZED)
{
/*
* See if we can do authentication...
@@ -439,13 +441,13 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_puts("2cupsGetResponse: Need authorization...");
if (!cupsDoAuthentication(http, "POST", resource))
- httpReconnect(http);
+ httpReconnect2(http, 30000, NULL);
else
- http->status = status = HTTP_AUTHORIZATION_CANCELED;
+ http->status = status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
}
#ifdef HAVE_SSL
- else if (status == HTTP_UPGRADE_REQUIRED)
+ else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
{
/*
* Force a reconnect with encryption...
@@ -453,8 +455,8 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_puts("2cupsGetResponse: Need encryption...");
- if (!httpReconnect(http))
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ if (!httpReconnect2(http, 30000, NULL))
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
}
#endif /* HAVE_SSL */
}
@@ -565,7 +567,7 @@ cupsReadResponseData(
if ((http = cg->http) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("No active connection"), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection"), 1);
return (-1);
}
}
@@ -587,7 +589,7 @@ cupsReadResponseData(
* response. Only one request can be sent/queued at a time per @code http_t@
* connection.
*
- * Returns the initial HTTP status code, which will be @code HTTP_CONTINUE@
+ * Returns the initial HTTP status code, which will be @code HTTP_STATUS_CONTINUE@
* on a successful send of the request.
*
* Note: Unlike @link cupsDoFileRequest@, @link cupsDoIORequest@, and
@@ -602,10 +604,10 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
const char *resource, /* I - Resource path */
size_t length) /* I - Length of data to follow or @code CUPS_LENGTH_VARIABLE@ */
{
- http_status_t status; /* Status of HTTP request */
- int got_status; /* Did we get the status? */
- ipp_state_t state; /* State of IPP processing */
- http_status_t expect; /* Expect: header to use */
+ http_status_t status; /* Status of HTTP request */
+ int got_status; /* Did we get the status? */
+ ipp_state_t state; /* State of IPP processing */
+ http_status_t expect; /* Expect: header to use */
DEBUG_printf(("cupsSendRequest(http=%p, request=%p(%s), resource=\"%s\", "
@@ -619,9 +621,9 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (!request || !resource)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
- return (HTTP_ERROR);
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -630,24 +632,24 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (!http)
if ((http = _cupsConnect()) == NULL)
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
/*
* If the prior request was not flushed out, do so now...
*/
- if (http->state == HTTP_GET_SEND ||
- http->state == HTTP_POST_SEND)
+ if (http->state == HTTP_STATE_GET_SEND ||
+ http->state == HTTP_STATE_POST_SEND)
{
DEBUG_puts("2cupsSendRequest: Flush prior response.");
httpFlush(http);
}
- else if (http->state != HTTP_WAITING)
+ else if (http->state != HTTP_STATE_WAITING)
{
DEBUG_printf(("1cupsSendRequest: Unknown HTTP state (%d), "
"reconnecting.", http->state));
- if (httpReconnect(http))
- return (HTTP_ERROR);
+ if (httpReconnect2(http, 30000, NULL))
+ return (HTTP_STATUS_ERROR);
}
#ifdef HAVE_SSL
@@ -659,10 +661,10 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (ippFindAttribute(request, "auth-info", IPP_TAG_TEXT) &&
!httpAddrLocalhost(http->hostaddr) && !http->tls &&
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED))
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED))
{
DEBUG_puts("1cupsSendRequest: Unable to encrypt connection.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
#endif /* HAVE_SSL */
@@ -674,10 +676,10 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
{
DEBUG_puts("2cupsSendRequest: Connection: close");
httpClearFields(http);
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
}
@@ -685,7 +687,7 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Loop until we can send the request without authorization problems.
*/
- expect = HTTP_CONTINUE;
+ expect = HTTP_STATUS_CONTINUE;
for (;;)
{
@@ -725,10 +727,10 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (httpPost(http, resource))
{
DEBUG_puts("2cupsSendRequest: POST failed, reconnecting.");
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
else
continue;
@@ -740,30 +742,44 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_puts("2cupsSendRequest: Writing IPP request...");
- request->state = IPP_IDLE;
- status = HTTP_CONTINUE;
+ request->state = IPP_STATE_IDLE;
+ status = HTTP_STATUS_CONTINUE;
got_status = 0;
- while ((state = ippWrite(http, request)) != IPP_DATA)
- if (state == IPP_ERROR)
- break;
- else if (httpCheck(http))
+ while ((state = ippWrite(http, request)) != IPP_STATE_DATA)
+ {
+ if (httpCheck(http))
{
got_status = 1;
_httpUpdate(http, &status);
- if (status >= HTTP_MULTIPLE_CHOICES)
+ if (status >= HTTP_STATUS_MULTIPLE_CHOICES)
break;
}
+ else if (state == IPP_STATE_ERROR)
+ break;
+ }
- if (state == IPP_ERROR)
+ if (state == IPP_STATE_ERROR)
{
- DEBUG_puts("1cupsSendRequest: Unable to send IPP request.");
+ /*
+ * We weren't able to send the IPP request. But did we already get a HTTP
+ * error status?
+ */
- http->status = HTTP_ERROR;
- http->state = HTTP_WAITING;
+ if (!got_status || status < HTTP_STATUS_MULTIPLE_CHOICES)
+ {
+ /*
+ * No, something else went wrong.
+ */
+
+ DEBUG_puts("1cupsSendRequest: Unable to send IPP request.");
- return (HTTP_ERROR);
+ http->status = HTTP_STATUS_ERROR;
+ http->state = HTTP_STATE_WAITING;
+
+ return (HTTP_STATUS_ERROR);
+ }
}
/*
@@ -772,7 +788,7 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (!got_status)
{
- if (expect == HTTP_CONTINUE)
+ if (expect == HTTP_STATUS_CONTINUE)
{
DEBUG_puts("2cupsSendRequest: Waiting for 100-continue...");
@@ -789,69 +805,72 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Process the current HTTP status...
*/
- if (status >= HTTP_MULTIPLE_CHOICES)
+ if (status >= HTTP_STATUS_MULTIPLE_CHOICES)
{
+ int temp_status; /* Temporary status */
+
_cupsSetHTTPError(status);
do
{
- status = httpUpdate(http);
+ temp_status = httpUpdate(http);
}
- while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);
+ while (temp_status != HTTP_STATUS_ERROR &&
+ http->state == HTTP_STATE_POST_RECV);
httpFlush(http);
}
switch (status)
{
- case HTTP_ERROR :
- case HTTP_CONTINUE :
- case HTTP_OK :
+ case HTTP_STATUS_CONTINUE :
+ case HTTP_STATUS_OK :
+ case HTTP_STATUS_ERROR :
DEBUG_printf(("1cupsSendRequest: Returning %d.", status));
return (status);
- case HTTP_UNAUTHORIZED :
+ case HTTP_STATUS_UNAUTHORIZED :
if (cupsDoAuthentication(http, "POST", resource))
{
- DEBUG_puts("1cupsSendRequest: Returning HTTP_AUTHORIZATION_CANCELED.");
- return (HTTP_AUTHORIZATION_CANCELED);
+ DEBUG_puts("1cupsSendRequest: Returning HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED.");
+ return (HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED);
}
- DEBUG_puts("2cupsSendRequest: Reconnecting after HTTP_UNAUTHORIZED.");
+ DEBUG_puts("2cupsSendRequest: Reconnecting after HTTP_STATUS_UNAUTHORIZED.");
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
break;
#ifdef HAVE_SSL
- case HTTP_UPGRADE_REQUIRED :
+ case HTTP_STATUS_UPGRADE_REQUIRED :
/*
* Flush any error message, reconnect, and then upgrade with
* encryption...
*/
DEBUG_puts("2cupsSendRequest: Reconnecting after "
- "HTTP_UPGRADE_REQUIRED.");
+ "HTTP_STATUS_UPGRADE_REQUIRED.");
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
DEBUG_puts("2cupsSendRequest: Upgrading to TLS.");
- if (httpEncryption(http, HTTP_ENCRYPT_REQUIRED))
+ if (httpEncryption(http, HTTP_ENCRYPTION_REQUIRED))
{
DEBUG_puts("1cupsSendRequest: Unable to encrypt connection.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
break;
#endif /* HAVE_SSL */
- case HTTP_EXPECTATION_FAILED :
+ case HTTP_STATUS_EXPECTATION_FAILED :
/*
* Don't try using the Expect: header the next time around...
*/
@@ -861,10 +880,10 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_puts("2cupsSendRequest: Reconnecting after "
"HTTP_EXPECTATION_FAILED.");
- if (httpReconnect(http))
+ if (httpReconnect2(http, 30000, NULL))
{
DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
break;
@@ -888,7 +907,7 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* @since CUPS 1.4/OS X 10.6@
*/
-http_status_t /* O - @code HTTP_CONTINUE@ if OK or HTTP status on error */
+http_status_t /* O - @code HTTP_STATUS_CONTINUE@ if OK or HTTP status on error */
cupsWriteRequestData(
http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */
const char *buffer, /* I - Bytes to write */
@@ -911,9 +930,9 @@ cupsWriteRequestData(
if ((http = cg->http) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("No active connection"), 1);
- DEBUG_puts("1cupsWriteRequestData: Returning HTTP_ERROR.");
- return (HTTP_ERROR);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection"), 1);
+ DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_ERROR.");
+ return (HTTP_STATUS_ERROR);
}
}
@@ -925,9 +944,9 @@ cupsWriteRequestData(
if (httpWrite2(http, buffer, length) < 0)
{
- DEBUG_puts("1cupsWriteRequestData: Returning HTTP_ERROR.");
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0);
- return (HTTP_ERROR);
+ DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_ERROR.");
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0);
+ return (HTTP_STATUS_ERROR);
}
/*
@@ -936,7 +955,7 @@ cupsWriteRequestData(
if (length >= HTTP_MAX_BUFFER ||
http->wused < wused ||
- (wused > 0 && http->wused == length))
+ (wused > 0 && (size_t)http->wused == length))
{
/*
* We've written something to the server, so check for response data...
@@ -947,7 +966,7 @@ cupsWriteRequestData(
http_status_t status; /* Status from _httpUpdate */
_httpUpdate(http, &status);
- if (status >= HTTP_MULTIPLE_CHOICES)
+ if (status >= HTTP_STATUS_MULTIPLE_CHOICES)
{
_cupsSetHTTPError(status);
@@ -955,7 +974,7 @@ cupsWriteRequestData(
{
status = httpUpdate(http);
}
- while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);
+ while (status != HTTP_STATUS_ERROR && http->state == HTTP_STATE_POST_RECV);
httpFlush(http);
}
@@ -965,8 +984,8 @@ cupsWriteRequestData(
}
}
- DEBUG_puts("1cupsWriteRequestData: Returning HTTP_CONTINUE.");
- return (HTTP_CONTINUE);
+ DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_CONTINUE.");
+ return (HTTP_STATUS_CONTINUE);
}
@@ -993,9 +1012,9 @@ _cupsConnect(void)
*/
if (strcmp(cg->http->hostname, cg->server) ||
- cg->ipp_port != _httpAddrPort(cg->http->hostaddr) ||
+ cg->ipp_port != httpAddrPort(cg->http->hostaddr) ||
(cg->http->encryption != cg->encryption &&
- cg->http->encryption == HTTP_ENCRYPT_NEVER))
+ cg->http->encryption == HTTP_ENCRYPTION_NEVER))
{
/*
* Need to close the current connection because something has changed...
@@ -1037,13 +1056,13 @@ _cupsConnect(void)
if (!cg->http)
{
- if ((cg->http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption())) == NULL)
+ if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
+ cupsEncryption(), 1, 30000, NULL)) == NULL)
{
if (errno)
- _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0);
else
- _cupsSetError(IPP_SERVICE_UNAVAILABLE,
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE,
_("Unable to connect to host."), 1);
}
}
@@ -1116,59 +1135,59 @@ _cupsSetHTTPError(http_status_t status) /* I - HTTP status code */
{
switch (status)
{
- case HTTP_NOT_FOUND :
- _cupsSetError(IPP_NOT_FOUND, httpStatus(status), 0);
+ case HTTP_STATUS_NOT_FOUND :
+ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, httpStatus(status), 0);
break;
- case HTTP_UNAUTHORIZED :
- _cupsSetError(IPP_NOT_AUTHENTICATED, httpStatus(status), 0);
+ case HTTP_STATUS_UNAUTHORIZED :
+ _cupsSetError(IPP_STATUS_ERROR_NOT_AUTHENTICATED, httpStatus(status), 0);
break;
- case HTTP_AUTHORIZATION_CANCELED :
- _cupsSetError(IPP_AUTHENTICATION_CANCELED, httpStatus(status), 0);
+ case HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED :
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED, httpStatus(status), 0);
break;
- case HTTP_FORBIDDEN :
- _cupsSetError(IPP_FORBIDDEN, httpStatus(status), 0);
+ case HTTP_STATUS_FORBIDDEN :
+ _cupsSetError(IPP_STATUS_ERROR_FORBIDDEN, httpStatus(status), 0);
break;
- case HTTP_BAD_REQUEST :
- _cupsSetError(IPP_BAD_REQUEST, httpStatus(status), 0);
+ case HTTP_STATUS_BAD_REQUEST :
+ _cupsSetError(IPP_STATUS_ERROR_BAD_REQUEST, httpStatus(status), 0);
break;
- case HTTP_REQUEST_TOO_LARGE :
- _cupsSetError(IPP_REQUEST_VALUE, httpStatus(status), 0);
+ case HTTP_STATUS_REQUEST_TOO_LARGE :
+ _cupsSetError(IPP_STATUS_ERROR_REQUEST_VALUE, httpStatus(status), 0);
break;
- case HTTP_NOT_IMPLEMENTED :
- _cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status), 0);
+ case HTTP_STATUS_NOT_IMPLEMENTED :
+ _cupsSetError(IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, httpStatus(status), 0);
break;
- case HTTP_NOT_SUPPORTED :
- _cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status), 0);
+ case HTTP_STATUS_NOT_SUPPORTED :
+ _cupsSetError(IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, httpStatus(status), 0);
break;
- case HTTP_UPGRADE_REQUIRED :
- _cupsSetError(IPP_UPGRADE_REQUIRED, httpStatus(status), 0);
+ case HTTP_STATUS_UPGRADE_REQUIRED :
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED, httpStatus(status), 0);
break;
- case HTTP_PKI_ERROR :
- _cupsSetError(IPP_PKI_ERROR, httpStatus(status), 0);
+ case HTTP_STATUS_CUPS_PKI_ERROR :
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, httpStatus(status), 0);
break;
- case HTTP_ERROR :
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ case HTTP_STATUS_ERROR :
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
break;
default :
DEBUG_printf(("4_cupsSetHTTPError: HTTP error %d mapped to "
- "IPP_SERVICE_UNAVAILABLE!", status));
- _cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status), 0);
+ "IPP_STATUS_ERROR_SERVICE_UNAVAILABLE!", status));
+ _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, httpStatus(status), 0);
break;
}
}
/*
- * End of "$Id: request.c 11176 2013-07-23 13:24:57Z msweet $".
+ * End of "$Id: request.c 11866 2014-05-09 20:20:16Z msweet $".
*/
diff --git a/cups/sidechannel.c b/cups/sidechannel.c
index 169d721..d9517e9 100644
--- a/cups/sidechannel.c
+++ b/cups/sidechannel.c
@@ -1,27 +1,18 @@
/*
- * "$Id: sidechannel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sidechannel.c 12124 2014-08-28 15:37:22Z msweet $"
*
- * Side-channel API code for CUPS.
+ * Side-channel API code for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsSideChannelDoRequest() - Send a side-channel command to a backend and
- * wait for a response.
- * cupsSideChannelRead() - Read a side-channel message.
- * cupsSideChannelSNMPGet() - Query a SNMP OID's value.
- * cupsSideChannelSNMPWalk() - Query multiple SNMP OID values.
- * cupsSideChannelWrite() - Write a side-channel message.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -35,12 +26,8 @@
#else
# include <unistd.h>
#endif /* WIN32 */
-#ifdef __hpux
-# include <sys/time.h>
-#elif !defined(WIN32)
-# include <sys/select.h>
-#endif /* __hpux */
#ifndef WIN32
+# include <sys/select.h>
# include <sys/time.h>
#endif /* !WIN32 */
#ifdef HAVE_POLL
@@ -120,7 +107,7 @@ cupsSideChannelRead(
double timeout) /* I - Timeout in seconds */
{
char *buffer; /* Message buffer */
- int bytes; /* Bytes read */
+ ssize_t bytes; /* Bytes read */
int templen; /* Data length from message */
int nfds; /* Number of file descriptors */
#ifdef HAVE_POLL
@@ -151,7 +138,7 @@ cupsSideChannelRead(
pfd.events = POLLIN;
while ((nfds = poll(&pfd, 1,
- timeout < 0.0 ? -1 : (long)(timeout * 1000))) < 0 &&
+ timeout < 0.0 ? -1 : (int)(timeout * 1000))) < 0 &&
(errno == EINTR || errno == EAGAIN))
;
@@ -214,7 +201,7 @@ cupsSideChannelRead(
if (bytes < 4)
{
- DEBUG_printf(("1cupsSideChannelRead: Short read of %d bytes", bytes));
+ DEBUG_printf(("1cupsSideChannelRead: Short read of " CUPS_LLFMT " bytes", CUPS_LLCAST bytes));
_cupsBufferRelease(buffer);
@@ -277,7 +264,7 @@ cupsSideChannelRead(
*status = (cups_sc_status_t)buffer[1];
*datalen = templen;
- memcpy(data, buffer + 4, templen);
+ memcpy(data, buffer + 4, (size_t)templen);
}
_cupsBufferRelease(buffer);
@@ -368,7 +355,7 @@ cupsSideChannelSNMPGet(
* Parse the response of the form "oid\0value"...
*/
- real_oidlen = strlen(real_data) + 1;
+ real_oidlen = (int)strlen(real_data) + 1;
real_datalen -= real_oidlen;
if ((real_datalen + 1) > *datalen)
@@ -377,7 +364,7 @@ cupsSideChannelSNMPGet(
return (CUPS_SC_STATUS_TOO_BIG);
}
- memcpy(data, real_data + real_oidlen, real_datalen);
+ memcpy(data, real_data + real_oidlen, (size_t)real_datalen);
data[real_datalen] = '\0';
*datalen = real_datalen;
@@ -427,8 +414,8 @@ cupsSideChannelSNMPWalk(
cups_sc_status_t status; /* Status of command */
cups_sc_command_t rcommand; /* Response command */
char *real_data; /* Real data buffer for response */
- int real_datalen, /* Real length of data buffer */
- real_oidlen, /* Length of returned OID string */
+ int real_datalen; /* Real length of data buffer */
+ size_t real_oidlen, /* Length of returned OID string */
oidlen; /* Length of first OID */
const char *current_oid; /* Current OID */
char last_oid[2048]; /* Last OID */
@@ -452,7 +439,7 @@ cupsSideChannelSNMPWalk(
*/
current_oid = oid;
- oidlen = (int)strlen(oid);
+ oidlen = strlen(oid);
last_oid[0] = '\0';
do
@@ -499,11 +486,11 @@ cupsSideChannelSNMPWalk(
return (CUPS_SC_STATUS_OK);
}
- if (real_datalen < sizeof(real_data))
+ if ((size_t)real_datalen < sizeof(real_data))
real_data[real_datalen] = '\0';
real_oidlen = strlen(real_data) + 1;
- real_datalen -= real_oidlen;
+ real_datalen -= (int)real_oidlen;
/*
* Call the callback with the OID and data...
@@ -545,7 +532,7 @@ cupsSideChannelWrite(
double timeout) /* I - Timeout in seconds */
{
char *buffer; /* Message buffer */
- int bytes; /* Bytes written */
+ ssize_t bytes; /* Bytes written */
#ifdef HAVE_POLL
struct pollfd pfd; /* Poll structure for poll() */
#else /* select() */
@@ -575,7 +562,7 @@ cupsSideChannelWrite(
if (poll(&pfd, 1, -1) < 1)
return (-1);
}
- else if (poll(&pfd, 1, (long)(timeout * 1000)) < 1)
+ else if (poll(&pfd, 1, (int)(timeout * 1000)) < 1)
return (-1);
#else /* select() */
@@ -608,23 +595,23 @@ cupsSideChannelWrite(
* 4-N Data
*/
- if ((buffer = _cupsBufferGet(datalen + 4)) == NULL)
+ if ((buffer = _cupsBufferGet((size_t)datalen + 4)) == NULL)
return (-1);
buffer[0] = command;
buffer[1] = status;
- buffer[2] = datalen >> 8;
- buffer[3] = datalen & 255;
+ buffer[2] = (char)(datalen >> 8);
+ buffer[3] = (char)(datalen & 255);
bytes = 4;
if (datalen > 0)
{
- memcpy(buffer + 4, data, datalen);
+ memcpy(buffer + 4, data, (size_t)datalen);
bytes += datalen;
}
- while (write(CUPS_SC_FD, buffer, bytes) < 0)
+ while (write(CUPS_SC_FD, buffer, (size_t)bytes) < 0)
if (errno != EINTR && errno != EAGAIN)
{
_cupsBufferRelease(buffer);
@@ -638,5 +625,5 @@ cupsSideChannelWrite(
/*
- * End of "$Id: sidechannel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sidechannel.c 12124 2014-08-28 15:37:22Z msweet $".
*/
diff --git a/cups/sidechannel.h b/cups/sidechannel.h
index 19494b2..4694bb9 100644
--- a/cups/sidechannel.h
+++ b/cups/sidechannel.h
@@ -1,5 +1,5 @@
/*
- * "$Id: sidechannel.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sidechannel.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Side-channel API definitions for CUPS.
*
@@ -143,5 +143,5 @@ extern cups_sc_status_t cupsSideChannelSNMPWalk(const char *oid, double timeout,
#endif /* !_CUPS_SIDECHANNEL_H_ */
/*
- * End of "$Id: sidechannel.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sidechannel.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/snmp-private.h b/cups/snmp-private.h
index e0c3608..21698e0 100644
--- a/cups/snmp-private.h
+++ b/cups/snmp-private.h
@@ -1,18 +1,18 @@
/*
- * "$Id: snmp-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp-private.h 11558 2014-02-06 18:33:34Z msweet $"
*
- * Private SNMP definitions for CUPS.
+ * Private SNMP definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_SNMP_PRIVATE_H_
@@ -66,14 +66,14 @@ typedef struct cups_snmp_string_s /**** String value ****/
{
unsigned char bytes[CUPS_SNMP_MAX_STRING];
/* Bytes in string */
- int num_bytes; /* Number of bytes */
+ unsigned num_bytes; /* Number of bytes */
} cups_snmp_string_t;
union cups_snmp_value_u /**** Object value ****/
{
int boolean; /* Boolean value */
int integer; /* Integer value */
- unsigned counter; /* Counter value */
+ int counter; /* Counter value */
unsigned gauge; /* Gauge value */
unsigned timeticks; /* Timeticks value */
int oid[CUPS_SNMP_MAX_OID]; /* OID value */
@@ -88,7 +88,7 @@ typedef struct cups_snmp_s /**** SNMP data packet ****/
char community[CUPS_SNMP_MAX_COMMUNITY];
/* Community name */
cups_asn1_t request_type; /* Request type */
- int request_id; /* request-id value */
+ unsigned request_id; /* request-id value */
int error_status; /* error-status value */
int error_index; /* error-index value */
int object_name[CUPS_SNMP_MAX_OID];
@@ -142,5 +142,5 @@ extern int _cupsSNMPWrite(int fd, http_addr_t *address, int version,
/*
- * End of "$Id: snmp-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp-private.h 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/snmp.c b/cups/snmp.c
index 419bcfb..86d4598 100644
--- a/cups/snmp.c
+++ b/cups/snmp.c
@@ -1,57 +1,18 @@
/*
- * "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * SNMP functions for CUPS.
+ * SNMP functions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsSNMPClose() - Close a SNMP socket.
- * _cupsSNMPCopyOID() - Copy an OID.
- * _cupsSNMPDefaultCommunity() - Get the default SNMP community name.
- * _cupsSNMPIsOID() - Test whether a SNMP response contains the
- * specified OID.
- * _cupsSNMPIsOIDPrefixed() - Test whether a SNMP response uses the
- * specified OID prefix.
- * _cupsSNMPOIDToString() - Convert an OID to a string.
- * _cupsSNMPOpen() - Open a SNMP socket.
- * _cupsSNMPRead() - Read and parse a SNMP response.
- * _cupsSNMPSetDebug() - Enable/disable debug logging to stderr.
- * _cupsSNMPStringToOID() - Convert a numeric OID string to an OID array.
- * _cupsSNMPWalk() - Enumerate a group of OIDs.
- * _cupsSNMPWrite() - Send an SNMP query packet.
- * asn1_debug() - Decode an ASN1-encoded message.
- * asn1_decode_snmp() - Decode a SNMP packet.
- * asn1_encode_snmp() - Encode a SNMP packet.
- * asn1_get_integer() - Get an integer value.
- * asn1_get_length() - Get a value length.
- * asn1_get_oid() - Get an OID value.
- * asn1_get_packed() - Get a packed integer value.
- * asn1_get_string() - Get a string value.
- * asn1_get_type() - Get a value type.
- * asn1_set_integer() - Set an integer value.
- * asn1_set_length() - Set a value length.
- * asn1_set_oid() - Set an OID value.
- * asn1_set_packed() - Set a packed integer value.
- * asn1_size_integer() - Figure out the number of bytes needed for an
- * integer value.
- * asn1_size_length() - Figure out the number of bytes needed for a
- * length value.
- * asn1_size_oid() - Figure out the numebr of bytes needed for an
- * OID value.
- * asn1_size_packed() - Figure out the number of bytes needed for a
- * packed integer value.
- * snmp_set_error() - Set the localized error for a packet.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -77,16 +38,16 @@ static int asn1_encode_snmp(unsigned char *buffer, size_t len,
cups_snmp_t *packet);
static int asn1_get_integer(unsigned char **buffer,
unsigned char *bufend,
- int length);
+ unsigned length);
static int asn1_get_oid(unsigned char **buffer,
unsigned char *bufend,
- int length, int *oid, int oidsize);
+ unsigned 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);
+ unsigned length, char *string,
+ size_t strsize);
static unsigned asn1_get_length(unsigned char **buffer,
unsigned char *bufend);
static int asn1_get_type(unsigned char **buffer,
@@ -99,10 +60,10 @@ 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 unsigned asn1_size_integer(int integer);
+static unsigned asn1_size_length(unsigned length);
+static unsigned asn1_size_oid(const int *oid);
+static unsigned asn1_size_packed(int integer);
static void snmp_set_error(cups_snmp_t *packet,
const char *message);
@@ -116,11 +77,7 @@ _cupsSNMPClose(int fd) /* I - SNMP socket file descriptor */
{
DEBUG_printf(("4_cupsSNMPClose(fd=%d)", fd));
-#ifdef WIN32
- closesocket(fd);
-#else
- close(fd);
-#endif /* WIN32 */
+ httpAddrClose(NULL, fd);
}
@@ -323,7 +280,7 @@ _cupsSNMPOIDToString(const int *src, /* I - OID */
for (dstptr = dst, dstend = dstptr + dstsize - 1;
*src >= 0 && dstptr < dstend;
src ++, dstptr += strlen(dstptr))
- snprintf(dstptr, dstend - dstptr + 1, ".%d", *src);
+ snprintf(dstptr, (size_t)(dstend - dstptr + 1), ".%d", *src);
if (*src >= 0)
return (NULL);
@@ -362,11 +319,7 @@ _cupsSNMPOpen(int family) /* I - Address family - @code AF_INET@ or @code AF_IN
val = 1;
-#ifdef WIN32
- if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *)&val, sizeof(val)))
-#else
- if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
-#endif /* WIN32 */
+ if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, CUPS_SOCAST &val, sizeof(val)))
{
DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno)));
@@ -395,7 +348,7 @@ _cupsSNMPRead(int fd, /* I - SNMP socket file descriptor */
{
unsigned char buffer[CUPS_SNMP_MAX_PACKET];
/* Data packet */
- int bytes; /* Number of bytes received */
+ ssize_t bytes; /* Number of bytes received */
socklen_t addrlen; /* Source address length */
http_addr_t address; /* Source address */
@@ -481,9 +434,9 @@ _cupsSNMPRead(int fd, /* I - SNMP socket file descriptor */
* Look for the response status code in the SNMP message header...
*/
- asn1_debug("DEBUG: IN ", buffer, bytes, 0);
+ asn1_debug("DEBUG: IN ", buffer, (size_t)bytes, 0);
- asn1_decode_snmp(buffer, bytes, packet);
+ asn1_decode_snmp(buffer, (size_t)bytes, packet);
memcpy(&(packet->address), &address, sizeof(packet->address));
@@ -604,7 +557,7 @@ _cupsSNMPWalk(int fd, /* I - SNMP socket */
void *data) /* I - User data pointer that is passed to the callback function */
{
int count = 0; /* Number of OIDs found */
- int request_id = 0; /* Current request ID */
+ unsigned request_id = 0; /* Current request ID */
cups_snmp_t packet; /* Current response packet */
int lastoid[CUPS_SNMP_MAX_OID];
/* Last OID we got */
@@ -697,7 +650,7 @@ _cupsSNMPWrite(
cups_snmp_t packet; /* SNMP message packet */
unsigned char buffer[CUPS_SNMP_MAX_PACKET];
/* SNMP message buffer */
- int bytes; /* Size of message */
+ ssize_t bytes; /* Size of message */
http_addr_t temp; /* Copy of address */
@@ -753,7 +706,7 @@ _cupsSNMPWrite(
return (0);
}
- asn1_debug("DEBUG: OUT ", buffer, bytes, 0);
+ asn1_debug("DEBUG: OUT ", buffer, (size_t)bytes, 0);
/*
* Send the message...
@@ -763,8 +716,7 @@ _cupsSNMPWrite(
_httpAddrSetPort(&temp, CUPS_SNMP_PORT);
- return (sendto(fd, buffer, bytes, 0, (void *)&temp,
- httpAddrLength(&temp)) == bytes);
+ return (sendto(fd, buffer, (size_t)bytes, 0, (void *)&temp, (socklen_t)httpAddrLength(&temp)) == bytes);
}
@@ -778,14 +730,14 @@ asn1_debug(const char *prefix, /* I - Prefix string */
size_t len, /* I - Length of buffer */
int indent) /* I - Indentation */
{
- int i; /* Looping var */
+ size_t i; /* Looping var */
unsigned char *bufend; /* End of buffer */
int integer; /* Number value */
int oid[CUPS_SNMP_MAX_OID]; /* OID value */
char string[CUPS_SNMP_MAX_STRING];
/* String value */
unsigned char value_type; /* Type of value */
- int value_length; /* Length of value */
+ unsigned value_length; /* Length of value */
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
@@ -798,15 +750,15 @@ asn1_debug(const char *prefix, /* I - Prefix string */
* Do a hex dump of the packet...
*/
- int j;
+ size_t j;
fprintf(stderr, "%sHex Dump (%d bytes):\n", prefix, (int)len);
- for (i = 0; i < (int)len; i += 16)
+ for (i = 0; i < len; i += 16)
{
- fprintf(stderr, "%s%04x:", prefix, i);
+ fprintf(stderr, "%s%04x:", prefix, (unsigned)i);
- for (j = 0; j < 16 && (i + j) < (int)len; j ++)
+ for (j = 0; j < 16 && (i + j) < len; j ++)
{
if (j && !(j & 3))
fprintf(stderr, " %02x", buffer[i + j]);
@@ -826,7 +778,7 @@ asn1_debug(const char *prefix, /* I - Prefix string */
fputs(" ", stderr);
- for (j = 0; j < 16 && (i + j) < (int)len; j ++)
+ for (j = 0; j < 16 && (i + j) < len; j ++)
if (buffer[i + j] < ' ' || buffer[i + j] >= 0x7f)
putc('.', stderr);
else
@@ -847,7 +799,7 @@ asn1_debug(const char *prefix, /* I - Prefix string */
* Get value type...
*/
- value_type = asn1_get_type(&buffer, bufend);
+ value_type = (unsigned char)asn1_get_type(&buffer, bufend);
value_length = asn1_get_length(&buffer, bufend);
switch (value_type)
@@ -917,7 +869,7 @@ asn1_debug(const char *prefix, /* I - Prefix string */
fprintf(stderr, "%s%*sOID %d bytes ", prefix, indent, "",
value_length);
- for (i = 0; i < integer; i ++)
+ for (i = 0; i < (unsigned)integer; i ++)
fprintf(stderr, ".%d", oid[i]);
putc('\n', stderr);
break;
@@ -976,7 +928,7 @@ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
{
unsigned char *bufptr, /* Pointer into the data */
*bufend; /* End of data */
- int length; /* Length of value */
+ unsigned length; /* Length of value */
/*
@@ -1009,7 +961,7 @@ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
asn1_get_string(&bufptr, bufend, length, packet->community,
sizeof(packet->community));
- if ((packet->request_type = asn1_get_type(&bufptr, bufend))
+ if ((packet->request_type = (cups_asn1_t)asn1_get_type(&bufptr, bufend))
!= CUPS_ASN1_GET_RESPONSE)
snmp_set_error(packet, _("Packet does not contain a Get-Response-PDU"));
else if (asn1_get_length(&bufptr, bufend) == 0)
@@ -1020,7 +972,7 @@ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
snmp_set_error(packet, _("request-id uses indefinite length"));
else
{
- packet->request_id = asn1_get_integer(&bufptr, bufend, length);
+ packet->request_id = (unsigned)asn1_get_integer(&bufptr, bufend, length);
if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER)
snmp_set_error(packet, _("No error-status"));
@@ -1056,7 +1008,7 @@ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
asn1_get_oid(&bufptr, bufend, length, packet->object_name,
CUPS_SNMP_MAX_OID);
- packet->object_type = asn1_get_type(&bufptr, bufend);
+ packet->object_type = (cups_asn1_t)asn1_get_type(&bufptr, bufend);
if ((length = asn1_get_length(&bufptr, bufend)) == 0 &&
packet->object_type != CUPS_ASN1_NULL_VALUE &&
@@ -1100,12 +1052,12 @@ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
case CUPS_ASN1_GAUGE :
packet->object_value.gauge =
- asn1_get_integer(&bufptr, bufend, length);
+ (unsigned)asn1_get_integer(&bufptr, bufend, length);
break;
case CUPS_ASN1_TIMETICKS :
packet->object_value.timeticks =
- asn1_get_integer(&bufptr, bufend, length);
+ (unsigned)asn1_get_integer(&bufptr, bufend, length);
break;
default :
@@ -1133,7 +1085,7 @@ asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */
cups_snmp_t *packet) /* I - SNMP packet */
{
unsigned char *bufptr; /* Pointer into buffer */
- int total, /* Total length */
+ unsigned total, /* Total length */
msglen, /* Length of entire message */
commlen, /* Length of community string */
reqlen, /* Length of request */
@@ -1180,17 +1132,17 @@ asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */
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) +
+ reqlen = 2 + asn1_size_integer((int)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);
+ commlen = (unsigned)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 > (int)bufsize)
+ if (total > bufsize)
{
packet->error = "Message too large for buffer";
return (-1);
@@ -1216,7 +1168,7 @@ asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */
*bufptr++ = packet->request_type; /* Get-Request-PDU/Get-Next-Request-PDU */
asn1_set_length(&bufptr, reqlen);
- asn1_set_integer(&bufptr, packet->request_id);
+ asn1_set_integer(&bufptr, (int)packet->request_id);
asn1_set_integer(&bufptr, packet->error_status);
@@ -1262,7 +1214,7 @@ asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */
break;
}
- return (bufptr - buffer);
+ return ((int)(bufptr - buffer));
}
@@ -1274,7 +1226,7 @@ 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 */
+ unsigned length) /* I - Length of value */
{
int value; /* Integer value */
@@ -1337,7 +1289,7 @@ static int /* O - Number of OIDs */
asn1_get_oid(
unsigned char **buffer, /* IO - Pointer in buffer */
unsigned char *bufend, /* I - End of buffer */
- int length, /* I - Length of value */
+ unsigned length, /* I - Length of value */
int *oid, /* I - OID buffer */
int oidsize) /* I - Size of OID buffer */
{
@@ -1379,7 +1331,7 @@ asn1_get_oid(
*oidptr = -1;
- return (oidptr - oid);
+ return ((int)(oidptr - oid));
}
@@ -1421,22 +1373,14 @@ 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 */
+ unsigned length, /* I - Value length */
char *string, /* I - String buffer */
- int strsize) /* I - String buffer size */
+ size_t strsize) /* I - String buffer size */
{
- if (length > (bufend - *buffer))
- length = bufend - *buffer;
-
- if (length < 0)
- {
- /*
- * Disallow negative lengths!
- */
+ if (length > (unsigned)(bufend - *buffer))
+ length = (unsigned)(bufend - *buffer);
- *string = '\0';
- }
- else if (length < strsize)
+ if (length < strsize)
{
/*
* String is smaller than the buffer...
@@ -1460,7 +1404,7 @@ asn1_get_string(
if (length > 0)
(*buffer) += length;
- return (length < 0 ? NULL : string);
+ return (string);
}
@@ -1500,40 +1444,40 @@ asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
{
**buffer = 4;
(*buffer) ++;
- **buffer = integer >> 24;
+ **buffer = (unsigned char)(integer >> 24);
(*buffer) ++;
- **buffer = integer >> 16;
+ **buffer = (unsigned char)(integer >> 16);
(*buffer) ++;
- **buffer = integer >> 8;
+ **buffer = (unsigned char)(integer >> 8);
(*buffer) ++;
- **buffer = integer;
+ **buffer = (unsigned char)integer;
(*buffer) ++;
}
else if (integer > 0x7fff || integer < -0x8000)
{
**buffer = 3;
(*buffer) ++;
- **buffer = integer >> 16;
+ **buffer = (unsigned char)(integer >> 16);
(*buffer) ++;
- **buffer = integer >> 8;
+ **buffer = (unsigned char)(integer >> 8);
(*buffer) ++;
- **buffer = integer;
+ **buffer = (unsigned char)integer;
(*buffer) ++;
}
else if (integer > 0x7f || integer < -0x80)
{
**buffer = 2;
(*buffer) ++;
- **buffer = integer >> 8;
+ **buffer = (unsigned char)(integer >> 8);
(*buffer) ++;
- **buffer = integer;
+ **buffer = (unsigned char)integer;
(*buffer) ++;
}
else
{
**buffer = 1;
(*buffer) ++;
- **buffer = integer;
+ **buffer = (unsigned char)integer;
(*buffer) ++;
}
}
@@ -1551,21 +1495,21 @@ asn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */
{
**buffer = 0x82; /* 2-byte length */
(*buffer) ++;
- **buffer = length >> 8;
+ **buffer = (unsigned char)(length >> 8);
(*buffer) ++;
- **buffer = length;
+ **buffer = (unsigned char)length;
(*buffer) ++;
}
else if (length > 127)
{
**buffer = 0x81; /* 1-byte length */
(*buffer) ++;
- **buffer = length;
+ **buffer = (unsigned char)length;
(*buffer) ++;
}
else
{
- **buffer = length; /* Length */
+ **buffer = (unsigned char)length; /* Length */
(*buffer) ++;
}
}
@@ -1639,7 +1583,7 @@ asn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */
* integer value.
*/
-static int /* O - Size in bytes */
+static unsigned /* O - Size in bytes */
asn1_size_integer(int integer) /* I - Integer value */
{
if (integer > 0x7fffff || integer < -0x800000)
@@ -1658,8 +1602,8 @@ asn1_size_integer(int integer) /* I - Integer value */
* length value.
*/
-static int /* O - Size in bytes */
-asn1_size_length(int length) /* I - Length value */
+static unsigned /* O - Size in bytes */
+asn1_size_length(unsigned length) /* I - Length value */
{
if (length > 0xff)
return (3);
@@ -1675,10 +1619,10 @@ asn1_size_length(int length) /* I - Length value */
* OID value.
*/
-static int /* O - Size in bytes */
+static unsigned /* O - Size in bytes */
asn1_size_oid(const int *oid) /* I - OID value */
{
- int length; /* Length of value */
+ unsigned length; /* Length of value */
if (oid[1] < 0)
@@ -1698,7 +1642,7 @@ asn1_size_oid(const int *oid) /* I - OID value */
* packed integer value.
*/
-static int /* O - Size in bytes */
+static unsigned /* O - Size in bytes */
asn1_size_packed(int integer) /* I - Integer value */
{
if (integer > 0xfffffff)
@@ -1733,5 +1677,5 @@ snmp_set_error(cups_snmp_t *packet, /* I - Packet */
/*
- * End of "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/cups/snprintf.c b/cups/snprintf.c
index 4e4d91f..4029d2c 100644
--- a/cups/snprintf.c
+++ b/cups/snprintf.c
@@ -1,9 +1,9 @@
/*
- * "$Id: snprintf.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snprintf.c 10996 2013-05-29 11:51:34Z msweet $"
*
* snprintf functions for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -48,6 +48,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
char tformat[100], /* Temporary format string for sprintf() */
*tptr, /* Pointer into temporary format */
temp[1024]; /* Buffer for formatted numbers */
+ size_t templen; /* Length of "temp" */
char *s; /* Pointer to string */
int slen; /* Length of string */
int bytes; /* Total number of bytes needed */
@@ -183,20 +184,21 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
break;
sprintf(temp, tformat, va_arg(ap, double));
+ templen = strlen(temp):
- bytes += (int)strlen(temp);
+ bytes += (int)templen;
if (bufptr)
{
- if ((bufptr + strlen(temp)) > bufend)
+ if ((bufptr + templen) > bufend)
{
- strncpy(bufptr, temp, (size_t)(bufend - bufptr));
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
bufptr = bufend;
}
else
{
- strcpy(bufptr, temp);
- bufptr += strlen(temp);
+ memcpy(bufptr, temp, templen + 1);
+ bufptr += templen;
}
}
break;
@@ -213,20 +215,21 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
break;
sprintf(temp, tformat, va_arg(ap, int));
+ templen = strlen(temp):
- bytes += (int)strlen(temp);
+ bytes += (int)templen;
if (bufptr)
{
- if ((bufptr + strlen(temp)) > bufend)
+ if ((bufptr + templen) > bufend)
{
- strncpy(bufptr, temp, (size_t)(bufend - bufptr));
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
bufptr = bufend;
}
else
{
- strcpy(bufptr, temp);
- bufptr += strlen(temp);
+ memcpy(bufptr, temp, templen + 1);
+ bufptr += templen;
}
}
break;
@@ -236,20 +239,21 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
break;
sprintf(temp, tformat, va_arg(ap, void *));
+ templen = strlen(temp):
- bytes += (int)strlen(temp);
+ bytes += (int)templen;
if (bufptr)
{
- if ((bufptr + strlen(temp)) > bufend)
+ if ((bufptr + templen) > bufend)
{
- strncpy(bufptr, temp, (size_t)(bufend - bufptr));
+ strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
bufptr = bufend;
}
else
{
- strcpy(bufptr, temp);
- bufptr += strlen(temp);
+ memcpy(bufptr, temp, templen + 1);
+ bufptr += templen;
}
}
break;
@@ -292,13 +296,13 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
if (sign == '-')
{
- strncpy(bufptr, s, (size_t)slen);
+ memcpy(bufptr, s, (size_t)slen);
memset(bufptr + slen, ' ', (size_t)(width - slen));
}
else
{
memset(bufptr, ' ', (size_t)(width - slen));
- strncpy(bufptr + width - slen, s, (size_t)slen);
+ memcpy(bufptr + width - slen, s, (size_t)slen);
}
bufptr += width;
@@ -357,6 +361,6 @@ _cups_snprintf(char *buffer, /* O - Output buffer */
/*
- * End of "$Id: snprintf.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snprintf.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/sspi-private.h b/cups/sspi-private.h
deleted file mode 100644
index e8f36c2..0000000
--- a/cups/sspi-private.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Private SSPI definitions for CUPS.
- *
- * Copyright 2010 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- */
-
-#ifndef _CUPS_SSPI_PRIVATE_H_
-# define _CUPS_SSPI_PRIVATE_H_
-
-/*
- * Include necessary headers...
- */
-
-# include <config.h>
-# include <winsock2.h>
-# include <ws2tcpip.h>
-# include <wincrypt.h>
-# include <wintrust.h>
-# include <schannel.h>
-# define SECURITY_WIN32
-# include <security.h>
-# include <sspi.h>
-
-/*
- * C++ magic...
- */
-
-# ifdef __cplusplus
-extern "C" {
-# endif /* __cplusplus */
-
-
-typedef struct /**** SSPI/SSL data structure ****/
-{
- SOCKET sock; /* TCP/IP socket */
- CredHandle creds; /* Credentials */
- CtxtHandle context; /* SSL context */
- BOOL contextInitialized; /* Is context init'd? */
- SecPkgContext_StreamSizes streamSizes; /* SSL data stream sizes */
- BYTE *decryptBuffer; /* Data pre-decryption*/
- size_t decryptBufferLength; /* Length of decrypt buffer */
- size_t decryptBufferUsed; /* Bytes used in buffer */
- BYTE *readBuffer; /* Data post-decryption */
- size_t readBufferLength; /* Length of read buffer */
- size_t readBufferUsed; /* Bytes used in buffer */
- DWORD certFlags; /* Cert verification flags */
-} _sspi_struct_t;
-
-
-/*
- * Prototypes...
- */
-_sspi_struct_t *_sspiAlloc(void);
-BOOL _sspiAccept(_sspi_struct_t *conn);
-BOOL _sspiConnect(_sspi_struct_t *conn,
- const CHAR *hostname);
-void _sspiFree(_sspi_struct_t *conn);
-BOOL _sspiGetCredentials(_sspi_struct_t *conn,
- const LPWSTR containerName,
- const TCHAR *commonName,
- BOOL server);
-int _sspiPending(_sspi_struct_t *conn);
-int _sspiRead(_sspi_struct_t *conn,
- void *buf, size_t len);
-void _sspiSetAllowsAnyRoot(_sspi_struct_t *conn,
- BOOL allow);
-void _sspiSetAllowsExpiredCerts(_sspi_struct_t *conn,
- BOOL allow);
-int _sspiWrite(_sspi_struct_t *conn,
- void *buf, size_t len);
-
-
-# ifdef __cplusplus
-}
-# endif /* __cplusplus */
-#endif /* !_CUPS_SSPI_PRIVATE_H_ */
diff --git a/cups/sspi.c b/cups/sspi.c
deleted file mode 100644
index 97e9654..0000000
--- a/cups/sspi.c
+++ /dev/null
@@ -1,1485 +0,0 @@
-/*
- * "$Id: sspi.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * Windows SSPI SSL implementation for CUPS.
- *
- * Copyright 2010-2011 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * sspi_alloc() - Allocate SSPI ssl object
- * _sspiGetCredentials() - Retrieve an SSL/TLS certificate from the
- * system store If one cannot be found, one is
- * created.
- * _sspiConnect() - Make an SSL connection. This function
- * assumes a TCP/IP connection has already been
- * successfully made
- * _sspiAccept() - Accept an SSL/TLS connection
- * _sspiSetAllowsAnyRoot() - Set the client cert policy for untrusted
- * root certs
- * _sspiSetAllowsExpiredCerts() - Set the client cert policy for expired root
- * certs
- * _sspiWrite() - Write a buffer to an ssl socket
- * _sspiRead() - Read a buffer from an ssl socket
- * _sspiPending() - Returns the number of available bytes
- * _sspiFree() - Close a connection and free resources
- * sspi_verify_certificate() - Verify a server certificate
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "sspi-private.h"
-#include "debug-private.h"
-
-
-/* required to link this library for certificate functions */
-#pragma comment(lib, "Crypt32.lib")
-#pragma comment(lib, "Secur32.lib")
-#pragma comment(lib, "Ws2_32.lib")
-
-
-#if !defined(SECURITY_FLAG_IGNORE_UNKNOWN_CA)
-# define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 /* Untrusted root */
-#endif
-
-#if !defined(SECURITY_FLAG_IGNORE_CERT_DATE_INVALID)
-# define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 /* Expired X509 Cert. */
-#endif
-
-static DWORD sspi_verify_certificate(PCCERT_CONTEXT serverCert,
- const CHAR *serverName,
- DWORD dwCertFlags);
-
-
-/*
- * 'sspi_alloc()' - Allocate SSPI ssl object
- */
-_sspi_struct_t* /* O - New SSPI/SSL object */
-_sspiAlloc(void)
-{
- _sspi_struct_t *conn = calloc(sizeof(_sspi_struct_t), 1);
-
- if (conn)
- conn->sock = INVALID_SOCKET;
-
- return (conn);
-}
-
-
-/*
- * '_sspiGetCredentials()' - Retrieve an SSL/TLS certificate from the system store
- * If one cannot be found, one is created.
- */
-BOOL /* O - 1 on success, 0 on failure */
-_sspiGetCredentials(_sspi_struct_t *conn,
- /* I - Client connection */
- const LPWSTR container,
- /* I - Cert container name */
- const TCHAR *cn, /* I - Common name of certificate */
- BOOL isServer)
- /* I - Is caller a server? */
-{
- HCERTSTORE store = NULL; /* Certificate store */
- PCCERT_CONTEXT storedContext = NULL;
- /* Context created from the store */
- PCCERT_CONTEXT createdContext = NULL;
- /* Context created by us */
- DWORD dwSize = 0; /* 32 bit size */
- PBYTE p = NULL; /* Temporary storage */
- HCRYPTPROV hProv = (HCRYPTPROV) NULL;
- /* Handle to a CSP */
- CERT_NAME_BLOB sib; /* Arbitrary array of bytes */
- SCHANNEL_CRED SchannelCred; /* Schannel credential data */
- TimeStamp tsExpiry; /* Time stamp */
- SECURITY_STATUS Status; /* Status */
- HCRYPTKEY hKey = (HCRYPTKEY) NULL;
- /* Handle to crypto key */
- CRYPT_KEY_PROV_INFO kpi; /* Key container info */
- SYSTEMTIME et; /* System time */
- CERT_EXTENSIONS exts; /* Array of cert extensions */
- CRYPT_KEY_PROV_INFO ckp; /* Handle to crypto key */
- BOOL ok = TRUE; /* Return value */
-
- if (!conn)
- return (FALSE);
- if (!cn)
- return (FALSE);
-
- if (!CryptAcquireContextW(&hProv, (LPWSTR) container, MS_DEF_PROV_W,
- PROV_RSA_FULL,
- CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
- {
- if (GetLastError() == NTE_EXISTS)
- {
- if (!CryptAcquireContextW(&hProv, (LPWSTR) container, MS_DEF_PROV_W,
- PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
- {
- DEBUG_printf(("_sspiGetCredentials: CryptAcquireContext failed: %x\n",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
- }
- }
-
- store = CertOpenStore(CERT_STORE_PROV_SYSTEM,
- X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
- hProv,
- CERT_SYSTEM_STORE_LOCAL_MACHINE |
- CERT_STORE_NO_CRYPT_RELEASE_FLAG |
- CERT_STORE_OPEN_EXISTING_FLAG,
- L"MY");
-
- if (!store)
- {
- DEBUG_printf(("_sspiGetCredentials: CertOpenSystemStore failed: %x\n",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- dwSize = 0;
-
- if (!CertStrToName(X509_ASN_ENCODING, cn, CERT_OID_NAME_STR,
- NULL, NULL, &dwSize, NULL))
- {
- DEBUG_printf(("_sspiGetCredentials: CertStrToName failed: %x\n",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- p = (PBYTE) malloc(dwSize);
-
- if (!p)
- {
- DEBUG_printf(("_sspiGetCredentials: malloc failed for %d bytes", dwSize));
- ok = FALSE;
- goto cleanup;
- }
-
- if (!CertStrToName(X509_ASN_ENCODING, cn, CERT_OID_NAME_STR, NULL,
- p, &dwSize, NULL))
- {
- DEBUG_printf(("_sspiGetCredentials: CertStrToName failed: %x",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- sib.cbData = dwSize;
- sib.pbData = p;
-
- storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
- 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
-
- if (!storedContext)
- {
- /*
- * If we couldn't find the context, then we'll
- * create a new one
- */
- if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey))
- {
- DEBUG_printf(("_sspiGetCredentials: CryptGenKey failed: %x",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- ZeroMemory(&kpi, sizeof(kpi));
- kpi.pwszContainerName = (LPWSTR) container;
- kpi.pwszProvName = MS_DEF_PROV_W;
- kpi.dwProvType = PROV_RSA_FULL;
- kpi.dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID;
- kpi.dwKeySpec = AT_KEYEXCHANGE;
-
- GetSystemTime(&et);
- et.wYear += 10;
-
- ZeroMemory(&exts, sizeof(exts));
-
- createdContext = CertCreateSelfSignCertificate(hProv, &sib, 0, &kpi, NULL, NULL,
- &et, &exts);
-
- if (!createdContext)
- {
- DEBUG_printf(("_sspiGetCredentials: CertCreateSelfSignCertificate failed: %x",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- if (!CertAddCertificateContextToStore(store, createdContext,
- CERT_STORE_ADD_REPLACE_EXISTING,
- &storedContext))
- {
- DEBUG_printf(("_sspiGetCredentials: CertAddCertificateContextToStore failed: %x",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- ZeroMemory(&ckp, sizeof(ckp));
- ckp.pwszContainerName = (LPWSTR) container;
- ckp.pwszProvName = MS_DEF_PROV_W;
- ckp.dwProvType = PROV_RSA_FULL;
- ckp.dwFlags = CRYPT_MACHINE_KEYSET;
- ckp.dwKeySpec = AT_KEYEXCHANGE;
-
- if (!CertSetCertificateContextProperty(storedContext,
- CERT_KEY_PROV_INFO_PROP_ID,
- 0, &ckp))
- {
- DEBUG_printf(("_sspiGetCredentials: CertSetCertificateContextProperty failed: %x",
- GetLastError()));
- ok = FALSE;
- goto cleanup;
- }
- }
-
- ZeroMemory(&SchannelCred, sizeof(SchannelCred));
-
- SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
- SchannelCred.cCreds = 1;
- SchannelCred.paCred = &storedContext;
-
- /*
- * SSPI doesn't seem to like it if grbitEnabledProtocols
- * is set for a client
- */
- if (isServer)
- SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1;
-
- /*
- * Create an SSPI credential.
- */
- Status = AcquireCredentialsHandle(NULL, UNISP_NAME,
- isServer ? SECPKG_CRED_INBOUND:SECPKG_CRED_OUTBOUND,
- NULL, &SchannelCred, NULL, NULL, &conn->creds,
- &tsExpiry);
- if (Status != SEC_E_OK)
- {
- DEBUG_printf(("_sspiGetCredentials: AcquireCredentialsHandle failed: %x", Status));
- ok = FALSE;
- goto cleanup;
- }
-
-cleanup:
-
- /*
- * Cleanup
- */
- if (hKey)
- CryptDestroyKey(hKey);
-
- if (createdContext)
- CertFreeCertificateContext(createdContext);
-
- if (storedContext)
- CertFreeCertificateContext(storedContext);
-
- if (p)
- free(p);
-
- if (store)
- CertCloseStore(store, 0);
-
- if (hProv)
- CryptReleaseContext(hProv, 0);
-
- return (ok);
-}
-
-
-/*
- * '_sspiConnect()' - Make an SSL connection. This function
- * assumes a TCP/IP connection has already
- * been successfully made
- */
-BOOL /* O - 1 on success, 0 on failure */
-_sspiConnect(_sspi_struct_t *conn, /* I - Client connection */
- const CHAR *hostname) /* I - Server hostname */
-{
- PCCERT_CONTEXT serverCert; /* Server certificate */
- DWORD dwSSPIFlags; /* SSL connection attributes we want */
- DWORD dwSSPIOutFlags; /* SSL connection attributes we got */
- TimeStamp tsExpiry; /* Time stamp */
- SECURITY_STATUS scRet; /* Status */
- DWORD cbData; /* Data count */
- SecBufferDesc inBuffer; /* Array of SecBuffer structs */
- SecBuffer inBuffers[2]; /* Security package buffer */
- SecBufferDesc outBuffer; /* Array of SecBuffer structs */
- SecBuffer outBuffers[1]; /* Security package buffer */
- BOOL ok = TRUE; /* Return value */
-
- serverCert = NULL;
-
- dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT |
- ISC_REQ_REPLAY_DETECT |
- ISC_REQ_CONFIDENTIALITY |
- ISC_RET_EXTENDED_ERROR |
- ISC_REQ_ALLOCATE_MEMORY |
- ISC_REQ_STREAM;
-
- /*
- * Initiate a ClientHello message and generate a token.
- */
- outBuffers[0].pvBuffer = NULL;
- outBuffers[0].BufferType = SECBUFFER_TOKEN;
- outBuffers[0].cbBuffer = 0;
-
- outBuffer.cBuffers = 1;
- outBuffer.pBuffers = outBuffers;
- outBuffer.ulVersion = SECBUFFER_VERSION;
-
- scRet = InitializeSecurityContext(&conn->creds, NULL, TEXT(""), dwSSPIFlags,
- 0, SECURITY_NATIVE_DREP, NULL, 0, &conn->context,
- &outBuffer, &dwSSPIOutFlags, &tsExpiry);
-
- if (scRet != SEC_I_CONTINUE_NEEDED)
- {
- DEBUG_printf(("_sspiConnect: InitializeSecurityContext(1) failed: %x", scRet));
- ok = FALSE;
- goto cleanup;
- }
-
- /*
- * Send response to server if there is one.
- */
- if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
- {
- cbData = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
-
- if ((cbData == SOCKET_ERROR) || !cbData)
- {
- DEBUG_printf(("_sspiConnect: send failed: %d", WSAGetLastError()));
- FreeContextBuffer(outBuffers[0].pvBuffer);
- DeleteSecurityContext(&conn->context);
- ok = FALSE;
- goto cleanup;
- }
-
- DEBUG_printf(("_sspiConnect: %d bytes of handshake data sent", cbData));
-
- /*
- * Free output buffer.
- */
- FreeContextBuffer(outBuffers[0].pvBuffer);
- outBuffers[0].pvBuffer = NULL;
- }
-
- dwSSPIFlags = ISC_REQ_MANUAL_CRED_VALIDATION |
- ISC_REQ_SEQUENCE_DETECT |
- ISC_REQ_REPLAY_DETECT |
- ISC_REQ_CONFIDENTIALITY |
- ISC_RET_EXTENDED_ERROR |
- ISC_REQ_ALLOCATE_MEMORY |
- ISC_REQ_STREAM;
-
- conn->decryptBufferUsed = 0;
-
- /*
- * Loop until the handshake is finished or an error occurs.
- */
- scRet = SEC_I_CONTINUE_NEEDED;
-
- while(scRet == SEC_I_CONTINUE_NEEDED ||
- scRet == SEC_E_INCOMPLETE_MESSAGE ||
- scRet == SEC_I_INCOMPLETE_CREDENTIALS)
- {
- if ((conn->decryptBufferUsed == 0) || (scRet == SEC_E_INCOMPLETE_MESSAGE))
- {
- if (conn->decryptBufferLength <= conn->decryptBufferUsed)
- {
- conn->decryptBufferLength += 4096;
- conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer, conn->decryptBufferLength);
-
- if (!conn->decryptBuffer)
- {
- DEBUG_printf(("_sspiConnect: unable to allocate %d byte decrypt buffer",
- conn->decryptBufferLength));
- SetLastError(E_OUTOFMEMORY);
- ok = FALSE;
- goto cleanup;
- }
- }
-
- cbData = recv(conn->sock, conn->decryptBuffer + conn->decryptBufferUsed,
- (int) (conn->decryptBufferLength - conn->decryptBufferUsed), 0);
-
- if (cbData == SOCKET_ERROR)
- {
- DEBUG_printf(("_sspiConnect: recv failed: %d", WSAGetLastError()));
- ok = FALSE;
- goto cleanup;
- }
- else if (cbData == 0)
- {
- DEBUG_printf(("_sspiConnect: server unexpectedly disconnected"));
- ok = FALSE;
- goto cleanup;
- }
-
- DEBUG_printf(("_sspiConnect: %d bytes of handshake data received",
- cbData));
-
- conn->decryptBufferUsed += cbData;
- }
-
- /*
- * Set up the input buffers. Buffer 0 is used to pass in data
- * received from the server. Schannel will consume some or all
- * of this. Leftover data (if any) will be placed in buffer 1 and
- * given a buffer type of SECBUFFER_EXTRA.
- */
- inBuffers[0].pvBuffer = conn->decryptBuffer;
- inBuffers[0].cbBuffer = (unsigned long) conn->decryptBufferUsed;
- inBuffers[0].BufferType = SECBUFFER_TOKEN;
-
- inBuffers[1].pvBuffer = NULL;
- inBuffers[1].cbBuffer = 0;
- inBuffers[1].BufferType = SECBUFFER_EMPTY;
-
- inBuffer.cBuffers = 2;
- inBuffer.pBuffers = inBuffers;
- inBuffer.ulVersion = SECBUFFER_VERSION;
-
- /*
- * Set up the output buffers. These are initialized to NULL
- * so as to make it less likely we'll attempt to free random
- * garbage later.
- */
- outBuffers[0].pvBuffer = NULL;
- outBuffers[0].BufferType= SECBUFFER_TOKEN;
- outBuffers[0].cbBuffer = 0;
-
- outBuffer.cBuffers = 1;
- outBuffer.pBuffers = outBuffers;
- outBuffer.ulVersion = SECBUFFER_VERSION;
-
- /*
- * Call InitializeSecurityContext.
- */
- scRet = InitializeSecurityContext(&conn->creds, &conn->context, NULL, dwSSPIFlags,
- 0, SECURITY_NATIVE_DREP, &inBuffer, 0, NULL,
- &outBuffer, &dwSSPIOutFlags, &tsExpiry);
-
- /*
- * If InitializeSecurityContext was successful (or if the error was
- * one of the special extended ones), send the contends of the output
- * buffer to the server.
- */
- if (scRet == SEC_E_OK ||
- scRet == SEC_I_CONTINUE_NEEDED ||
- FAILED(scRet) && (dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR))
- {
- if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
- {
- cbData = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
-
- if ((cbData == SOCKET_ERROR) || !cbData)
- {
- DEBUG_printf(("_sspiConnect: send failed: %d", WSAGetLastError()));
- FreeContextBuffer(outBuffers[0].pvBuffer);
- DeleteSecurityContext(&conn->context);
- ok = FALSE;
- goto cleanup;
- }
-
- DEBUG_printf(("_sspiConnect: %d bytes of handshake data sent", cbData));
-
- /*
- * Free output buffer.
- */
- FreeContextBuffer(outBuffers[0].pvBuffer);
- outBuffers[0].pvBuffer = NULL;
- }
- }
-
- /*
- * If InitializeSecurityContext returned SEC_E_INCOMPLETE_MESSAGE,
- * then we need to read more data from the server and try again.
- */
- if (scRet == SEC_E_INCOMPLETE_MESSAGE)
- continue;
-
- /*
- * If InitializeSecurityContext returned SEC_E_OK, then the
- * handshake completed successfully.
- */
- if (scRet == SEC_E_OK)
- {
- /*
- * If the "extra" buffer contains data, this is encrypted application
- * protocol layer stuff. It needs to be saved. The application layer
- * will later decrypt it with DecryptMessage.
- */
- DEBUG_printf(("_sspiConnect: Handshake was successful"));
-
- if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
- {
- if (conn->decryptBufferLength < inBuffers[1].cbBuffer)
- {
- conn->decryptBuffer = realloc(conn->decryptBuffer, inBuffers[1].cbBuffer);
-
- if (!conn->decryptBuffer)
- {
- DEBUG_printf(("_sspiConnect: unable to allocate %d bytes for decrypt buffer",
- inBuffers[1].cbBuffer));
- SetLastError(E_OUTOFMEMORY);
- ok = FALSE;
- goto cleanup;
- }
- }
-
- memmove(conn->decryptBuffer,
- conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer),
- inBuffers[1].cbBuffer);
-
- conn->decryptBufferUsed = inBuffers[1].cbBuffer;
-
- DEBUG_printf(("_sspiConnect: %d bytes of app data was bundled with handshake data",
- conn->decryptBufferUsed));
- }
- else
- conn->decryptBufferUsed = 0;
-
- /*
- * Bail out to quit
- */
- break;
- }
-
- /*
- * Check for fatal error.
- */
- if (FAILED(scRet))
- {
- DEBUG_printf(("_sspiConnect: InitializeSecurityContext(2) failed: %x", scRet));
- ok = FALSE;
- break;
- }
-
- /*
- * If InitializeSecurityContext returned SEC_I_INCOMPLETE_CREDENTIALS,
- * then the server just requested client authentication.
- */
- if (scRet == SEC_I_INCOMPLETE_CREDENTIALS)
- {
- /*
- * Unimplemented
- */
- DEBUG_printf(("_sspiConnect: server requested client credentials"));
- ok = FALSE;
- break;
- }
-
- /*
- * Copy any leftover data from the "extra" buffer, and go around
- * again.
- */
- if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
- {
- memmove(conn->decryptBuffer,
- conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer),
- inBuffers[1].cbBuffer);
-
- conn->decryptBufferUsed = inBuffers[1].cbBuffer;
- }
- else
- {
- conn->decryptBufferUsed = 0;
- }
- }
-
- if (ok)
- {
- conn->contextInitialized = TRUE;
-
- /*
- * Get the server cert
- */
- scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (VOID*) &serverCert );
-
- if (scRet != SEC_E_OK)
- {
- DEBUG_printf(("_sspiConnect: QueryContextAttributes failed(SECPKG_ATTR_REMOTE_CERT_CONTEXT): %x", scRet));
- ok = FALSE;
- goto cleanup;
- }
-
- scRet = sspi_verify_certificate(serverCert, hostname, conn->certFlags);
-
- if (scRet != SEC_E_OK)
- {
- DEBUG_printf(("_sspiConnect: sspi_verify_certificate failed: %x", scRet));
- ok = FALSE;
- goto cleanup;
- }
-
- /*
- * Find out how big the header/trailer will be:
- */
- scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->streamSizes);
-
- if (scRet != SEC_E_OK)
- {
- DEBUG_printf(("_sspiConnect: QueryContextAttributes failed(SECPKG_ATTR_STREAM_SIZES): %x", scRet));
- ok = FALSE;
- }
- }
-
-cleanup:
-
- if (serverCert)
- CertFreeCertificateContext(serverCert);
-
- return (ok);
-}
-
-
-/*
- * '_sspiAccept()' - Accept an SSL/TLS connection
- */
-BOOL /* O - 1 on success, 0 on failure */
-_sspiAccept(_sspi_struct_t *conn) /* I - Client connection */
-{
- DWORD dwSSPIFlags; /* SSL connection attributes we want */
- DWORD dwSSPIOutFlags; /* SSL connection attributes we got */
- TimeStamp tsExpiry; /* Time stamp */
- SECURITY_STATUS scRet; /* SSPI Status */
- SecBufferDesc inBuffer; /* Array of SecBuffer structs */
- SecBuffer inBuffers[2]; /* Security package buffer */
- SecBufferDesc outBuffer; /* Array of SecBuffer structs */
- SecBuffer outBuffers[1]; /* Security package buffer */
- DWORD num = 0; /* 32 bit status value */
- BOOL fInitContext = TRUE;
- /* Has the context been init'd? */
- BOOL ok = TRUE; /* Return value */
-
- if (!conn)
- return (FALSE);
-
- dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT |
- ASC_REQ_REPLAY_DETECT |
- ASC_REQ_CONFIDENTIALITY |
- ASC_REQ_EXTENDED_ERROR |
- ASC_REQ_ALLOCATE_MEMORY |
- ASC_REQ_STREAM;
-
- conn->decryptBufferUsed = 0;
-
- /*
- * Set OutBuffer for AcceptSecurityContext call
- */
- outBuffer.cBuffers = 1;
- outBuffer.pBuffers = outBuffers;
- outBuffer.ulVersion = SECBUFFER_VERSION;
-
- scRet = SEC_I_CONTINUE_NEEDED;
-
- while (scRet == SEC_I_CONTINUE_NEEDED ||
- scRet == SEC_E_INCOMPLETE_MESSAGE ||
- scRet == SEC_I_INCOMPLETE_CREDENTIALS)
- {
- if ((conn->decryptBufferUsed == 0) || (scRet == SEC_E_INCOMPLETE_MESSAGE))
- {
- if (conn->decryptBufferLength <= conn->decryptBufferUsed)
- {
- conn->decryptBufferLength += 4096;
- conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer,
- conn->decryptBufferLength);
-
- if (!conn->decryptBuffer)
- {
- DEBUG_printf(("_sspiAccept: unable to allocate %d byte decrypt buffer",
- conn->decryptBufferLength));
- ok = FALSE;
- goto cleanup;
- }
- }
-
- for (;;)
- {
- num = recv(conn->sock,
- conn->decryptBuffer + conn->decryptBufferUsed,
- (int)(conn->decryptBufferLength - conn->decryptBufferUsed),
- 0);
-
- if ((num == SOCKET_ERROR) && (WSAGetLastError() == WSAEWOULDBLOCK))
- Sleep(1);
- else
- break;
- }
-
- if (num == SOCKET_ERROR)
- {
- DEBUG_printf(("_sspiAccept: recv failed: %d", WSAGetLastError()));
- ok = FALSE;
- goto cleanup;
- }
- else if (num == 0)
- {
- DEBUG_printf(("_sspiAccept: client disconnected"));
- ok = FALSE;
- goto cleanup;
- }
-
- DEBUG_printf(("_sspiAccept: received %d (handshake) bytes from client",
- num));
- conn->decryptBufferUsed += num;
- }
-
- /*
- * InBuffers[1] is for getting extra data that
- * SSPI/SCHANNEL doesn't proccess on this
- * run around the loop.
- */
- inBuffers[0].pvBuffer = conn->decryptBuffer;
- inBuffers[0].cbBuffer = (unsigned long) conn->decryptBufferUsed;
- inBuffers[0].BufferType = SECBUFFER_TOKEN;
-
- inBuffers[1].pvBuffer = NULL;
- inBuffers[1].cbBuffer = 0;
- inBuffers[1].BufferType = SECBUFFER_EMPTY;
-
- inBuffer.cBuffers = 2;
- inBuffer.pBuffers = inBuffers;
- inBuffer.ulVersion = SECBUFFER_VERSION;
-
- /*
- * Initialize these so if we fail, pvBuffer contains NULL,
- * so we don't try to free random garbage at the quit
- */
- outBuffers[0].pvBuffer = NULL;
- outBuffers[0].BufferType = SECBUFFER_TOKEN;
- outBuffers[0].cbBuffer = 0;
-
- scRet = AcceptSecurityContext(&conn->creds, (fInitContext?NULL:&conn->context),
- &inBuffer, dwSSPIFlags, SECURITY_NATIVE_DREP,
- (fInitContext?&conn->context:NULL), &outBuffer,
- &dwSSPIOutFlags, &tsExpiry);
-
- fInitContext = FALSE;
-
- if (scRet == SEC_E_OK ||
- scRet == SEC_I_CONTINUE_NEEDED ||
- (FAILED(scRet) && ((dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR) != 0)))
- {
- if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
- {
- /*
- * Send response to server if there is one
- */
- num = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
-
- if ((num == SOCKET_ERROR) || (num == 0))
- {
- DEBUG_printf(("_sspiAccept: handshake send failed: %d", WSAGetLastError()));
- ok = FALSE;
- goto cleanup;
- }
-
- DEBUG_printf(("_sspiAccept: send %d handshake bytes to client",
- outBuffers[0].cbBuffer));
-
- FreeContextBuffer(outBuffers[0].pvBuffer);
- outBuffers[0].pvBuffer = NULL;
- }
- }
-
- if (scRet == SEC_E_OK)
- {
- /*
- * If there's extra data then save it for
- * next time we go to decrypt
- */
- if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
- {
- memcpy(conn->decryptBuffer,
- (LPBYTE) (conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer)),
- inBuffers[1].cbBuffer);
- conn->decryptBufferUsed = inBuffers[1].cbBuffer;
- }
- else
- {
- conn->decryptBufferUsed = 0;
- }
-
- ok = TRUE;
- break;
- }
- else if (FAILED(scRet) && (scRet != SEC_E_INCOMPLETE_MESSAGE))
- {
- DEBUG_printf(("_sspiAccept: AcceptSecurityContext failed: %x", scRet));
- ok = FALSE;
- break;
- }
-
- if (scRet != SEC_E_INCOMPLETE_MESSAGE &&
- scRet != SEC_I_INCOMPLETE_CREDENTIALS)
- {
- if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
- {
- memcpy(conn->decryptBuffer,
- (LPBYTE) (conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer)),
- inBuffers[1].cbBuffer);
- conn->decryptBufferUsed = inBuffers[1].cbBuffer;
- }
- else
- {
- conn->decryptBufferUsed = 0;
- }
- }
- }
-
- if (ok)
- {
- conn->contextInitialized = TRUE;
-
- /*
- * Find out how big the header will be:
- */
- scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->streamSizes);
-
- if (scRet != SEC_E_OK)
- {
- DEBUG_printf(("_sspiAccept: QueryContextAttributes failed: %x", scRet));
- ok = FALSE;
- }
- }
-
-cleanup:
-
- return (ok);
-}
-
-
-/*
- * '_sspiSetAllowsAnyRoot()' - Set the client cert policy for untrusted root certs
- */
-void
-_sspiSetAllowsAnyRoot(_sspi_struct_t *conn,
- /* I - Client connection */
- BOOL allow)
- /* I - Allow any root */
-{
- conn->certFlags = (allow) ? conn->certFlags | SECURITY_FLAG_IGNORE_UNKNOWN_CA :
- conn->certFlags & ~SECURITY_FLAG_IGNORE_UNKNOWN_CA;
-}
-
-
-/*
- * '_sspiSetAllowsExpiredCerts()' - Set the client cert policy for expired root certs
- */
-void
-_sspiSetAllowsExpiredCerts(_sspi_struct_t *conn,
- /* I - Client connection */
- BOOL allow)
- /* I - Allow expired certs */
-{
- conn->certFlags = (allow) ? conn->certFlags | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID :
- conn->certFlags & ~SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
-}
-
-
-/*
- * '_sspiWrite()' - Write a buffer to an ssl socket
- */
-int /* O - Bytes written or SOCKET_ERROR */
-_sspiWrite(_sspi_struct_t *conn, /* I - Client connection */
- void *buf, /* I - Buffer */
- size_t len) /* I - Buffer length */
-{
- SecBufferDesc message; /* Array of SecBuffer struct */
- SecBuffer buffers[4] = { 0 }; /* Security package buffer */
- BYTE *buffer = NULL; /* Scratch buffer */
- int bufferLen; /* Buffer length */
- size_t bytesLeft; /* Bytes left to write */
- int index = 0; /* Index into buffer */
- int num = 0; /* Return value */
-
- if (!conn || !buf || !len)
- {
- WSASetLastError(WSAEINVAL);
- num = SOCKET_ERROR;
- goto cleanup;
- }
-
- bufferLen = conn->streamSizes.cbMaximumMessage +
- conn->streamSizes.cbHeader +
- conn->streamSizes.cbTrailer;
-
- buffer = (BYTE*) malloc(bufferLen);
-
- if (!buffer)
- {
- DEBUG_printf(("_sspiWrite: buffer alloc of %d bytes failed", bufferLen));
- WSASetLastError(E_OUTOFMEMORY);
- num = SOCKET_ERROR;
- goto cleanup;
- }
-
- bytesLeft = len;
-
- while (bytesLeft)
- {
- size_t chunk = min(conn->streamSizes.cbMaximumMessage, /* Size of data to write */
- bytesLeft);
- SECURITY_STATUS scRet; /* SSPI status */
-
- /*
- * Copy user data into the buffer, starting
- * just past the header
- */
- memcpy(buffer + conn->streamSizes.cbHeader,
- ((BYTE*) buf) + index,
- chunk);
-
- /*
- * Setup the SSPI buffers
- */
- message.ulVersion = SECBUFFER_VERSION;
- message.cBuffers = 4;
- message.pBuffers = buffers;
- buffers[0].pvBuffer = buffer;
- buffers[0].cbBuffer = conn->streamSizes.cbHeader;
- buffers[0].BufferType = SECBUFFER_STREAM_HEADER;
- buffers[1].pvBuffer = buffer + conn->streamSizes.cbHeader;
- buffers[1].cbBuffer = (unsigned long) chunk;
- buffers[1].BufferType = SECBUFFER_DATA;
- buffers[2].pvBuffer = buffer + conn->streamSizes.cbHeader + chunk;
- buffers[2].cbBuffer = conn->streamSizes.cbTrailer;
- buffers[2].BufferType = SECBUFFER_STREAM_TRAILER;
- buffers[3].BufferType = SECBUFFER_EMPTY;
-
- /*
- * Encrypt the data
- */
- scRet = EncryptMessage(&conn->context, 0, &message, 0);
-
- if (FAILED(scRet))
- {
- DEBUG_printf(("_sspiWrite: EncryptMessage failed: %x", scRet));
- WSASetLastError(WSASYSCALLFAILURE);
- num = SOCKET_ERROR;
- goto cleanup;
- }
-
- /*
- * Send the data. Remember the size of
- * the total data to send is the size
- * of the header, the size of the data
- * the caller passed in and the size
- * of the trailer
- */
- num = send(conn->sock,
- buffer,
- buffers[0].cbBuffer + buffers[1].cbBuffer + buffers[2].cbBuffer,
- 0);
-
- if ((num == SOCKET_ERROR) || (num == 0))
- {
- DEBUG_printf(("_sspiWrite: send failed: %ld", WSAGetLastError()));
- goto cleanup;
- }
-
- bytesLeft -= (int) chunk;
- index += (int) chunk;
- }
-
- num = (int) len;
-
-cleanup:
-
- if (buffer)
- free(buffer);
-
- return (num);
-}
-
-
-/*
- * '_sspiRead()' - Read a buffer from an ssl socket
- */
-int /* O - Bytes read or SOCKET_ERROR */
-_sspiRead(_sspi_struct_t *conn, /* I - Client connection */
- void *buf, /* I - Buffer */
- size_t len) /* I - Buffer length */
-{
- SecBufferDesc message; /* Array of SecBuffer struct */
- SecBuffer buffers[4] = { 0 }; /* Security package buffer */
- int num = 0; /* Return value */
-
- if (!conn)
- {
- WSASetLastError(WSAEINVAL);
- num = SOCKET_ERROR;
- goto cleanup;
- }
-
- /*
- * If there are bytes that have already been
- * decrypted and have not yet been read, return
- * those
- */
- if (buf && (conn->readBufferUsed > 0))
- {
- int bytesToCopy = (int) min(conn->readBufferUsed, len); /* Amount of bytes to copy */
- /* from read buffer */
-
- memcpy(buf, conn->readBuffer, bytesToCopy);
- conn->readBufferUsed -= bytesToCopy;
-
- if (conn->readBufferUsed > 0)
- /*
- * If the caller didn't request all the bytes
- * we have in the buffer, then move the unread
- * bytes down
- */
- memmove(conn->readBuffer,
- conn->readBuffer + bytesToCopy,
- conn->readBufferUsed);
-
- num = bytesToCopy;
- }
- else
- {
- PSecBuffer pDataBuffer; /* Data buffer */
- PSecBuffer pExtraBuffer; /* Excess data buffer */
- SECURITY_STATUS scRet; /* SSPI status */
- int i; /* Loop control variable */
-
- /*
- * Initialize security buffer structs
- */
- message.ulVersion = SECBUFFER_VERSION;
- message.cBuffers = 4;
- message.pBuffers = buffers;
-
- do
- {
- /*
- * If there is not enough space in the
- * buffer, then increase it's size
- */
- if (conn->decryptBufferLength <= conn->decryptBufferUsed)
- {
- conn->decryptBufferLength += 4096;
- conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer,
- conn->decryptBufferLength);
-
- if (!conn->decryptBuffer)
- {
- DEBUG_printf(("_sspiRead: unable to allocate %d byte buffer",
- conn->decryptBufferLength));
- WSASetLastError(E_OUTOFMEMORY);
- num = SOCKET_ERROR;
- goto cleanup;
- }
- }
-
- buffers[0].pvBuffer = conn->decryptBuffer;
- buffers[0].cbBuffer = (unsigned long) conn->decryptBufferUsed;
- buffers[0].BufferType = SECBUFFER_DATA;
- buffers[1].BufferType = SECBUFFER_EMPTY;
- buffers[2].BufferType = SECBUFFER_EMPTY;
- buffers[3].BufferType = SECBUFFER_EMPTY;
-
- scRet = DecryptMessage(&conn->context, &message, 0, NULL);
-
- if (scRet == SEC_E_INCOMPLETE_MESSAGE)
- {
- if (buf)
- {
- num = recv(conn->sock,
- conn->decryptBuffer + conn->decryptBufferUsed,
- (int)(conn->decryptBufferLength - conn->decryptBufferUsed),
- 0);
- if (num == SOCKET_ERROR)
- {
- DEBUG_printf(("_sspiRead: recv failed: %d", WSAGetLastError()));
- goto cleanup;
- }
- else if (num == 0)
- {
- DEBUG_printf(("_sspiRead: server disconnected"));
- goto cleanup;
- }
-
- conn->decryptBufferUsed += num;
- }
- else
- {
- num = (int) conn->readBufferUsed;
- goto cleanup;
- }
- }
- }
- while (scRet == SEC_E_INCOMPLETE_MESSAGE);
-
- if (scRet == SEC_I_CONTEXT_EXPIRED)
- {
- DEBUG_printf(("_sspiRead: context expired"));
- WSASetLastError(WSAECONNRESET);
- num = SOCKET_ERROR;
- goto cleanup;
- }
- else if (scRet != SEC_E_OK)
- {
- DEBUG_printf(("_sspiRead: DecryptMessage failed: %lx", scRet));
- WSASetLastError(WSASYSCALLFAILURE);
- num = SOCKET_ERROR;
- goto cleanup;
- }
-
- /*
- * The decryption worked. Now, locate data buffer.
- */
- pDataBuffer = NULL;
- pExtraBuffer = NULL;
- for (i = 1; i < 4; i++)
- {
- if (buffers[i].BufferType == SECBUFFER_DATA)
- pDataBuffer = &buffers[i];
- else if (!pExtraBuffer && (buffers[i].BufferType == SECBUFFER_EXTRA))
- pExtraBuffer = &buffers[i];
- }
-
- /*
- * If a data buffer is found, then copy
- * the decrypted bytes to the passed-in
- * buffer
- */
- if (pDataBuffer)
- {
- int bytesToCopy = min(pDataBuffer->cbBuffer, (int) len);
- /* Number of bytes to copy into buf */
- int bytesToSave = pDataBuffer->cbBuffer - bytesToCopy;
- /* Number of bytes to save in our read buffer */
-
- if (bytesToCopy)
- memcpy(buf, pDataBuffer->pvBuffer, bytesToCopy);
-
- /*
- * If there are more decrypted bytes than can be
- * copied to the passed in buffer, then save them
- */
- if (bytesToSave)
- {
- if ((int)(conn->readBufferLength - conn->readBufferUsed) < bytesToSave)
- {
- conn->readBufferLength = conn->readBufferUsed + bytesToSave;
- conn->readBuffer = realloc(conn->readBuffer,
- conn->readBufferLength);
-
- if (!conn->readBuffer)
- {
- DEBUG_printf(("_sspiRead: unable to allocate %d bytes", conn->readBufferLength));
- WSASetLastError(E_OUTOFMEMORY);
- num = SOCKET_ERROR;
- goto cleanup;
- }
- }
-
- memcpy(((BYTE*) conn->readBuffer) + conn->readBufferUsed,
- ((BYTE*) pDataBuffer->pvBuffer) + bytesToCopy,
- bytesToSave);
-
- conn->readBufferUsed += bytesToSave;
- }
-
- num = (buf) ? bytesToCopy : (int) conn->readBufferUsed;
- }
- else
- {
- DEBUG_printf(("_sspiRead: unable to find data buffer"));
- WSASetLastError(WSASYSCALLFAILURE);
- num = SOCKET_ERROR;
- goto cleanup;
- }
-
- /*
- * If the decryption process left extra bytes,
- * then save those back in decryptBuffer. They will
- * be processed the next time through the loop.
- */
- if (pExtraBuffer)
- {
- memmove(conn->decryptBuffer, pExtraBuffer->pvBuffer, pExtraBuffer->cbBuffer);
- conn->decryptBufferUsed = pExtraBuffer->cbBuffer;
- }
- else
- {
- conn->decryptBufferUsed = 0;
- }
- }
-
-cleanup:
-
- return (num);
-}
-
-
-/*
- * '_sspiPending()' - Returns the number of available bytes
- */
-int /* O - Number of available bytes */
-_sspiPending(_sspi_struct_t *conn) /* I - Client connection */
-{
- return (_sspiRead(conn, NULL, 0));
-}
-
-
-/*
- * '_sspiFree()' - Close a connection and free resources
- */
-void
-_sspiFree(_sspi_struct_t *conn) /* I - Client connection */
-{
- if (!conn)
- return;
-
- if (conn->contextInitialized)
- {
- SecBufferDesc message; /* Array of SecBuffer struct */
- SecBuffer buffers[1] = { 0 };
- /* Security package buffer */
- DWORD dwType; /* Type */
- DWORD status; /* Status */
-
- /*
- * Notify schannel that we are about to close the connection.
- */
- dwType = SCHANNEL_SHUTDOWN;
-
- buffers[0].pvBuffer = &dwType;
- buffers[0].BufferType = SECBUFFER_TOKEN;
- buffers[0].cbBuffer = sizeof(dwType);
-
- message.cBuffers = 1;
- message.pBuffers = buffers;
- message.ulVersion = SECBUFFER_VERSION;
-
- status = ApplyControlToken(&conn->context, &message);
-
- if (SUCCEEDED(status))
- {
- PBYTE pbMessage; /* Message buffer */
- DWORD cbMessage; /* Message buffer count */
- DWORD cbData; /* Data count */
- DWORD dwSSPIFlags; /* SSL attributes we requested */
- DWORD dwSSPIOutFlags; /* SSL attributes we received */
- TimeStamp tsExpiry; /* Time stamp */
-
- dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT |
- ASC_REQ_REPLAY_DETECT |
- ASC_REQ_CONFIDENTIALITY |
- ASC_REQ_EXTENDED_ERROR |
- ASC_REQ_ALLOCATE_MEMORY |
- ASC_REQ_STREAM;
-
- buffers[0].pvBuffer = NULL;
- buffers[0].BufferType = SECBUFFER_TOKEN;
- buffers[0].cbBuffer = 0;
-
- message.cBuffers = 1;
- message.pBuffers = buffers;
- message.ulVersion = SECBUFFER_VERSION;
-
- status = AcceptSecurityContext(&conn->creds, &conn->context, NULL,
- dwSSPIFlags, SECURITY_NATIVE_DREP, NULL,
- &message, &dwSSPIOutFlags, &tsExpiry);
-
- if (SUCCEEDED(status))
- {
- pbMessage = buffers[0].pvBuffer;
- cbMessage = buffers[0].cbBuffer;
-
- /*
- * Send the close notify message to the client.
- */
- if (pbMessage && cbMessage)
- {
- cbData = send(conn->sock, pbMessage, cbMessage, 0);
- if ((cbData == SOCKET_ERROR) || (cbData == 0))
- {
- status = WSAGetLastError();
- DEBUG_printf(("_sspiFree: sending close notify failed: %d", status));
- }
- else
- {
- FreeContextBuffer(pbMessage);
- }
- }
- }
- else
- {
- DEBUG_printf(("_sspiFree: AcceptSecurityContext failed: %x", status));
- }
- }
- else
- {
- DEBUG_printf(("_sspiFree: ApplyControlToken failed: %x", status));
- }
-
- DeleteSecurityContext(&conn->context);
- conn->contextInitialized = FALSE;
- }
-
- if (conn->decryptBuffer)
- {
- free(conn->decryptBuffer);
- conn->decryptBuffer = NULL;
- }
-
- if (conn->readBuffer)
- {
- free(conn->readBuffer);
- conn->readBuffer = NULL;
- }
-
- if (conn->sock != INVALID_SOCKET)
- {
- closesocket(conn->sock);
- conn->sock = INVALID_SOCKET;
- }
-
- free(conn);
-}
-
-
-/*
- * 'sspi_verify_certificate()' - Verify a server certificate
- */
-static DWORD /* 0 - Error code (0 == No error) */
-sspi_verify_certificate(PCCERT_CONTEXT serverCert,
- /* I - Server certificate */
- const CHAR *serverName,
- /* I - Server name */
- DWORD dwCertFlags)
- /* I - Verification flags */
-{
- HTTPSPolicyCallbackData httpsPolicy;
- /* HTTPS Policy Struct */
- CERT_CHAIN_POLICY_PARA policyPara;
- /* Cert chain policy parameters */
- CERT_CHAIN_POLICY_STATUS policyStatus;
- /* Cert chain policy status */
- CERT_CHAIN_PARA chainPara;
- /* Used for searching and matching criteria */
- PCCERT_CHAIN_CONTEXT chainContext = NULL;
- /* Certificate chain */
- PWSTR serverNameUnicode = NULL;
- /* Unicode server name */
- LPSTR rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH,
- szOID_SERVER_GATED_CRYPTO,
- szOID_SGC_NETSCAPE };
- /* How are we using this certificate? */
- DWORD cUsages = sizeof(rgszUsages) / sizeof(LPSTR);
- /* Number of ites in rgszUsages */
- DWORD count; /* 32 bit count variable */
- DWORD status; /* Return value */
-
- if (!serverCert)
- {
- status = SEC_E_WRONG_PRINCIPAL;
- goto cleanup;
- }
-
- /*
- * Convert server name to unicode.
- */
- if (!serverName || (strlen(serverName) == 0))
- {
- status = SEC_E_WRONG_PRINCIPAL;
- goto cleanup;
- }
-
- count = MultiByteToWideChar(CP_ACP, 0, serverName, -1, NULL, 0);
- serverNameUnicode = LocalAlloc(LMEM_FIXED, count * sizeof(WCHAR));
- if (!serverNameUnicode)
- {
- status = SEC_E_INSUFFICIENT_MEMORY;
- goto cleanup;
- }
- count = MultiByteToWideChar(CP_ACP, 0, serverName, -1, serverNameUnicode, count);
- if (count == 0)
- {
- status = SEC_E_WRONG_PRINCIPAL;
- goto cleanup;
- }
-
- /*
- * Build certificate chain.
- */
- ZeroMemory(&chainPara, sizeof(chainPara));
- chainPara.cbSize = sizeof(chainPara);
- chainPara.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR;
- chainPara.RequestedUsage.Usage.cUsageIdentifier = cUsages;
- chainPara.RequestedUsage.Usage.rgpszUsageIdentifier = rgszUsages;
-
- if (!CertGetCertificateChain(NULL, serverCert, NULL, serverCert->hCertStore,
- &chainPara, 0, NULL, &chainContext))
- {
- status = GetLastError();
- DEBUG_printf(("CertGetCertificateChain returned 0x%x\n", status));
- goto cleanup;
- }
-
- /*
- * Validate certificate chain.
- */
- ZeroMemory(&httpsPolicy, sizeof(HTTPSPolicyCallbackData));
- httpsPolicy.cbStruct = sizeof(HTTPSPolicyCallbackData);
- httpsPolicy.dwAuthType = AUTHTYPE_SERVER;
- httpsPolicy.fdwChecks = dwCertFlags;
- httpsPolicy.pwszServerName = serverNameUnicode;
-
- memset(&policyPara, 0, sizeof(policyPara));
- policyPara.cbSize = sizeof(policyPara);
- policyPara.pvExtraPolicyPara = &httpsPolicy;
-
- memset(&policyStatus, 0, sizeof(policyStatus));
- policyStatus.cbSize = sizeof(policyStatus);
-
- if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, chainContext,
- &policyPara, &policyStatus))
- {
- status = GetLastError();
- DEBUG_printf(("CertVerifyCertificateChainPolicy returned %d", status));
- goto cleanup;
- }
-
- if (policyStatus.dwError)
- {
- status = policyStatus.dwError;
- goto cleanup;
- }
-
- status = SEC_E_OK;
-
-cleanup:
-
- if (chainContext)
- CertFreeCertificateChain(chainContext);
-
- if (serverNameUnicode)
- LocalFree(serverNameUnicode);
-
- return (status);
-}
-
-
-/*
- * End of "$Id: sspi.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/cups/string-private.h b/cups/string-private.h
index c0bded3..558db45 100644
--- a/cups/string-private.h
+++ b/cups/string-private.h
@@ -1,18 +1,18 @@
/*
- * "$Id: string-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: string-private.h 12928 2015-10-23 21:31:58Z msweet $"
*
- * Private string definitions for CUPS.
+ * Private string definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_STRING_PRIVATE_H_
@@ -28,6 +28,7 @@
# include <ctype.h>
# include <errno.h>
# include <locale.h>
+# include <time.h>
# include "config.h"
@@ -102,6 +103,12 @@ _cups_isalpha(int ch) /* I - Character to test */
}
_CUPS_INLINE int /* O - 1 on match, 0 otherwise */
+_cups_islower(int ch) /* I - Character to test */
+{
+ return (ch >= 'a' && ch <= 'z');
+}
+
+_CUPS_INLINE int /* O - 1 on match, 0 otherwise */
_cups_isspace(int ch) /* I - Character to test */
{
return (ch == ' ' || ch == '\f' || ch == '\n' || ch == '\r' || ch == '\t' ||
@@ -119,12 +126,20 @@ _cups_tolower(int ch) /* I - Character to convert */
{
return (_cups_isupper(ch) ? ch - 'A' + 'a' : ch);
}
+
+_CUPS_INLINE int /* O - Converted character */
+_cups_toupper(int ch) /* I - Character to convert */
+{
+ return (_cups_islower(ch) ? ch - 'a' + 'A' : ch);
+}
# else
extern int _cups_isalnum(int ch);
extern int _cups_isalpha(int ch);
+extern int _cups_islower(int ch);
extern int _cups_isspace(int ch);
extern int _cups_isupper(int ch);
extern int _cups_tolower(int ch);
+extern int _cups_toupper(int ch);
# endif /* _CUPS_INLINE */
@@ -132,6 +147,7 @@ extern int _cups_tolower(int ch);
* Prototypes...
*/
+extern ssize_t _cups_safe_vsnprintf(char *, size_t, const char *, va_list);
extern void _cups_strcpy(char *dst, const char *src);
# ifndef HAVE_STRDUP
@@ -186,6 +202,13 @@ extern double _cupsStrScand(const char *buf, char **bufptr,
/*
+ * Date function...
+ */
+
+extern char *_cupsStrDate(char *buf, size_t bufsize, time_t timeval);
+
+
+/*
* C++ magic...
*/
@@ -196,5 +219,5 @@ extern double _cupsStrScand(const char *buf, char **bufptr,
#endif /* !_CUPS_STRING_H_ */
/*
- * End of "$Id: string-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: string-private.h 12928 2015-10-23 21:31:58Z msweet $".
*/
diff --git a/cups/string.c b/cups/string.c
index 8575424..9f99494 100644
--- a/cups/string.c
+++ b/cups/string.c
@@ -1,35 +1,18 @@
/*
- * "$Id: string.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: string.c 11889 2014-05-22 13:54:15Z msweet $"
*
- * String functions for CUPS.
+ * String functions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsStrAlloc() - Allocate/reference a string.
- * _cupsStrFlush() - Flush the string pool.
- * _cupsStrFormatd() - Format a floating-point number.
- * _cupsStrFree() - Free/dereference a string.
- * _cupsStrRetain() - Increment the reference count of a string.
- * _cupsStrScand() - Scan a string for a floating-point number.
- * _cupsStrStatistics() - Return allocation statistics for string pool.
- * _cups_strcpy() - Copy a string allowing for overlapping strings.
- * _cups_strdup() - Duplicate a string.
- * _cups_strcasecmp() - Do a case-insensitive comparison.
- * _cups_strncasecmp() - Do a case-insensitive comparison on up to N chars.
- * _cups_strlcat() - Safely concatenate two strings.
- * _cups_strlcpy() - Safely copy two strings.
- * compare_sp_items() - Compare two string pool items...
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -37,10 +20,7 @@
*/
#define _CUPS_STRING_C_
-#include "string-private.h"
-#include "debug-private.h"
-#include "thread-private.h"
-#include "array.h"
+#include "cups-private.h"
#include <stddef.h>
#include <limits.h>
@@ -69,6 +49,7 @@ static int compare_sp_items(_cups_sp_item_t *a, _cups_sp_item_t *b);
char * /* O - String pointer */
_cupsStrAlloc(const char *s) /* I - String */
{
+ size_t slen; /* Length of string */
_cups_sp_item_t *item, /* String pool item */
*key; /* Search key */
@@ -128,7 +109,8 @@ _cupsStrAlloc(const char *s) /* I - String */
* Not found, so allocate a new one...
*/
- item = (_cups_sp_item_t *)calloc(1, sizeof(_cups_sp_item_t) + strlen(s));
+ slen = strlen(s);
+ item = (_cups_sp_item_t *)calloc(1, sizeof(_cups_sp_item_t) + slen);
if (!item)
{
_cupsMutexUnlock(&sp_mutex);
@@ -137,7 +119,7 @@ _cupsStrAlloc(const char *s) /* I - String */
}
item->ref_count = 1;
- strcpy(item->str, s);
+ memcpy(item->str, s, slen + 1);
#ifdef DEBUG_GUARDS
item->guard = _CUPS_STR_GUARD;
@@ -160,6 +142,39 @@ _cupsStrAlloc(const char *s) /* I - String */
/*
+ * '_cupsStrDate()' - Return a localized date for a given time value.
+ *
+ * This function works around the locale encoding issues of strftime...
+ */
+
+char * /* O - Buffer */
+_cupsStrDate(char *buf, /* I - Buffer */
+ size_t bufsize, /* I - Size of buffer */
+ time_t timeval) /* I - Time value */
+{
+ struct tm *dateval; /* Local date/time */
+ char temp[1024]; /* Temporary buffer */
+ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread globals */
+
+
+ if (!cg->lang_default)
+ cg->lang_default = cupsLangDefault();
+
+ dateval = localtime(&timeval);
+
+ if (cg->lang_default->encoding != CUPS_UTF8)
+ {
+ strftime(temp, sizeof(temp), "%c", dateval);
+ cupsCharsetToUTF8((cups_utf8_t *)buf, temp, (int)bufsize, cg->lang_default->encoding);
+ }
+ else
+ strftime(buf, bufsize, "%c", dateval);
+
+ return (buf);
+}
+
+
+/*
* '_cupsStrFlush()' - Flush the string pool.
*/
@@ -258,7 +273,7 @@ _cupsStrFormatd(char *buf, /* I - String */
}
else
{
- strlcpy(buf, temp, bufend - buf + 1);
+ strlcpy(buf, temp, (size_t)(bufend - buf + 1));
bufptr = buf + strlen(buf);
}
@@ -434,7 +449,7 @@ _cupsStrScand(const char *buf, /* I - Pointer to number */
if (loc && loc->decimal_point)
{
- strlcpy(tempptr, loc->decimal_point, sizeof(temp) - (tempptr - temp));
+ strlcpy(tempptr, loc->decimal_point, sizeof(temp) - (size_t)(tempptr - temp));
tempptr += strlen(tempptr);
}
else if (tempptr < (temp + sizeof(temp) - 1))
@@ -544,7 +559,7 @@ _cupsStrStatistics(size_t *alloc_bytes, /* O - Allocated bytes */
*/
count += item->ref_count;
- len = (strlen(item->str) + 8) & ~7;
+ len = (strlen(item->str) + 8) & (size_t)~7;
abytes += sizeof(_cups_sp_item_t) + len;
tbytes += item->ref_count * len;
}
@@ -588,16 +603,18 @@ _cups_strcpy(char *dst, /* I - Destination string */
char * /* O - New string pointer */
_cups_strdup(const char *s) /* I - String to duplicate */
{
- char *t; /* New string pointer */
+ char *t; /* New string pointer */
+ size_t slen; /* Length of string */
- if (s == NULL)
+ if (!s)
return (NULL);
- if ((t = malloc(strlen(s) + 1)) == NULL)
+ slen = strlen(s);
+ if ((t = malloc(slen + 1)) == NULL)
return (NULL);
- return (strcpy(t, s));
+ return (memcpy(t, s, slen + 1));
}
#endif /* !HAVE_STRDUP */
@@ -698,7 +715,7 @@ _cups_strlcat(char *dst, /* O - Destination string */
if (srclen > size)
srclen = size;
- memcpy(dst + dstlen, src, srclen);
+ memmove(dst + dstlen, src, srclen);
dst[dstlen + srclen] = '\0';
return (dstlen + srclen);
@@ -734,7 +751,7 @@ _cups_strlcpy(char *dst, /* O - Destination string */
if (srclen > size)
srclen = size;
- memcpy(dst, src, srclen);
+ memmove(dst, src, srclen);
dst[srclen] = '\0';
return (srclen);
@@ -755,5 +772,5 @@ compare_sp_items(_cups_sp_item_t *a, /* I - First item */
/*
- * End of "$Id: string.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: string.c 11889 2014-05-22 13:54:15Z msweet $".
*/
diff --git a/cups/tempfile.c b/cups/tempfile.c
index e992f40..72eb963 100644
--- a/cups/tempfile.c
+++ b/cups/tempfile.c
@@ -1,24 +1,18 @@
/*
- * "$Id: tempfile.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: tempfile.c 12073 2014-07-31 00:58:00Z msweet $"
*
- * Temp file utilities for CUPS.
+ * Temp file utilities for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsTempFd() - Creates a temporary file.
- * cupsTempFile() - Generates a temporary filename.
- * cupsTempFile2() - Creates a temporary CUPS file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -103,8 +97,7 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
* Format a string using the hex time values...
*/
- snprintf(filename, len - 1, "%s/%05lx%08lx", tmpdir,
- GetCurrentProcessId(), curtime);
+ snprintf(filename, (size_t)len - 1, "%s/%05lx%08lx", tmpdir, GetCurrentProcessId(), curtime);
#else
/*
* Get the current time of day...
@@ -116,8 +109,7 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
* Format a string using the hex time values...
*/
- snprintf(filename, len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(),
- (unsigned)(curtime.tv_sec + curtime.tv_usec + tries));
+ snprintf(filename, (size_t)len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(), (unsigned)(curtime.tv_sec + curtime.tv_usec + tries));
#endif /* WIN32 */
/*
@@ -153,8 +145,8 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
* 'cupsTempFile()' - Generates a temporary filename.
*
* The temporary filename is returned in the filename buffer.
- * This function is deprecated - use @link cupsTempFd@ or
- * @link cupsTempFile2@ instead.
+ * This function is deprecated and will no longer generate a temporary
+ * filename - use @link cupsTempFd@ or @link cupsTempFile2@ instead.
*
* @deprecated@
*/
@@ -163,38 +155,12 @@ char * /* O - Filename or @code NULL@ on error */
cupsTempFile(char *filename, /* I - Pointer to buffer */
int len) /* I - Size of buffer */
{
- int fd; /* File descriptor for temp file */
- _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
-
-
- /*
- * See if a filename was specified...
- */
-
- if (filename == NULL)
- {
- filename = cg->tempfile;
- len = sizeof(cg->tempfile);
- }
-
- /*
- * Create the temporary file...
- */
-
- if ((fd = cupsTempFd(filename, len)) < 0)
- return (NULL);
+ (void)len;
- /*
- * Close the temp file - it'll be reopened later as needed...
- */
-
- close(fd);
-
- /*
- * Return the temp filename...
- */
+ if (filename)
+ *filename = '\0';
- return (filename);
+ return (NULL);
}
@@ -229,5 +195,5 @@ cupsTempFile2(char *filename, /* I - Pointer to buffer */
/*
- * End of "$Id: tempfile.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: tempfile.c 12073 2014-07-31 00:58:00Z msweet $".
*/
diff --git a/cups/test.ppd b/cups/test.ppd
index fc453a6..1f64fe5 100644
--- a/cups/test.ppd
+++ b/cups/test.ppd
@@ -14,7 +14,7 @@
*%
*% Copyright 2007-2010 by Apple Inc.
*% Copyright 2002-2006 by Easy Software Products.
-*%
+*%
*% These coded instructions, statements, and computer programs are the
*% property of Apple Inc. and are protected by Federal copyright
*% law. Distribution and use rights are outlined in the file "LICENSE.txt"
@@ -22,7 +22,7 @@
*% file is missing or damaged, see the license at "http://www.cups.org/".
*FormatVersion: "4.3"
*FileVersion: "1.3"
-*LanguageVersion: English
+*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*PCFileName: "TEST.PPD"
*Manufacturer: "ESP"
@@ -104,7 +104,7 @@
*fr_CA.PageRegion A4/French Canadian A4: ""
*fr_CA.PageRegion Env10/French Canadian #10 Envelope: ""
-*DefaultImageableArea: Letter
+*DefaultImageableArea: Letter
*ImageableArea Letter: "18 36 594 756"
*ImageableArea Letter.Banner: "18 0 594 792"
*ImageableArea Letter.Fullbleed: "0 0 612 792"
@@ -145,6 +145,15 @@
*MediaType Transparency/Transparency Film: "MediaType=Transparency"
*CloseUI: *MediaType
+*OpenUI *OutputBin/Output Tray: PickOne
+*OrderDependency: 25 AnySetup *OutputBin
+*DefaultOutputBin: Tray1
+*OutputBin Auto/Automatic Tray: "OutputBin=Auto"
+*OutputBin Tray1/Tray 1: "OutputBin=Tray1"
+*OutputBin Tray2/Tray 2: "OutputBin=Tray2"
+*OutputBin MainTray/Main Tray: "OutputBin=MainTray"
+*CloseUI: *OutputBin
+
*OpenUI *Duplex/2-Sided Printing: PickOne
*OrderDependency: 10 DocumentSetup *Duplex
*DefaultDuplex: None
diff --git a/cups/testadmin.c b/cups/testadmin.c
index fac7528..04b02f1 100644
--- a/cups/testadmin.c
+++ b/cups/testadmin.c
@@ -1,9 +1,9 @@
/*
- * "$Id: testadmin.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testadmin.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Admin function test program for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -53,7 +53,8 @@ main(int argc, /* I - Number of command-line args */
* Connect to the server using the defaults...
*/
- http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
+ cupsEncryption(), 1, 30000, NULL);
/*
* Set the current configuration if we have anything on the command-line...
@@ -116,5 +117,5 @@ show_settings(
/*
- * End of "$Id: testadmin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testadmin.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/cups/testarray.c b/cups/testarray.c
index a73da61..7003331 100644
--- a/cups/testarray.c
+++ b/cups/testarray.c
@@ -1,24 +1,18 @@
/*
- * "$Id: testarray.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testarray.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Array test program for CUPS.
+ * Array test program for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
- * get_seconds() - Get the current time in seconds...
- * load_words() - Load words from a file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -27,7 +21,7 @@
#include "string-private.h"
#include "debug-private.h"
-#include "array.h"
+#include "array-private.h"
#include "dir.h"
@@ -44,8 +38,7 @@ static int load_words(const char *filename, cups_array_t *array);
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
int i; /* Looping var */
cups_array_t *array, /* Test array */
@@ -139,7 +132,7 @@ main(int argc, /* I - Number of command-line arguments */
/*
* cupsArrayCount()
*/
-
+
fputs("cupsArrayCount: ", stdout);
if (cupsArrayCount(array) == 4)
puts("PASS");
@@ -296,7 +289,7 @@ main(int argc, /* I - Number of command-line arguments */
{
while ((dent = cupsDirRead(dir)) != NULL)
{
- i = strlen(dent->filename) - 2;
+ i = (int)strlen(dent->filename) - 2;
if (i > 0 && dent->filename[i] == '.' &&
(dent->filename[i + 1] == 'c' ||
@@ -319,7 +312,7 @@ main(int argc, /* I - Number of command-line arguments */
* the same buffer in the first place... :)
*/
- strcpy(word, text);
+ strlcpy(word, text, sizeof(word));
/*
* Grab the next word and compare...
@@ -405,6 +398,88 @@ main(int argc, /* I - Number of command-line arguments */
cupsArrayDelete(dup_array);
/*
+ * Test the array with string functions...
+ */
+
+ fputs("_cupsArrayNewStrings(\" \\t\\nfoo bar\\tboo\\nfar\", ' '): ", stdout);
+ array = _cupsArrayNewStrings(" \t\nfoo bar\tboo\nfar", ' ');
+ if (!array)
+ {
+ status = 1;
+ puts("FAIL (unable to create array)");
+ }
+ else if (cupsArrayCount(array) != 4)
+ {
+ status = 1;
+ printf("FAIL (got %d elements, expected 4)\n", cupsArrayCount(array));
+ }
+ else if (strcmp(text = (char *)cupsArrayFirst(array), "bar"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"bar\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "boo"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"boo\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "far"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"far\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "foo"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"foo\")\n", text);
+ }
+ else
+ puts("PASS");
+
+ fputs("_cupsArrayAddStrings(array, \"foo2,bar2\", ','): ", stdout);
+ _cupsArrayAddStrings(array, "foo2,bar2", ',');
+
+ if (cupsArrayCount(array) != 6)
+ {
+ status = 1;
+ printf("FAIL (got %d elements, expected 6)\n", cupsArrayCount(array));
+ }
+ else if (strcmp(text = (char *)cupsArrayFirst(array), "bar"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"bar\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "bar2"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"bar2\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "boo"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"boo\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "far"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"far\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "foo"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"foo\")\n", text);
+ }
+ else if (strcmp(text = (char *)cupsArrayNext(array), "foo2"))
+ {
+ status = 1;
+ printf("FAIL (first element \"%s\", expected \"foo2\")\n", text);
+ }
+ else
+ puts("PASS");
+
+ cupsArrayDelete(array);
+
+ /*
* Summarize the results and return...
*/
@@ -476,5 +551,5 @@ load_words(const char *filename, /* I - File to load */
/*
- * End of "$Id: testarray.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testarray.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/testcache.c b/cups/testcache.c
new file mode 100644
index 0000000..0051f81
--- /dev/null
+++ b/cups/testcache.c
@@ -0,0 +1,98 @@
+/*
+ * "$Id: testcache.c 11832 2014-04-24 15:04:00Z msweet $"
+ *
+ * PPD cache testing program for CUPS.
+ *
+ * Copyright 2009-2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "ppd-private.h"
+#include "file-private.h"
+
+
+/*
+ * 'main()' - Main entry.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line args */
+ char *argv[]) /* I - Command-line arguments */
+{
+ int i; /* Looping var */
+ const char *ppdfile = NULL;/* PPD filename */
+ ppd_file_t *ppd; /* PPD file */
+ int num_options = 0;/* Number of options */
+ cups_option_t *options = NULL;/* Options */
+ _ppd_cache_t *pc; /* PPD cache and PWG mapping data */
+ int num_finishings, /* Number of finishing options */
+ finishings[20]; /* Finishing options */
+ ppd_choice_t *ppd_bin; /* OutputBin value */
+ const char *output_bin; /* output-bin value */
+
+ if (argc < 2)
+ {
+ puts("Usage: ./testcache filename.ppd [name=value ... name=value]");
+ return (1);
+ }
+
+ ppdfile = argv[1];
+ if ((ppd = ppdOpenFile(ppdfile)) == NULL)
+ {
+ ppd_status_t err; /* Last error in file */
+ int line; /* Line number in file */
+
+
+ err = ppdLastError(&line);
+
+ fprintf(stderr, "Unable to open \"%s\": %s on line %d\n", ppdfile, ppdErrorString(err), line);
+ return (1);
+ }
+
+ if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL)
+ {
+ fprintf(stderr, "Unable to create PPD cache from \"%s\".\n", ppdfile);
+ return (1);
+ }
+
+ for (i = 2; i < argc; i ++)
+ num_options = cupsParseOptions(argv[i], num_options, &options);
+
+ ppdMarkDefaults(ppd);
+ cupsMarkOptions(ppd, num_options, options);
+
+ num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options, (int)sizeof(finishings) / sizeof(finishings[0]), finishings);
+
+ if (num_finishings > 0)
+ {
+ fputs("finishings=", stdout);
+ for (i = 0; i < num_finishings; i ++)
+ if (i)
+ printf(",%d", finishings[i]);
+ else
+ printf("%d", finishings[i]);
+ fputs("\n", stdout);
+ }
+
+ if ((ppd_bin = ppdFindMarkedChoice(ppd, "OutputBin")) != NULL &&
+ (output_bin = _ppdCacheGetBin(pc, ppd_bin->choice)) != NULL)
+ printf("output-bin=\"%s\"\n", output_bin);
+
+ return (0);
+}
+
+
+/*
+ * End of "$Id: testcache.c 11832 2014-04-24 15:04:00Z msweet $".
+ */
diff --git a/cups/testconflicts.c b/cups/testconflicts.c
index 9b21356..0ccca82 100644
--- a/cups/testconflicts.c
+++ b/cups/testconflicts.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testconflicts.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testconflicts.c 3755 2012-03-30 05:59:14Z msweet $"
*
* PPD constraint test program for CUPS.
*
@@ -134,5 +134,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: testconflicts.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testconflicts.c 3755 2012-03-30 05:59:14Z msweet $".
*/
diff --git a/cups/testcups.c b/cups/testcups.c
index e151f4a..690d937 100644
--- a/cups/testcups.c
+++ b/cups/testcups.c
@@ -1,29 +1,25 @@
/*
- * "$Id: testcups.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testcups.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * CUPS API test program for CUPS.
+ * CUPS API test program for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
- * dests_equal() - Determine whether two destinations are equal.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
* Include necessary headers...
*/
+#undef _CUPS_NO_DEPRECATED
#include "string-private.h"
#include "cups.h"
#include "ppd.h"
@@ -170,10 +166,27 @@ main(int argc, /* I - Number of command-line arguments */
else
puts("No password entered.");
}
+ else if (!strcmp(argv[1], "ppd") && argc == 3)
+ {
+ /*
+ * ./testcups ppd printer
+ */
+
+ http_status_t http_status; /* Status */
+ char buffer[1024]; /* PPD filename */
+ time_t modtime = 0; /* Last modified */
+
+ if ((http_status = cupsGetPPD3(CUPS_HTTP_DEFAULT, argv[2], &modtime,
+ buffer, sizeof(buffer))) != HTTP_STATUS_OK)
+ printf("Unable to get PPD: %d (%s)\n", (int)http_status,
+ cupsLastErrorString());
+ else
+ puts(buffer);
+ }
else if (!strcmp(argv[1], "print") && argc == 5)
{
/*
- * ./testcups printer file interval
+ * ./testcups print printer file interval
*/
int interval, /* Interval between writes */
@@ -199,7 +212,7 @@ main(int argc, /* I - Number of command-line arguments */
interval = atoi(argv[4]);
if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2],
- CUPS_FORMAT_AUTO, 1) != HTTP_CONTINUE)
+ CUPS_FORMAT_AUTO, 1) != HTTP_STATUS_CONTINUE)
{
puts("Unable to start document!");
return (1);
@@ -209,20 +222,20 @@ main(int argc, /* I - Number of command-line arguments */
{
printf("Writing %d bytes...\n", (int)bytes);
- if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer,
- bytes) != HTTP_CONTINUE)
+ if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE)
{
puts("Unable to write bytes!");
return (1);
}
if (interval > 0)
- sleep(interval);
+ sleep((unsigned)interval);
}
cupsFileClose(fp);
- if (cupsFinishDocument(CUPS_HTTP_DEFAULT, argv[1]) > IPP_OK_SUBST)
+ if (cupsFinishDocument(CUPS_HTTP_DEFAULT,
+ argv[1]) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
{
puts("Unable to finish document!");
return (1);
@@ -244,6 +257,10 @@ main(int argc, /* I - Number of command-line arguments */
puts("");
puts(" ./testcups password");
puts("");
+ puts("Get the PPD file:");
+ puts("");
+ puts(" ./testcups ppd printer");
+ puts("");
puts("Print a file (interval controls delay between buffers in seconds):");
puts("");
puts(" ./testcups print printer file interval");
@@ -509,6 +526,8 @@ enum_cb(void *user_data, /* I - User data (unused) */
cups_option_t *option; /* Current option */
+ (void)user_data;
+
if (flags & CUPS_DEST_FLAGS_REMOVED)
printf("Removed '%s':\n", dest->name);
else
@@ -566,5 +585,5 @@ show_diffs(cups_dest_t *a, /* I - First destination */
/*
- * End of "$Id: testcups.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testcups.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/testdest.c b/cups/testdest.c
new file mode 100644
index 0000000..c760719
--- /dev/null
+++ b/cups/testdest.c
@@ -0,0 +1,460 @@
+/*
+ * "$Id: testdest.c 11884 2014-05-16 21:54:22Z msweet $"
+ *
+ * CUPS destination API test program for CUPS.
+ *
+ * Copyright 2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include "cups.h"
+
+
+/*
+ * Local functions...
+ */
+
+static void localize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
+static void print_file(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *filename, int num_options, cups_option_t *options);
+static void show_conflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int num_options, cups_option_t *options);
+static void show_default(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);
+static void show_media(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, const char *name);
+static void show_supported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
+static void usage(const char *arg) __attribute__((noreturn));
+
+
+/*
+ * 'main()' - Main entry.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line arguments */
+ char *argv[]) /* I - Command-line arguments */
+{
+ http_t *http; /* Connection to destination */
+ cups_dest_t *dest = NULL; /* Destination */
+ cups_dinfo_t *dinfo; /* Destination info */
+
+
+ if (argc < 2)
+ usage(NULL);
+
+ if (!strcmp(argv[1], "--enum"))
+ {
+ return (0);
+ }
+ else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7))
+ dest = cupsGetDestWithURI(NULL, argv[1]);
+ else
+ dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[1], NULL);
+
+ if (!dest)
+ {
+ printf("testdest: Unable to get destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+ return (1);
+ }
+
+ if ((http = cupsConnectDest(dest, CUPS_DEST_FLAGS_NONE, 30000, NULL, NULL, 0, NULL, NULL)) == NULL)
+ {
+ printf("testdest: Unable to connect to destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+ return (1);
+ }
+
+ if ((dinfo = cupsCopyDestInfo(http, dest)) == NULL)
+ {
+ printf("testdest: Unable to get information for destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+ return (1);
+ }
+
+ if (argc == 2 || (!strcmp(argv[2], "supported") && argc < 6))
+ {
+ if (argc > 3)
+ show_supported(http, dest, dinfo, argv[3], argv[4]);
+ else if (argc > 2)
+ show_supported(http, dest, dinfo, argv[3], NULL);
+ else
+ show_supported(http, dest, dinfo, NULL, NULL);
+ }
+ else if (!strcmp(argv[2], "conflicts") && argc > 3)
+ {
+ int i, /* Looping var */
+ num_options = 0;/* Number of options */
+ cups_option_t *options = NULL;/* Options */
+
+ for (i = 3; i < argc; i ++)
+ num_options = cupsParseOptions(argv[i], num_options, &options);
+
+ show_conflicts(http, dest, dinfo, num_options, options);
+ }
+ else if (!strcmp(argv[2], "default") && argc == 4)
+ {
+ show_default(http, dest, dinfo, argv[3]);
+ }
+ else if (!strcmp(argv[2], "localize") && argc > 3 && argc < 6)
+ {
+ localize(http, dest, dinfo, argv[3], argv[4]);
+ }
+ else if (!strcmp(argv[2], "media"))
+ {
+ int i; /* Looping var */
+ const char *name = NULL; /* Media name, if any */
+ unsigned flags = CUPS_MEDIA_FLAGS_DEFAULT;
+ /* Media selection flags */
+
+ for (i = 3; i < argc; i ++)
+ {
+ if (!strcmp(argv[i], "borderless"))
+ flags = CUPS_MEDIA_FLAGS_BORDERLESS;
+ else if (!strcmp(argv[i], "duplex"))
+ flags = CUPS_MEDIA_FLAGS_DUPLEX;
+ else if (!strcmp(argv[i], "exact"))
+ flags = CUPS_MEDIA_FLAGS_EXACT;
+ else if (!strcmp(argv[i], "ready"))
+ flags = CUPS_MEDIA_FLAGS_READY;
+ else if (name)
+ usage(argv[i]);
+ else
+ name = argv[i];
+ }
+
+ show_media(http, dest, dinfo, flags, name);
+ }
+ else if (!strcmp(argv[2], "print") && argc > 3)
+ {
+ int i, /* Looping var */
+ num_options = 0;/* Number of options */
+ cups_option_t *options = NULL;/* Options */
+
+ for (i = 4; i < argc; i ++)
+ num_options = cupsParseOptions(argv[i], num_options, &options);
+
+ print_file(http, dest, dinfo, argv[3], num_options, options);
+ }
+ else
+ usage(argv[2]);
+
+ return (0);
+}
+
+
+/*
+ * 'localize()' - Localize an option and value.
+ */
+
+static void
+localize(http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option, /* I - Option */
+ const char *value) /* I - Value, if any */
+{
+ (void)http;
+ (void)dest;
+ (void)dinfo;
+ (void)option;
+ (void)value;
+}
+
+
+/*
+ * 'print_file()' - Print a file.
+ */
+
+static void
+print_file(http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *filename, /* I - File to print */
+ int num_options, /* I - Number of options */
+ cups_option_t *options) /* I - Options */
+{
+ (void)http;
+ (void)dest;
+ (void)dinfo;
+ (void)filename;
+ (void)num_options;
+ (void)options;
+}
+
+
+/*
+ * 'show_conflicts()' - Show conflicts for selected options.
+ */
+
+static void
+show_conflicts(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ int num_options, /* I - Number of options */
+ cups_option_t *options) /* I - Options */
+{
+ (void)http;
+ (void)dest;
+ (void)dinfo;
+ (void)num_options;
+ (void)options;
+}
+
+
+/*
+ * 'show_default()' - Show default value for option.
+ */
+
+static void
+show_default(http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option) /* I - Option */
+{
+ (void)http;
+ (void)dest;
+ (void)dinfo;
+ (void)option;
+}
+
+
+/*
+ * 'show_media()' - Show available media.
+ */
+
+static void
+show_media(http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ unsigned flags, /* I - Media flags */
+ const char *name) /* I - Size name */
+{
+ int i, /* Looping var */
+ count; /* Number of sizes */
+ cups_size_t size; /* Media size info */
+
+
+ if (name)
+ {
+ double dw, dl; /* Width and length from name */
+ char units[32]; /* Units */
+ int width, /* Width in 100ths of millimeters */
+ length; /* Length in 100ths of millimeters */
+
+
+ if (sscanf(name, "%lfx%lf%31s", &dw, &dl, units) == 3)
+ {
+ if (!strcmp(units, "in"))
+ {
+ width = (int)(dw * 2540.0);
+ length = (int)(dl * 2540.0);
+ }
+ else if (!strcmp(units, "mm"))
+ {
+ width = (int)(dw * 100.0);
+ length = (int)(dl * 100.0);
+ }
+ else
+ {
+ puts(" bad units in size");
+ return;
+ }
+
+ if (cupsGetDestMediaBySize(http, dest, dinfo, width, length, flags, &size))
+ {
+ printf(" %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
+ }
+ else
+ {
+ puts(" not supported");
+ }
+ }
+ else if (cupsGetDestMediaByName(http, dest, dinfo, name, flags, &size))
+ {
+ printf(" %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
+ }
+ else
+ {
+ puts(" not supported");
+ }
+ }
+ else
+ {
+ count = cupsGetDestMediaCount(http, dest, dinfo, flags);
+ printf("%d size%s:\n", count, count == 1 ? "" : "s");
+
+ for (i = 0; i < count; i ++)
+ {
+ if (cupsGetDestMediaByIndex(http, dest, dinfo, i, flags, &size))
+ printf(" %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
+ else
+ puts(" error");
+ }
+ }
+}
+
+
+/*
+ * 'show_supported()' - Show supported options, values, etc.
+ */
+
+static void
+show_supported(http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option, /* I - Option, if any */
+ const char *value) /* I - Value, if any */
+{
+ ipp_attribute_t *attr; /* Attribute */
+ int i, /* Looping var */
+ count; /* Number of values */
+
+
+ if (!option)
+ {
+ attr = cupsFindDestSupported(http, dest, dinfo, "job-creation-attributes");
+ if (attr)
+ {
+ count = ippGetCount(attr);
+ for (i = 0; i < count; i ++)
+ show_supported(http, dest, dinfo, ippGetString(attr, i, NULL), NULL);
+ }
+ else
+ {
+ static const char * const options[] =
+ { /* List of standard options */
+ CUPS_COPIES,
+ CUPS_FINISHINGS,
+ CUPS_MEDIA,
+ CUPS_NUMBER_UP,
+ CUPS_ORIENTATION,
+ CUPS_PRINT_COLOR_MODE,
+ CUPS_PRINT_QUALITY,
+ CUPS_SIDES
+ };
+
+ puts("No job-creation-attributes-supported attribute, probing instead.");
+
+ for (i = 0; i < (int)(sizeof(options) / sizeof(options[0])); i ++)
+ if (cupsCheckDestSupported(http, dest, dinfo, options[i], NULL))
+ show_supported(http, dest, dinfo, options[i], NULL);
+ }
+ }
+ else if (!value)
+ {
+ puts(option);
+ if ((attr = cupsFindDestSupported(http, dest, dinfo, option)) != NULL)
+ {
+ count = ippGetCount(attr);
+
+ switch (ippGetValueTag(attr))
+ {
+ case IPP_TAG_INTEGER :
+ for (i = 0; i < count; i ++)
+ printf(" %d\n", ippGetInteger(attr, i));
+ break;
+
+ case IPP_TAG_ENUM :
+ for (i = 0; i < count; i ++)
+ printf(" %s\n", ippEnumString(option, ippGetInteger(attr, i)));
+ break;
+
+ case IPP_TAG_RANGE :
+ for (i = 0; i < count; i ++)
+ {
+ int upper, lower = ippGetRange(attr, i, &upper);
+
+ printf(" %d-%d\n", lower, upper);
+ }
+ break;
+
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_NAMELANG :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ for (i = 0; i < count; i ++)
+ printf(" %s\n", ippGetString(attr, i, NULL));
+ break;
+
+ case IPP_TAG_STRING :
+ for (i = 0; i < count; i ++)
+ {
+ int j, len;
+ unsigned char *data = ippGetOctetString(attr, i, &len);
+
+ fputs(" ", stdout);
+ for (j = 0; j < len; j ++)
+ {
+ if (data[j] < ' ' || data[j] >= 0x7f)
+ printf("<%02X>", data[j]);
+ else
+ putchar(data[j]);
+ }
+ putchar('\n');
+ }
+ break;
+
+ case IPP_TAG_BOOLEAN :
+ break;
+
+ default :
+ printf(" %s\n", ippTagString(ippGetValueTag(attr)));
+ break;
+ }
+ }
+
+ }
+ else if (cupsCheckDestSupported(http, dest, dinfo, option, value))
+ puts("YES");
+ else
+ puts("NO");
+
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(const char *arg) /* I - Argument for usage message */
+{
+ if (arg)
+ printf("testdest: Unknown option \"%s\".\n", arg);
+
+ puts("Usage:");
+ puts(" ./testdest name [operation ...]");
+ puts(" ./testdest ipp://... [operation ...]");
+ puts(" ./testdest ipps://... [operation ...]");
+ puts(" ./testdest --enum [grayscale] [color] [duplex] [staple] [small]\n"
+ " [medium] [large]");
+ puts("");
+ puts("Operations:");
+ puts(" conflicts options");
+ puts(" default option");
+ puts(" localize option [value]");
+ puts(" media [borderless] [duplex] [exact] [ready] [name or size]");
+ puts(" print filename [options]");
+ puts(" supported [option [value]]");
+
+ exit(arg != NULL);
+}
+
+
+/*
+ * End of "$Id: testdest.c 11884 2014-05-16 21:54:22Z msweet $".
+ */
diff --git a/cups/testfile.c b/cups/testfile.c
index 207e410..61db080 100644
--- a/cups/testfile.c
+++ b/cups/testfile.c
@@ -1,25 +1,18 @@
/*
- * "$Id: testfile.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testfile.c 12577 2015-03-30 19:07:17Z msweet $"
*
- * File test program for CUPS.
+ * File test program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
- * count_lines() - Count the number of lines in a file.
- * random_tests() - Do random access tests.
- * read_write_tests() - Perform read/write tests.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -212,14 +205,14 @@ main(int argc, /* I - Number of command-line arguments */
* Cat the filename on the command-line...
*/
- char line[1024]; /* Line from file */
+ char line[8192]; /* Line from file */
if ((fp = cupsFileOpen(argv[1], "r")) == NULL)
{
perror(argv[1]);
status = 1;
}
- else
+ else if (argc == 2)
{
status = 0;
@@ -231,6 +224,21 @@ main(int argc, /* I - Number of command-line arguments */
cupsFileClose(fp);
}
+ else
+ {
+ status = 0;
+ ssize_t bytes;
+
+ while ((bytes = cupsFileRead(fp, line, sizeof(line))) > 0)
+ printf("%s: %d bytes\n", argv[1], (int)bytes);
+
+ if (cupsFileEOF(fp))
+ printf("%s: EOF\n", argv[1]);
+ else
+ perror(argv[1]);
+
+ cupsFileClose(fp);
+ }
}
return (status);
@@ -266,8 +274,8 @@ random_tests(void)
count, /* Number of records read */
record, /* Current record */
num_records; /* Number of records */
- ssize_t pos, /* Position in file */
- expected; /* Expected position in file */
+ off_t pos; /* Position in file */
+ ssize_t expected; /* Expected position in file */
cups_file_t *fp; /* File */
char buffer[512]; /* Data buffer */
@@ -298,10 +306,10 @@ random_tests(void)
* cupsFileTell()
*/
- expected = 256 * sizeof(buffer) * pass;
+ expected = 256 * (ssize_t)sizeof(buffer) * pass;
fputs("cupsFileTell(): ", stdout);
- if ((pos = cupsFileTell(fp)) != expected)
+ if ((pos = cupsFileTell(fp)) != (off_t)expected)
{
printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
CUPS_LLCAST pos, CUPS_LLCAST expected);
@@ -319,7 +327,7 @@ random_tests(void)
for (record = 0; record < 256; record ++)
{
memset(buffer, record, sizeof(buffer));
- if (cupsFileWrite(fp, buffer, sizeof(buffer)) < sizeof(buffer))
+ if (cupsFileWrite(fp, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer))
break;
}
@@ -336,10 +344,10 @@ random_tests(void)
* cupsFileTell()
*/
- expected += 256 * sizeof(buffer);
+ expected += 256 * (ssize_t)sizeof(buffer);
fputs("cupsFileTell(): ", stdout);
- if ((pos = cupsFileTell(fp)) != expected)
+ if ((pos = cupsFileTell(fp)) != (off_t)expected)
{
printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
CUPS_LLCAST pos, CUPS_LLCAST expected);
@@ -372,11 +380,9 @@ random_tests(void)
fputs("cupsFileSeek(), cupsFileRead(): ", stdout);
- for (num_records = (pass + 1) * 256, count = (pass + 1) * 256,
- record = CUPS_RAND() % num_records;
+ for (num_records = (pass + 1) * 256, count = (pass + 1) * 256, record = ((int)CUPS_RAND() & 65535) % num_records;
count > 0;
- count --, record = (record + (CUPS_RAND() & 31) - 16 + num_records) %
- num_records)
+ count --, record = (record + ((int)CUPS_RAND() & 31) - 16 + num_records) % num_records)
{
/*
* The last record is always the first...
@@ -390,7 +396,7 @@ random_tests(void)
* contents...
*/
- expected = sizeof(buffer) * record;
+ expected = (ssize_t)sizeof(buffer) * record;
if ((pos = cupsFileSeek(fp, expected)) != expected)
{
@@ -454,6 +460,7 @@ read_write_tests(int compression) /* I - Use compression? */
unsigned char readbuf[8192], /* Read buffer */
writebuf[8192]; /* Write buffer */
int byte; /* Byte from file */
+ ssize_t bytes; /* Number of bytes read/written */
off_t length; /* Length of file */
static const char *partial_line = "partial line";
/* Partial line */
@@ -472,7 +479,7 @@ read_write_tests(int compression) /* I - Use compression? */
CUPS_SRAND((unsigned)time(NULL));
for (i = 0; i < (int)sizeof(writebuf); i ++)
- writebuf[i] = CUPS_RAND();
+ writebuf[i] = (unsigned char)CUPS_RAND();
/*
* cupsFileOpen(write)
@@ -673,7 +680,7 @@ read_write_tests(int compression) /* I - Use compression? */
fputs("cupsFileGetConf(): ", stdout);
- for (i = 0; i < 1000; i ++)
+ for (i = 0, value = NULL; i < 1000; i ++)
if (!cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
break;
else if (_cups_strcasecmp(line, "TestLine") || !value || atoi(value) != i ||
@@ -700,7 +707,7 @@ read_write_tests(int compression) /* I - Use compression? */
fputs("cupsFileGetChar(): ", stdout);
- for (i = 0; i < 256; i ++)
+ for (i = 0, byte = 0; i < 256; i ++)
if ((byte = cupsFileGetChar(fp)) != i)
break;
@@ -723,15 +730,15 @@ read_write_tests(int compression) /* I - Use compression? */
fputs("cupsFileRead(): ", stdout);
- for (i = 0; i < 10000; i ++)
- if ((byte = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0)
+ for (i = 0, bytes = 0; i < 10000; i ++)
+ if ((bytes = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0)
break;
else if (memcmp(readbuf, writebuf, sizeof(readbuf)))
break;
if (i >= 10000)
puts("PASS");
- else if (byte > 0)
+ else if (bytes > 0)
{
printf("FAIL (Pass %d, ", i);
@@ -806,7 +813,8 @@ read_write_tests(int compression) /* I - Use compression? */
* Remove the test file...
*/
- unlink(compression ? "testfile.dat.gz" : "testfile.dat");
+ if (!status)
+ unlink(compression ? "testfile.dat.gz" : "testfile.dat");
/*
* Return the test status...
@@ -817,5 +825,5 @@ read_write_tests(int compression) /* I - Use compression? */
/*
- * End of "$Id: testfile.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testfile.c 12577 2015-03-30 19:07:17Z msweet $".
*/
diff --git a/cups/testhttp.c b/cups/testhttp.c
index c93a28a..cb5345f 100644
--- a/cups/testhttp.c
+++ b/cups/testhttp.c
@@ -1,30 +1,25 @@
/*
- * "$Id: testhttp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testhttp.c 12678 2015-05-28 19:09:48Z msweet $"
*
- * HTTP test program for CUPS.
+ * HTTP test program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
* Include necessary headers...
*/
-#include "string-private.h"
-#include "http-private.h"
+#include "cups-private.h"
/*
@@ -41,6 +36,7 @@ typedef struct uri_test_s /**** URI test cases ****/
*resource; /* Resource string */
int port, /* Port number */
assemble_port; /* Port number for httpAssembleURI() */
+ http_uri_coding_t assemble_coding;/* Coding for httpAssembleURI() */
} uri_test_t;
@@ -51,98 +47,147 @@ typedef struct uri_test_s /**** URI test cases ****/
static uri_test_t uri_tests[] = /* URI test data */
{
/* Start with valid URIs */
- { HTTP_URI_OK, "file:/filename",
- "file", "", "", "/filename", 0, 0 },
- { HTTP_URI_OK, "file:/filename%20with%20spaces",
- "file", "", "", "/filename with spaces", 0, 0 },
- { HTTP_URI_OK, "file:///filename",
- "file", "", "", "/filename", 0, 0 },
- { HTTP_URI_OK, "file:///filename%20with%20spaces",
- "file", "", "", "/filename with spaces", 0, 0 },
- { HTTP_URI_OK, "file://localhost/filename",
- "file", "", "localhost", "/filename", 0, 0 },
- { HTTP_URI_OK, "file://localhost/filename%20with%20spaces",
- "file", "", "localhost", "/filename with spaces", 0, 0 },
- { HTTP_URI_OK, "http://server/",
- "http", "", "server", "/", 80, 0 },
- { HTTP_URI_OK, "http://username@server/",
- "http", "username", "server", "/", 80, 0 },
- { HTTP_URI_OK, "http://username:passwor%64@server/",
- "http", "username:password", "server", "/", 80, 0 },
- { HTTP_URI_OK, "http://username:passwor%64@server:8080/",
- "http", "username:password", "server", "/", 8080, 8080 },
- { HTTP_URI_OK, "http://username:passwor%64@server:8080/directory/filename",
- "http", "username:password", "server", "/directory/filename", 8080, 8080 },
- { HTTP_URI_OK, "http://[2000::10:100]:631/ipp",
- "http", "", "2000::10:100", "/ipp", 631, 631 },
- { HTTP_URI_OK, "https://username:passwor%64@server/directory/filename",
- "https", "username:password", "server", "/directory/filename", 443, 0 },
- { HTTP_URI_OK, "ipp://username:passwor%64@[::1]/ipp",
- "ipp", "username:password", "::1", "/ipp", 631, 0 },
- { HTTP_URI_OK, "lpd://server/queue?reserve=yes",
- "lpd", "", "server", "/queue?reserve=yes", 515, 0 },
- { HTTP_URI_OK, "mailto:user@domain.com",
- "mailto", "", "", "user@domain.com", 0, 0 },
- { HTTP_URI_OK, "socket://server/",
- "socket", "", "server", "/", 9100, 0 },
- { HTTP_URI_OK, "socket://192.168.1.1:9101/",
- "socket", "", "192.168.1.1", "/", 9101, 9101 },
- { HTTP_URI_OK, "ipp://username:password@[v1.fe80::200:1234:5678:9abc+eth0]:999/ipp",
- "ipp", "username:password", "fe80::200:1234:5678:9abc%eth0", "/ipp", 999, 999 },
- { HTTP_URI_OK, "http://server/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400",
- "http", "", "server", "/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400", 80, 0 },
- { HTTP_URI_OK, "lpd://Acme%20Laser%20(01%3A23%3A45).local._tcp._printer/",
- "lpd", "", "Acme Laser (01:23:45).local._tcp._printer", "/", 515, 0 },
- { HTTP_URI_OK, "ipp://HP%20Officejet%204500%20G510n-z%20%40%20Will's%20MacBook%20Pro%2015%22._ipp._tcp.local./",
- "ipp", "", "HP Officejet 4500 G510n-z @ Will's MacBook Pro 15\"._ipp._tcp.local.", "/", 631, 0 },
+ { HTTP_URI_STATUS_OK, "file:/filename",
+ "file", "", "", "/filename", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "file:/filename%20with%20spaces",
+ "file", "", "", "/filename with spaces", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "file:///filename",
+ "file", "", "", "/filename", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "file:///filename%20with%20spaces",
+ "file", "", "", "/filename with spaces", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "file://localhost/filename",
+ "file", "", "localhost", "/filename", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "file://localhost/filename%20with%20spaces",
+ "file", "", "localhost", "/filename with spaces", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "http://server/",
+ "http", "", "server", "/", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "http://username@server/",
+ "http", "username", "server", "/", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "http://username:passwor%64@server/",
+ "http", "username:password", "server", "/", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "http://username:passwor%64@server:8080/",
+ "http", "username:password", "server", "/", 8080, 8080,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "http://username:passwor%64@server:8080/directory/filename",
+ "http", "username:password", "server", "/directory/filename", 8080, 8080,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "http://[2000::10:100]:631/ipp",
+ "http", "", "2000::10:100", "/ipp", 631, 631,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "https://username:passwor%64@server/directory/filename",
+ "https", "username:password", "server", "/directory/filename", 443, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "ipp://username:passwor%64@[::1]/ipp",
+ "ipp", "username:password", "::1", "/ipp", 631, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "lpd://server/queue?reserve=yes",
+ "lpd", "", "server", "/queue?reserve=yes", 515, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "mailto:user@domain.com",
+ "mailto", "", "", "user@domain.com", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "socket://server/",
+ "socket", "", "server", "/", 9100, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "socket://192.168.1.1:9101/",
+ "socket", "", "192.168.1.1", "/", 9101, 9101,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "tel:8005551212",
+ "tel", "", "", "8005551212", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "ipp://username:password@[v1.fe80::200:1234:5678:9abc+eth0]:999/ipp",
+ "ipp", "username:password", "fe80::200:1234:5678:9abc%eth0", "/ipp", 999, 999,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "ipp://username:password@[fe80::200:1234:5678:9abc%25eth0]:999/ipp",
+ "ipp", "username:password", "fe80::200:1234:5678:9abc%eth0", "/ipp", 999, 999,
+ (http_uri_coding_t)(HTTP_URI_CODING_MOST | HTTP_URI_CODING_RFC6874) },
+ { HTTP_URI_STATUS_OK, "http://server/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400",
+ "http", "", "server", "/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "lpd://Acme%20Laser%20(01%3A23%3A45).local._tcp._printer/",
+ "lpd", "", "Acme Laser (01:23:45).local._tcp._printer", "/", 515, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "ipp://HP%20Officejet%204500%20G510n-z%20%40%20Will's%20MacBook%20Pro%2015%22._ipp._tcp.local./",
+ "ipp", "", "HP Officejet 4500 G510n-z @ Will's MacBook Pro 15\"._ipp._tcp.local.", "/", 631, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_OK, "ipp://%22%23%2F%3A%3C%3E%3F%40%5B%5C%5D%5E%60%7B%7C%7D/",
+ "ipp", "", "\"#/:<>?@[\\]^`{|}", "/", 631, 0,
+ HTTP_URI_CODING_MOST },
/* Missing scheme */
- { HTTP_URI_MISSING_SCHEME, "/path/to/file/index.html",
- "file", "", "", "/path/to/file/index.html", 0, 0 },
- { HTTP_URI_MISSING_SCHEME, "//server/ipp",
- "ipp", "", "server", "/ipp", 631, 0 },
+ { HTTP_URI_STATUS_MISSING_SCHEME, "/path/to/file/index.html",
+ "file", "", "", "/path/to/file/index.html", 0, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_MISSING_SCHEME, "//server/ipp",
+ "ipp", "", "server", "/ipp", 631, 0,
+ HTTP_URI_CODING_MOST },
/* Unknown scheme */
- { HTTP_URI_UNKNOWN_SCHEME, "vendor://server/resource",
- "vendor", "", "server", "/resource", 0, 0 },
+ { HTTP_URI_STATUS_UNKNOWN_SCHEME, "vendor://server/resource",
+ "vendor", "", "server", "/resource", 0, 0,
+ HTTP_URI_CODING_MOST },
/* Missing resource */
- { HTTP_URI_MISSING_RESOURCE, "socket://[::192.168.2.1]",
- "socket", "", "::192.168.2.1", "/", 9100, 0 },
- { HTTP_URI_MISSING_RESOURCE, "socket://192.168.1.1:9101",
- "socket", "", "192.168.1.1", "/", 9101 },
+ { HTTP_URI_STATUS_MISSING_RESOURCE, "socket://[::192.168.2.1]",
+ "socket", "", "::192.168.2.1", "/", 9100, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_MISSING_RESOURCE, "socket://192.168.1.1:9101",
+ "socket", "", "192.168.1.1", "/", 9101, 0,
+ HTTP_URI_CODING_MOST },
/* Bad URI */
- { HTTP_URI_BAD_URI, "",
- "", "", "", "", 0, 0 },
+ { HTTP_URI_STATUS_BAD_URI, "",
+ "", "", "", "", 0, 0,
+ HTTP_URI_CODING_MOST },
/* Bad scheme */
- { HTTP_URI_BAD_SCHEME, "bad_scheme://server/resource",
- "", "", "", "", 0, 0 },
+ { HTTP_URI_STATUS_BAD_SCHEME, "bad_scheme://server/resource",
+ "", "", "", "", 0, 0,
+ HTTP_URI_CODING_MOST },
/* Bad username */
- { HTTP_URI_BAD_USERNAME, "http://username:passwor%6@server/resource",
- "http", "", "", "", 80, 0 },
+ { HTTP_URI_STATUS_BAD_USERNAME, "http://username:passwor%6@server/resource",
+ "http", "", "", "", 80, 0,
+ HTTP_URI_CODING_MOST },
/* Bad hostname */
- { HTTP_URI_BAD_HOSTNAME, "http://[/::1]/index.html",
- "http", "", "", "", 80, 0 },
- { HTTP_URI_BAD_HOSTNAME, "http://[",
- "http", "", "", "", 80, 0 },
- { HTTP_URI_BAD_HOSTNAME, "http://serve%7/index.html",
- "http", "", "", "", 80, 0 },
- { HTTP_URI_BAD_HOSTNAME, "http://server with spaces/index.html",
- "http", "", "", "", 80, 0 },
+ { HTTP_URI_STATUS_BAD_HOSTNAME, "http://[/::1]/index.html",
+ "http", "", "", "", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_BAD_HOSTNAME, "http://[",
+ "http", "", "", "", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_BAD_HOSTNAME, "http://serve%7/index.html",
+ "http", "", "", "", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_BAD_HOSTNAME, "http://server with spaces/index.html",
+ "http", "", "", "", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_BAD_HOSTNAME, "ipp://\"#/:<>?@[\\]^`{|}/",
+ "ipp", "", "", "", 631, 0,
+ HTTP_URI_CODING_MOST },
/* Bad port number */
- { HTTP_URI_BAD_PORT, "http://127.0.0.1:9999a/index.html",
- "http", "", "127.0.0.1", "", 0, 0 },
+ { HTTP_URI_STATUS_BAD_PORT, "http://127.0.0.1:9999a/index.html",
+ "http", "", "127.0.0.1", "", 0, 0,
+ HTTP_URI_CODING_MOST },
/* Bad resource */
- { HTTP_URI_BAD_RESOURCE, "http://server/index.html%",
- "http", "", "server", "", 80, 0 },
- { HTTP_URI_BAD_RESOURCE, "http://server/index with spaces.html",
- "http", "", "server", "", 80, 0 }
+ { HTTP_URI_STATUS_BAD_RESOURCE, "http://server/index.html%",
+ "http", "", "server", "", 80, 0,
+ HTTP_URI_CODING_MOST },
+ { HTTP_URI_STATUS_BAD_RESOURCE, "http://server/index with spaces.html",
+ "http", "", "server", "", 80, 0,
+ HTTP_URI_CODING_MOST }
};
static const char * const base64_tests[][2] =
{
@@ -190,20 +235,21 @@ main(int argc, /* I - Number of command-line arguments */
*addr; /* Current address */
off_t length, total; /* Length and total bytes */
time_t start, current; /* Start and end time */
+ const char *encoding; /* Negotiated Content-Encoding */
static const char * const uri_status_strings[] =
{
- "HTTP_URI_OVERFLOW",
- "HTTP_URI_BAD_ARGUMENTS",
- "HTTP_URI_BAD_RESOURCE",
- "HTTP_URI_BAD_PORT",
- "HTTP_URI_BAD_HOSTNAME",
- "HTTP_URI_BAD_USERNAME",
- "HTTP_URI_BAD_SCHEME",
- "HTTP_URI_BAD_URI",
- "HTTP_URI_OK",
- "HTTP_URI_MISSING_SCHEME",
- "HTTP_URI_UNKNOWN_SCHEME",
- "HTTP_URI_MISSING_RESOURCE"
+ "HTTP_URI_STATUS_OVERFLOW",
+ "HTTP_URI_STATUS_BAD_ARGUMENTS",
+ "HTTP_URI_STATUS_BAD_RESOURCE",
+ "HTTP_URI_STATUS_BAD_PORT",
+ "HTTP_URI_STATUS_BAD_HOSTNAME",
+ "HTTP_URI_STATUS_BAD_USERNAME",
+ "HTTP_URI_STATUS_BAD_SCHEME",
+ "HTTP_URI_STATUS_BAD_URI",
+ "HTTP_URI_STATUS_OK",
+ "HTTP_URI_STATUS_MISSING_SCHEME",
+ "HTTP_URI_STATUS_UNKNOWN_SCHEME",
+ "HTTP_URI_STATUS_MISSING_RESOURCE"
};
@@ -222,7 +268,7 @@ main(int argc, /* I - Number of command-line arguments */
fputs("httpGetDateString()/httpGetDateTime(): ", stdout);
start = time(NULL);
- strcpy(buffer, httpGetDateString(start));
+ strlcpy(buffer, httpGetDateString(start), sizeof(buffer));
current = httpGetDateTime(buffer);
i = (int)(current - start);
@@ -406,12 +452,12 @@ main(int argc, /* I - Number of command-line arguments */
for (i = 0, j = 0, k = 0;
i < (int)(sizeof(uri_tests) / sizeof(uri_tests[0]));
i ++)
- if (uri_tests[i].result == HTTP_URI_OK &&
+ if (uri_tests[i].result == HTTP_URI_STATUS_OK &&
!strstr(uri_tests[i].uri, "%64") &&
strstr(uri_tests[i].uri, "//"))
{
k ++;
- uri_status = httpAssembleURI(HTTP_URI_CODING_MOST,
+ uri_status = httpAssembleURI(uri_tests[i].assemble_coding,
buffer, sizeof(buffer),
uri_tests[i].scheme,
uri_tests[i].username,
@@ -419,7 +465,7 @@ main(int argc, /* I - Number of command-line arguments */
uri_tests[i].assemble_port,
uri_tests[i].resource);
- if (uri_status != HTTP_URI_OK)
+ if (uri_status != HTTP_URI_STATUS_OK)
{
failures ++;
@@ -451,6 +497,21 @@ main(int argc, /* I - Number of command-line arguments */
printf("PASS (%d URIs tested)\n", k);
/*
+ * httpAssembleUUID
+ */
+
+ fputs("httpAssembleUUID: ", stdout);
+ httpAssembleUUID("hostname.example.com", 631, "printer", 12345, buffer,
+ sizeof(buffer));
+ if (strncmp(buffer, "urn:uuid:", 9))
+ {
+ printf("FAIL (%s)\n", buffer);
+ failures ++;
+ }
+ else
+ printf("PASS (%s)\n", buffer);
+
+ /*
* Show a summary and return...
*/
@@ -548,23 +609,246 @@ main(int argc, /* I - Number of command-line arguments */
if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") ||
port == 443)
- encryption = HTTP_ENCRYPT_ALWAYS;
+ encryption = HTTP_ENCRYPTION_ALWAYS;
else
- encryption = HTTP_ENCRYPT_IF_REQUESTED;
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
- http = httpConnectEncrypt(hostname, port, encryption);
+ http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL);
if (http == NULL)
{
perror(hostname);
continue;
}
- printf("Requesting file \"%s\"...\n", resource);
- httpClearFields(http);
- httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
- httpGet(http, resource);
- while ((status = httpUpdate(http)) == HTTP_CONTINUE);
- if (status == HTTP_OK)
+ if (httpIsEncrypted(http))
+ {
+ cups_array_t *creds;
+ char info[1024];
+ static const char *trusts[] = { "OK", "Invalid", "Changed", "Expired", "Renewed", "Unknown" };
+ if (!httpCopyCredentials(http, &creds))
+ {
+ cups_array_t *lcreds;
+ http_trust_t trust = httpCredentialsGetTrust(creds, hostname);
+
+ httpCredentialsString(creds, info, sizeof(info));
+
+ printf("Count: %d\n", cupsArrayCount(creds));
+ printf("Trust: %s\n", trusts[trust]);
+ printf("Expiration: %s\n", httpGetDateString(httpCredentialsGetExpiration(creds)));
+ printf("IsValidName: %d\n", httpCredentialsAreValidForName(creds, hostname));
+ printf("String: \"%s\"\n", info);
+
+ printf("LoadCredentials: %d\n", httpLoadCredentials(NULL, &lcreds, hostname));
+ httpCredentialsString(lcreds, info, sizeof(info));
+ printf(" Count: %d\n", cupsArrayCount(lcreds));
+ printf(" String: \"%s\"\n", info);
+
+ if (lcreds && cupsArrayCount(creds) == cupsArrayCount(lcreds))
+ {
+ http_credential_t *cred, *lcred;
+
+ for (i = 1, cred = (http_credential_t *)cupsArrayFirst(creds), lcred = (http_credential_t *)cupsArrayFirst(lcreds);
+ cred && lcred;
+ i ++, cred = (http_credential_t *)cupsArrayNext(creds), lcred = (http_credential_t *)cupsArrayNext(lcreds))
+ {
+ if (cred->datalen != lcred->datalen)
+ printf(" Credential #%d: Different lengths (saved=%d, current=%d)\n", i, (int)cred->datalen, (int)lcred->datalen);
+ else if (memcmp(cred->data, lcred->data, cred->datalen))
+ printf(" Credential #%d: Different data\n", i);
+ else
+ printf(" Credential #%d: Matches\n", i);
+ }
+ }
+
+ if (trust != HTTP_TRUST_OK)
+ {
+ printf("SaveCredentials: %d\n", httpSaveCredentials(NULL, creds, hostname));
+ trust = httpCredentialsGetTrust(creds, hostname);
+ printf("New Trust: %s\n", trusts[trust]);
+ }
+
+ httpFreeCredentials(creds);
+ }
+ else
+ puts("No credentials!");
+ }
+
+ printf("Checking file \"%s\"...\n", resource);
+
+ do
+ {
+ if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close"))
+ {
+ httpClearFields(http);
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+ }
+
+ httpClearFields(http);
+ httpSetField(http, HTTP_FIELD_AUTHORIZATION, httpGetAuthString(http));
+ httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
+ if (httpHead(http, resource))
+ {
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+ else
+ {
+ status = HTTP_STATUS_UNAUTHORIZED;
+ continue;
+ }
+ }
+
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
+
+ if (status == HTTP_STATUS_UNAUTHORIZED)
+ {
+ /*
+ * Flush any error message...
+ */
+
+ httpFlush(http);
+
+ /*
+ * See if we can do authentication...
+ */
+
+ if (cupsDoAuthentication(http, "GET", resource))
+ {
+ status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
+ break;
+ }
+
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+
+ continue;
+ }
+#ifdef HAVE_SSL
+ else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
+ {
+ /* Flush any error message... */
+ httpFlush(http);
+
+ /* Reconnect... */
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+
+ /* Upgrade with encryption... */
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
+
+ /* Try again, this time with encryption enabled... */
+ continue;
+ }
+#endif /* HAVE_SSL */
+ }
+ while (status == HTTP_STATUS_UNAUTHORIZED ||
+ status == HTTP_STATUS_UPGRADE_REQUIRED);
+
+ if (status == HTTP_STATUS_OK)
+ puts("HEAD OK:");
+ else
+ printf("HEAD failed with status %d...\n", status);
+
+ encoding = httpGetContentEncoding(http);
+
+ printf("Requesting file \"%s\" (Accept-Encoding: %s)...\n", resource,
+ encoding ? encoding : "identity");
+
+ do
+ {
+ if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close"))
+ {
+ httpClearFields(http);
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+ }
+
+ httpClearFields(http);
+ httpSetField(http, HTTP_FIELD_AUTHORIZATION, httpGetAuthString(http));
+ httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
+ httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING, encoding);
+
+ if (httpGet(http, resource))
+ {
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+ else
+ {
+ status = HTTP_STATUS_UNAUTHORIZED;
+ continue;
+ }
+ }
+
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
+
+ if (status == HTTP_STATUS_UNAUTHORIZED)
+ {
+ /*
+ * Flush any error message...
+ */
+
+ httpFlush(http);
+
+ /*
+ * See if we can do authentication...
+ */
+
+ if (cupsDoAuthentication(http, "GET", resource))
+ {
+ status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
+ break;
+ }
+
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+
+ continue;
+ }
+#ifdef HAVE_SSL
+ else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
+ {
+ /* Flush any error message... */
+ httpFlush(http);
+
+ /* Reconnect... */
+ if (httpReconnect2(http, 30000, NULL))
+ {
+ status = HTTP_STATUS_ERROR;
+ break;
+ }
+
+ /* Upgrade with encryption... */
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
+
+ /* Try again, this time with encryption enabled... */
+ continue;
+ }
+#endif /* HAVE_SSL */
+ }
+ while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED);
+
+ if (status == HTTP_STATUS_OK)
puts("GET OK:");
else
printf("GET failed with status %d...\n", status);
@@ -576,11 +860,13 @@ main(int argc, /* I - Number of command-line arguments */
while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
{
total += bytes;
- fwrite(buffer, bytes, 1, out);
+ fwrite(buffer, (size_t)bytes, 1, out);
if (out != stdout)
{
current = time(NULL);
- if (current == start) current ++;
+ if (current == start)
+ current ++;
+
printf("\r" CUPS_LLFMT "/" CUPS_LLFMT " bytes ("
CUPS_LLFMT " bytes/sec) ", CUPS_LLCAST total,
CUPS_LLCAST length, CUPS_LLCAST (total / (current - start)));
@@ -589,6 +875,9 @@ main(int argc, /* I - Number of command-line arguments */
}
}
+ if (out != stdout)
+ putchar('\n');
+
puts("Closing connection to server...");
httpClose(http);
@@ -600,5 +889,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: testhttp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testhttp.c 12678 2015-05-28 19:09:48Z msweet $".
*/
diff --git a/cups/testi18n.c b/cups/testi18n.c
index 0fa0bcc..490c938 100644
--- a/cups/testi18n.c
+++ b/cups/testi18n.c
@@ -1,23 +1,18 @@
/*
- * "$Id: testi18n.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testi18n.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Internationalization test for CUPS.
+ * Internationalization test for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry for internationalization test module.
- * print_utf8() - Print UTF-8 string with (optional) message.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -282,17 +277,17 @@ main(int argc, /* I - Argument Count */
fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout);
- strcpy(legsrc, legdest);
+ strlcpy(legsrc, legdest, sizeof(legsrc));
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
- if (len != strlen((char *)utf8latin))
+ if ((size_t)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 ++;
}
- else if (memcmp(utf8latin, utf8dest, len))
+ else if (memcmp(utf8latin, utf8dest, (size_t)len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8latin", utf8latin);
@@ -333,17 +328,17 @@ main(int argc, /* I - Argument Count */
fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout);
- strcpy(legsrc, legdest);
+ strlcpy(legsrc, legdest, sizeof(legsrc));
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
- if (len != strlen((char *)utf8greek))
+ if ((size_t)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 ++;
}
- else if (memcmp(utf8greek, utf8dest, len))
+ else if (memcmp(utf8greek, utf8dest, (size_t)len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8greek", utf8greek);
@@ -379,17 +374,17 @@ main(int argc, /* I - Argument Count */
fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout);
- strcpy(legsrc, legdest);
+ strlcpy(legsrc, legdest, sizeof(legsrc));
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
- if (len != strlen((char *)utf8japan))
+ if ((size_t)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 ++;
}
- else if (memcmp(utf8japan, utf8dest, len))
+ else if (memcmp(utf8japan, utf8dest, (size_t)len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8japan", utf8japan);
@@ -426,17 +421,17 @@ main(int argc, /* I - Argument Count */
#ifndef __linux
fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout);
- strcpy(legsrc, legdest);
+ strlcpy(legsrc, legdest, sizeof(legsrc));
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
- if (len != strlen((char *)utf8japan))
+ if ((size_t)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 ++;
}
- else if (memcmp(utf8japan, utf8dest, len))
+ else if (memcmp(utf8japan, utf8dest, (size_t)len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8japan", utf8japan);
@@ -473,17 +468,17 @@ main(int argc, /* I - Argument Count */
fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout);
- strcpy(legsrc, legdest);
+ strlcpy(legsrc, legdest, sizeof(legsrc));
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
- if (len != strlen((char *)utf8taiwan))
+ if ((size_t)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 ++;
}
- else if (memcmp(utf8taiwan, utf8dest, len))
+ else if (memcmp(utf8taiwan, utf8dest, (size_t)len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8taiwan", utf8taiwan);
@@ -519,17 +514,17 @@ main(int argc, /* I - Argument Count */
fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout);
- strcpy(legsrc, legdest);
+ strlcpy(legsrc, legdest, sizeof(legsrc));
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
- if (len != strlen((char *)utf8taiwan))
+ if ((size_t)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 ++;
}
- else if (memcmp(utf8taiwan, utf8dest, len))
+ else if (memcmp(utf8taiwan, utf8dest, (size_t)len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8taiwan", utf8taiwan);
@@ -553,7 +548,7 @@ main(int argc, /* I - Argument Count */
print_utf8(" utf8good ", utf8good);
print_utf32(" utf32dest", utf32dest);
}
- memcpy (utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
+ memcpy(utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024);
if (len < 0)
return (1);
@@ -615,5 +610,5 @@ print_utf8(const char *msg, /* I - Message String */
/*
- * End of "$Id: testi18n.c 11173 2013-07-23 12:31:34Z msweet $"
+ * End of "$Id: testi18n.c 11558 2014-02-06 18:33:34Z msweet $"
*/
diff --git a/cups/testipp.c b/cups/testipp.c
index d9d7bee..96a431b 100644
--- a/cups/testipp.c
+++ b/cups/testipp.c
@@ -1,26 +1,18 @@
/*
- * "$Id: testipp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testipp.c 11889 2014-05-22 13:54:15Z msweet $"
*
- * IPP test program for CUPS.
+ * IPP test program for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
- * hex_dump() - Produce a hex dump of a buffer.
- * print_attributes() - Print the attributes in a request...
- * read_cb() - Read data from a buffer.
- * write_cb() - Write data into a buffer.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -55,7 +47,7 @@ typedef struct _ippdata_t
* Local globals...
*/
-ipp_uchar_t collection[] = /* Collection buffer */
+static ipp_uchar_t collection[] = /* Collection buffer */
{
0x01, 0x01, /* IPP version */
0x00, 0x02, /* Print-Job operation */
@@ -205,7 +197,7 @@ ipp_uchar_t collection[] = /* Collection buffer */
IPP_TAG_END /* end tag */
};
-ipp_uchar_t mixed[] = /* Mixed value buffer */
+static ipp_uchar_t mixed[] = /* Mixed value buffer */
{
0x01, 0x01, /* IPP version */
0x00, 0x02, /* Print-Job operation */
@@ -236,7 +228,7 @@ ipp_uchar_t mixed[] = /* Mixed value buffer */
* Local functions...
*/
-void hex_dump(const char *title, ipp_uchar_t *buffer, int bytes);
+void hex_dump(const char *title, ipp_uchar_t *buffer, size_t bytes);
void print_attributes(ipp_t *ipp, int indent);
ssize_t read_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
ssize_t write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
@@ -259,10 +251,13 @@ main(int argc, /* I - Number of command-line arguments */
*media_size, /* media-size attribute */
*attr; /* Other attribute */
ipp_state_t state; /* State */
- int length; /* Length of data */
+ size_t length; /* Length of data */
cups_file_t *fp; /* File pointer */
- int i; /* Looping var */
+ size_t i; /* Looping var */
int status; /* Status of tests (0 = success, 1 = fail) */
+#ifdef DEBUG
+ const char *name; /* Option name */
+#endif /* DEBUG */
status = 0;
@@ -278,7 +273,7 @@ main(int argc, /* I - Number of command-line arguments */
request = ippNew();
request->request.op.version[0] = 0x01;
request->request.op.version[1] = 0x01;
- request->request.op.operation_id = IPP_PRINT_JOB;
+ request->request.op.operation_id = IPP_OP_PRINT_JOB;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
@@ -319,7 +314,7 @@ main(int argc, /* I - Number of command-line arguments */
if (length != sizeof(collection))
{
printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
- length, (int)sizeof(collection));
+ (int)length, (int)sizeof(collection));
status = 1;
}
else
@@ -336,11 +331,11 @@ main(int argc, /* I - Number of command-line arguments */
data.wbuffer = buffer;
while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL,
- request)) != IPP_DATA)
- if (state == IPP_ERROR)
+ request)) != IPP_STATE_DATA)
+ if (state == IPP_STATE_ERROR)
break;
- if (state != IPP_DATA)
+ if (state != IPP_STATE_DATA)
{
printf("FAIL - %d bytes written.\n", (int)data.wused);
status = 1;
@@ -359,7 +354,7 @@ main(int argc, /* I - Number of command-line arguments */
if (data.wbuffer[i] != collection[i])
break;
- printf("FAIL - output does not match baseline at 0x%04x!\n", i);
+ printf("FAIL - output does not match baseline at 0x%04x!\n", (unsigned)i);
hex_dump("Bytes Written", data.wbuffer, data.wused);
hex_dump("Baseline", collection, sizeof(collection));
status = 1;
@@ -379,13 +374,13 @@ main(int argc, /* I - Number of command-line arguments */
data.rpos = 0;
while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL,
- request)) != IPP_DATA)
- if (state == IPP_ERROR)
+ request)) != IPP_STATE_DATA)
+ if (state == IPP_STATE_ERROR)
break;
length = ippLength(request);
- if (state != IPP_DATA)
+ if (state != IPP_STATE_DATA)
{
printf("FAIL - %d bytes read.\n", (int)data.rpos);
status = 1;
@@ -400,7 +395,7 @@ main(int argc, /* I - Number of command-line arguments */
else if (length != sizeof(collection))
{
printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
- length, (int)sizeof(collection));
+ (int)length, (int)sizeof(collection));
print_attributes(request, 8);
status = 1;
}
@@ -547,6 +542,53 @@ main(int argc, /* I - Number of command-line arguments */
}
}
+ /*
+ * Test hierarchical find...
+ */
+
+ fputs("ippFindAttribute(media-col/media-size/x-dimension): ", stdout);
+ if ((attr = ippFindAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL)
+ {
+ if (ippGetInteger(attr, 0) != 21590)
+ {
+ printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0));
+ status = 1;
+ }
+ else
+ puts("PASS");
+ }
+ else
+ {
+ puts("FAIL (not found)");
+ status = 1;
+ }
+
+ fputs("ippFindNextAttribute(media-col/media-size/x-dimension): ", stdout);
+ if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL)
+ {
+ if (ippGetInteger(attr, 0) != 21000)
+ {
+ printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0));
+ status = 1;
+ }
+ else
+ puts("PASS");
+ }
+ else
+ {
+ puts("FAIL (not found)");
+ status = 1;
+ }
+
+ fputs("ippFindNextAttribute(media-col/media-size/x-dimension) again: ", stdout);
+ if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL)
+ {
+ printf("FAIL (got %d, expected nothing)\n", ippGetInteger(attr, 0));
+ status = 1;
+ }
+ else
+ puts("PASS");
+
ippDelete(request);
/*
@@ -563,13 +605,13 @@ main(int argc, /* I - Number of command-line arguments */
data.wbuffer = mixed;
while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL,
- request)) != IPP_DATA)
- if (state == IPP_ERROR)
+ request)) != IPP_STATE_DATA)
+ if (state == IPP_STATE_ERROR)
break;
length = ippLength(request);
- if (state != IPP_DATA)
+ if (state != IPP_STATE_DATA)
{
printf("FAIL - %d bytes read.\n", (int)data.rpos);
status = 1;
@@ -584,7 +626,7 @@ main(int argc, /* I - Number of command-line arguments */
else if (length != (sizeof(mixed) + 4))
{
printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
- length, (int)sizeof(mixed) + 4);
+ (int)length, (int)sizeof(mixed) + 4);
print_attributes(request, 8);
status = 1;
}
@@ -625,11 +667,26 @@ main(int argc, /* I - Number of command-line arguments */
ippDelete(request);
+#ifdef DEBUG
+ /*
+ * Test that private option array is sorted...
+ */
+
+ fputs("_ippCheckOptions: ", stdout);
+ if ((name = _ippCheckOptions()) == NULL)
+ puts("PASS");
+ else
+ {
+ printf("FAIL (\"%s\" out of order)\n", name);
+ status = 1;
+ }
+#endif /* DEBUG */
+
/*
* Test _ippFindOption() private API...
*/
- fputs("_ippFindOption(printer-type): ", stdout);
+ fputs("_ippFindOption(\"printer-type\"): ", stdout);
if (_ippFindOption("printer-type"))
puts("PASS");
else
@@ -655,7 +712,7 @@ main(int argc, /* I - Number of command-line arguments */
* Read IPP files...
*/
- for (i = 1; i < argc; i ++)
+ for (i = 1; i < (size_t)argc; i ++)
{
if ((fp = cupsFileOpen(argv[i], "r")) == NULL)
{
@@ -666,9 +723,9 @@ main(int argc, /* I - Number of command-line arguments */
request = ippNew();
while ((state = ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL,
- request)) == IPP_ATTRIBUTE);
+ request)) == IPP_STATE_ATTRIBUTE);
- if (state != IPP_DATA)
+ if (state != IPP_STATE_DATA)
{
printf("Error reading IPP message from \"%s\"!\n", argv[i]);
status = 1;
@@ -695,10 +752,10 @@ main(int argc, /* I - Number of command-line arguments */
void
hex_dump(const char *title, /* I - Title */
ipp_uchar_t *buffer, /* I - Buffer to dump */
- int bytes) /* I - Number of bytes */
+ size_t bytes) /* I - Number of bytes */
{
- int i, j; /* Looping vars */
- int ch; /* Current ASCII char */
+ size_t i, j; /* Looping vars */
+ int ch; /* Current ASCII char */
/*
@@ -713,7 +770,7 @@ hex_dump(const char *title, /* I - Title */
* Show the offset...
*/
- printf(" %04x ", i);
+ printf(" %04x ", (unsigned)i);
/*
* Then up to 16 bytes in hex...
@@ -883,17 +940,10 @@ print_attributes(ipp_t *ipp, /* I - IPP request */
case IPP_TAG_DATE :
{
- time_t vtime; /* Date/Time value */
- struct tm *vdate; /* Date info */
char vstring[256]; /* Formatted time */
for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++)
- {
- vtime = ippDateToTime(val->date);
- vdate = localtime(&vtime);
- strftime(vstring, sizeof(vstring), "%c", vdate);
- printf(" (%s)", vstring);
- }
+ printf(" (%s)", _cupsStrDate(vstring, sizeof(vstring), ippDateToTime(val->date)));
}
putchar('\n');
break;
@@ -966,7 +1016,7 @@ read_cb(_ippdata_t *data, /* I - Data */
* Return the number of bytes read...
*/
- return (count);
+ return ((ssize_t)count);
}
@@ -996,10 +1046,10 @@ write_cb(_ippdata_t *data, /* I - Data */
* Return the number of bytes written...
*/
- return (count);
+ return ((ssize_t)count);
}
/*
- * End of "$Id: testipp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testipp.c 11889 2014-05-22 13:54:15Z msweet $".
*/
diff --git a/cups/testlang.c b/cups/testlang.c
index 0f8942f..1b7b686 100644
--- a/cups/testlang.c
+++ b/cups/testlang.c
@@ -1,9 +1,9 @@
/*
- * "$Id: testlang.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testlang.c 12841 2015-08-10 17:07:30Z msweet $"
*
* Localization test program for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -50,8 +50,6 @@ main(int argc, /* I - Number of command-line arguments */
};
- _cupsSetLocale(argv);
-
if (argc == 1)
{
language = cupsLangDefault();
@@ -61,8 +59,13 @@ main(int argc, /* I - Number of command-line arguments */
{
language = cupsLangGet(argv[1]);
language2 = cupsLangGet(argv[1]);
+
+ setenv("LANG", argv[1], 1);
+ setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1);
}
+ _cupsSetLocale(argv);
+
if (language != language2)
{
errors ++;
@@ -105,10 +108,49 @@ main(int argc, /* I - Number of command-line arguments */
}
}
+ if (argc == 3)
+ {
+ ppd_file_t *ppd; /* PPD file */
+ ppd_option_t *option; /* PageSize option */
+ ppd_choice_t *choice; /* PageSize/Letter choice */
+
+ if ((ppd = ppdOpenFile(argv[2])) == NULL)
+ {
+ printf("Unable to open PPD file \"%s\".\n", argv[2]);
+ errors ++;
+ }
+ else
+ {
+ ppdLocalize(ppd);
+
+ if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
+ {
+ puts("No PageSize option.");
+ errors ++;
+ }
+ else
+ {
+ printf("PageSize: %s\n", option->text);
+
+ if ((choice = ppdFindChoice(option, "Letter")) == NULL)
+ {
+ puts("No Letter PageSize choice.");
+ errors ++;
+ }
+ else
+ {
+ printf("Letter: %s\n", choice->text);
+ }
+ }
+
+ ppdClose(ppd);
+ }
+ }
+
return (errors > 0);
}
/*
- * End of "$Id: testlang.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testlang.c 12841 2015-08-10 17:07:30Z msweet $".
*/
diff --git a/cups/testoptions.c b/cups/testoptions.c
index 144f161..d14b64f 100644
--- a/cups/testoptions.c
+++ b/cups/testoptions.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testoptions.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testoptions.c 1992 2010-03-24 14:32:08Z msweet $"
*
* Option test program for CUPS.
*
@@ -112,5 +112,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: testoptions.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testoptions.c 1992 2010-03-24 14:32:08Z msweet $".
*/
diff --git a/cups/testppd.c b/cups/testppd.c
index d66be19..dbd896e 100644
--- a/cups/testppd.c
+++ b/cups/testppd.c
@@ -1,28 +1,25 @@
/*
- * "$Id: testppd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testppd.c 12603 2015-05-06 01:42:51Z msweet $"
*
- * PPD test program for CUPS.
+ * PPD test program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
* Include necessary headers...
*/
+#undef _CUPS_NO_DEPRECATED
#include "cups-private.h"
#include <sys/stat.h>
#ifdef WIN32
@@ -31,6 +28,7 @@
# include <unistd.h>
# include <fcntl.h>
#endif /* WIN32 */
+#include <math.h>
/*
@@ -53,6 +51,11 @@ static const char *default_code =
"%%EndFeature\n"
"} stopped cleartomark\n"
"[{\n"
+ "%%BeginFeature: *OutputBin Tray1\n"
+ "OutputBin=Tray1\n"
+ "%%EndFeature\n"
+ "} stopped cleartomark\n"
+ "[{\n"
"%%BeginFeature: *MediaType Plain\n"
"MediaType=Plain\n"
"%%EndFeature\n"
@@ -82,6 +85,11 @@ static const char *custom_code =
"%%EndFeature\n"
"} stopped cleartomark\n"
"[{\n"
+ "%%BeginFeature: *OutputBin Tray1\n"
+ "OutputBin=Tray1\n"
+ "%%EndFeature\n"
+ "} stopped cleartomark\n"
+ "[{\n"
"%%BeginFeature: *IntOption None\n"
"%%EndFeature\n"
"} stopped cleartomark\n"
@@ -150,6 +158,7 @@ main(int argc, /* I - Number of command-line arguments */
maxsize, /* Maximum size */
*size; /* Current size */
ppd_attr_t *attr; /* Current attribute */
+ _ppd_cache_t *pc; /* PPD cache */
status = 0;
@@ -392,10 +401,10 @@ main(int argc, /* I - Number of command-line arguments */
fputs("ppdPageSizeLimits: ", stdout);
if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
{
- if (minsize.width != 36 || minsize.length != 36 ||
- maxsize.width != 1080 || maxsize.length != 86400)
+ if (fabs(minsize.width - 36.0) > 0.001 || fabs(minsize.length - 36.0) > 0.001 ||
+ fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001)
{
- printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
+ printf("FAIL (got min=%.3fx%.3f, max=%.3fx%.3f, "
"expected min=36x36, max=1080x86400)\n", minsize.width,
minsize.length, maxsize.width, maxsize.length);
status ++;
@@ -481,7 +490,8 @@ main(int argc, /* I - Number of command-line arguments */
size = ppdPageSize(ppd, NULL);
if (!size || strcmp(size->name, "Custom") ||
- size->width != 576 || size->length != 720)
+ fabs(size->width - 576.0) > 0.001 ||
+ fabs(size->length - 720.0) > 0.001)
{
printf("FAIL (%s - %gx%g)\n", size ? size->name : "unknown",
size ? size->width : 0.0, size ? size->length : 0.0);
@@ -770,8 +780,8 @@ main(int argc, /* I - Number of command-line arguments */
fputs("ppdPageSizeLimits(default): ", stdout);
if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
{
- if (minsize.width != 36 || minsize.length != 36 ||
- maxsize.width != 1080 || maxsize.length != 86400)
+ if (fabs(minsize.width - 36.0) > 0.001 || fabs(minsize.length - 36.0) > 0.001 ||
+ fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001)
{
printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
"expected min=36x36, max=1080x86400)\n", minsize.width,
@@ -792,8 +802,8 @@ main(int argc, /* I - Number of command-line arguments */
fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout);
if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
{
- if (minsize.width != 100 || minsize.length != 100 ||
- maxsize.width != 1000 || maxsize.length != 1000)
+ if (fabs(minsize.width - 100.0) > 0.001 || fabs(minsize.length - 100.0) > 0.001 ||
+ fabs(maxsize.width - 1000.0) > 0.001 || fabs(maxsize.length - 1000.0) > 0.001)
{
printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
"expected min=100x100, max=1000x1000)\n", minsize.width,
@@ -814,8 +824,8 @@ main(int argc, /* I - Number of command-line arguments */
fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
{
- if (minsize.width != 200 || minsize.length != 200 ||
- maxsize.width != 1000 || maxsize.length != 1000)
+ if (fabs(minsize.width - 200.0) > 0.001 || fabs(minsize.length - 200.0) > 0.001 ||
+ fabs(maxsize.width - 1000.0) > 0.001 || fabs(maxsize.length - 1000.0) > 0.001)
{
printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
"expected min=200x200, max=1000x1000)\n", minsize.width,
@@ -836,8 +846,8 @@ main(int argc, /* I - Number of command-line arguments */
fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
{
- if (minsize.width != 300 || minsize.length != 300 ||
- maxsize.width != 1080 || maxsize.length != 86400)
+ if (fabs(minsize.width - 300.0) > 0.001 || fabs(minsize.length - 300.0) > 0.001 ||
+ fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001)
{
printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
"expected min=300x300, max=1080x86400)\n", minsize.width,
@@ -853,13 +863,66 @@ main(int argc, /* I - Number of command-line arguments */
status ++;
}
}
+ else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7))
+ {
+ /*
+ * ipp://... or ipps://...
+ */
+
+ http_t *http; /* Connection to printer */
+ ipp_t *request, /* Get-Printer-Attributes request */
+ *response; /* Get-Printer-Attributes response */
+ char scheme[32], /* URI scheme */
+ userpass[256], /* Username:password */
+ host[256], /* Hostname */
+ resource[256]; /* Resource path */
+ int port; /* Port number */
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, argv[1], scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ {
+ printf("Bad URI \"%s\".\n", argv[1]);
+ return (1);
+ }
+
+ http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
+ if (!http)
+ {
+ printf("Unable to connect to \"%s:%d\": %s\n", host, port, cupsLastErrorString());
+ return (1);
+ }
+
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, argv[1]);
+ response = cupsDoRequest(http, request, resource);
+
+ if (_ppdCreateFromIPP(buffer, sizeof(buffer), response))
+ printf("Created PPD: %s\n", buffer);
+ else
+ puts("Unable to create PPD.");
+
+ ippDelete(response);
+ httpClose(http);
+ return (0);
+ }
else
{
const char *filename; /* PPD filename */
struct stat fileinfo; /* File information */
- if (!strncmp(argv[1], "-d", 2))
+ if (strchr(argv[1], ':'))
+ {
+ /*
+ * Server PPD...
+ */
+
+ if ((filename = cupsGetServerPPD(CUPS_HTTP_DEFAULT, argv[1])) == NULL)
+ {
+ printf("%s: %s\n", argv[1], cupsLastErrorString());
+ return (1);
+ }
+ }
+ else if (!strncmp(argv[1], "-d", 2))
{
const char *printer; /* Printer name */
@@ -897,7 +960,7 @@ main(int argc, /* I - Number of command-line arguments */
if ((realsize = readlink(filename, realfile, sizeof(realfile) - 1)) < 0)
- strcpy(realfile, "Unknown");
+ strlcpy(realfile, "Unknown", sizeof(realfile));
else
realfile[realsize] = '\0';
@@ -1073,6 +1136,15 @@ main(int argc, /* I - Number of command-line arguments */
attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs))
printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec,
attr->text, attr->value ? attr->value : "");
+
+ puts("\nPPD Cache:");
+ if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL)
+ printf(" Unable to create: %s\n", cupsLastErrorString());
+ else
+ {
+ _ppdCacheWriteFile(pc, "t.cache", NULL);
+ puts(" Wrote t.cache.");
+ }
}
if (!strncmp(argv[1], "-d", 2))
@@ -1098,5 +1170,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: testppd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testppd.c 12603 2015-05-06 01:42:51Z msweet $".
*/
diff --git a/cups/testpwg.c b/cups/testpwg.c
index 9b6741e..3dcbc34 100644
--- a/cups/testpwg.c
+++ b/cups/testpwg.c
@@ -1,9 +1,9 @@
/*
- * "$Id: testpwg.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testpwg.c 11239 2013-08-14 20:33:42Z msweet $"
*
* PWG test program for CUPS.
*
- * Copyright 2009-2012 by Apple Inc.
+ * Copyright 2009-2013 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -45,11 +45,15 @@ int /* O - Exit status */
main(int argc, /* I - Number of command-line args */
char *argv[]) /* I - Command-line arguments */
{
- int status; /* Status of tests (0 = success, 1 = fail) */
- const char *ppdfile; /* PPD filename */
- ppd_file_t *ppd; /* PPD file */
- _ppd_cache_t *pc; /* PPD cache and PWG mapping data */
- _pwg_media_t *pwgmedia; /* PWG media size */
+ int status; /* Status of tests (0 = success, 1 = fail) */
+ const char *ppdfile; /* PPD filename */
+ ppd_file_t *ppd; /* PPD file */
+ _ppd_cache_t *pc; /* PPD cache and PWG mapping data */
+ const pwg_media_t *pwgmedia; /* PWG media size */
+ size_t i, /* Looping var */
+ num_media; /* Number of media sizes */
+ const pwg_media_t *mediatable; /* Media size table */
+ int dupmedia = 0; /* Duplicate media sizes? */
status = 0;
@@ -151,8 +155,8 @@ main(int argc, /* I - Number of command-line args */
puts("PASS");
}
- fputs("_pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout);
- if ((pwgmedia = _pwgMediaForPWG("iso_a4_210x297mm")) == NULL)
+ fputs("pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout);
+ if ((pwgmedia = pwgMediaForPWG("iso_a4_210x297mm")) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -170,8 +174,22 @@ main(int argc, /* I - Number of command-line args */
else
puts("PASS");
- fputs("_pwgMediaForLegacy(\"na-letter\"): ", stdout);
- if ((pwgmedia = _pwgMediaForLegacy("na-letter")) == NULL)
+ fputs("pwgMediaForPWG(\"roll_max_36.1025x3622.0472in\"): ", stdout);
+ if ((pwgmedia = pwgMediaForPWG("roll_max_36.1025x3622.0472in")) == NULL)
+ {
+ puts("FAIL (not found)");
+ status ++;
+ }
+ else if (pwgmedia->width != 91700 || pwgmedia->length != 9199999)
+ {
+ printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
+ status ++;
+ }
+ else
+ printf("PASS (%dx%d)\n", pwgmedia->width, pwgmedia->length);
+
+ fputs("pwgMediaForLegacy(\"na-letter\"): ", stdout);
+ if ((pwgmedia = pwgMediaForLegacy("na-letter")) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -189,8 +207,8 @@ main(int argc, /* I - Number of command-line args */
else
puts("PASS");
- fputs("_pwgMediaForPPD(\"4x6\"): ", stdout);
- if ((pwgmedia = _pwgMediaForPPD("4x6")) == NULL)
+ fputs("pwgMediaForPPD(\"4x6\"): ", stdout);
+ if ((pwgmedia = pwgMediaForPPD("4x6")) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -208,8 +226,8 @@ main(int argc, /* I - Number of command-line args */
else
puts("PASS");
- fputs("_pwgMediaForPPD(\"10x15cm\"): ", stdout);
- if ((pwgmedia = _pwgMediaForPPD("10x15cm")) == NULL)
+ fputs("pwgMediaForPPD(\"10x15cm\"): ", stdout);
+ if ((pwgmedia = pwgMediaForPPD("10x15cm")) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -227,8 +245,8 @@ main(int argc, /* I - Number of command-line args */
else
puts("PASS");
- fputs("_pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout);
- if ((pwgmedia = _pwgMediaForPPD("Custom.10x15cm")) == NULL)
+ fputs("pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout);
+ if ((pwgmedia = pwgMediaForPPD("Custom.10x15cm")) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -246,8 +264,8 @@ main(int argc, /* I - Number of command-line args */
else
puts("PASS");
- fputs("_pwgMediaForSize(29700, 42000): ", stdout);
- if ((pwgmedia = _pwgMediaForSize(29700, 42000)) == NULL)
+ fputs("pwgMediaForSize(29700, 42000): ", stdout);
+ if ((pwgmedia = pwgMediaForSize(29700, 42000)) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -260,8 +278,8 @@ main(int argc, /* I - Number of command-line args */
else
puts("PASS");
- fputs("_pwgMediaForSize(9842, 19050): ", stdout);
- if ((pwgmedia = _pwgMediaForSize(9842, 19050)) == NULL)
+ fputs("pwgMediaForSize(9842, 19050): ", stdout);
+ if ((pwgmedia = pwgMediaForSize(9842, 19050)) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -274,8 +292,8 @@ main(int argc, /* I - Number of command-line args */
else
printf("PASS (%s)\n", pwgmedia->pwg);
- fputs("_pwgMediaForSize(9800, 19000): ", stdout);
- if ((pwgmedia = _pwgMediaForSize(9800, 19000)) == NULL)
+ fputs("pwgMediaForSize(9800, 19000): ", stdout);
+ if ((pwgmedia = pwgMediaForSize(9800, 19000)) == NULL)
{
puts("FAIL (not found)");
status ++;
@@ -288,6 +306,33 @@ main(int argc, /* I - Number of command-line args */
else
printf("PASS (%s)\n", pwgmedia->pwg);
+ fputs("Duplicate size test: ", stdout);
+ for (mediatable = _pwgMediaTable(&num_media);
+ num_media > 1;
+ num_media --, mediatable ++)
+ {
+ for (i = num_media - 1, pwgmedia = mediatable + 1; i > 0; i --, pwgmedia ++)
+ {
+ if (pwgmedia->width == mediatable->width &&
+ pwgmedia->length == mediatable->length)
+ {
+ if (!dupmedia)
+ {
+ dupmedia = 1;
+ status ++;
+ puts("FAIL");
+ }
+
+ printf(" %s and %s have the same dimensions (%dx%d)\n",
+ pwgmedia->pwg, mediatable->pwg, pwgmedia->width,
+ pwgmedia->length);
+ }
+ }
+ }
+ if (!dupmedia)
+ puts("PASS");
+
+
return (status);
}
@@ -361,9 +406,9 @@ test_ppd_cache(_ppd_cache_t *pc, /* I - PWG mapping data */
int i, /* Looping var */
status = 0; /* Return status */
_ppd_cache_t *pc2; /* Loaded data */
- _pwg_size_t *size, /* Size from original */
+ pwg_size_t *size, /* Size from original */
*size2; /* Size from saved */
- _pwg_map_t *map, /* Map from original */
+ pwg_map_t *map, /* Map from original */
*map2; /* Map from saved */
@@ -521,5 +566,5 @@ test_ppd_cache(_ppd_cache_t *pc, /* I - PWG mapping data */
/*
- * End of "$Id: testpwg.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testpwg.c 11239 2013-08-14 20:33:42Z msweet $".
*/
diff --git a/cups/testsnmp.c b/cups/testsnmp.c
index 809584f..d5e3856 100644
--- a/cups/testsnmp.c
+++ b/cups/testsnmp.c
@@ -1,24 +1,17 @@
/*
- * "$Id: testsnmp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testsnmp.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * SNMP test program for CUPS.
+ * SNMP test program for CUPS.
*
- * Copyright 2008-2010 by Apple Inc.
+ * Copyright 2008-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
- * scan_oid() - Scan an OID value.
- * show_oid() - Show the specified OID.
- * usage() - Show program usage and exit.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -132,8 +125,8 @@ static void
print_packet(cups_snmp_t *packet, /* I - SNMP response packet */
void *data) /* I - User data pointer (not used) */
{
- int i; /* Looping var */
- char temp[1024]; /* Temporary OID string */
+ unsigned i; /* Looping var */
+ char temp[1024]; /* Temporary OID string */
(void)data;
@@ -300,5 +293,5 @@ usage(void)
/*
- * End of "$Id: testsnmp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testsnmp.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/cups/thread-private.h b/cups/thread-private.h
index 8682222..dadc034 100644
--- a/cups/thread-private.h
+++ b/cups/thread-private.h
@@ -1,15 +1,17 @@
/*
- * "$Id: thread-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: thread-private.h 11627 2014-02-20 16:15:09Z msweet $"
*
- * Private threading definitions for CUPS.
+ * Private threading definitions for CUPS.
*
- * Copyright 2009-2012 by Apple Inc.
+ * Copyright 2009-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_THREAD_PRIVATE_H_
@@ -39,7 +41,7 @@ typedef pthread_rwlock_t _cups_rwlock_t;
typedef pthread_key_t _cups_threadkey_t;
# define _CUPS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
# define _CUPS_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
-# define _CUPS_THREADKEY_INITIALIZER -1
+# define _CUPS_THREADKEY_INITIALIZER 0
# define _cupsThreadGetData(k) pthread_getspecific(k)
# define _cupsThreadSetData(k,p) pthread_setspecific(k,p)
@@ -94,5 +96,5 @@ extern int _cupsThreadCreate(_cups_thread_func_t func, void *arg);
#endif /* !_CUPS_THREAD_PRIVATE_H_ */
/*
- * End of "$Id: thread-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: thread-private.h 11627 2014-02-20 16:15:09Z msweet $".
*/
diff --git a/cups/thread.c b/cups/thread.c
index 7f1ea21..ea49f1d 100644
--- a/cups/thread.c
+++ b/cups/thread.c
@@ -1,26 +1,17 @@
/*
- * "$Id: thread.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: thread.c 11627 2014-02-20 16:15:09Z msweet $"
*
- * Threading primitives for CUPS.
+ * Threading primitives for CUPS.
*
- * Copyright 2009-2012 by Apple Inc.
+ * Copyright 2009-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * Contents:
- *
- * _cupsMutexInit() - Initialize a mutex.
- * _cupsMutexLock() - Lock a mutex.
- * _cupsMutexUnlock() - Unlock a mutex.
- * _cupsRWInit() - Initialize a reader/writer lock.
- * _cupsRWLockRead() - Acquire a reader/writer lock for reading.
- * _cupsRWLockWrite() - Acquire a reader/writer lock for writing.
- * _cupsRWUnlock() - Release a reader/writer lock.
- * _cupsThreadCreate() - Create a thread.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -332,5 +323,5 @@ _cupsThreadCreate(
/*
- * End of "$Id: thread.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: thread.c 11627 2014-02-20 16:15:09Z msweet $".
*/
diff --git a/cups/tls-darwin.c b/cups/tls-darwin.c
new file mode 100644
index 0000000..377919d
--- /dev/null
+++ b/cups/tls-darwin.c
@@ -0,0 +1,1839 @@
+/*
+ * "$Id: tls-darwin.c 12675 2015-05-28 01:14:32Z msweet $"
+ *
+ * TLS support code for CUPS on OS X.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/**** This file is included from tls.c ****/
+
+/*
+ * Include necessary headers...
+ */
+
+#include <spawn.h>
+
+extern char **environ;
+
+
+/*
+ * Local globals...
+ */
+
+#ifdef HAVE_SECKEYCHAINOPEN
+static int tls_auto_create = 0;
+ /* Auto-create self-signed certs? */
+static char *tls_common_name = NULL;
+ /* Default common name */
+static SecKeychainRef tls_keychain = NULL;
+ /* Server cert keychain */
+static char *tls_keypath = NULL;
+ /* Server cert keychain path */
+static _cups_mutex_t tls_mutex = _CUPS_MUTEX_INITIALIZER;
+ /* Mutex for keychain/certs */
+#endif /* HAVE_SECKEYCHAINOPEN */
+static int tls_options = -1;/* Options for TLS connections */
+
+
+/*
+ * Local functions...
+ */
+
+#ifdef HAVE_SECKEYCHAINOPEN
+static CFArrayRef http_cdsa_copy_server(const char *common_name);
+#endif /* HAVE_SECKEYCHAINOPEN */
+static SecCertificateRef http_cdsa_create_credential(http_credential_t *credential);
+static const char *http_cdsa_default_path(char *buffer, size_t bufsize);
+static OSStatus http_cdsa_read(SSLConnectionRef connection, void *data, size_t *dataLength);
+static int http_cdsa_set_credentials(http_t *http);
+static OSStatus http_cdsa_write(SSLConnectionRef connection, const void *data, size_t *dataLength);
+
+
+/*
+ * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsMakeServerCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ const char *common_name, /* I - Common name */
+ int num_alt_names, /* I - Number of subject alternate names */
+ const char **alt_names, /* I - Subject Alternate Names */
+ time_t expiration_date) /* I - Expiration date */
+{
+#if defined(HAVE_SECGENERATESELFSIGNEDCERTIFICATE) && defined(HAVE_SECKEYCHAINOPEN)
+ char filename[1024]; /* Default keychain path */
+ int status = 0; /* Return status */
+ OSStatus err; /* Error code (if any) */
+ CFStringRef cfcommon_name = NULL;
+ /* CF string for server name */
+ SecIdentityRef ident = NULL; /* Identity */
+ SecKeyRef publicKey = NULL,
+ /* Public key */
+ privateKey = NULL;
+ /* Private key */
+ CFMutableDictionaryRef keyParams = NULL;
+ /* Key generation parameters */
+
+
+ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date));
+
+ (void)num_alt_names;
+ (void)alt_names;
+ (void)expiration_date;
+
+ if (!path)
+ path = http_cdsa_default_path(filename, sizeof(filename));
+
+ cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8);
+ if (!cfcommon_name)
+ goto cleanup;
+
+ /*
+ * Create a public/private key pair...
+ */
+
+ keyParams = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ if (!keyParams)
+ goto cleanup;
+
+ CFDictionaryAddValue(keyParams, kSecAttrKeyType, kSecAttrKeyTypeRSA);
+ CFDictionaryAddValue(keyParams, kSecAttrKeySizeInBits, CFSTR("2048"));
+ CFDictionaryAddValue(keyParams, kSecAttrLabel, CFSTR("CUPS Self-Signed Certificate"));
+
+ err = SecKeyGeneratePair(keyParams, &publicKey, &privateKey);
+ if (err != noErr)
+ goto cleanup;
+
+ /*
+ * Create a self-signed certificate using the public/private key pair...
+ */
+
+ CFIndex usageInt = kSecKeyUsageAll;
+ CFNumberRef usage = CFNumberCreate(alloc, kCFNumberCFIndexType, &usageInt);
+ CFDictionaryRef certParams = CFDictionaryCreateMutable(kCFAllocatorDefault,
+kSecCSRBasicContraintsPathLen, CFINT(0), kSecSubjectAltName, cfcommon_name, kSecCertificateKeyUsage, usage, NULL, NULL);
+ CFRelease(usage);
+
+ const void *ca_o[] = { kSecOidOrganization, CFSTR("") };
+ const void *ca_cn[] = { kSecOidCommonName, cfcommon_name };
+ CFArrayRef ca_o_dn = CFArrayCreate(kCFAllocatorDefault, ca_o, 2, NULL);
+ CFArrayRef ca_cn_dn = CFArrayCreate(kCFAllocatorDefault, ca_cn, 2, NULL);
+ const void *ca_dn_array[2];
+
+ ca_dn_array[0] = CFArrayCreate(kCFAllocatorDefault, (const void **)&ca_o_dn, 1, NULL);
+ ca_dn_array[1] = CFArrayCreate(kCFAllocatorDefault, (const void **)&ca_cn_dn, 1, NULL);
+
+ CFArrayRef subject = CFArrayCreate(kCFAllocatorDefault, ca_dn_array, 2, NULL);
+ SecCertificateRef cert = SecGenerateSelfSignedCertificate(subject, certParams, publicKey, privateKey);
+ CFRelease(subject);
+ CFRelease(certParams);
+
+ if (!cert)
+ goto cleanup;
+
+ ident = SecIdentityCreate(kCFAllocatorDefault, cert, privateKey);
+
+ if (ident)
+ status = 1;
+
+ /*
+ * Cleanup and return...
+ */
+
+cleanup:
+
+ if (cfcommon_name)
+ CFRelease(cfcommon_name);
+
+ if (keyParams)
+ CFRelease(keyParams);
+
+ if (ident)
+ CFRelease(ident);
+
+ if (cert)
+ CFRelease(cert);
+
+ if (publicKey)
+ CFRelease(publicKey);
+
+ if (privateKey)
+ CFRelease(publicKey);
+
+ return (status);
+
+#else /* !(HAVE_SECGENERATESELFSIGNEDCERTIFICATE && HAVE_SECKEYCHAINOPEN) */
+ int pid, /* Process ID of command */
+ status, /* Status of command */
+ i; /* Looping var */
+ char command[1024], /* Command */
+ *argv[4], /* Command-line arguments */
+ *envp[1000], /* Environment variables */
+ days[32], /* CERTTOOL_EXPIRATION_DAYS env var */
+ keychain[1024], /* Keychain argument */
+ infofile[1024], /* Type-in information for cert */
+ filename[1024]; /* Default keychain path */
+ cups_file_t *fp; /* Seed/info file */
+
+
+ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date));
+
+ (void)num_alt_names;
+ (void)alt_names;
+
+ if (!path)
+ path = http_cdsa_default_path(filename, sizeof(filename));
+
+ /*
+ * Run the "certtool" command to generate a self-signed certificate...
+ */
+
+ if (!cupsFileFind("certtool", getenv("PATH"), 1, command, sizeof(command)))
+ return (-1);
+
+ /*
+ * Create a file with the certificate information fields...
+ *
+ * Note: This assumes that the default questions are asked by the certtool
+ * command...
+ */
+
+ if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL)
+ return (-1);
+
+ cupsFilePrintf(fp,
+ "CUPS Self-Signed Certificate\n"
+ /* Enter key and certificate label */
+ "r\n" /* Generate RSA key pair */
+ "2048\n" /* Key size in bits */
+ "y\n" /* OK (y = yes) */
+ "b\n" /* Usage (b=signing/encryption) */
+ "s\n" /* Sign with SHA1 */
+ "y\n" /* OK (y = yes) */
+ "%s\n" /* Common name */
+ "\n" /* Country (default) */
+ "\n" /* Organization (default) */
+ "\n" /* Organizational unit (default) */
+ "\n" /* State/Province (default) */
+ "\n" /* Email address */
+ "y\n", /* OK (y = yes) */
+ common_name);
+ cupsFileClose(fp);
+
+ snprintf(keychain, sizeof(keychain), "k=%s", path);
+
+ argv[0] = "certtool";
+ argv[1] = "c";
+ argv[2] = keychain;
+ argv[3] = NULL;
+
+ snprintf(days, sizeof(days), "CERTTOOL_EXPIRATION_DAYS=%d", (int)((expiration_date - time(NULL) + 86399) / 86400));
+ envp[0] = days;
+ for (i = 0; i < (int)(sizeof(envp) / sizeof(envp[0]) - 2) && environ[i]; i ++)
+ envp[i + 1] = environ[i];
+ envp[i] = NULL;
+
+ posix_spawn_file_actions_t actions; /* File actions */
+
+ posix_spawn_file_actions_init(&actions);
+ posix_spawn_file_actions_addclose(&actions, 0);
+ posix_spawn_file_actions_addopen(&actions, 0, infofile, O_RDONLY, 0);
+ posix_spawn_file_actions_addclose(&actions, 1);
+ posix_spawn_file_actions_addopen(&actions, 1, "/dev/null", O_WRONLY, 0);
+ posix_spawn_file_actions_addclose(&actions, 2);
+ posix_spawn_file_actions_addopen(&actions, 2, "/dev/null", O_WRONLY, 0);
+
+ if (posix_spawn(&pid, command, &actions, NULL, argv, envp))
+ {
+ unlink(infofile);
+ return (-1);
+ }
+
+ posix_spawn_file_actions_destroy(&actions);
+
+ unlink(infofile);
+
+ while (waitpid(pid, &status, 0) < 0)
+ if (errno != EINTR)
+ {
+ status = -1;
+ break;
+ }
+
+ return (!status);
+#endif /* HAVE_SECGENERATESELFSIGNEDCERTIFICATE && HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * 'cupsSetServerCredentials()' - Set the default server credentials.
+ *
+ * Note: The server credentials are used by all threads in the running process.
+ * This function is threadsafe.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsSetServerCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ const char *common_name, /* I - Default common name for server */
+ int auto_create) /* I - 1 = automatically create self-signed certificates */
+{
+ DEBUG_printf(("cupsSetServerCredentials(path=\"%s\", common_name=\"%s\", auto_create=%d)", path, common_name, auto_create));
+
+#ifdef HAVE_SECKEYCHAINOPEN
+ char filename[1024]; /* Filename for keychain */
+ SecKeychainRef keychain = NULL;/* Temporary keychain */
+
+
+ if (!path)
+ path = http_cdsa_default_path(filename, sizeof(filename));
+
+ if (SecKeychainOpen(path, &keychain) != noErr)
+ {
+ /* TODO: Set cups last error string */
+ DEBUG_puts("1cupsSetServerCredentials: Unable to open keychain, returning 0.");
+ return (0);
+ }
+
+ _cupsMutexLock(&tls_mutex);
+
+ /*
+ * Close any keychain that is currently open...
+ */
+
+ if (tls_keychain)
+ CFRelease(tls_keychain);
+
+ if (tls_keypath)
+ _cupsStrFree(tls_keypath);
+
+ if (tls_common_name)
+ _cupsStrFree(tls_common_name);
+
+ /*
+ * Save the new keychain...
+ */
+
+ tls_keychain = keychain;
+ tls_keypath = _cupsStrAlloc(path);
+ tls_auto_create = auto_create;
+ tls_common_name = _cupsStrAlloc(common_name);
+
+ _cupsMutexUnlock(&tls_mutex);
+
+ DEBUG_puts("1cupsSetServerCredentials: Opened keychain, returning 1.");
+ return (1);
+
+#else
+ DEBUG_puts("1cupsSetServerCredentials: No keychain support compiled in, returning 0.");
+ return (0);
+#endif /* HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * 'httpCopyCredentials()' - Copy the credentials associated with the peer in
+ * an encrypted connection.
+ *
+ * @since CUPS 1.5/OS X 10.7@
+ */
+
+int /* O - Status of call (0 = success) */
+httpCopyCredentials(
+ http_t *http, /* I - Connection to server */
+ cups_array_t **credentials) /* O - Array of credentials */
+{
+ OSStatus error; /* Error code */
+ SecTrustRef peerTrust; /* Peer trust reference */
+ CFIndex count; /* Number of credentials */
+ SecCertificateRef secCert; /* Certificate reference */
+ CFDataRef data; /* Certificate data */
+ int i; /* Looping var */
+
+
+ DEBUG_printf(("httpCopyCredentials(http=%p, credentials=%p)", http, credentials));
+
+ if (credentials)
+ *credentials = NULL;
+
+ if (!http || !http->tls || !credentials)
+ return (-1);
+
+ if (!(error = SSLCopyPeerTrust(http->tls, &peerTrust)) && peerTrust)
+ {
+ DEBUG_printf(("2httpCopyCredentials: Peer provided %d certificates.", (int)SecTrustGetCertificateCount(peerTrust)));
+
+ if ((*credentials = cupsArrayNew(NULL, NULL)) != NULL)
+ {
+ count = SecTrustGetCertificateCount(peerTrust);
+
+ for (i = 0; i < count; i ++)
+ {
+ secCert = SecTrustGetCertificateAtIndex(peerTrust, i);
+
+#ifdef DEBUG
+ CFStringRef cf_name = SecCertificateCopySubjectSummary(secCert);
+ char name[1024];
+ if (cf_name)
+ CFStringGetCString(cf_name, name, sizeof(name), kCFStringEncodingUTF8);
+ else
+ strlcpy(name, "unknown", sizeof(name));
+
+ DEBUG_printf(("2httpCopyCredentials: Certificate %d name is \"%s\".", i, name));
+#endif /* DEBUG */
+
+ if ((data = SecCertificateCopyData(secCert)) != NULL)
+ {
+ DEBUG_printf(("2httpCopyCredentials: Adding %d byte certificate blob.", (int)CFDataGetLength(data)));
+
+ httpAddCredential(*credentials, CFDataGetBytePtr(data), (size_t)CFDataGetLength(data));
+ CFRelease(data);
+ }
+ }
+ }
+
+ CFRelease(peerTrust);
+ }
+
+ return (error);
+}
+
+
+/*
+ * '_httpCreateCredentials()' - Create credentials in the internal format.
+ */
+
+http_tls_credentials_t /* O - Internal credentials */
+_httpCreateCredentials(
+ cups_array_t *credentials) /* I - Array of credentials */
+{
+ CFMutableArrayRef peerCerts; /* Peer credentials reference */
+ SecCertificateRef secCert; /* Certificate reference */
+ http_credential_t *credential; /* Credential data */
+
+
+ if (!credentials)
+ return (NULL);
+
+ if ((peerCerts = CFArrayCreateMutable(kCFAllocatorDefault,
+ cupsArrayCount(credentials),
+ &kCFTypeArrayCallBacks)) == NULL)
+ return (NULL);
+
+ for (credential = (http_credential_t *)cupsArrayFirst(credentials);
+ credential;
+ credential = (http_credential_t *)cupsArrayNext(credentials))
+ {
+ if ((secCert = http_cdsa_create_credential(credential)) != NULL)
+ {
+ CFArrayAppendValue(peerCerts, secCert);
+ CFRelease(secCert);
+ }
+ }
+
+ return (peerCerts);
+}
+
+
+/*
+ * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+int /* O - 1 if valid, 0 otherwise */
+httpCredentialsAreValidForName(
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Name to check */
+{
+ SecCertificateRef secCert; /* Certificate reference */
+ CFStringRef cfcert_name = NULL;
+ /* Certificate's common name (CF string) */
+ char cert_name[256]; /* Certificate's common name (C string) */
+ int valid = 1; /* Valid name? */
+
+
+ if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+ return (0);
+
+ /*
+ * Compare the common names...
+ */
+
+ if ((cfcert_name = SecCertificateCopySubjectSummary(secCert)) == NULL)
+ {
+ /*
+ * Can't get common name, cannot be valid...
+ */
+
+ valid = 0;
+ }
+ else if (CFStringGetCString(cfcert_name, cert_name, sizeof(cert_name), kCFStringEncodingUTF8) &&
+ _cups_strcasecmp(common_name, cert_name))
+ {
+ /*
+ * Not an exact match for the common name, check for wildcard certs...
+ */
+
+ const char *domain = strchr(common_name, '.');
+ /* Domain in common name */
+
+ if (strncmp(cert_name, "*.", 2) || !domain || _cups_strcasecmp(domain, cert_name + 1))
+ {
+ /*
+ * Not a wildcard match.
+ */
+
+ /* TODO: Check subject alternate names */
+ valid = 0;
+ }
+ }
+
+ if (cfcert_name)
+ CFRelease(cfcert_name);
+
+ CFRelease(secCert);
+
+ return (valid);
+}
+
+
+/*
+ * 'httpCredentialsGetTrust()' - Return the trust of credentials.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+http_trust_t /* O - Level of trust */
+httpCredentialsGetTrust(
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Common name for trust lookup */
+{
+ SecCertificateRef secCert; /* Certificate reference */
+ http_trust_t trust = HTTP_TRUST_OK;
+ /* Trusted? */
+ cups_array_t *tcreds = NULL; /* Trusted credentials */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Per-thread globals */
+
+
+ if (!common_name)
+ return (HTTP_TRUST_UNKNOWN);
+
+ if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+ return (HTTP_TRUST_UNKNOWN);
+
+ if (cg->any_root < 0)
+ _cupsSetDefaults();
+
+ /*
+ * Look this common name up in the default keychains...
+ */
+
+ httpLoadCredentials(NULL, &tcreds, common_name);
+
+ if (tcreds)
+ {
+ char credentials_str[1024], /* String for incoming credentials */
+ tcreds_str[1024]; /* String for saved credentials */
+
+ httpCredentialsString(credentials, credentials_str, sizeof(credentials_str));
+ httpCredentialsString(tcreds, tcreds_str, sizeof(tcreds_str));
+
+ if (strcmp(credentials_str, tcreds_str))
+ {
+ /*
+ * Credentials don't match, let's look at the expiration date of the new
+ * credentials and allow if the new ones have a later expiration...
+ */
+
+ if (httpCredentialsGetExpiration(credentials) <= httpCredentialsGetExpiration(tcreds) ||
+ !httpCredentialsAreValidForName(credentials, common_name))
+ {
+ /*
+ * Either the new credentials are not newly issued, or the common name
+ * does not match the issued certificate...
+ */
+
+ trust = HTTP_TRUST_INVALID;
+ }
+ else if (httpCredentialsGetExpiration(tcreds) < time(NULL))
+ {
+ /*
+ * Save the renewed credentials...
+ */
+
+ trust = HTTP_TRUST_RENEWED;
+
+ httpSaveCredentials(NULL, credentials, common_name);
+ }
+ }
+
+ httpFreeCredentials(tcreds);
+ }
+ else if (cg->validate_certs && !httpCredentialsAreValidForName(credentials, common_name))
+ trust = HTTP_TRUST_INVALID;
+
+ if (!cg->expired_certs && !SecCertificateIsValid(secCert, CFAbsoluteTimeGetCurrent()))
+ trust = HTTP_TRUST_EXPIRED;
+ else if (!cg->any_root && cupsArrayCount(credentials) == 1)
+ trust = HTTP_TRUST_INVALID;
+
+ CFRelease(secCert);
+
+ return (trust);
+}
+
+
+/*
+ * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+time_t /* O - Expiration date of credentials */
+httpCredentialsGetExpiration(
+ cups_array_t *credentials) /* I - Credentials */
+{
+ SecCertificateRef secCert; /* Certificate reference */
+ time_t expiration; /* Expiration date */
+
+
+ if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+ return (0);
+
+ expiration = (time_t)(SecCertificateNotValidAfter(secCert) + kCFAbsoluteTimeIntervalSince1970);
+
+ CFRelease(secCert);
+
+ return (expiration);
+}
+
+
+/*
+ * 'httpCredentialsString()' - Return a string representing the credentials.
+ *
+ * @since CUPS 2.0/OS X 10.10@
+ */
+
+size_t /* O - Total size of credentials string */
+httpCredentialsString(
+ cups_array_t *credentials, /* I - Credentials */
+ char *buffer, /* I - Buffer or @code NULL@ */
+ size_t bufsize) /* I - Size of buffer */
+{
+ http_credential_t *first; /* First certificate */
+ SecCertificateRef secCert; /* Certificate reference */
+
+
+ DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize));
+
+ if (!buffer)
+ return (0);
+
+ if (buffer && bufsize > 0)
+ *buffer = '\0';
+
+ if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL &&
+ (secCert = http_cdsa_create_credential(first)) != NULL)
+ {
+ CFStringRef cf_name; /* CF common name string */
+ char name[256]; /* Common name associated with cert */
+ time_t expiration; /* Expiration date of cert */
+ _cups_md5_state_t md5_state; /* MD5 state */
+ unsigned char md5_digest[16]; /* MD5 result */
+
+ if ((cf_name = SecCertificateCopySubjectSummary(secCert)) != NULL)
+ {
+ CFStringGetCString(cf_name, name, (CFIndex)sizeof(name), kCFStringEncodingUTF8);
+ CFRelease(cf_name);
+ }
+ else
+ strlcpy(name, "unknown", sizeof(name));
+
+ expiration = (time_t)(SecCertificateNotValidAfter(secCert) + kCFAbsoluteTimeIntervalSince1970);
+
+ _cupsMD5Init(&md5_state);
+ _cupsMD5Append(&md5_state, first->data, (int)first->datalen);
+ _cupsMD5Finish(&md5_state, md5_digest);
+
+ snprintf(buffer, bufsize, "%s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", name, httpGetDateString(expiration), md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]);
+
+ CFRelease(secCert);
+ }
+
+ DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer));
+
+ return (strlen(buffer));
+}
+
+
+/*
+ * '_httpFreeCredentials()' - Free internal credentials.
+ */
+
+void
+_httpFreeCredentials(
+ http_tls_credentials_t credentials) /* I - Internal credentials */
+{
+ if (!credentials)
+ return;
+
+ CFRelease(credentials);
+}
+
+
+/*
+ * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 0 on success, -1 on error */
+httpLoadCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ cups_array_t **credentials, /* IO - Credentials */
+ const char *common_name) /* I - Common name for credentials */
+{
+#ifdef HAVE_SECKEYCHAINOPEN
+ OSStatus err; /* Error info */
+ char filename[1024]; /* Filename for keychain */
+ SecKeychainRef keychain = NULL;/* Keychain reference */
+ SecIdentitySearchRef search = NULL; /* Search reference */
+ SecCertificateRef cert = NULL; /* Certificate */
+ CFDataRef data; /* Certificate data */
+ SecPolicyRef policy = NULL; /* Policy ref */
+ CFStringRef cfcommon_name = NULL;
+ /* Server name */
+ CFMutableDictionaryRef query = NULL; /* Query qualifiers */
+ CFArrayRef list = NULL; /* Keychain list */
+
+
+ DEBUG_printf(("httpLoadCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name));
+
+ if (!credentials)
+ return (-1);
+
+ *credentials = NULL;
+
+ if (!path)
+ path = http_cdsa_default_path(filename, sizeof(filename));
+
+ if ((err = SecKeychainOpen(path, &keychain)) != noErr)
+ goto cleanup;
+
+ cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8);
+
+ policy = SecPolicyCreateSSL(1, cfcommon_name);
+
+ if (cfcommon_name)
+ CFRelease(cfcommon_name);
+
+ if (!policy)
+ goto cleanup;
+
+ if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)))
+ goto cleanup;
+
+ list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1, &kCFTypeArrayCallBacks);
+
+ CFDictionaryAddValue(query, kSecClass, kSecClassCertificate);
+ CFDictionaryAddValue(query, kSecMatchPolicy, policy);
+ CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue);
+ CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne);
+ CFDictionaryAddValue(query, kSecMatchSearchList, list);
+
+ CFRelease(list);
+
+ err = SecItemCopyMatching(query, (CFTypeRef *)&cert);
+
+ if (err)
+ goto cleanup;
+
+ if (CFGetTypeID(cert) != SecCertificateGetTypeID())
+ goto cleanup;
+
+ if ((data = SecCertificateCopyData(cert)) != NULL)
+ {
+ DEBUG_printf(("1httpLoadCredentials: Adding %d byte certificate blob.", (int)CFDataGetLength(data)));
+
+ *credentials = cupsArrayNew(NULL, NULL);
+ httpAddCredential(*credentials, CFDataGetBytePtr(data), (size_t)CFDataGetLength(data));
+ CFRelease(data);
+ }
+
+ cleanup :
+
+ if (keychain)
+ CFRelease(keychain);
+ if (search)
+ CFRelease(search);
+ if (cert)
+ CFRelease(cert);
+ if (policy)
+ CFRelease(policy);
+ if (query)
+ CFRelease(query);
+
+ DEBUG_printf(("1httpLoadCredentials: Returning %d.", *credentials ? 0 : -1));
+
+ return (*credentials ? 0 : -1);
+
+#else
+ (void)path;
+ (void)credentials;
+ (void)common_name;
+
+ return (-1);
+#endif /* HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - -1 on error, 0 on success */
+httpSaveCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Common name for credentials */
+{
+#ifdef HAVE_SECKEYCHAINOPEN
+ int ret = -1; /* Return value */
+ OSStatus err; /* Error info */
+ char filename[1024]; /* Filename for keychain */
+ SecKeychainRef keychain = NULL;/* Keychain reference */
+ SecIdentitySearchRef search = NULL; /* Search reference */
+ SecCertificateRef cert = NULL; /* Certificate */
+ CFMutableDictionaryRef attrs = NULL; /* Attributes for add */
+ CFArrayRef list = NULL; /* Keychain list */
+
+
+ DEBUG_printf(("httpSaveCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name));
+ if (!credentials)
+ goto cleanup;
+
+ if (!httpCredentialsAreValidForName(credentials, common_name))
+ {
+ DEBUG_puts("1httpSaveCredentials: Common name does not match.");
+ return (-1);
+ }
+
+ if ((cert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+ {
+ DEBUG_puts("1httpSaveCredentials: Unable to create certificate.");
+ goto cleanup;
+ }
+
+ if (!path)
+ path = http_cdsa_default_path(filename, sizeof(filename));
+
+ if ((err = SecKeychainOpen(path, &keychain)) != noErr)
+ {
+ DEBUG_printf(("1httpSaveCredentials: SecKeychainOpen returned %d.", (int)err));
+ goto cleanup;
+ }
+
+ if ((list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1, &kCFTypeArrayCallBacks)) == NULL)
+ {
+ DEBUG_puts("1httpSaveCredentials: Unable to create list of keychains.");
+ goto cleanup;
+ }
+
+ if ((attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)) == NULL)
+ {
+ DEBUG_puts("1httpSaveCredentials: Unable to create dictionary.");
+ goto cleanup;
+ }
+
+ CFDictionaryAddValue(attrs, kSecClass, kSecClassCertificate);
+ CFDictionaryAddValue(attrs, kSecValueRef, cert);
+ CFDictionaryAddValue(attrs, kSecMatchSearchList, list);
+
+ /* Note: SecItemAdd consumes "attrs"... */
+ err = SecItemAdd(attrs, NULL);
+ DEBUG_printf(("1httpSaveCredentials: SecItemAdd returned %d.", (int)err));
+
+ cleanup :
+
+ if (list)
+ CFRelease(list);
+ if (keychain)
+ CFRelease(keychain);
+ if (search)
+ CFRelease(search);
+ if (cert)
+ CFRelease(cert);
+
+ DEBUG_printf(("1httpSaveCredentials: Returning %d.", ret));
+
+ return (ret);
+
+#else
+ (void)path;
+ (void)credentials;
+ (void)common_name;
+
+ return (-1);
+#endif /* HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * '_httpTLSInitialize()' - Initialize the TLS stack.
+ */
+
+void
+_httpTLSInitialize(void)
+{
+ /*
+ * Nothing to do...
+ */
+}
+
+
+/*
+ * '_httpTLSPending()' - Return the number of pending TLS-encrypted bytes.
+ */
+
+size_t
+_httpTLSPending(http_t *http) /* I - HTTP connection */
+{
+ size_t bytes; /* Bytes that are available */
+
+
+ if (!SSLGetBufferedReadSize(http->tls, &bytes))
+ return (bytes);
+
+ return (0);
+}
+
+
+/*
+ * '_httpTLSRead()' - Read from a SSL/TLS connection.
+ */
+
+int /* O - Bytes read */
+_httpTLSRead(http_t *http, /* I - HTTP connection */
+ char *buf, /* I - Buffer to store data */
+ int len) /* I - Length of buffer */
+{
+ int result; /* Return value */
+ OSStatus error; /* Error info */
+ size_t processed; /* Number of bytes processed */
+
+
+ error = SSLRead(http->tls, buf, (size_t)len, &processed);
+ DEBUG_printf(("6_httpTLSRead: error=%d, processed=%d", (int)error,
+ (int)processed));
+ switch (error)
+ {
+ case 0 :
+ result = (int)processed;
+ break;
+
+ case errSSLWouldBlock :
+ if (processed)
+ result = (int)processed;
+ else
+ {
+ result = -1;
+ errno = EINTR;
+ }
+ break;
+
+ case errSSLClosedGraceful :
+ default :
+ if (processed)
+ result = (int)processed;
+ else
+ {
+ result = -1;
+ errno = EPIPE;
+ }
+ break;
+ }
+
+ return (result);
+}
+
+
+/*
+ * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options.
+ */
+
+void
+_httpTLSSetOptions(int options) /* I - Options */
+{
+ tls_options = options;
+}
+
+
+/*
+ * '_httpTLSStart()' - Set up SSL/TLS support on a connection.
+ */
+
+int /* O - 0 on success, -1 on failure */
+_httpTLSStart(http_t *http) /* I - HTTP connection */
+{
+ char hostname[256], /* Hostname */
+ *hostptr; /* Pointer into hostname */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Pointer to library globals */
+ OSStatus error; /* Error code */
+ const char *message = NULL;/* Error message */
+ cups_array_t *credentials; /* Credentials array */
+ cups_array_t *names; /* CUPS distinguished names */
+ CFArrayRef dn_array; /* CF distinguished names array */
+ CFIndex count; /* Number of credentials */
+ CFDataRef data; /* Certificate data */
+ int i; /* Looping var */
+ http_credential_t *credential; /* Credential data */
+
+
+ DEBUG_printf(("3_httpTLSStart(http=%p)", http));
+
+ if (tls_options < 0)
+ {
+ DEBUG_puts("4_httpTLSStart: Setting defaults.");
+ _cupsSetDefaults();
+ DEBUG_printf(("4_httpTLSStart: tls_options=%x", tls_options));
+ }
+
+#ifdef HAVE_SECKEYCHAINOPEN
+ if (http->mode == _HTTP_MODE_SERVER && !tls_keychain)
+#else
+ if (http->mode == _HTTP_MODE_SERVER)
+#endif /* HAVE_SECKEYCHAINOPEN */
+ {
+ DEBUG_puts("4_httpTLSStart: cupsSetServerCredentials not called.");
+ http->error = errno = EINVAL;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Server credentials not set."), 1);
+
+ return (-1);
+ }
+
+ if ((http->tls = SSLCreateContext(kCFAllocatorDefault, http->mode == _HTTP_MODE_CLIENT ? kSSLClientSide : kSSLServerSide, kSSLStreamType)) == NULL)
+ {
+ DEBUG_puts("4_httpTLSStart: SSLCreateContext failed.");
+ http->error = errno = ENOMEM;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+
+ return (-1);
+ }
+
+ error = SSLSetConnection(http->tls, http);
+ DEBUG_printf(("4_httpTLSStart: SSLSetConnection, error=%d", (int)error));
+
+ if (!error)
+ {
+ error = SSLSetIOFuncs(http->tls, http_cdsa_read, http_cdsa_write);
+ DEBUG_printf(("4_httpTLSStart: SSLSetIOFuncs, error=%d", (int)error));
+ }
+
+ if (!error)
+ {
+ error = SSLSetSessionOption(http->tls, kSSLSessionOptionBreakOnServerAuth,
+ true);
+ DEBUG_printf(("4_httpTLSStart: SSLSetSessionOption, error=%d", (int)error));
+ }
+
+ if (!error)
+ {
+ SSLProtocol minProtocol;
+
+ if (tls_options & _HTTP_TLS_DENY_TLS10)
+ minProtocol = kTLSProtocol11;
+ else if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+ minProtocol = kSSLProtocol3;
+ else
+ minProtocol = kTLSProtocol1;
+
+ error = SSLSetProtocolVersionMin(http->tls, minProtocol);
+ DEBUG_printf(("4_httpTLSStart: SSLSetProtocolVersionMin(%d), error=%d", minProtocol, (int)error));
+ }
+
+# if HAVE_SSLSETENABLEDCIPHERS
+ if (!error)
+ {
+ SSLCipherSuite supported[100]; /* Supported cipher suites */
+ size_t num_supported; /* Number of supported cipher suites */
+ SSLCipherSuite enabled[100]; /* Cipher suites to enable */
+ size_t num_enabled; /* Number of cipher suites to enable */
+
+ num_supported = sizeof(supported) / sizeof(supported[0]);
+ error = SSLGetSupportedCiphers(http->tls, supported, &num_supported);
+
+ if (!error)
+ {
+ DEBUG_printf(("4_httpTLSStart: %d cipher suites supported.", (int)num_supported));
+
+ for (i = 0, num_enabled = 0; i < (int)num_supported && num_enabled < (sizeof(enabled) / sizeof(enabled[0])); i ++)
+ {
+ switch (supported[i])
+ {
+ /* Obviously insecure cipher suites that we never want to use */
+ case SSL_NULL_WITH_NULL_NULL :
+ case SSL_RSA_WITH_NULL_MD5 :
+ case SSL_RSA_WITH_NULL_SHA :
+ case SSL_RSA_EXPORT_WITH_RC4_40_MD5 :
+ case SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 :
+ case SSL_RSA_EXPORT_WITH_DES40_CBC_SHA :
+ case SSL_RSA_WITH_DES_CBC_SHA :
+ case SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA :
+ case SSL_DH_DSS_WITH_DES_CBC_SHA :
+ case SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA :
+ case SSL_DH_RSA_WITH_DES_CBC_SHA :
+ case SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA :
+ case SSL_DHE_DSS_WITH_DES_CBC_SHA :
+ case SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA :
+ case SSL_DHE_RSA_WITH_DES_CBC_SHA :
+ case SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 :
+ case SSL_DH_anon_WITH_RC4_128_MD5 :
+ case SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA :
+ case SSL_DH_anon_WITH_DES_CBC_SHA :
+ case SSL_DH_anon_WITH_3DES_EDE_CBC_SHA :
+ case SSL_FORTEZZA_DMS_WITH_NULL_SHA :
+ case TLS_DH_anon_WITH_AES_128_CBC_SHA :
+ case TLS_DH_anon_WITH_AES_256_CBC_SHA :
+ case TLS_ECDH_ECDSA_WITH_NULL_SHA :
+ case TLS_ECDHE_RSA_WITH_NULL_SHA :
+ case TLS_ECDH_anon_WITH_NULL_SHA :
+ case TLS_ECDH_anon_WITH_RC4_128_SHA :
+ case TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA :
+ case TLS_ECDH_anon_WITH_AES_128_CBC_SHA :
+ case TLS_ECDH_anon_WITH_AES_256_CBC_SHA :
+ case TLS_RSA_WITH_NULL_SHA256 :
+ case TLS_DH_anon_WITH_AES_128_CBC_SHA256 :
+ case TLS_DH_anon_WITH_AES_256_CBC_SHA256 :
+ case TLS_PSK_WITH_NULL_SHA :
+ case TLS_DHE_PSK_WITH_NULL_SHA :
+ case TLS_RSA_PSK_WITH_NULL_SHA :
+ case TLS_DH_anon_WITH_AES_128_GCM_SHA256 :
+ case TLS_DH_anon_WITH_AES_256_GCM_SHA384 :
+ case TLS_PSK_WITH_NULL_SHA256 :
+ case TLS_PSK_WITH_NULL_SHA384 :
+ case TLS_DHE_PSK_WITH_NULL_SHA256 :
+ case TLS_DHE_PSK_WITH_NULL_SHA384 :
+ case TLS_RSA_PSK_WITH_NULL_SHA256 :
+ case TLS_RSA_PSK_WITH_NULL_SHA384 :
+ case SSL_RSA_WITH_DES_CBC_MD5 :
+ DEBUG_printf(("4_httpTLSStart: Excluding insecure cipher suite %d", supported[i]));
+ break;
+
+ /* RC4 cipher suites that should only be used as a last resort */
+ case SSL_RSA_WITH_RC4_128_MD5 :
+ case SSL_RSA_WITH_RC4_128_SHA :
+ case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
+ case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
+ case TLS_ECDH_RSA_WITH_RC4_128_SHA :
+ case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
+ case TLS_PSK_WITH_RC4_128_SHA :
+ case TLS_DHE_PSK_WITH_RC4_128_SHA :
+ case TLS_RSA_PSK_WITH_RC4_128_SHA :
+ if (tls_options & _HTTP_TLS_ALLOW_RC4)
+ enabled[num_enabled ++] = supported[i];
+ else
+ DEBUG_printf(("4_httpTLSStart: Excluding RC4 cipher suite %d", supported[i]));
+ break;
+
+ /* DH/DHE cipher suites that are problematic with parameters < 1024 bits */
+ case TLS_DH_DSS_WITH_AES_128_CBC_SHA :
+ case TLS_DH_RSA_WITH_AES_128_CBC_SHA :
+ case TLS_DHE_DSS_WITH_AES_128_CBC_SHA :
+ case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
+ case TLS_DH_DSS_WITH_AES_256_CBC_SHA :
+ case TLS_DH_RSA_WITH_AES_256_CBC_SHA :
+ case TLS_DHE_DSS_WITH_AES_256_CBC_SHA :
+ case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
+ case TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA :
+ case TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA :
+// case TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA :
+ case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA :
+ case TLS_DH_DSS_WITH_AES_128_CBC_SHA256 :
+ case TLS_DH_RSA_WITH_AES_128_CBC_SHA256 :
+ case TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 :
+ case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
+ case TLS_DH_DSS_WITH_AES_256_CBC_SHA256 :
+ case TLS_DH_RSA_WITH_AES_256_CBC_SHA256 :
+ case TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 :
+ case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
+ case TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA :
+ case TLS_DHE_PSK_WITH_AES_128_CBC_SHA :
+ case TLS_DHE_PSK_WITH_AES_256_CBC_SHA :
+// case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
+// case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
+ case TLS_DH_RSA_WITH_AES_128_GCM_SHA256 :
+ case TLS_DH_RSA_WITH_AES_256_GCM_SHA384 :
+// case TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 :
+// case TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 :
+ case TLS_DH_DSS_WITH_AES_128_GCM_SHA256 :
+ case TLS_DH_DSS_WITH_AES_256_GCM_SHA384 :
+ case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
+ case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
+ case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
+ case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
+ if (tls_options & _HTTP_TLS_ALLOW_DH)
+ enabled[num_enabled ++] = supported[i];
+ else
+ DEBUG_printf(("4_httpTLSStart: Excluding DH/DHE cipher suite %d", supported[i]));
+ break;
+
+ /* Anything else we'll assume is secure */
+ default :
+ enabled[num_enabled ++] = supported[i];
+ break;
+ }
+ }
+
+ DEBUG_printf(("4_httpTLSStart: %d cipher suites enabled.", (int)num_enabled));
+ error = SSLSetEnabledCiphers(http->tls, enabled, num_enabled);
+ }
+ }
+#endif /* HAVE_SSLSETENABLEDCIPHERS */
+
+ if (!error && http->mode == _HTTP_MODE_CLIENT)
+ {
+ /*
+ * Client: set client-side credentials, if any...
+ */
+
+ if (cg->client_cert_cb)
+ {
+ error = SSLSetSessionOption(http->tls,
+ kSSLSessionOptionBreakOnCertRequested, true);
+ DEBUG_printf(("4_httpTLSStart: kSSLSessionOptionBreakOnCertRequested, "
+ "error=%d", (int)error));
+ }
+ else
+ {
+ error = http_cdsa_set_credentials(http);
+ DEBUG_printf(("4_httpTLSStart: http_cdsa_set_credentials, error=%d",
+ (int)error));
+ }
+ }
+ else if (!error)
+ {
+ /*
+ * Server: find/create a certificate for TLS...
+ */
+
+ if (http->fields[HTTP_FIELD_HOST][0])
+ {
+ /*
+ * Use hostname for TLS upgrade...
+ */
+
+ strlcpy(hostname, http->fields[HTTP_FIELD_HOST], sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Resolve hostname from connection address...
+ */
+
+ http_addr_t addr; /* Connection address */
+ socklen_t addrlen; /* Length of address */
+
+ addrlen = sizeof(addr);
+ if (getsockname(http->fd, (struct sockaddr *)&addr, &addrlen))
+ {
+ DEBUG_printf(("4_httpTLSStart: Unable to get socket address: %s", strerror(errno)));
+ hostname[0] = '\0';
+ }
+ else if (httpAddrLocalhost(&addr))
+ hostname[0] = '\0';
+ else
+ {
+ httpAddrLookup(&addr, hostname, sizeof(hostname));
+ DEBUG_printf(("4_httpTLSStart: Resolved socket address to \"%s\".", hostname));
+ }
+ }
+
+#ifdef HAVE_SECKEYCHAINOPEN
+ if (isdigit(hostname[0] & 255) || hostname[0] == '[')
+ hostname[0] = '\0'; /* Don't allow numeric addresses */
+
+ if (hostname[0])
+ http->tls_credentials = http_cdsa_copy_server(hostname);
+ else if (tls_common_name)
+ http->tls_credentials = http_cdsa_copy_server(tls_common_name);
+
+ if (!http->tls_credentials && tls_auto_create && (hostname[0] || tls_common_name))
+ {
+ DEBUG_printf(("4_httpTLSStart: Auto-create credentials for \"%s\".", hostname[0] ? hostname : tls_common_name));
+
+ if (!cupsMakeServerCredentials(tls_keypath, hostname[0] ? hostname : tls_common_name, 0, NULL, time(NULL) + 365 * 86400))
+ {
+ DEBUG_puts("4_httpTLSStart: cupsMakeServerCredentials failed.");
+ http->error = errno = EINVAL;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create server credentials."), 1);
+
+ return (-1);
+ }
+
+ http->tls_credentials = http_cdsa_copy_server(hostname[0] ? hostname : tls_common_name);
+ }
+#endif /* HAVE_SECKEYCHAINOPEN */
+
+ if (!http->tls_credentials)
+ {
+ DEBUG_puts("4_httpTLSStart: Unable to find server credentials.");
+ http->error = errno = EINVAL;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to find server credentials."), 1);
+
+ return (-1);
+ }
+
+ error = SSLSetCertificate(http->tls, http->tls_credentials);
+
+ DEBUG_printf(("4_httpTLSStart: SSLSetCertificate, error=%d", (int)error));
+ }
+
+ DEBUG_printf(("4_httpTLSStart: tls_credentials=%p", http->tls_credentials));
+
+ /*
+ * Let the server know which hostname/domain we are trying to connect to
+ * in case it wants to serve up a certificate with a matching common name.
+ */
+
+ if (!error && http->mode == _HTTP_MODE_CLIENT)
+ {
+ /*
+ * Client: get the hostname to use for TLS...
+ */
+
+ if (httpAddrLocalhost(http->hostaddr))
+ {
+ strlcpy(hostname, "localhost", sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Otherwise make sure the hostname we have does not end in a trailing dot.
+ */
+
+ strlcpy(hostname, http->hostname, sizeof(hostname));
+ if ((hostptr = hostname + strlen(hostname) - 1) >= hostname &&
+ *hostptr == '.')
+ *hostptr = '\0';
+ }
+
+ error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname));
+
+ DEBUG_printf(("4_httpTLSStart: SSLSetPeerDomainName, error=%d", (int)error));
+ }
+
+ if (!error)
+ {
+ int done = 0; /* Are we done yet? */
+
+ while (!error && !done)
+ {
+ error = SSLHandshake(http->tls);
+
+ DEBUG_printf(("4_httpTLSStart: SSLHandshake returned %d.", (int)error));
+
+ switch (error)
+ {
+ case noErr :
+ done = 1;
+ break;
+
+ case errSSLWouldBlock :
+ error = noErr; /* Force a retry */
+ usleep(1000); /* in 1 millisecond */
+ break;
+
+ case errSSLServerAuthCompleted :
+ error = 0;
+ if (cg->server_cert_cb)
+ {
+ error = httpCopyCredentials(http, &credentials);
+ if (!error)
+ {
+ error = (cg->server_cert_cb)(http, http->tls, credentials,
+ cg->server_cert_data);
+ httpFreeCredentials(credentials);
+ }
+
+ DEBUG_printf(("4_httpTLSStart: Server certificate callback "
+ "returned %d.", (int)error));
+ }
+ break;
+
+ case errSSLClientCertRequested :
+ error = 0;
+
+ if (cg->client_cert_cb)
+ {
+ names = NULL;
+ if (!(error = SSLCopyDistinguishedNames(http->tls, &dn_array)) &&
+ dn_array)
+ {
+ if ((names = cupsArrayNew(NULL, NULL)) != NULL)
+ {
+ for (i = 0, count = CFArrayGetCount(dn_array); i < count; i++)
+ {
+ data = (CFDataRef)CFArrayGetValueAtIndex(dn_array, i);
+
+ if ((credential = malloc(sizeof(*credential))) != NULL)
+ {
+ credential->datalen = (size_t)CFDataGetLength(data);
+ if ((credential->data = malloc(credential->datalen)))
+ {
+ memcpy((void *)credential->data, CFDataGetBytePtr(data),
+ credential->datalen);
+ cupsArrayAdd(names, credential);
+ }
+ else
+ free(credential);
+ }
+ }
+ }
+
+ CFRelease(dn_array);
+ }
+
+ if (!error)
+ {
+ error = (cg->client_cert_cb)(http, http->tls, names,
+ cg->client_cert_data);
+
+ DEBUG_printf(("4_httpTLSStart: Client certificate callback "
+ "returned %d.", (int)error));
+ }
+
+ httpFreeCredentials(names);
+ }
+ break;
+
+ case errSSLUnknownRootCert :
+ message = _("Unable to establish a secure connection to host "
+ "(untrusted certificate).");
+ break;
+
+ case errSSLNoRootCert :
+ message = _("Unable to establish a secure connection to host "
+ "(self-signed certificate).");
+ break;
+
+ case errSSLCertExpired :
+ message = _("Unable to establish a secure connection to host "
+ "(expired certificate).");
+ break;
+
+ case errSSLCertNotYetValid :
+ message = _("Unable to establish a secure connection to host "
+ "(certificate not yet valid).");
+ break;
+
+ case errSSLHostNameMismatch :
+ message = _("Unable to establish a secure connection to host "
+ "(host name mismatch).");
+ break;
+
+ case errSSLXCertChainInvalid :
+ message = _("Unable to establish a secure connection to host "
+ "(certificate chain invalid).");
+ break;
+
+ case errSSLConnectionRefused :
+ message = _("Unable to establish a secure connection to host "
+ "(peer dropped connection before responding).");
+ break;
+
+ default :
+ break;
+ }
+ }
+ }
+
+ if (error)
+ {
+ http->error = error;
+ http->status = HTTP_STATUS_ERROR;
+ errno = ECONNREFUSED;
+
+ CFRelease(http->tls);
+ http->tls = NULL;
+
+ /*
+ * If an error string wasn't set by the callbacks use a generic one...
+ */
+
+ if (!message)
+#ifdef HAVE_CSSMERRORSTRING
+ message = cssmErrorString(error);
+#else
+ message = _("Unable to establish a secure connection to host.");
+#endif /* HAVE_CSSMERRORSTRING */
+
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, message, 1);
+
+ return (-1);
+ }
+
+ return (0);
+}
+
+
+/*
+ * '_httpTLSStop()' - Shut down SSL/TLS on a connection.
+ */
+
+void
+_httpTLSStop(http_t *http) /* I - HTTP connection */
+{
+ while (SSLClose(http->tls) == errSSLWouldBlock)
+ usleep(1000);
+
+ CFRelease(http->tls);
+
+ if (http->tls_credentials)
+ CFRelease(http->tls_credentials);
+
+ http->tls = NULL;
+ http->tls_credentials = NULL;
+}
+
+
+/*
+ * '_httpTLSWrite()' - Write to a SSL/TLS connection.
+ */
+
+int /* O - Bytes written */
+_httpTLSWrite(http_t *http, /* I - HTTP connection */
+ const char *buf, /* I - Buffer holding data */
+ int len) /* I - Length of buffer */
+{
+ ssize_t result; /* Return value */
+ OSStatus error; /* Error info */
+ size_t processed; /* Number of bytes processed */
+
+
+ DEBUG_printf(("2_httpTLSWrite(http=%p, buf=%p, len=%d)", http, buf, len));
+
+ error = SSLWrite(http->tls, buf, (size_t)len, &processed);
+
+ switch (error)
+ {
+ case 0 :
+ result = (int)processed;
+ break;
+
+ case errSSLWouldBlock :
+ if (processed)
+ {
+ result = (int)processed;
+ }
+ else
+ {
+ result = -1;
+ errno = EINTR;
+ }
+ break;
+
+ case errSSLClosedGraceful :
+ default :
+ if (processed)
+ {
+ result = (int)processed;
+ }
+ else
+ {
+ result = -1;
+ errno = EPIPE;
+ }
+ break;
+ }
+
+ DEBUG_printf(("3_httpTLSWrite: Returning %d.", (int)result));
+
+ return ((int)result);
+}
+
+
+#ifdef HAVE_SECKEYCHAINOPEN
+/*
+ * 'http_cdsa_copy_server()' - Find and copy server credentials from the keychain.
+ */
+
+static CFArrayRef /* O - Array of certificates or NULL */
+http_cdsa_copy_server(
+ const char *common_name) /* I - Server's hostname */
+{
+ OSStatus err; /* Error info */
+ SecIdentitySearchRef search = NULL; /* Search reference */
+ SecIdentityRef identity = NULL;/* Identity */
+ CFArrayRef certificates = NULL;
+ /* Certificate array */
+ SecPolicyRef policy = NULL; /* Policy ref */
+ CFStringRef cfcommon_name = NULL;
+ /* Server name */
+ CFMutableDictionaryRef query = NULL; /* Query qualifiers */
+ CFArrayRef list = NULL; /* Keychain list */
+
+
+ cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8);
+
+ policy = SecPolicyCreateSSL(1, cfcommon_name);
+
+ if (cfcommon_name)
+ CFRelease(cfcommon_name);
+
+ if (!policy)
+ goto cleanup;
+
+ if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)))
+ goto cleanup;
+
+ _cupsMutexLock(&tls_mutex);
+
+ list = CFArrayCreate(kCFAllocatorDefault, (const void **)&tls_keychain, 1, &kCFTypeArrayCallBacks);
+
+ CFDictionaryAddValue(query, kSecClass, kSecClassIdentity);
+ CFDictionaryAddValue(query, kSecMatchPolicy, policy);
+ CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue);
+ CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne);
+ CFDictionaryAddValue(query, kSecMatchSearchList, list);
+
+ CFRelease(list);
+
+ err = SecItemCopyMatching(query, (CFTypeRef *)&identity);
+
+ _cupsMutexUnlock(&tls_mutex);
+
+ if (err)
+ goto cleanup;
+
+ if (CFGetTypeID(identity) != SecIdentityGetTypeID())
+ goto cleanup;
+
+ if ((certificates = CFArrayCreate(NULL, (const void **)&identity, 1, &kCFTypeArrayCallBacks)) == NULL)
+ goto cleanup;
+
+ cleanup :
+
+ if (search)
+ CFRelease(search);
+ if (identity)
+ CFRelease(identity);
+
+ if (policy)
+ CFRelease(policy);
+ if (query)
+ CFRelease(query);
+
+ return (certificates);
+}
+#endif /* HAVE_SECKEYCHAINOPEN */
+
+
+/*
+ * 'http_cdsa_create_credential()' - Create a single credential in the internal format.
+ */
+
+static SecCertificateRef /* O - Certificate */
+http_cdsa_create_credential(
+ http_credential_t *credential) /* I - Credential */
+{
+ if (!credential)
+ return (NULL);
+
+ return (SecCertificateCreateWithBytes(kCFAllocatorDefault, credential->data, (CFIndex)credential->datalen));
+}
+
+
+/*
+ * 'http_cdsa_default_path()' - Get the default keychain path.
+ */
+
+static const char * /* O - Keychain path */
+http_cdsa_default_path(char *buffer, /* I - Path buffer */
+ size_t bufsize) /* I - Size of buffer */
+{
+ const char *home = getenv("HOME"); /* HOME environment variable */
+
+
+ if (getuid() && home)
+ snprintf(buffer, bufsize, "%s/Library/Keychains/login.keychain", home);
+ else
+ strlcpy(buffer, "/Library/Keychains/System.keychain", bufsize);
+
+ DEBUG_printf(("1http_cdsa_default_path: Using default path \"%s\".", buffer));
+
+ return (buffer);
+}
+
+
+/*
+ * 'http_cdsa_read()' - Read function for the CDSA library.
+ */
+
+static OSStatus /* O - -1 on error, 0 on success */
+http_cdsa_read(
+ SSLConnectionRef connection, /* I - SSL/TLS connection */
+ void *data, /* I - Data buffer */
+ size_t *dataLength) /* IO - Number of bytes */
+{
+ OSStatus result; /* Return value */
+ ssize_t bytes; /* Number of bytes read */
+ http_t *http; /* HTTP connection */
+
+
+ http = (http_t *)connection;
+
+ if (!http->blocking)
+ {
+ /*
+ * Make sure we have data before we read...
+ */
+
+ while (!_httpWait(http, http->wait_value, 0))
+ {
+ if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
+ continue;
+
+ http->error = ETIMEDOUT;
+ return (-1);
+ }
+ }
+
+ do
+ {
+ bytes = recv(http->fd, data, *dataLength, 0);
+ }
+ while (bytes == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if ((size_t)bytes == *dataLength)
+ {
+ result = 0;
+ }
+ else if (bytes > 0)
+ {
+ *dataLength = (size_t)bytes;
+ result = errSSLWouldBlock;
+ }
+ else
+ {
+ *dataLength = 0;
+
+ if (bytes == 0)
+ result = errSSLClosedGraceful;
+ else if (errno == EAGAIN)
+ result = errSSLWouldBlock;
+ else
+ result = errSSLClosedAbort;
+ }
+
+ return (result);
+}
+
+
+/*
+ * 'http_cdsa_set_credentials()' - Set the TLS credentials.
+ */
+
+static int /* O - Status of connection */
+http_cdsa_set_credentials(http_t *http) /* I - HTTP connection */
+{
+ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
+ OSStatus error = 0; /* Error code */
+ http_tls_credentials_t credentials = NULL;
+ /* TLS credentials */
+
+
+ DEBUG_printf(("7http_tls_set_credentials(%p)", http));
+
+ /*
+ * Prefer connection specific credentials...
+ */
+
+ if ((credentials = http->tls_credentials) == NULL)
+ credentials = cg->tls_credentials;
+
+ if (credentials)
+ {
+ error = SSLSetCertificate(http->tls, credentials);
+ DEBUG_printf(("4http_tls_set_credentials: SSLSetCertificate, error=%d",
+ (int)error));
+ }
+ else
+ DEBUG_puts("4http_tls_set_credentials: No credentials to set.");
+
+ return (error);
+}
+
+
+/*
+ * 'http_cdsa_write()' - Write function for the CDSA library.
+ */
+
+static OSStatus /* O - -1 on error, 0 on success */
+http_cdsa_write(
+ SSLConnectionRef connection, /* I - SSL/TLS connection */
+ const void *data, /* I - Data buffer */
+ size_t *dataLength) /* IO - Number of bytes */
+{
+ OSStatus result; /* Return value */
+ ssize_t bytes; /* Number of bytes read */
+ http_t *http; /* HTTP connection */
+
+
+ http = (http_t *)connection;
+
+ do
+ {
+ bytes = write(http->fd, data, *dataLength);
+ }
+ while (bytes == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if ((size_t)bytes == *dataLength)
+ {
+ result = 0;
+ }
+ else if (bytes >= 0)
+ {
+ *dataLength = (size_t)bytes;
+ result = errSSLWouldBlock;
+ }
+ else
+ {
+ *dataLength = 0;
+
+ if (errno == EAGAIN)
+ result = errSSLWouldBlock;
+ else
+ result = errSSLClosedAbort;
+ }
+
+ return (result);
+}
+
+
+/*
+ * End of "$Id: tls-darwin.c 12675 2015-05-28 01:14:32Z msweet $".
+ */
diff --git a/cups/tls-gnutls.c b/cups/tls-gnutls.c
new file mode 100644
index 0000000..3da05e2
--- /dev/null
+++ b/cups/tls-gnutls.c
@@ -0,0 +1,1345 @@
+/*
+ * "$Id: tls-gnutls.c 12670 2015-05-27 19:48:05Z msweet $"
+ *
+ * TLS support code for CUPS using GNU TLS.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/**** This file is included from tls.c ****/
+
+/*
+ * Include necessary headers...
+ */
+
+#include <sys/stat.h>
+
+
+/*
+ * Local globals...
+ */
+
+static int tls_auto_create = 0;
+ /* Auto-create self-signed certs? */
+static char *tls_common_name = NULL;
+ /* Default common name */
+static char *tls_keypath = NULL;
+ /* Server cert keychain path */
+static _cups_mutex_t tls_mutex = _CUPS_MUTEX_INITIALIZER;
+ /* Mutex for keychain/certs */
+static int tls_options = -1;/* Options for TLS connections */
+
+
+/*
+ * Local functions...
+ */
+
+static gnutls_x509_crt_t http_gnutls_create_credential(http_credential_t *credential);
+static const char *http_gnutls_default_path(char *buffer, size_t bufsize);
+static const char *http_gnutls_make_path(char *buffer, size_t bufsize, const char *dirname, const char *filename, const char *ext);
+static ssize_t http_gnutls_read(gnutls_transport_ptr_t ptr, void *data, size_t length);
+static ssize_t http_gnutls_write(gnutls_transport_ptr_t ptr, const void *data, size_t length);
+
+
+/*
+ * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsMakeServerCredentials(
+ const char *path, /* I - Path to keychain/directory */
+ const char *common_name, /* I - Common name */
+ int num_alt_names, /* I - Number of subject alternate names */
+ const char **alt_names, /* I - Subject Alternate Names */
+ time_t expiration_date) /* I - Expiration date */
+{
+ gnutls_x509_crt_t crt; /* Self-signed certificate */
+ gnutls_x509_privkey_t key; /* Encryption private key */
+ char temp[1024], /* Temporary directory name */
+ crtfile[1024], /* Certificate filename */
+ keyfile[1024]; /* Private key filename */
+ cups_lang_t *language; /* Default language info */
+ cups_file_t *fp; /* Key/cert file */
+ unsigned char buffer[8192]; /* Buffer for x509 data */
+ size_t bytes; /* Number of bytes of data */
+ unsigned char serial[4]; /* Serial number buffer */
+ time_t curtime; /* Current time */
+ int result; /* Result of GNU TLS calls */
+
+
+ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date));
+
+ /*
+ * Filenames...
+ */
+
+ if (!path)
+ path = http_gnutls_default_path(temp, sizeof(temp));
+
+ if (!path || !common_name)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ http_gnutls_make_path(crtfile, sizeof(crtfile), path, common_name, "crt");
+ http_gnutls_make_path(keyfile, sizeof(keyfile), path, common_name, "key");
+
+ /*
+ * Create the encryption key...
+ */
+
+ DEBUG_puts("1cupsMakeServerCredentials: Creating key pair.");
+
+ gnutls_x509_privkey_init(&key);
+ gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, 2048, 0);
+
+ DEBUG_puts("1cupsMakeServerCredentials: Key pair created.");
+
+ /*
+ * Save it...
+ */
+
+ bytes = sizeof(buffer);
+
+ if ((result = gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, buffer, &bytes)) < 0)
+ {
+ DEBUG_printf(("1cupsMakeServerCredentials: Unable to export private key: %s", gnutls_strerror(result)));
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gnutls_strerror(result), 0);
+ gnutls_x509_privkey_deinit(key);
+ return (0);
+ }
+ else if ((fp = cupsFileOpen(keyfile, "w")) != NULL)
+ {
+ DEBUG_printf(("1cupsMakeServerCredentials: Writing private key to \"%s\".", keyfile));
+ cupsFileWrite(fp, (char *)buffer, bytes);
+ cupsFileClose(fp);
+ }
+ else
+ {
+ DEBUG_printf(("1cupsMakeServerCredentials: Unable to create private key file \"%s\": %s", keyfile, strerror(errno)));
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
+ gnutls_x509_privkey_deinit(key);
+ return (0);
+ }
+
+ /*
+ * Create the self-signed certificate...
+ */
+
+ DEBUG_puts("1cupsMakeServerCredentials: Generating self-signed X.509 certificate.");
+
+ language = cupsLangDefault();
+ curtime = time(NULL);
+ serial[0] = curtime >> 24;
+ serial[1] = curtime >> 16;
+ serial[2] = curtime >> 8;
+ serial[3] = curtime;
+
+ gnutls_x509_crt_init(&crt);
+ if (strlen(language->language) == 5)
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0,
+ language->language + 3, 2);
+ else
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0,
+ "US", 2);
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COMMON_NAME, 0,
+ common_name, strlen(common_name));
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATION_NAME, 0,
+ common_name, strlen(common_name));
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME,
+ 0, "Unknown", 7);
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0,
+ "Unknown", 7);
+ gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_LOCALITY_NAME, 0,
+ "Unknown", 7);
+/* gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_PKCS9_EMAIL, 0,
+ ServerAdmin, strlen(ServerAdmin));*/
+ gnutls_x509_crt_set_key(crt, key);
+ gnutls_x509_crt_set_serial(crt, serial, sizeof(serial));
+ gnutls_x509_crt_set_activation_time(crt, curtime);
+ gnutls_x509_crt_set_expiration_time(crt, curtime + 10 * 365 * 86400);
+ gnutls_x509_crt_set_ca_status(crt, 0);
+ if (num_alt_names > 0)
+ gnutls_x509_crt_set_subject_alternative_name(crt, GNUTLS_SAN_DNSNAME, alt_names[0]);
+ gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0);
+ gnutls_x509_crt_set_key_usage(crt, GNUTLS_KEY_KEY_ENCIPHERMENT);
+ gnutls_x509_crt_set_version(crt, 3);
+
+ bytes = sizeof(buffer);
+ if (gnutls_x509_crt_get_key_id(crt, 0, buffer, &bytes) >= 0)
+ gnutls_x509_crt_set_subject_key_id(crt, buffer, bytes);
+
+ gnutls_x509_crt_sign(crt, crt, key);
+
+ /*
+ * Save it...
+ */
+
+ bytes = sizeof(buffer);
+ if ((result = gnutls_x509_crt_export(crt, GNUTLS_X509_FMT_PEM, buffer, &bytes)) < 0)
+ {
+ DEBUG_printf(("1cupsMakeServerCredentials: Unable to export public key and X.509 certificate: %s", gnutls_strerror(result)));
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gnutls_strerror(result), 0);
+ gnutls_x509_crt_deinit(crt);
+ gnutls_x509_privkey_deinit(key);
+ return (0);
+ }
+ else if ((fp = cupsFileOpen(crtfile, "w")) != NULL)
+ {
+ DEBUG_printf(("1cupsMakeServerCredentials: Writing public key and X.509 certificate to \"%s\".", crtfile));
+ cupsFileWrite(fp, (char *)buffer, bytes);
+ cupsFileClose(fp);
+ }
+ else
+ {
+ DEBUG_printf(("1cupsMakeServerCredentials: Unable to create public key and X.509 certificate file \"%s\": %s", crtfile, strerror(errno)));
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
+ gnutls_x509_crt_deinit(crt);
+ gnutls_x509_privkey_deinit(key);
+ return (0);
+ }
+
+ /*
+ * Cleanup...
+ */
+
+ gnutls_x509_crt_deinit(crt);
+ gnutls_x509_privkey_deinit(key);
+
+ DEBUG_puts("1cupsMakeServerCredentials: Successfully created credentials.");
+
+ return (1);
+}
+
+
+/*
+ * 'cupsSetServerCredentials()' - Set the default server credentials.
+ *
+ * Note: The server credentials are used by all threads in the running process.
+ * This function is threadsafe.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsSetServerCredentials(
+ const char *path, /* I - Path to keychain/directory */
+ const char *common_name, /* I - Default common name for server */
+ int auto_create) /* I - 1 = automatically create self-signed certificates */
+{
+ char temp[1024]; /* Default path buffer */
+
+
+ DEBUG_printf(("cupsSetServerCredentials(path=\"%s\", common_name=\"%s\", auto_create=%d)", path, common_name, auto_create));
+
+ /*
+ * Use defaults as needed...
+ */
+
+ if (!path)
+ path = http_gnutls_default_path(temp, sizeof(temp));
+
+ /*
+ * Range check input...
+ */
+
+ if (!path || !common_name)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ _cupsMutexLock(&tls_mutex);
+
+ /*
+ * Free old values...
+ */
+
+ if (tls_keypath)
+ _cupsStrFree(tls_keypath);
+
+ if (tls_common_name)
+ _cupsStrFree(tls_common_name);
+
+ /*
+ * Save the new values...
+ */
+
+ tls_keypath = _cupsStrAlloc(path);
+ tls_auto_create = auto_create;
+ tls_common_name = _cupsStrAlloc(common_name);
+
+ _cupsMutexUnlock(&tls_mutex);
+
+ return (1);
+}
+
+
+/*
+ * 'httpCopyCredentials()' - Copy the credentials associated with the peer in
+ * an encrypted connection.
+ *
+ * @since CUPS 1.5/OS X 10.7@
+ */
+
+int /* O - Status of call (0 = success) */
+httpCopyCredentials(
+ http_t *http, /* I - Connection to server */
+ cups_array_t **credentials) /* O - Array of credentials */
+{
+ unsigned count; /* Number of certificates */
+ const gnutls_datum_t *certs; /* Certificates */
+
+
+ DEBUG_printf(("httpCopyCredentials(http=%p, credentials=%p)", http, credentials));
+
+ if (credentials)
+ *credentials = NULL;
+
+ if (!http || !http->tls || !credentials)
+ return (-1);
+
+ *credentials = cupsArrayNew(NULL, NULL);
+ certs = gnutls_certificate_get_peers(http->tls, &count);
+
+ DEBUG_printf(("1httpCopyCredentials: certs=%p, count=%u", certs, count));
+
+ if (certs && count)
+ {
+ while (count > 0)
+ {
+ httpAddCredential(*credentials, certs->data, certs->size);
+ certs ++;
+ count --;
+ }
+ }
+
+ return (0);
+}
+
+
+/*
+ * '_httpCreateCredentials()' - Create credentials in the internal format.
+ */
+
+http_tls_credentials_t /* O - Internal credentials */
+_httpCreateCredentials(
+ cups_array_t *credentials) /* I - Array of credentials */
+{
+ (void)credentials;
+
+ return (NULL);
+}
+
+
+/*
+ * '_httpFreeCredentials()' - Free internal credentials.
+ */
+
+void
+_httpFreeCredentials(
+ http_tls_credentials_t credentials) /* I - Internal credentials */
+{
+ (void)credentials;
+}
+
+
+/*
+ * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 if valid, 0 otherwise */
+httpCredentialsAreValidForName(
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Name to check */
+{
+ gnutls_x509_crt_t cert; /* Certificate */
+ int result = 0; /* Result */
+
+
+ cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials));
+ if (cert)
+ {
+ result = gnutls_x509_crt_check_hostname(cert, common_name) != 0;
+ gnutls_x509_crt_deinit(cert);
+ }
+
+ return (result);
+}
+
+
+/*
+ * 'httpCredentialsGetTrust()' - Return the trust of credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+http_trust_t /* O - Level of trust */
+httpCredentialsGetTrust(
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Common name for trust lookup */
+{
+ http_trust_t trust = HTTP_TRUST_OK;
+ /* Trusted? */
+ gnutls_x509_crt_t cert; /* Certificate */
+ cups_array_t *tcreds = NULL; /* Trusted credentials */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Per-thread globals */
+
+
+ if (!common_name)
+ return (HTTP_TRUST_UNKNOWN);
+
+ if ((cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+ return (HTTP_TRUST_UNKNOWN);
+
+ if (cg->any_root < 0)
+ _cupsSetDefaults();
+
+ /*
+ * Look this common name up in the default keychains...
+ */
+
+ httpLoadCredentials(NULL, &tcreds, common_name);
+
+ if (tcreds)
+ {
+ char credentials_str[1024], /* String for incoming credentials */
+ tcreds_str[1024]; /* String for saved credentials */
+
+ httpCredentialsString(credentials, credentials_str, sizeof(credentials_str));
+ httpCredentialsString(tcreds, tcreds_str, sizeof(tcreds_str));
+
+ if (strcmp(credentials_str, tcreds_str))
+ {
+ /*
+ * Credentials don't match, let's look at the expiration date of the new
+ * credentials and allow if the new ones have a later expiration...
+ */
+
+ if (httpCredentialsGetExpiration(credentials) <= httpCredentialsGetExpiration(tcreds) ||
+ !httpCredentialsAreValidForName(credentials, common_name))
+ {
+ /*
+ * Either the new credentials are not newly issued, or the common name
+ * does not match the issued certificate...
+ */
+
+ trust = HTTP_TRUST_INVALID;
+ }
+ else if (httpCredentialsGetExpiration(tcreds) < time(NULL))
+ {
+ /*
+ * Save the renewed credentials...
+ */
+
+ trust = HTTP_TRUST_RENEWED;
+
+ httpSaveCredentials(NULL, credentials, common_name);
+ }
+ }
+
+ httpFreeCredentials(tcreds);
+ }
+ else if (cg->validate_certs && !httpCredentialsAreValidForName(credentials, common_name))
+ trust = HTTP_TRUST_INVALID;
+
+ if (trust == HTTP_TRUST_OK && !cg->expired_certs)
+ {
+ time_t curtime; /* Current date/time */
+
+ time(&curtime);
+ if (curtime < gnutls_x509_crt_get_activation_time(cert) ||
+ curtime > gnutls_x509_crt_get_expiration_time(cert))
+ trust = HTTP_TRUST_EXPIRED;
+ }
+
+ if (trust == HTTP_TRUST_OK && !cg->any_root && cupsArrayCount(credentials) == 1)
+ trust = HTTP_TRUST_INVALID;
+
+ gnutls_x509_crt_deinit(cert);
+
+ return (trust);
+}
+
+
+/*
+ * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+time_t /* O - Expiration date of credentials */
+httpCredentialsGetExpiration(
+ cups_array_t *credentials) /* I - Credentials */
+{
+ gnutls_x509_crt_t cert; /* Certificate */
+ time_t result = 0; /* Result */
+
+
+ cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials));
+ if (cert)
+ {
+ result = gnutls_x509_crt_get_expiration_time(cert);
+ gnutls_x509_crt_deinit(cert);
+ }
+
+ return (result);
+}
+
+
+/*
+ * 'httpCredentialsString()' - Return a string representing the credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+size_t /* O - Total size of credentials string */
+httpCredentialsString(
+ cups_array_t *credentials, /* I - Credentials */
+ char *buffer, /* I - Buffer or @code NULL@ */
+ size_t bufsize) /* I - Size of buffer */
+{
+ http_credential_t *first; /* First certificate */
+ gnutls_x509_crt_t cert; /* Certificate */
+
+
+ DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize));
+
+ if (!buffer)
+ return (0);
+
+ if (buffer && bufsize > 0)
+ *buffer = '\0';
+
+ if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL &&
+ (cert = http_gnutls_create_credential(first)) != NULL)
+ {
+ char name[256]; /* Common name associated with cert */
+ size_t namelen; /* Length of name */
+ time_t expiration; /* Expiration date of cert */
+ _cups_md5_state_t md5_state; /* MD5 state */
+ unsigned char md5_digest[16]; /* MD5 result */
+
+ namelen = sizeof(name) - 1;
+ if (gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, name, &namelen) >= 0)
+ name[namelen] = '\0';
+ else
+ strlcpy(name, "unknown", sizeof(name));
+
+ expiration = gnutls_x509_crt_get_expiration_time(cert);
+
+ _cupsMD5Init(&md5_state);
+ _cupsMD5Append(&md5_state, first->data, (int)first->datalen);
+ _cupsMD5Finish(&md5_state, md5_digest);
+
+ snprintf(buffer, bufsize, "%s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", name, httpGetDateString(expiration), md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]);
+
+ gnutls_x509_crt_deinit(cert);
+ }
+
+ DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer));
+
+ return (strlen(buffer));
+}
+
+
+/*
+ * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 0 on success, -1 on error */
+httpLoadCredentials(
+ const char *path, /* I - Keychain/PKCS#12 path */
+ cups_array_t **credentials, /* IO - Credentials */
+ const char *common_name) /* I - Common name for credentials */
+{
+ cups_file_t *fp; /* Certificate file */
+ char filename[1024], /* filename.crt */
+ temp[1024], /* Temporary string */
+ line[256]; /* Base64-encoded line */
+ unsigned char *data = NULL; /* Buffer for cert data */
+ size_t alloc_data = 0, /* Bytes allocated */
+ num_data = 0; /* Bytes used */
+ int decoded; /* Bytes decoded */
+
+
+ if (!credentials || !common_name)
+ return (-1);
+
+ if (!path)
+ path = http_gnutls_default_path(temp, sizeof(temp));
+ if (!path)
+ return (-1);
+
+ http_gnutls_make_path(filename, sizeof(filename), path, common_name, "crt");
+
+ if ((fp = cupsFileOpen(filename, "r")) == NULL)
+ return (-1);
+
+ while (cupsFileGets(fp, line, sizeof(line)))
+ {
+ if (!strcmp(line, "-----BEGIN CERTIFICATE-----"))
+ {
+ if (num_data)
+ {
+ /*
+ * Missing END CERTIFICATE...
+ */
+
+ httpFreeCredentials(*credentials);
+ *credentials = NULL;
+ break;
+ }
+ }
+ else if (!strcmp(line, "-----END CERTIFICATE-----"))
+ {
+ if (!num_data)
+ {
+ /*
+ * Missing data...
+ */
+
+ httpFreeCredentials(*credentials);
+ *credentials = NULL;
+ break;
+ }
+
+ if (!*credentials)
+ *credentials = cupsArrayNew(NULL, NULL);
+
+ if (httpAddCredential(*credentials, data, num_data))
+ {
+ httpFreeCredentials(*credentials);
+ *credentials = NULL;
+ break;
+ }
+
+ num_data = 0;
+ }
+ else
+ {
+ if (alloc_data == 0)
+ {
+ data = malloc(2048);
+ alloc_data = 2048;
+
+ if (!data)
+ break;
+ }
+ else if ((num_data + strlen(line)) >= alloc_data)
+ {
+ unsigned char *tdata = realloc(data, alloc_data + 1024);
+ /* Expanded buffer */
+
+ if (!tdata)
+ {
+ httpFreeCredentials(*credentials);
+ *credentials = NULL;
+ break;
+ }
+
+ data = tdata;
+ alloc_data += 1024;
+ }
+
+ decoded = alloc_data - num_data;
+ httpDecode64_2((char *)data + num_data, &decoded, line);
+ num_data += (size_t)decoded;
+ }
+ }
+
+ cupsFileClose(fp);
+
+ if (num_data)
+ {
+ /*
+ * Missing END CERTIFICATE...
+ */
+
+ httpFreeCredentials(*credentials);
+ *credentials = NULL;
+ }
+
+ if (data)
+ free(data);
+
+ return (*credentials ? 0 : -1);
+}
+
+
+/*
+ * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - -1 on error, 0 on success */
+httpSaveCredentials(
+ const char *path, /* I - Keychain/PKCS#12 path */
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Common name for credentials */
+{
+ cups_file_t *fp; /* Certificate file */
+ char filename[1024], /* filename.crt */
+ nfilename[1024],/* filename.crt.N */
+ temp[1024], /* Temporary string */
+ line[256]; /* Base64-encoded line */
+ const unsigned char *ptr; /* Pointer into certificate */
+ ssize_t remaining; /* Bytes left */
+ http_credential_t *cred; /* Current credential */
+
+
+ if (!credentials || !common_name)
+ return (-1);
+
+ if (!path)
+ path = http_gnutls_default_path(temp, sizeof(temp));
+ if (!path)
+ return (-1);
+
+ http_gnutls_make_path(filename, sizeof(filename), path, common_name, "crt");
+ snprintf(nfilename, sizeof(nfilename), "%s.N", filename);
+
+ if ((fp = cupsFileOpen(nfilename, "w")) == NULL)
+ return (-1);
+
+ fchmod(cupsFileNumber(fp), 0600);
+
+ for (cred = (http_credential_t *)cupsArrayFirst(credentials);
+ cred;
+ cred = (http_credential_t *)cupsArrayNext(credentials))
+ {
+ cupsFilePuts(fp, "-----BEGIN CERTIFICATE-----\n");
+ for (ptr = cred->data, remaining = (ssize_t)cred->datalen; remaining > 0; remaining -= 45, ptr += 45)
+ {
+ httpEncode64_2(line, sizeof(line), (char *)ptr, remaining > 45 ? 45 : remaining);
+ cupsFilePrintf(fp, "%s\n", line);
+ }
+ cupsFilePuts(fp, "-----END CERTIFICATE-----\n");
+ }
+
+ cupsFileClose(fp);
+
+ return (rename(nfilename, filename));
+}
+
+
+/*
+ * 'http_gnutls_create_credential()' - Create a single credential in the internal format.
+ */
+
+static gnutls_x509_crt_t /* O - Certificate */
+http_gnutls_create_credential(
+ http_credential_t *credential) /* I - Credential */
+{
+ int result; /* Result from GNU TLS */
+ gnutls_x509_crt_t cert; /* Certificate */
+ gnutls_datum_t datum; /* Data record */
+
+
+ DEBUG_printf(("3http_gnutls_create_credential(credential=%p)", credential));
+
+ if (!credential)
+ return (NULL);
+
+ if ((result = gnutls_x509_crt_init(&cert)) < 0)
+ {
+ DEBUG_printf(("4http_gnutls_create_credential: init error: %s", gnutls_strerror(result)));
+ return (NULL);
+ }
+
+ datum.data = credential->data;
+ datum.size = credential->datalen;
+
+ if ((result = gnutls_x509_crt_import(cert, &datum, GNUTLS_X509_FMT_DER)) < 0)
+ {
+ DEBUG_printf(("4http_gnutls_create_credential: import error: %s", gnutls_strerror(result)));
+
+ gnutls_x509_crt_deinit(cert);
+ return (NULL);
+ }
+
+ return (cert);
+}
+
+
+/*
+ * 'http_gnutls_default_path()' - Get the default credential store path.
+ */
+
+static const char * /* O - Path or NULL on error */
+http_gnutls_default_path(char *buffer,/* I - Path buffer */
+ size_t bufsize)/* I - Size of path buffer */
+{
+ const char *home = getenv("HOME"); /* HOME environment variable */
+
+
+ if (getuid() && home)
+ {
+ snprintf(buffer, bufsize, "%s/.cups", home);
+ if (access(buffer, 0))
+ {
+ DEBUG_printf(("1http_gnutls_default_path: Making directory \"%s\".", buffer));
+ if (mkdir(buffer, 0700))
+ {
+ DEBUG_printf(("1http_gnutls_default_path: Failed to make directory: %s", strerror(errno)));
+ return (NULL);
+ }
+ }
+
+ snprintf(buffer, bufsize, "%s/.cups/ssl", home);
+ if (access(buffer, 0))
+ {
+ DEBUG_printf(("1http_gnutls_default_path: Making directory \"%s\".", buffer));
+ if (mkdir(buffer, 0700))
+ {
+ DEBUG_printf(("1http_gnutls_default_path: Failed to make directory: %s", strerror(errno)));
+ return (NULL);
+ }
+ }
+ }
+ else
+ strlcpy(buffer, CUPS_SERVERROOT "/ssl", bufsize);
+
+ DEBUG_printf(("1http_gnutls_default_path: Using default path \"%s\".", buffer));
+
+ return (buffer);
+}
+
+
+/*
+ * 'http_gnutls_make_path()' - Format a filename for a certificate or key file.
+ */
+
+static const char * /* O - Filename */
+http_gnutls_make_path(
+ char *buffer, /* I - Filename buffer */
+ size_t bufsize, /* I - Size of buffer */
+ const char *dirname, /* I - Directory */
+ const char *filename, /* I - Filename (usually hostname) */
+ const char *ext) /* I - Extension */
+{
+ char *bufptr, /* Pointer into buffer */
+ *bufend = buffer + bufsize - 1; /* End of buffer */
+
+
+ snprintf(buffer, bufsize, "%s/", dirname);
+ bufptr = buffer + strlen(buffer);
+
+ while (*filename && bufptr < bufend)
+ {
+ if (_cups_isalnum(*filename) || *filename == '-' || *filename == '.')
+ *bufptr++ = *filename;
+ else
+ *bufptr++ = '_';
+
+ filename ++;
+ }
+
+ if (bufptr < bufend)
+ *bufptr++ = '.';
+
+ strlcpy(bufptr, ext, (size_t)(bufend - bufptr + 1));
+
+ return (buffer);
+}
+
+
+/*
+ * 'http_gnutls_read()' - Read function for the GNU TLS library.
+ */
+
+static ssize_t /* O - Number of bytes read or -1 on error */
+http_gnutls_read(
+ gnutls_transport_ptr_t ptr, /* I - Connection to server */
+ void *data, /* I - Buffer */
+ size_t length) /* I - Number of bytes to read */
+{
+ http_t *http; /* HTTP connection */
+ ssize_t bytes; /* Bytes read */
+
+
+ DEBUG_printf(("6http_gnutls_read(ptr=%p, data=%p, length=%d)", ptr, data, (int)length));
+
+ http = (http_t *)ptr;
+
+ if (!http->blocking)
+ {
+ /*
+ * Make sure we have data before we read...
+ */
+
+ while (!_httpWait(http, http->wait_value, 0))
+ {
+ if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
+ continue;
+
+ http->error = ETIMEDOUT;
+ return (-1);
+ }
+ }
+
+ bytes = recv(http->fd, data, length, 0);
+ DEBUG_printf(("6http_gnutls_read: bytes=%d", (int)bytes));
+ return (bytes);
+}
+
+
+/*
+ * 'http_gnutls_write()' - Write function for the GNU TLS library.
+ */
+
+static ssize_t /* O - Number of bytes written or -1 on error */
+http_gnutls_write(
+ gnutls_transport_ptr_t ptr, /* I - Connection to server */
+ const void *data, /* I - Data buffer */
+ size_t length) /* I - Number of bytes to write */
+{
+ ssize_t bytes; /* Bytes written */
+
+
+ DEBUG_printf(("6http_gnutls_write(ptr=%p, data=%p, length=%d)", ptr, data,
+ (int)length));
+ bytes = send(((http_t *)ptr)->fd, data, length, 0);
+ DEBUG_printf(("http_gnutls_write: bytes=%d", (int)bytes));
+
+ return (bytes);
+}
+
+
+/*
+ * '_httpTLSInitialize()' - Initialize the TLS stack.
+ */
+
+void
+_httpTLSInitialize(void)
+{
+ /*
+ * Initialize GNU TLS...
+ */
+
+ gnutls_global_init();
+}
+
+
+/*
+ * '_httpTLSPending()' - Return the number of pending TLS-encrypted bytes.
+ */
+
+size_t /* O - Bytes available */
+_httpTLSPending(http_t *http) /* I - HTTP connection */
+{
+ return (gnutls_record_check_pending(http->tls));
+}
+
+
+/*
+ * '_httpTLSRead()' - Read from a SSL/TLS connection.
+ */
+
+int /* O - Bytes read */
+_httpTLSRead(http_t *http, /* I - Connection to server */
+ char *buf, /* I - Buffer to store data */
+ int len) /* I - Length of buffer */
+{
+ ssize_t result; /* Return value */
+
+
+ result = gnutls_record_recv(http->tls, buf, (size_t)len);
+
+ if (result < 0 && !errno)
+ {
+ /*
+ * Convert GNU TLS error to errno value...
+ */
+
+ switch (result)
+ {
+ case GNUTLS_E_INTERRUPTED :
+ errno = EINTR;
+ break;
+
+ case GNUTLS_E_AGAIN :
+ errno = EAGAIN;
+ break;
+
+ default :
+ errno = EPIPE;
+ break;
+ }
+
+ result = -1;
+ }
+
+ return ((int)result);
+}
+
+
+/*
+ * '_httpTLSSetCredentials()' - Set the TLS credentials.
+ */
+
+int /* O - Status of connection */
+_httpTLSSetCredentials(http_t *http) /* I - Connection to server */
+{
+ (void)http;
+
+ return (0);
+}
+
+
+/*
+ * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options.
+ */
+
+void
+_httpTLSSetOptions(int options) /* I - Options */
+{
+ tls_options = options;
+}
+
+
+/*
+ * '_httpTLSStart()' - Set up SSL/TLS support on a connection.
+ */
+
+int /* O - 0 on success, -1 on failure */
+_httpTLSStart(http_t *http) /* I - Connection to server */
+{
+ char hostname[256], /* Hostname */
+ *hostptr; /* Pointer into hostname */
+ int status; /* Status of handshake */
+ gnutls_certificate_credentials_t *credentials;
+ /* TLS credentials */
+ char priority_string[1024];
+ /* Priority string */
+
+
+ DEBUG_printf(("3_httpTLSStart(http=%p)", http));
+
+ if (tls_options < 0)
+ {
+ DEBUG_puts("4_httpTLSStart: Setting defaults.");
+ _cupsSetDefaults();
+ DEBUG_printf(("4_httpTLSStart: tls_options=%x", tls_options));
+ }
+
+ if (http->mode == _HTTP_MODE_SERVER && !tls_keypath)
+ {
+ DEBUG_puts("4_httpTLSStart: cupsSetServerCredentials not called.");
+ http->error = errno = EINVAL;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Server credentials not set."), 1);
+
+ return (-1);
+ }
+
+ credentials = (gnutls_certificate_credentials_t *)
+ malloc(sizeof(gnutls_certificate_credentials_t));
+ if (credentials == NULL)
+ {
+ DEBUG_printf(("8_httpStartTLS: Unable to allocate credentials: %s",
+ strerror(errno)));
+ http->error = errno;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+
+ return (-1);
+ }
+
+ gnutls_certificate_allocate_credentials(credentials);
+ status = gnutls_init(&http->tls, http->mode == _HTTP_MODE_CLIENT ? GNUTLS_CLIENT : GNUTLS_SERVER);
+ if (!status)
+ status = gnutls_set_default_priority(http->tls);
+
+ if (status)
+ {
+ http->error = EIO;
+ http->status = HTTP_STATUS_ERROR;
+
+ DEBUG_printf(("4_httpTLSStart: Unable to initialize common TLS parameters: %s", gnutls_strerror(status)));
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, gnutls_strerror(status), 0);
+
+ gnutls_deinit(http->tls);
+ gnutls_certificate_free_credentials(*credentials);
+ free(credentials);
+ http->tls = NULL;
+
+ return (-1);
+ }
+
+ if (http->mode == _HTTP_MODE_CLIENT)
+ {
+ /*
+ * Client: get the hostname to use for TLS...
+ */
+
+ if (httpAddrLocalhost(http->hostaddr))
+ {
+ strlcpy(hostname, "localhost", sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Otherwise make sure the hostname we have does not end in a trailing dot.
+ */
+
+ strlcpy(hostname, http->hostname, sizeof(hostname));
+ if ((hostptr = hostname + strlen(hostname) - 1) >= hostname &&
+ *hostptr == '.')
+ *hostptr = '\0';
+ }
+
+ status = gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, hostname, strlen(hostname));
+ }
+ else
+ {
+ /*
+ * Server: get certificate and private key...
+ */
+
+ char crtfile[1024], /* Certificate file */
+ keyfile[1024]; /* Private key file */
+ int have_creds = 0; /* Have credentials? */
+
+ if (http->fields[HTTP_FIELD_HOST][0])
+ {
+ /*
+ * Use hostname for TLS upgrade...
+ */
+
+ strlcpy(hostname, http->fields[HTTP_FIELD_HOST], sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Resolve hostname from connection address...
+ */
+
+ http_addr_t addr; /* Connection address */
+ socklen_t addrlen; /* Length of address */
+
+ addrlen = sizeof(addr);
+ if (getsockname(http->fd, (struct sockaddr *)&addr, &addrlen))
+ {
+ DEBUG_printf(("4_httpTLSStart: Unable to get socket address: %s", strerror(errno)));
+ hostname[0] = '\0';
+ }
+ else if (httpAddrLocalhost(&addr))
+ hostname[0] = '\0';
+ else
+ {
+ httpAddrLookup(&addr, hostname, sizeof(hostname));
+ DEBUG_printf(("4_httpTLSStart: Resolved socket address to \"%s\".", hostname));
+ }
+ }
+
+ if (isdigit(hostname[0] & 255) || hostname[0] == '[')
+ hostname[0] = '\0'; /* Don't allow numeric addresses */
+
+ if (hostname[0])
+ {
+ http_gnutls_make_path(crtfile, sizeof(crtfile), tls_keypath, hostname, "crt");
+ http_gnutls_make_path(keyfile, sizeof(keyfile), tls_keypath, hostname, "key");
+
+ have_creds = !access(crtfile, 0) && !access(keyfile, 0);
+ }
+ else if (tls_common_name)
+ {
+ http_gnutls_make_path(crtfile, sizeof(crtfile), tls_keypath, tls_common_name, "crt");
+ http_gnutls_make_path(keyfile, sizeof(keyfile), tls_keypath, tls_common_name, "key");
+
+ have_creds = !access(crtfile, 0) && !access(keyfile, 0);
+ }
+
+ if (!have_creds && tls_auto_create && (hostname[0] || tls_common_name))
+ {
+ DEBUG_printf(("4_httpTLSStart: Auto-create credentials for \"%s\".", hostname[0] ? hostname : tls_common_name));
+
+ if (!cupsMakeServerCredentials(tls_keypath, hostname[0] ? hostname : tls_common_name, 0, NULL, time(NULL) + 365 * 86400))
+ {
+ DEBUG_puts("4_httpTLSStart: cupsMakeServerCredentials failed.");
+ http->error = errno = EINVAL;
+ http->status = HTTP_STATUS_ERROR;
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create server credentials."), 1);
+
+ return (-1);
+ }
+ }
+
+ DEBUG_printf(("4_httpTLSStart: Using certificate \"%s\" and private key \"%s\".", crtfile, keyfile));
+
+ status = gnutls_certificate_set_x509_key_file(*credentials, crtfile, keyfile, GNUTLS_X509_FMT_PEM);
+ }
+
+ if (!status)
+ status = gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials);
+
+ if (status)
+ {
+ http->error = EIO;
+ http->status = HTTP_STATUS_ERROR;
+
+ DEBUG_printf(("4_httpTLSStart: Unable to complete client/server setup: %s", gnutls_strerror(status)));
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, gnutls_strerror(status), 0);
+
+ gnutls_deinit(http->tls);
+ gnutls_certificate_free_credentials(*credentials);
+ free(credentials);
+ http->tls = NULL;
+
+ return (-1);
+ }
+
+ strlcpy(priority_string, "NORMAL", sizeof(priority_string));
+
+ if (tls_options & _HTTP_TLS_DENY_TLS10)
+ strlcat(priority_string, ":+VERS-TLS-ALL:-VERS-TLS1.0:-VERS-SSL3.0", sizeof(priority_string));
+ else if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+ strlcat(priority_string, ":+VERS-TLS-ALL", sizeof(priority_string));
+ else
+ strlcat(priority_string, ":+VERS-TLS-ALL:-VERS-SSL3.0", sizeof(priority_string));
+
+ if (!(tls_options & _HTTP_TLS_ALLOW_RC4))
+ strlcat(priority_string, ":-ARCFOUR-128", sizeof(priority_string));
+
+ if (!(tls_options & _HTTP_TLS_ALLOW_DH))
+ strlcat(priority_string, ":!ANON-DH", sizeof(priority_string));
+
+#ifdef HAVE_GNUTLS_PRIORITY_SET_DIRECT
+ gnutls_priority_set_direct(http->tls, priority_string, NULL);
+
+#else
+ gnutls_priority_t priority; /* Priority */
+
+ gnutls_priority_init(&priority, priority_string, NULL);
+ gnutls_priority_set(http->tls, priority);
+ gnutls_priority_deinit(priority);
+#endif /* HAVE_GNUTLS_PRIORITY_SET_DIRECT */
+
+ gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr_t)http);
+ gnutls_transport_set_pull_function(http->tls, http_gnutls_read);
+#ifdef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION
+ gnutls_transport_set_pull_timeout_function(http->tls, (gnutls_pull_timeout_func)httpWait);
+#endif /* HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */
+ gnutls_transport_set_push_function(http->tls, http_gnutls_write);
+
+ while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS)
+ {
+ DEBUG_printf(("5_httpStartTLS: gnutls_handshake returned %d (%s)",
+ status, gnutls_strerror(status)));
+
+ if (gnutls_error_is_fatal(status))
+ {
+ http->error = EIO;
+ http->status = HTTP_STATUS_ERROR;
+
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, gnutls_strerror(status), 0);
+
+ gnutls_deinit(http->tls);
+ gnutls_certificate_free_credentials(*credentials);
+ free(credentials);
+ http->tls = NULL;
+
+ return (-1);
+ }
+ }
+
+ http->tls_credentials = credentials;
+
+ return (0);
+}
+
+
+/*
+ * '_httpTLSStop()' - Shut down SSL/TLS on a connection.
+ */
+
+void
+_httpTLSStop(http_t *http) /* I - Connection to server */
+{
+ int error; /* Error code */
+
+
+ error = gnutls_bye(http->tls, http->mode == _HTTP_MODE_CLIENT ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR);
+ if (error != GNUTLS_E_SUCCESS)
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gnutls_strerror(errno), 0);
+
+ gnutls_deinit(http->tls);
+ http->tls = NULL;
+
+ if (http->tls_credentials)
+ {
+ gnutls_certificate_free_credentials(*(http->tls_credentials));
+ free(http->tls_credentials);
+ http->tls_credentials = NULL;
+ }
+}
+
+
+/*
+ * '_httpTLSWrite()' - Write to a SSL/TLS connection.
+ */
+
+int /* O - Bytes written */
+_httpTLSWrite(http_t *http, /* I - Connection to server */
+ const char *buf, /* I - Buffer holding data */
+ int len) /* I - Length of buffer */
+{
+ ssize_t result; /* Return value */
+
+
+ DEBUG_printf(("2http_write_ssl(http=%p, buf=%p, len=%d)", http, buf, len));
+
+ result = gnutls_record_send(http->tls, buf, (size_t)len);
+
+ if (result < 0 && !errno)
+ {
+ /*
+ * Convert GNU TLS error to errno value...
+ */
+
+ switch (result)
+ {
+ case GNUTLS_E_INTERRUPTED :
+ errno = EINTR;
+ break;
+
+ case GNUTLS_E_AGAIN :
+ errno = EAGAIN;
+ break;
+
+ default :
+ errno = EPIPE;
+ break;
+ }
+
+ result = -1;
+ }
+
+ DEBUG_printf(("3http_write_ssl: Returning %d.", (int)result));
+
+ return ((int)result);
+}
+
+
+/*
+ * End of "$Id: tls-gnutls.c 12670 2015-05-27 19:48:05Z msweet $".
+ */
diff --git a/cups/tls-sspi.c b/cups/tls-sspi.c
new file mode 100644
index 0000000..aa8994d
--- /dev/null
+++ b/cups/tls-sspi.c
@@ -0,0 +1,2431 @@
+/*
+ * "$Id: tls-sspi.c 12647 2015-05-20 18:37:52Z msweet $"
+ *
+ * TLS support for CUPS on Windows using the Security Support Provider
+ * Interface (SSPI).
+ *
+ * Copyright 2010-2015 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/**** This file is included from tls.c ****/
+
+/*
+ * Include necessary headers...
+ */
+
+#include "debug-private.h"
+
+
+/*
+ * Include necessary libraries...
+ */
+
+#pragma comment(lib, "Crypt32.lib")
+#pragma comment(lib, "Secur32.lib")
+#pragma comment(lib, "Ws2_32.lib")
+
+
+/*
+ * Constants...
+ */
+
+#ifndef SECURITY_FLAG_IGNORE_UNKNOWN_CA
+# define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 /* Untrusted root */
+#endif /* SECURITY_FLAG_IGNORE_UNKNOWN_CA */
+
+#ifndef SECURITY_FLAG_IGNORE_CERT_CN_INVALID
+# define SECURITY_FLAG_IGNORE_CERT_CN_INVALID 0x00001000 /* Common name does not match */
+#endif /* !SECURITY_FLAG_IGNORE_CERT_CN_INVALID */
+
+#ifndef SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
+# define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 /* Expired X509 Cert. */
+#endif /* !SECURITY_FLAG_IGNORE_CERT_DATE_INVALID */
+
+
+/*
+ * Local globals...
+ */
+
+static int tls_options = -1;/* Options for TLS connections */
+
+
+/*
+ * Local functions...
+ */
+
+static _http_sspi_t *http_sspi_alloc(void);
+static int http_sspi_client(http_t *http, const char *hostname);
+static PCCERT_CONTEXT http_sspi_create_credential(http_credential_t *cred);
+static BOOL http_sspi_find_credentials(http_t *http, const LPWSTR containerName, const char *common_name);
+static void http_sspi_free(_http_sspi_t *sspi);
+static BOOL http_sspi_make_credentials(_http_sspi_t *sspi, const LPWSTR containerName, const char *common_name, _http_mode_t mode, int years);
+static int http_sspi_server(http_t *http, const char *hostname);
+static void http_sspi_set_allows_any_root(_http_sspi_t *sspi, BOOL allow);
+static void http_sspi_set_allows_expired_certs(_http_sspi_t *sspi, BOOL allow);
+static const char *http_sspi_strerror(char *buffer, size_t bufsize, DWORD code);
+static DWORD http_sspi_verify(PCCERT_CONTEXT cert, const char *common_name, DWORD dwCertFlags);
+
+
+/*
+ * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsMakeServerCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ const char *common_name, /* I - Common name */
+ int num_alt_names, /* I - Number of subject alternate names */
+ const char **alt_names, /* I - Subject Alternate Names */
+ time_t expiration_date) /* I - Expiration date */
+{
+ _http_sspi_t *sspi; /* SSPI data */
+ int ret; /* Return value */
+
+
+ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date));
+
+ (void)path;
+ (void)num_alt_names;
+ (void)alt_names;
+
+ sspi = http_sspi_alloc();
+ ret = http_sspi_make_credentials(sspi, L"ServerContainer", common_name, _HTTP_MODE_SERVER, (int)((expiration_date - time(NULL) + 86399) / 86400 / 365));
+
+ http_sspi_free(sspi);
+
+ return (ret);
+}
+
+
+/*
+ * 'cupsSetServerCredentials()' - Set the default server credentials.
+ *
+ * Note: The server credentials are used by all threads in the running process.
+ * This function is threadsafe.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 on success, 0 on failure */
+cupsSetServerCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ const char *common_name, /* I - Default common name for server */
+ int auto_create) /* I - 1 = automatically create self-signed certificates */
+{
+ DEBUG_printf(("cupsSetServerCredentials(path=\"%s\", common_name=\"%s\", auto_create=%d)", path, common_name, auto_create));
+
+ (void)path;
+ (void)common_name;
+ (void)auto_create;
+
+ return (0);
+}
+
+
+/*
+ * 'httpCopyCredentials()' - Copy the credentials associated with the peer in
+ * an encrypted connection.
+ *
+ * @since CUPS 1.5/OS X 10.7@
+ */
+
+int /* O - Status of call (0 = success) */
+httpCopyCredentials(
+ http_t *http, /* I - Connection to server */
+ cups_array_t **credentials) /* O - Array of credentials */
+{
+ DEBUG_printf(("httpCopyCredentials(http=%p, credentials=%p)", http, credentials));
+
+ if (!http || !http->tls || !http->tls->remoteCert || !credentials)
+ {
+ if (credentials)
+ *credentials = NULL;
+
+ return (-1);
+ }
+
+ *credentials = cupsArrayNew(NULL, NULL);
+ httpAddCredential(*credentials, http->tls->remoteCert->pbCertEncoded, http->tls->remoteCert->cbCertEncoded);
+
+ return (0);
+}
+
+
+/*
+ * '_httpCreateCredentials()' - Create credentials in the internal format.
+ */
+
+http_tls_credentials_t /* O - Internal credentials */
+_httpCreateCredentials(
+ cups_array_t *credentials) /* I - Array of credentials */
+{
+ return (http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials)));
+}
+
+
+/*
+ * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 1 if valid, 0 otherwise */
+httpCredentialsAreValidForName(
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Name to check */
+{
+ int valid = 1; /* Valid name? */
+ PCCERT_CONTEXT cert = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials));
+ /* Certificate */
+ char cert_name[1024]; /* Name from certificate */
+
+
+ if (cert)
+ {
+ if (CertNameToStr(X509_ASN_ENCODING, &(cert->pCertInfo->Subject), CERT_SIMPLE_NAME_STR, cert_name, sizeof(cert_name)))
+ {
+ /*
+ * Extract common name at end...
+ */
+
+ char *ptr = strrchr(cert_name, ',');
+ if (ptr && ptr[1])
+ _cups_strcpy(cert_name, ptr + 2);
+ }
+ else
+ strlcpy(cert_name, "unknown", sizeof(cert_name));
+
+ CertFreeCertificateContext(cert);
+ }
+ else
+ strlcpy(cert_name, "unknown", sizeof(cert_name));
+
+ /*
+ * Compare the common names...
+ */
+
+ if (_cups_strcasecmp(common_name, cert_name))
+ {
+ /*
+ * Not an exact match for the common name, check for wildcard certs...
+ */
+
+ const char *domain = strchr(common_name, '.');
+ /* Domain in common name */
+
+ if (strncmp(cert_name, "*.", 2) || !domain || _cups_strcasecmp(domain, cert_name + 1))
+ {
+ /*
+ * Not a wildcard match.
+ */
+
+ /* TODO: Check subject alternate names */
+ valid = 0;
+ }
+ }
+
+ return (valid);
+}
+
+
+/*
+ * 'httpCredentialsGetTrust()' - Return the trust of credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+http_trust_t /* O - Level of trust */
+httpCredentialsGetTrust(
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Common name for trust lookup */
+{
+ http_trust_t trust = HTTP_TRUST_OK; /* Level of trust */
+ PCCERT_CONTEXT cert = NULL; /* Certificate to validate */
+ DWORD certFlags = 0; /* Cert verification flags */
+ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread global data */
+
+
+ if (!common_name)
+ return (HTTP_TRUST_UNKNOWN);
+
+ cert = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials));
+ if (!cert)
+ return (HTTP_TRUST_UNKNOWN);
+
+ if (cg->any_root < 0)
+ _cupsSetDefaults();
+
+ if (cg->any_root)
+ certFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
+
+ if (cg->expired_certs)
+ certFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
+
+ if (!cg->validate_certs)
+ certFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
+
+ if (http_sspi_verify(cert, common_name, certFlags) != SEC_E_OK)
+ trust = HTTP_TRUST_INVALID;
+
+ CertFreeCertificateContext(cert);
+
+ return (trust);
+}
+
+
+/*
+ * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+time_t /* O - Expiration date of credentials */
+httpCredentialsGetExpiration(
+ cups_array_t *credentials) /* I - Credentials */
+{
+ time_t expiration_date = 0; /* Expiration data of credentials */
+ PCCERT_CONTEXT cert = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials));
+ /* Certificate */
+
+ if (cert)
+ {
+ SYSTEMTIME systime; /* System time */
+ struct tm tm; /* UNIX date/time */
+
+ FileTimeToSystemTime(&(cert->pCertInfo->NotAfter), &systime);
+
+ tm.tm_year = systime.wYear - 1900;
+ tm.tm_mon = systime.wMonth - 1;
+ tm.tm_mday = systime.wDay;
+ tm.tm_hour = systime.wHour;
+ tm.tm_min = systime.wMinute;
+ tm.tm_sec = systime.wSecond;
+
+ expiration_date = mktime(&tm);
+
+ CertFreeCertificateContext(cert);
+ }
+
+ return (expiration_date);
+}
+
+
+/*
+ * 'httpCredentialsString()' - Return a string representing the credentials.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+size_t /* O - Total size of credentials string */
+httpCredentialsString(
+ cups_array_t *credentials, /* I - Credentials */
+ char *buffer, /* I - Buffer or @code NULL@ */
+ size_t bufsize) /* I - Size of buffer */
+{
+ http_credential_t *first = (http_credential_t *)cupsArrayFirst(credentials);
+ /* First certificate */
+ PCCERT_CONTEXT cert; /* Certificate */
+
+
+ DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize));
+
+ if (!buffer)
+ return (0);
+
+ if (buffer && bufsize > 0)
+ *buffer = '\0';
+
+ cert = http_sspi_create_credential(first);
+
+ if (cert)
+ {
+ char cert_name[256]; /* Common name */
+ SYSTEMTIME systime; /* System time */
+ struct tm tm; /* UNIX date/time */
+ time_t expiration; /* Expiration date of cert */
+ _cups_md5_state_t md5_state; /* MD5 state */
+ unsigned char md5_digest[16]; /* MD5 result */
+
+ FileTimeToSystemTime(&(cert->pCertInfo->NotAfter), &systime);
+
+ tm.tm_year = systime.wYear - 1900;
+ tm.tm_mon = systime.wMonth - 1;
+ tm.tm_mday = systime.wDay;
+ tm.tm_hour = systime.wHour;
+ tm.tm_min = systime.wMinute;
+ tm.tm_sec = systime.wSecond;
+
+ expiration = mktime(&tm);
+
+ if (CertNameToStr(X509_ASN_ENCODING, &(cert->pCertInfo->Subject), CERT_SIMPLE_NAME_STR, cert_name, sizeof(cert_name)))
+ {
+ /*
+ * Extract common name at end...
+ */
+
+ char *ptr = strrchr(cert_name, ',');
+ if (ptr && ptr[1])
+ _cups_strcpy(cert_name, ptr + 2);
+ }
+ else
+ strlcpy(cert_name, "unknown", sizeof(cert_name));
+
+ _cupsMD5Init(&md5_state);
+ _cupsMD5Append(&md5_state, first->data, (int)first->datalen);
+ _cupsMD5Finish(&md5_state, md5_digest);
+
+ snprintf(buffer, bufsize, "%s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", cert_name, httpGetDateString(expiration), md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]);
+
+ CertFreeCertificateContext(cert);
+ }
+
+ DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer));
+
+ return (strlen(buffer));
+}
+
+
+/*
+ * '_httpFreeCredentials()' - Free internal credentials.
+ */
+
+void
+_httpFreeCredentials(
+ http_tls_credentials_t credentials) /* I - Internal credentials */
+{
+ if (!credentials)
+ return;
+
+ CertFreeCertificateContext(credentials);
+}
+
+
+/*
+ * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - 0 on success, -1 on error */
+httpLoadCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ cups_array_t **credentials, /* IO - Credentials */
+ const char *common_name) /* I - Common name for credentials */
+{
+ HCERTSTORE store = NULL; /* Certificate store */
+ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */
+ DWORD dwSize = 0; /* 32 bit size */
+ PBYTE p = NULL; /* Temporary storage */
+ HCRYPTPROV hProv = (HCRYPTPROV)NULL;
+ /* Handle to a CSP */
+ CERT_NAME_BLOB sib; /* Arbitrary array of bytes */
+#ifdef DEBUG
+ char error[1024]; /* Error message buffer */
+#endif /* DEBUG */
+
+
+ DEBUG_printf(("httpLoadCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name));
+
+ (void)path;
+
+ if (credentials)
+ {
+ *credentials = NULL;
+ }
+ else
+ {
+ DEBUG_puts("1httpLoadCredentials: NULL credentials pointer, returning -1.");
+ return (-1);
+ }
+
+ if (!common_name)
+ {
+ DEBUG_puts("1httpLoadCredentials: Bad common name, returning -1.");
+ return (-1);
+ }
+
+ if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
+ {
+ if (GetLastError() == NTE_EXISTS)
+ {
+ if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
+ {
+ DEBUG_printf(("1httpLoadCredentials: CryptAcquireContext failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+ }
+ }
+
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY");
+
+ if (!store)
+ {
+ DEBUG_printf(("1httpLoadCredentials: CertOpenSystemStore failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ dwSize = 0;
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+ {
+ DEBUG_printf(("1httpLoadCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ p = (PBYTE)malloc(dwSize);
+
+ if (!p)
+ {
+ DEBUG_printf(("1httpLoadCredentials: malloc failed for %d bytes.", dwSize));
+ goto cleanup;
+ }
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
+ {
+ DEBUG_printf(("1httpLoadCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ sib.cbData = dwSize;
+ sib.pbData = p;
+
+ storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
+
+ if (!storedContext)
+ {
+ DEBUG_printf(("1httpLoadCredentials: Unable to find credentials for \"%s\".", common_name));
+ goto cleanup;
+ }
+
+ *credentials = cupsArrayNew(NULL, NULL);
+ httpAddCredential(*credentials, storedContext->pbCertEncoded, storedContext->cbCertEncoded);
+
+cleanup:
+
+ /*
+ * Cleanup
+ */
+
+ if (storedContext)
+ CertFreeCertificateContext(storedContext);
+
+ if (p)
+ free(p);
+
+ if (store)
+ CertCloseStore(store, 0);
+
+ if (hProv)
+ CryptReleaseContext(hProv, 0);
+
+ DEBUG_printf(("1httpLoadCredentials: Returning %d.", *credentials ? 0 : -1));
+
+ return (*credentials ? 0 : -1);
+}
+
+
+/*
+ * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file.
+ *
+ * @since CUPS 2.0/OS 10.10@
+ */
+
+int /* O - -1 on error, 0 on success */
+httpSaveCredentials(
+ const char *path, /* I - Keychain path or @code NULL@ for default */
+ cups_array_t *credentials, /* I - Credentials */
+ const char *common_name) /* I - Common name for credentials */
+{
+ HCERTSTORE store = NULL; /* Certificate store */
+ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */
+ PCCERT_CONTEXT createdContext = NULL; /* Context created by us */
+ DWORD dwSize = 0; /* 32 bit size */
+ PBYTE p = NULL; /* Temporary storage */
+ HCRYPTPROV hProv = (HCRYPTPROV)NULL;
+ /* Handle to a CSP */
+ CRYPT_KEY_PROV_INFO ckp; /* Handle to crypto key */
+ int ret = -1; /* Return value */
+#ifdef DEBUG
+ char error[1024]; /* Error message buffer */
+#endif /* DEBUG */
+
+
+ DEBUG_printf(("httpSaveCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name));
+
+ (void)path;
+
+ if (!common_name)
+ {
+ DEBUG_puts("1httpSaveCredentials: Bad common name, returning -1.");
+ return (-1);
+ }
+
+ createdContext = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials));
+ if (!createdContext)
+ {
+ DEBUG_puts("1httpSaveCredentials: Bad credentials, returning -1.");
+ return (-1);
+ }
+
+ if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
+ {
+ if (GetLastError() == NTE_EXISTS)
+ {
+ if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
+ {
+ DEBUG_printf(("1httpSaveCredentials: CryptAcquireContext failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+ }
+ }
+
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY");
+
+ if (!store)
+ {
+ DEBUG_printf(("1httpSaveCredentials: CertOpenSystemStore failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ dwSize = 0;
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+ {
+ DEBUG_printf(("1httpSaveCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ p = (PBYTE)malloc(dwSize);
+
+ if (!p)
+ {
+ DEBUG_printf(("1httpSaveCredentials: malloc failed for %d bytes.", dwSize));
+ goto cleanup;
+ }
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
+ {
+ DEBUG_printf(("1httpSaveCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ /*
+ * Add the created context to the named store, and associate it with the named
+ * container...
+ */
+
+ if (!CertAddCertificateContextToStore(store, createdContext, CERT_STORE_ADD_REPLACE_EXISTING, &storedContext))
+ {
+ DEBUG_printf(("1httpSaveCredentials: CertAddCertificateContextToStore failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ ZeroMemory(&ckp, sizeof(ckp));
+ ckp.pwszContainerName = L"RememberedContainer";
+ ckp.pwszProvName = MS_DEF_PROV_W;
+ ckp.dwProvType = PROV_RSA_FULL;
+ ckp.dwFlags = CRYPT_MACHINE_KEYSET;
+ ckp.dwKeySpec = AT_KEYEXCHANGE;
+
+ if (!CertSetCertificateContextProperty(storedContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &ckp))
+ {
+ DEBUG_printf(("1httpSaveCredentials: CertSetCertificateContextProperty failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError())));
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+
+ /*
+ * Cleanup
+ */
+
+ if (createdContext)
+ CertFreeCertificateContext(createdContext);
+
+ if (storedContext)
+ CertFreeCertificateContext(storedContext);
+
+ if (p)
+ free(p);
+
+ if (store)
+ CertCloseStore(store, 0);
+
+ if (hProv)
+ CryptReleaseContext(hProv, 0);
+
+ DEBUG_printf(("1httpSaveCredentials: Returning %d.", ret));
+ return (ret);
+}
+
+
+/*
+ * '_httpTLSInitialize()' - Initialize the TLS stack.
+ */
+
+void
+_httpTLSInitialize(void)
+{
+ /*
+ * Nothing to do...
+ */
+}
+
+
+/*
+ * '_httpTLSPending()' - Return the number of pending TLS-encrypted bytes.
+ */
+
+size_t /* O - Bytes available */
+_httpTLSPending(http_t *http) /* I - HTTP connection */
+{
+ if (http->tls)
+ return (http->tls->readBufferUsed);
+ else
+ return (0);
+}
+
+
+/*
+ * '_httpTLSRead()' - Read from a SSL/TLS connection.
+ */
+
+int /* O - Bytes read */
+_httpTLSRead(http_t *http, /* I - HTTP connection */
+ char *buf, /* I - Buffer to store data */
+ int len) /* I - Length of buffer */
+{
+ int i; /* Looping var */
+ _http_sspi_t *sspi = http->tls; /* SSPI data */
+ SecBufferDesc message; /* Array of SecBuffer struct */
+ SecBuffer buffers[4] = { 0 }; /* Security package buffer */
+ int num = 0; /* Return value */
+ PSecBuffer pDataBuffer; /* Data buffer */
+ PSecBuffer pExtraBuffer; /* Excess data buffer */
+ SECURITY_STATUS scRet; /* SSPI status */
+
+
+ DEBUG_printf(("4_httpTLSRead(http=%p, buf=%p, len=%d)", http, buf, len));
+
+ /*
+ * If there are bytes that have already been decrypted and have not yet been
+ * read, return those...
+ */
+
+ if (sspi->readBufferUsed > 0)
+ {
+ int bytesToCopy = min(sspi->readBufferUsed, len);
+ /* Number of bytes to copy */
+
+ memcpy(buf, sspi->readBuffer, bytesToCopy);
+ sspi->readBufferUsed -= bytesToCopy;
+
+ if (sspi->readBufferUsed > 0)
+ memmove(sspi->readBuffer, sspi->readBuffer + bytesToCopy, sspi->readBufferUsed);
+
+ DEBUG_printf(("5_httpTLSRead: Returning %d bytes previously decrypted.", bytesToCopy));
+
+ return (bytesToCopy);
+ }
+
+ /*
+ * Initialize security buffer structs
+ */
+
+ message.ulVersion = SECBUFFER_VERSION;
+ message.cBuffers = 4;
+ message.pBuffers = buffers;
+
+ do
+ {
+ /*
+ * If there is not enough space in the buffer, then increase its size...
+ */
+
+ if (sspi->decryptBufferLength <= sspi->decryptBufferUsed)
+ {
+ BYTE *temp; /* New buffer */
+
+ if (sspi->decryptBufferLength >= 262144)
+ {
+ WSASetLastError(E_OUTOFMEMORY);
+ DEBUG_puts("_httpTLSRead: Decryption buffer too large (>256k)");
+ return (-1);
+ }
+
+ if ((temp = realloc(sspi->decryptBuffer, sspi->decryptBufferLength + 4096)) == NULL)
+ {
+ DEBUG_printf(("_httpTLSRead: Unable to allocate %d byte decryption buffer.", sspi->decryptBufferLength + 4096));
+ WSASetLastError(E_OUTOFMEMORY);
+ return (-1);
+ }
+
+ sspi->decryptBufferLength += 4096;
+ sspi->decryptBuffer = temp;
+
+ DEBUG_printf(("_httpTLSRead: Resized decryption buffer to %d bytes.", sspi->decryptBufferLength));
+ }
+
+ buffers[0].pvBuffer = sspi->decryptBuffer;
+ buffers[0].cbBuffer = (unsigned long)sspi->decryptBufferUsed;
+ buffers[0].BufferType = SECBUFFER_DATA;
+ buffers[1].BufferType = SECBUFFER_EMPTY;
+ buffers[2].BufferType = SECBUFFER_EMPTY;
+ buffers[3].BufferType = SECBUFFER_EMPTY;
+
+ DEBUG_printf(("5_httpTLSRead: decryptBufferUsed=%d", sspi->decryptBufferUsed));
+
+ scRet = DecryptMessage(&sspi->context, &message, 0, NULL);
+
+ if (scRet == SEC_E_INCOMPLETE_MESSAGE)
+ {
+ num = recv(http->fd, sspi->decryptBuffer + sspi->decryptBufferUsed, (int)(sspi->decryptBufferLength - sspi->decryptBufferUsed), 0);
+ if (num < 0)
+ {
+ DEBUG_printf(("5_httpTLSRead: recv failed: %d", WSAGetLastError()));
+ return (-1);
+ }
+ else if (num == 0)
+ {
+ DEBUG_puts("5_httpTLSRead: Server disconnected.");
+ return (0);
+ }
+
+ DEBUG_printf(("5_httpTLSRead: Read %d bytes into decryption buffer.", num));
+
+ sspi->decryptBufferUsed += num;
+ }
+ }
+ while (scRet == SEC_E_INCOMPLETE_MESSAGE);
+
+ if (scRet == SEC_I_CONTEXT_EXPIRED)
+ {
+ DEBUG_puts("5_httpTLSRead: Context expired.");
+ WSASetLastError(WSAECONNRESET);
+ return (-1);
+ }
+ else if (scRet != SEC_E_OK)
+ {
+ DEBUG_printf(("5_httpTLSRead: DecryptMessage failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ WSASetLastError(WSASYSCALLFAILURE);
+ return (-1);
+ }
+
+ /*
+ * The decryption worked. Now, locate data buffer.
+ */
+
+ pDataBuffer = NULL;
+ pExtraBuffer = NULL;
+
+ for (i = 1; i < 4; i++)
+ {
+ if (buffers[i].BufferType == SECBUFFER_DATA)
+ pDataBuffer = &buffers[i];
+ else if (!pExtraBuffer && (buffers[i].BufferType == SECBUFFER_EXTRA))
+ pExtraBuffer = &buffers[i];
+ }
+
+ /*
+ * If a data buffer is found, then copy the decrypted bytes to the passed-in
+ * buffer...
+ */
+
+ if (pDataBuffer)
+ {
+ int bytesToCopy = min((int)pDataBuffer->cbBuffer, len);
+ /* Number of bytes to copy into buf */
+ int bytesToSave = pDataBuffer->cbBuffer - bytesToCopy;
+ /* Number of bytes to save in our read buffer */
+
+ if (bytesToCopy)
+ memcpy(buf, pDataBuffer->pvBuffer, bytesToCopy);
+
+ /*
+ * If there are more decrypted bytes than can be copied to the passed in
+ * buffer, then save them...
+ */
+
+ if (bytesToSave)
+ {
+ if ((sspi->readBufferLength - sspi->readBufferUsed) < bytesToSave)
+ {
+ BYTE *temp; /* New buffer pointer */
+
+ if ((temp = realloc(sspi->readBuffer, sspi->readBufferUsed + bytesToSave)) == NULL)
+ {
+ DEBUG_printf(("_httpTLSRead: Unable to allocate %d bytes.", sspi->readBufferUsed + bytesToSave));
+ WSASetLastError(E_OUTOFMEMORY);
+ return (-1);
+ }
+
+ sspi->readBufferLength = sspi->readBufferUsed + bytesToSave;
+ sspi->readBuffer = temp;
+ }
+
+ memcpy(((BYTE *)sspi->readBuffer) + sspi->readBufferUsed, ((BYTE *)pDataBuffer->pvBuffer) + bytesToCopy, bytesToSave);
+
+ sspi->readBufferUsed += bytesToSave;
+ }
+
+ num = bytesToCopy;
+ }
+ else
+ {
+ DEBUG_puts("_httpTLSRead: Unable to find data buffer.");
+ WSASetLastError(WSASYSCALLFAILURE);
+ return (-1);
+ }
+
+ /*
+ * If the decryption process left extra bytes, then save those back in
+ * decryptBuffer. They will be processed the next time through the loop.
+ */
+
+ if (pExtraBuffer)
+ {
+ memmove(sspi->decryptBuffer, pExtraBuffer->pvBuffer, pExtraBuffer->cbBuffer);
+ sspi->decryptBufferUsed = pExtraBuffer->cbBuffer;
+ }
+ else
+ {
+ sspi->decryptBufferUsed = 0;
+ }
+
+ return (num);
+}
+
+
+/*
+ * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options.
+ */
+
+void
+_httpTLSSetOptions(int options) /* I - Options */
+{
+ tls_options = options;
+}
+
+
+/*
+ * '_httpTLSStart()' - Set up SSL/TLS support on a connection.
+ */
+
+int /* O - 0 on success, -1 on failure */
+_httpTLSStart(http_t *http) /* I - HTTP connection */
+{
+ char hostname[256], /* Hostname */
+ *hostptr; /* Pointer into hostname */
+
+
+ DEBUG_printf(("3_httpTLSStart(http=%p)", http));
+
+ if (tls_options < 0)
+ {
+ DEBUG_puts("4_httpTLSStart: Setting defaults.");
+ _cupsSetDefaults();
+ DEBUG_printf(("4_httpTLSStart: tls_options=%x", tls_options));
+ }
+
+ if ((http->tls = http_sspi_alloc()) == NULL)
+ return (-1);
+
+ if (http->mode == _HTTP_MODE_CLIENT)
+ {
+ /*
+ * Client: determine hostname...
+ */
+
+ if (httpAddrLocalhost(http->hostaddr))
+ {
+ strlcpy(hostname, "localhost", sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Otherwise make sure the hostname we have does not end in a trailing dot.
+ */
+
+ strlcpy(hostname, http->hostname, sizeof(hostname));
+ if ((hostptr = hostname + strlen(hostname) - 1) >= hostname &&
+ *hostptr == '.')
+ *hostptr = '\0';
+ }
+
+ return (http_sspi_client(http, hostname));
+ }
+ else
+ {
+ /*
+ * Server: determine hostname to use...
+ */
+
+ if (http->fields[HTTP_FIELD_HOST][0])
+ {
+ /*
+ * Use hostname for TLS upgrade...
+ */
+
+ strlcpy(hostname, http->fields[HTTP_FIELD_HOST], sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Resolve hostname from connection address...
+ */
+
+ http_addr_t addr; /* Connection address */
+ socklen_t addrlen; /* Length of address */
+
+ addrlen = sizeof(addr);
+ if (getsockname(http->fd, (struct sockaddr *)&addr, &addrlen))
+ {
+ DEBUG_printf(("4_httpTLSStart: Unable to get socket address: %s", strerror(errno)));
+ hostname[0] = '\0';
+ }
+ else if (httpAddrLocalhost(&addr))
+ hostname[0] = '\0';
+ else
+ {
+ httpAddrLookup(&addr, hostname, sizeof(hostname));
+ DEBUG_printf(("4_httpTLSStart: Resolved socket address to \"%s\".", hostname));
+ }
+ }
+
+ return (http_sspi_server(http, hostname));
+ }
+}
+
+
+/*
+ * '_httpTLSStop()' - Shut down SSL/TLS on a connection.
+ */
+
+void
+_httpTLSStop(http_t *http) /* I - HTTP connection */
+{
+ _http_sspi_t *sspi = http->tls; /* SSPI data */
+
+
+ if (sspi->contextInitialized && http->fd >= 0)
+ {
+ SecBufferDesc message; /* Array of SecBuffer struct */
+ SecBuffer buffers[1] = { 0 };
+ /* Security package buffer */
+ DWORD dwType; /* Type */
+ DWORD status; /* Status */
+
+ /*
+ * Notify schannel that we are about to close the connection.
+ */
+
+ dwType = SCHANNEL_SHUTDOWN;
+
+ buffers[0].pvBuffer = &dwType;
+ buffers[0].BufferType = SECBUFFER_TOKEN;
+ buffers[0].cbBuffer = sizeof(dwType);
+
+ message.cBuffers = 1;
+ message.pBuffers = buffers;
+ message.ulVersion = SECBUFFER_VERSION;
+
+ status = ApplyControlToken(&sspi->context, &message);
+
+ if (SUCCEEDED(status))
+ {
+ PBYTE pbMessage; /* Message buffer */
+ DWORD cbMessage; /* Message buffer count */
+ DWORD cbData; /* Data count */
+ DWORD dwSSPIFlags; /* SSL attributes we requested */
+ DWORD dwSSPIOutFlags; /* SSL attributes we received */
+ TimeStamp tsExpiry; /* Time stamp */
+
+ dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT |
+ ASC_REQ_REPLAY_DETECT |
+ ASC_REQ_CONFIDENTIALITY |
+ ASC_REQ_EXTENDED_ERROR |
+ ASC_REQ_ALLOCATE_MEMORY |
+ ASC_REQ_STREAM;
+
+ buffers[0].pvBuffer = NULL;
+ buffers[0].BufferType = SECBUFFER_TOKEN;
+ buffers[0].cbBuffer = 0;
+
+ message.cBuffers = 1;
+ message.pBuffers = buffers;
+ message.ulVersion = SECBUFFER_VERSION;
+
+ status = AcceptSecurityContext(&sspi->creds, &sspi->context, NULL,
+ dwSSPIFlags, SECURITY_NATIVE_DREP, NULL,
+ &message, &dwSSPIOutFlags, &tsExpiry);
+
+ if (SUCCEEDED(status))
+ {
+ pbMessage = buffers[0].pvBuffer;
+ cbMessage = buffers[0].cbBuffer;
+
+ /*
+ * Send the close notify message to the client.
+ */
+
+ if (pbMessage && cbMessage)
+ {
+ cbData = send(http->fd, pbMessage, cbMessage, 0);
+ if ((cbData == SOCKET_ERROR) || (cbData == 0))
+ {
+ status = WSAGetLastError();
+ DEBUG_printf(("_httpTLSStop: sending close notify failed: %d", status));
+ }
+ else
+ {
+ FreeContextBuffer(pbMessage);
+ }
+ }
+ }
+ else
+ {
+ DEBUG_printf(("_httpTLSStop: AcceptSecurityContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), status)));
+ }
+ }
+ else
+ {
+ DEBUG_printf(("_httpTLSStop: ApplyControlToken failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), status)));
+ }
+ }
+
+ http_sspi_free(sspi);
+
+ http->tls = NULL;
+}
+
+
+/*
+ * '_httpTLSWrite()' - Write to a SSL/TLS connection.
+ */
+
+int /* O - Bytes written */
+_httpTLSWrite(http_t *http, /* I - HTTP connection */
+ const char *buf, /* I - Buffer holding data */
+ int len) /* I - Length of buffer */
+{
+ _http_sspi_t *sspi = http->tls; /* SSPI data */
+ SecBufferDesc message; /* Array of SecBuffer struct */
+ SecBuffer buffers[4] = { 0 }; /* Security package buffer */
+ int bufferLen; /* Buffer length */
+ int bytesLeft; /* Bytes left to write */
+ const char *bufptr; /* Pointer into buffer */
+ int num = 0; /* Return value */
+
+
+ bufferLen = sspi->streamSizes.cbMaximumMessage + sspi->streamSizes.cbHeader + sspi->streamSizes.cbTrailer;
+
+ if (bufferLen > sspi->writeBufferLength)
+ {
+ BYTE *temp; /* New buffer pointer */
+
+ if ((temp = (BYTE *)realloc(sspi->writeBuffer, bufferLen)) == NULL)
+ {
+ DEBUG_printf(("_httpTLSWrite: Unable to allocate buffer of %d bytes.", bufferLen));
+ WSASetLastError(E_OUTOFMEMORY);
+ return (-1);
+ }
+
+ sspi->writeBuffer = temp;
+ sspi->writeBufferLength = bufferLen;
+ }
+
+ bytesLeft = len;
+ bufptr = buf;
+
+ while (bytesLeft)
+ {
+ int chunk = min((int)sspi->streamSizes.cbMaximumMessage, bytesLeft);
+ /* Size of data to write */
+ SECURITY_STATUS scRet; /* SSPI status */
+
+ /*
+ * Copy user data into the buffer, starting just past the header...
+ */
+
+ memcpy(sspi->writeBuffer + sspi->streamSizes.cbHeader, bufptr, chunk);
+
+ /*
+ * Setup the SSPI buffers
+ */
+
+ message.ulVersion = SECBUFFER_VERSION;
+ message.cBuffers = 4;
+ message.pBuffers = buffers;
+
+ buffers[0].pvBuffer = sspi->writeBuffer;
+ buffers[0].cbBuffer = sspi->streamSizes.cbHeader;
+ buffers[0].BufferType = SECBUFFER_STREAM_HEADER;
+ buffers[1].pvBuffer = sspi->writeBuffer + sspi->streamSizes.cbHeader;
+ buffers[1].cbBuffer = (unsigned long) chunk;
+ buffers[1].BufferType = SECBUFFER_DATA;
+ buffers[2].pvBuffer = sspi->writeBuffer + sspi->streamSizes.cbHeader + chunk;
+ buffers[2].cbBuffer = sspi->streamSizes.cbTrailer;
+ buffers[2].BufferType = SECBUFFER_STREAM_TRAILER;
+ buffers[3].BufferType = SECBUFFER_EMPTY;
+
+ /*
+ * Encrypt the data
+ */
+
+ scRet = EncryptMessage(&sspi->context, 0, &message, 0);
+
+ if (FAILED(scRet))
+ {
+ DEBUG_printf(("_httpTLSWrite: EncryptMessage failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ WSASetLastError(WSASYSCALLFAILURE);
+ return (-1);
+ }
+
+ /*
+ * Send the data. Remember the size of the total data to send is the size
+ * of the header, the size of the data the caller passed in and the size
+ * of the trailer...
+ */
+
+ num = send(http->fd, sspi->writeBuffer, buffers[0].cbBuffer + buffers[1].cbBuffer + buffers[2].cbBuffer, 0);
+
+ if (num <= 0)
+ {
+ DEBUG_printf(("_httpTLSWrite: send failed: %ld", WSAGetLastError()));
+ return (num);
+ }
+
+ bytesLeft -= chunk;
+ bufptr += chunk;
+ }
+
+ return (len);
+}
+
+
+#if 0
+/*
+ * 'http_setup_ssl()' - Set up SSL/TLS support on a connection.
+ */
+
+static int /* O - 0 on success, -1 on failure */
+http_setup_ssl(http_t *http) /* I - Connection to server */
+{
+ char hostname[256], /* Hostname */
+ *hostptr; /* Pointer into hostname */
+
+ TCHAR username[256]; /* Username returned from GetUserName() */
+ TCHAR commonName[256];/* Common name for certificate */
+ DWORD dwSize; /* 32 bit size */
+
+
+ DEBUG_printf(("7http_setup_ssl(http=%p)", http));
+
+ /*
+ * Get the hostname to use for SSL...
+ */
+
+ if (httpAddrLocalhost(http->hostaddr))
+ {
+ strlcpy(hostname, "localhost", sizeof(hostname));
+ }
+ else
+ {
+ /*
+ * Otherwise make sure the hostname we have does not end in a trailing dot.
+ */
+
+ strlcpy(hostname, http->hostname, sizeof(hostname));
+ if ((hostptr = hostname + strlen(hostname) - 1) >= hostname &&
+ *hostptr == '.')
+ *hostptr = '\0';
+ }
+
+ http->tls = http_sspi_alloc();
+
+ if (!http->tls)
+ {
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
+ return (-1);
+ }
+
+ dwSize = sizeof(username) / sizeof(TCHAR);
+ GetUserName(username, &dwSize);
+ _sntprintf_s(commonName, sizeof(commonName) / sizeof(TCHAR),
+ sizeof(commonName) / sizeof(TCHAR), TEXT("CN=%s"), username);
+
+ if (!_sspiGetCredentials(http->tls, L"ClientContainer",
+ commonName, FALSE))
+ {
+ _sspiFree(http->tls);
+ http->tls = NULL;
+
+ http->error = EIO;
+ http->status = HTTP_STATUS_ERROR;
+
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI,
+ _("Unable to establish a secure connection to host."), 1);
+
+ return (-1);
+ }
+
+ _sspiSetAllowsAnyRoot(http->tls, TRUE);
+ _sspiSetAllowsExpiredCerts(http->tls, TRUE);
+
+ if (!_sspiConnect(http->tls, hostname))
+ {
+ _sspiFree(http->tls);
+ http->tls = NULL;
+
+ http->error = EIO;
+ http->status = HTTP_STATUS_ERROR;
+
+ _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI,
+ _("Unable to establish a secure connection to host."), 1);
+
+ return (-1);
+ }
+
+ return (0);
+}
+#endif // 0
+
+
+/*
+ * 'http_sspi_alloc()' - Allocate SSPI object.
+ */
+
+static _http_sspi_t * /* O - New SSPI/SSL object */
+http_sspi_alloc(void)
+{
+ return ((_http_sspi_t *)calloc(sizeof(_http_sspi_t), 1));
+}
+
+
+/*
+ * 'http_sspi_client()' - Negotiate a TLS connection as a client.
+ */
+
+static int /* O - 0 on success, -1 on failure */
+http_sspi_client(http_t *http, /* I - Client connection */
+ const char *hostname) /* I - Server hostname */
+{
+ _http_sspi_t *sspi = http->tls; /* SSPI data */
+ DWORD dwSize; /* Size for buffer */
+ DWORD dwSSPIFlags; /* SSL connection attributes we want */
+ DWORD dwSSPIOutFlags; /* SSL connection attributes we got */
+ TimeStamp tsExpiry; /* Time stamp */
+ SECURITY_STATUS scRet; /* Status */
+ int cbData; /* Data count */
+ SecBufferDesc inBuffer; /* Array of SecBuffer structs */
+ SecBuffer inBuffers[2]; /* Security package buffer */
+ SecBufferDesc outBuffer; /* Array of SecBuffer structs */
+ SecBuffer outBuffers[1]; /* Security package buffer */
+ int ret = 0; /* Return value */
+ char username[1024], /* Current username */
+ common_name[1024]; /* CN=username */
+
+
+ DEBUG_printf(("4http_sspi_client(http=%p, hostname=\"%s\")", http, hostname));
+
+ dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT |
+ ISC_REQ_REPLAY_DETECT |
+ ISC_REQ_CONFIDENTIALITY |
+ ISC_RET_EXTENDED_ERROR |
+ ISC_REQ_ALLOCATE_MEMORY |
+ ISC_REQ_STREAM;
+
+ /*
+ * Lookup the client certificate...
+ */
+
+ dwSize = sizeof(username);
+ GetUserName(username, &dwSize);
+ snprintf(common_name, sizeof(common_name), "CN=%s", username);
+
+ if (!http_sspi_find_credentials(http, L"ClientContainer", common_name))
+ if (!http_sspi_make_credentials(http->tls, L"ClientContainer", common_name, _HTTP_MODE_CLIENT, 10))
+ {
+ DEBUG_puts("5http_sspi_client: Unable to get client credentials.");
+ return (-1);
+ }
+
+ /*
+ * Initiate a ClientHello message and generate a token.
+ */
+
+ outBuffers[0].pvBuffer = NULL;
+ outBuffers[0].BufferType = SECBUFFER_TOKEN;
+ outBuffers[0].cbBuffer = 0;
+
+ outBuffer.cBuffers = 1;
+ outBuffer.pBuffers = outBuffers;
+ outBuffer.ulVersion = SECBUFFER_VERSION;
+
+ scRet = InitializeSecurityContext(&sspi->creds, NULL, TEXT(""), dwSSPIFlags, 0, SECURITY_NATIVE_DREP, NULL, 0, &sspi->context, &outBuffer, &dwSSPIOutFlags, &tsExpiry);
+
+ if (scRet != SEC_I_CONTINUE_NEEDED)
+ {
+ DEBUG_printf(("5http_sspi_client: InitializeSecurityContext(1) failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ return (-1);
+ }
+
+ /*
+ * Send response to server if there is one.
+ */
+
+ if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
+ {
+ if ((cbData = send(http->fd, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0)) <= 0)
+ {
+ DEBUG_printf(("5http_sspi_client: send failed: %d", WSAGetLastError()));
+ FreeContextBuffer(outBuffers[0].pvBuffer);
+ DeleteSecurityContext(&sspi->context);
+ return (-1);
+ }
+
+ DEBUG_printf(("5http_sspi_client: %d bytes of handshake data sent.", cbData));
+
+ FreeContextBuffer(outBuffers[0].pvBuffer);
+ outBuffers[0].pvBuffer = NULL;
+ }
+
+ dwSSPIFlags = ISC_REQ_MANUAL_CRED_VALIDATION |
+ ISC_REQ_SEQUENCE_DETECT |
+ ISC_REQ_REPLAY_DETECT |
+ ISC_REQ_CONFIDENTIALITY |
+ ISC_RET_EXTENDED_ERROR |
+ ISC_REQ_ALLOCATE_MEMORY |
+ ISC_REQ_STREAM;
+
+ sspi->decryptBufferUsed = 0;
+
+ /*
+ * Loop until the handshake is finished or an error occurs.
+ */
+
+ scRet = SEC_I_CONTINUE_NEEDED;
+
+ while(scRet == SEC_I_CONTINUE_NEEDED ||
+ scRet == SEC_E_INCOMPLETE_MESSAGE ||
+ scRet == SEC_I_INCOMPLETE_CREDENTIALS)
+ {
+ if (sspi->decryptBufferUsed == 0 || scRet == SEC_E_INCOMPLETE_MESSAGE)
+ {
+ if (sspi->decryptBufferLength <= sspi->decryptBufferUsed)
+ {
+ BYTE *temp; /* New buffer */
+
+ if (sspi->decryptBufferLength >= 262144)
+ {
+ WSASetLastError(E_OUTOFMEMORY);
+ DEBUG_puts("5http_sspi_client: Decryption buffer too large (>256k)");
+ return (-1);
+ }
+
+ if ((temp = realloc(sspi->decryptBuffer, sspi->decryptBufferLength + 4096)) == NULL)
+ {
+ DEBUG_printf(("5http_sspi_client: Unable to allocate %d byte buffer.", sspi->decryptBufferLength + 4096));
+ WSASetLastError(E_OUTOFMEMORY);
+ return (-1);
+ }
+
+ sspi->decryptBufferLength += 4096;
+ sspi->decryptBuffer = temp;
+ }
+
+ cbData = recv(http->fd, sspi->decryptBuffer + sspi->decryptBufferUsed, (int)(sspi->decryptBufferLength - sspi->decryptBufferUsed), 0);
+
+ if (cbData < 0)
+ {
+ DEBUG_printf(("5http_sspi_client: recv failed: %d", WSAGetLastError()));
+ return (-1);
+ }
+ else if (cbData == 0)
+ {
+ DEBUG_printf(("5http_sspi_client: Server unexpectedly disconnected."));
+ return (-1);
+ }
+
+ DEBUG_printf(("5http_sspi_client: %d bytes of handshake data received", cbData));
+
+ sspi->decryptBufferUsed += cbData;
+ }
+
+ /*
+ * Set up the input buffers. Buffer 0 is used to pass in data received from
+ * the server. Schannel will consume some or all of this. Leftover data
+ * (if any) will be placed in buffer 1 and given a buffer type of
+ * SECBUFFER_EXTRA.
+ */
+
+ inBuffers[0].pvBuffer = sspi->decryptBuffer;
+ inBuffers[0].cbBuffer = (unsigned long)sspi->decryptBufferUsed;
+ inBuffers[0].BufferType = SECBUFFER_TOKEN;
+
+ inBuffers[1].pvBuffer = NULL;
+ inBuffers[1].cbBuffer = 0;
+ inBuffers[1].BufferType = SECBUFFER_EMPTY;
+
+ inBuffer.cBuffers = 2;
+ inBuffer.pBuffers = inBuffers;
+ inBuffer.ulVersion = SECBUFFER_VERSION;
+
+ /*
+ * Set up the output buffers. These are initialized to NULL so as to make it
+ * less likely we'll attempt to free random garbage later.
+ */
+
+ outBuffers[0].pvBuffer = NULL;
+ outBuffers[0].BufferType = SECBUFFER_TOKEN;
+ outBuffers[0].cbBuffer = 0;
+
+ outBuffer.cBuffers = 1;
+ outBuffer.pBuffers = outBuffers;
+ outBuffer.ulVersion = SECBUFFER_VERSION;
+
+ /*
+ * Call InitializeSecurityContext.
+ */
+
+ scRet = InitializeSecurityContext(&sspi->creds, &sspi->context, NULL, dwSSPIFlags, 0, SECURITY_NATIVE_DREP, &inBuffer, 0, NULL, &outBuffer, &dwSSPIOutFlags, &tsExpiry);
+
+ /*
+ * If InitializeSecurityContext was successful (or if the error was one of
+ * the special extended ones), send the contents of the output buffer to the
+ * server.
+ */
+
+ if (scRet == SEC_E_OK ||
+ scRet == SEC_I_CONTINUE_NEEDED ||
+ FAILED(scRet) && (dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR))
+ {
+ if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
+ {
+ cbData = send(http->fd, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
+
+ if (cbData <= 0)
+ {
+ DEBUG_printf(("5http_sspi_client: send failed: %d", WSAGetLastError()));
+ FreeContextBuffer(outBuffers[0].pvBuffer);
+ DeleteSecurityContext(&sspi->context);
+ return (-1);
+ }
+
+ DEBUG_printf(("5http_sspi_client: %d bytes of handshake data sent.", cbData));
+
+ /*
+ * Free output buffer.
+ */
+
+ FreeContextBuffer(outBuffers[0].pvBuffer);
+ outBuffers[0].pvBuffer = NULL;
+ }
+ }
+
+ /*
+ * If InitializeSecurityContext returned SEC_E_INCOMPLETE_MESSAGE, then we
+ * need to read more data from the server and try again.
+ */
+
+ if (scRet == SEC_E_INCOMPLETE_MESSAGE)
+ continue;
+
+ /*
+ * If InitializeSecurityContext returned SEC_E_OK, then the handshake
+ * completed successfully.
+ */
+
+ if (scRet == SEC_E_OK)
+ {
+ /*
+ * If the "extra" buffer contains data, this is encrypted application
+ * protocol layer stuff. It needs to be saved. The application layer will
+ * later decrypt it with DecryptMessage.
+ */
+
+ DEBUG_puts("5http_sspi_client: Handshake was successful.");
+
+ if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
+ {
+ memmove(sspi->decryptBuffer, sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer, inBuffers[1].cbBuffer);
+
+ sspi->decryptBufferUsed = inBuffers[1].cbBuffer;
+
+ DEBUG_printf(("5http_sspi_client: %d bytes of app data was bundled with handshake data", sspi->decryptBufferUsed));
+ }
+ else
+ sspi->decryptBufferUsed = 0;
+
+ /*
+ * Bail out to quit
+ */
+
+ break;
+ }
+
+ /*
+ * Check for fatal error.
+ */
+
+ if (FAILED(scRet))
+ {
+ DEBUG_printf(("5http_sspi_client: InitializeSecurityContext(2) failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ ret = -1;
+ break;
+ }
+
+ /*
+ * If InitializeSecurityContext returned SEC_I_INCOMPLETE_CREDENTIALS,
+ * then the server just requested client authentication.
+ */
+
+ if (scRet == SEC_I_INCOMPLETE_CREDENTIALS)
+ {
+ /*
+ * Unimplemented
+ */
+
+ DEBUG_printf(("5http_sspi_client: server requested client credentials."));
+ ret = -1;
+ break;
+ }
+
+ /*
+ * Copy any leftover data from the "extra" buffer, and go around again.
+ */
+
+ if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
+ {
+ memmove(sspi->decryptBuffer, sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer, inBuffers[1].cbBuffer);
+
+ sspi->decryptBufferUsed = inBuffers[1].cbBuffer;
+ }
+ else
+ {
+ sspi->decryptBufferUsed = 0;
+ }
+ }
+
+ if (!ret)
+ {
+ /*
+ * Success! Get the server cert
+ */
+
+ sspi->contextInitialized = TRUE;
+
+ scRet = QueryContextAttributes(&sspi->context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (VOID *)&(sspi->remoteCert));
+
+ if (scRet != SEC_E_OK)
+ {
+ DEBUG_printf(("5http_sspi_client: QueryContextAttributes failed(SECPKG_ATTR_REMOTE_CERT_CONTEXT): %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ return (-1);
+ }
+
+ /*
+ * Find out how big the header/trailer will be:
+ */
+
+ scRet = QueryContextAttributes(&sspi->context, SECPKG_ATTR_STREAM_SIZES, &sspi->streamSizes);
+
+ if (scRet != SEC_E_OK)
+ {
+ DEBUG_printf(("5http_sspi_client: QueryContextAttributes failed(SECPKG_ATTR_STREAM_SIZES): %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ ret = -1;
+ }
+ }
+
+ return (ret);
+}
+
+
+/*
+ * 'http_sspi_create_credential()' - Create an SSPI certificate context.
+ */
+
+static PCCERT_CONTEXT /* O - Certificate context */
+http_sspi_create_credential(
+ http_credential_t *cred) /* I - Credential */
+{
+ if (cred)
+ return (CertCreateCertificateContext(X509_ASN_ENCODING, cred->data, cred->datalen));
+ else
+ return (NULL);
+}
+
+
+/*
+ * 'http_sspi_find_credentials()' - Retrieve a TLS certificate from the system store.
+ */
+
+static BOOL /* O - 1 on success, 0 on failure */
+http_sspi_find_credentials(
+ http_t *http, /* I - HTTP connection */
+ const LPWSTR container, /* I - Cert container name */
+ const char *common_name) /* I - Common name of certificate */
+{
+ _http_sspi_t *sspi = http->tls; /* SSPI data */
+ HCERTSTORE store = NULL; /* Certificate store */
+ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */
+ DWORD dwSize = 0; /* 32 bit size */
+ PBYTE p = NULL; /* Temporary storage */
+ HCRYPTPROV hProv = (HCRYPTPROV)NULL;
+ /* Handle to a CSP */
+ CERT_NAME_BLOB sib; /* Arbitrary array of bytes */
+ SCHANNEL_CRED SchannelCred; /* Schannel credential data */
+ TimeStamp tsExpiry; /* Time stamp */
+ SECURITY_STATUS Status; /* Status */
+ BOOL ok = TRUE; /* Return value */
+
+
+ if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
+ {
+ if (GetLastError() == NTE_EXISTS)
+ {
+ if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: CryptAcquireContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+ }
+ }
+
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY");
+
+ if (!store)
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: CertOpenSystemStore failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ dwSize = 0;
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ p = (PBYTE)malloc(dwSize);
+
+ if (!p)
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ sib.cbData = dwSize;
+ sib.pbData = p;
+
+ storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
+
+ if (!storedContext)
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ ZeroMemory(&SchannelCred, sizeof(SchannelCred));
+
+ SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
+ SchannelCred.cCreds = 1;
+ SchannelCred.paCred = &storedContext;
+
+ /*
+ * Set supported protocols (can also be overriden in the registry...)
+ */
+
+#ifdef SP_PROT_TLS1_2_SERVER
+ if (http->mode == _HTTP_MODE_SERVER)
+ {
+ if (tls_options & _HTTP_TLS_DENY_TLS10)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER;
+ else if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER | SP_PROT_TLS1_0_SERVER | SP_PROT_SSL3_SERVER;
+ else
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER | SP_PROT_TLS1_0_SERVER;
+ }
+ else
+ {
+ if (tls_options & _HTTP_TLS_DENY_TLS10)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT;
+ else if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_0_CLIENT | SP_PROT_SSL3_CLIENT;
+ else
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_0_CLIENT;
+ }
+
+#else
+ if (http->mode == _HTTP_MODE_SERVER)
+ {
+ if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER | SP_PROT_SSL3_SERVER;
+ else
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER;
+ }
+ else
+ {
+ if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT | SP_PROT_SSL3_CLIENT;
+ else
+ SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT;
+ }
+#endif /* SP_PROT_TLS1_2_SERVER */
+
+ /* TODO: Support _HTTP_TLS_ALLOW_RC4 and _HTTP_TLS_ALLOW_DH options; right now we'll rely on Windows registry to enable/disable RC4/DH... */
+
+ /*
+ * Create an SSPI credential.
+ */
+
+ Status = AcquireCredentialsHandle(NULL, UNISP_NAME, http->mode == _HTTP_MODE_SERVER ? SECPKG_CRED_INBOUND : SECPKG_CRED_OUTBOUND, NULL, &SchannelCred, NULL, NULL, &sspi->creds, &tsExpiry);
+ if (Status != SEC_E_OK)
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: AcquireCredentialsHandle failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), Status)));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+cleanup:
+
+ /*
+ * Cleanup
+ */
+
+ if (storedContext)
+ CertFreeCertificateContext(storedContext);
+
+ if (p)
+ free(p);
+
+ if (store)
+ CertCloseStore(store, 0);
+
+ if (hProv)
+ CryptReleaseContext(hProv, 0);
+
+ return (ok);
+}
+
+
+/*
+ * 'http_sspi_free()' - Close a connection and free resources.
+ */
+
+static void
+http_sspi_free(_http_sspi_t *sspi) /* I - SSPI data */
+{
+ if (!sspi)
+ return;
+
+ if (sspi->contextInitialized)
+ DeleteSecurityContext(&sspi->context);
+
+ if (sspi->decryptBuffer)
+ free(sspi->decryptBuffer);
+
+ if (sspi->readBuffer)
+ free(sspi->readBuffer);
+
+ if (sspi->writeBuffer)
+ free(sspi->writeBuffer);
+
+ if (sspi->localCert)
+ CertFreeCertificateContext(sspi->localCert);
+
+ if (sspi->remoteCert)
+ CertFreeCertificateContext(sspi->remoteCert);
+
+ free(sspi);
+}
+
+
+/*
+ * 'http_sspi_make_credentials()' - Create a TLS certificate in the system store.
+ */
+
+static BOOL /* O - 1 on success, 0 on failure */
+http_sspi_make_credentials(
+ _http_sspi_t *sspi, /* I - SSPI data */
+ const LPWSTR container, /* I - Cert container name */
+ const char *common_name, /* I - Common name of certificate */
+ _http_mode_t mode, /* I - Client or server? */
+ int years) /* I - Years until expiration */
+{
+ HCERTSTORE store = NULL; /* Certificate store */
+ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */
+ PCCERT_CONTEXT createdContext = NULL; /* Context created by us */
+ DWORD dwSize = 0; /* 32 bit size */
+ PBYTE p = NULL; /* Temporary storage */
+ HCRYPTPROV hProv = (HCRYPTPROV)NULL;
+ /* Handle to a CSP */
+ CERT_NAME_BLOB sib; /* Arbitrary array of bytes */
+ SCHANNEL_CRED SchannelCred; /* Schannel credential data */
+ TimeStamp tsExpiry; /* Time stamp */
+ SECURITY_STATUS Status; /* Status */
+ HCRYPTKEY hKey = (HCRYPTKEY)NULL; /* Handle to crypto key */
+ CRYPT_KEY_PROV_INFO kpi; /* Key container info */
+ SYSTEMTIME et; /* System time */
+ CERT_EXTENSIONS exts; /* Array of cert extensions */
+ CRYPT_KEY_PROV_INFO ckp; /* Handle to crypto key */
+ BOOL ok = TRUE; /* Return value */
+
+
+ DEBUG_printf(("4http_sspi_make_credentials(sspi=%p, container=%p, common_name=\"%s\", mode=%d, years=%d)", sspi, container, common_name, mode, years));
+
+ if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
+ {
+ if (GetLastError() == NTE_EXISTS)
+ {
+ if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CryptAcquireContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+ }
+ }
+
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY");
+
+ if (!store)
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CertOpenSystemStore failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ dwSize = 0;
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ p = (PBYTE)malloc(dwSize);
+
+ if (!p)
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: malloc failed for %d bytes", dwSize));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ if (!CertStrToName(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ /*
+ * Create a private key and self-signed certificate...
+ */
+
+ if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey))
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CryptGenKey failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ ZeroMemory(&kpi, sizeof(kpi));
+ kpi.pwszContainerName = (LPWSTR)container;
+ kpi.pwszProvName = MS_DEF_PROV_W;
+ kpi.dwProvType = PROV_RSA_FULL;
+ kpi.dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID;
+ kpi.dwKeySpec = AT_KEYEXCHANGE;
+
+ GetSystemTime(&et);
+ et.wYear += years;
+
+ ZeroMemory(&exts, sizeof(exts));
+
+ createdContext = CertCreateSelfSignCertificate(hProv, &sib, 0, &kpi, NULL, NULL, &et, &exts);
+
+ if (!createdContext)
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CertCreateSelfSignCertificate failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ /*
+ * Add the created context to the named store, and associate it with the named
+ * container...
+ */
+
+ if (!CertAddCertificateContextToStore(store, createdContext, CERT_STORE_ADD_REPLACE_EXISTING, &storedContext))
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CertAddCertificateContextToStore failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ ZeroMemory(&ckp, sizeof(ckp));
+ ckp.pwszContainerName = (LPWSTR) container;
+ ckp.pwszProvName = MS_DEF_PROV_W;
+ ckp.dwProvType = PROV_RSA_FULL;
+ ckp.dwFlags = CRYPT_MACHINE_KEYSET;
+ ckp.dwKeySpec = AT_KEYEXCHANGE;
+
+ if (!CertSetCertificateContextProperty(storedContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &ckp))
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: CertSetCertificateContextProperty failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+ /*
+ * Get a handle to use the certificate...
+ */
+
+ ZeroMemory(&SchannelCred, sizeof(SchannelCred));
+
+ SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
+ SchannelCred.cCreds = 1;
+ SchannelCred.paCred = &storedContext;
+
+ /*
+ * SSPI doesn't seem to like it if grbitEnabledProtocols is set for a client.
+ */
+
+ if (mode == _HTTP_MODE_SERVER)
+ SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1;
+
+ /*
+ * Create an SSPI credential.
+ */
+
+ Status = AcquireCredentialsHandle(NULL, UNISP_NAME, mode == _HTTP_MODE_SERVER ? SECPKG_CRED_INBOUND : SECPKG_CRED_OUTBOUND, NULL, &SchannelCred, NULL, NULL, &sspi->creds, &tsExpiry);
+ if (Status != SEC_E_OK)
+ {
+ DEBUG_printf(("5http_sspi_make_credentials: AcquireCredentialsHandle failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), Status)));
+ ok = FALSE;
+ goto cleanup;
+ }
+
+cleanup:
+
+ /*
+ * Cleanup
+ */
+
+ if (hKey)
+ CryptDestroyKey(hKey);
+
+ if (createdContext)
+ CertFreeCertificateContext(createdContext);
+
+ if (storedContext)
+ CertFreeCertificateContext(storedContext);
+
+ if (p)
+ free(p);
+
+ if (store)
+ CertCloseStore(store, 0);
+
+ if (hProv)
+ CryptReleaseContext(hProv, 0);
+
+ return (ok);
+}
+
+
+/*
+ * 'http_sspi_server()' - Negotiate a TLS connection as a server.
+ */
+
+static int /* O - 0 on success, -1 on failure */
+http_sspi_server(http_t *http, /* I - HTTP connection */
+ const char *hostname) /* I - Hostname of server */
+{
+ _http_sspi_t *sspi = http->tls; /* I - SSPI data */
+ char common_name[512]; /* Common name for cert */
+ DWORD dwSSPIFlags; /* SSL connection attributes we want */
+ DWORD dwSSPIOutFlags; /* SSL connection attributes we got */
+ TimeStamp tsExpiry; /* Time stamp */
+ SECURITY_STATUS scRet; /* SSPI Status */
+ SecBufferDesc inBuffer; /* Array of SecBuffer structs */
+ SecBuffer inBuffers[2]; /* Security package buffer */
+ SecBufferDesc outBuffer; /* Array of SecBuffer structs */
+ SecBuffer outBuffers[1]; /* Security package buffer */
+ int num = 0; /* 32 bit status value */
+ BOOL fInitContext = TRUE; /* Has the context been init'd? */
+ int ret = 0; /* Return value */
+
+
+ DEBUG_printf(("4http_sspi_server(http=%p, hostname=\"%s\")", http, hostname));
+
+ dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT |
+ ASC_REQ_REPLAY_DETECT |
+ ASC_REQ_CONFIDENTIALITY |
+ ASC_REQ_EXTENDED_ERROR |
+ ASC_REQ_ALLOCATE_MEMORY |
+ ASC_REQ_STREAM;
+
+ sspi->decryptBufferUsed = 0;
+
+ /*
+ * Lookup the server certificate...
+ */
+
+ snprintf(common_name, sizeof(common_name), "CN=%s", hostname);
+
+ if (!http_sspi_find_credentials(http, L"ServerContainer", common_name))
+ if (!http_sspi_make_credentials(http->tls, L"ServerContainer", common_name, _HTTP_MODE_SERVER, 10))
+ {
+ DEBUG_puts("5http_sspi_server: Unable to get server credentials.");
+ return (-1);
+ }
+
+ /*
+ * Set OutBuffer for AcceptSecurityContext call
+ */
+
+ outBuffer.cBuffers = 1;
+ outBuffer.pBuffers = outBuffers;
+ outBuffer.ulVersion = SECBUFFER_VERSION;
+
+ scRet = SEC_I_CONTINUE_NEEDED;
+
+ while (scRet == SEC_I_CONTINUE_NEEDED ||
+ scRet == SEC_E_INCOMPLETE_MESSAGE ||
+ scRet == SEC_I_INCOMPLETE_CREDENTIALS)
+ {
+ if (sspi->decryptBufferUsed == 0 || scRet == SEC_E_INCOMPLETE_MESSAGE)
+ {
+ if (sspi->decryptBufferLength <= sspi->decryptBufferUsed)
+ {
+ BYTE *temp; /* New buffer */
+
+ if (sspi->decryptBufferLength >= 262144)
+ {
+ WSASetLastError(E_OUTOFMEMORY);
+ DEBUG_puts("5http_sspi_server: Decryption buffer too large (>256k)");
+ return (-1);
+ }
+
+ if ((temp = realloc(sspi->decryptBuffer, sspi->decryptBufferLength + 4096)) == NULL)
+ {
+ DEBUG_printf(("5http_sspi_server: Unable to allocate %d byte buffer.", sspi->decryptBufferLength + 4096));
+ WSASetLastError(E_OUTOFMEMORY);
+ return (-1);
+ }
+
+ sspi->decryptBufferLength += 4096;
+ sspi->decryptBuffer = temp;
+ }
+
+ for (;;)
+ {
+ num = recv(http->fd, sspi->decryptBuffer + sspi->decryptBufferUsed, (int)(sspi->decryptBufferLength - sspi->decryptBufferUsed), 0);
+
+ if (num == -1 && WSAGetLastError() == WSAEWOULDBLOCK)
+ Sleep(1);
+ else
+ break;
+ }
+
+ if (num < 0)
+ {
+ DEBUG_printf(("5http_sspi_server: recv failed: %d", WSAGetLastError()));
+ return (-1);
+ }
+ else if (num == 0)
+ {
+ DEBUG_puts("5http_sspi_server: client disconnected");
+ return (-1);
+ }
+
+ DEBUG_printf(("5http_sspi_server: received %d (handshake) bytes from client.", num));
+ sspi->decryptBufferUsed += num;
+ }
+
+ /*
+ * InBuffers[1] is for getting extra data that SSPI/SCHANNEL doesn't process
+ * on this run around the loop.
+ */
+
+ inBuffers[0].pvBuffer = sspi->decryptBuffer;
+ inBuffers[0].cbBuffer = (unsigned long)sspi->decryptBufferUsed;
+ inBuffers[0].BufferType = SECBUFFER_TOKEN;
+
+ inBuffers[1].pvBuffer = NULL;
+ inBuffers[1].cbBuffer = 0;
+ inBuffers[1].BufferType = SECBUFFER_EMPTY;
+
+ inBuffer.cBuffers = 2;
+ inBuffer.pBuffers = inBuffers;
+ inBuffer.ulVersion = SECBUFFER_VERSION;
+
+ /*
+ * Initialize these so if we fail, pvBuffer contains NULL, so we don't try to
+ * free random garbage at the quit.
+ */
+
+ outBuffers[0].pvBuffer = NULL;
+ outBuffers[0].BufferType = SECBUFFER_TOKEN;
+ outBuffers[0].cbBuffer = 0;
+
+ scRet = AcceptSecurityContext(&sspi->creds, (fInitContext?NULL:&sspi->context), &inBuffer, dwSSPIFlags, SECURITY_NATIVE_DREP, (fInitContext?&sspi->context:NULL), &outBuffer, &dwSSPIOutFlags, &tsExpiry);
+
+ fInitContext = FALSE;
+
+ if (scRet == SEC_E_OK ||
+ scRet == SEC_I_CONTINUE_NEEDED ||
+ (FAILED(scRet) && ((dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR) != 0)))
+ {
+ if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
+ {
+ /*
+ * Send response to server if there is one.
+ */
+
+ num = send(http->fd, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
+
+ if (num <= 0)
+ {
+ DEBUG_printf(("5http_sspi_server: handshake send failed: %d", WSAGetLastError()));
+ return (-1);
+ }
+
+ DEBUG_printf(("5http_sspi_server: sent %d handshake bytes to client.", outBuffers[0].cbBuffer));
+
+ FreeContextBuffer(outBuffers[0].pvBuffer);
+ outBuffers[0].pvBuffer = NULL;
+ }
+ }
+
+ if (scRet == SEC_E_OK)
+ {
+ /*
+ * If there's extra data then save it for next time we go to decrypt.
+ */
+
+ if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
+ {
+ memcpy(sspi->decryptBuffer, (LPBYTE)(sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer), inBuffers[1].cbBuffer);
+ sspi->decryptBufferUsed = inBuffers[1].cbBuffer;
+ }
+ else
+ {
+ sspi->decryptBufferUsed = 0;
+ }
+ break;
+ }
+ else if (FAILED(scRet) && scRet != SEC_E_INCOMPLETE_MESSAGE)
+ {
+ DEBUG_printf(("5http_sspi_server: AcceptSecurityContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ ret = -1;
+ break;
+ }
+
+ if (scRet != SEC_E_INCOMPLETE_MESSAGE &&
+ scRet != SEC_I_INCOMPLETE_CREDENTIALS)
+ {
+ if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
+ {
+ memcpy(sspi->decryptBuffer, (LPBYTE)(sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer), inBuffers[1].cbBuffer);
+ sspi->decryptBufferUsed = inBuffers[1].cbBuffer;
+ }
+ else
+ {
+ sspi->decryptBufferUsed = 0;
+ }
+ }
+ }
+
+ if (!ret)
+ {
+ sspi->contextInitialized = TRUE;
+
+ /*
+ * Find out how big the header will be:
+ */
+
+ scRet = QueryContextAttributes(&sspi->context, SECPKG_ATTR_STREAM_SIZES, &sspi->streamSizes);
+
+ if (scRet != SEC_E_OK)
+ {
+ DEBUG_printf(("5http_sspi_server: QueryContextAttributes failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet)));
+ ret = -1;
+ }
+ }
+
+ return (ret);
+}
+
+
+/*
+ * 'http_sspi_strerror()' - Return a string for the specified error code.
+ */
+
+static const char * /* O - String for error */
+http_sspi_strerror(char *buffer, /* I - Error message buffer */
+ size_t bufsize, /* I - Size of buffer */
+ DWORD code) /* I - Error code */
+{
+ if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, 0, buffer, bufsize, NULL))
+ {
+ /*
+ * Strip trailing CR + LF...
+ */
+
+ char *ptr; /* Pointer into error message */
+
+ for (ptr = buffer + strlen(buffer) - 1; ptr >= buffer; ptr --)
+ if (*ptr == '\n' || *ptr == '\r')
+ *ptr = '\0';
+ else
+ break;
+ }
+ else
+ snprintf(buffer, bufsize, "Unknown error %x", code);
+
+ return (buffer);
+}
+
+
+/*
+ * 'http_sspi_verify()' - Verify a certificate.
+ */
+
+static DWORD /* O - Error code (0 == No error) */
+http_sspi_verify(
+ PCCERT_CONTEXT cert, /* I - Server certificate */
+ const char *common_name, /* I - Common name */
+ DWORD dwCertFlags) /* I - Verification flags */
+{
+ HTTPSPolicyCallbackData httpsPolicy; /* HTTPS Policy Struct */
+ CERT_CHAIN_POLICY_PARA policyPara; /* Cert chain policy parameters */
+ CERT_CHAIN_POLICY_STATUS policyStatus;/* Cert chain policy status */
+ CERT_CHAIN_PARA chainPara; /* Used for searching and matching criteria */
+ PCCERT_CHAIN_CONTEXT chainContext = NULL;
+ /* Certificate chain */
+ PWSTR commonNameUnicode = NULL;
+ /* Unicode common name */
+ LPSTR rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH,
+ szOID_SERVER_GATED_CRYPTO,
+ szOID_SGC_NETSCAPE };
+ /* How are we using this certificate? */
+ DWORD cUsages = sizeof(rgszUsages) / sizeof(LPSTR);
+ /* Number of ites in rgszUsages */
+ DWORD count; /* 32 bit count variable */
+ DWORD status; /* Return value */
+#ifdef DEBUG
+ char error[1024]; /* Error message string */
+#endif /* DEBUG */
+
+
+ if (!cert)
+ return (SEC_E_WRONG_PRINCIPAL);
+
+ /*
+ * Convert common name to Unicode.
+ */
+
+ if (!common_name || !*common_name)
+ return (SEC_E_WRONG_PRINCIPAL);
+
+ count = MultiByteToWideChar(CP_ACP, 0, common_name, -1, NULL, 0);
+ commonNameUnicode = LocalAlloc(LMEM_FIXED, count * sizeof(WCHAR));
+ if (!commonNameUnicode)
+ return (SEC_E_INSUFFICIENT_MEMORY);
+
+ if (!MultiByteToWideChar(CP_ACP, 0, common_name, -1, commonNameUnicode, count))
+ {
+ LocalFree(commonNameUnicode);
+ return (SEC_E_WRONG_PRINCIPAL);
+ }
+
+ /*
+ * Build certificate chain.
+ */
+
+ ZeroMemory(&chainPara, sizeof(chainPara));
+
+ chainPara.cbSize = sizeof(chainPara);
+ chainPara.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR;
+ chainPara.RequestedUsage.Usage.cUsageIdentifier = cUsages;
+ chainPara.RequestedUsage.Usage.rgpszUsageIdentifier = rgszUsages;
+
+ if (!CertGetCertificateChain(NULL, cert, NULL, cert->hCertStore, &chainPara, 0, NULL, &chainContext))
+ {
+ status = GetLastError();
+
+ DEBUG_printf(("CertGetCertificateChain returned: %s", http_sspi_strerror(error, sizeof(error), status)));
+
+ LocalFree(commonNameUnicode);
+ return (status);
+ }
+
+ /*
+ * Validate certificate chain.
+ */
+
+ ZeroMemory(&httpsPolicy, sizeof(HTTPSPolicyCallbackData));
+ httpsPolicy.cbStruct = sizeof(HTTPSPolicyCallbackData);
+ httpsPolicy.dwAuthType = AUTHTYPE_SERVER;
+ httpsPolicy.fdwChecks = dwCertFlags;
+ httpsPolicy.pwszServerName = commonNameUnicode;
+
+ memset(&policyPara, 0, sizeof(policyPara));
+ policyPara.cbSize = sizeof(policyPara);
+ policyPara.pvExtraPolicyPara = &httpsPolicy;
+
+ memset(&policyStatus, 0, sizeof(policyStatus));
+ policyStatus.cbSize = sizeof(policyStatus);
+
+ if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, chainContext, &policyPara, &policyStatus))
+ {
+ status = GetLastError();
+
+ DEBUG_printf(("CertVerifyCertificateChainPolicy returned %s", http_sspi_strerror(error, sizeof(error), status)));
+ }
+ else if (policyStatus.dwError)
+ status = policyStatus.dwError;
+ else
+ status = SEC_E_OK;
+
+ if (chainContext)
+ CertFreeCertificateChain(chainContext);
+
+ if (commonNameUnicode)
+ LocalFree(commonNameUnicode);
+
+ return (status);
+}
+
+
+/*
+ * End of "$Id: tls-sspi.c 12647 2015-05-20 18:37:52Z msweet $".
+ */
diff --git a/cups/tls.c b/cups/tls.c
new file mode 100644
index 0000000..14b0260
--- /dev/null
+++ b/cups/tls.c
@@ -0,0 +1,112 @@
+/*
+ * "$Id: tls.c 12136 2014-08-29 15:19:40Z msweet $"
+ *
+ * TLS routines for CUPS.
+ *
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "cups-private.h"
+#include <fcntl.h>
+#include <math.h>
+#ifdef WIN32
+# include <tchar.h>
+#else
+# include <signal.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif /* WIN32 */
+#ifdef HAVE_POLL
+# include <poll.h>
+#endif /* HAVE_POLL */
+
+
+/*
+ * Local functions...
+ */
+
+#ifdef HAVE_SSL
+# ifdef HAVE_GNUTLS
+# include "tls-gnutls.c"
+# elif defined(HAVE_CDSASSL)
+# include "tls-darwin.c"
+# elif defined(HAVE_SSPISSL)
+# include "tls-sspi.c"
+# endif /* HAVE_GNUTLS */
+#else
+/* Stubs for when TLS is not supported/available */
+int
+httpCopyCredentials(http_t *http, cups_array_t **credentials)
+{
+ (void)http;
+ if (credentials)
+ *credentials = NULL;
+ return (-1);
+}
+int
+httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name)
+{
+ (void)credentials;
+ (void)common_name;
+ return (1);
+}
+time_t
+httpCredentialsGetExpiration(cups_array_t *credentials)
+{
+ (void)credentials;
+ return (INT_MAX);
+}
+http_trust_t
+httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name)
+{
+ (void)credentials;
+ (void)common_name;
+ return (HTTP_TRUST_OK);
+}
+size_t
+httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize)
+{
+ (void)credentials;
+ (void)bufsize;
+ if (buffer)
+ *buffer = '\0';
+ return (0);
+}
+int
+httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name)
+{
+ (void)path;
+ (void)credentials;
+ (void)common_name;
+ return (-1);
+}
+int
+httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name)
+{
+ (void)path;
+ (void)credentials;
+ (void)common_name;
+ return (-1);
+}
+#endif /* HAVE_SSL */
+
+
+/*
+ * End of "$Id: tls.c 12136 2014-08-29 15:19:40Z msweet $".
+ */
diff --git a/cups/tlscheck.c b/cups/tlscheck.c
new file mode 100644
index 0000000..56cc1de
--- /dev/null
+++ b/cups/tlscheck.c
@@ -0,0 +1,739 @@
+/*
+ * "$Id: tlscheck.c 12688 2015-06-03 17:31:30Z msweet $"
+ *
+ * TLS check program for CUPS.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "cups-private.h"
+
+
+#ifndef HAVE_SSL
+int main(void) { puts("Sorry, no TLS support compiled in."); return (1); }
+#else
+
+/*
+ * Local functions...
+ */
+
+static void usage(void);
+
+
+/*
+ * 'main()' - Main entry.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line arguments */
+ char *argv[]) /* I - Command-line arguments */
+{
+ int i; /* Looping var */
+ http_t *http; /* HTTP connection */
+ const char *server = NULL; /* Hostname from command-line */
+ int port = 0; /* Port number */
+ const char *cipherName = "UNKNOWN";/* Cipher suite name */
+ int dhBits = 0; /* Diffie-Hellman bits */
+ int tlsVersion = 0; /* TLS version number */
+ char uri[1024], /* Printer URI */
+ scheme[32], /* URI scheme */
+ host[256], /* Hostname */
+ userpass[256], /* Username/password */
+ resource[256]; /* Resource path */
+ int tls_options = _HTTP_TLS_NONE,
+ /* TLS options */
+ verbose = 0; /* Verbosity */
+ ipp_t *request, /* IPP Get-Printer-Attributes request */
+ *response; /* IPP Get-Printer-Attributes response */
+ ipp_attribute_t *attr; /* Current attribute */
+ const char *name; /* Attribute name */
+ char value[1024]; /* Attribute (string) value */
+ static const char * const pattrs[] = /* Requested attributes */
+ {
+ "color-supported",
+ "compression-supported",
+ "document-format-supported",
+ "pages-per-minute",
+ "printer-location",
+ "printer-make-and-model",
+ "printer-state",
+ "printer-state-reasons",
+ "sides-supported",
+ "uri-authentication-supported",
+ "uri-security-supported"
+ };
+
+
+ for (i = 1; i < argc; i ++)
+ {
+ if (!strcmp(argv[i], "--dh"))
+ {
+ tls_options |= _HTTP_TLS_ALLOW_DH;
+ }
+ else if (!strcmp(argv[i], "--no-tls10"))
+ {
+ tls_options |= _HTTP_TLS_DENY_TLS10;
+ }
+ else if (!strcmp(argv[i], "--rc4"))
+ {
+ tls_options |= _HTTP_TLS_ALLOW_RC4;
+ }
+ else if (!strcmp(argv[i], "--verbose") || !strcmp(argv[i], "-v"))
+ {
+ verbose = 1;
+ }
+ else if (argv[i][0] == '-')
+ {
+ printf("tlscheck: Unknown option '%s'.\n", argv[i]);
+ usage();
+ }
+ else if (!server)
+ {
+ if (!strncmp(argv[i], "ipps://", 7))
+ {
+ httpSeparateURI(HTTP_URI_CODING_ALL, argv[i], scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource));
+ server = host;
+ }
+ else
+ {
+ server = argv[i];
+ strlcpy(resource, "/ipp/print", sizeof(resource));
+ }
+ }
+ else if (!port && (argv[i][0] == '=' || isdigit(argv[i][0] & 255)))
+ {
+ if (argv[i][0] == '=')
+ port = atoi(argv[i] + 1);
+ else
+ port = atoi(argv[i]);
+ }
+ else
+ {
+ printf("tlscheck: Unexpected argument '%s'.\n", argv[i]);
+ usage();
+ }
+ }
+
+ if (!server)
+ usage();
+
+ if (!port)
+ port = 631;
+
+ _httpTLSSetOptions(tls_options);
+
+ http = httpConnect2(server, port, NULL, AF_UNSPEC, HTTP_ENCRYPTION_ALWAYS, 1, 30000, NULL);
+ if (!http)
+ {
+ printf("%s: ERROR (%s)\n", server, cupsLastErrorString());
+ return (1);
+ }
+
+#ifdef __APPLE__
+ SSLProtocol protocol;
+ SSLCipherSuite cipher;
+ char unknownCipherName[256];
+ int paramsNeeded = 0;
+ const void *params;
+ size_t paramsLen;
+ OSStatus err;
+
+ if ((err = SSLGetNegotiatedProtocolVersion(http->tls, &protocol)) != noErr)
+ {
+ printf("%s: ERROR (No protocol version - %d)\n", server, (int)err);
+ httpClose(http);
+ return (1);
+ }
+
+ switch (protocol)
+ {
+ default :
+ tlsVersion = 0;
+ break;
+ case kSSLProtocol3 :
+ tlsVersion = 30;
+ break;
+ case kTLSProtocol1 :
+ tlsVersion = 10;
+ break;
+ case kTLSProtocol11 :
+ tlsVersion = 11;
+ break;
+ case kTLSProtocol12 :
+ tlsVersion = 12;
+ break;
+ }
+
+ if ((err = SSLGetNegotiatedCipher(http->tls, &cipher)) != noErr)
+ {
+ printf("%s: ERROR (No cipher suite - %d)\n", server, (int)err);
+ httpClose(http);
+ return (1);
+ }
+
+ switch (cipher)
+ {
+ case TLS_NULL_WITH_NULL_NULL:
+ cipherName = "TLS_NULL_WITH_NULL_NULL";
+ break;
+ case TLS_RSA_WITH_NULL_MD5:
+ cipherName = "TLS_RSA_WITH_NULL_MD5";
+ break;
+ case TLS_RSA_WITH_NULL_SHA:
+ cipherName = "TLS_RSA_WITH_NULL_SHA";
+ break;
+ case TLS_RSA_WITH_RC4_128_MD5:
+ cipherName = "TLS_RSA_WITH_RC4_128_MD5";
+ break;
+ case TLS_RSA_WITH_RC4_128_SHA:
+ cipherName = "TLS_RSA_WITH_RC4_128_SHA";
+ break;
+ case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_RSA_WITH_3DES_EDE_CBC_SHA";
+ break;
+ case TLS_RSA_WITH_NULL_SHA256:
+ cipherName = "TLS_RSA_WITH_NULL_SHA256";
+ break;
+ case TLS_RSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_RSA_WITH_AES_128_CBC_SHA256";
+ break;
+ case TLS_RSA_WITH_AES_256_CBC_SHA256:
+ cipherName = "TLS_RSA_WITH_AES_256_CBC_SHA256";
+ break;
+ case TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_DH_DSS_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_DH_RSA_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
+ cipherName = "TLS_DH_DSS_WITH_AES_256_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
+ cipherName = "TLS_DH_RSA_WITH_AES_256_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
+ cipherName = "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
+ cipherName = "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_RC4_128_MD5:
+ cipherName = "TLS_DH_anon_WITH_RC4_128_MD5";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_DH_anon_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_AES_256_CBC_SHA256:
+ cipherName = "TLS_DH_anon_WITH_AES_256_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_PSK_WITH_RC4_128_SHA:
+ cipherName = "TLS_PSK_WITH_RC4_128_SHA";
+ break;
+ case TLS_PSK_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_PSK_WITH_3DES_EDE_CBC_SHA";
+ break;
+ case TLS_PSK_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_PSK_WITH_AES_128_CBC_SHA";
+ break;
+ case TLS_PSK_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_PSK_WITH_AES_256_CBC_SHA";
+ break;
+ case TLS_DHE_PSK_WITH_RC4_128_SHA:
+ cipherName = "TLS_DHE_PSK_WITH_RC4_128_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_DHE_PSK_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_DHE_PSK_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_RSA_PSK_WITH_RC4_128_SHA:
+ cipherName = "TLS_RSA_PSK_WITH_RC4_128_SHA";
+ break;
+ case TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA";
+ break;
+ case TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_RSA_PSK_WITH_AES_128_CBC_SHA";
+ break;
+ case TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_RSA_PSK_WITH_AES_256_CBC_SHA";
+ break;
+ case TLS_PSK_WITH_NULL_SHA:
+ cipherName = "TLS_PSK_WITH_NULL_SHA";
+ break;
+ case TLS_DHE_PSK_WITH_NULL_SHA:
+ cipherName = "TLS_DHE_PSK_WITH_NULL_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_RSA_PSK_WITH_NULL_SHA:
+ cipherName = "TLS_RSA_PSK_WITH_NULL_SHA";
+ break;
+ case TLS_RSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_RSA_WITH_AES_128_GCM_SHA256";
+ break;
+ case TLS_RSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_RSA_WITH_AES_256_GCM_SHA384";
+ break;
+ case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_DH_RSA_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_DH_RSA_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_DH_DSS_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_DH_DSS_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_DH_anon_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_DH_anon_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_PSK_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_PSK_WITH_AES_128_GCM_SHA256";
+ break;
+ case TLS_PSK_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_PSK_WITH_AES_256_GCM_SHA384";
+ break;
+ case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256";
+ break;
+ case TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384";
+ break;
+ case TLS_PSK_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_PSK_WITH_AES_128_CBC_SHA256";
+ break;
+ case TLS_PSK_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_PSK_WITH_AES_256_CBC_SHA384";
+ break;
+ case TLS_PSK_WITH_NULL_SHA256:
+ cipherName = "TLS_PSK_WITH_NULL_SHA256";
+ break;
+ case TLS_PSK_WITH_NULL_SHA384:
+ cipherName = "TLS_PSK_WITH_NULL_SHA384";
+ break;
+ case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_NULL_SHA256:
+ cipherName = "TLS_DHE_PSK_WITH_NULL_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_PSK_WITH_NULL_SHA384:
+ cipherName = "TLS_DHE_PSK_WITH_NULL_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256";
+ break;
+ case TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384";
+ break;
+ case TLS_RSA_PSK_WITH_NULL_SHA256:
+ cipherName = "TLS_RSA_PSK_WITH_NULL_SHA256";
+ break;
+ case TLS_RSA_PSK_WITH_NULL_SHA384:
+ cipherName = "TLS_RSA_PSK_WITH_NULL_SHA384";
+ break;
+ case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
+ cipherName = "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
+ cipherName = "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
+ cipherName = "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
+ cipherName = "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384";
+ paramsNeeded = 1;
+ break;
+ case TLS_RSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_RSA_WITH_AES_128_CBC_SHA";
+ break;
+ case TLS_DH_DSS_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_DH_DSS_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_DH_RSA_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_DHE_DSS_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_DHE_RSA_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_DH_anon_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_RSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_RSA_WITH_AES_256_CBC_SHA";
+ break;
+ case TLS_DH_DSS_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_DH_DSS_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_RSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_DH_RSA_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_DHE_DSS_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_DHE_RSA_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_DH_anon_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_DH_anon_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_NULL_SHA:
+ cipherName = "TLS_ECDH_ECDSA_WITH_NULL_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
+ cipherName = "TLS_ECDH_ECDSA_WITH_RC4_128_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_NULL_SHA:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_NULL_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_NULL_SHA:
+ cipherName = "TLS_ECDH_RSA_WITH_NULL_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_RC4_128_SHA:
+ cipherName = "TLS_ECDH_RSA_WITH_RC4_128_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_NULL_SHA:
+ cipherName = "TLS_ECDHE_RSA_WITH_NULL_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
+ cipherName = "TLS_ECDHE_RSA_WITH_RC4_128_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_anon_WITH_NULL_SHA:
+ cipherName = "TLS_ECDH_anon_WITH_NULL_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_anon_WITH_RC4_128_SHA:
+ cipherName = "TLS_ECDH_anon_WITH_RC4_128_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
+ cipherName = "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
+ cipherName = "TLS_ECDH_anon_WITH_AES_128_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ case TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
+ cipherName = "TLS_ECDH_anon_WITH_AES_256_CBC_SHA";
+ paramsNeeded = 1;
+ break;
+ default :
+ snprintf(unknownCipherName, sizeof(unknownCipherName), "UNKNOWN_%04X", cipher);
+ cipherName = unknownCipherName;
+ break;
+ }
+
+ if (cipher == TLS_RSA_WITH_RC4_128_MD5 ||
+ cipher == TLS_RSA_WITH_RC4_128_SHA)
+ {
+ printf("%s: ERROR (Printers MUST NOT negotiate RC4 cipher suites.)\n", server);
+ httpClose(http);
+ return (1);
+ }
+
+ if ((err = SSLGetDiffieHellmanParams(http->tls, &params, &paramsLen)) != noErr && paramsNeeded)
+ {
+ printf("%s: ERROR (Unable to get Diffie-Hellman parameters - %d)\n", server, (int)err);
+ httpClose(http);
+ return (1);
+ }
+
+ if (paramsLen < 128 && paramsLen != 0)
+ {
+ printf("%s: ERROR (Diffie-Hellman parameters MUST be at least 2048 bits, but Printer uses only %d bits/%d bytes)\n", server, (int)paramsLen * 8, (int)paramsLen);
+ httpClose(http);
+ return (1);
+ }
+
+ dhBits = (int)paramsLen * 8;
+#endif /* __APPLE__ */
+
+ if (dhBits > 0)
+ printf("%s: OK (TLS: %d.%d, %s, %d DH bits)\n", server, tlsVersion / 10, tlsVersion % 10, cipherName, dhBits);
+ else
+ printf("%s: OK (TLS: %d.%d, %s)\n", server, tlsVersion / 10, tlsVersion % 10, cipherName);
+
+ if (verbose)
+ {
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipps", NULL, host, port, resource);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs);
+
+ response = cupsDoRequest(http, request, resource);
+
+ for (attr = ippFirstAttribute(response); attr; attr = ippNextAttribute(response))
+ {
+ if (ippGetGroupTag(attr) != IPP_TAG_PRINTER)
+ continue;
+
+ if ((name = ippGetName(attr)) == NULL)
+ continue;
+
+ ippAttributeString(attr, value, sizeof(value));
+ printf(" %s=%s\n", name, value);
+ }
+
+ ippDelete(response);
+ }
+
+ httpClose(http);
+
+ return (0);
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(void)
+{
+ puts("Usage: ./tlscheck [options] server [port]");
+ puts(" ./tlscheck [options] ipps://server[:port]/path");
+ puts("");
+ puts("Options:");
+ puts(" --dh Allow DH/DHE key exchange");
+ puts(" --no-tls10 Disable TLS/1.0");
+ puts(" --rc4 Allow RC4 encryption");
+ puts(" --verbose Be verbose");
+ puts(" -v Be verbose");
+ puts("");
+ puts("The default port is 631.");
+
+ exit(1);
+}
+#endif /* !HAVE_SSL */
+
+
+/*
+ * End of "$Id: tlscheck.c 12688 2015-06-03 17:31:30Z msweet $".
+ */
diff --git a/cups/transcode.c b/cups/transcode.c
index 2289220..81b596f 100644
--- a/cups/transcode.c
+++ b/cups/transcode.c
@@ -1,26 +1,18 @@
/*
- * "$Id: transcode.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: transcode.c 12330 2014-12-09 20:57:28Z msweet $"
*
- * Transcoding support for CUPS.
+ * Transcoding support for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsCharmapFlush() - Flush all character set maps out of cache.
- * cupsCharsetToUTF8() - Convert legacy character set to UTF-8.
- * cupsUTF8ToCharset() - Convert UTF-8 to legacy character set.
- * cupsUTF8ToUTF32() - Convert UTF-8 to UTF-32.
- * cupsUTF32ToUTF8() - Convert UTF-32 to UTF-8.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -117,7 +109,7 @@ cupsCharsetToUTF8(
if (encoding == CUPS_UTF8 || encoding <= CUPS_US_ASCII ||
encoding >= CUPS_ENCODING_VBCS_END)
{
- strlcpy((char *)dest, src, maxout);
+ strlcpy((char *)dest, src, (size_t)maxout);
return ((int)strlen((char *)dest));
}
@@ -141,11 +133,11 @@ cupsCharsetToUTF8(
if (ch & 128)
{
- *destptr++ = 0xc0 | (ch >> 6);
- *destptr++ = 0x80 | (ch & 0x3f);
+ *destptr++ = (cups_utf8_t)(0xc0 | (ch >> 6));
+ *destptr++ = (cups_utf8_t)(0x80 | (ch & 0x3f));
}
else
- *destptr++ = ch;
+ *destptr++ = (cups_utf8_t)ch;
}
*destptr = '\0';
@@ -162,11 +154,15 @@ cupsCharsetToUTF8(
if (map_encoding != encoding)
{
+ char toset[1024]; /* Destination character set */
+
_cupsCharmapFlush();
+ snprintf(toset, sizeof(toset), "%s//IGNORE", _cupsEncodingName(encoding));
+
+ map_encoding = encoding;
map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8");
- map_to_utf8 = iconv_open("UTF-8", _cupsEncodingName(encoding));
- map_encoding = encoding;
+ map_to_utf8 = iconv_open("UTF-8", toset);
}
if (map_to_utf8 != (iconv_t)-1)
@@ -174,7 +170,7 @@ cupsCharsetToUTF8(
char *altdestptr = (char *)dest; /* Silence bogus GCC type-punned */
srclen = strlen(src);
- outBytesLeft = maxout - 1;
+ outBytesLeft = (size_t)maxout - 1;
iconv(map_to_utf8, (char **)&src, &srclen, &altdestptr, &outBytesLeft);
*altdestptr = '\0';
@@ -234,7 +230,7 @@ cupsUTF8ToCharset(
if (encoding == CUPS_UTF8 ||
encoding >= CUPS_ENCODING_VBCS_END)
{
- strlcpy(dest, (char *)src, maxout);
+ strlcpy(dest, (char *)src, (size_t)maxout);
return ((int)strlen(dest));
}
@@ -262,7 +258,7 @@ cupsUTF8ToCharset(
ch = ((ch & 0x1f) << 6) | (*src++ & 0x3f);
if (ch < maxch)
- *destptr++ = ch;
+ *destptr++ = (char)ch;
else
*destptr++ = '?';
}
@@ -270,7 +266,7 @@ cupsUTF8ToCharset(
(ch & 0xf8) == 0xf0)
*destptr++ = '?';
else if (!(ch & 0x80))
- *destptr++ = ch;
+ *destptr++ = (char)ch;
}
*destptr = '\0';
@@ -287,11 +283,15 @@ cupsUTF8ToCharset(
if (map_encoding != encoding)
{
+ char toset[1024]; /* Destination character set */
+
_cupsCharmapFlush();
- map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8");
- map_to_utf8 = iconv_open("UTF-8", _cupsEncodingName(encoding));
+ snprintf(toset, sizeof(toset), "%s//IGNORE", _cupsEncodingName(encoding));
+
map_encoding = encoding;
+ map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8");
+ map_to_utf8 = iconv_open("UTF-8", toset);
}
if (map_from_utf8 != (iconv_t)-1)
@@ -299,7 +299,7 @@ cupsUTF8ToCharset(
char *altsrc = (char *)src; /* Silence bogus GCC type-punned */
srclen = strlen((char *)src);
- outBytesLeft = maxout - 1;
+ outBytesLeft = (size_t)maxout - 1;
iconv(map_from_utf8, &altsrc, &srclen, &destptr, &outBytesLeft);
*destptr = '\0';
@@ -404,7 +404,7 @@ cupsUTF8ToUTF32(
return (-1);
}
- ch32 = ((ch & 0x1f) << 6) | (next & 0x3f);
+ ch32 = (cups_utf32_t)((ch & 0x1f) << 6) | (cups_utf32_t)(next & 0x3f);
/*
* Check for non-shortest form (invalid UTF-8)...
@@ -436,7 +436,7 @@ cupsUTF8ToUTF32(
return (-1);
}
- ch32 = ((ch & 0x0f) << 6) | (next & 0x3f);
+ ch32 = (cups_utf32_t)((ch & 0x0f) << 6) | (cups_utf32_t)(next & 0x3f);
next = *src++;
if ((next & 0xc0) != 0x80)
@@ -446,7 +446,7 @@ cupsUTF8ToUTF32(
return (-1);
}
- ch32 = (ch32 << 6) | (next & 0x3f);
+ ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f);
/*
* Check for non-shortest form (invalid UTF-8)...
@@ -478,7 +478,7 @@ cupsUTF8ToUTF32(
return (-1);
}
- ch32 = ((ch & 0x07) << 6) | (next & 0x3f);
+ ch32 = (cups_utf32_t)((ch & 0x07) << 6) | (cups_utf32_t)(next & 0x3f);
next = *src++;
if ((next & 0xc0) != 0x80)
@@ -488,7 +488,7 @@ cupsUTF8ToUTF32(
return (-1);
}
- ch32 = (ch32 << 6) | (next & 0x3f);
+ ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f);
next = *src++;
if ((next & 0xc0) != 0x80)
@@ -498,7 +498,7 @@ cupsUTF8ToUTF32(
return (-1);
}
- ch32 = (ch32 << 6) | (next & 0x3f);
+ ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f);
/*
* Check for non-shortest form (invalid UTF-8)...
@@ -716,5 +716,5 @@ cupsUTF32ToUTF8(
/*
- * End of "$Id: transcode.c 11173 2013-07-23 12:31:34Z msweet $"
+ * End of "$Id: transcode.c 12330 2014-12-09 20:57:28Z msweet $"
*/
diff --git a/cups/transcode.h b/cups/transcode.h
index 7c7840e..da95d0c 100644
--- a/cups/transcode.h
+++ b/cups/transcode.h
@@ -1,5 +1,5 @@
/*
- * "$Id: transcode.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: transcode.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Transcoding definitions for CUPS.
*
@@ -77,5 +77,5 @@ extern int cupsUTF32ToUTF8(cups_utf8_t *dest,
/*
- * End of "$Id: transcode.h 11173 2013-07-23 12:31:34Z msweet $"
+ * End of "$Id: transcode.h 10996 2013-05-29 11:51:34Z msweet $"
*/
diff --git a/cups/usersys.c b/cups/usersys.c
index 73d47f5..7c0eb3b 100644
--- a/cups/usersys.c
+++ b/cups/usersys.c
@@ -1,39 +1,18 @@
/*
- * "$Id: usersys.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usersys.c 12817 2015-07-30 15:45:46Z msweet $"
*
- * User, system, and password routines for CUPS.
+ * User, system, and password routines for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsEncryption() - Get the current encryption settings.
- * cupsGetPassword() - Get a password from the user.
- * cupsGetPassword2() - Get a password from the user using the advanced
- * password callback.
- * cupsServer() - Return the hostname/address of the current
- * server.
- * cupsSetClientCertCB() - Set the client certificate callback.
- * cupsSetEncryption() - Set the encryption preference.
- * cupsSetPasswordCB() - Set the password callback for CUPS.
- * cupsSetPasswordCB2() - Set the advanced password callback for CUPS.
- * cupsSetServer() - Set the default server name and port.
- * cupsSetServerCertCB() - Set the server certificate callback.
- * cupsSetUser() - Set the default user name.
- * cupsUser() - Return the current user's name.
- * _cupsGetPassword() - Get a password from the user.
- * _cupsGSSServiceName() - Get the GSS (Kerberos) service name.
- * _cupsSetDefaults() - Set the default server, port, and encryption.
- * cups_read_client_conf() - Read a client.conf file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -48,6 +27,7 @@
#else
# include <pwd.h>
# include <termios.h>
+# include <sys/utsname.h>
#endif /* WIN32 */
@@ -59,20 +39,45 @@
/*
+ * Local types...
+ */
+
+typedef struct _cups_client_conf_s /**** client.conf config data ****/
+{
+#ifdef HAVE_SSL
+ int ssl_options; /* SSLOptions values */
+#endif /* HAVE_SSL */
+ int any_root, /* Allow any (e.g., self-signed) root */
+ expired_certs, /* Allow expired certs */
+ validate_certs; /* Validate certificates */
+ http_encryption_t encryption; /* Encryption setting */
+ char user[65], /* User name */
+ server_name[256];
+ /* Server hostname */
+#ifdef HAVE_GSSAPI
+ char gss_service_name[32];
+ /* Kerberos service name */
+#endif /* HAVE_GSSAPI */
+} _cups_client_conf_t;
+
+
+/*
* Local functions...
*/
-static void cups_read_client_conf(cups_file_t *fp,
- _cups_globals_t *cg,
- const char *cups_encryption,
- const char *cups_server,
- const char *cups_user,
+static void cups_finalize_client_conf(_cups_client_conf_t *cc);
+static void cups_init_client_conf(_cups_client_conf_t *cc);
+static void cups_read_client_conf(cups_file_t *fp, _cups_client_conf_t *cc);
+static void cups_set_default_ipp_port(_cups_globals_t *cg);
+static void cups_set_encryption(_cups_client_conf_t *cc, const char *value);
#ifdef HAVE_GSSAPI
- const char *cups_gssservicename,
+static void cups_set_gss_service_name(_cups_client_conf_t *cc, const char *value);
#endif /* HAVE_GSSAPI */
- const char *cups_anyroot,
- const char *cups_expiredroot,
- const char *cups_expiredcerts);
+static void cups_set_server_name(_cups_client_conf_t *cc, const char *value);
+#ifdef HAVE_SSL
+static void cups_set_ssl_options(_cups_client_conf_t *cc, const char *value);
+#endif /* HAVE_SSL */
+static void cups_set_user(_cups_client_conf_t *cc, const char *value);
/*
@@ -81,7 +86,7 @@ static void cups_read_client_conf(cups_file_t *fp,
* The default encryption setting comes from the CUPS_ENCRYPTION
* environment variable, then the ~/.cups/client.conf file, and finally the
* /etc/cups/client.conf file. If not set, the default is
- * @code HTTP_ENCRYPT_IF_REQUESTED@.
+ * @code HTTP_ENCRYPTION_IF_REQUESTED@.
*
* Note: The current encryption setting is tracked separately for each thread
* in a program. Multi-threaded programs that override the setting via the
@@ -231,8 +236,10 @@ cupsSetCredentials(
if (cupsArrayCount(credentials) < 1)
return (-1);
+#ifdef HAVE_SSL
_httpFreeCredentials(cg->tls_credentials);
cg->tls_credentials = _httpCreateCredentials(credentials);
+#endif /* HAVE_SSL */
return (cg->tls_credentials ? 0 : -1);
}
@@ -244,7 +251,7 @@ cupsSetCredentials(
* The default encryption setting comes from the CUPS_ENCRYPTION
* environment variable, then the ~/.cups/client.conf file, and finally the
* /etc/cups/client.conf file. If not set, the default is
- * @code HTTP_ENCRYPT_IF_REQUESTED@.
+ * @code HTTP_ENCRYPTION_IF_REQUESTED@.
*
* Note: The current encryption setting is tracked separately for each thread
* in a program. Multi-threaded programs that override the setting need to do
@@ -376,8 +383,11 @@ cupsSetServer(const char *server) /* I - Server name */
cg->ipp_port = atoi(port);
}
+ if (!cg->ipp_port)
+ cups_set_default_ipp_port(cg);
+
if (cg->server[0] == '/')
- strcpy(cg->servername, "localhost");
+ strlcpy(cg->servername, "localhost", sizeof(cg->servername));
else
strlcpy(cg->servername, cg->server, sizeof(cg->servername));
}
@@ -386,6 +396,7 @@ cupsSetServer(const char *server) /* I - Server name */
cg->server[0] = '\0';
cg->servername[0] = '\0';
cg->server_version = 20;
+ cg->ipp_port = 0;
}
if (cg->http)
@@ -445,6 +456,62 @@ cupsSetUser(const char *user) /* I - User name */
/*
+ * 'cupsSetUserAgent()' - Set the default HTTP User-Agent string.
+ *
+ * Setting the string to NULL forces the default value containing the CUPS
+ * version, IPP version, and operating system version and architecture.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+void
+cupsSetUserAgent(const char *user_agent)/* I - User-Agent string or @code NULL@ */
+{
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Thread globals */
+#ifdef WIN32
+ SYSTEM_INFO sysinfo; /* System information */
+ OSVERSIONINFO version; /* OS version info */
+#else
+ struct utsname name; /* uname info */
+#endif /* WIN32 */
+
+
+ if (user_agent)
+ {
+ strlcpy(cg->user_agent, user_agent, sizeof(cg->user_agent));
+ return;
+ }
+
+#ifdef WIN32
+ version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&version);
+ GetNativeSystemInfo(&sysinfo);
+
+ snprintf(cg->user_agent, sizeof(cg->user_agent),
+ CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0",
+ version.dwMajorVersion, version.dwMinorVersion,
+ sysinfo.wProcessorArchitecture
+ == PROCESSOR_ARCHITECTURE_AMD64 ? "amd64" :
+ sysinfo.wProcessorArchitecture
+ == PROCESSOR_ARCHITECTURE_ARM ? "arm" :
+ sysinfo.wProcessorArchitecture
+ == PROCESSOR_ARCHITECTURE_IA64 ? "ia64" :
+ sysinfo.wProcessorArchitecture
+ == PROCESSOR_ARCHITECTURE_INTEL ? "intel" :
+ "unknown");
+
+#else
+ uname(&name);
+
+ snprintf(cg->user_agent, sizeof(cg->user_agent),
+ CUPS_MINIMAL " (%s %s; %s) IPP/2.0",
+ name.sysname, name.release, name.machine);
+#endif /* WIN32 */
+}
+
+
+/*
* 'cupsUser()' - Return the current user's name.
*
* Note: The current user name is tracked separately for each thread in a
@@ -467,6 +534,25 @@ cupsUser(void)
/*
+ * 'cupsUserAgent()' - Return the default HTTP User-Agent string.
+ *
+ * @since CUPS 1.7/OS X 10.9@
+ */
+
+const char * /* O - User-Agent string */
+cupsUserAgent(void)
+{
+ _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */
+
+
+ if (!cg->user_agent[0])
+ cupsSetUserAgent(NULL);
+
+ return (cg->user_agent);
+}
+
+
+/*
* '_cupsGetPassword()' - Get a password from the user.
*/
@@ -623,7 +709,7 @@ _cupsGetPassword(const char *prompt) /* I - Prompt string */
}
noecho = original;
- noecho.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+ noecho.c_lflag &= (tcflag_t)~(ICANON | ECHO | ECHOE | ISIG);
if (tcsetattr(tty, TCSAFLUSH, &noecho))
{
@@ -648,7 +734,10 @@ _cupsGetPassword(const char *prompt) /* I - Prompt string */
while ((passbytes = read(tty, &passch, 1)) == 1)
{
- if (passch == noecho.c_cc[VEOL] || passch == noecho.c_cc[VEOL2] ||
+ if (passch == noecho.c_cc[VEOL] ||
+# ifdef VEOL2
+ passch == noecho.c_cc[VEOL2] ||
+# endif /* VEOL2 */
passch == 0x0A || passch == 0x0D)
{
/*
@@ -765,82 +854,242 @@ void
_cupsSetDefaults(void)
{
cups_file_t *fp; /* File */
- const char *home, /* Home directory of user */
- *cups_encryption, /* CUPS_ENCRYPTION env var */
- *cups_server, /* CUPS_SERVER env var */
- *cups_user, /* CUPS_USER/USER env var */
-#ifdef HAVE_GSSAPI
- *cups_gssservicename, /* CUPS_GSSSERVICENAME env var */
-#endif /* HAVE_GSSAPI */
- *cups_anyroot, /* CUPS_ANYROOT env var */
- *cups_expiredroot, /* CUPS_EXPIREDROOT env var */
- *cups_expiredcerts; /* CUPS_EXPIREDCERTS env var */
+ const char *home; /* Home directory of user */
char filename[1024]; /* Filename */
+ _cups_client_conf_t cc; /* client.conf values */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
DEBUG_puts("_cupsSetDefaults()");
/*
- * First collect environment variables...
+ * Load initial client.conf values...
+ */
+
+ cups_init_client_conf(&cc);
+
+ /*
+ * Read the /etc/cups/client.conf and ~/.cups/client.conf files, if
+ * present.
*/
- cups_encryption = getenv("CUPS_ENCRYPTION");
- cups_server = getenv("CUPS_SERVER");
+ snprintf(filename, sizeof(filename), "%s/client.conf", cg->cups_serverroot);
+ if ((fp = cupsFileOpen(filename, "r")) != NULL)
+ {
+ cups_read_client_conf(fp, &cc);
+ cupsFileClose(fp);
+ }
+
+# ifdef HAVE_GETEUID
+ if ((geteuid() == getuid() || !getuid()) && getegid() == getgid() && (home = getenv("HOME")) != NULL)
+# elif !defined(WIN32)
+ if (getuid() && (home = getenv("HOME")) != NULL)
+# else
+ if ((home = getenv("HOME")) != NULL)
+# endif /* HAVE_GETEUID */
+ {
+ /*
+ * Look for ~/.cups/client.conf...
+ */
+
+ snprintf(filename, sizeof(filename), "%s/.cups/client.conf", home);
+ if ((fp = cupsFileOpen(filename, "r")) != NULL)
+ {
+ cups_read_client_conf(fp, &cc);
+ cupsFileClose(fp);
+ }
+ }
+
+ /*
+ * Finalize things so every client.conf value is set...
+ */
+
+ cups_finalize_client_conf(&cc);
+
+ if (cg->encryption == (http_encryption_t)-1)
+ cg->encryption = cc.encryption;
+
+ if (!cg->server[0] || !cg->ipp_port)
+ cupsSetServer(cc.server_name);
+
+ if (!cg->ipp_port)
+ cups_set_default_ipp_port(cg);
+
+ if (!cg->user[0])
+ strlcpy(cg->user, cc.user, sizeof(cg->user));
+
#ifdef HAVE_GSSAPI
- cups_gssservicename = getenv("CUPS_GSSSERVICENAME");
+ if (!cg->gss_service_name[0])
+ strlcpy(cg->gss_service_name, cc.gss_service_name, sizeof(cg->gss_service_name));
#endif /* HAVE_GSSAPI */
- cups_anyroot = getenv("CUPS_ANYROOT");
- cups_expiredroot = getenv("CUPS_EXPIREDROOT");
- cups_expiredcerts = getenv("CUPS_EXPIREDCERTS");
- if ((cups_user = getenv("CUPS_USER")) == NULL)
- cups_user = getenv("USER");
+ if (cg->any_root < 0)
+ cg->any_root = cc.any_root;
+
+ if (cg->expired_certs < 0)
+ cg->expired_certs = cc.expired_certs;
+
+ if (cg->validate_certs < 0)
+ cg->validate_certs = cc.validate_certs;
+
+#ifdef HAVE_SSL
+ _httpTLSSetOptions(cc.ssl_options);
+#endif /* HAVE_SSL */
+}
+
+
+/*
+ * 'cups_boolean_value()' - Convert a string to a boolean value.
+ */
+
+static int /* O - Boolean value */
+cups_boolean_value(const char *value) /* I - String value */
+{
+ return (!_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "true"));
+}
+
+
+/*
+ * 'cups_finalize_client_conf()' - Finalize client.conf values.
+ */
+
+static void
+cups_finalize_client_conf(
+ _cups_client_conf_t *cc) /* I - client.conf values */
+{
+ const char *value; /* Environment variable */
+
+
+ if ((value = getenv("CUPS_ANYROOT")) != NULL)
+ cc->any_root = cups_boolean_value(value);
+
+ if ((value = getenv("CUPS_ENCRYPTION")) != NULL)
+ cups_set_encryption(cc, value);
+
+ if ((value = getenv("CUPS_EXPIREDCERTS")) != NULL)
+ cc->expired_certs = cups_boolean_value(value);
+
+#ifdef HAVE_GSSAPI
+ if ((value = getenv("CUPS_GSSSERVICENAME")) != NULL)
+ cups_set_gss_service_name(cc, value);
+#endif /* HAVE_GSSAPI */
+
+ if ((value = getenv("CUPS_SERVER")) != NULL)
+ cups_set_server_name(cc, value);
+
+ if ((value = getenv("CUPS_USER")) != NULL)
+ cups_set_user(cc, value);
+
+ if ((value = getenv("CUPS_VALIDATECERTS")) != NULL)
+ cc->validate_certs = cups_boolean_value(value);
/*
- * Then, if needed, read the ~/.cups/client.conf or /etc/cups/client.conf
- * files to get the default values...
+ * Then apply defaults for those values that haven't been set...
*/
- if (cg->encryption == (http_encryption_t)-1 || !cg->server[0] ||
- !cg->user[0] || !cg->ipp_port)
+ if (cc->any_root < 0)
+ cc->any_root = 1;
+
+ if (cc->encryption == (http_encryption_t)-1)
+ cc->encryption = HTTP_ENCRYPTION_IF_REQUESTED;
+
+ if (cc->expired_certs < 0)
+ cc->expired_certs = 1;
+
+#ifdef HAVE_GSSAPI
+ if (!cc->gss_service_name[0])
+ cups_set_gss_service_name(cc, CUPS_DEFAULT_GSSSERVICENAME);
+#endif /* HAVE_GSSAPI */
+
+ if (!cc->server_name[0])
{
- if ((home = getenv("HOME")) != NULL)
+#ifdef CUPS_DEFAULT_DOMAINSOCKET
+ /*
+ * If we are compiled with domain socket support, only use the
+ * domain socket if it exists and has the right permissions...
+ */
+
+ struct stat sockinfo; /* Domain socket information */
+
+ if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
+ (sockinfo.st_mode & (S_IROTH | S_IWOTH)) == (S_IROTH | S_IWOTH))
+ cups_set_server_name(cc, CUPS_DEFAULT_DOMAINSOCKET);
+ else
+#endif /* CUPS_DEFAULT_DOMAINSOCKET */
+ cups_set_server_name(cc, "localhost");
+ }
+
+ if (!cc->user[0])
+ {
+#ifdef WIN32
+ /*
+ * Get the current user name from the OS...
+ */
+
+ DWORD size; /* Size of string */
+
+ size = sizeof(cc->user);
+ if (!GetUserName(cc->user, &size))
+#else
+ /*
+ * Try the USER environment variable as the default username...
+ */
+
+ const char *envuser = getenv("USER");
+ /* Default username */
+ struct passwd *pw = NULL; /* Account information */
+
+ if (envuser)
{
/*
- * Look for ~/.cups/client.conf...
+ * Validate USER matches the current UID, otherwise don't allow it to
+ * override things... This makes sure that printing after doing su
+ * or sudo records the correct username.
*/
- snprintf(filename, sizeof(filename), "%s/.cups/client.conf", home);
- fp = cupsFileOpen(filename, "r");
+ if ((pw = getpwnam(envuser)) != NULL && pw->pw_uid != getuid())
+ pw = NULL;
}
- else
- fp = NULL;
- if (!fp)
+ if (!pw)
+ pw = getpwuid(getuid());
+
+ if (pw)
+ strlcpy(cc->user, pw->pw_name, sizeof(cc->user));
+ else
+#endif /* WIN32 */
{
/*
- * Look for CUPS_SERVERROOT/client.conf...
+ * Use the default "unknown" user name...
*/
- snprintf(filename, sizeof(filename), "%s/client.conf",
- cg->cups_serverroot);
- fp = cupsFileOpen(filename, "r");
+ strlcpy(cc->user, "unknown", sizeof(cc->user));
}
+ }
- /*
- * Read the configuration file and apply any environment variables; both
- * functions handle NULL cups_file_t pointers...
- */
+ if (cc->validate_certs < 0)
+ cc->validate_certs = 0;
+}
- cups_read_client_conf(fp, cg, cups_encryption, cups_server, cups_user,
-#ifdef HAVE_GSSAPI
- cups_gssservicename,
-#endif /* HAVE_GSSAPI */
- cups_anyroot, cups_expiredroot,
- cups_expiredcerts);
- cupsFileClose(fp);
- }
+
+/*
+ * 'cups_init_client_conf()' - Initialize client.conf values.
+ */
+
+static void
+cups_init_client_conf(
+ _cups_client_conf_t *cc) /* I - client.conf values */
+{
+ /*
+ * Clear all values to "not set"...
+ */
+
+ memset(cc, 0, sizeof(_cups_client_conf_t));
+
+ cc->encryption = (http_encryption_t)-1;
+ cc->any_root = -1;
+ cc->expired_certs = -1;
+ cc->validate_certs = -1;
}
@@ -850,33 +1099,12 @@ _cupsSetDefaults(void)
static void
cups_read_client_conf(
- cups_file_t *fp, /* I - File to read */
- _cups_globals_t *cg, /* I - Global data */
- const char *cups_encryption, /* I - CUPS_ENCRYPTION env var */
- const char *cups_server, /* I - CUPS_SERVER env var */
- const char *cups_user, /* I - CUPS_USER env var */
-#ifdef HAVE_GSSAPI
- const char *cups_gssservicename,
- /* I - CUPS_GSSSERVICENAME env var */
-#endif /* HAVE_GSSAPI */
- const char *cups_anyroot, /* I - CUPS_ANYROOT env var */
- const char *cups_expiredroot, /* I - CUPS_EXPIREDROOT env var */
- const char *cups_expiredcerts) /* I - CUPS_EXPIREDCERTS env var */
+ cups_file_t *fp, /* I - File to read */
+ _cups_client_conf_t *cc) /* I - client.conf values */
{
int linenum; /* Current line number */
char line[1024], /* Line from file */
- *value, /* Pointer into line */
- encryption[1024], /* Encryption value */
-#ifndef __APPLE__
- server_name[1024], /* ServerName value */
-#endif /* !__APPLE__ */
- user[256], /* User value */
- any_root[1024], /* AllowAnyRoot value */
- expired_root[1024], /* AllowExpiredRoot value */
- expired_certs[1024]; /* AllowExpiredCerts value */
-#ifdef HAVE_GSSAPI
- char gss_service_name[32]; /* GSSServiceName value */
-#endif /* HAVE_GSSAPI */
+ *value; /* Pointer into line */
/*
@@ -886,176 +1114,176 @@ cups_read_client_conf(
linenum = 0;
while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
{
- if (!cups_encryption && cg->encryption == (http_encryption_t)-1 &&
- !_cups_strcasecmp(line, "Encryption") && value)
- {
- strlcpy(encryption, value, sizeof(encryption));
- cups_encryption = encryption;
- }
+ if (!_cups_strcasecmp(line, "Encryption") && value)
+ cups_set_encryption(cc, value);
#ifndef __APPLE__
/*
- * The Server directive is not supported on OS X due to app sandboxing
- * restrictions, i.e. not all apps request network access.
+ * The ServerName directive is not supported on OS X due to app
+ * sandboxing restrictions, i.e. not all apps request network access.
*/
- else if (!cups_server && (!cg->server[0] || !cg->ipp_port) &&
- !_cups_strcasecmp(line, "ServerName") && value)
- {
- strlcpy(server_name, value, sizeof(server_name));
- cups_server = server_name;
- }
+ else if (!_cups_strcasecmp(line, "ServerName") && value)
+ cups_set_server_name(cc, value);
#endif /* !__APPLE__ */
- else if (!cups_user && !_cups_strcasecmp(line, "User") && value)
- {
- strlcpy(user, value, sizeof(user));
- cups_user = user;
- }
- else if (!cups_anyroot && !_cups_strcasecmp(line, "AllowAnyRoot") && value)
- {
- strlcpy(any_root, value, sizeof(any_root));
- cups_anyroot = any_root;
- }
- else if (!cups_expiredroot && !_cups_strcasecmp(line, "AllowExpiredRoot") &&
+ else if (!_cups_strcasecmp(line, "User") && value)
+ cups_set_user(cc, value);
+ else if (!_cups_strcasecmp(line, "AllowAnyRoot") && value)
+ cc->any_root = cups_boolean_value(value);
+ else if (!_cups_strcasecmp(line, "AllowExpiredCerts") &&
value)
- {
- strlcpy(expired_root, value, sizeof(expired_root));
- cups_expiredroot = expired_root;
- }
- else if (!cups_expiredcerts && !_cups_strcasecmp(line, "AllowExpiredCerts") &&
- value)
- {
- strlcpy(expired_certs, value, sizeof(expired_certs));
- cups_expiredcerts = expired_certs;
- }
+ cc->expired_certs = cups_boolean_value(value);
+ else if (!_cups_strcasecmp(line, "ValidateCerts") && value)
+ cc->validate_certs = cups_boolean_value(value);
#ifdef HAVE_GSSAPI
- else if (!cups_gssservicename && !_cups_strcasecmp(line, "GSSServiceName") &&
- value)
- {
- strlcpy(gss_service_name, value, sizeof(gss_service_name));
- cups_gssservicename = gss_service_name;
- }
+ else if (!_cups_strcasecmp(line, "GSSServiceName") && value)
+ cups_set_gss_service_name(cc, value);
#endif /* HAVE_GSSAPI */
+#ifdef HAVE_SSL
+ else if (!_cups_strcasecmp(line, "SSLOptions") && value)
+ cups_set_ssl_options(cc, value);
+#endif /* HAVE_SSL */
}
+}
- /*
- * Set values...
- */
- if (cg->encryption == (http_encryption_t)-1 && cups_encryption)
+/*
+ * 'cups_set_default_ipp_port()' - Set the default IPP port value.
+ */
+
+static void
+cups_set_default_ipp_port(
+ _cups_globals_t *cg) /* I - Global data */
+{
+ const char *ipp_port; /* IPP_PORT environment variable */
+
+
+ if ((ipp_port = getenv("IPP_PORT")) != NULL)
{
- if (!_cups_strcasecmp(cups_encryption, "never"))
- cg->encryption = HTTP_ENCRYPT_NEVER;
- else if (!_cups_strcasecmp(cups_encryption, "always"))
- cg->encryption = HTTP_ENCRYPT_ALWAYS;
- else if (!_cups_strcasecmp(cups_encryption, "required"))
- cg->encryption = HTTP_ENCRYPT_REQUIRED;
- else
- cg->encryption = HTTP_ENCRYPT_IF_REQUESTED;
+ if ((cg->ipp_port = atoi(ipp_port)) <= 0)
+ cg->ipp_port = CUPS_DEFAULT_IPP_PORT;
}
+ else
+ cg->ipp_port = CUPS_DEFAULT_IPP_PORT;
+}
- if ((!cg->server[0] || !cg->ipp_port) && cups_server)
- cupsSetServer(cups_server);
+/*
+ * 'cups_set_encryption()' - Set the Encryption value.
+ */
- if (!cg->server[0])
- {
-#ifdef CUPS_DEFAULT_DOMAINSOCKET
- /*
- * If we are compiled with domain socket support, only use the
- * domain socket if it exists and has the right permissions...
- */
+static void
+cups_set_encryption(
+ _cups_client_conf_t *cc, /* I - client.conf values */
+ const char *value) /* I - Value */
+{
+ if (!_cups_strcasecmp(value, "never"))
+ cc->encryption = HTTP_ENCRYPTION_NEVER;
+ else if (!_cups_strcasecmp(value, "always"))
+ cc->encryption = HTTP_ENCRYPTION_ALWAYS;
+ else if (!_cups_strcasecmp(value, "required"))
+ cc->encryption = HTTP_ENCRYPTION_REQUIRED;
+ else
+ cc->encryption = HTTP_ENCRYPTION_IF_REQUESTED;
+}
- struct stat sockinfo; /* Domain socket information */
- if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
- (sockinfo.st_mode & S_IRWXO) == S_IRWXO)
- cups_server = CUPS_DEFAULT_DOMAINSOCKET;
- else
-#endif /* CUPS_DEFAULT_DOMAINSOCKET */
- cups_server = "localhost";
+/*
+ * 'cups_set_gss_service_name()' - Set the GSSServiceName value.
+ */
- cupsSetServer(cups_server);
- }
+#ifdef HAVE_GSSAPI
+static void
+cups_set_gss_service_name(
+ _cups_client_conf_t *cc, /* I - client.conf values */
+ const char *value) /* I - Value */
+{
+ strlcpy(cc->gss_service_name, value, sizeof(cc->gss_service_name));
+}
+#endif /* HAVE_GSSAPI */
- if (!cg->ipp_port)
- {
- const char *ipp_port; /* IPP_PORT environment variable */
- if ((ipp_port = getenv("IPP_PORT")) != NULL)
- {
- if ((cg->ipp_port = atoi(ipp_port)) <= 0)
- cg->ipp_port = CUPS_DEFAULT_IPP_PORT;
- }
- else
- cg->ipp_port = CUPS_DEFAULT_IPP_PORT;
- }
+/*
+ * 'cups_set_server_name()' - Set the ServerName value.
+ */
- if (!cg->user[0])
- {
- if (cups_user)
- strlcpy(cg->user, cups_user, sizeof(cg->user));
- else
- {
-#ifdef WIN32
- /*
- * Get the current user name from the OS...
- */
+static void
+cups_set_server_name(
+ _cups_client_conf_t *cc, /* I - client.conf values */
+ const char *value) /* I - Value */
+{
+ strlcpy(cc->server_name, value, sizeof(cc->server_name));
+}
- DWORD size; /* Size of string */
- size = sizeof(cg->user);
- if (!GetUserName(cg->user, &size))
-#else
- /*
- * Get the user name corresponding to the current UID...
- */
+/*
+ * 'cups_set_ssl_options()' - Set the SSLOptions value.
+ */
- struct passwd *pwd; /* User/password entry */
+#ifdef HAVE_SSL
+static void
+cups_set_ssl_options(
+ _cups_client_conf_t *cc, /* I - client.conf values */
+ const char *value) /* I - Value */
+{
+ /*
+ * SSLOptions [AllowRC4] [AllowSSL3] [AllowDH] [DenyTLS1.0] [None]
+ */
- setpwent();
- if ((pwd = getpwuid(getuid())) != NULL)
- {
- /*
- * Found a match!
- */
+ int options = _HTTP_TLS_NONE; /* SSL/TLS options */
+ char temp[256], /* Copy of value */
+ *start, /* Start of option */
+ *end; /* End of option */
- strlcpy(cg->user, pwd->pw_name, sizeof(cg->user));
- }
- else
-#endif /* WIN32 */
- {
- /*
- * Use the default "unknown" user name...
- */
- strcpy(cg->user, "unknown");
- }
- }
+ strlcpy(temp, value, sizeof(temp));
+
+ for (start = temp; *start; start = end)
+ {
+ /*
+ * Find end of keyword...
+ */
+
+ end = start;
+ while (*end && !_cups_isspace(*end))
+ end ++;
+
+ if (*end)
+ *end++ = '\0';
+
+ /*
+ * Compare...
+ */
+
+ if (!_cups_strcasecmp(start, "AllowRC4"))
+ options |= _HTTP_TLS_ALLOW_RC4;
+ else if (!_cups_strcasecmp(start, "AllowSSL3"))
+ options |= _HTTP_TLS_ALLOW_SSL3;
+ else if (!_cups_strcasecmp(start, "AllowDH"))
+ options |= _HTTP_TLS_ALLOW_DH;
+ else if (!_cups_strcasecmp(start, "DenyTLS1.0"))
+ options |= _HTTP_TLS_DENY_TLS10;
+ else if (!_cups_strcasecmp(start, "None"))
+ options = _HTTP_TLS_NONE;
}
-#ifdef HAVE_GSSAPI
- if (!cups_gssservicename)
- cups_gssservicename = CUPS_DEFAULT_GSSSERVICENAME;
+ cc->ssl_options = options;
- strlcpy(cg->gss_service_name, cups_gssservicename,
- sizeof(cg->gss_service_name));
-#endif /* HAVE_GSSAPI */
+ DEBUG_printf(("4cups_set_ssl_options(cc=%p, value=\"%s\") options=%x", cc, value, options));
+}
+#endif /* HAVE_SSL */
- if (cups_anyroot)
- cg->any_root = !_cups_strcasecmp(cups_anyroot, "yes") ||
- !_cups_strcasecmp(cups_anyroot, "on") ||
- !_cups_strcasecmp(cups_anyroot, "true");
- if (cups_expiredroot)
- cg->expired_root = !_cups_strcasecmp(cups_expiredroot, "yes") ||
- !_cups_strcasecmp(cups_expiredroot, "on") ||
- !_cups_strcasecmp(cups_expiredroot, "true");
+/*
+ * 'cups_set_user()' - Set the User value.
+ */
- if (cups_expiredcerts)
- cg->expired_certs = !_cups_strcasecmp(cups_expiredcerts, "yes") ||
- !_cups_strcasecmp(cups_expiredcerts, "on") ||
- !_cups_strcasecmp(cups_expiredcerts, "true");
+static void
+cups_set_user(
+ _cups_client_conf_t *cc, /* I - client.conf values */
+ const char *value) /* I - Value */
+{
+ strlcpy(cc->user, value, sizeof(cc->user));
}
/*
- * End of "$Id: usersys.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usersys.c 12817 2015-07-30 15:45:46Z msweet $".
*/
diff --git a/cups/util.c b/cups/util.c
index 87cf327..2e9f688 100644
--- a/cups/util.c
+++ b/cups/util.c
@@ -1,54 +1,18 @@
/*
- * "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: util.c 12884 2015-10-07 20:31:46Z msweet $"
*
- * Printing utilities for CUPS.
+ * Printing utilities for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsCancelJob() - Cancel a print job on the default server.
- * cupsCancelJob2() - Cancel or purge a print job.
- * cupsCreateJob() - Create an empty job for streaming.
- * cupsFinishDocument() - Finish sending a document.
- * cupsFreeJobs() - Free memory used by job data.
- * cupsGetClasses() - Get a list of printer classes from the default
- * server.
- * cupsGetDefault() - Get the default printer or class for the default
- * server.
- * cupsGetDefault2() - Get the default printer or class for the specified
- * server.
- * cupsGetJobs() - Get the jobs from the default server.
- * cupsGetJobs2() - Get the jobs from the specified server.
- * cupsGetPPD() - Get the PPD file for a printer on the default
- * server.
- * cupsGetPPD2() - Get the PPD file for a printer from the specified
- * server.
- * cupsGetPPD3() - Get the PPD file for a printer on the specified
- * server if it has changed.
- * cupsGetPrinters() - Get a list of printers from the default server.
- * cupsGetServerPPD() - Get an available PPD file from the server.
- * cupsPrintFile() - Print a file to a printer or class on the default
- * server.
- * cupsPrintFile2() - Print a file to a printer or class on the
- * specified server.
- * cupsPrintFiles() - Print one or more files to a printer or class on
- * the default server.
- * cupsPrintFiles2() - Print one or more files to a printer or class on
- * the specified server.
- * cupsStartDocument() - Add a document to a job created with
- * cupsCreateJob().
- * cups_get_printer_uri() - Get the printer-uri-supported attribute for the
- * first printer in a class.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -90,7 +54,7 @@ cupsCancelJob(const char *name, /* I - Name of printer or class */
int job_id) /* I - Job ID, @code CUPS_JOBID_CURRENT@ for the current job, or @code CUPS_JOBID_ALL@ for all jobs */
{
return (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0)
- < IPP_REDIRECTION_OTHER_SITE);
+ < IPP_STATUS_REDIRECTION_OTHER_SITE);
}
@@ -125,7 +89,7 @@ cupsCancelJob2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
if (job_id < -1 || (!name && job_id == 0))
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -135,7 +99,7 @@ cupsCancelJob2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
if (!http)
if ((http = _cupsConnect()) == NULL)
- return (IPP_SERVICE_UNAVAILABLE);
+ return (IPP_STATUS_ERROR_SERVICE_UNAVAILABLE);
/*
* Build an IPP_CANCEL_JOB or IPP_PURGE_JOBS request, which requires the following
@@ -148,7 +112,7 @@ cupsCancelJob2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
* [purge-job] or [purge-jobs]
*/
- request = ippNewRequest(job_id < 0 ? IPP_PURGE_JOBS : IPP_CANCEL_JOB);
+ request = ippNewRequest(job_id < 0 ? IPP_OP_PURGE_JOBS : IPP_OP_CANCEL_JOB);
if (name)
{
@@ -223,7 +187,7 @@ cupsCreateJob(
if (!name)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -231,9 +195,9 @@ cupsCreateJob(
* Build a Create-Job request...
*/
- if ((request = ippNewRequest(IPP_CREATE_JOB)) == NULL)
+ if ((request = ippNewRequest(IPP_OP_CREATE_JOB)) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
return (0);
}
@@ -248,6 +212,7 @@ cupsCreateJob(
if (title)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
title);
+ cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_SUBSCRIPTION);
@@ -323,7 +288,8 @@ cupsFreeJobs(int num_jobs, /* I - Number of jobs */
/*
* 'cupsGetClasses()' - Get a list of printer classes from the default server.
*
- * This function is deprecated - use @link cupsGetDests@ instead.
+ * This function is deprecated and no longer returns a list of printer
+ * classes - use @link cupsGetDests@ instead.
*
* @deprecated@
*/
@@ -331,84 +297,10 @@ cupsFreeJobs(int num_jobs, /* I - Number of jobs */
int /* O - Number of classes */
cupsGetClasses(char ***classes) /* O - Classes */
{
- int n; /* Number of classes */
- ipp_t *request, /* IPP Request */
- *response; /* IPP Response */
- ipp_attribute_t *attr; /* Current attribute */
- char **temp; /* Temporary pointer */
- http_t *http; /* Connection to server */
-
-
- if (!classes)
- {
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
-
- return (0);
- }
+ if (classes)
+ *classes = NULL;
- *classes = NULL;
-
- if ((http = _cupsConnect()) == NULL)
- return (0);
-
- /*
- * Build a CUPS_GET_CLASSES request, which requires the following
- * attributes:
- *
- * attributes-charset
- * attributes-natural-language
- * requested-attributes
- */
-
- request = ippNewRequest(CUPS_GET_CLASSES);
-
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
- "requested-attributes", NULL, "printer-name");
-
- /*
- * Do the request and get back a response...
- */
-
- n = 0;
-
- if ((response = cupsDoRequest(http, request, "/")) != NULL)
- {
- for (attr = response->attrs; attr != NULL; attr = attr->next)
- if (attr->name != NULL &&
- _cups_strcasecmp(attr->name, "printer-name") == 0 &&
- attr->value_tag == IPP_TAG_NAME)
- {
- if (n == 0)
- temp = malloc(sizeof(char *));
- else
- temp = realloc(*classes, sizeof(char *) * (n + 1));
-
- if (temp == NULL)
- {
- /*
- * Ran out of memory!
- */
-
- while (n > 0)
- {
- n --;
- free((*classes)[n]);
- }
-
- free(*classes);
- ippDelete(response);
- return (0);
- }
-
- *classes = temp;
- temp[n] = strdup(attr->values[0].string.text);
- n ++;
- }
-
- ippDelete(response);
- }
-
- return (n);
+ return (0);
}
@@ -479,7 +371,7 @@ cupsGetDefault2(http_t *http) /* I - Connection to server or @code CUPS_HTTP_DE
* attributes-natural-language
*/
- request = ippNewRequest(CUPS_GET_DEFAULT);
+ request = ippNewRequest(IPP_OP_CUPS_GET_DEFAULT);
/*
* Do the request and get back a response...
@@ -585,7 +477,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
if (!jobs)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (-1);
}
@@ -597,15 +489,17 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
if (name)
{
if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
- "localhost", 0, "/printers/%s", name) != HTTP_URI_OK)
+ "localhost", 0, "/printers/%s",
+ name) < HTTP_URI_STATUS_OK)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to create printer-uri"), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
+ _("Unable to create printer-uri"), 1);
return (-1);
}
}
else
- strcpy(uri, "ipp://localhost/");
+ strlcpy(uri, "ipp://localhost/", sizeof(uri));
if (!http)
if ((http = _cupsConnect()) == NULL)
@@ -624,7 +518,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
* requested-attributes
*/
- request = ippNewRequest(IPP_GET_JOBS);
+ request = ippNewRequest(IPP_OP_GET_JOBS);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -674,7 +568,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
id = 0;
size = 0;
priority = 50;
- state = IPP_JOB_PENDING;
+ state = IPP_JSTATE_PENDING;
user = "unknown";
dest = NULL;
format = "application/octet-stream";
@@ -745,7 +639,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
if (n == 0)
temp = malloc(sizeof(cups_job_t));
else
- temp = realloc(*jobs, sizeof(cups_job_t) * (n + 1));
+ temp = realloc(*jobs, sizeof(cups_job_t) * (size_t)(n + 1));
if (!temp)
{
@@ -753,7 +647,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
* Ran out of memory!
*/
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
cupsFreeJobs(n, *jobs);
*jobs = NULL;
@@ -790,7 +684,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
ippDelete(response);
}
- if (n == 0 && cg->last_error >= IPP_BAD_REQUEST)
+ if (n == 0 && cg->last_error >= IPP_STATUS_ERROR_BAD_REQUEST)
return (-1);
else
return (n);
@@ -822,7 +716,7 @@ cupsGetPPD(const char *name) /* I - Destination name */
cg->ppd_filename[0] = '\0';
if (cupsGetPPD3(CUPS_HTTP_DEFAULT, name, &modtime, cg->ppd_filename,
- sizeof(cg->ppd_filename)) == HTTP_OK)
+ sizeof(cg->ppd_filename)) == HTTP_STATUS_OK)
return (cg->ppd_filename);
else
return (NULL);
@@ -853,7 +747,7 @@ cupsGetPPD2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
cg->ppd_filename[0] = '\0';
if (cupsGetPPD3(http, name, &modtime, cg->ppd_filename,
- sizeof(cg->ppd_filename)) == HTTP_OK)
+ sizeof(cg->ppd_filename)) == HTTP_STATUS_OK)
return (cg->ppd_filename);
else
return (NULL);
@@ -873,8 +767,8 @@ cupsGetPPD2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
* file will be overwritten as needed. The caller "owns" the file that is
* created and must @code unlink@ the returned filename.
*
- * On success, @code HTTP_OK@ is returned for a new PPD file and
- * @code HTTP_NOT_MODIFIED@ if the existing PPD file is up-to-date. Any other
+ * On success, @code HTTP_STATUS_OK@ is returned for a new PPD file and
+ * @code HTTP_STATUS_NOT_MODIFIED@ if the existing PPD file is up-to-date. Any other
* status is an error.
*
* For classes, @code cupsGetPPD3@ returns the PPD file for the first printer
@@ -914,20 +808,20 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
if (!name)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("No printer name"), 1);
- return (HTTP_NOT_ACCEPTABLE);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer name"), 1);
+ return (HTTP_STATUS_NOT_ACCEPTABLE);
}
if (!modtime)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("No modification time"), 1);
- return (HTTP_NOT_ACCEPTABLE);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No modification time"), 1);
+ return (HTTP_STATUS_NOT_ACCEPTABLE);
}
if (!buffer || bufsize <= 1)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Bad filename buffer"), 1);
- return (HTTP_NOT_ACCEPTABLE);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad filename buffer"), 1);
+ return (HTTP_STATUS_NOT_ACCEPTABLE);
}
#ifndef WIN32
@@ -952,10 +846,10 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd", cg->cups_serverroot,
name);
- if (!stat(ppdname, &ppdinfo))
+ if (!stat(ppdname, &ppdinfo) && !access(ppdname, R_OK))
{
/*
- * OK, the file exists, use it!
+ * OK, the file exists and is readable, use it!
*/
if (buffer[0])
@@ -964,9 +858,9 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
if (symlink(ppdname, buffer) && errno != EEXIST)
{
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
- return (HTTP_SERVER_ERROR);
+ return (HTTP_STATUS_SERVER_ERROR);
}
}
else
@@ -1024,18 +918,18 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
if (tries >= 1000)
{
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
- return (HTTP_SERVER_ERROR);
+ return (HTTP_STATUS_SERVER_ERROR);
}
}
if (*modtime >= ppdinfo.st_mtime)
- return (HTTP_NOT_MODIFIED);
+ return (HTTP_STATUS_NOT_MODIFIED);
else
{
*modtime = ppdinfo.st_mtime;
- return (HTTP_OK);
+ return (HTTP_STATUS_OK);
}
}
}
@@ -1047,15 +941,27 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
if (!http)
if ((http = _cupsConnect()) == NULL)
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
if (!cups_get_printer_uri(http, name, hostname, sizeof(hostname), &port,
resource, sizeof(resource), 0))
- return (HTTP_NOT_FOUND);
+ return (HTTP_STATUS_NOT_FOUND);
DEBUG_printf(("2cupsGetPPD3: Printer hostname=\"%s\", port=%d", hostname,
port));
+ if (cupsServer()[0] == '/' && !_cups_strcasecmp(hostname, "localhost") && port == ippPort())
+ {
+ /*
+ * Redirect localhost to domain socket...
+ */
+
+ strlcpy(hostname, cupsServer(), sizeof(hostname));
+ port = 0;
+
+ DEBUG_printf(("2cupsGetPPD3: Redirecting to \"%s\".", hostname));
+ }
+
/*
* Remap local hostname to localhost...
*/
@@ -1065,14 +971,14 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
DEBUG_printf(("2cupsGetPPD3: Local hostname=\"%s\"", localhost));
if (!_cups_strcasecmp(localhost, hostname))
- strcpy(hostname, "localhost");
+ strlcpy(hostname, "localhost", sizeof(hostname));
/*
* Get the hostname and port number we are connected to...
*/
httpGetHostname(http, http_hostname, sizeof(http_hostname));
- http_port = _httpAddrPort(http->hostaddr);
+ http_port = httpAddrPort(http->hostaddr);
DEBUG_printf(("2cupsGetPPD3: Connection hostname=\"%s\", port=%d",
http_hostname, http_port));
@@ -1083,12 +989,12 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
if (!_cups_strcasecmp(http_hostname, hostname) && port == http_port)
http2 = http;
- else if ((http2 = httpConnectEncrypt(hostname, port,
- cupsEncryption())) == NULL)
+ else if ((http2 = httpConnect2(hostname, port, NULL, AF_UNSPEC,
+ cupsEncryption(), 1, 30000, NULL)) == NULL)
{
DEBUG_puts("1cupsGetPPD3: Unable to connect to server");
- return (HTTP_SERVICE_UNAVAILABLE);
+ return (HTTP_STATUS_SERVICE_UNAVAILABLE);
}
/*
@@ -1106,12 +1012,12 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
* Can't open file; close the server connection and return NULL...
*/
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
if (http2 != http)
httpClose(http2);
- return (HTTP_SERVER_ERROR);
+ return (HTTP_STATUS_SERVER_ERROR);
}
/*
@@ -1132,14 +1038,14 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
* See if we actually got the file or an error...
*/
- if (status == HTTP_OK)
+ if (status == HTTP_STATUS_OK)
{
*modtime = httpGetDateTime(httpGetField(http2, HTTP_FIELD_DATE));
if (tempfile[0])
strlcpy(buffer, tempfile, bufsize);
}
- else if (status != HTTP_NOT_MODIFIED)
+ else if (status != HTTP_STATUS_NOT_MODIFIED)
{
_cupsSetHTTPError(status);
@@ -1167,7 +1073,8 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
/*
* 'cupsGetPrinters()' - Get a list of printers from the default server.
*
- * This function is deprecated - use @link cupsGetDests@ instead.
+ * This function is deprecated and no longer returns a list of printers - use
+ * @link cupsGetDests@ instead.
*
* @deprecated@
*/
@@ -1175,98 +1082,10 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
int /* O - Number of printers */
cupsGetPrinters(char ***printers) /* O - Printers */
{
- int n; /* Number of printers */
- ipp_t *request, /* IPP Request */
- *response; /* IPP Response */
- ipp_attribute_t *attr; /* Current attribute */
- char **temp; /* Temporary pointer */
- http_t *http; /* Connection to server */
+ if (printers)
+ *printers = NULL;
-
- /*
- * Range check input...
- */
-
- if (!printers)
- {
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
-
- return (0);
- }
-
- *printers = NULL;
-
- /*
- * Try to connect to the server...
- */
-
- if ((http = _cupsConnect()) == NULL)
- return (0);
-
- /*
- * Build a CUPS_GET_PRINTERS request, which requires the following
- * attributes:
- *
- * attributes-charset
- * attributes-natural-language
- * requested-attributes
- */
-
- request = ippNewRequest(CUPS_GET_PRINTERS);
-
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
- "requested-attributes", NULL, "printer-name");
-
- ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM,
- "printer-type", 0);
-
- ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM,
- "printer-type-mask", CUPS_PRINTER_CLASS);
-
- /*
- * Do the request and get back a response...
- */
-
- n = 0;
-
- if ((response = cupsDoRequest(http, request, "/")) != NULL)
- {
- for (attr = response->attrs; attr != NULL; attr = attr->next)
- if (attr->name != NULL &&
- _cups_strcasecmp(attr->name, "printer-name") == 0 &&
- attr->value_tag == IPP_TAG_NAME)
- {
- if (n == 0)
- temp = malloc(sizeof(char *));
- else
- temp = realloc(*printers, sizeof(char *) * (n + 1));
-
- if (temp == NULL)
- {
- /*
- * Ran out of memory!
- */
-
- while (n > 0)
- {
- n --;
- free((*printers)[n]);
- }
-
- free(*printers);
- ippDelete(response);
- return (0);
- }
-
- *printers = temp;
- temp[n] = strdup(attr->values[0].string.text);
- n ++;
- }
-
- ippDelete(response);
- }
-
- return (n);
+ return (0);
}
@@ -1301,7 +1120,7 @@ cupsGetServerPPD(http_t *http, /* I - Connection to server or @code CUPS_HTT
if (!name)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("No PPD name"), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No PPD name"), 1);
return (NULL);
}
@@ -1320,7 +1139,7 @@ cupsGetServerPPD(http_t *http, /* I - Connection to server or @code CUPS_HTT
* Can't open file; close the server connection and return NULL...
*/
- _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
return (NULL);
}
@@ -1329,7 +1148,7 @@ cupsGetServerPPD(http_t *http, /* I - Connection to server or @code CUPS_HTT
* Get the PPD file...
*/
- request = ippNewRequest(CUPS_GET_PPD);
+ request = ippNewRequest(IPP_OP_CUPS_GET_PPD);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", NULL,
name);
@@ -1337,7 +1156,7 @@ cupsGetServerPPD(http_t *http, /* I - Connection to server or @code CUPS_HTT
close(fd);
- if (cupsLastError() != IPP_OK)
+ if (cupsLastError() != IPP_STATUS_OK)
{
unlink(cg->ppd_filename);
return (NULL);
@@ -1459,7 +1278,7 @@ cupsPrintFiles2(
if (!name || num_files < 1 || !files)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
return (0);
}
@@ -1498,20 +1317,20 @@ cupsPrintFiles2(
* Unable to open print file, cancel the job and return...
*/
- _cupsSetError(IPP_DOCUMENT_ACCESS_ERROR, NULL, 0);
+ _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_ACCESS, NULL, 0);
goto cancel_job;
}
status = cupsStartDocument(http, name, job_id, docname, format,
i == (num_files - 1));
- while (status == HTTP_CONTINUE &&
+ while (status == HTTP_STATUS_CONTINUE &&
(bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
- status = cupsWriteRequestData(http, buffer, bytes);
+ status = cupsWriteRequestData(http, buffer, (size_t)bytes);
cupsFileClose(fp);
- if (status != HTTP_CONTINUE || cupsFinishDocument(http, name) != IPP_OK)
+ if (status != HTTP_STATUS_CONTINUE || cupsFinishDocument(http, name) != IPP_STATUS_OK)
{
/*
* Unable to queue, cancel the job and return...
@@ -1577,10 +1396,10 @@ cupsStartDocument(
* Create a Send-Document request...
*/
- if ((request = ippNewRequest(IPP_SEND_DOCUMENT)) == NULL)
+ if ((request = ippNewRequest(IPP_OP_SEND_DOCUMENT)) == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
- return (HTTP_ERROR);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
+ return (HTTP_STATUS_ERROR);
}
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp",
@@ -1598,7 +1417,7 @@ cupsStartDocument(
if (format)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
"document-format", NULL, format);
- ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last_document);
+ ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last_document);
/*
* Send and delete the request, then return the status...
@@ -1649,18 +1468,15 @@ cups_get_printer_uri(
};
- DEBUG_printf(("7cups_get_printer_uri(http=%p, name=\"%s\", host=%p, "
- "hostsize=%d, resource=%p, resourcesize=%d, depth=%d)",
- http, name, host, hostsize, resource, resourcesize, depth));
+ DEBUG_printf(("4cups_get_printer_uri(http=%p, name=\"%s\", host=%p, hostsize=%d, resource=%p, resourcesize=%d, depth=%d)", http, name, host, hostsize, resource, resourcesize, depth));
/*
* Setup the printer URI...
*/
- if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
- "localhost", 0, "/printers/%s", name) != HTTP_URI_OK)
+ if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", name) < HTTP_URI_STATUS_OK)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to create printer-uri"), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create printer-uri"), 1);
*host = '\0';
*resource = '\0';
@@ -1668,14 +1484,16 @@ cups_get_printer_uri(
return (0);
}
- DEBUG_printf(("9cups_get_printer_uri: printer-uri=\"%s\"", uri));
+ DEBUG_printf(("5cups_get_printer_uri: printer-uri=\"%s\"", uri));
/*
* Get the hostname and port number we are connected to...
*/
httpGetHostname(http, http_hostname, sizeof(http_hostname));
- http_port = _httpAddrPort(http->hostaddr);
+ http_port = httpAddrPort(http->hostaddr);
+
+ DEBUG_printf(("5cups_get_printer_uri: http_hostname=\"%s\"", http_hostname));
/*
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
@@ -1687,62 +1505,57 @@ cups_get_printer_uri(
* requested-attributes
*/
- request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
- NULL, uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
- ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
- "requested-attributes",
- sizeof(requested_attrs) / sizeof(requested_attrs[0]),
- NULL, requested_attrs);
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(requested_attrs) / sizeof(requested_attrs[0]), NULL, requested_attrs);
/*
* Do the request and get back a response...
*/
- snprintf(resource, resourcesize, "/printers/%s", name);
+ snprintf(resource, (size_t)resourcesize, "/printers/%s", name);
if ((response = cupsDoRequest(http, request, resource)) != NULL)
{
const char *device_uri = NULL; /* device-uri value */
- if ((attr = ippFindAttribute(response, "device-uri",
- IPP_TAG_URI)) != NULL)
+ if ((attr = ippFindAttribute(response, "device-uri", IPP_TAG_URI)) != NULL)
+ {
device_uri = attr->values[0].string.text;
+ DEBUG_printf(("5cups_get_printer_uri: device-uri=\"%s\"", device_uri));
+ }
if (device_uri &&
- (!strncmp(device_uri, "ipp://", 6) ||
- !strncmp(device_uri, "ipps://", 7) ||
- ((strstr(device_uri, "._ipp.") != NULL ||
- strstr(device_uri, "._ipps.") != NULL) &&
+ (((!strncmp(device_uri, "ipp://", 6) || !strncmp(device_uri, "ipps://", 7)) &&
+ (strstr(device_uri, "/printers/") != NULL || strstr(device_uri, "/classes/") != NULL)) ||
+ ((strstr(device_uri, "._ipp.") != NULL || strstr(device_uri, "._ipps.") != NULL) &&
!strcmp(device_uri + strlen(device_uri) - 5, "/cups"))))
{
/*
* Statically-configured shared printer.
*/
- httpSeparateURI(HTTP_URI_CODING_ALL,
- _httpResolveURI(device_uri, uri, sizeof(uri),
- _HTTP_RESOLVE_DEFAULT, NULL, NULL),
- scheme, sizeof(scheme), username, sizeof(username),
- host, hostsize, port, resource, resourcesize);
+ httpSeparateURI(HTTP_URI_CODING_ALL, _httpResolveURI(device_uri, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL), scheme, sizeof(scheme), username, sizeof(username), host, hostsize, port, resource, resourcesize);
ippDelete(response);
+ DEBUG_printf(("5cups_get_printer_uri: Resolved to host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource));
return (1);
}
- else if ((attr = ippFindAttribute(response, "member-uris",
- IPP_TAG_URI)) != NULL)
+ else if ((attr = ippFindAttribute(response, "member-uris", IPP_TAG_URI)) != NULL)
{
/*
* Get the first actual printer name in the class...
*/
+ DEBUG_printf(("5cups_get_printer_uri: Got member-uris with %d values.", ippGetCount(attr)));
+
for (i = 0; i < attr->num_values; i ++)
{
- httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text,
- scheme, sizeof(scheme), username, sizeof(username),
- host, hostsize, port, resource, resourcesize);
+ DEBUG_printf(("5cups_get_printer_uri: member-uris[%d]=\"%s\"", i, ippGetString(attr, i, NULL)));
+
+ httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, scheme, sizeof(scheme), username, sizeof(username), host, hostsize, port, resource, resourcesize);
if (!strncmp(resource, "/printers/", 10))
{
/*
@@ -1751,6 +1564,7 @@ cups_get_printer_uri(
ippDelete(response);
+ DEBUG_printf(("5cups_get_printer_uri: Found printer member with host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource));
return (1);
}
}
@@ -1775,8 +1589,7 @@ cups_get_printer_uri(
if (!_cups_strcasecmp(http_hostname, host) && *port == http_port)
http2 = http;
- else if ((http2 = httpConnectEncrypt(host, *port,
- cupsEncryption())) == NULL)
+ else if ((http2 = httpConnect2(host, *port, NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL)) == NULL)
{
DEBUG_puts("8cups_get_printer_uri: Unable to connect to server");
@@ -1805,25 +1618,21 @@ cups_get_printer_uri(
}
}
}
- else if ((attr = ippFindAttribute(response, "printer-uri-supported",
- IPP_TAG_URI)) != NULL)
+ else if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
{
- httpSeparateURI(HTTP_URI_CODING_ALL,
- _httpResolveURI(attr->values[0].string.text, uri,
- sizeof(uri), _HTTP_RESOLVE_DEFAULT,
- NULL, NULL),
- scheme, sizeof(scheme), username, sizeof(username),
- host, hostsize, port, resource, resourcesize);
+ httpSeparateURI(HTTP_URI_CODING_ALL, _httpResolveURI(attr->values[0].string.text, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL), scheme, sizeof(scheme), username, sizeof(username), host, hostsize, port, resource, resourcesize);
ippDelete(response);
+ DEBUG_printf(("5cups_get_printer_uri: Resolved to host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource));
+
if (!strncmp(resource, "/classes/", 9))
{
- _cupsSetError(IPP_INTERNAL_ERROR,
- _("No printer-uri found for class"), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer-uri found for class"), 1);
*host = '\0';
*resource = '\0';
+ DEBUG_puts("5cups_get_printer_uri: Not returning class.");
return (0);
}
@@ -1833,16 +1642,17 @@ cups_get_printer_uri(
ippDelete(response);
}
- if (cupsLastError() != IPP_NOT_FOUND)
- _cupsSetError(IPP_INTERNAL_ERROR, _("No printer-uri found"), 1);
+ if (cupsLastError() != IPP_STATUS_ERROR_NOT_FOUND)
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer-uri found"), 1);
*host = '\0';
*resource = '\0';
+ DEBUG_puts("5cups_get_printer_uri: Printer URI not found.");
return (0);
}
/*
- * End of "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: util.c 12884 2015-10-07 20:31:46Z msweet $".
*/
diff --git a/cups/versioning.h b/cups/versioning.h
index 9ccf18f..1e661df 100644
--- a/cups/versioning.h
+++ b/cups/versioning.h
@@ -1,9 +1,9 @@
/*
- * "$Id: versioning.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: versioning.h 12418 2015-01-22 15:49:23Z msweet $"
*
* API versioning definitions for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -19,10 +19,11 @@
/*
* This header defines several constants - _CUPS_DEPRECATED,
- * _CUPS_API_1_1, _CUPS_API_1_1_19, _CUPS_API_1_1_20, _CUPS_API_1_1_21,
- * _CUPS_API_1_2, _CUPS_API_1_3, _CUPS_API_1_4, _CUPS_API_1_5, _CUPS_API_1_6 -
- * which add compiler-specific attributes that flag functions that are
- * deprecated or added in particular releases.
+ * _CUPS_DEPRECATED_MSG, _CUPS_INTERNAL_MSG, _CUPS_API_1_1, _CUPS_API_1_1_19,
+ * _CUPS_API_1_1_20, _CUPS_API_1_1_21, _CUPS_API_1_2, _CUPS_API_1_3,
+ * _CUPS_API_1_4, _CUPS_API_1_5, _CUPS_API_1_6, _CUPS_API_1_7, and
+ * _CUPS_API_2_0 - which add compiler-specific attributes that flag functions
+ * that are deprecated, added in particular releases, or internal to CUPS.
*
* On OS X, the _CUPS_API_* constants are defined based on the values of
* the MAC_OS_X_VERSION_MIN_ALLOWED and MAC_OS_X_VERSION_MAX_ALLOWED constants
@@ -49,6 +50,12 @@
# ifndef AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
# define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER __attribute__((unavailable))
# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER */
+# ifndef AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
+# define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER __attribute__((unavailable))
+# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER */
+# ifndef AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
+# define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER __attribute__((unavailable))
+# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER */
# define _CUPS_API_1_1_19 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
# define _CUPS_API_1_1_20 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
# define _CUPS_API_1_1_21 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
@@ -56,7 +63,9 @@
# define _CUPS_API_1_3 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
# define _CUPS_API_1_4 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
# define _CUPS_API_1_5 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
-# define _CUPS_API_1_6
+# define _CUPS_API_1_6 AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
+# define _CUPS_API_1_7 AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
+# define _CUPS_API_2_0 AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
# else
# define _CUPS_API_1_1_19
# define _CUPS_API_1_1_20
@@ -66,18 +75,85 @@
# define _CUPS_API_1_4
# define _CUPS_API_1_5
# define _CUPS_API_1_6
+# define _CUPS_API_1_7
+# define _CUPS_API_2_0
# endif /* __APPLE__ && !_CUPS_SOURCE */
/*
- * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get
- * a warning at compile-time.
+ * With GCC and Clang we can mark old APIs as "deprecated" or "unavailable" with
+ * messages so you get warnings/errors are compile-time...
*/
-# if defined(__GNUC__) && __GNUC__ > 2 && !defined(_CUPS_SOURCE)
-# define _CUPS_DEPRECATED __attribute__ ((__deprecated__))
-# else
+# ifdef __has_extension /* Clang */
+# define _CUPS_HAS_DEPRECATED
+# if __has_extension(attribute_deprecated_with_message)
+# define _CUPS_HAS_DEPRECATED_WITH_MESSAGE
+# endif
+# if __has_extension(attribute_unavailable_with_message)
+# define _CUPS_HAS_UNAVAILABLE_WITH_MESSAGE
+# endif
+# elif defined(__GNUC__) /* GCC and compatible */
+# if __GNUC__ >= 3 /* GCC 3.0 or higher */
+# define _CUPS_HAS_DEPRECATED
+# endif /* __GNUC__ >= 3 */
+# if __GNUC__ >= 5 /* GCC 5.x */
+# define _CUPS_HAS_DEPRECATED_WITH_MESSAGE
+# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 5
+ /* GCC 4.5 or higher */
+# define _CUPS_HAS_DEPRECATED_WITH_MESSAGE
+# endif /* __GNUC__ >= 5 */
+# endif /* __has_extension */
+
+# if !defined(_CUPS_HAS_DEPRECATED) || (defined(_CUPS_SOURCE) && !defined(_CUPS_NO_DEPRECATED))
+ /*
+ * Don't mark functions deprecated if the compiler doesn't support it
+ * or we are building CUPS source that doesn't care.
+ */
# define _CUPS_DEPRECATED
-# endif /* __GNUC__ && __GNUC__ > 2 && !_CUPS_SOURCE */
+# define _CUPS_DEPRECATED_MSG(m)
+# define _CUPS_DEPRECATED_1_6_MSG(m)
+# define _CUPS_DEPRECATED_1_7_MSG(m)
+# define _CUPS_INTERNAL_MSG(m)
+# elif defined(_CUPS_HAS_UNAVAILABLE_WITH_MESSAGE) && defined(_CUPS_NO_DEPRECATED)
+ /*
+ * Compiler supports the unavailable attribute, so use it when the code
+ * wants to exclude the use of deprecated API.
+ */
+# define _CUPS_DEPRECATED __attribute__ ((unavailable))
+# define _CUPS_DEPRECATED_MSG(m) __attribute__ ((unavailable(m)))
+# define _CUPS_DEPRECATED_1_6_MSG(m) __attribute__ ((unavailable(m)))
+# define _CUPS_DEPRECATED_1_7_MSG(m) __attribute__ ((unavailable(m)))
+# define _CUPS_INTERNAL_MSG(m) __attribute__ ((unavailable(m)))
+# else
+ /*
+ * Compiler supports the deprecated attribute, so use it.
+ */
+# define _CUPS_DEPRECATED __attribute__ ((deprecated))
+# ifdef _CUPS_HAS_DEPRECATED_WITH_MESSAGE
+# define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated(m)))
+# else
+# define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated))
+# endif /* _CUPS_HAS_DEPRECATED_WITH_MESSAGE */
+# if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_8
+# define _CUPS_DEPRECATED_1_6_MSG(m) _CUPS_DEPRECATED_MSG(m)
+# else
+# define _CUPS_DEPRECATED_1_6_MSG(m)
+# endif /* MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_8 */
+# if defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
+# define _CUPS_DEPRECATED_1_7_MSG(m) _CUPS_DEPRECATED_MSG(m)
+# else
+# define _CUPS_DEPRECATED_1_7_MSG(m)
+# endif /* MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_9 */
+# ifdef _CUPS_SOURCE
+# define _CUPS_INTERNAL_MSG(m)
+# elif defined(_CUPS_HAS_UNAVAILABLE_WITH_MESSAGE)
+# define _CUPS_INTERNAL_MSG(m) __attribute__ ((unavailable(m)))
+# elif defined(_CUPS_HAS_DEPRECATED_WITH_MESSAGE)
+# define _CUPS_INTERNAL_MSG(m) __attribute__ ((deprecated(m)))
+# else
+# define _CUPS_INTERNAL_MSG(m) __attribute__ ((deprecated))
+# endif /* _CUPS_SOURCE */
+# endif /* !_CUPS_HAS_DEPRECATED || (_CUPS_SOURCE && !_CUPS_NO_DEPRECATED) */
# ifndef __GNUC__
# define __attribute__(x)
@@ -86,5 +162,5 @@
#endif /* !_CUPS_VERSIONING_H_ */
/*
- * End of "$Id: versioning.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: versioning.h 12418 2015-01-22 15:49:23Z msweet $".
*/
diff --git a/data/Makefile b/data/Makefile
index 5adc9e9..484dc26 100644
--- a/data/Makefile
+++ b/data/Makefile
@@ -1,9 +1,9 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12278 2014-12-01 13:53:56Z msweet $"
#
# Datafile makefile for CUPS.
#
-# Copyright 2007-2011 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 1993-2006 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
@@ -19,17 +19,6 @@ include ../Makedefs
# Data files...
#
-BANNERS = \
- classified \
- confidential \
- secret \
- standard \
- topsecret \
- unclassified
-
-DATAFILES = \
- testprint
-
PPDCFILES = \
epson.h \
font.defs \
@@ -87,13 +76,7 @@ install: all install-data install-headers install-libs install-exec
install-data:
$(INSTALL_DIR) -m 755 $(DATADIR)/banners
- for file in $(BANNERS); do \
- $(INSTALL_DATA) $$file $(DATADIR)/banners; \
- done
$(INSTALL_DIR) -m 755 $(DATADIR)/data
- for file in $(DATAFILES); do \
- $(INSTALL_DATA) $$file $(DATADIR)/data; \
- done
$(INSTALL_DIR) -m 755 $(DATADIR)/model
$(INSTALL_DIR) -m 755 $(DATADIR)/ppdc
for file in $(PPDCFILES); do \
@@ -128,12 +111,6 @@ install-libs:
#
uninstall:
- for file in $(BANNERS); do \
- $(RM) $(DATADIR)/banners/$$file; \
- done
- for file in $(DATAFILES); do \
- $(RM) $(DATADIR)/data/$$file; \
- done
for file in $(PPDCFILES); do \
$(RM) $(DATADIR)/ppdc/$$file; \
done
@@ -146,5 +123,5 @@ uninstall:
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12278 2014-12-01 13:53:56Z msweet $".
#
diff --git a/data/classified b/data/classified
deleted file mode 100644
index ca01a13..0000000
--- a/data/classified
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Classified
-Footer Classified
-Image images/cups.png
-
diff --git a/data/confidential b/data/confidential
deleted file mode 100644
index f1f0d85..0000000
--- a/data/confidential
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Confidential
-Footer Confidential
-Image images/cups.png
-
diff --git a/data/epson.h b/data/epson.h
index ee6b8af..1b0fe9f 100644
--- a/data/epson.h
+++ b/data/epson.h
@@ -1,5 +1,5 @@
/*
- * "$Id: epson.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: epson.h 624 2008-02-16 00:27:39Z msweet $"
*
* This file contains model number definitions for the CUPS sample
* ESC/P driver.
@@ -23,5 +23,5 @@
/*
- * End of "$Id: epson.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: epson.h 624 2008-02-16 00:27:39Z msweet $".
*/
diff --git a/data/hp.h b/data/hp.h
index 30de578..3a5ba3d 100644
--- a/data/hp.h
+++ b/data/hp.h
@@ -1,5 +1,5 @@
/*
- * "$Id: hp.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: hp.h 624 2008-02-16 00:27:39Z msweet $"
*
* This file contains model number definitions for the CUPS sample
* HP driver.
@@ -20,5 +20,5 @@
/*
- * End of "$Id: hp.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: hp.h 624 2008-02-16 00:27:39Z msweet $".
*/
diff --git a/data/label.h b/data/label.h
index 23450de..38cdc37 100644
--- a/data/label.h
+++ b/data/label.h
@@ -1,5 +1,5 @@
/*
- * "$Id: label.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: label.h 624 2008-02-16 00:27:39Z msweet $"
*
* This file contains model number definitions for the CUPS sample
* label printer driver.
@@ -24,5 +24,5 @@
#define INTELLITECH_PCL 0x20 /* Intellitech PCL-based printers */
/*
- * End of "$Id: label.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: label.h 624 2008-02-16 00:27:39Z msweet $".
*/
diff --git a/data/secret b/data/secret
deleted file mode 100644
index 66a0e8a..0000000
--- a/data/secret
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Secret
-Footer Secret
-Image images/cups.png
-
diff --git a/data/standard b/data/standard
deleted file mode 100644
index 31c68a0..0000000
--- a/data/standard
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Cover Page
-Footer Cover Page
-Image images/cups.png
-
diff --git a/data/testprint.in b/data/testprint.in
deleted file mode 100644
index 8cee3ab..0000000
--- a/data/testprint.in
+++ /dev/null
@@ -1,7 +0,0 @@
-#CUPS-BANNER
-Show printer-name printer-info printer-location printer-make-and-model printer-driver-name printer-driver-version paper-size imageable-area
-Header Printer Test Page
-Footer Printer Test Page
-Notice CUPS @CUPS_VERSION@.
-Image images/cups.png
-Image images/color-wheel.png
diff --git a/data/topsecret b/data/topsecret
deleted file mode 100644
index d2b87fa..0000000
--- a/data/topsecret
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Top Secret
-Footer Top Secret
-Image images/cups.png
-
diff --git a/data/unclassified b/data/unclassified
deleted file mode 100644
index 2d1a7d0..0000000
--- a/data/unclassified
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Unclassified
-Footer Unclassified
-Image images/cups.png
-
diff --git a/desktop/Makefile b/desktop/Makefile
index e382636..c4fdd76 100644
--- a/desktop/Makefile
+++ b/desktop/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 1725 2009-10-15 18:50:47Z msweet $"
#
# Desktop makefile for CUPS.
#
@@ -131,5 +131,5 @@ uninstall:
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 1725 2009-10-15 18:50:47Z msweet $".
#
diff --git a/doc/Makefile b/doc/Makefile
index c726747..a6ba24d 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11930 2014-06-16 15:33:00Z msweet $"
#
-# Documentation makefile for CUPS.
+# Documentation makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
@@ -20,6 +20,7 @@ include ../Makedefs
#
WEBPAGES = \
+ apple-touch-icon.png \
cups.css \
cups-printable.css \
index.html \
@@ -61,14 +62,21 @@ HELPFILES = \
help/glossary.html \
help/kerberos.html \
help/license.html \
- help/man-cupsaccept.html \
help/man-backend.html \
help/man-cancel.html \
+ help/man-classes.conf.html \
+ help/man-client.conf.html \
+ help/man-cups.html \
help/man-cups-config.html \
+ help/man-cups-files.conf.html \
help/man-cups-lpd.html \
help/man-cups-snmp.html \
+ help/man-cupsaccept.html \
help/man-cupsaddsmb.html \
+ help/man-cupsd.conf.html \
help/man-cupsd.html \
+ help/man-cupsd-helper.html \
+ help/man-cupsd-logs.html \
help/man-cupsenable.html \
help/man-cupstestdsc.html \
help/man-cupstestppd.html \
@@ -81,7 +89,6 @@ HELPFILES = \
help/man-lpinfo.html \
help/man-lpmove.html \
help/man-lpoptions.html \
- help/man-lppasswd.html \
help/man-lpq.html \
help/man-lpr.html \
help/man-lprm.html \
@@ -94,6 +101,8 @@ HELPFILES = \
help/man-ppdi.html \
help/man-ppdmerge.html \
help/man-ppdpo.html \
+ help/man-printers.conf.html \
+ help/man-subscriptions.conf.html \
help/network.html \
help/options.html \
help/overview.html \
@@ -101,22 +110,10 @@ HELPFILES = \
help/postscript-driver.html \
help/ppd-compiler.html \
help/raster-driver.html \
- help/ref-access_log.html \
- help/ref-classes-conf.html \
- help/ref-client-conf.html \
- help/ref-cupsd-conf.html \
- help/ref-cups-files-conf.html \
- help/ref-error_log.html \
- help/ref-mailto-conf.html \
- help/ref-page_log.html \
help/ref-ppdcfile.html \
- help/ref-printers-conf.html \
- help/ref-snmp-conf.html \
- help/ref-subscriptions-conf.html \
help/security.html \
help/sharing.html \
help/spec-banner.html \
- help/spec-browsing.html \
help/spec-cmp.html \
help/spec-command.html \
help/spec-design.html \
@@ -126,9 +123,7 @@ HELPFILES = \
help/spec-ppd.html \
help/spec-raster.html \
help/spec-stp.html \
- help/standard.html \
- help/translation.html \
- help/whatsnew.html
+ help/translation.html
#
diff --git a/doc/apple-touch-icon.opacity b/doc/apple-touch-icon.opacity
new file mode 100644
index 0000000..a1d742d
--- /dev/null
+++ b/doc/apple-touch-icon.opacity
Binary files differ
diff --git a/doc/apple-touch-icon.png b/doc/apple-touch-icon.png
new file mode 100644
index 0000000..e4d8f81
--- /dev/null
+++ b/doc/apple-touch-icon.png
Binary files differ
diff --git a/doc/ca/index.html.in b/doc/ca/index.html.in
deleted file mode 100644
index 77542d3..0000000
--- a/doc/ca/index.html.in
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>Inici - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Inici&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administració&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Ajuda&nbsp;en&nbsp;línia&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Tasques&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Impressores&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS és el sistema d'impressió de codi obert i basat en estandards desenvolupat per
-<A HREF="http://www.apple.com/">Apple Inc.</A> per OS<SUP>&reg;</SUP> X and
-altres sistemes operatius basats en UNIX<SUP>&reg;</SUP></P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS per usuaris</H2>
-
-<P><A HREF="help/overview.html">Descripció general del CUPS</A></P>
-
-<P><A HREF="help/options.html">Impresió i opcions en linia de comandes</A></P>
-
-<P><A HREF="help/whatsnew.html">Novetats del CUPS 1.4</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Fòrum d'usuaris</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS per Administradors</H2>
-
-<P><A HREF="admin">Afegir impressores i classes</A></P>
-
-<P><A HREF="help/policies.html">Gestió de les polítiques de treball</A></P>
-
-<P><A HREF="help/accounting.html">Bàsic de comptes d'impressió</A></P>
-
-<P><A HREF="help/security.html">Seguritat del servidor</A></P>
-
-<P><A HREF="help/kerberos.html">Ús d'autenticació amb el Kerberos</A></P>
-
-<P><A HREF="help/network.html">Ús d'impressores en xarxa</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Referència del cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Cerca de controladors d'impressora</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS per desenvolupadors</H2>
-
-<P><A HREF="help/api-overview.html">Introducció a la programació amb CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">La API de CUPS</A></P>
-
-<P><A HREF="help/api-filter.html">Programació de filtres i rerefons</A></P>
-
-<P><A HREF="help/api-httpipp.html">APIs per HTTP i IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">API per PPD</A></P>
-
-<P><A HREF="help/api-raster.html">API per Raster</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">Referència del fitxer d'inf. del compilador del controlador per PPD</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Fòrum de desenvolupadors</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS i el seu logotip són marques registrades de
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS té copyright 2007-2013 d'Apple
-Inc. Tots els drets reservats.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/doc/cs/index.html.in b/doc/cs/index.html.in
deleted file mode 100644
index 38f4a6f..0000000
--- a/doc/cs/index.html.in
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>Hlavní strana - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Hlavní strana&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administrace&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Třídy tiskáren&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Nápověda&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Úlohy&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Tiskárny&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Hledat"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS je na bázi standardů otevřený zdrojový kód tiskového systému vyvinutý
-spoleÄností <A HREF="http://www.apple.com/">Apple Inc.</A> pro Mac OS<SUP>&reg;</SUP>
-X a jiné UNIX<SUP>&reg;</SUP>ové operaÄní systémy.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS pro uživatele</H2>
-
-<P><A HREF="help/overview.html">Popis CUPS</A></P>
-
-<P><A HREF="help/options.html">Příkazová řádka tisku a Možnosti</A></P>
-
-<P><A HREF="help/whatsnew.html">Co je nového v CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Uživatelské fórum</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS pro administrátory</H2>
-
-<P><A HREF="admin">Přidání tiskáren a tříd</A></P>
-
-<P><A HREF="help/policies.html">Správa politik</A></P>
-
-<P><A HREF="help/accounting.html">Základní úÄtování tiskáren</A></P>
-
-<P><A HREF="help/security.html">ZabezpeÄení serveru</A></P>
-
-<P><A HREF="help/kerberos.html">Použití ověřování pomocí protokolu Kerberos</A></P>
-
-<P><A HREF="help/network.html">Použití síťových tiskáren</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">KonfiguraÄní soubor cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Hedat ovladaÄe tiskárny</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS pro vývojáře</H2>
-
-<P><A HREF="help/api-overview.html">Úvod do CUPS programování</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API knihovny</A></P>
-
-<P><A HREF="help/api-filter.html">Programování filtrů a backendů</A></P>
-
-<P><A HREF="help/api-httpipp.html">HTTP a IPP API knihovny</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API knihovny</A></P>
-
-<P><A HREF="help/api-raster.html">Raster API knihovny</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD kompilátor Driver Information File Reference</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Vývojářské fórum</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS a logo CUPS jsou ochranné známky spoleÄnosti
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS je chráněn autorskými
-právy 2007-2013 Apple Inc. Všechna práva vyhrazena.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/doc/cups-printable.css b/doc/cups-printable.css
index 42ea2be..262e625 100644
--- a/doc/cups-printable.css
+++ b/doc/cups-printable.css
@@ -29,7 +29,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -68,7 +80,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/cups.css b/doc/cups.css
index 815c193..da6ac15 100644
--- a/doc/cups.css
+++ b/doc/cups.css
@@ -1,7 +1,109 @@
+/* Layout CSS */
+.header {
+ background: rgba(46,46,46,.9);
+ box-shadow: 0px 2px 5px rgba(0,0,0,0.25);
+ color: white;
+ left: 0;
+ margin-bottom: 20px;
+ padding: 0px;
+ position: fixed;
+ right: 0;
+ top: 0;
+ width: 100%;
+}
+.header ul {
+ list-style: none;
+ margin: 0px;
+ -webkit-margin-before: 0;
+ -webkit-margin-after: 0;
+ -webkit-margin-start: 0;
+ -webkit-margin-end: 5px;
+ -webkit-padding-start: 0;
+}
+.header ul li {
+ float: left;
+}
+.header a {
+ display: block;
+ padding: 5px 10px !important;
+}
+.header a:link, .header a:visited {
+ color: white !important;
+ text-decoration: none !important;
+}
+.header a:hover {
+ background: #cccccc !important;
+ color: #333333 !important;
+ text-decoration: none !important;
+}
+.header a.active {
+ background: white !important;
+ box-shadow: rgba(0,0,0,0.1) 0px 0px 10px 0px inset;
+ color: black !important;
+ text-decoration: none !important;
+}
+
+.body {
+ padding: 40px 20px;
+}
+
+.footer {
+ background: rgba(46,46,46,.9);
+ bottom: 0;
+ box-shadow: 0px -2px 5px rgba(0,0,0,0.25);
+ color: #cccccc;
+ font-size: 10px;
+ height: 20px;
+ left: 0;
+ padding: 10px 10px 3px;
+ position: fixed;
+ width: 100%;
+}
+.footer a:link, footer a:hover, .footer a:visited {
+ color: white !important;
+ text-decoration: none !important;
+}
+
+.row {
+ width: 100%;
+ *zoom: 1;
+}
+.row:after {
+ clear: both;
+}
+
+.row .thirds {
+ float: left;
+ margin-left: 0.5%;
+ margin-right: 0;
+ width: 33%;
+}
+.row .thirds:first-child {
+ margin-left: 0;
+}
+
+.row .halves {
+ float: left;
+ margin-left: 0.5%;
+ margin-right: 0;
+ width: 49.75%;
+}
+.row .halves:first-child {
+ margin-left: 0;
+}
+.mobile {
+ display: none;
+}
+.no-mobile {
+ display: inherit;
+}
+
+/* Appearance CSS */
BODY {
background: white;
color: black;
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
+ margin: 0;
}
H1, H2, H3, H4, H5, H6, P, TD, TH {
@@ -31,6 +133,18 @@ P.example {
margin-left: 36pt;
}
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: white;
border: dotted thin #999999;
@@ -255,7 +369,7 @@ H2.title, H3.title {
border-bottom: solid 1pt #999999;
}
-DIV.indent, TABLE.indent {
+TABLE.indent {
margin-top: 2em;
margin-left: auto;
margin-right: auto;
@@ -460,3 +574,69 @@ div.body dt {
div.body dd {
margin-bottom: 0.5em;
}
+/* iPhone/iPod touch overrides */
+@media only screen and (min-device-width: 320px) and (max-device-width: 480px),
+ only screen and (min-device-width: 320px) and (max-device-width: 568px) {
+ .mobile {
+ display: inherit;
+ }
+ .no-mobile {
+ display: none;
+ }
+
+ .header {
+ margin: 0;
+ position: relative;
+ }
+ .header ul li {
+ float: none;
+ }
+
+ .body {
+ paddng: 0px;
+ }
+
+ .footer {
+ font-size: 10px;
+ height: auto;
+ position: relative;
+ }
+
+ .row .thirds, .row .halves {
+ float: none;
+ margin: 0;
+ width: 100%;
+ }
+
+ DIV.sidebar {
+ float: none;
+ margin-left: 0;
+ max-width: 100%;
+ min-width: 100%;
+ width: 100%;
+ }
+
+ BLOCKQUOTE {
+ margin: 0;
+ }
+
+ P.example {
+ margin-left: 0;
+ }
+
+ PRE.command, PRE.example, PRE.man {
+ margin-left: 0;
+ white-space: pre-wrap;
+ }
+}
+
+/* iPad overrides */
+@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
+
+ .mobile {
+ display: inherit;
+ }
+ .no-mobile {
+ display: none;
+ }
+}
diff --git a/doc/de/index.html.in b/doc/de/index.html.in
new file mode 100644
index 0000000..c37edd8
--- /dev/null
+++ b/doc/de/index.html.in
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <title>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body>
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a class="active" href="/">Home</a></li>
+ <li><a href="/admin">Verwaltung</a></li>
+ <li><a href="/classes/">Klassen</a></li>
+ <li><a href="/help/">Hilfe</a></li>
+ <li><a href="/jobs/">Aufträge</a></li>
+ <li><a href="/printers/">Drucker</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>CUPS 2.0.2</h1>
+ <p>CUPS basiert auf Standards, Open Source Drucksystem entwickelt durch <a href="http://www.apple.com/">Apple Inc.</a> für OS X<sup>&reg;</sup> und andere UNIX<sup>&reg;</sup>-artige Betriebssysteme.</p>
+ </div>
+ <div class="row">
+ <div class="thirds">
+ <h2>CUPS für Benutzer</h2>
+ <p><a href="help/overview.html">Überblick über CUPS</a></p>
+ <p><a href="help/options.html">Befehlszeilen-Druck und Optionen</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups">Benutzerforum</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS für Administratoren</h2>
+ <p><a href="admin">Drucker und Klassen hinzufügen</a></p>
+ <p><a href="help/policies.html">Betriebs-Richtlinie festlegen</a></p>
+ <p><a href="help/network.html">Benutzung von Netzwerk-Druckern</a></p>
+ <p><a href="help/man-cupsd.conf.html">cupsd.conf Referenz</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS für Entwickler</h2>
+ <p><a href="help/api-overview.html">Einführung in die CUPS Programmierung</a></p>
+ <p><a href="help/api-cups.html">CUPS API</a></p>
+ <p><a href="help/api-filter.html">Filter und Backend Programmierung</a></p>
+ <p><a href="help/api-httpipp.html">HTTP und IPP APIs</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">Entwicklerforum</a></p>
+ </div>
+ </div>
+ </div>
+ <div class="footer">CUPS und das CUPS Logo sind Warenzeichen der <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. Alle Rechte vorbehalten.</div>
+ </body>
+</html>
diff --git a/doc/es/index.html.in b/doc/es/index.html.in
index d4ef797..4faafe8 100644
--- a/doc/es/index.html.in
+++ b/doc/es/index.html.in
@@ -1,107 +1,55 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Inicio&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administraci&oacute;n&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Clases&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Ayuda&nbsp;en&nbsp;l&iacute;nea&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Trabajos&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Impresoras&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS es el sistema de impresi&oacute;n de c&oacute;digo abierto basado en
-est&aacute;ndares desarrollado por <A HREF="http://www.apple.com/">Apple Inc.</A> para
-OS<SUP>&reg;</SUP> X y otros sistemas operativos tipo UNIX<SUP>&reg;</SUP>.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS para usuarios</H2>
-
-<P><A HREF="help/overview.html">Descripci&oacute;n de CUPS</A></P>
-
-<P><A HREF="help/options.html">Impresi&oacute;n desde la l&iacute;nea de comandos y opciones</A></P>
-
-<P><A HREF="help/whatsnew.html">Qu&eacute; hay de nuevo en CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Foro de usuarios</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS para administradores</H2>
-
-<P><A HREF="admin">A&ntilde;adiendo impresoras y clases</A></P>
-
-<P><A HREF="help/policies.html">Gestionando pol&iacute;ticas de funcionamiento</A></P>
-
-<P><A HREF="help/accounting.html">Contabilidad b&aacute;sica de impresora</A></P>
-
-<P><A HREF="help/security.html">Seguridad del servidor</A></P>
-
-<P><A HREF="help/kerberos.html">Usando autentificaci&oacute;n Kerberos</A></P>
-
-<P><A HREF="help/network.html">Usando impresoras de red</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Referencia de cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Encontrar controladores de impresora</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS para desarrolladores</H2>
-
-<P><A HREF="help/api-overview.html">Introducci&oacute;n a la programaci&oacute;n de CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">La API de CUPS</A></P>
-
-<P><A HREF="help/api-filter.html">Programaci&oacute;n de filtros y programas de conexi&oacute;n</A></P>
-
-<P><A HREF="help/api-httpipp.html">Las APIs HTTP e IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">La API PPD</A></P>
-
-<P><A HREF="help/api-raster.html">La API Raster</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">Referencia del archivo de informaci&oacute;n del compilador de controladores PPD</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Foro de desarrollo</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS y el logo de CUPS son
-marcas registradas de <A HREF="http://www.apple.com">Apple Inc.</A> Los derechos
-de copia de CUPS 2007-2013 son de Apple Inc. Todos los derechos reservados.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <title>Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body>
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a class="active" href="/">Inicio</a></li>
+ <li><a href="/admin">Administraci&oacute;n</a></li>
+ <li><a href="/classes/">Clases</a></li>
+ <li><a href="/help/">Ayuda</a></li>
+ <li><a href="/jobs/">Trabajos</a></li>
+ <li><a href="/printers/">Impresoras</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>CUPS @CUPS_VERSION@</h1>
+ <p>CUPS es el sistema de impresi&oacute;n de c&oacute;digo abierto basado en est&aacute;ndares desarrollado por <a href="http://www.apple.com/">Apple Inc.</a> para OS X<sup>&reg;</sup> y otros sistemas operativos tipo UNIX<sup>&reg;</sup>.</p>
+ </div>
+ <div class="row">
+ <div class="thirds">
+ <h2>CUPS para usuarios</h2>
+ <p><a href="help/overview.html">Descripci&oacute;n de CUPS</a></p>
+ <p><a href="help/options.html">Impresi&oacute;n desde la l&iacute;nea de comandos y opciones</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups">Foro de usuarios</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS para administradores</h2>
+ <p><a href="admin">A&ntilde;adiendo impresoras y clases</a></p>
+ <p><a href="help/policies.html">Gestionando pol&iacute;ticas de funcionamiento</a></p>
+ <p><a href="help/network.html">Usando impresoras de red</a></p>
+ <p><a href="help/man-cupsd.conf.html">Referencia de cupsd.conf</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS para desarrolladores</h2>
+ <p><a href="help/api-overview.html">Introducci&oacute;n a la programaci&oacute;n de CUPS</a></p>
+ <p><a href="help/api-cups.html">La API de CUPS</a></p>
+ <p><a href="help/api-filter.html">Programaci&oacute;n de filtros y programas de conexi&oacute;n</a></p>
+ <p><a href="help/api-httpipp.html">Las APIs HTTP e IPP</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">Foro de desarrollo</a></p>
+ </div>
+ </div>
+ </div>
+ <div class="footer">CUPS y el logo de CUPS son marcas registradas de <a href="http://www.apple.com">Apple Inc.</a> Derechos de autor &copy; 2007-2015 Apple Inc. Todos los derechos reservados.</div>
+ </body>
+</html>
diff --git a/doc/fr/index.html.in b/doc/fr/index.html.in
deleted file mode 100644
index 3345a48..0000000
--- a/doc/fr/index.html.in
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>Accueil - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Accueil&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Aide&nbsp;En&nbsp;Ligne&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;T&acirc;ches&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Imprimantes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS est le syst&egrave;me d'impression Open Source, bas&eacute; sur des standards, d&eacute;velopp&eacute; par
-<A HREF="http://www.apple.com/">Apple Inc.</A> pour Mac OS<SUP>&reg;</SUP> X et
-les autres OS UNIX<SUP>&reg;</SUP>-like.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS pour les utilisateurs</H2>
-
-<P><A HREF="help/overview.html">Pr&eacute;sentation de CUPS</A></P>
-
-<P><A HREF="help/options.html">Impression en ligne de commande et options</A></P>
-
-<P><A HREF="help/whatsnew.html">Quoi de neuf dans CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Forum utilisateur</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS pour les administrateurs</H2>
-
-<P><A HREF="admin">Ajout d'imprimantes et de classes</A></P>
-
-<P><A HREF="help/policies.html">G&eacute;rer les politiques</A></P>
-
-<P><A HREF="help/accounting.html">Printer Accounting Basics</A></P>
-
-<P><A HREF="help/security.html">S&eacute;curit&eacute; du serveur</A></P>
-
-<P><A HREF="help/kerberos.html">Utiliser l'authentification Kerberos</A></P>
-
-<P><A HREF="help/network.html">Utiliser des imprimantes r&eacute;seaux</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">R&eacute;f&eacute;rences sur cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Trouver des pilotes d'imprimantes</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS pour les d&eacute;veloppeurs</H2>
-
-<P><A HREF="help/api-overview.html">Introduction &agrave; la programmation CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">L'API CUPS</A></P>
-
-<P><A HREF="help/api-filter.html">Programmation de filtres et de backends</A></P>
-
-<P><A HREF="help/api-httpipp.html">Les API HTTP et IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">L'API PPD</A></P>
-
-<P><A HREF="help/api-raster.html">L'API Raster</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD Compiler Driver Information File Reference</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Forum d&eacute;veloppeurs</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS et le logo CUPS sont des marques d&eacute;pos&eacute;es de
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS est sous copyright 2007-2013 Apple
-Inc. Tous droits r&eacute;serv&eacute;s.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/doc/help/accounting.html b/doc/help/accounting.html
index 66c34ec..ea37a55 100644
--- a/doc/help/accounting.html
+++ b/doc/help/accounting.html
@@ -10,8 +10,7 @@
<P>CUPS supports a variety of printer accounting schemes. Aside from the
built-in <A HREF="#QUOTAS">quota</A> and <A HREF="#PAGELOG">page logging</A>
-support, there are several third-party solutions that can be found on
-<A HREF="http://www.cups.org/">www.cups.org</A>.</P>
+support, there are several third-party solutions that can be found online.</P>
<H2 CLASS="title"><A NAME="QUOTAS">Quota Support</A></H2>
@@ -27,7 +26,7 @@ options determine whether and how quotas are enforced for a printer.
The <CODE>job-quota-period</CODE> option determines the time interval for
quota tracking. The interval is expressed in seconds, so a day is
86,400, a week is 604,800, and a month is 2,592,000 seconds. The
-<CODE>job-k-limit</CODE> option specifies the job size limit in killobytes. The
+<CODE>job-k-limit</CODE> option specifies the job size limit in kilobytes. The
<CODE>job-page-limit</CODE> option specifies the number of pages limit.</P>
<P>For quotas to be enforced, the period and at least one of the limits
@@ -50,13 +49,7 @@ can be used to easily determine that information.</P>
<H2 CLASS="title"><A NAME="PAGELOG">Page Logging</A></H2>
-<P>CUPS logs every page that is printed on a system to the
-<VAR><A HREF="ref-page_log.html">page_log</A></VAR> file. Page logging
-is only available for drivers that provide page accounting information,
-typically all PostScript and CUPS raster devices. Raw queues and queues
-using third-party solutions such as Foomatic generally do not have
-useful page accounting information available.</P>
-
+<P>CUPS can log every page that is printed on a system to the <VAR><A HREF="man-cupsd-logs.html">page_log</A></VAR> file. Page logging must be enabled by setting the <CODE>PageLogFormat</CODE> directive in the <VAR><A HREF="man-cupsd.conf.html">cupsd.conf</A></VAR> file and is only available for drivers that provide page accounting information, typically all PostScript and CUPS raster devices. Raw queues and queues using third-party solutions such as Foomatic generally do not have useful page accounting information available.</P>
</BODY>
</HTML>
diff --git a/doc/help/api-array.html b/doc/help/api-array.html
index 0c1998e..220c0f1 100644
--- a/doc/help/api-array.html
+++ b/doc/help/api-array.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/api-cgi.html b/doc/help/api-cgi.html
index 82c740a..63eb9ca 100644
--- a/doc/help/api-cgi.html
+++ b/doc/help/api-cgi.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/api-cups.html b/doc/help/api-cups.html
index de95e67..1269182 100644
--- a/doc/help/api-cups.html
+++ b/doc/help/api-cups.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
@@ -415,6 +427,9 @@ destination.">cupsCopyDestInfo</a></li>
<li><a href="#cupsEncryption" title="Get the current encryption settings.">cupsEncryption</a></li>
<li><a href="#cupsEnumDests" title="Enumerate available destinations with a callback function.">cupsEnumDests</a></li>
<li><a href="#cupsEnumDestsBlock" title="Enumerate available destinations with a block.">cupsEnumDestsBlock</a></li>
+ <li><a href="#cupsFindDestDefault" title="Find the default value(s) for the given option.">cupsFindDestDefault</a></li>
+ <li><a href="#cupsFindDestReady" title="Find the default value(s) for the given option.">cupsFindDestReady</a></li>
+ <li><a href="#cupsFindDestSupported" title="Find the default value(s) for the given option.">cupsFindDestSupported</a></li>
<li><a href="#cupsFinishDestDocument" title="Finish the current document.">cupsFinishDestDocument</a></li>
<li><a href="#cupsFinishDocument" title="Finish sending a document.">cupsFinishDocument</a></li>
<li><a href="#cupsFreeDestInfo" title="Free destination information obtained using
@@ -426,8 +441,14 @@ cupsCopyDestInfo.">cupsFreeDestInfo</a></li>
<li><a href="#cupsGetDefault" title="Get the default printer or class for the default server.">cupsGetDefault</a></li>
<li><a href="#cupsGetDefault2" title="Get the default printer or class for the specified server.">cupsGetDefault2</a></li>
<li><a href="#cupsGetDest" title="Get the named destination from the list.">cupsGetDest</a></li>
+ <li><a href="#cupsGetDestMediaByIndex" title="Get a media name, dimension, and margins for a
+specific size.">cupsGetDestMediaByIndex</a></li>
<li><a href="#cupsGetDestMediaByName" title="Get media names, dimensions, and margins.">cupsGetDestMediaByName</a></li>
<li><a href="#cupsGetDestMediaBySize" title="Get media names, dimensions, and margins.">cupsGetDestMediaBySize</a></li>
+ <li><a href="#cupsGetDestMediaCount" title="Get the number of sizes supported by a
+destination.">cupsGetDestMediaCount</a></li>
+ <li><a href="#cupsGetDestMediaDefault" title="Get the default size for a destination.">cupsGetDestMediaDefault</a></li>
+ <li><a href="#cupsGetDestWithURI" title="Get a destination associated with a URI.">cupsGetDestWithURI</a></li>
<li><a href="#cupsGetDests" title="Get the list of destinations from the default server.">cupsGetDests</a></li>
<li><a href="#cupsGetDests2" title="Get the list of destinations from the specified server.">cupsGetDests2</a></li>
<li><a href="#cupsGetJobs" title="Get the jobs from the default server.">cupsGetJobs</a></li>
@@ -449,6 +470,8 @@ for the given language.">cupsLangEncoding</a></li>
<li><a href="#cupsLangFlush" title="Flush all language data out of the cache.">cupsLangFlush</a></li>
<li><a href="#cupsLangFree" title="Free language data.">cupsLangFree</a></li>
<li><a href="#cupsLangGet" title="Get a language.">cupsLangGet</a></li>
+ <li><a href="#cupsLocalizeDestMedia" title="Get the localized string for a destination media
+size.">cupsLocalizeDestMedia</a></li>
<li><a href="#cupsLocalizeDestOption" title="Get the localized string for a destination
option.">cupsLocalizeDestOption</a></li>
<li><a href="#cupsLocalizeDestValue" title="Get the localized string for a destination
@@ -478,12 +501,21 @@ connections.">cupsSetCredentials</a></li>
<li><a href="#cupsSetServer" title="Set the default server name and port.">cupsSetServer</a></li>
<li><a href="#cupsSetServerCertCB" title="Set the server certificate callback.">cupsSetServerCertCB</a></li>
<li><a href="#cupsSetUser" title="Set the default user name.">cupsSetUser</a></li>
+ <li><a href="#cupsSetUserAgent" title="Set the default HTTP User-Agent string.">cupsSetUserAgent</a></li>
<li><a href="#cupsStartDestDocument" title="Start a new document.">cupsStartDestDocument</a></li>
<li><a href="#cupsStartDocument" title="Add a document to a job created with cupsCreateJob().">cupsStartDocument</a></li>
<li><a href="#cupsTempFd" title="Creates a temporary file.">cupsTempFd</a></li>
<li><a href="#cupsTempFile" title="Generates a temporary filename.">cupsTempFile</a></li>
<li><a href="#cupsTempFile2" title="Creates a temporary CUPS file.">cupsTempFile2</a></li>
<li><a href="#cupsUser" title="Return the current user's name.">cupsUser</a></li>
+ <li><a href="#cupsUserAgent" title="Return the default HTTP User-Agent string.">cupsUserAgent</a></li>
+ <li><a href="#pwgFormatSizeName" title="Generate a PWG self-describing media size name.">pwgFormatSizeName</a></li>
+ <li><a href="#pwgInitSize" title="Initialize a pwg_size_t structure using IPP Job Template
+attributes.">pwgInitSize</a></li>
+ <li><a href="#pwgMediaForLegacy" title="Find a PWG media size by ISO/IPP legacy name.">pwgMediaForLegacy</a></li>
+ <li><a href="#pwgMediaForPPD" title="Find a PWG media size by Adobe PPD name.">pwgMediaForPPD</a></li>
+ <li><a href="#pwgMediaForPWG" title="Find a PWG media size by 5101.1 self-describing name.">pwgMediaForPWG</a></li>
+ <li><a href="#pwgMediaForSize" title="Get the PWG media size for the given dimensions.">pwgMediaForSize</a></li>
</ul></li>
<li><a href="#TYPES">Data Types</a><ul class="code">
<li><a href="#cups_client_cert_cb_t" title="Client credentials callback
@@ -506,6 +538,9 @@ information ">cups_dinfo_t</a></li>
<li><a href="#cups_server_cert_cb_t" title="Server credentials callback
">cups_server_cert_cb_t</a></li>
<li><a href="#cups_size_t" title="Media Size ">cups_size_t</a></li>
+ <li><a href="#pwg_map_t" title="Map element - PPD to/from PWG">pwg_map_t</a></li>
+ <li><a href="#pwg_media_t" title="Common media size data">pwg_media_t</a></li>
+ <li><a href="#pwg_size_t" title="Size element - PPD to/from PWG">pwg_size_t</a></li>
</ul></li>
<li><a href="#STRUCTURES">Structures</a><ul class="code">
<li><a href="#cups_dest_s" title="Destination">cups_dest_s</a></li>
@@ -513,6 +548,9 @@ information ">cups_dinfo_t</a></li>
<li><a href="#cups_option_s" title="Printer Options">cups_option_s</a></li>
<li><a href="#cups_size_s" title="Media Size ">cups_size_s</a></li>
<li><a href="#pollfd" title="User data (unused)">pollfd</a></li>
+ <li><a href="#pwg_map_s" title="Map element - PPD to/from PWG">pwg_map_s</a></li>
+ <li><a href="#pwg_media_s" title="Common media size data">pwg_media_s</a></li>
+ <li><a href="#pwg_size_s" title="Size element - PPD to/from PWG">pwg_size_s</a></li>
</ul></li>
<li><a href="#VARIABLES">Variables</a><ul class="code">
<li><a href="#CF_RETURNS_RETAINED" title="Get the Apple language identifier associated with a
@@ -1139,7 +1177,7 @@ ipp_status_t cupsCancelDestJob (<br>
<p class="description">Cancel a job on a destination.</p>
<p class="discussion">The &quot;job_id&quot; is the number returned by cupsCreateDestJob.<br>
<br>
-Returns IPP_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
+Returns IPP_STATUS_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
failure.
</p>
@@ -1252,7 +1290,7 @@ ipp_status_t cupsCloseDestJob (<br>
<p class="description">IPP status code</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">Use when the last call to cupsStartDocument passed 0 for &quot;last_document&quot;.
-&quot;job_id&quot; is the job ID returned by cupsCreateDestJob. Returns <code>IPP_OK</code>
+&quot;job_id&quot; is the job ID returned by cupsCreateDestJob. Returns <code>IPP_STATUS_OK</code>
on success.
</p>
@@ -1473,7 +1511,7 @@ ipp_status_t cupsCreateDestJob (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">IPP status code</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">Returns <code>IPP_OK</code> or <code>IPP_OK_SUBST</code> on success, saving the job ID
+<p class="discussion">Returns <code>IPP_STATUS_OK</code> or <code>IPP_STATUS_OK_SUBST</code> on success, saving the job ID
in the variable pointed to by &quot;job_id&quot;.
</p>
@@ -1520,7 +1558,7 @@ http_encryption_t cupsEncryption (void);</p>
<p class="discussion">The default encryption setting comes from the CUPS_ENCRYPTION
environment variable, then the ~/.cups/client.conf file, and finally the
/etc/cups/client.conf file. If not set, the default is
-<code>HTTP_ENCRYPT_IF_REQUESTED</code>.<br>
+<code>HTTP_ENCRYPTION_IF_REQUESTED</code>.<br>
<br>
Note: The current encryption setting is tracked separately for each thread
in a program. Multi-threaded programs that override the setting via the
@@ -1606,6 +1644,96 @@ Enumeration happens on the current thread and does not return until all
destinations have been enumerated or the block returns 0.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsFindDestDefault">cupsFindDestDefault</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+ipp_attribute_t *cupsFindDestDefault (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>option</dt>
+<dd class="description">Option/attribute name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsFindDestReady">cupsFindDestReady</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+ipp_attribute_t *cupsFindDestReady (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>option</dt>
+<dd class="description">Option/attribute name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsFindDestSupported">cupsFindDestSupported</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+ipp_attribute_t *cupsFindDestSupported (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>option</dt>
+<dd class="description">Option/attribute name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsFinishDestDocument">cupsFinishDestDocument</a></h3>
<p class="description">Finish the current document.</p>
<p class="code">
@@ -1626,7 +1754,7 @@ ipp_status_t cupsFinishDestDocument (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Status of document submission</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">Returns <code>IPP_OK</code> or <code>IPP_OK_SUBST</code> on success.
+<p class="discussion">Returns <code>IPP_STATUS_OK</code> or <code>IPP_STATUS_OK_SUBST</code> on success.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsFinishDocument">cupsFinishDocument</a></h3>
@@ -1717,7 +1845,8 @@ int cupsGetClasses (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Number of classes</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is deprecated - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
+<p class="discussion">This function is deprecated and no longer returns a list of printer
+classes - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
</p>
<h3 class="function"><a name="cupsGetDefault">cupsGetDefault</a></h3>
@@ -1780,6 +1909,41 @@ not support the lpoptions-defined default printer.
<h4 class="discussion">Discussion</h4>
<p class="discussion">Use the <a href="#cupsGetDests"><code>cupsGetDests</code></a> or <a href="#cupsGetDests2"><code>cupsGetDests2</code></a> functions to get a
list of supported destinations for the current user.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsGetDestMediaByIndex">cupsGetDestMediaByIndex</a></h3>
+<p class="description">Get a media name, dimension, and margins for a
+specific size.</p>
+<p class="code">
+int cupsGetDestMediaByIndex (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int n,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_size_t">cups_size_t</a> *size<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>n</dt>
+<dd class="description">Media size number (0-based)</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+<dt>size</dt>
+<dd class="description">Media size information</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines which set of media are indexed. For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will get the Nth
+borderless size supported by the printer.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsGetDestMediaByName">cupsGetDestMediaByName</a></h3>
<p class="description">Get media names, dimensions, and margins.</p>
<p class="code">
@@ -1873,6 +2037,89 @@ The matching result (if any) is returned in the &quot;cups_size_t&quot; structur
Returns 1 when there is a match and 0 if there is not a match.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsGetDestMediaCount">cupsGetDestMediaCount</a></h3>
+<p class="description">Get the number of sizes supported by a
+destination.</p>
+<p class="code">
+int cupsGetDestMediaCount (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of sizes</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines the set of media sizes that are
+counted. For example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return
+the number of borderless sizes.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsGetDestMediaDefault">cupsGetDestMediaDefault</a></h3>
+<p class="description">Get the default size for a destination.</p>
+<p class="code">
+int cupsGetDestMediaDefault (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_size_t">cups_size_t</a> *size<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+<dt>size</dt>
+<dd class="description">Media size information</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines which default size is returned. For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return the default
+borderless size, typically US Letter or A4, but sometimes 4x6 photo media.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS X 10.10&nbsp;</span><a name="cupsGetDestWithURI">cupsGetDestWithURI</a></h3>
+<p class="description">Get a destination associated with a URI.</p>
+<p class="code">
+<a href="#cups_dest_t">cups_dest_t</a> *cupsGetDestWithURI (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *uri<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>name</dt>
+<dd class="description">Desired printer name or <code>NULL</code></dd>
+<dt>uri</dt>
+<dd class="description">URI for the printer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Destination or <code>NULL</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">&quot;name&quot; is the desired name for the printer. If <code>NULL</code>, a name will be
+created using the URI.<br>
+<br>
+&quot;uri&quot; is the &quot;ipp&quot; or &quot;ipps&quot; URI for the printer.
+
+</p>
<h3 class="function"><a name="cupsGetDests">cupsGetDests</a></h3>
<p class="description">Get the list of destinations from the default server.</p>
<p class="code">
@@ -2121,8 +2368,8 @@ the empty string, a new temporary file is created, otherwise the existing
file will be overwritten as needed. The caller &quot;owns&quot; the file that is
created and must <code>unlink</code> the returned filename.<br>
<br>
-On success, <code>HTTP_OK</code> is returned for a new PPD file and
-<code>HTTP_NOT_MODIFIED</code> if the existing PPD file is up-to-date. Any other
+On success, <code>HTTP_STATUS_OK</code> is returned for a new PPD file and
+<code>HTTP_STATUS_NOT_MODIFIED</code> if the existing PPD file is up-to-date. Any other
status is an error.<br>
<br>
For classes, <code>cupsGetPPD3</code> returns the PPD file for the first printer
@@ -2197,7 +2444,8 @@ int cupsGetPrinters (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Number of printers</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is deprecated - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
+<p class="discussion">This function is deprecated and no longer returns a list of printers - use
+<a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span><a name="cupsGetServerPPD">cupsGetServerPPD</a></h3>
@@ -2277,6 +2525,37 @@ cups_lang_t *cupsLangGet (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Language data</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS X 10.10&nbsp;</span><a name="cupsLocalizeDestMedia">cupsLocalizeDestMedia</a></h3>
+<p class="description">Get the localized string for a destination media
+size.</p>
+<p class="code">
+const char *cupsLocalizeDestMedia (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_size_t">cups_size_t</a> *size<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+<dt>size</dt>
+<dd class="description">Media size</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Localized string</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned string is stored in the destination information and will become
+invalid if the destination information is deleted.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsLocalizeDestOption">cupsLocalizeDestOption</a></h3>
<p class="description">Get the localized string for a destination
option.</p>
@@ -2701,7 +2980,7 @@ void cupsSetEncryption (<br>
<p class="discussion">The default encryption setting comes from the CUPS_ENCRYPTION
environment variable, then the ~/.cups/client.conf file, and finally the
/etc/cups/client.conf file. If not set, the default is
-<code>HTTP_ENCRYPT_IF_REQUESTED</code>.<br>
+<code>HTTP_ENCRYPTION_IF_REQUESTED</code>.<br>
<br>
Note: The current encryption setting is tracked separately for each thread
in a program. Multi-threaded programs that override the setting need to do
@@ -2811,6 +3090,22 @@ void cupsSetUser (<br>
Note: The current user name is tracked separately for each thread in a
program. Multi-threaded programs that override the user name need to do so
in each thread for the same user name to be used.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsSetUserAgent">cupsSetUserAgent</a></h3>
+<p class="description">Set the default HTTP User-Agent string.</p>
+<p class="code">
+void cupsSetUserAgent (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *user_agent<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>user_agent</dt>
+<dd class="description">User-Agent string or <code>NULL</code></dd>
+</dl>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Setting the string to NULL forces the default value containing the CUPS
+version, IPP version, and operating system version and architecture.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsStartDestDocument">cupsStartDestDocument</a></h3>
<p class="description">Start a new document.</p>
<p class="code">
@@ -2932,8 +3227,8 @@ char *cupsTempFile (<br>
<p class="description">Filename or <code>NULL</code> on error</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">The temporary filename is returned in the filename buffer.
-This function is deprecated - use <a href="#cupsTempFd"><code>cupsTempFd</code></a> or
-<a href="#cupsTempFile2"><code>cupsTempFile2</code></a> instead.
+This function is deprecated and will no longer generate a temporary
+filename - use <a href="#cupsTempFd"><code>cupsTempFd</code></a> or <a href="#cupsTempFile2"><code>cupsTempFile2</code></a> instead.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="cupsTempFile2">cupsTempFile2</a></h3>
@@ -2968,6 +3263,179 @@ const char *cupsUser (void);</p>
program. Multi-threaded programs that override the user name with the
<a href="#cupsSetUser"><code>cupsSetUser</code></a> function need to do so in each thread for the same user
name to be used.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsUserAgent">cupsUserAgent</a></h3>
+<p class="description">Return the default HTTP User-Agent string.</p>
+<p class="code">
+const char *cupsUserAgent (void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">User-Agent string</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgFormatSizeName">pwgFormatSizeName</a></h3>
+<p class="description">Generate a PWG self-describing media size name.</p>
+<p class="code">
+int pwgFormatSizeName (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *keyword,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t keysize,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *prefix,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int length,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *units<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>keyword</dt>
+<dd class="description">Keyword buffer</dd>
+<dt>keysize</dt>
+<dd class="description">Size of keyword buffer</dd>
+<dt>prefix</dt>
+<dd class="description">Prefix for PWG size or <code>NULL</code> for automatic</dd>
+<dt>name</dt>
+<dd class="description">Size name or <code>NULL</code></dd>
+<dt>width</dt>
+<dd class="description">Width of page in 2540ths</dd>
+<dt>length</dt>
+<dd class="description">Length of page in 2540ths</dd>
+<dt>units</dt>
+<dd class="description">Units - &quot;in&quot;, &quot;mm&quot;, or <code>NULL</code> for automatic</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function generates a PWG self-describing media size name of the form
+&quot;prefix_name_WIDTHxLENGTHunits&quot;. The prefix is typically &quot;custom&quot; or &quot;roll&quot;
+for user-supplied sizes but can also be &quot;disc&quot;, &quot;iso&quot;, &quot;jis&quot;, &quot;jpn&quot;, &quot;na&quot;,
+&quot;oe&quot;, &quot;om&quot;, &quot;prc&quot;, or &quot;roc&quot;. A value of <code>NULL</code> automatically chooses
+&quot;oe&quot; or &quot;om&quot; depending on the units.<br>
+<br>
+The size name may only contain lowercase letters, numbers, &quot;-&quot;, and &quot;.&quot;. If
+<code>NULL</code> is passed, the size name will contain the formatted dimensions.<br>
+<br>
+The width and length are specified in hundredths of millimeters, equivalent
+to 1/100000th of a meter or 1/2540th of an inch. The width, length, and
+units used for the generated size name are calculated automatically if the
+units string is <code>NULL</code>, otherwise inches (&quot;in&quot;) or millimeters (&quot;mm&quot;)
+are used.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgInitSize">pwgInitSize</a></h3>
+<p class="description">Initialize a pwg_size_t structure using IPP Job Template
+attributes.</p>
+<p class="code">
+int pwgInitSize (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#pwg_size_t">pwg_size_t</a> *size,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_t *job,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int *margins_set<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>size</dt>
+<dd class="description">Size to initialize</dd>
+<dt>job</dt>
+<dd class="description">Job template attributes</dd>
+<dt>margins_set</dt>
+<dd class="description">1 if margins were set, 0 otherwise</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if size was initialized, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function initializes a pwg_size_t structure from an IPP &quot;media&quot; or
+&quot;media-col&quot; attribute in the specified IPP message. 0 is returned if neither
+attribute is found in the message or the values are not valid.<br>
+<br>
+The &quot;margins_set&quot; variable is initialized to 1 if any &quot;media-xxx-margin&quot;
+member attribute was specified in the &quot;media-col&quot; Job Template attribute,
+otherwise it is initialized to 0.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForLegacy">pwgMediaForLegacy</a></h3>
+<p class="description">Find a PWG media size by ISO/IPP legacy name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForLegacy (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *legacy<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>legacy</dt>
+<dd class="description">Legacy size name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;name&quot; argument specifies the legacy ISO media size name, for example
+&quot;iso-a4&quot; or &quot;na-letter&quot;.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForPPD">pwgMediaForPPD</a></h3>
+<p class="description">Find a PWG media size by Adobe PPD name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForPPD (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *ppd<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ppd</dt>
+<dd class="description">PPD size name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;ppd&quot; argument specifies an Adobe page size name as defined in Table B.1
+of the Adobe PostScript Printer Description File Format Specification Version
+4.3.<br>
+<br>
+If the name is non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread. Custom names can be of the form &quot;Custom.WIDTHxLENGTH[units]&quot; or
+&quot;WIDTHxLENGTH[units]&quot;.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForPWG">pwgMediaForPWG</a></h3>
+<p class="description">Find a PWG media size by 5101.1 self-describing name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForPWG (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *pwg<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>pwg</dt>
+<dd class="description">PWG size name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;pwg&quot; argument specifies a self-describing media size name of the form
+&quot;prefix_name_WIDTHxLENGTHunits&quot; as defined in PWG 5101.1.<br>
+<br>
+If the name is non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForSize">pwgMediaForSize</a></h3>
+<p class="description">Get the PWG media size for the given dimensions.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForSize (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int length<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>width</dt>
+<dd class="description">Width in hundredths of millimeters</dd>
+<dt>length</dt>
+<dd class="description">Length in hundredths of millimeters</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">PWG media name</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;width&quot; and &quot;length&quot; are in hundredths of millimeters, equivalent to
+1/100000th of a meter or 1/2540th of an inch.<br>
+<br>
+If the dimensions are non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.
+
+</p>
<h2 class="title"><a name="TYPES">Data Types</a></h2>
<h3 class="typedef"><span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span><a name="cups_client_cert_cb_t">cups_client_cert_cb_t</a></h3>
<p class="description">Client credentials callback
@@ -3041,6 +3509,21 @@ typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls, cups_array_t *cert
<p class="code">
typedef struct <a href="#cups_size_s">cups_size_s</a> cups_size_t;
</p>
+<h3 class="typedef"><a name="pwg_map_t">pwg_map_t</a></h3>
+<p class="description">Map element - PPD to/from PWG</p>
+<p class="code">
+typedef struct <a href="#pwg_map_s">pwg_map_s</a> pwg_map_t;
+</p>
+<h3 class="typedef"><a name="pwg_media_t">pwg_media_t</a></h3>
+<p class="description">Common media size data</p>
+<p class="code">
+typedef struct <a href="#pwg_media_s">pwg_media_s</a> pwg_media_t;
+</p>
+<h3 class="typedef"><a name="pwg_size_t">pwg_size_t</a></h3>
+<p class="description">Size element - PPD to/from PWG</p>
+<p class="code">
+typedef struct <a href="#pwg_size_s">pwg_size_s</a> pwg_size_t;
+</p>
<h2 class="title"><a name="STRUCTURES">Structures</a></h2>
<h3 class="struct"><a name="cups_dest_s">cups_dest_s</a></h3>
<p class="description">Destination</p>
@@ -3145,6 +3628,42 @@ millimeters</dd>
<dt>val </dt>
<dd class="description">Return value</dd>
</dl>
+<h3 class="struct"><a name="pwg_map_s">pwg_map_s</a></h3>
+<p class="description">Map element - PPD to/from PWG</p>
+<p class="code">struct pwg_map_s {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *pwg, *ppd;<br>
+};</p>
+<h4 class="members">Members</h4>
+<dl>
+<dt>ppd </dt>
+<dd class="description">PPD option keyword</dd>
+</dl>
+<h3 class="struct"><a name="pwg_media_s">pwg_media_s</a></h3>
+<p class="description">Common media size data</p>
+<p class="code">struct pwg_media_s {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width, length;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *pwg, *legacy, *ppd;<br>
+};</p>
+<h4 class="members">Members</h4>
+<dl>
+<dt>length </dt>
+<dd class="description">Length in 2540ths</dd>
+<dt>ppd </dt>
+<dd class="description">Standard Adobe PPD name</dd>
+</dl>
+<h3 class="struct"><a name="pwg_size_s">pwg_size_s</a></h3>
+<p class="description">Size element - PPD to/from PWG</p>
+<p class="code">struct pwg_size_s {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#pwg_map_t">pwg_map_t</a> map;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width, length, left, bottom, right, top;<br>
+};</p>
+<h4 class="members">Members</h4>
+<dl>
+<dt>map </dt>
+<dd class="description">Map element</dd>
+<dt>top </dt>
+<dd class="description">Top margin in 2540ths</dd>
+</dl>
<h2 class="title"><a name="VARIABLES">Variables</a></h2>
<h3 class="variable"><a name="CF_RETURNS_RETAINED">CF_RETURNS_RETAINED</a></h3>
<p class="description">Get the Apple language identifier associated with a
@@ -3156,6 +3675,8 @@ locale ID.</p>
constants</p>
<h4 class="constants">Constants</h4>
<dl>
+<dt>CUPS_PRINTER_3D <span class="info">&nbsp;CUPS 2.1&nbsp;</span></dt>
+<dd class="description">3D Printing </dd>
<dt>CUPS_PRINTER_AUTHENTICATED <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
<dd class="description">Printer requires authentication
</dd>
diff --git a/doc/help/api-filedir.html b/doc/help/api-filedir.html
index fc7b72a..309d09d 100644
--- a/doc/help/api-filedir.html
+++ b/doc/help/api-filedir.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/api-filter.html b/doc/help/api-filter.html
index 5428058..1ab935b 100644
--- a/doc/help/api-filter.html
+++ b/doc/help/api-filter.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
@@ -345,7 +357,7 @@ div.contents ul.subcontents li {
Filter and backend programming header for CUPS.
- Copyright 2008-2011 by Apple Inc.
+ Copyright 2008-2014 by Apple Inc.
These coded instructions, statements, and computer programs are the
property of Apple Inc. and are protected by Federal copyright
@@ -396,6 +408,7 @@ div.contents ul.subcontents li {
<li><a href="#COMMUNICATING_FILTER">Communicating with Filters</a></li>
<li><a href="#SNMP">Doing SNMP Queries with Network Printers</a></li>
</ul></li>
+<li><a href="#SANDBOXING">Sandboxing on OS X</a></li>
<li><a href="#FUNCTIONS">Functions</a><ul class="code">
<li><a href="#cupsBackChannelRead" title="Read data from the backchannel.">cupsBackChannelRead</a></li>
<li><a href="#cupsBackChannelWrite" title="Write data to the backchannel.">cupsBackChannelWrite</a></li>
@@ -430,7 +443,7 @@ div.contents ul.subcontents li {
Filter and backend programming introduction for CUPS.
- Copyright 2007-2013 by Apple Inc.
+ Copyright 2007-2014 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
@@ -508,7 +521,7 @@ directory to write to.</p>
<p>In addition, some operating systems provide additional security mechanisms
that further limit file system access, even for backends running as root. On
-OS X, for example, no backend may write to a user's home directory.</p>
+OS X, for example, no backend may write to a user's home directory. See the <a href="#SANDBOXING">Sandboxing on OS X</a> section for more information.</p>
</blockquote>
<h3><a name="SIGNALS">Canceled Jobs and Signal Handling</a></h3>
@@ -664,7 +677,7 @@ prefix strings:</p>
<code>marker-types</code>, <code>printer-alert</code>, and
<code>printer-alert-description</code> printer attributes. Standard
<code>marker-types</code> values are listed in <a href='#TABLE1'>Table
- 1</a>.</dd>
+ 1</a>. String values need special handling - see <a href="#ATTR_STRINGS">Reporting Attribute String Values</a> below.</dd>
<dt>CRIT: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
@@ -747,11 +760,11 @@ the "DEBUG:" prefix string.</p>
<td>Fuser unit</td>
</tr>
<tr>
- <td>fuserCleaningPad</td>
+ <td>fuser-cleaning-pad</td>
<td>Fuser cleaning pad</td>
</tr>
<tr>
- <td>fuserOil</td>
+ <td>fuser-oil</td>
<td>Fuser oil</td>
</tr>
<tr>
@@ -763,7 +776,7 @@ the "DEBUG:" prefix string.</p>
<td>Photo conductor</td>
</tr>
<tr>
- <td>solidWax</td>
+ <td>solid-wax</td>
<td>Wax supply</td>
</tr>
<tr>
@@ -775,19 +788,19 @@ the "DEBUG:" prefix string.</p>
<td>Toner supply</td>
</tr>
<tr>
- <td>transferUnit</td>
+ <td>transfer-unit</td>
<td>Transfer unit</td>
</tr>
<tr>
- <td>wasteInk</td>
+ <td>waste-ink</td>
<td>Waste ink tank</td>
</tr>
<tr>
- <td>wasteToner</td>
+ <td>waste-toner</td>
<td>Waste toner tank</td>
</tr>
<tr>
- <td>wasteWax</td>
+ <td>waste-wax</td>
<td>Waste wax tank</td>
</tr>
</tbody>
@@ -867,6 +880,95 @@ the "DEBUG:" prefix string.</p>
</tbody>
</table></div>
+
+<h4><a name="ATTR_STRINGS">Reporting Attribute String Values</a></h4>
+
+<p>When reporting string values using "ATTR:" messages, a filter or backend must take special care to appropriately quote those values. The scheduler uses the CUPS option parsing code for attributes, so the general syntax is:</p>
+
+<pre class="example">
+name=simple
+name=simple,simple,...
+name='complex value'
+name="complex value"
+name='"complex value"','"complex value"',...
+</pre>
+
+<p>Simple values are strings that do not contain spaces, quotes, backslashes, or the comma and can be placed verbatim in the "ATTR:" message, for example:</p>
+
+<pre class="example">
+int levels[4] = { 40, 50, 60, 70 }; /* CMYK */
+
+fputs("ATTR: marker-colors=#00FFFF,#FF00FF,#FFFF00,#000000\n", stderr);
+fputs("ATTR: marker-high-levels=100,100,100,100\n", stderr);
+fprintf(stderr, "ATTR: marker-levels=%d,%d,%d,%d\n", levels[0], levels[1],
+ levels[2], levels[3], levels[4]);
+fputs("ATTR: marker-low-levels=5,5,5,5\n", stderr);
+fputs("ATTR: marker-types=toner,toner,toner,toner\n", stderr);
+</pre>
+
+<p>Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:</p>
+
+<pre class="example">
+fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr);
+</pre>
+
+<p>When multiple values are reported, each value must be enclosed by a set of single and double quotes:</p>
+
+<pre class="example">
+fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"',"
+ "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr);
+</pre>
+
+<p>The IPP backend includes a <var>quote_string</var> function that may be used to properly quote a complex value in an "ATTR:" message:</p>
+
+<pre class="example">
+static const char * /* O - Quoted string */
+quote_string(const char *s, /* I - String */
+ char *q, /* I - Quoted string buffer */
+ size_t qsize) /* I - Size of quoted string buffer */
+{
+ char *qptr, /* Pointer into string buffer */
+ *qend; /* End of string buffer */
+
+
+ qptr = q;
+ qend = q + qsize - 5;
+
+ if (qend &lt; q)
+ {
+ *q = '\0';
+ return (q);
+ }
+
+ *qptr++ = '\'';
+ *qptr++ = '\"';
+
+ while (*s && qptr &lt; qend)
+ {
+ if (*s == '\\' || *s == '\"' || *s == '\'')
+ {
+ if (qptr &lt; (qend - 4))
+ {
+ *qptr++ = '\\';
+ *qptr++ = '\\';
+ *qptr++ = '\\';
+ }
+ else
+ break;
+ }
+
+ *qptr++ = *s++;
+ }
+
+ *qptr++ = '\"';
+ *qptr++ = '\'';
+ *qptr = '\0';
+
+ return (q);
+}
+</pre>
+
+
<h4><a name="MANAGING_STATE">Managing Printer State in a Filter</a></h4>
<p>Filters are responsible for managing the state keywords they set using
@@ -1190,6 +1292,28 @@ void *my_data;
<a href="#cupsSideChannelSNMPWalk">cupsSNMPSideChannelWalk</a>(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);
</pre>
+
+<h2><a name="SANDBOXING">Sandboxing on OS X</a></h2>
+
+<p>Starting with OS X 10.6, filters and backends are run inside a security "sandbox" which further limits (beyond the normal UNIX user/group permissions) what a filter or backend can do. This helps to both secure the printing system from malicious software and enforce the functional separation of components in the CUPS filter chain. What follows is a list of actions that are explicitly allowed for all filters and backends:</p>
+
+<ol>
+
+ <li>Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the <var>/private/var/spool/cups</var> directory and other files on mounted filesystems <em>except</em> for user home directories under <var>/Users</var>.</li>
+
+ <li>Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the <code>CUPS_CACHEDIR</code> environment variable, to the state directory specified by the <code>CUPS_STATEDIR</code> environment variable, to the temporary directory specified by the <code>TMPDIR</code> environment variable, and under the <var>/private/var/db</var>, <var>/private/var/folders</var>, <var>/private/var/lib</var>, <var>/private/var/mysql</var>, <var>/private/var/run</var>, <var>/private/var/spool</var> (except <var>/private/var/spool/cups</var>), <var>/Library/Application&nbsp;Support</var>, <var>/Library/Caches</var>, <var>/Library/Logs</var>, <var>/Library/Preferences</var>, <var>/Library/WebServer</var>, and <var>/Users/Shared</var> directories.</li>
+
+ <li>Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the <var>/Users</var> directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.</li>
+
+ <li>Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. <em>Filters cannot access Bluetooth and USB printers directly.</em></li>
+
+ <li>Network: filters and backends can access UNIX domain sockets under the <var>/private/tmp</var>, <var>/private/var/run</var>, and <var>/private/var/tmp</var> directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. <em>Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.</em></li>
+
+ <li>Notifications: filters and backends can send notifications via the Darwin <code>notify_post()</code> API.</li>
+
+</ol>
+
+<blockquote><b>Note:</b> The sandbox profile used in CUPS 2.0 still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.</blockquote>
<h2 class="title"><a name="FUNCTIONS">Functions</a></h2>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="cupsBackChannelRead">cupsBackChannelRead</a></h3>
<p class="description">Read data from the backchannel.</p>
diff --git a/doc/help/api-httpipp.html b/doc/help/api-httpipp.html
index 0e0591a..7fc0c06 100644
--- a/doc/help/api-httpipp.html
+++ b/doc/help/api-httpipp.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
@@ -404,26 +416,35 @@ current thread.">cupsLastErrorString</a></li>
<li><a href="#cupsReadResponseData" title="Read additional data after the IPP response.">cupsReadResponseData</a></li>
<li><a href="#cupsSendRequest" title="Send an IPP request.">cupsSendRequest</a></li>
<li><a href="#cupsWriteRequestData" title="Write additional data after an IPP request.">cupsWriteRequestData</a></li>
+ <li><a href="#httpAcceptConnection" title="Accept a new HTTP client connection from the
+specified listening socket.">httpAcceptConnection</a></li>
<li><a href="#httpAddCredential" title="Allocates and adds a single credential to an array.">httpAddCredential</a></li>
<li><a href="#httpAddrAny" title="Check for the &quot;any&quot; address.">httpAddrAny</a></li>
+ <li><a href="#httpAddrClose" title="Close a socket created by httpAddrConnect or
+httpAddrListen.">httpAddrClose</a></li>
<li><a href="#httpAddrEqual" title="Compare two addresses.">httpAddrEqual</a></li>
+ <li><a href="#httpAddrFamily" title="Get the address family of an address.">httpAddrFamily</a></li>
<li><a href="#httpAddrLength" title="Return the length of the address in bytes.">httpAddrLength</a></li>
+ <li><a href="#httpAddrListen" title="Create a listening socket bound to the specified
+address and port.">httpAddrListen</a></li>
<li><a href="#httpAddrLocalhost" title="Check for the local loopback address.">httpAddrLocalhost</a></li>
<li><a href="#httpAddrLookup" title="Lookup the hostname associated with the address.">httpAddrLookup</a></li>
+ <li><a href="#httpAddrPort" title="Get the port number associated with an address.">httpAddrPort</a></li>
<li><a href="#httpAddrString" title="Convert an address to a numeric string.">httpAddrString</a></li>
<li><a href="#httpAssembleURI" title="Assemble a uniform resource identifier from its
components.">httpAssembleURI</a></li>
<li><a href="#httpAssembleURIf" title="Assemble a uniform resource identifier from its
components with a formatted resource.">httpAssembleURIf</a></li>
+ <li><a href="#httpAssembleUUID" title="Assemble a name-based UUID URN conforming to RFC 4122.">httpAssembleUUID</a></li>
<li><a href="#httpBlocking" title="Set blocking/non-blocking behavior on a connection.">httpBlocking</a></li>
<li><a href="#httpCheck" title="Check to see if there is a pending response from the server.">httpCheck</a></li>
<li><a href="#httpClearCookie" title="Clear the cookie value(s).">httpClearCookie</a></li>
<li><a href="#httpClearFields" title="Clear HTTP request fields.">httpClearFields</a></li>
<li><a href="#httpClose" title="Close an HTTP connection.">httpClose</a></li>
+ <li><a href="#httpCompareCredentials" title="Compare two sets of X.509 credentials.">httpCompareCredentials</a></li>
<li><a href="#httpConnect" title="Connect to a HTTP server.">httpConnect</a></li>
+ <li><a href="#httpConnect2" title="Connect to a HTTP server.">httpConnect2</a></li>
<li><a href="#httpConnectEncrypt" title="Connect to a HTTP server using encryption.">httpConnectEncrypt</a></li>
- <li><a href="#httpCopyCredentials" title="Copy the credentials associated with an encrypted
-connection.">httpCopyCredentials</a></li>
<li><a href="#httpDecode64" title="Base64-decode a string.">httpDecode64</a></li>
<li><a href="#httpDecode64_2" title="Base64-decode a string.">httpDecode64_2</a></li>
<li><a href="#httpDelete" title="Send a DELETE request to the server.">httpDelete</a></li>
@@ -431,25 +452,38 @@ connection.">httpCopyCredentials</a></li>
<li><a href="#httpEncode64_2" title="Base64-encode a string.">httpEncode64_2</a></li>
<li><a href="#httpEncryption" title="Set the required encryption on the link.">httpEncryption</a></li>
<li><a href="#httpError" title="Get the last error on a connection.">httpError</a></li>
+ <li><a href="#httpFieldValue" title="Return the HTTP field enumeration value for a field
+name.">httpFieldValue</a></li>
<li><a href="#httpFlush" title="Flush data from a HTTP connection.">httpFlush</a></li>
<li><a href="#httpFlushWrite" title="Flush data in write buffer.">httpFlushWrite</a></li>
<li><a href="#httpFreeCredentials" title="Free an array of credentials.">httpFreeCredentials</a></li>
<li><a href="#httpGet" title="Send a GET request to the server.">httpGet</a></li>
+ <li><a href="#httpGetActivity" title="Get the most recent activity for a connection.">httpGetActivity</a></li>
+ <li><a href="#httpGetAddress" title="Get the address of the connected peer of a connection.">httpGetAddress</a></li>
<li><a href="#httpGetAuthString" title="Get the current authorization string.">httpGetAuthString</a></li>
<li><a href="#httpGetBlocking" title="Get the blocking/non-block state of a connection.">httpGetBlocking</a></li>
+ <li><a href="#httpGetContentEncoding" title="Get a common content encoding, if any, between
+the client and server.">httpGetContentEncoding</a></li>
<li><a href="#httpGetCookie" title="Get any cookie data from the response.">httpGetCookie</a></li>
<li><a href="#httpGetDateString" title="Get a formatted date/time string from a time value.">httpGetDateString</a></li>
<li><a href="#httpGetDateString2" title="Get a formatted date/time string from a time value.">httpGetDateString2</a></li>
<li><a href="#httpGetDateTime" title="Get a time value from a formatted date/time string.">httpGetDateTime</a></li>
+ <li><a href="#httpGetEncryption" title="Get the current encryption mode of a connection.">httpGetEncryption</a></li>
+ <li><a href="#httpGetExpect" title="Get the value of the Expect header, if any.">httpGetExpect</a></li>
<li><a href="#httpGetFd" title="Get the file descriptor associated with a connection.">httpGetFd</a></li>
<li><a href="#httpGetField" title="Get a field value from a request/response.">httpGetField</a></li>
<li><a href="#httpGetHostByName" title="Lookup a hostname or IPv4 address, and return
address records for the specified name.">httpGetHostByName</a></li>
<li><a href="#httpGetHostname" title="Get the FQDN for the connection or local system.">httpGetHostname</a></li>
+ <li><a href="#httpGetKeepAlive" title="Get the current Keep-Alive state of the connection.">httpGetKeepAlive</a></li>
<li><a href="#httpGetLength" title="Get the amount of data remaining from the
content-length or transfer-encoding fields.">httpGetLength</a></li>
<li><a href="#httpGetLength2" title="Get the amount of data remaining from the
content-length or transfer-encoding fields.">httpGetLength2</a></li>
+ <li><a href="#httpGetPending" title="Get the number of bytes that are buffered for writing.">httpGetPending</a></li>
+ <li><a href="#httpGetReady" title="Get the number of bytes that can be read without blocking.">httpGetReady</a></li>
+ <li><a href="#httpGetRemaining" title="Get the number of remaining bytes in the message
+body or current chunk.">httpGetRemaining</a></li>
<li><a href="#httpGetState" title="Get the current state of the HTTP request.">httpGetState</a></li>
<li><a href="#httpGetStatus" title="Get the status of the last HTTP request.">httpGetStatus</a></li>
<li><a href="#httpGetSubField" title="Get a sub-field value.">httpGetSubField</a></li>
@@ -459,19 +493,25 @@ content-length or transfer-encoding fields.">httpGetLength2</a></li>
<li><a href="#httpHead" title="Send a HEAD request to the server.">httpHead</a></li>
<li><a href="#httpInitialize" title="Initialize the HTTP interface library and set the
default HTTP proxy (if any).">httpInitialize</a></li>
+ <li><a href="#httpIsChunked" title="Report whether a message body is chunked.">httpIsChunked</a></li>
+ <li><a href="#httpIsEncrypted" title="Report whether a connection is encrypted.">httpIsEncrypted</a></li>
<li><a href="#httpMD5" title="Compute the MD5 sum of the username:group:password.">httpMD5</a></li>
<li><a href="#httpMD5Final" title="Combine the MD5 sum of the username, group, and password
with the server-supplied nonce value, method, and
request-uri.">httpMD5Final</a></li>
<li><a href="#httpMD5String" title="Convert an MD5 sum to a character string.">httpMD5String</a></li>
<li><a href="#httpOptions" title="Send an OPTIONS request to the server.">httpOptions</a></li>
+ <li><a href="#httpPeek" title="Peek at data from a HTTP connection.">httpPeek</a></li>
<li><a href="#httpPost" title="Send a POST request to the server.">httpPost</a></li>
<li><a href="#httpPut" title="Send a PUT request to the server.">httpPut</a></li>
<li><a href="#httpRead" title="Read data from a HTTP connection.">httpRead</a></li>
<li><a href="#httpRead2" title="Read data from a HTTP connection.">httpRead2</a></li>
+ <li><a href="#httpReadRequest" title="Read a HTTP request from a connection.">httpReadRequest</a></li>
<li><a href="#httpReconnect" title="Reconnect to a HTTP server.">httpReconnect</a></li>
<li><a href="#httpReconnect2" title="Reconnect to a HTTP server with timeout and optional
cancel.">httpReconnect2</a></li>
+ <li><a href="#httpResolveHostname" title="Resolve the hostname of the HTTP connection
+address.">httpResolveHostname</a></li>
<li><a href="#httpSeparate" title="Separate a Universal Resource Identifier into its
components.">httpSeparate</a></li>
<li><a href="#httpSeparate2" title="Separate a Universal Resource Identifier into its
@@ -482,16 +522,22 @@ components.">httpSeparateURI</a></li>
<li><a href="#httpSetCookie" title="Set the cookie value(s).">httpSetCookie</a></li>
<li><a href="#httpSetCredentials" title="Set the credentials associated with an encrypted
connection.">httpSetCredentials</a></li>
+ <li><a href="#httpSetDefaultField" title="Set the default value of an HTTP header.">httpSetDefaultField</a></li>
<li><a href="#httpSetExpect" title="Set the Expect: header in a request.">httpSetExpect</a></li>
<li><a href="#httpSetField" title="Set the value of an HTTP header.">httpSetField</a></li>
+ <li><a href="#httpSetKeepAlive" title="Set the current Keep-Alive state of a connection.">httpSetKeepAlive</a></li>
<li><a href="#httpSetLength" title="Set the content-length and content-encoding.">httpSetLength</a></li>
<li><a href="#httpSetTimeout" title="Set read/write timeouts and an optional callback.">httpSetTimeout</a></li>
+ <li><a href="#httpShutdown" title="Shutdown one side of an HTTP connection.">httpShutdown</a></li>
+ <li><a href="#httpStateString" title="Return the string describing a HTTP state value.">httpStateString</a></li>
<li><a href="#httpStatus" title="Return a short string describing a HTTP status code.">httpStatus</a></li>
<li><a href="#httpTrace" title="Send an TRACE request to the server.">httpTrace</a></li>
+ <li><a href="#httpURIStatusString" title="Return a string describing a URI status code.">httpURIStatusString</a></li>
<li><a href="#httpUpdate" title="Update the current HTTP state for incoming data.">httpUpdate</a></li>
<li><a href="#httpWait" title="Wait for data available on a connection.">httpWait</a></li>
<li><a href="#httpWrite" title="Write data to a HTTP connection.">httpWrite</a></li>
<li><a href="#httpWrite2" title="Write data to a HTTP connection.">httpWrite2</a></li>
+ <li><a href="#httpWriteResponse" title="Write a HTTP response to a client connection.">httpWriteResponse</a></li>
<li><a href="#ippAddBoolean" title="Add a boolean attribute to an IPP message.">ippAddBoolean</a></li>
<li><a href="#ippAddBooleans" title="Add an array of boolean values.">ippAddBooleans</a></li>
<li><a href="#ippAddCollection" title="Add a collection value.">ippAddCollection</a></li>
@@ -507,10 +553,18 @@ connection.">httpSetCredentials</a></li>
<li><a href="#ippAddResolutions" title="Add resolution values to an IPP message.">ippAddResolutions</a></li>
<li><a href="#ippAddSeparator" title="Add a group separator to an IPP message.">ippAddSeparator</a></li>
<li><a href="#ippAddString" title="Add a language-encoded string to an IPP message.">ippAddString</a></li>
+ <li><a href="#ippAddStringf" title="Add a formatted string to an IPP message.">ippAddStringf</a></li>
+ <li><a href="#ippAddStringfv" title="Add a formatted string to an IPP message.">ippAddStringfv</a></li>
<li><a href="#ippAddStrings" title="Add language-encoded strings to an IPP message.">ippAddStrings</a></li>
<li><a href="#ippAttributeString" title="Convert the attribute's value to a string.">ippAttributeString</a></li>
+ <li><a href="#ippContainsInteger" title="Determine whether an attribute contains the
+specified value or is within the list of ranges.">ippContainsInteger</a></li>
+ <li><a href="#ippContainsString" title="Determine whether an attribute contains the
+specified string value.">ippContainsString</a></li>
<li><a href="#ippCopyAttribute" title="Copy an attribute.">ippCopyAttribute</a></li>
<li><a href="#ippCopyAttributes" title="Copy attributes from one IPP message to another.">ippCopyAttributes</a></li>
+ <li><a href="#ippCreateRequestedArray" title="Create a CUPS array of attribute names from the
+given requested-attributes attribute.">ippCreateRequestedArray</a></li>
<li><a href="#ippDateToTime" title="Convert from RFC 1903 Date/Time format to UNIX time
in seconds.">ippDateToTime</a></li>
<li><a href="#ippDelete" title="Delete an IPP message.">ippDelete</a></li>
@@ -530,6 +584,7 @@ in seconds.">ippDateToTime</a></li>
<li><a href="#ippGetGroupTag" title="Get the group associated with an attribute.">ippGetGroupTag</a></li>
<li><a href="#ippGetInteger" title="Get the integer/enum value for an attribute.">ippGetInteger</a></li>
<li><a href="#ippGetName" title="Get the attribute name.">ippGetName</a></li>
+ <li><a href="#ippGetOctetString" title="Get an octetString value from an IPP attribute.">ippGetOctetString</a></li>
<li><a href="#ippGetOperation" title="Get the operation ID in an IPP message.">ippGetOperation</a></li>
<li><a href="#ippGetRange" title="Get a rangeOfInteger value from an attribute.">ippGetRange</a></li>
<li><a href="#ippGetRequestId" title="Get the request ID from an IPP message.">ippGetRequestId</a></li>
@@ -542,6 +597,7 @@ in seconds.">ippDateToTime</a></li>
<li><a href="#ippLength" title="Compute the length of an IPP message.">ippLength</a></li>
<li><a href="#ippNew" title="Allocate a new IPP message.">ippNew</a></li>
<li><a href="#ippNewRequest" title="Allocate a new IPP request message.">ippNewRequest</a></li>
+ <li><a href="#ippNewResponse" title="Allocate a new IPP response message.">ippNewResponse</a></li>
<li><a href="#ippNextAttribute" title="Return the next attribute in the message.">ippNextAttribute</a></li>
<li><a href="#ippOpString" title="Return a name for the given operation id.">ippOpString</a></li>
<li><a href="#ippOpValue" title="Return an operation id for the given name.">ippOpValue</a></li>
@@ -555,6 +611,7 @@ in seconds.">ippDateToTime</a></li>
<li><a href="#ippSetGroupTag" title="Set the group tag of an attribute.">ippSetGroupTag</a></li>
<li><a href="#ippSetInteger" title="Set an integer or enum value in an attribute.">ippSetInteger</a></li>
<li><a href="#ippSetName" title="Set the name of an attribute.">ippSetName</a></li>
+ <li><a href="#ippSetOctetString" title="Set an octetString value in an IPP attribute.">ippSetOctetString</a></li>
<li><a href="#ippSetOperation" title="Set the operation ID in an IPP request message.">ippSetOperation</a></li>
<li><a href="#ippSetPort" title="Set the default port number.">ippSetPort</a></li>
<li><a href="#ippSetRange" title="Set a rangeOfInteger value in an attribute.">ippSetRange</a></li>
@@ -563,11 +620,16 @@ in seconds.">ippDateToTime</a></li>
<li><a href="#ippSetState" title="Set the current state of the IPP message.">ippSetState</a></li>
<li><a href="#ippSetStatusCode" title="Set the status code in an IPP response or event message.">ippSetStatusCode</a></li>
<li><a href="#ippSetString" title="Set a string value in an attribute.">ippSetString</a></li>
+ <li><a href="#ippSetStringf" title="Set a formatted string value of an attribute.">ippSetStringf</a></li>
+ <li><a href="#ippSetStringfv" title="Set a formatted string value of an attribute.">ippSetStringfv</a></li>
<li><a href="#ippSetValueTag" title="Set the value tag of an attribute.">ippSetValueTag</a></li>
<li><a href="#ippSetVersion" title="Set the version number in an IPP message.">ippSetVersion</a></li>
+ <li><a href="#ippStateString" title="Return the name corresponding to a state value.">ippStateString</a></li>
<li><a href="#ippTagString" title="Return the tag name corresponding to a tag value.">ippTagString</a></li>
<li><a href="#ippTagValue" title="Return the tag value corresponding to a tag name.">ippTagValue</a></li>
<li><a href="#ippTimeToDate" title="Convert from UNIX time to RFC 1903 format.">ippTimeToDate</a></li>
+ <li><a href="#ippValidateAttribute" title="Validate the contents of an attribute.">ippValidateAttribute</a></li>
+ <li><a href="#ippValidateAttributes" title="Validate all attributes in an IPP message.">ippValidateAttributes</a></li>
<li><a href="#ippWrite" title="Write data for an IPP message to a HTTP connection.">ippWrite</a></li>
<li><a href="#ippWriteFile" title="Write data for an IPP message to a file.">ippWriteFile</a></li>
<li><a href="#ippWriteIO" title="Write data for an IPP message.">ippWriteIO</a></li>
@@ -590,9 +652,9 @@ with a hostname. ">http_addrlist_t</a></li>
<li><a href="#http_keepalive_t" title="HTTP keep-alive values">http_keepalive_t</a></li>
<li><a href="#http_state_t" title="HTTP state values; states
are server-oriented...">http_state_t</a></li>
- <li><a href="#http_status_t" title="HTTP status codes">http_status_t</a></li>
<li><a href="#http_t" title="HTTP connection type">http_t</a></li>
<li><a href="#http_timeout_cb_t" title="HTTP timeout callback ">http_timeout_cb_t</a></li>
+ <li><a href="#http_trust_t" title="Level of trust for credentials ">http_trust_t</a></li>
<li><a href="#http_uri_coding_t" title="URI en/decode flags">http_uri_coding_t</a></li>
<li><a href="#http_uri_status_t" title="URI separation status ">http_uri_status_t</a></li>
<li><a href="#http_version_t" title="HTTP version numbers">http_version_t</a></li>
@@ -601,7 +663,7 @@ are server-oriented...">http_state_t</a></li>
Please use the new accessor functions available in CUPS 1.6 and later, as
these definitions will be moved to a private header file in a future release.">ipp_copycb_t</a></li>
<li><a href="#ipp_dstate_t" title="Document states">ipp_dstate_t</a></li>
- <li><a href="#ipp_finish_t" title="Finishings">ipp_finish_t</a></li>
+ <li><a href="#ipp_finish_t" title="Job collation types">ipp_finish_t</a></li>
<li><a href="#ipp_iocb_t" title="IPP IO Callback Function ">ipp_iocb_t</a></li>
<li><a href="#ipp_jcollate_t" title="Job collation types">ipp_jcollate_t</a></li>
<li><a href="#ipp_orient_t" title="Orientation values">ipp_orient_t</a></li>
@@ -630,11 +692,12 @@ with a hostname. ">http_addrlist_s</a></li>
<li><a href="#http_state_e" title="HTTP state values; states
are server-oriented...">http_state_e</a></li>
<li><a href="#http_status_e" title="HTTP status codes">http_status_e</a></li>
+ <li><a href="#http_trust_e" title="Level of trust for credentials ">http_trust_e</a></li>
<li><a href="#http_uri_coding_e" title="URI en/decode flags">http_uri_coding_e</a></li>
<li><a href="#http_uri_status_e" title="URI separation status ">http_uri_status_e</a></li>
<li><a href="#http_version_e" title="HTTP version numbers">http_version_e</a></li>
<li><a href="#ipp_dstate_e" title="Document states">ipp_dstate_e</a></li>
- <li><a href="#ipp_finish_e" title="Finishings">ipp_finish_e</a></li>
+ <li><a href="#ipp_finishings_e" title="Finishings">ipp_finishings_e</a></li>
<li><a href="#ipp_jcollate_e" title="Job collation types">ipp_jcollate_e</a></li>
<li><a href="#ipp_jstate_e" title="Job states">ipp_jstate_e</a></li>
<li><a href="#ipp_op_e" title="IPP operations">ipp_op_e</a></li>
@@ -985,7 +1048,7 @@ int cupsDoAuthentication (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">0 on success, -1 on error</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function should be called in response to a <code>HTTP_UNAUTHORIZED</code>
+<p class="discussion">This function should be called in response to a <code>HTTP_STATUS_UNAUTHORIZED</code>
status, prior to resubmitting your request.
</p>
@@ -1160,7 +1223,7 @@ the request respectively.
<h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsGetFd">cupsGetFd</a></h3>
<p class="description">Get a file from the server.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> cupsGetFd (<br>
+http_status_t cupsGetFd (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
&nbsp;&nbsp;&nbsp;&nbsp;int fd<br>
@@ -1177,13 +1240,13 @@ the request respectively.
<h4 class="returnvalue">Return Value</h4>
<p class="description">HTTP status</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function returns <code>HTTP_OK</code> when the file is successfully retrieved.
+<p class="discussion">This function returns <code>HTTP_STATUS_OK</code> when the file is successfully retrieved.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsGetFile">cupsGetFile</a></h3>
<p class="description">Get a file from the server.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> cupsGetFile (<br>
+http_status_t cupsGetFile (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *filename<br>
@@ -1200,7 +1263,7 @@ the request respectively.
<h4 class="returnvalue">Return Value</h4>
<p class="description">HTTP status</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function returns <code>HTTP_OK</code> when the file is successfully retrieved.
+<p class="discussion">This function returns <code>HTTP_STATUS_OK</code> when the file is successfully retrieved.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsGetResponse">cupsGetResponse</a></h3>
@@ -1243,7 +1306,7 @@ const char *cupsLastErrorString (void);</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsPutFd">cupsPutFd</a></h3>
<p class="description">Put a file on the server.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> cupsPutFd (<br>
+http_status_t cupsPutFd (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
&nbsp;&nbsp;&nbsp;&nbsp;int fd<br>
@@ -1260,14 +1323,14 @@ const char *cupsLastErrorString (void);</p>
<h4 class="returnvalue">Return Value</h4>
<p class="description">HTTP status</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function returns <code>HTTP_CREATED</code> when the file is stored
+<p class="discussion">This function returns <code>HTTP_STATUS_CREATED</code> when the file is stored
successfully.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsPutFile">cupsPutFile</a></h3>
<p class="description">Put a file on the server.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> cupsPutFile (<br>
+http_status_t cupsPutFile (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *filename<br>
@@ -1316,7 +1379,7 @@ respectively.
<h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsSendRequest">cupsSendRequest</a></h3>
<p class="description">Send an IPP request.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> cupsSendRequest (<br>
+http_status_t cupsSendRequest (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *request,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
@@ -1342,7 +1405,7 @@ and <a href="#cupsReadResponseData"><code>cupsReadResponseData</code></a> to rea
response. Only one request can be sent/queued at a time per <code>http_t</code>
connection.<br>
<br>
-Returns the initial HTTP status code, which will be <code>HTTP_CONTINUE</code>
+Returns the initial HTTP status code, which will be <code>HTTP_STATUS_CONTINUE</code>
on a successful send of the request.<br>
<br>
Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a href="#cupsDoIORequest"><code>cupsDoIORequest</code></a>, and
@@ -1352,7 +1415,7 @@ Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a
<h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsWriteRequestData">cupsWriteRequestData</a></h3>
<p class="description">Write additional data after an IPP request.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> cupsWriteRequestData (<br>
+http_status_t cupsWriteRequestData (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *buffer,<br>
&nbsp;&nbsp;&nbsp;&nbsp;size_t length<br>
@@ -1367,12 +1430,30 @@ Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a
<dd class="description">Number of bytes to write</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description"><code>HTTP_CONTINUE</code> if OK or HTTP status on error</p>
+<p class="description"><code>HTTP_STATUS_CONTINUE</code> if OK or HTTP status on error</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">This function is used after <a href="#cupsSendRequest"><code>cupsSendRequest</code></a> to provide a PPD and
after <a href="#cupsStartDocument"><code>cupsStartDocument</code></a> to provide a document file.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAcceptConnection">httpAcceptConnection</a></h3>
+<p class="description">Accept a new HTTP client connection from the
+specified listening socket.</p>
+<p class="code">
+<a href="#http_t">http_t</a> *httpAcceptConnection (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int fd,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int blocking<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>fd</dt>
+<dd class="description">Listen socket file descriptor</dd>
+<dt>blocking</dt>
+<dd class="description">1 if the connection should be
+blocking, 0 otherwise</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">HTTP connection or <code>NULL</code></p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span><a name="httpAddCredential">httpAddCredential</a></h3>
<p class="description">Allocates and adds a single credential to an array.</p>
<p class="code">
@@ -1409,6 +1490,29 @@ int httpAddrAny (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 if &quot;any&quot;, 0 otherwise</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpAddrClose">httpAddrClose</a></h3>
+<p class="description">Close a socket created by <a href="#httpAddrConnect"><code>httpAddrConnect</code></a> or
+<a href="#httpAddrListen"><code>httpAddrListen</code></a>.</p>
+<p class="code">
+int httpAddrClose (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int fd<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Listen address or <code>NULL</code></dd>
+<dt>fd</dt>
+<dd class="description">Socket file descriptor</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Pass <code>NULL</code> for sockets created with <a href="#httpAddrConnect"><code>httpAddrConnect</code></a> and the
+listen address for sockets created with <a href="#httpAddrListen"><code>httpAddrListen</code></a>. This will
+ensure that domain sockets are removed when closed.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrEqual">httpAddrEqual</a></h3>
<p class="description">Compare two addresses.</p>
<p class="code">
@@ -1425,6 +1529,19 @@ int httpAddrEqual (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 if equal, 0 if not</p>
+<h3 class="function"><a name="httpAddrFamily">httpAddrFamily</a></h3>
+<p class="description">Get the address family of an address.</p>
+<p class="code">
+int httpAddrFamily (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Address</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Address family</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrLength">httpAddrLength</a></h3>
<p class="description">Return the length of the address in bytes.</p>
<p class="code">
@@ -1438,6 +1555,23 @@ int httpAddrLength (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Length in bytes</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAddrListen">httpAddrListen</a></h3>
+<p class="description">Create a listening socket bound to the specified
+address and port.</p>
+<p class="code">
+int httpAddrListen (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int port<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Address to bind to</dd>
+<dt>port</dt>
+<dd class="description">Port number to bind to</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Socket or -1 on error</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrLocalhost">httpAddrLocalhost</a></h3>
<p class="description">Check for the local loopback address.</p>
<p class="code">
@@ -1470,6 +1604,19 @@ char *httpAddrLookup (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Host name</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAddrPort">httpAddrPort</a></h3>
+<p class="description">Get the port number associated with an address.</p>
+<p class="code">
+int httpAddrPort (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Address</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Port number</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrString">httpAddrString</a></h3>
<p class="description">Convert an address to a numeric string.</p>
<p class="code">
@@ -1577,6 +1724,42 @@ this function in place of traditional string functions whenever
you need to create a URI string.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAssembleUUID">httpAssembleUUID</a></h3>
+<p class="description">Assemble a name-based UUID URN conforming to RFC 4122.</p>
+<p class="code">
+char *httpAssembleUUID (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *server,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int port,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int number,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *buffer,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t bufsize<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>server</dt>
+<dd class="description">Server name</dd>
+<dt>port</dt>
+<dd class="description">Port number</dd>
+<dt>name</dt>
+<dd class="description">Object name or NULL</dd>
+<dt>number</dt>
+<dd class="description">Object number or 0</dd>
+<dt>buffer</dt>
+<dd class="description">String buffer</dd>
+<dt>bufsize</dt>
+<dd class="description">Size of buffer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">UUID string</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a unique 128-bit identifying number using the server
+name, port number, random data, and optionally an object name and/or object
+number. The result is formatted as a UUID URN as defined in RFC 4122.<br>
+<br>
+The buffer needs to be at least 46 bytes in size.
+
+</p>
<h3 class="function"><a name="httpBlocking">httpBlocking</a></h3>
<p class="description">Set blocking/non-blocking behavior on a connection.</p>
<p class="code">
@@ -1587,7 +1770,7 @@ void httpBlocking (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>b</dt>
<dd class="description">1 = blocking, 0 = non-blocking</dd>
</dl>
@@ -1600,7 +1783,7 @@ int httpCheck (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">0 = no data, 1 = data available</p>
@@ -1613,7 +1796,7 @@ void httpClearCookie (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h3 class="function"><a name="httpClearFields">httpClearFields</a></h3>
<p class="description">Clear HTTP request fields.</p>
@@ -1624,7 +1807,7 @@ void httpClearFields (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h3 class="function"><a name="httpClose">httpClose</a></h3>
<p class="description">Close an HTTP connection.</p>
@@ -1635,8 +1818,24 @@ void httpClose (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpCompareCredentials">httpCompareCredentials</a></h3>
+<p class="description">Compare two sets of X.509 credentials.</p>
+<p class="code">
+int httpCompareCredentials (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;cups_array_t *cred1,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;cups_array_t *cred2<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>cred1</dt>
+<dd class="description">First set of X.509 credentials</dd>
+<dt>cred2</dt>
+<dd class="description">Second set of X.509 credentials</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if they match, 0 if they do not</p>
<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpConnect">httpConnect</a></h3>
<p class="description">Connect to a HTTP server.</p>
<p class="code">
@@ -1654,16 +1853,21 @@ void httpClose (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">New HTTP connection</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is deprecated - use <a href="#httpConnectEncrypt"><code>httpConnectEncrypt</code></a> instead.
+<p class="discussion">This function is deprecated - use <a href="#httpConnect2"><code>httpConnect2</code></a> instead.
</p>
-<h3 class="function"><a name="httpConnectEncrypt">httpConnectEncrypt</a></h3>
-<p class="description">Connect to a HTTP server using encryption.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpConnect2">httpConnect2</a></h3>
+<p class="description">Connect to a HTTP server.</p>
<p class="code">
-<a href="#http_t">http_t</a> *httpConnectEncrypt (<br>
+<a href="#http_t">http_t</a> *httpConnect2 (<br>
&nbsp;&nbsp;&nbsp;&nbsp;const char *host,<br>
&nbsp;&nbsp;&nbsp;&nbsp;int port,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_encryption_t">http_encryption_t</a> encryption<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addrlist_t">http_addrlist_t</a> *addrlist,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int family,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_encryption_t">http_encryption_t</a> encryption,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int blocking,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int msec,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int *cancel<br>
);</p>
<h4 class="parameters">Parameters</h4>
<dl>
@@ -1671,28 +1875,45 @@ void httpClose (<br>
<dd class="description">Host to connect to</dd>
<dt>port</dt>
<dd class="description">Port number</dd>
+<dt>addrlist</dt>
+<dd class="description">List of addresses or NULL to lookup</dd>
+<dt>family</dt>
+<dd class="description">Address family to use or <code>AF_UNSPEC</code> for any</dd>
<dt>encryption</dt>
<dd class="description">Type of encryption to use</dd>
+<dt>blocking</dt>
+<dd class="description">1 for blocking connection, 0 for non-blocking</dd>
+<dt>msec</dt>
+<dd class="description">Connection timeout in milliseconds, 0 means don't connect</dd>
+<dt>cancel</dt>
+<dd class="description">Pointer to &quot;cancel&quot; variable</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">New HTTP connection</p>
-<h3 class="function"><span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span><a name="httpCopyCredentials">httpCopyCredentials</a></h3>
-<p class="description">Copy the credentials associated with an encrypted
-connection.</p>
+<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpConnectEncrypt">httpConnectEncrypt</a></h3>
+<p class="description">Connect to a HTTP server using encryption.</p>
<p class="code">
-int httpCopyCredentials (<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;cups_array_t **credentials<br>
+<a href="#http_t">http_t</a> *httpConnectEncrypt (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *host,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int port,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_encryption_t">http_encryption_t</a> encryption<br>
);</p>
<h4 class="parameters">Parameters</h4>
<dl>
-<dt>http</dt>
-<dd class="description">Connection to server</dd>
-<dt>credentials</dt>
-<dd class="description">Array of credentials</dd>
+<dt>host</dt>
+<dd class="description">Host to connect to</dd>
+<dt>port</dt>
+<dd class="description">Port number</dd>
+<dt>encryption</dt>
+<dd class="description">Type of encryption to use</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
+<p class="description">New HTTP connection</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is now deprecated. Please use the <a href="#httpConnect2"><code>httpConnect2</code></a> function
+instead.
+
+</p>
<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpDecode64">httpDecode64</a></h3>
<p class="description">Base64-decode a string.</p>
<p class="code">
@@ -1743,7 +1964,7 @@ int httpDelete (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI to delete</dd>
</dl>
@@ -1802,7 +2023,7 @@ int httpEncryption (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>e</dt>
<dd class="description">New encryption preference</dd>
</dl>
@@ -1817,10 +2038,24 @@ int httpError (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Error code (errno) value</p>
+<h3 class="function"><a name="httpFieldValue">httpFieldValue</a></h3>
+<p class="description">Return the HTTP field enumeration value for a field
+name.</p>
+<p class="code">
+<a href="#http_field_t">http_field_t</a> httpFieldValue (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>name</dt>
+<dd class="description">String name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Field index</p>
<h3 class="function"><a name="httpFlush">httpFlush</a></h3>
<p class="description">Flush data from a HTTP connection.</p>
<p class="code">
@@ -1830,7 +2065,7 @@ void httpFlush (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpFlushWrite">httpFlushWrite</a></h3>
<p class="description">Flush data in write buffer.</p>
@@ -1841,7 +2076,7 @@ int httpFlushWrite (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Bytes written or -1 on error</p>
@@ -1866,12 +2101,46 @@ int httpGet (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI to get</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetActivity">httpGetActivity</a></h3>
+<p class="description">Get the most recent activity for a connection.</p>
+<p class="code">
+time_t httpGetActivity (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Time of last read or write</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The return value is the UNIX time of the last read or write.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetAddress">httpGetAddress</a></h3>
+<p class="description">Get the address of the connected peer of a connection.</p>
+<p class="code">
+<a href="#http_addr_t">http_addr_t</a> *httpGetAddress (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Connected address or <code>NULL</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns <code>NULL</code> if the socket is currently unconnected.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span><a name="httpGetAuthString">httpGetAuthString</a></h3>
<p class="description">Get the current authorization string.</p>
<p class="code">
@@ -1881,7 +2150,7 @@ char *httpGetAuthString (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Authorization string</p>
@@ -1901,10 +2170,33 @@ int httpGetBlocking (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 if blocking, 0 if non-blocking</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpGetContentEncoding">httpGetContentEncoding</a></h3>
+<p class="description">Get a common content encoding, if any, between
+the client and server.</p>
+<p class="code">
+const char *httpGetContentEncoding (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Content-Coding value or
+<code>NULL</code> for the identity
+coding.</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function uses the value of the Accepts-Encoding HTTP header and must be
+called after receiving a response from the server or a request from the
+client. The value returned can be use in subsequent requests (for clients)
+or in the response (for servers) in order to compress the content stream.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.1.19/OS X 10.3&nbsp;</span><a name="httpGetCookie">httpGetCookie</a></h3>
<p class="description">Get any cookie data from the response.</p>
<p class="code">
@@ -1914,7 +2206,7 @@ const char *httpGetCookie (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">HTTP connecion</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Cookie data or NULL</p>
@@ -1963,6 +2255,43 @@ time_t httpGetDateTime (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">UNIX time</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetEncryption">httpGetEncryption</a></h3>
+<p class="description">Get the current encryption mode of a connection.</p>
+<p class="code">
+<a href="#http_encryption_t">http_encryption_t</a> httpGetEncryption (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Current encryption mode</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns the encryption mode for the connection. Use the
+<a href="#httpIsEncrypted"><code>httpIsEncrypted</code></a> function to determine whether a TLS session has
+been established.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpGetExpect">httpGetExpect</a></h3>
+<p class="description">Get the value of the Expect header, if any.</p>
+<p class="code">
+http_status_t httpGetExpect (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Expect: status, if any</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns <code>HTTP_STATUS_NONE</code> if there is no Expect header, otherwise
+returns the expected HTTP status code, typically <code>HTTP_STATUS_CONTINUE</code>.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpGetFd">httpGetFd</a></h3>
<p class="description">Get the file descriptor associated with a connection.</p>
<p class="code">
@@ -1972,7 +2301,7 @@ int httpGetFd (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">File descriptor or -1 if none</p>
@@ -1986,7 +2315,7 @@ const char *httpGetField (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>field</dt>
<dd class="description">Field to get</dd>
</dl>
@@ -2027,11 +2356,25 @@ const char *httpGetHostname (<br>
<p class="description">FQDN for connection or system</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">When &quot;http&quot; points to a connected socket, return the hostname or
-address that was used in the call to httpConnect() or httpConnectEncrypt().
+address that was used in the call to httpConnect() or httpConnectEncrypt(),
+or the address of the client for the connection from httpAcceptConnection().
Otherwise, return the FQDN for the local system using both gethostname()
and gethostbyname() to get the local hostname with domain.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetKeepAlive">httpGetKeepAlive</a></h3>
+<p class="description">Get the current Keep-Alive state of the connection.</p>
+<p class="code">
+<a href="#http_keepalive_t">http_keepalive_t</a> httpGetKeepAlive (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Keep-Alive state</p>
<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpGetLength">httpGetLength</a></h3>
<p class="description">Get the amount of data remaining from the
content-length or transfer-encoding fields.</p>
@@ -2042,7 +2385,7 @@ int httpGetLength (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Content length</p>
@@ -2061,7 +2404,7 @@ off_t httpGetLength2 (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Content length</p>
@@ -2070,6 +2413,51 @@ off_t httpGetLength2 (<br>
content larger than 2^31 - 1.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetPending">httpGetPending</a></h3>
+<p class="description">Get the number of bytes that are buffered for writing.</p>
+<p class="code">
+size_t httpGetPending (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes buffered</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetReady">httpGetReady</a></h3>
+<p class="description">Get the number of bytes that can be read without blocking.</p>
+<p class="code">
+size_t httpGetReady (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes available</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetRemaining">httpGetRemaining</a></h3>
+<p class="description">Get the number of remaining bytes in the message
+body or current chunk.</p>
+<p class="code">
+size_t httpGetRemaining (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Remaining bytes</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <a href="#httpIsChunked"><code>httpIsChunked</code></a> function can be used to determine whether the
+message body is chunked or fixed-length.
+
+</p>
<h3 class="function"><a name="httpGetState">httpGetState</a></h3>
<p class="description">Get the current state of the HTTP request.</p>
<p class="code">
@@ -2079,20 +2467,20 @@ content larger than 2^31 - 1.
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">HTTP state</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpGetStatus">httpGetStatus</a></h3>
<p class="description">Get the status of the last HTTP request.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> httpGetStatus (<br>
+http_status_t httpGetStatus (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
);</p>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">HTTP status</p>
@@ -2108,7 +2496,7 @@ char *httpGetSubField (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>field</dt>
<dd class="description">Field index</dd>
<dt>name</dt>
@@ -2131,7 +2519,7 @@ char *httpGetSubField2 (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>field</dt>
<dd class="description">Field index</dd>
<dt>name</dt>
@@ -2152,7 +2540,7 @@ char *httpGetSubField2 (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Version number</p>
@@ -2171,7 +2559,7 @@ char *httpGets (<br>
<dt>length</dt>
<dd class="description">Max length of buffer</dd>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Line or NULL</p>
@@ -2185,7 +2573,7 @@ int httpHead (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI for head</dd>
</dl>
@@ -2196,6 +2584,41 @@ int httpHead (<br>
default HTTP proxy (if any).</p>
<p class="code">
void httpInitialize (void);</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpIsChunked">httpIsChunked</a></h3>
+<p class="description">Report whether a message body is chunked.</p>
+<p class="code">
+int httpIsChunked (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if chunked, 0 if not</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns non-zero if the message body is composed of
+variable-length chunks.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpIsEncrypted">httpIsEncrypted</a></h3>
+<p class="description">Report whether a connection is encrypted.</p>
+<p class="code">
+int httpIsEncrypted (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if encrypted, 0 if not</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns non-zero if the connection is currently encrypted.
+
+</p>
<h3 class="function"><a name="httpMD5">httpMD5</a></h3>
<p class="description">Compute the MD5 sum of the username:group:password.</p>
<p class="code">
@@ -2268,12 +2691,39 @@ int httpOptions (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI for options</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpPeek">httpPeek</a></h3>
+<p class="description">Peek at data from a HTTP connection.</p>
+<p class="code">
+ssize_t httpPeek (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *buffer,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t length<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>buffer</dt>
+<dd class="description">Buffer for data</dd>
+<dt>length</dt>
+<dd class="description">Maximum number of bytes</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes copied</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function copies available data from the given HTTP connection, reading
+a buffer as needed. The data is still available for reading using
+<a href="#httpRead"><code>httpRead</code></a> or <a href="#httpRead2"><code>httpRead2</code></a>.<br>
+<br>
+For non-blocking connections the usual timeouts apply.
+
+</p>
<h3 class="function"><a name="httpPost">httpPost</a></h3>
<p class="description">Send a POST request to the server.</p>
<p class="code">
@@ -2284,7 +2734,7 @@ int httpPost (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI for post</dd>
</dl>
@@ -2300,7 +2750,7 @@ int httpPut (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI to put</dd>
</dl>
@@ -2317,7 +2767,7 @@ int httpRead (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>buffer</dt>
<dd class="description">Buffer for data</dd>
<dt>length</dt>
@@ -2341,7 +2791,7 @@ ssize_t httpRead2 (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>buffer</dt>
<dd class="description">Buffer for data</dd>
<dt>length</dt>
@@ -2349,7 +2799,26 @@ ssize_t httpRead2 (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Number of bytes read</p>
-<h3 class="function"><a name="httpReconnect">httpReconnect</a></h3>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpReadRequest">httpReadRequest</a></h3>
+<p class="description">Read a HTTP request from a connection.</p>
+<p class="code">
+<a href="#http_state_t">http_state_t</a> httpReadRequest (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *uri,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t urilen<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>uri</dt>
+<dd class="description">URI buffer</dd>
+<dt>urilen</dt>
+<dd class="description">Size of URI buffer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New state of connection</p>
+<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpReconnect">httpReconnect</a></h3>
<p class="description">Reconnect to a HTTP server.</p>
<p class="code">
int httpReconnect (<br>
@@ -2358,10 +2827,15 @@ int httpReconnect (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">0 on success, non-zero on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is deprecated. Please use the <a href="#httpReconnect2"><code>httpReconnect2</code></a> function
+instead.
+
+</p>
<h3 class="function"><a name="httpReconnect2">httpReconnect2</a></h3>
<p class="description">Reconnect to a HTTP server with timeout and optional
cancel.</p>
@@ -2374,7 +2848,7 @@ int httpReconnect2 (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>msec</dt>
<dd class="description">Timeout in milliseconds</dd>
<dt>cancel</dt>
@@ -2382,6 +2856,26 @@ int httpReconnect2 (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">0 on success, non-zero on failure</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpResolveHostname">httpResolveHostname</a></h3>
+<p class="description">Resolve the hostname of the HTTP connection
+address.</p>
+<p class="code">
+const char *httpResolveHostname (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *buffer,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t bufsize<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>buffer</dt>
+<dd class="description">Hostname buffer</dd>
+<dt>bufsize</dt>
+<dd class="description">Size of buffer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Resolved hostname or <code>NULL</code></p>
<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpSeparate">httpSeparate</a></h3>
<p class="description">Separate a Universal Resource Identifier into its
components.</p>
@@ -2512,7 +3006,7 @@ void httpSetAuthString (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>scheme</dt>
<dd class="description">Auth scheme (NULL to clear it)</dd>
<dt>data</dt>
@@ -2550,28 +3044,52 @@ int httpSetCredentials (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>credentials</dt>
<dd class="description">Array of credentials</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpSetDefaultField">httpSetDefaultField</a></h3>
+<p class="description">Set the default value of an HTTP header.</p>
+<p class="code">
+void httpSetDefaultField (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_field_t">http_field_t</a> field,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *value<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>field</dt>
+<dd class="description">Field index</dd>
+<dt>value</dt>
+<dd class="description">Value</dd>
+</dl>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Currently only <code>HTTP_FIELD_ACCEPT_ENCODING</code>, <code>HTTP_FIELD_SERVER</code>,
+and <code>HTTP_FIELD_USER_AGENT</code> can be set.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpSetExpect">httpSetExpect</a></h3>
<p class="description">Set the Expect: header in a request.</p>
<p class="code">
void httpSetExpect (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_status_t">http_status_t</a> expect<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_status_t expect<br>
);</p>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>expect</dt>
-<dd class="description">HTTP status to expect (HTTP_CONTINUE)</dd>
+<dd class="description">HTTP status to expect
+(<code>HTTP_STATUS_CONTINUE</code>)</dd>
</dl>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">Currently only HTTP_CONTINUE is supported for the &quot;expect&quot; argument.
+<p class="discussion">Currently only <code>HTTP_STATUS_CONTINUE</code> is supported for the &quot;expect&quot;
+argument.
</p>
<h3 class="function"><a name="httpSetField">httpSetField</a></h3>
@@ -2585,12 +3103,26 @@ void httpSetField (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>field</dt>
<dd class="description">Field index</dd>
<dt>value</dt>
<dd class="description">Value</dd>
</dl>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpSetKeepAlive">httpSetKeepAlive</a></h3>
+<p class="description">Set the current Keep-Alive state of a connection.</p>
+<p class="code">
+void httpSetKeepAlive (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_keepalive_t">http_keepalive_t</a> keep_alive<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>keep_alive</dt>
+<dd class="description">New Keep-Alive value</dd>
+</dl>
<h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpSetLength">httpSetLength</a></h3>
<p class="description">Set the content-length and content-encoding.</p>
<p class="code">
@@ -2601,7 +3133,7 @@ void httpSetLength (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>length</dt>
<dd class="description">Length (0 for chunked)</dd>
</dl>
@@ -2617,7 +3149,7 @@ void httpSetTimeout (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>timeout</dt>
<dd class="description">Number of seconds for timeout,
must be greater than 0</dd>
@@ -2631,11 +3163,35 @@ must be greater than 0</dd>
data pointer and must return 1 to continue or 0 to error (time) out.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpShutdown">httpShutdown</a></h3>
+<p class="description">Shutdown one side of an HTTP connection.</p>
+<p class="code">
+void httpShutdown (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpStateString">httpStateString</a></h3>
+<p class="description">Return the string describing a HTTP state value.</p>
+<p class="code">
+const char *httpStateString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_state_t">http_state_t</a> state<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>state</dt>
+<dd class="description">HTTP state value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">State string</p>
<h3 class="function"><a name="httpStatus">httpStatus</a></h3>
<p class="description">Return a short string describing a HTTP status code.</p>
<p class="code">
const char *httpStatus (<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_status_t">http_status_t</a> status<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_status_t status<br>
);</p>
<h4 class="parameters">Parameters</h4>
<dl>
@@ -2657,22 +3213,35 @@ int httpTrace (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>uri</dt>
<dd class="description">URI for trace</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpURIStatusString">httpURIStatusString</a></h3>
+<p class="description">Return a string describing a URI status code.</p>
+<p class="code">
+const char *httpURIStatusString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_uri_status_t">http_uri_status_t</a> status<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>status</dt>
+<dd class="description">URI status code</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Localized status string</p>
<h3 class="function"><a name="httpUpdate">httpUpdate</a></h3>
<p class="description">Update the current HTTP state for incoming data.</p>
<p class="code">
-<a href="#http_status_t">http_status_t</a> httpUpdate (<br>
+http_status_t httpUpdate (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
);</p>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">HTTP status</p>
@@ -2686,7 +3255,7 @@ int httpWait (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>msec</dt>
<dd class="description">Milliseconds to wait</dd>
</dl>
@@ -2703,7 +3272,7 @@ int httpWrite (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>buffer</dt>
<dd class="description">Buffer for data</dd>
<dt>length</dt>
@@ -2727,7 +3296,7 @@ ssize_t httpWrite2 (<br>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
<dt>buffer</dt>
<dd class="description">Buffer for data</dd>
<dt>length</dt>
@@ -2735,6 +3304,22 @@ ssize_t httpWrite2 (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Number of bytes written</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpWriteResponse">httpWriteResponse</a></h3>
+<p class="description">Write a HTTP response to a client connection.</p>
+<p class="code">
+int httpWriteResponse (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_status_t status<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>status</dt>
+<dd class="description">Status code</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
<h3 class="function"><a name="ippAddBoolean">ippAddBoolean</a></h3>
<p class="description">Add a boolean attribute to an IPP message.</p>
<p class="code">
@@ -2758,8 +3343,8 @@ ssize_t httpWrite2 (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2792,8 +3377,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2823,8 +3408,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2859,8 +3444,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2892,8 +3477,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2926,8 +3511,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2966,8 +3551,8 @@ Supported values include enum (<code>IPP_TAG_ENUM</code>) and integer
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3003,8 +3588,8 @@ Supported values include enum (<code>IPP_TAG_ENUM</code>) and integer
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3036,8 +3621,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3078,8 +3663,8 @@ admin-define (<code>IPP_TAG_ADMINDEFINE</code>).
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3117,8 +3702,8 @@ The <code>lower</code> parameter must be less than or equal to the <code>upper</
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3154,8 +3739,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3194,8 +3779,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3216,8 +3801,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.</p>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.</p>
<h3 class="function"><a name="ippAddString">ippAddString</a></h3>
<p class="description">Add a language-encoded string to an IPP message.</p>
<p class="code">
@@ -3247,8 +3832,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3265,6 +3850,124 @@ Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
<br>
The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage and
textWithLanguage string values and must be <code>NULL</code> for all other string values.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippAddStringf">ippAddStringf</a></h3>
+<p class="description">Add a formatted string to an IPP message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippAddStringf (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t group,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t value_tag,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *language,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;...<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>group</dt>
+<dd class="description">IPP group</dd>
+<dt>value_tag</dt>
+<dd class="description">Type of attribute</dd>
+<dt>name</dt>
+<dd class="description">Name of attribute</dd>
+<dt>language</dt>
+<dd class="description">Language code (<code>NULL</code> for default)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>...</dt>
+<dd class="description">Additional arguments as needed</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>group</code> parameter specifies the IPP attribute group tag: none
+(<code>IPP_TAG_ZERO</code>, for member attributes), document
+(<code>IPP_TAG_DOCUMENT</code>), event notification
+(<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation (<code>IPP_TAG_OPERATION</code>),
+printer (<code>IPP_TAG_PRINTER</code>), subscription (<code>IPP_TAG_SUBSCRIPTION</code>),
+or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
+<br>
+Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
+(<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
+(<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
+(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
+(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
+(<code>IPP_TAG_URISCHEME</code>).<br>
+<br>
+The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage
+and textWithLanguage string values and must be <code>NULL</code> for all other
+string values.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions. Additional arguments follow it as
+needed. The formatted string is truncated as needed to the maximum length of
+the corresponding value type.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippAddStringfv">ippAddStringfv</a></h3>
+<p class="description">Add a formatted string to an IPP message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippAddStringfv (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t group,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t value_tag,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *language,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;va_list ap<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>group</dt>
+<dd class="description">IPP group</dd>
+<dt>value_tag</dt>
+<dd class="description">Type of attribute</dd>
+<dt>name</dt>
+<dd class="description">Name of attribute</dd>
+<dt>language</dt>
+<dd class="description">Language code (<code>NULL</code> for default)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>ap</dt>
+<dd class="description">Additional arguments</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>group</code> parameter specifies the IPP attribute group tag: none
+(<code>IPP_TAG_ZERO</code>, for member attributes), document
+(<code>IPP_TAG_DOCUMENT</code>), event notification
+(<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation (<code>IPP_TAG_OPERATION</code>),
+printer (<code>IPP_TAG_PRINTER</code>), subscription (<code>IPP_TAG_SUBSCRIPTION</code>),
+or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
+<br>
+Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
+(<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
+(<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
+(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
+(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
+(<code>IPP_TAG_URISCHEME</code>).<br>
+<br>
+The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage
+and textWithLanguage string values and must be <code>NULL</code> for all other
+string values.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions. Additional arguments are passed in the
+stdarg pointer <code>ap</code>. The formatted string is truncated as needed to the
+maximum length of the corresponding value type.
+
+</p>
<h3 class="function"><a name="ippAddStrings">ippAddStrings</a></h3>
<p class="description">Add language-encoded strings to an IPP message.</p>
<p class="code">
@@ -3297,8 +4000,8 @@ textWithLanguage string values and must be <code>NULL</code> for all other strin
<h4 class="returnvalue">Return Value</h4>
<p class="description">New attribute</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>group</code> parameter specifies the IPP attribute group tag: none
(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3340,6 +4043,51 @@ trailing nul. The buffer pointer can be NULL to get the required length,
just like (v)snprintf.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippContainsInteger">ippContainsInteger</a></h3>
+<p class="description">Determine whether an attribute contains the
+specified value or is within the list of ranges.</p>
+<p class="code">
+int ippContainsInteger (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int value<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">Attribute</dd>
+<dt>value</dt>
+<dd class="description">Integer/enum value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on a match, 0 on no match</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns non-zero when the attribute contains either a matching integer or
+enum value, or the value falls within one of the rangeOfInteger values for
+the attribute.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippContainsString">ippContainsString</a></h3>
+<p class="description">Determine whether an attribute contains the
+specified string value.</p>
+<p class="code">
+int ippContainsString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *value<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">Attribute</dd>
+<dt>value</dt>
+<dd class="description">String value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on a match, 0 on no match</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns non-zero when the attribute contains a matching charset, keyword,
+language, mimeMediaType, name, text, URI, or URI scheme value.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippCopyAttribute">ippCopyAttribute</a></h3>
<p class="description">Copy an attribute.</p>
<p class="code">
@@ -3392,7 +4140,7 @@ int ippCopyAttributes (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on error</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">Zero or more attributes are copied from the source IPP message, @code@ src, to the
+<p class="discussion">Zero or more attributes are copied from the source IPP message, <code>src</code>, to the
destination IPP message, <code>dst</code>. When <code>quickcopy</code> is non-zero, a &quot;shallow&quot;
reference copy of the attribute is created - this should only be done as long as the
original source IPP message will not be freed for the life of the destination.<br>
@@ -3403,6 +4151,35 @@ attributes that are copied - the function must return 1 to copy the attribute or
itself.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippCreateRequestedArray">ippCreateRequestedArray</a></h3>
+<p class="description">Create a CUPS array of attribute names from the
+given requested-attributes attribute.</p>
+<p class="code">
+cups_array_t *ippCreateRequestedArray (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *request<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>request</dt>
+<dd class="description">IPP request</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS array or <code>NULL</code> if all</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a (sorted) CUPS array of attribute names matching the
+list of &quot;requested-attribute&quot; values supplied in an IPP request. All IANA-
+registered values are supported in addition to the CUPS IPP extension
+attributes.<br>
+<br>
+The <code>request</code> parameter specifies the request message that was read from
+the client.
+
+<code>NULL</code> is returned if all attributes should be returned. Otherwise, the
+result is a sorted array of attribute names, where <code>cupsArrayFind(array,
+"attribute-name")</code> will return a non-NULL pointer. The array must be freed
+using the <code>cupsArrayDelete</code> function.
+
+</p>
<h3 class="function"><a name="ippDateToTime">ippDateToTime</a></h3>
<p class="description">Convert from RFC 1903 Date/Time format to UNIX time
in seconds.</p>
@@ -3550,6 +4327,10 @@ ipp_status_t ippErrorValue (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Matching attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+of attribute and member names separated by slashes, for example
+&quot;media-col/media-size&quot;.</p>
<h3 class="function"><a name="ippFindNextAttribute">ippFindNextAttribute</a></h3>
<p class="description">Find the next named attribute in a request.</p>
<p class="code">
@@ -3569,6 +4350,10 @@ ipp_status_t ippErrorValue (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Matching attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+of attribute and member names separated by slashes, for example
+&quot;media-col/media-size&quot;.</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippFirstAttribute">ippFirstAttribute</a></h3>
<p class="description">Return the first attribute in the message.</p>
<p class="code">
@@ -3597,7 +4382,7 @@ int ippGetBoolean (<br>
<dd class="description">Value number (0-based)</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Boolean value or -1 on error</p>
+<p class="description">Boolean value or 0 on error</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3636,7 +4421,7 @@ int ippGetCount (<br>
<dd class="description">IPP attribute</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of values or -1 on error</p>
+<p class="description">Number of values or 0 on error</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetDate">ippGetDate</a></h3>
<p class="description">Get a date value for an attribute.</p>
<p class="code">
@@ -3686,7 +4471,7 @@ int ippGetInteger (<br>
<dd class="description">Value number (0-based)</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Value or -1 on error</p>
+<p class="description">Value or 0 on error</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3705,6 +4490,30 @@ const char *ippGetName (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Attribute name or <code>NULL</code> for separators</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippGetOctetString">ippGetOctetString</a></h3>
+<p class="description">Get an octetString value from an IPP attribute.</p>
+<p class="code">
+void *ippGetOctetString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int *datalen<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>datalen</dt>
+<dd class="description">Length of octetString data</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Pointer to octetString data</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetOperation">ippGetOperation</a></h3>
<p class="description">Get the operation ID in an IPP message.</p>
<p class="code">
@@ -3717,7 +4526,7 @@ ipp_op_t ippGetOperation (<br>
<dd class="description">IPP request message</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Operation ID or -1 on error</p>
+<p class="description">Operation ID or 0 on error</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetRange">ippGetRange</a></h3>
<p class="description">Get a rangeOfInteger value from an attribute.</p>
<p class="code">
@@ -3736,7 +4545,7 @@ int ippGetRange (<br>
<dd class="description">Upper value of range</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Lower value of range or -1</p>
+<p class="description">Lower value of range or 0</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3754,7 +4563,7 @@ int ippGetRequestId (<br>
<dd class="description">IPP message</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Request ID or -1 on error</p>
+<p class="description">Request ID or 0 on error</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetResolution">ippGetResolution</a></h3>
<p class="description">Get a resolution value for an attribute.</p>
<p class="code">
@@ -3776,7 +4585,7 @@ int ippGetResolution (<br>
<dd class="description">Units for resolution</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Horizontal/cross feed resolution or -1</p>
+<p class="description">Horizontal/cross feed resolution or 0</p>
<h4 class="discussion">Discussion</h4>
<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3859,7 +4668,7 @@ int ippGetVersion (<br>
<dd class="description">Minor version number or <code>NULL</code></dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
-<p class="description">Major version number or -1 on error</p>
+<p class="description">Major version number or 0 on error</p>
<h3 class="function"><a name="ippLength">ippLength</a></h3>
<p class="description">Compute the length of an IPP message.</p>
<p class="code">
@@ -3898,6 +4707,28 @@ attributes-natural-language attributes added. The
attributes-natural-language value is derived from the current locale.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippNewResponse">ippNewResponse</a></h3>
+<p class="description">Allocate a new IPP response message.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *ippNewResponse (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *request<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>request</dt>
+<dd class="description">IPP request message</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">IPP response message</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The new response message is initialized with the same version-number,
+request-id, attributes-charset, and attributes-natural-language as the
+provided request message. If the attributes-charset or
+attributes-natural-language attributes are missing from the request,
+&quot;utf-8&quot; and a value derived from the current locale are substituted,
+respectively.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippNextAttribute">ippNextAttribute</a></h3>
<p class="description">Return the next attribute in the message.</p>
<p class="code">
@@ -4023,8 +4854,8 @@ int ippSetBoolean (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4055,8 +4886,8 @@ int ippSetCollection (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4087,8 +4918,8 @@ int ippSetDate (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4116,8 +4947,8 @@ int ippSetGroupTag (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4151,8 +4982,8 @@ int ippSetInteger (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4180,12 +5011,47 @@ int ippSetName (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippSetOctetString">ippSetOctetString</a></h3>
+<p class="description">Set an octetString value in an IPP attribute.</p>
+<p class="code">
+int ippSetOctetString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> **attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const void *data,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int datalen<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>data</dt>
+<dd class="description">Pointer to octetString data</dd>
+<dt>datalen</dt>
+<dd class="description">Length of octetString data</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+<br>
+The <code>element</code> parameter specifies which value to set from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippSetOperation">ippSetOperation</a></h3>
<p class="description">Set the operation ID in an IPP request message.</p>
<p class="code">
@@ -4203,8 +5069,8 @@ int ippSetOperation (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.
</p>
<h3 class="function"><a name="ippSetPort">ippSetPort</a></h3>
@@ -4244,8 +5110,8 @@ int ippSetRange (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4270,8 +5136,8 @@ int ippSetRequestId (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>request_id</code> parameter must be greater than 0.
@@ -4305,8 +5171,8 @@ int ippSetResolution (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4347,8 +5213,8 @@ int ippSetStatusCode (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippSetString">ippSetString</a></h3>
@@ -4374,8 +5240,8 @@ int ippSetString (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4383,6 +5249,86 @@ The <code>element</code> parameter specifies which value to set from 0 to
<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippSetStringf">ippSetStringf</a></h3>
+<p class="description">Set a formatted string value of an attribute.</p>
+<p class="code">
+int ippSetStringf (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> **attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;...<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>...</dt>
+<dd class="description">Additional arguments as needed</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+<br>
+The <code>element</code> parameter specifies which value to set from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions. Additional arguments follow it as
+needed. The formatted string is truncated as needed to the maximum length of
+the corresponding value type.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippSetStringfv">ippSetStringfv</a></h3>
+<p class="description">Set a formatted string value of an attribute.</p>
+<p class="code">
+int ippSetStringfv (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> **attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;va_list ap<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>ap</dt>
+<dd class="description">Pointer to additional arguments</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+<br>
+The <code>element</code> parameter specifies which value to set from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions. Additional arguments follow it as
+needed. The formatted string is truncated as needed to the maximum length of
+the corresponding value type.
+
+</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippSetValueTag">ippSetValueTag</a></h3>
<p class="description">Set the value tag of an attribute.</p>
<p class="code">
@@ -4403,8 +5349,8 @@ int ippSetValueTag (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The <code>attr</code> parameter may be modified as a result of setting the value.<br>
<br>
@@ -4441,12 +5387,25 @@ int ippSetVersion (<br>
<h4 class="returnvalue">Return Value</h4>
<p class="description">1 on success, 0 on failure</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
<br>
The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.
</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="ippStateString">ippStateString</a></h3>
+<p class="description">Return the name corresponding to a state value.</p>
+<p class="code">
+const char *ippStateString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_state_t">ipp_state_t</a> state<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>state</dt>
+<dd class="description">State value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">State name</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="ippTagString">ippTagString</a></h3>
<p class="description">Return the tag name corresponding to a tag value.</p>
<p class="code">
@@ -4494,6 +5453,44 @@ const <a href="#ipp_uchar_t">ipp_uchar_t</a> *ippTimeToDate (<br>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">RFC-1903 date/time data</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippValidateAttribute">ippValidateAttribute</a></h3>
+<p class="description">Validate the contents of an attribute.</p>
+<p class="code">
+int ippValidateAttribute (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">Attribute</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if valid, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function validates the contents of an attribute based on the name and
+value tag. 1 is returned if the attribute is valid, 0 otherwise. On
+failure, cupsLastErrorString() is set to a human-readable message.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippValidateAttributes">ippValidateAttributes</a></h3>
+<p class="description">Validate all attributes in an IPP message.</p>
+<p class="code">
+int ippValidateAttributes (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if valid, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function validates the contents of the IPP message, including each
+attribute. Like <a href="#ippValidateAttribute"><code>ippValidateAttribute</code></a>, cupsLastErrorString() is set
+to a human-readable message on failure.
+
+</p>
<h3 class="function"><a name="ippWrite">ippWrite</a></h3>
<p class="description">Write data for an IPP message to a HTTP connection.</p>
<p class="code">
@@ -4607,12 +5604,7 @@ typedef enum <a href="#http_keepalive_e">http_keepalive_e</a> http_keepalive_t;
<p class="description">HTTP state values; states
are server-oriented...</p>
<p class="code">
-typedef enum <a href="#http_state_e">http_state_e</a> / http_state_t;
-</p>
-<h3 class="typedef"><a name="http_status_t">http_status_t</a></h3>
-<p class="description">HTTP status codes</p>
-<p class="code">
-typedef enum <a href="#http_status_e">http_status_e</a> http_status_t;
+typedef enum <a href="#http_state_e">http_state_e</a> http_state_t;
</p>
<h3 class="typedef"><a name="http_t">http_t</a></h3>
<p class="description">HTTP connection type</p>
@@ -4624,6 +5616,11 @@ typedef struct _http_s http_t;
<p class="code">
typedef int (*http_timeout_cb_t)(<a href="#http_t">http_t</a> *http, void *user_data);
</p>
+<h3 class="typedef"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="http_trust_t">http_trust_t</a></h3>
+<p class="description">Level of trust for credentials </p>
+<p class="code">
+typedef enum <a href="#http_trust_e">http_trust_e</a> http_trust_t;
+</p>
<h3 class="typedef"><a name="http_uri_coding_t">http_uri_coding_t</a></h3>
<p class="description">URI en/decode flags</p>
<p class="code">
@@ -4657,9 +5654,9 @@ typedef int (*ipp_copycb_t)(void *context, <a href="#ipp_t">ipp_t</a> *dst, <a h
typedef enum <a href="#ipp_dstate_e">ipp_dstate_e</a> ipp_dstate_t;
</p>
<h3 class="typedef"><a name="ipp_finish_t">ipp_finish_t</a></h3>
-<p class="description">Finishings</p>
+<p class="description">Job collation types</p>
<p class="code">
-typedef enum <a href="#ipp_finish_e">ipp_finish_e</a> ipp_finish_t;
+typedef enum <a href="#ipp_finishings_e">ipp_finishings_e</a> ipp_finish_t;
</p>
<h3 class="typedef"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="ipp_iocb_t">ipp_iocb_t</a></h3>
<p class="description">IPP IO Callback Function </p>
@@ -4790,34 +5787,38 @@ with a hostname. </p>
<p class="description">HTTP transfer encoding values</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>HTTP_ENCODE_CHUNKED </dt>
+<dt>HTTP_ENCODING_CHUNKED </dt>
<dd class="description">Data is chunked</dd>
-<dt>HTTP_ENCODE_FIELDS </dt>
+<dt>HTTP_ENCODING_FIELDS </dt>
<dd class="description">Sending HTTP fields</dd>
-<dt>HTTP_ENCODE_LENGTH </dt>
+<dt>HTTP_ENCODING_LENGTH </dt>
<dd class="description">Data is sent with Content-Length</dd>
</dl>
<h3 class="enumeration"><a name="http_encryption_e">http_encryption_e</a></h3>
<p class="description">HTTP encryption values</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>HTTP_ENCRYPT_ALWAYS </dt>
+<dt>HTTP_ENCRYPTION_ALWAYS </dt>
<dd class="description">Always encrypt (SSL)</dd>
-<dt>HTTP_ENCRYPT_IF_REQUESTED </dt>
+<dt>HTTP_ENCRYPTION_IF_REQUESTED </dt>
<dd class="description">Encrypt if requested (TLS upgrade)</dd>
-<dt>HTTP_ENCRYPT_NEVER </dt>
+<dt>HTTP_ENCRYPTION_NEVER </dt>
<dd class="description">Never encrypt</dd>
-<dt>HTTP_ENCRYPT_REQUIRED </dt>
+<dt>HTTP_ENCRYPTION_REQUIRED </dt>
<dd class="description">Encryption is required (TLS upgrade)</dd>
</dl>
<h3 class="enumeration"><a name="http_field_e">http_field_e</a></h3>
<p class="description">HTTP field names</p>
<h4 class="constants">Constants</h4>
<dl>
+<dt>HTTP_FIELD_ACCEPT_ENCODING <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Accepting-Encoding field </dd>
<dt>HTTP_FIELD_ACCEPT_LANGUAGE </dt>
<dd class="description">Accept-Language field</dd>
<dt>HTTP_FIELD_ACCEPT_RANGES </dt>
<dd class="description">Accept-Ranges field</dd>
+<dt>HTTP_FIELD_ALLOW <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Allow field </dd>
<dt>HTTP_FIELD_AUTHORIZATION </dt>
<dd class="description">Authorization field</dd>
<dt>HTTP_FIELD_CONNECTION </dt>
@@ -4862,6 +5863,8 @@ with a hostname. </p>
<dd class="description">Referer field</dd>
<dt>HTTP_FIELD_RETRY_AFTER </dt>
<dd class="description">Retry-After field</dd>
+<dt>HTTP_FIELD_SERVER <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Server field </dd>
<dt>HTTP_FIELD_TRANSFER_ENCODING </dt>
<dd class="description">Transfer-Encoding field</dd>
<dt>HTTP_FIELD_UNKNOWN </dt>
@@ -4887,126 +5890,151 @@ with a hostname. </p>
are server-oriented...</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>HTTP_CLOSE </dt>
-<dd class="description">CLOSE command, waiting for blank line</dd>
-<dt>HTTP_DELETE </dt>
+<dt>HTTP_STATE_CONNECT </dt>
+<dd class="description">CONNECT command, waiting for blank line</dd>
+<dt>HTTP_STATE_DELETE </dt>
<dd class="description">DELETE command, waiting for blank line</dd>
-<dt>HTTP_GET </dt>
+<dt>HTTP_STATE_ERROR </dt>
+<dd class="description">Error on socket</dd>
+<dt>HTTP_STATE_GET </dt>
<dd class="description">GET command, waiting for blank line</dd>
-<dt>HTTP_GET_SEND </dt>
+<dt>HTTP_STATE_GET_SEND </dt>
<dd class="description">GET command, sending data</dd>
-<dt>HTTP_HEAD </dt>
+<dt>HTTP_STATE_HEAD </dt>
<dd class="description">HEAD command, waiting for blank line</dd>
-<dt>HTTP_OPTIONS </dt>
+<dt>HTTP_STATE_OPTIONS </dt>
<dd class="description">OPTIONS command, waiting for blank line</dd>
-<dt>HTTP_POST </dt>
+<dt>HTTP_STATE_POST </dt>
<dd class="description">POST command, waiting for blank line</dd>
-<dt>HTTP_POST_RECV </dt>
+<dt>HTTP_STATE_POST_RECV </dt>
<dd class="description">POST command, receiving data</dd>
-<dt>HTTP_POST_SEND </dt>
+<dt>HTTP_STATE_POST_SEND </dt>
<dd class="description">POST command, sending data</dd>
-<dt>HTTP_PUT </dt>
+<dt>HTTP_STATE_PUT </dt>
<dd class="description">PUT command, waiting for blank line</dd>
-<dt>HTTP_PUT_RECV </dt>
+<dt>HTTP_STATE_PUT_RECV </dt>
<dd class="description">PUT command, receiving data</dd>
-<dt>HTTP_STATUS </dt>
+<dt>HTTP_STATE_STATUS </dt>
<dd class="description">Command complete, sending status</dd>
-<dt>HTTP_TRACE </dt>
+<dt>HTTP_STATE_TRACE </dt>
<dd class="description">TRACE command, waiting for blank line</dd>
-<dt>HTTP_WAITING </dt>
+<dt>HTTP_STATE_UNKNOWN_METHOD <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Unknown request method, waiting for blank line </dd>
+<dt>HTTP_STATE_UNKNOWN_VERSION <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Unknown request method, waiting for blank line </dd>
+<dt>HTTP_STATE_WAITING </dt>
<dd class="description">Waiting for command</dd>
</dl>
<h3 class="enumeration"><a name="http_status_e">http_status_e</a></h3>
<p class="description">HTTP status codes</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>HTTP_ACCEPTED </dt>
+<dt>HTTP_STATUS_ACCEPTED </dt>
<dd class="description">DELETE command was successful</dd>
-<dt>HTTP_AUTHORIZATION_CANCELED <span class="info">&nbsp;CUPS 1.4&nbsp;</span></dt>
-<dd class="description">User canceled authorization </dd>
-<dt>HTTP_BAD_GATEWAY </dt>
+<dt>HTTP_STATUS_BAD_GATEWAY </dt>
<dd class="description">Bad gateway</dd>
-<dt>HTTP_BAD_REQUEST </dt>
+<dt>HTTP_STATUS_BAD_REQUEST </dt>
<dd class="description">Bad request</dd>
-<dt>HTTP_CONFLICT </dt>
+<dt>HTTP_STATUS_CONFLICT </dt>
<dd class="description">Request is self-conflicting</dd>
-<dt>HTTP_CONTINUE </dt>
+<dt>HTTP_STATUS_CONTINUE </dt>
<dd class="description">Everything OK, keep going...</dd>
-<dt>HTTP_CREATED </dt>
+<dt>HTTP_STATUS_CREATED </dt>
<dd class="description">PUT command was successful</dd>
-<dt>HTTP_ERROR </dt>
+<dt>HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED <span class="info">&nbsp;CUPS 1.4&nbsp;</span></dt>
+<dd class="description">User canceled authorization </dd>
+<dt>HTTP_STATUS_CUPS_PKI_ERROR <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
+<dd class="description">Error negotiating a secure connection </dd>
+<dt>HTTP_STATUS_ERROR </dt>
<dd class="description">An error response from httpXxxx()</dd>
-<dt>HTTP_EXPECTATION_FAILED </dt>
+<dt>HTTP_STATUS_EXPECTATION_FAILED </dt>
<dd class="description">The expectation given in an Expect header field was not met</dd>
-<dt>HTTP_FORBIDDEN </dt>
+<dt>HTTP_STATUS_FORBIDDEN </dt>
<dd class="description">Forbidden to access this URI</dd>
-<dt>HTTP_GATEWAY_TIMEOUT </dt>
+<dt>HTTP_STATUS_GATEWAY_TIMEOUT </dt>
<dd class="description">Gateway connection timed out</dd>
-<dt>HTTP_GONE </dt>
+<dt>HTTP_STATUS_GONE </dt>
<dd class="description">Server has gone away</dd>
-<dt>HTTP_LENGTH_REQUIRED </dt>
+<dt>HTTP_STATUS_LENGTH_REQUIRED </dt>
<dd class="description">A content length or encoding is required</dd>
-<dt>HTTP_METHOD_NOT_ALLOWED </dt>
+<dt>HTTP_STATUS_METHOD_NOT_ALLOWED </dt>
<dd class="description">Method is not allowed</dd>
-<dt>HTTP_MOVED_PERMANENTLY </dt>
+<dt>HTTP_STATUS_MOVED_PERMANENTLY </dt>
<dd class="description">Document has moved permanently</dd>
-<dt>HTTP_MOVED_TEMPORARILY </dt>
+<dt>HTTP_STATUS_MOVED_TEMPORARILY </dt>
<dd class="description">Document has moved temporarily</dd>
-<dt>HTTP_MULTIPLE_CHOICES </dt>
+<dt>HTTP_STATUS_MULTIPLE_CHOICES </dt>
<dd class="description">Multiple files match request</dd>
-<dt>HTTP_NOT_ACCEPTABLE </dt>
+<dt>HTTP_STATUS_NONE <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">No Expect value </dd>
+<dt>HTTP_STATUS_NOT_ACCEPTABLE </dt>
<dd class="description">Not Acceptable</dd>
-<dt>HTTP_NOT_AUTHORITATIVE </dt>
+<dt>HTTP_STATUS_NOT_AUTHORITATIVE </dt>
<dd class="description">Information isn't authoritative</dd>
-<dt>HTTP_NOT_FOUND </dt>
+<dt>HTTP_STATUS_NOT_FOUND </dt>
<dd class="description">URI was not found</dd>
-<dt>HTTP_NOT_IMPLEMENTED </dt>
+<dt>HTTP_STATUS_NOT_IMPLEMENTED </dt>
<dd class="description">Feature not implemented</dd>
-<dt>HTTP_NOT_MODIFIED </dt>
+<dt>HTTP_STATUS_NOT_MODIFIED </dt>
<dd class="description">File not modified</dd>
-<dt>HTTP_NOT_SUPPORTED </dt>
+<dt>HTTP_STATUS_NOT_SUPPORTED </dt>
<dd class="description">HTTP version not supported</dd>
-<dt>HTTP_NO_CONTENT </dt>
+<dt>HTTP_STATUS_NO_CONTENT </dt>
<dd class="description">Successful command, no new data</dd>
-<dt>HTTP_OK </dt>
+<dt>HTTP_STATUS_OK </dt>
<dd class="description">OPTIONS/GET/HEAD/POST/TRACE command was successful</dd>
-<dt>HTTP_PARTIAL_CONTENT </dt>
-<dd class="description">Only a partial file was recieved/sent</dd>
-<dt>HTTP_PAYMENT_REQUIRED </dt>
+<dt>HTTP_STATUS_PARTIAL_CONTENT </dt>
+<dd class="description">Only a partial file was received/sent</dd>
+<dt>HTTP_STATUS_PAYMENT_REQUIRED </dt>
<dd class="description">Payment required</dd>
-<dt>HTTP_PKI_ERROR <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
-<dd class="description">Error negotiating a secure connection </dd>
-<dt>HTTP_PRECONDITION </dt>
+<dt>HTTP_STATUS_PRECONDITION </dt>
<dd class="description">Precondition failed</dd>
-<dt>HTTP_PROXY_AUTHENTICATION </dt>
+<dt>HTTP_STATUS_PROXY_AUTHENTICATION </dt>
<dd class="description">Proxy Authentication is Required</dd>
-<dt>HTTP_REQUESTED_RANGE </dt>
+<dt>HTTP_STATUS_REQUESTED_RANGE </dt>
<dd class="description">The requested range is not satisfiable</dd>
-<dt>HTTP_REQUEST_TIMEOUT </dt>
+<dt>HTTP_STATUS_REQUEST_TIMEOUT </dt>
<dd class="description">Request timed out</dd>
-<dt>HTTP_REQUEST_TOO_LARGE </dt>
+<dt>HTTP_STATUS_REQUEST_TOO_LARGE </dt>
<dd class="description">Request entity too large</dd>
-<dt>HTTP_RESET_CONTENT </dt>
+<dt>HTTP_STATUS_RESET_CONTENT </dt>
<dd class="description">Content was reset/recreated</dd>
-<dt>HTTP_SEE_OTHER </dt>
+<dt>HTTP_STATUS_SEE_OTHER </dt>
<dd class="description">See this other link...</dd>
-<dt>HTTP_SERVER_ERROR </dt>
+<dt>HTTP_STATUS_SERVER_ERROR </dt>
<dd class="description">Internal server error</dd>
-<dt>HTTP_SERVICE_UNAVAILABLE </dt>
+<dt>HTTP_STATUS_SERVICE_UNAVAILABLE </dt>
<dd class="description">Service is unavailable</dd>
-<dt>HTTP_SWITCHING_PROTOCOLS </dt>
+<dt>HTTP_STATUS_SWITCHING_PROTOCOLS </dt>
<dd class="description">HTTP upgrade to TLS/SSL</dd>
-<dt>HTTP_UNAUTHORIZED </dt>
+<dt>HTTP_STATUS_UNAUTHORIZED </dt>
<dd class="description">Unauthorized to access host</dd>
-<dt>HTTP_UNSUPPORTED_MEDIATYPE </dt>
+<dt>HTTP_STATUS_UNSUPPORTED_MEDIATYPE </dt>
<dd class="description">The requested media type is unsupported</dd>
-<dt>HTTP_UPGRADE_REQUIRED </dt>
+<dt>HTTP_STATUS_UPGRADE_REQUIRED </dt>
<dd class="description">Upgrade to SSL/TLS required</dd>
-<dt>HTTP_URI_TOO_LONG </dt>
+<dt>HTTP_STATUS_URI_TOO_LONG </dt>
<dd class="description">URI too long</dd>
-<dt>HTTP_USE_PROXY </dt>
+<dt>HTTP_STATUS_USE_PROXY </dt>
<dd class="description">Must use a proxy to access this URI</dd>
</dl>
+<h3 class="enumeration"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="http_trust_e">http_trust_e</a></h3>
+<p class="description">Level of trust for credentials </p>
+<h4 class="constants">Constants</h4>
+<dl>
+<dt>HTTP_TRUST_CHANGED </dt>
+<dd class="description">Credentials have changed</dd>
+<dt>HTTP_TRUST_EXPIRED </dt>
+<dd class="description">Credentials are expired</dd>
+<dt>HTTP_TRUST_INVALID </dt>
+<dd class="description">Credentials are invalid</dd>
+<dt>HTTP_TRUST_OK </dt>
+<dd class="description">Credentials are OK/trusted</dd>
+<dt>HTTP_TRUST_RENEWED </dt>
+<dd class="description">Credentials have been renewed</dd>
+<dt>HTTP_TRUST_UNKNOWN </dt>
+<dd class="description">Credentials are unknown/new</dd>
+</dl>
<h3 class="enumeration"><a name="http_uri_coding_e">http_uri_coding_e</a></h3>
<p class="description">URI en/decode flags</p>
<h4 class="constants">Constants</h4>
@@ -5032,40 +6060,40 @@ are server-oriented...</p>
<p class="description">URI separation status </p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>HTTP_URI_BAD_ARGUMENTS </dt>
+<dt>HTTP_URI_STATUS_BAD_ARGUMENTS </dt>
<dd class="description">Bad arguments to function (error)</dd>
-<dt>HTTP_URI_BAD_HOSTNAME </dt>
+<dt>HTTP_URI_STATUS_BAD_HOSTNAME </dt>
<dd class="description">Bad hostname in URI (error)</dd>
-<dt>HTTP_URI_BAD_PORT </dt>
+<dt>HTTP_URI_STATUS_BAD_PORT </dt>
<dd class="description">Bad port number in URI (error)</dd>
-<dt>HTTP_URI_BAD_RESOURCE </dt>
+<dt>HTTP_URI_STATUS_BAD_RESOURCE </dt>
<dd class="description">Bad resource in URI (error)</dd>
-<dt>HTTP_URI_BAD_SCHEME </dt>
+<dt>HTTP_URI_STATUS_BAD_SCHEME </dt>
<dd class="description">Bad scheme in URI (error)</dd>
-<dt>HTTP_URI_BAD_URI </dt>
+<dt>HTTP_URI_STATUS_BAD_URI </dt>
<dd class="description">Bad/empty URI (error)</dd>
-<dt>HTTP_URI_BAD_USERNAME </dt>
+<dt>HTTP_URI_STATUS_BAD_USERNAME </dt>
<dd class="description">Bad username in URI (error)</dd>
-<dt>HTTP_URI_MISSING_RESOURCE </dt>
+<dt>HTTP_URI_STATUS_MISSING_RESOURCE </dt>
<dd class="description">Missing resource in URI (warning)</dd>
-<dt>HTTP_URI_MISSING_SCHEME </dt>
+<dt>HTTP_URI_STATUS_MISSING_SCHEME </dt>
<dd class="description">Missing scheme in URI (warning)</dd>
-<dt>HTTP_URI_OK </dt>
+<dt>HTTP_URI_STATUS_OK </dt>
<dd class="description">URI decoded OK</dd>
-<dt>HTTP_URI_OVERFLOW </dt>
+<dt>HTTP_URI_STATUS_OVERFLOW </dt>
<dd class="description">URI buffer for httpAssembleURI is too small</dd>
-<dt>HTTP_URI_UNKNOWN_SCHEME </dt>
+<dt>HTTP_URI_STATUS_UNKNOWN_SCHEME </dt>
<dd class="description">Unknown scheme in URI (warning)</dd>
</dl>
<h3 class="enumeration"><a name="http_version_e">http_version_e</a></h3>
<p class="description">HTTP version numbers</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>HTTP_0_9 </dt>
+<dt>HTTP_VERSION_0_9 </dt>
<dd class="description">HTTP/0.9</dd>
-<dt>HTTP_1_0 </dt>
+<dt>HTTP_VERSION_1_0 </dt>
<dd class="description">HTTP/1.0</dd>
-<dt>HTTP_1_1 </dt>
+<dt>HTTP_VERSION_1_1 </dt>
<dd class="description">HTTP/1.1</dd>
</dl>
<h3 class="enumeration"><a name="ipp_dstate_e">ipp_dstate_e</a></h3>
@@ -5073,12 +6101,17 @@ are server-oriented...</p>
<h4 class="constants">Constants</h4>
<dl>
<dt>IPP_DOCUMENT_ABORTED </dt>
+<dd class="description">Document is aborted</dd>
<dt>IPP_DOCUMENT_CANCELED </dt>
+<dd class="description">Document is canceled</dd>
<dt>IPP_DOCUMENT_COMPLETED </dt>
+<dd class="description">Document is completed</dd>
<dt>IPP_DOCUMENT_PENDING </dt>
+<dd class="description">Document is pending</dd>
<dt>IPP_DOCUMENT_PROCESSING </dt>
+<dd class="description">Document is processing</dd>
</dl>
-<h3 class="enumeration"><a name="ipp_finish_e">ipp_finish_e</a></h3>
+<h3 class="enumeration"><a name="ipp_finishings_e">ipp_finishings_e</a></h3>
<p class="description">Finishings</p>
<h4 class="constants">Constants</h4>
<dl>
@@ -5096,8 +6129,64 @@ are server-oriented...</p>
<dd class="description">Bind on top</dd>
<dt>IPP_FINISHINGS_BOOKLET_MAKER </dt>
<dd class="description">Fold to make booklet</dd>
+<dt>IPP_FINISHINGS_COAT </dt>
+<dd class="description">Apply protective liquid or powder coating</dd>
<dt>IPP_FINISHINGS_COVER </dt>
<dd class="description">Add cover</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN </dt>
+<dd class="description">Accordian-fold the paper vertically into four sections</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_HALF </dt>
+<dd class="description">Fold the paper in half vertically</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_HALF_Z </dt>
+<dd class="description">Fold the paper in half horizontally, then Z-fold the paper vertically</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE </dt>
+<dd class="description">Fold the top quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_LETTER </dt>
+<dd class="description">Fold the paper into three sections vertically; sometimes also known as a C fold</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_PARALLEL </dt>
+<dd class="description">Fold the paper in half vertically two times, yielding four sections</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_POSTER </dt>
+<dd class="description">Fold the paper in half horizontally and vertically; sometimes also called a cross fold</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE </dt>
+<dd class="description">Fold the bottom quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_Z </dt>
+<dd class="description">Fold the paper vertically into three sections, forming a Z</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT </dt>
+<dd class="description">Punch 1 hole bottom left</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT </dt>
+<dd class="description">Punch 1 hole bottom right</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM </dt>
+<dd class="description">Punch 2 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT </dt>
+<dd class="description">Punch 2 holes left side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT </dt>
+<dd class="description">Punch 2 holes right side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP </dt>
+<dd class="description">Punch 2 holes top edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM </dt>
+<dd class="description">Punch 4 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT </dt>
+<dd class="description">Punch 4 holes left side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT </dt>
+<dd class="description">Punch 4 holes right side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP </dt>
+<dd class="description">Punch 4 holes top edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT </dt>
+<dd class="description">Punch 1 hole top left</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT </dt>
+<dd class="description">Punch 1 hole top right</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM </dt>
+<dd class="description">Punch 3 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT </dt>
+<dd class="description">Punch 3 holes left side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT </dt>
+<dd class="description">Punch 3 holes right side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP </dt>
+<dd class="description">Punch 3 holes top edge</dd>
<dt>IPP_FINISHINGS_EDGE_STITCH </dt>
<dd class="description">Stitch along any side</dd>
<dt>IPP_FINISHINGS_EDGE_STITCH_BOTTOM </dt>
@@ -5110,12 +6199,68 @@ are server-oriented...</p>
<dd class="description">Stitch along top edge</dd>
<dt>IPP_FINISHINGS_FOLD </dt>
<dd class="description">Fold (any type)</dd>
-<dt>IPP_FINISHINGS_JOB_OFFSET </dt>
+<dt>IPP_FINISHINGS_FOLD_ACCORDIAN </dt>
+<dd class="description">Accordian-fold the paper vertically into four sections</dd>
+<dt>IPP_FINISHINGS_FOLD_DOUBLE_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically</dd>
+<dt>IPP_FINISHINGS_FOLD_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_FOLD_HALF </dt>
+<dd class="description">Fold the paper in half vertically</dd>
+<dt>IPP_FINISHINGS_FOLD_HALF_Z </dt>
+<dd class="description">Fold the paper in half horizontally, then Z-fold the paper vertically</dd>
+<dt>IPP_FINISHINGS_FOLD_LEFT_GATE </dt>
+<dd class="description">Fold the top quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_FOLD_LETTER </dt>
+<dd class="description">Fold the paper into three sections vertically; sometimes also known as a C fold</dd>
+<dt>IPP_FINISHINGS_FOLD_PARALLEL </dt>
+<dd class="description">Fold the paper in half vertically two times, yielding four sections</dd>
+<dt>IPP_FINISHINGS_FOLD_POSTER </dt>
+<dd class="description">Fold the paper in half horizontally and vertically; sometimes also called a cross fold</dd>
+<dt>IPP_FINISHINGS_FOLD_RIGHT_GATE </dt>
+<dd class="description">Fold the bottom quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_FOLD_Z </dt>
+<dd class="description">Fold the paper vertically into three sections, forming a Z</dd>
+<dt>IPP_FINISHINGS_JOG_OFFSET </dt>
<dd class="description">Offset for binding (any type)</dd>
+<dt>IPP_FINISHINGS_LAMINATE </dt>
+<dd class="description">Apply protective (solid) material</dd>
<dt>IPP_FINISHINGS_NONE </dt>
<dd class="description">No finishing</dd>
<dt>IPP_FINISHINGS_PUNCH </dt>
<dd class="description">Punch (any location/count)</dd>
+<dt>IPP_FINISHINGS_PUNCH_BOTTOM_LEFT </dt>
+<dd class="description">Punch 1 hole bottom left</dd>
+<dt>IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT </dt>
+<dd class="description">Punch 1 hole bottom right</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_BOTTOM </dt>
+<dd class="description">Punch 2 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_LEFT </dt>
+<dd class="description">Punch 2 holes left side</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_RIGHT </dt>
+<dd class="description">Punch 2 holes right side</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_TOP </dt>
+<dd class="description">Punch 2 holes top edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_BOTTOM </dt>
+<dd class="description">Punch 4 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_LEFT </dt>
+<dd class="description">Punch 4 holes left side</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_RIGHT </dt>
+<dd class="description">Punch 4 holes right side</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_TOP </dt>
+<dd class="description">Punch 4 holes top edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_TOP_LEFT </dt>
+<dd class="description">Punch 1 hole top left</dd>
+<dt>IPP_FINISHINGS_PUNCH_TOP_RIGHT </dt>
+<dd class="description">Punch 1 hole top right</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM </dt>
+<dd class="description">Punch 3 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_LEFT </dt>
+<dd class="description">Punch 3 holes left side</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT </dt>
+<dd class="description">Punch 3 holes right side</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_TOP </dt>
+<dd class="description">Punch 3 holes top edge</dd>
<dt>IPP_FINISHINGS_SADDLE_STITCH </dt>
<dd class="description">Staple interior</dd>
<dt>IPP_FINISHINGS_STAPLE </dt>
@@ -5136,6 +6281,14 @@ are server-oriented...</p>
<dd class="description">Staple top left corner</dd>
<dt>IPP_FINISHINGS_STAPLE_TOP_RIGHT </dt>
<dd class="description">Staple top right corner</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM </dt>
+<dd class="description">Three staples on bottom</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_LEFT </dt>
+<dd class="description">Three staples on left</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT </dt>
+<dd class="description">Three staples on right</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_TOP </dt>
+<dd class="description">Three staples on top</dd>
<dt>IPP_FINISHINGS_TRIM </dt>
<dd class="description">Trim (any type)</dd>
<dt>IPP_FINISHINGS_TRIM_AFTER_COPIES </dt>
@@ -5151,152 +6304,224 @@ are server-oriented...</p>
<p class="description">Job collation types</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>IPP_JOB_COLLATED_DOCUMENTS </dt>
-<dt>IPP_JOB_UNCOLLATED_DOCUMENTS </dt>
-<dt>IPP_JOB_UNCOLLATED_SHEETS </dt>
+<dt>IPP_JCOLLATE_COLLATED_DOCUMENTS </dt>
+<dt>IPP_JCOLLATE_UNCOLLATED_DOCUMENTS </dt>
+<dt>IPP_JCOLLATE_UNCOLLATED_SHEETS </dt>
</dl>
<h3 class="enumeration"><a name="ipp_jstate_e">ipp_jstate_e</a></h3>
<p class="description">Job states</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>IPP_JOB_ABORTED </dt>
+<dt>IPP_JSTATE_ABORTED </dt>
<dd class="description">Job has aborted due to error</dd>
-<dt>IPP_JOB_CANCELED </dt>
+<dt>IPP_JSTATE_CANCELED </dt>
<dd class="description">Job has been canceled</dd>
-<dt>IPP_JOB_COMPLETED </dt>
+<dt>IPP_JSTATE_COMPLETED </dt>
<dd class="description">Job has completed successfully</dd>
-<dt>IPP_JOB_HELD </dt>
+<dt>IPP_JSTATE_HELD </dt>
<dd class="description">Job is held for printing</dd>
-<dt>IPP_JOB_PENDING </dt>
+<dt>IPP_JSTATE_PENDING </dt>
<dd class="description">Job is waiting to be printed</dd>
-<dt>IPP_JOB_PROCESSING </dt>
+<dt>IPP_JSTATE_PROCESSING </dt>
<dd class="description">Job is currently printing</dd>
-<dt>IPP_JOB_STOPPED </dt>
+<dt>IPP_JSTATE_STOPPED </dt>
<dd class="description">Job has been stopped</dd>
</dl>
<h3 class="enumeration"><a name="ipp_op_e">ipp_op_e</a></h3>
<p class="description">IPP operations</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>CUPS_ACCEPT_JOBS </dt>
+<dt>IPP_OP_ACKNOWLEDGE_DOCUMENT </dt>
+<dd class="description">Acknowledge-Document</dd>
+<dt>IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER </dt>
+<dd class="description">Acknowledge-Identify-Printer</dd>
+<dt>IPP_OP_ACKNOWLEDGE_JOB </dt>
+<dd class="description">Acknowledge-Job</dd>
+<dt>IPP_OP_ACTIVATE_PRINTER </dt>
+<dd class="description">Start a printer</dd>
+<dt>IPP_OP_CANCEL_CURRENT_JOB </dt>
+<dd class="description">Cancel the current job</dd>
+<dt>IPP_OP_CANCEL_DOCUMENT </dt>
+<dd class="description">Cancel-Document</dd>
+<dt>IPP_OP_CANCEL_JOB </dt>
+<dd class="description">Cancel a job</dd>
+<dt>IPP_OP_CANCEL_JOBS </dt>
+<dd class="description">Cancel-Jobs</dd>
+<dt>IPP_OP_CANCEL_MY_JOBS </dt>
+<dd class="description">Cancel-My-Jobs</dd>
+<dt>IPP_OP_CANCEL_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dd class="description">Cancel a subscription </dd>
+<dt>IPP_OP_CLOSE_JOB </dt>
+<dd class="description">Close-Job</dd>
+<dt>IPP_OP_CREATE_JOB </dt>
+<dd class="description">Create an empty print job</dd>
+<dt>IPP_OP_CREATE_JOB_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dd class="description">Create one of more job subscriptions </dd>
+<dt>IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dd class="description">Create one or more printer subscriptions </dd>
+<dt>IPP_OP_CUPS_ACCEPT_JOBS </dt>
<dd class="description">Accept new jobs on a printer</dd>
-<dt>CUPS_ADD_MODIFY_CLASS </dt>
+<dt>IPP_OP_CUPS_ADD_MODIFY_CLASS </dt>
<dd class="description">Add or modify a class</dd>
-<dt>CUPS_ADD_MODIFY_PRINTER </dt>
+<dt>IPP_OP_CUPS_ADD_MODIFY_PRINTER </dt>
<dd class="description">Add or modify a printer</dd>
-<dt>CUPS_AUTHENTICATE_JOB <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_AUTHENTICATE_JOB <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
<dd class="description">Authenticate a job </dd>
-<dt>CUPS_DELETE_CLASS </dt>
+<dt>IPP_OP_CUPS_DELETE_CLASS </dt>
<dd class="description">Delete a class</dd>
-<dt>CUPS_DELETE_PRINTER </dt>
+<dt>IPP_OP_CUPS_DELETE_PRINTER </dt>
<dd class="description">Delete a printer</dd>
-<dt>CUPS_GET_CLASSES <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_GET_CLASSES <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Get a list of classes </dd>
-<dt>CUPS_GET_DEFAULT </dt>
+<dt>IPP_OP_CUPS_GET_DEFAULT </dt>
<dd class="description">Get the default printer</dd>
-<dt>CUPS_GET_DEVICES </dt>
+<dt>IPP_OP_CUPS_GET_DEVICES </dt>
<dd class="description">Get a list of supported devices</dd>
-<dt>CUPS_GET_DOCUMENT <span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_GET_DOCUMENT <span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span></dt>
<dd class="description">Get a document file </dd>
-<dt>CUPS_GET_PPD <span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_GET_PPD <span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span></dt>
<dd class="description">Get a PPD file </dd>
-<dt>CUPS_GET_PPDS </dt>
+<dt>IPP_OP_CUPS_GET_PPDS </dt>
<dd class="description">Get a list of supported drivers</dd>
-<dt>CUPS_GET_PRINTERS </dt>
+<dt>IPP_OP_CUPS_GET_PRINTERS </dt>
<dd class="description">Get a list of printers and/or classes</dd>
-<dt>CUPS_MOVE_JOB </dt>
+<dt>IPP_OP_CUPS_INVALID </dt>
+<dd class="description">Invalid operation name for <a href="#ippOpValue"><code>ippOpValue</code></a></dd>
+<dt>IPP_OP_CUPS_MOVE_JOB </dt>
<dd class="description">Move a job to a different printer</dd>
-<dt>CUPS_REJECT_JOBS </dt>
+<dt>IPP_OP_CUPS_REJECT_JOBS </dt>
<dd class="description">Reject new jobs on a printer</dd>
-<dt>CUPS_SET_DEFAULT </dt>
+<dt>IPP_OP_CUPS_SET_DEFAULT </dt>
<dd class="description">Set the default printer</dd>
-<dt>IPP_CANCEL_JOB </dt>
-<dd class="description">Cancel a job</dd>
-<dt>IPP_CANCEL_JOBS </dt>
-<dd class="description">Cancel-Jobs</dd>
-<dt>IPP_CANCEL_MY_JOBS </dt>
-<dd class="description">Cancel-My-Jobs</dd>
-<dt>IPP_CANCEL_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
-<dd class="description">Cancel a subscription </dd>
-<dt>IPP_CLOSE_JOB </dt>
-<dd class="description">Close-Job</dd>
-<dt>IPP_CREATE_JOB </dt>
-<dd class="description">Create an empty print job</dd>
-<dt>IPP_CREATE_JOB_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
-<dd class="description">Create a job subscription </dd>
-<dt>IPP_CREATE_PRINTER_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
-<dd class="description">Create a printer subscription </dd>
-<dt>IPP_DISABLE_PRINTER </dt>
+<dt>IPP_OP_DEACTIVATE_PRINTER </dt>
<dd class="description">Stop a printer</dd>
-<dt>IPP_ENABLE_PRINTER </dt>
+<dt>IPP_OP_DELETE_DOCUMENT </dt>
+<dd class="description">Delete-Document</dd>
+<dt>IPP_OP_DEREGISTER_OUTPUT_DEVICE </dt>
+<dd class="description">Deregister-Output-Device</dd>
+<dt>IPP_OP_DISABLE_PRINTER </dt>
+<dd class="description">Stop a printer</dd>
+<dt>IPP_OP_ENABLE_PRINTER </dt>
<dd class="description">Start a printer</dd>
-<dt>IPP_GET_JOBS </dt>
+<dt>IPP_OP_FETCH_DOCUMENT </dt>
+<dd class="description">Fetch-Document</dd>
+<dt>IPP_OP_FETCH_JOB </dt>
+<dd class="description">Fetch-Job</dd>
+<dt>IPP_OP_GET_DOCUMENTS </dt>
+<dd class="description">Get-Documents</dd>
+<dt>IPP_OP_GET_DOCUMENT_ATTRIBUTES </dt>
+<dd class="description">Get-Document-Attributes</dd>
+<dt>IPP_OP_GET_JOBS </dt>
<dd class="description">Get a list of jobs</dd>
-<dt>IPP_GET_JOB_ATTRIBUTES </dt>
+<dt>IPP_OP_GET_JOB_ATTRIBUTES </dt>
<dd class="description">Get job attributes</dd>
-<dt>IPP_GET_NOTIFICATIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_GET_NEXT_DOCUMENT_DATA </dt>
+<dd class="description">Get-Next-Document-Data</dd>
+<dt>IPP_OP_GET_NOTIFICATIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
<dd class="description">Get notification events </dd>
-<dt>IPP_GET_PRINTER_ATTRIBUTES </dt>
+<dt>IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES </dt>
+<dd class="description">Get-Output-Device-Attributes</dd>
+<dt>IPP_OP_GET_PRINTER_ATTRIBUTES </dt>
<dd class="description">Get printer attributes</dd>
-<dt>IPP_GET_PRINTER_SUPPORTED_VALUES </dt>
+<dt>IPP_OP_GET_PRINTER_SUPPORTED_VALUES </dt>
<dd class="description">Get supported attribute values</dd>
-<dt>IPP_GET_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_GET_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
<dd class="description">Get list of subscriptions </dd>
-<dt>IPP_GET_SUBSCRIPTION_ATTRIBUTES <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
<dd class="description">Get subscription attributes </dd>
-<dt>IPP_HOLD_JOB </dt>
+<dt>IPP_OP_HOLD_JOB </dt>
<dd class="description">Hold a job for printing</dd>
-<dt>IPP_IDENTIFY_PRINTER </dt>
-<dd class="description">Identify-Printer (proposed IPP JPS3)</dd>
-<dt>IPP_OP_CUPS_INVALID </dt>
-<dd class="description">Invalid operation name for <a href="#ippOpValue"><code>ippOpValue</code></a></dd>
-<dt>IPP_PAUSE_PRINTER </dt>
+<dt>IPP_OP_HOLD_NEW_JOBS </dt>
+<dd class="description">Hold new jobs</dd>
+<dt>IPP_OP_IDENTIFY_PRINTER </dt>
+<dd class="description">Identify-Printer</dd>
+<dt>IPP_OP_PAUSE_PRINTER </dt>
<dd class="description">Stop a printer</dd>
-<dt>IPP_PRINT_JOB </dt>
+<dt>IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB </dt>
+<dd class="description">Stop printer after the current job</dd>
+<dt>IPP_OP_PRINT_JOB </dt>
<dd class="description">Print a single file</dd>
-<dt>IPP_PURGE_JOBS </dt>
+<dt>IPP_OP_PRINT_URI </dt>
+<dd class="description">Print a single URL</dd>
+<dt>IPP_OP_PROMOTE_JOB </dt>
+<dd class="description">Promote a job to print sooner</dd>
+<dt>IPP_OP_PURGE_JOBS </dt>
<dd class="description">Cancel all jobs</dd>
-<dt>IPP_RELEASE_JOB </dt>
+<dt>IPP_OP_RELEASE_HELD_NEW_JOBS </dt>
+<dd class="description">Release new jobs</dd>
+<dt>IPP_OP_RELEASE_JOB </dt>
<dd class="description">Release a job for printing</dd>
-<dt>IPP_RENEW_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_RENEW_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
<dd class="description">Renew a printer subscription </dd>
-<dt>IPP_RESTART_JOB </dt>
+<dt>IPP_OP_REPROCESS_JOB </dt>
<dd class="description">Reprint a job</dd>
-<dt>IPP_RESUBMIT_JOB </dt>
+<dt>IPP_OP_RESTART_JOB </dt>
+<dd class="description">Reprint a job</dd>
+<dt>IPP_OP_RESTART_PRINTER </dt>
+<dd class="description">Restart a printer</dd>
+<dt>IPP_OP_RESUBMIT_JOB </dt>
<dd class="description">Resubmit-Job</dd>
-<dt>IPP_RESUME_PRINTER </dt>
+<dt>IPP_OP_RESUME_JOB </dt>
+<dd class="description">Resume the current job</dd>
+<dt>IPP_OP_RESUME_PRINTER </dt>
<dd class="description">Start a printer</dd>
-<dt>IPP_SEND_DOCUMENT </dt>
+<dt>IPP_OP_SCHEDULE_JOB_AFTER </dt>
+<dd class="description">Schedule a job to print after another</dd>
+<dt>IPP_OP_SEND_DOCUMENT </dt>
<dd class="description">Add a file to a job</dd>
-<dt>IPP_SET_JOB_ATTRIBUTES </dt>
+<dt>IPP_OP_SEND_HARDCOPY_DOCUMENT </dt>
+<dd class="description">Send-Hardcopy-Document</dd>
+<dt>IPP_OP_SEND_URI </dt>
+<dd class="description">Add a URL to a job</dd>
+<dt>IPP_OP_SET_DOCUMENT_ATTRIBUTES </dt>
+<dd class="description">Set-Document-Attributes</dd>
+<dt>IPP_OP_SET_JOB_ATTRIBUTES </dt>
<dd class="description">Set job attributes</dd>
-<dt>IPP_VALIDATE_DOCUMENT </dt>
-<dd class="description">Validate-Document (proposed IPP JPS3)</dd>
-<dt>IPP_VALIDATE_JOB </dt>
+<dt>IPP_OP_SET_PRINTER_ATTRIBUTES </dt>
+<dd class="description">Set printer attributes</dd>
+<dt>IPP_OP_SHUTDOWN_PRINTER </dt>
+<dd class="description">Turn a printer off</dd>
+<dt>IPP_OP_STARTUP_PRINTER </dt>
+<dd class="description">Turn a printer on</dd>
+<dt>IPP_OP_SUSPEND_CURRENT_JOB </dt>
+<dd class="description">Suspend the current job</dd>
+<dt>IPP_OP_UPDATE_ACTIVE_JOBS </dt>
+<dd class="description">Update-Active-Jobs</dd>
+<dt>IPP_OP_UPDATE_DOCUMENT_STATUS </dt>
+<dd class="description">Update-Document-Status</dd>
+<dt>IPP_OP_UPDATE_JOB_STATUS </dt>
+<dd class="description">Update-Job-Status</dd>
+<dt>IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES </dt>
+<dd class="description">Update-Output-Device-Attributes</dd>
+<dt>IPP_OP_VALIDATE_DOCUMENT </dt>
+<dd class="description">Validate-Document</dd>
+<dt>IPP_OP_VALIDATE_JOB </dt>
<dd class="description">Validate job options</dd>
</dl>
<h3 class="enumeration"><a name="ipp_orient_e">ipp_orient_e</a></h3>
<p class="description">Orientation values</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>IPP_LANDSCAPE </dt>
+<dt>IPP_ORIENT_LANDSCAPE </dt>
<dd class="description">90 degrees counter-clockwise</dd>
-<dt>IPP_PORTRAIT </dt>
+<dt>IPP_ORIENT_NONE </dt>
+<dd class="description">No rotation</dd>
+<dt>IPP_ORIENT_PORTRAIT </dt>
<dd class="description">No rotation</dd>
-<dt>IPP_REVERSE_LANDSCAPE </dt>
+<dt>IPP_ORIENT_REVERSE_LANDSCAPE </dt>
<dd class="description">90 degrees clockwise</dd>
-<dt>IPP_REVERSE_PORTRAIT </dt>
+<dt>IPP_ORIENT_REVERSE_PORTRAIT </dt>
<dd class="description">180 degrees</dd>
</dl>
<h3 class="enumeration"><a name="ipp_pstate_e">ipp_pstate_e</a></h3>
<p class="description">Printer states</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>IPP_PRINTER_IDLE </dt>
+<dt>IPP_PSTATE_IDLE </dt>
<dd class="description">Printer is idle</dd>
-<dt>IPP_PRINTER_PROCESSING </dt>
+<dt>IPP_PSTATE_PROCESSING </dt>
<dd class="description">Printer is working</dd>
-<dt>IPP_PRINTER_STOPPED </dt>
+<dt>IPP_PSTATE_STOPPED </dt>
<dd class="description">Printer is stopped</dd>
</dl>
<h3 class="enumeration"><a name="ipp_quality_e">ipp_quality_e</a></h3>
@@ -5323,121 +6548,137 @@ are server-oriented...</p>
<p class="description">IPP states</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>IPP_ATTRIBUTE </dt>
+<dt>IPP_STATE_ATTRIBUTE </dt>
<dd class="description">One or more attributes need to be sent/received</dd>
-<dt>IPP_DATA </dt>
+<dt>IPP_STATE_DATA </dt>
<dd class="description">IPP request data needs to be sent/received</dd>
-<dt>IPP_ERROR </dt>
+<dt>IPP_STATE_ERROR </dt>
<dd class="description">An error occurred</dd>
-<dt>IPP_HEADER </dt>
+<dt>IPP_STATE_HEADER </dt>
<dd class="description">The request header needs to be sent/received</dd>
-<dt>IPP_IDLE </dt>
+<dt>IPP_STATE_IDLE </dt>
<dd class="description">Nothing is happening/request completed</dd>
</dl>
<h3 class="enumeration"><a name="ipp_status_e">ipp_status_e</a></h3>
<p class="description">IPP status codes</p>
<h4 class="constants">Constants</h4>
<dl>
-<dt>CUPS_SEE_OTHER </dt>
+<dt>IPP_STATUS_CUPS_INVALID </dt>
+<dd class="description">Invalid status name for <a href="#ippErrorValue"><code>ippErrorValue</code></a></dd>
+<dt>IPP_STATUS_CUPS_SEE_OTHER </dt>
<dd class="description">cups-see-other</dd>
-<dt>IPP_ATTRIBUTES </dt>
-<dd class="description">client-error-attributes-or-values-not-supported</dd>
-<dt>IPP_ATTRIBUTES_NOT_SETTABLE </dt>
+<dt>IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED </dt>
+<dd class="description">client-error-account-authorization-failed</dd>
+<dt>IPP_STATUS_ERROR_ACCOUNT_CLOSED </dt>
+<dd class="description">client-error-account-closed</dd>
+<dt>IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED </dt>
+<dd class="description">client-error-account-info-needed</dd>
+<dt>IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED </dt>
+<dd class="description">client-error-account-limit-reached</dd>
+<dt>IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE </dt>
<dd class="description">client-error-attributes-not-settable</dd>
-<dt>IPP_AUTHENTICATION_CANCELED <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
-<dd class="description">Authentication canceled by user </dd>
-<dt>IPP_BAD_REQUEST </dt>
+<dt>IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES </dt>
+<dd class="description">client-error-attributes-or-values-not-supported</dd>
+<dt>IPP_STATUS_ERROR_BAD_REQUEST </dt>
<dd class="description">client-error-bad-request</dd>
-<dt>IPP_CHARSET </dt>
+<dt>IPP_STATUS_ERROR_BUSY </dt>
+<dd class="description">server-error-busy</dd>
+<dt>IPP_STATUS_ERROR_CHARSET </dt>
<dd class="description">client-error-charset-not-supported</dd>
-<dt>IPP_COMPRESSION_ERROR </dt>
+<dt>IPP_STATUS_ERROR_COMPRESSION_ERROR </dt>
<dd class="description">client-error-compression-error</dd>
-<dt>IPP_COMPRESSION_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED </dt>
<dd class="description">client-error-compression-not-supported</dd>
-<dt>IPP_CONFLICT </dt>
+<dt>IPP_STATUS_ERROR_CONFLICTING </dt>
<dd class="description">client-error-conflicting-attributes</dd>
-<dt>IPP_DEVICE_ERROR </dt>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dd class="description">cups-error-account-authorization-failed </dd>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED </dt>
+<dd class="description">cups-error-account-closed @deprecate@</dd>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dd class="description">cups-error-account-info-needed </dd>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dd class="description">cups-error-account-limit-reached </dd>
+<dt>IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
+<dd class="description">cups-authentication-canceled - Authentication canceled by user </dd>
+<dt>IPP_STATUS_ERROR_CUPS_PKI <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
+<dd class="description">cups-pki-error - Error negotiating a secure connection </dd>
+<dt>IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED </dt>
+<dd class="description">cups-upgrade-required - TLS upgrade required</dd>
+<dt>IPP_STATUS_ERROR_DEVICE </dt>
<dd class="description">server-error-device-error</dd>
-<dt>IPP_DOCUMENT_ACCESS_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_ACCESS </dt>
<dd class="description">client-error-document-access-error</dd>
-<dt>IPP_DOCUMENT_FORMAT </dt>
-<dd class="description">client-error-document-format-not-supported</dd>
-<dt>IPP_DOCUMENT_FORMAT_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR </dt>
<dd class="description">client-error-document-format-error</dd>
-<dt>IPP_DOCUMENT_PASSWORD_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED </dt>
+<dd class="description">client-error-document-format-not-supported</dd>
+<dt>IPP_STATUS_ERROR_DOCUMENT_PASSWORD </dt>
<dd class="description">client-error-document-password-error</dd>
-<dt>IPP_DOCUMENT_PERMISSION_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_PERMISSION </dt>
<dd class="description">client-error-document-permission-error</dd>
-<dt>IPP_DOCUMENT_SECURITY_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_SECURITY </dt>
<dd class="description">client-error-document-security-error</dd>
-<dt>IPP_DOCUMENT_UNPRINTABLE_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE </dt>
<dd class="description">client-error-document-unprintable-error</dd>
-<dt>IPP_ERROR_JOB_CANCELED </dt>
-<dd class="description">server-error-job-canceled</dd>
-<dt>IPP_FORBIDDEN </dt>
+<dt>IPP_STATUS_ERROR_FORBIDDEN </dt>
<dd class="description">client-error-forbidden</dd>
-<dt>IPP_GONE </dt>
+<dt>IPP_STATUS_ERROR_GONE </dt>
<dd class="description">client-error-gone</dd>
-<dt>IPP_IGNORED_ALL_SUBSCRIPTIONS </dt>
+<dt>IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS </dt>
<dd class="description">client-error-ignored-all-subscriptions</dd>
-<dt>IPP_INTERNAL_ERROR </dt>
+<dt>IPP_STATUS_ERROR_INTERNAL </dt>
<dd class="description">server-error-internal-error</dd>
-<dt>IPP_MULTIPLE_JOBS_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_JOB_CANCELED </dt>
+<dd class="description">server-error-job-canceled</dd>
+<dt>IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED </dt>
<dd class="description">server-error-multiple-document-jobs-not-supported</dd>
-<dt>IPP_NOT_ACCEPTING </dt>
+<dt>IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS </dt>
<dd class="description">server-error-not-accepting-jobs</dd>
-<dt>IPP_NOT_AUTHENTICATED </dt>
+<dt>IPP_STATUS_ERROR_NOT_AUTHENTICATED </dt>
<dd class="description">client-error-not-authenticated</dd>
-<dt>IPP_NOT_AUTHORIZED </dt>
+<dt>IPP_STATUS_ERROR_NOT_AUTHORIZED </dt>
<dd class="description">client-error-not-authorized</dd>
-<dt>IPP_NOT_FOUND </dt>
+<dt>IPP_STATUS_ERROR_NOT_FOUND </dt>
<dd class="description">client-error-not-found</dd>
-<dt>IPP_NOT_POSSIBLE </dt>
+<dt>IPP_STATUS_ERROR_NOT_POSSIBLE </dt>
<dd class="description">client-error-not-possible</dd>
-<dt>IPP_OK </dt>
-<dd class="description">successful-ok</dd>
-<dt>IPP_OK_CONFLICT </dt>
-<dd class="description">successful-ok-conflicting-attributes</dd>
-<dt>IPP_OK_EVENTS_COMPLETE </dt>
-<dd class="description">successful-ok-events-complete</dd>
-<dt>IPP_OK_IGNORED_SUBSCRIPTIONS </dt>
-<dd class="description">successful-ok-ignored-subscriptions</dd>
-<dt>IPP_OK_SUBST </dt>
-<dd class="description">successful-ok-ignored-or-substituted-attributes</dd>
-<dt>IPP_OK_TOO_MANY_EVENTS </dt>
-<dd class="description">successful-ok-too-many-events</dd>
-<dt>IPP_OPERATION_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED </dt>
<dd class="description">server-error-operation-not-supported</dd>
-<dt>IPP_PKI_ERROR <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
-<dd class="description">Error negotiating a secure connection </dd>
-<dt>IPP_PRINTER_BUSY </dt>
-<dd class="description">server-error-busy</dd>
-<dt>IPP_PRINTER_IS_DEACTIVATED </dt>
+<dt>IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED </dt>
<dd class="description">server-error-printer-is-deactivated</dd>
-<dt>IPP_REQUEST_ENTITY </dt>
+<dt>IPP_STATUS_ERROR_REQUEST_ENTITY </dt>
<dd class="description">client-error-request-entity-too-large</dd>
-<dt>IPP_REQUEST_VALUE </dt>
+<dt>IPP_STATUS_ERROR_REQUEST_VALUE </dt>
<dd class="description">client-error-request-value-too-long</dd>
-<dt>IPP_SERVICE_UNAVAILABLE </dt>
+<dt>IPP_STATUS_ERROR_SERVICE_UNAVAILABLE </dt>
<dd class="description">server-error-service-unavailable</dd>
-<dt>IPP_STATUS_CUPS_INVALID </dt>
-<dd class="description">Invalid status name for <a href="#ippErrorValue"><code>ippErrorValue</code></a></dd>
-<dt>IPP_TEMPORARY_ERROR </dt>
+<dt>IPP_STATUS_ERROR_TEMPORARY </dt>
<dd class="description">server-error-temporary-error</dd>
-<dt>IPP_TIMEOUT </dt>
+<dt>IPP_STATUS_ERROR_TIMEOUT </dt>
<dd class="description">client-error-timeout</dd>
-<dt>IPP_TOO_MANY_DOCUMENTS </dt>
+<dt>IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS </dt>
<dd class="description">server-error-too-many-documents</dd>
-<dt>IPP_TOO_MANY_JOBS </dt>
+<dt>IPP_STATUS_ERROR_TOO_MANY_JOBS </dt>
<dd class="description">server-error-too-many-jobs</dd>
-<dt>IPP_TOO_MANY_SUBSCRIPTIONS </dt>
+<dt>IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS </dt>
<dd class="description">client-error-too-many-subscriptions</dd>
-<dt>IPP_UPGRADE_REQUIRED </dt>
-<dd class="description">TLS upgrade required</dd>
-<dt>IPP_URI_SCHEME </dt>
+<dt>IPP_STATUS_ERROR_URI_SCHEME </dt>
<dd class="description">client-error-uri-scheme-not-supported</dd>
-<dt>IPP_VERSION_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED </dt>
<dd class="description">server-error-version-not-supported</dd>
+<dt>IPP_STATUS_OK </dt>
+<dd class="description">successful-ok</dd>
+<dt>IPP_STATUS_OK_CONFLICTING </dt>
+<dd class="description">successful-ok-conflicting-attributes</dd>
+<dt>IPP_STATUS_OK_EVENTS_COMPLETE </dt>
+<dd class="description">successful-ok-events-complete</dd>
+<dt>IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED </dt>
+<dd class="description">successful-ok-ignored-or-substituted-attributes</dd>
+<dt>IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS </dt>
+<dd class="description">successful-ok-ignored-subscriptions</dd>
+<dt>IPP_STATUS_OK_TOO_MANY_EVENTS </dt>
+<dd class="description">successful-ok-too-many-events</dd>
</dl>
<h3 class="enumeration"><a name="ipp_tag_e">ipp_tag_e</a></h3>
<p class="description">Format tags for attributes</p>
diff --git a/doc/help/api-mime.html b/doc/help/api-mime.html
index 2269927..d957342 100644
--- a/doc/help/api-mime.html
+++ b/doc/help/api-mime.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/api-overview.html b/doc/help/api-overview.html
index a310f6e..01a0414 100644
--- a/doc/help/api-overview.html
+++ b/doc/help/api-overview.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/api-ppd.html b/doc/help/api-ppd.html
index 6530d4b..df8f7a9 100644
--- a/doc/help/api-ppd.html
+++ b/doc/help/api-ppd.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
@@ -404,7 +416,7 @@ marked option choices.">ppdConflicts</a></li>
<li><a href="#ppdEmitJCL" title="Emit code for JCL options to a file.">ppdEmitJCL</a></li>
<li><a href="#ppdEmitJCLEnd" title="Emit JCLEnd code to a file.">ppdEmitJCLEnd</a></li>
<li><a href="#ppdEmitString" title="Get a string containing the code for marked options.">ppdEmitString</a></li>
- <li><a href="#ppdErrorString" title="Returns the text assocated with a status.">ppdErrorString</a></li>
+ <li><a href="#ppdErrorString" title="Returns the text associated with a status.">ppdErrorString</a></li>
<li><a href="#ppdFindAttr" title="Find the first matching attribute.">ppdFindAttr</a></li>
<li><a href="#ppdFindChoice" title="Return a pointer to an option choice.">ppdFindChoice</a></li>
<li><a href="#ppdFindCustomOption" title="Find a custom option.">ppdFindCustomOption</a></li>
@@ -1039,7 +1051,7 @@ The return string is allocated on the heap and should be freed using
</p>
<h3 class="function"><span class="info">&nbsp;CUPS 1.1.19/OS X 10.3&nbsp;</span><a name="ppdErrorString">ppdErrorString</a></h3>
-<p class="description">Returns the text assocated with a status.</p>
+<p class="description">Returns the text associated with a status.</p>
<p class="code">
const char *ppdErrorString (<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ppd_status_t">ppd_status_t</a> status<br>
diff --git a/doc/help/api-ppdc.html b/doc/help/api-ppdc.html
index 484288e..df32135 100644
--- a/doc/help/api-ppdc.html
+++ b/doc/help/api-ppdc.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/api-raster.html b/doc/help/api-raster.html
index f2dade4..9acda47 100644
--- a/doc/help/api-raster.html
+++ b/doc/help/api-raster.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/cgi.html b/doc/help/cgi.html
index c50a2a5..34c6deb 100644
--- a/doc/help/cgi.html
+++ b/doc/help/cgi.html
@@ -63,8 +63,7 @@ application/x-httpd-php php
application/x-httpd-python py
</PRE>
-<P>CGI scripts/programs (application/x-httpd-cgi) also must have execution
-permissions to be treated as a CGI script or program.</P>
+<P>CGI scripts/programs (application/x-httpd-cgi) also must be owned by root, have execution permissions, and not have world or group write permissions to be treated as a CGI script or program.</P>
<H2><A NAME="LIMITS">Limitations</A></H2>
@@ -75,10 +74,7 @@ following exceptions:</P>
<LI>No PATH_INFO or PATH_TRANSLATED support</LI>
- <LI>Limited HTTP field support; only the Content-Length
- (CONTENT_LENGTH), Cookie (HTTP_COOKIE), and User-Agent
- (HTTP_USER_AGENT) fields are placed in environment
- variables at this time</LI>
+ <LI>Limited HTTP field support; only the Content-Length (CONTENT_LENGTH), Content-Type (CONTENT_TYPE), Cookie (HTTP_COOKIE), Referrer (HTTP_REFERRER), and User-Agent (HTTP_USER_AGENT) fields are placed in environment variables at this time</LI>
</UL>
diff --git a/doc/help/glossary.html b/doc/help/glossary.html
index c6898dc..6bd6137 100644
--- a/doc/help/glossary.html
+++ b/doc/help/glossary.html
@@ -66,9 +66,6 @@
<DL>
- <DT>HP-GL
- <DD>Hewlett-Packard Graphics Language
-
<DT>HP-PCL
<DD>Hewlett-Packard Page Control Language
@@ -161,6 +158,9 @@
<DT>PPD
<DD>PostScript Printer Description
+ <DT>PWG
+ <DD>Printer Working Group
+
</DL>
@@ -168,9 +168,6 @@
<DL>
- <DT>SCSI
- <DD>Small Computer Systems Interface
-
<DT>serial
<DD>Sending or receiving data 1 bit at a time
diff --git a/doc/help/kerberos.html b/doc/help/kerberos.html
index 30fb533..d6c208c 100644
--- a/doc/help/kerberos.html
+++ b/doc/help/kerberos.html
@@ -32,8 +32,6 @@ DNS server(s).</li>
server(s).</li>
</ol></li>
- <li>A "host" Service Granting Ticket (SGT) for every CUPS server</li>
-
</ol>
@@ -62,7 +60,7 @@ DNS server(s).</li>
<H2 CLASS="title"><A NAME="CUPS">Configuring CUPS to Use Kerberos</A></H2>
-<P>Once youhave configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the <tt>Negotiate</tt> authentication type. The simplest way to do this is using the <tt>cupsctl(8)</tt> command on your server(s):</P>
+<P>Once you have configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the <tt>Negotiate</tt> authentication type. The simplest way to do this is using the <tt>cupsctl(8)</tt> command on your server(s):</P>
<PRE CLASS="command">
<KBD>cupsctl DefaultAuthType=Negotiate</KBD>
@@ -83,7 +81,7 @@ http://server.example.com:631/admin
<P>When doing printing tasks that require authentication, CUPS requests single-use "tickets" from your login session to authenticate who you are. These tickets give CUPS a username of the form "user@REALM", which is then converted to just "user" for purposes of user and group checks.</P>
-<P>In order to support printing to a shared printer, CUPS runs the IPP backend as the owner of the print job so it can obtain the necessary credentials.</P>
+<P>In order to support printing to a shared printer, CUPS runs the IPP backend as the owner of the print job so it can obtain the necessary credentials when the job is de-spooled to the server.</P>
</BODY>
</HTML>
diff --git a/doc/help/license.html b/doc/help/license.html
index 9bbc729..0056621 100644
--- a/doc/help/license.html
+++ b/doc/help/license.html
@@ -8,7 +8,7 @@
<H1 CLASS="title">Software License Agreement</H1>
-<P ALIGN="CENTER">Copyright 2007-2012 by Apple Inc.<BR>
+<P ALIGN="CENTER">Copyright 2007-2013 by Apple Inc.<BR>
1 Infinite Loop<BR>
Cupertino, CA 95014 USA<BR>
<BR>
@@ -16,10 +16,7 @@ WWW: <A HREF="http://www.cups.org/">http://www.cups.org/</A>
<H2 CLASS="title"><A NAME="INTRO">Introduction</A></H2>
-<P>CUPS<SUP>TM</SUP> is provided under the GNU General Public License ("GPL")
-and GNU Library General Public License ("LGPL"), Version 2, with exceptions for
-Apple operating systems and the OpenSSL toolkit. A copy of the exceptions and
-licenses follow this introduction.</P>
+<P>CUPS<SUP>TM</SUP> is provided under the GNU General Public License ("GPL") and GNU Library General Public License ("LGPL"), Version 2, with an exception for Apple operating systems. A copy of the exception and licenses follow this introduction.</P>
<P>The GNU LGPL applies to the CUPS and CUPS Imaging libraries located in the
"cups" and "filter" subdirectories of the CUPS source distribution and the files
@@ -59,7 +56,7 @@ for your application, driver, or filter.</P>
<H2 CLASS="title"><A NAME="EXCEPTIONS">License Exceptions</A></H2>
<P>In addition, as the copyright holder of CUPS, Apple Inc. grants
-the following special exceptions:</P>
+the following special exception:</P>
<OL>
@@ -111,20 +108,9 @@ the following special exceptions:</P>
</OL>
- <LI><B>OpenSSL Toolkit License Exception</B>;
-
- <OL TYPE="a">
-
- <LI>Apple Inc. explicitly allows the
- compilation and distribution of the CUPS
- software with the OpenSSL Toolkit.</LI>
-
- </OL>
-
</OL>
-<P>No developer is required to provide these exceptions in a
-derived work.</P>
+<P>No developer is required to provide this exception in a derived work.</P>
<H2 CLASS="title"><A NAME="KERBEROS">Kerberos Support Code</A></H2>
diff --git a/doc/help/man-backend.html b/doc/help/man-backend.html
new file mode 100644
index 0000000..4ccad79
--- /dev/null
+++ b/doc/help/man-backend.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>backend(7)</title>
+</head>
+<body>
+<h1 class="title">backend(7)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+backend - cups backend transmission interfaces
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>backend</b>
+<br>
+<b>backend</b>
+<i>job</i>
+<i>user</i>
+<i>title</i>
+<i>num-copies</i>
+<i>options</i>
+[
+<i>filename</i>
+]
+<pre class="man">
+
+<b>#include &lt;cups/cups.h></b>
+
+<b>const char *cupsBackendDeviceURI</b>(<b>char **</b><i>argv</i>);
+
+<b>void cupsBackendReport</b>(<b>const char *</b><i>device_scheme</i>,
+ <b>const char *</b><i>device_uri</i>,
+ <b>const char *</b><i>device_make_and_model</i>,
+ <b>const char *</b><i>device_info</i>,
+ <b>const char *</b><i>device_id</i>,
+ <b>const char *</b><i>device_location</i>);
+
+<b>ssize_t cupsBackChannelWrite</b>(<b>const char *</b><i>buffer</i>,
+ <b>size_t </b><i>bytes</i>, <b>double </b><i>timeout</i>);
+
+<b>int cupsSideChannelRead</b>(<b>cups_sc_command_t *</b><i>command</i>,
+ <b>cups_sc_status_t *</b><i>status</i>, <b>char *</b><i>data</i>,
+ <b>int *</b><i>datalen</i>, <b>double </b><i>timeout</i>);
+
+<b>int cupsSideChannelWrite</b>(<b>cups_sc_command_t </b><i>command</i>,
+ <b>cups_sc_status_t </b><i>status</i>, <b>const char *</b><i>data</i>,
+ <b>int </b><i>datalen</i>, <b>double </b><i>timeout</i>);
+</pre>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+Backends are a special type of
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7)</a>
+which is used to send print data to and discover different devices on the system.
+<p>Like filters, backends must be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the physical interface.
+<p>The command name (<i>argv[0]</i>) is set to the device URI of the destination printer. Authentication information in
+<i>argv[0]</i>
+is removed, so backend developers are urged to use the
+<b>DEVICE_URI</b>
+environment variable whenever authentication information is required. The
+<b>cupsBackendDeviceURI</b>()
+function may be used to retrieve the correct device URI.
+<p>Back-channel data from the device should be relayed to the job filters using the <i>cupsBackChannelWrite</i> function.
+<p>Backends are responsible for reading side-channel requests using the
+<b>cupsSideChannelRead</b>()
+function and responding with the
+<b>cupsSideChannelWrite()</b>
+function. The
+<b>CUPS_SC_FD</b>
+constant defines the file descriptor that should be monitored for incoming requests.
+<h3><a name="DEVICE_DISCOVERY">Device Discovery</a></h3>
+When run with no arguments, the backend should list the devices and schemes it supports or is advertising to the standard output. The output consists of zero or more lines consisting of any of the following forms:
+<pre class="man">
+
+ device-class scheme "Unknown" "device-info"
+ device-class device-uri "device-make-and-model" "device-info"
+ device-class device-uri "device-make-and-model" "device-info" "device-id"
+ device-class device-uri "device-make-and-model" "device-info" "device-id" "device-location"
+</pre>
+<p>The
+<b>cupsBackendReport</b>()
+function can be used to generate these lines and handle any necessary escaping of characters in the various strings.
+<p>The
+<i>device-class</i>
+field is one of the following values:
+<dl class="man">
+<dt><b>direct</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a specific direct-access device with no options, such as a parallel, USB, or SCSI device.
+<dt><b>file</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a file on disk.
+<dt><b>network</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a networked device and conforms to the general form for
+network URIs.
+<dt><b>serial</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a serial device with configurable baud rate and other options. If the device-uri contains a baud value, it represents the maximum baud rate supported by the device.
+</dl>
+<p>The
+<i>scheme</i>
+field provides the URI scheme that is supported by the backend. Backends should use this form only when the backend supports any URI using that scheme. The
+<i>device-uri</i>
+field specifies the full URI to use when communicating with the device.
+<p>The
+<i>device-make-and-model</i>
+field specifies the make and model of the device, e.g. "Example Foojet 2000". If the make and model is not known, you must report "Unknown".
+<p>The
+<i>device-info</i>
+field specifies additional information about the device. Typically this includes the make and model along with the port number or network address, e.g. "Example Foojet 2000 USB #1".
+<p>The optional
+<i>device-id</i>
+field specifies the IEEE-1284 device ID string for the device, which is used to select a matching driver.
+<p>The optional
+<i>device-location</i>
+field specifies the physical location of the device, which is often used to pre-populate the printer-location attribute when adding a printer.
+<h3><a name="PERMISSIONS">Permissions</a></h3>
+Backends without world read and execute permissions are run as the root user. Otherwise, the backend is run using an unprivileged user account, typically "lp".
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+The following exit codes are defined for backends:
+<dl class="man">
+<dt><b>CUPS_BACKEND_OK</b>
+<dd style="margin-left: 5.0em">The print file was successfully transmitted to the device or remote server.
+<dt><b>CUPS_BACKEND_FAILED</b>
+<dd style="margin-left: 5.0em"><br>
+The print file was not successfully transmitted to the device or remote server. The scheduler will respond to this by canceling the job, retrying the job, or stopping the queue depending on the state of the
+<i>printer-error-policy</i>
+attribute.
+<dt><b>CUPS_BACKEND_AUTH_REQUIRED</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because valid authentication information is required. The scheduler will respond to this by holding the job and adding the 'cups-held-for-authentication' keyword to the "job-reasons" Job Description attribute.
+<dt><b>CUPS_BACKEND_HOLD</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by holding the job.
+<dt><b>CUPS_BACKEND_STOP</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by stopping the queue.
+<dt><b>CUPS_BACKEND_CANCEL</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because one or more attributes are not supported or the job was canceled at the printer. The scheduler will respond to this by canceling the job.
+<dt><b>CUPS_BACKEND_RETRY</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job at a future time - other jobs may print before this one.
+<dt><b>CUPS_BACKEND_RETRY_CURRENT</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job immediately without allowing intervening jobs.
+</dl>
+<p>All other exit code values are reserved.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+In addition to the environment variables listed in
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1)</a>
+and
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+CUPS backends can expect the following environment variable:
+<dl class="man">
+<dt><b>DEVICE_URI</b>
+<dd style="margin-left: 5.0em">The device URI associated with the printer.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>/etc/cups/cups-files.conf</i>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+CUPS backends are not generally design to be run directly by the user. Aside from the device URI issue (
+<i>argv[0]</i>
+and
+<b>DEVICE_URI</b>
+environment variable contain the device URI), CUPS backends also expect specific environment variables and file descriptors, and typically run in a user session that (on OS X) has additional restrictions that affect how it runs. Backends can also be installed with restricted permissions (0500 or 0700) that tell the scheduler to run them as the "root" user instead of an unprivileged user (typically "lp") on the system.
+<p>Unless you are a developer and know what you are doing, please do not run backends directly. Instead, use the
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1)</a>
+or
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1)</a>
+programs to send print jobs or
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+to query for available printers using the backend. The one exception is the SNMP backend - see
+<a href="man-cups-snmp.html?TOPIC=Man+Pages"><b>cups-snmp</b>(8)</a>
+for more information.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<i>cups</i>(1),
+<i>cups-files.conf</i>(5),
+<i>cups-snmp</i>(8),
+<i>cupsd</i>(8),
+<i>filter</i>(7),
+<i>lp</i>(1),
+<i>lpinfo</i>(8),
+<i>lpr</i>(1),
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cancel.html b/doc/help/man-cancel.html
new file mode 100644
index 0000000..f68f440
--- /dev/null
+++ b/doc/help/man-cancel.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cancel(1)</title>
+</head>
+<body>
+<h1 class="title">cancel(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cancel - cancel jobs
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cancel</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-a</b>
+] [
+<b>-h</b>
+<i>hostname[:port]</i>
+] [
+<b>-u</b>
+<i>username</i>
+] [
+<b>-x</b>
+] [
+<i>id</i>
+] [
+<i>destination</i>
+] [
+<i>destination-id</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cancel</b> command cancels print jobs.
+If no <i>destination</i> or <i>id</i> is specified, the currently printing job on the default destination is canceled.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized by <b>cancel</b>:
+<dl class="man">
+<dt><b>-a</b>
+<dd style="margin-left: 5.0em">Cancel all jobs on the named destination, or all jobs on all
+destinations if none is provided.
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-h </b><i>hostname</i>[<i>:port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the username to use when connecting to the server.
+<dt><b>-u </b><i>username</i>
+<dd style="margin-left: 5.0em">Cancels jobs owned by <i>username</i>.
+<dt><b>-x</b>
+<dd style="margin-left: 5.0em">Deletes job data files in addition to canceling.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are <i>not</i> case-sensitive.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Cancel the current print job:
+<pre class="man">
+
+ cancel
+
+</pre>
+Cancel job "myprinter-42":
+<pre class="man">
+
+ cancel myprinter-42
+
+</pre>
+Cancel all jobs:
+<pre class="man">
+
+ cancel -a
+</pre>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+Administrators wishing to prevent unauthorized cancellation of jobs via the <i>-u</i> option should require authentication for Cancel-Jobs operations in
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5).</a>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpmove.html?TOPIC=Man+Pages"><b>lpmove</b>(8),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-classes.conf.html b/doc/help/man-classes.conf.html
new file mode 100644
index 0000000..a453bbc
--- /dev/null
+++ b/doc/help/man-classes.conf.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>classes.conf(5)</title>
+</head>
+<body>
+<h1 class="title">classes.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+classes.conf - class configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>classes.conf</b> file defines the local printer classes that are available. It is normally located in the <i>/etc/cups</i> directory and is maintained by the
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+program. This file is not intended to be edited or managed manually.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-client.conf.html b/doc/help/man-client.conf.html
new file mode 100644
index 0000000..edf4470
--- /dev/null
+++ b/doc/help/man-client.conf.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>client.conf(5)</title>
+</head>
+<body>
+<h1 class="title">client.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+client.conf - client configuration file for cups (deprecated)
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>client.conf</b> file configures the CUPS client and is normally located in the <i>/etc/cups</i> and/or <i>~/.cups</i> directories.
+Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.
+<p><b>Note:</b> Starting with OS X 10.7, this file is only used by command-line and X11 applications plus the IPP backend.
+The <b>ServerName</b> directive is not supported on OS X at all.
+<h3><a name="DIRECTIVES">Directives</a></h3>
+The following directives are understood by the client. Consult the online help for detailed descriptions:
+<dl class="man">
+<dt><b>AllowAnyRoot Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>AllowAnyRoot No</b>
+<dd style="margin-left: 5.0em">Specifies whether to allow TLS with certificates that have not been signed by a trusted Certificate Authority.
+The default is "Yes".
+<dt><b>AllowExpiredCerts Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>AllowExpiredCerts No</b>
+<dd style="margin-left: 5.0em">Specifies whether to allow TLS with expired certificates.
+The default is "Yes".
+<dt><b>Encryption IfRequested</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Never</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Required</b>
+<dd style="margin-left: 5.0em">Specifies the level of encryption that should be used.
+<dt><b>GSSServiceName </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the Kerberos service name that is used for authentication, typically "host", "http", or "ipp".
+CUPS adds the remote hostname ("name@server.example.com") for you. The default name is "http".
+<dt><b>ServerName </b><i>hostname-or-ip-address</i>[<i>:port</i>]
+<dd style="margin-left: 5.0em"><dt><b>ServerName </b><i>/domain/socket</i>
+<dd style="margin-left: 5.0em">Specifies the address and optionally the port to use when connecting to the server.
+<b>Note: This directive it not supported on OS X 10.7 or later.</b>
+<dt><b>ServerName </b><i>hostname-or-ip-address</i>[<i>:port</i>]<b>/version=1.1</b>
+<dd style="margin-left: 5.0em">Specifies the address and optionally the port to use when connecting to a server running CUPS 1.3.12 and earlier.
+<dt><b>SSLOptions </b>[<i>AllowDH</i>] [<i>AllowRC4</i>] [<i>AllowSSL3</i>] [<i>DenyTLS1.0</i>]
+<dd style="margin-left: 5.0em"><dt><b>SSLOptions None</b>
+<dd style="margin-left: 5.0em">Sets encryption options (only in /etc/cups/client.conf).
+By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites.
+The <i>AllowDH</i> option enables cipher suites using plain Diffie-Hellman key negotiation.
+The <i>AllowRC4</i> option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The <i>AllowSSL3</i> option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+The <i>DenyTLS1.0</i> option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1.
+<dt><b>User </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the default user name to use for requests.
+<dt><b>ValidateCerts Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>ValidateCerts No</b>
+<dd style="margin-left: 5.0em">Specifies whether to only allow TLS with certificates whose common name matches the hostname.
+The default is "No".
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The <b>client.conf</b> file is deprecated and will no longer be supported in a future version of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-config.html b/doc/help/man-cups-config.html
new file mode 100644
index 0000000..705e200
--- /dev/null
+++ b/doc/help/man-cups-config.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cups-config(1)</title>
+</head>
+<body>
+<h1 class="title">cups-config(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups-config - get cups api, compiler, directory, and link information.
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cups-config</b>
+<i>--api-version</i>
+<br>
+<b>cups-config</b>
+<i>--build</i>
+<br>
+<b>cups-config</b>
+<i>--cflags</i>
+<br>
+<b>cups-config</b>
+<i>--datadir</i>
+<br>
+<b>cups-config</b>
+<i>--help</i>
+<br>
+<b>cups-config</b>
+<i>--ldflags</i>
+<br>
+<b>cups-config</b>
+[
+<i>--image</i>
+] [
+<i>--static</i>
+]
+<i>--libs</i>
+<br>
+<b>cups-config</b>
+<i>--serverbin</i>
+<br>
+<b>cups-config</b>
+<i>--serverroot</i>
+<br>
+<b>cups-config</b>
+<i>--version</i>
+<br>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cups-config</b> command allows application developers to determine the necessary command-line options for the compiler and linker, as well as the installation directories for filters, configuration files, and drivers.
+All values are reported to the standard output.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The <b>cups-config</b> command accepts the following command-line options:
+<dl class="man">
+<dt><b>--api-version</b>
+<dd style="margin-left: 5.0em">Reports the current API version (major.minor).
+<dt><b>--build</b>
+<dd style="margin-left: 5.0em">Reports a system-specific build number.
+<dt><b>--cflags</b>
+<dd style="margin-left: 5.0em">Reports the necessary compiler options.
+<dt><b>--datadir</b>
+<dd style="margin-left: 5.0em">Reports the default CUPS data directory.
+<dt><b>--help</b>
+<dd style="margin-left: 5.0em">Reports the program usage message.
+<dt><b>--image</b>
+<dd style="margin-left: 5.0em">When used with <i>--libs</i>, adds the CUPS imaging library to the
+list of libraries.
+<dt><b>--ldflags</b>
+<dd style="margin-left: 5.0em">Reports the necessary linker options.
+<dt><b>--libs</b>
+<dd style="margin-left: 5.0em">Reports the necessary libraries to link to.
+<dt><b>--serverbin</b>
+<dd style="margin-left: 5.0em">Reports the default CUPS binary directory, where filters and backends are stored.
+<dt><b>--serverroot</b>
+<dd style="margin-left: 5.0em">Reports the default CUPS configuration file directory.
+<dt><b>--static</b>
+<dd style="margin-left: 5.0em">When used with <i>--libs</i>, reports the static libraries instead of the default (shared) libraries.
+<dt><b>--version</b>
+<dd style="margin-left: 5.0em">Reports the full version number of the CUPS installation (major.minor.patch).
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Show the currently installed version of CUPS:
+<pre class="man">
+
+ cups-config --version
+
+</pre>
+Compile a simple one-file CUPS filter:
+<pre class="man">
+
+ cc `cups-config --cflags --ldflags` -o filter filter.c \
+ `cups-config --libs`
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-files.conf.html b/doc/help/man-cups-files.conf.html
new file mode 100644
index 0000000..41001b1
--- /dev/null
+++ b/doc/help/man-cups-files.conf.html
@@ -0,0 +1,166 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cups-files.conf(5)</title>
+</head>
+<body>
+<h1 class="title">cups-files.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups-files.conf - file and directory configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cups-files.conf</b> file configures the files and directories used by the CUPS scheduler,
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8).</a>
+It is normally located in the <i>/etc/cups</i> directory.
+<p>Each line in the file can be a configuration directive, a blank line, or a comment.
+Configuration directives typically consist of a name and zero or more values separated by whitespace.
+The configuration directive name and values are case-insensitive.
+Comment lines start with the # character.
+<h3><a name="DIRECTIVES">Directives</a></h3>
+The following directives are understood by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt><a name="AccessLog"></a><b>AccessLog</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLog </b><i>filename</i>
+<dd style="margin-left: 5.0em"><dt><b>AccessLog stderr</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLog syslog</b>
+<dd style="margin-left: 5.0em">Defines the access log filename.
+Specifying a blank filename disables access log generation.
+The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background.
+The value "syslog" causes log entries to be sent to the system log daemon.
+The server name may be included in filenames using the string "%s", for example:
+<pre class="man">
+
+ AccessLog /var/log/cups/%s-access_log
+
+</pre>
+The default is "/var/log/cups/access_log".
+<dt><a name="ConfigFilePerm"></a><b>ConfigFilePerm </b><i>mode</i>
+<dd style="margin-left: 5.0em">Specifies the permissions for all configuration files that the scheduler writes.
+The default is "0644" on OS X and "0640" on all other operating systems.
+</dl>
+<p><b>Note:</b> The permissions for the <i>printers.conf</i> file are currently masked to only allow access from the scheduler user (typically root).
+This is done because printer device URIs sometimes contain sensitive authentication information that should not be generally known on the system.
+There is no way to disable this security feature.
+<dl class="man">
+<dt><a name="DataDir"></a><b>DataDir </b><i>path</i>
+<dd style="margin-left: 5.0em">Specifies the directory where data files can be found.
+The default is usually "/usr/share/cups".
+<dt><a name="DocumentRoot"></a><b>DocumentRoot </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the root directory for the CUPS web interface content.
+The default is usually "/usr/share/doc/cups".
+<dt><a name="ErrorLog"></a><b>ErrorLog</b>
+<dd style="margin-left: 5.0em"><dt><b>ErrorLog </b><i>filename</i>
+<dd style="margin-left: 5.0em"><dt><b>ErrorLog stderr</b>
+<dd style="margin-left: 5.0em"><dt><b>ErrorLog syslog</b>
+<dd style="margin-left: 5.0em">Defines the error log filename.
+Specifying a blank filename disables error log generation.
+The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background.
+The value "syslog" causes log entries to be sent to the system log daemon.
+The server name may be included in filenames using the string "%s", for example:
+<pre class="man">
+
+ ErrorLog /var/log/cups/%s-error_log
+
+</pre>
+The default is "/var/log/cups/error_log".
+<dt><a name="FatalErrors"></a><b>FatalErrors none</b>
+<dd style="margin-left: 5.0em"><dt><b>FatalErrors all </b><i>-kind </i>[ ... <i>-kind </i>]
+<dd style="margin-left: 5.0em"><dt><b>FatalErrors </b><i>kind </i>[ ... <i>kind </i>]
+<dd style="margin-left: 5.0em">Specifies which errors are fatal, causing the scheduler to exit.
+The default is "config".
+The <i>kind</i> strings are:
+<div style="margin-left: 0.0em;">
+<dl class="man">
+<dt><b>none</b>
+<dd style="margin-left: 5.0em">No errors are fatal.
+<dt><b>all</b>
+<dd style="margin-left: 5.0em">All of the errors below are fatal.
+<dt><b>browse</b>
+<dd style="margin-left: 5.0em">Browsing initialization errors are fatal, for example failed connections to the DNS-SD daemon.
+<dt><b>config</b>
+<dd style="margin-left: 5.0em">Configuration file syntax errors are fatal.
+<dt><b>listen</b>
+<dd style="margin-left: 5.0em">Listen or Port errors are fatal, except for IPv6 failures on the loopback or "any" addresses.
+<dt><b>log</b>
+<dd style="margin-left: 5.0em">Log file creation or write errors are fatal.
+<dt><b>permissions</b>
+<dd style="margin-left: 5.0em">Bad startup file permissions are fatal, for example shared TLS certificate and key files with world-read permissions.
+</div>
+<dt><a name="FileDevice"></a><b>FileDevice Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>FileDevice No</b>
+<dd style="margin-left: 5.0em">Specifies whether the file pseudo-device can be used for new printer queues.
+The URI "file:///dev/null" is always allowed.
+<dt><a name="Group"></a><b>Group </b><i>group-name-or-number</i>
+<dd style="margin-left: 5.0em">Specifies the group name or ID that will be used when executing external programs.
+The default group is operating system specific but is usually "lp" or "nobody".
+<dt><a name="LogFilePerm"></a><b>LogFilePerm </b><i>mode</i>
+<dd style="margin-left: 5.0em">Specifies the permissions of all log files that the scheduler writes.
+The default is "0644".
+<dt><a name="PageLog"></a><b>PageLog </b>[ <i>filename</i> ]
+<dd style="margin-left: 5.0em"><dt><b>PageLog stderr</b>
+<dd style="margin-left: 5.0em"><dt><b>PageLog syslog</b>
+<dd style="margin-left: 5.0em">Defines the page log filename.
+The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background.
+The value "syslog" causes log entries to be sent to the system log daemon.
+Specifying a blank filename disables page log generation.
+The server name may be included in filenames using the string "%s", for example:
+<pre class="man">
+
+ PageLog /var/log/cups/%s-page_log
+
+</pre>
+The default is "/var/log/cups/page_log".
+<dt><a name="RemoteRoot"></a><b>RemoteRoot </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the username that is associated with unauthenticated accesses by clients claiming to be the root user.
+The default is "remroot".
+<dt><a name="RequestRoot"></a><b>RequestRoot </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory that contains print jobs and other HTTP request data.
+The default is "/var/spool/cups".
+<dt><a name="Sandboxing"></a><b>Sandboxing relaxed</b>
+<dd style="margin-left: 5.0em"><dt><b>Sandboxing strict</b>
+<dd style="margin-left: 5.0em">Specifies the level of security sandboxing that is applied to print filters, backends, and other child processes of the scheduler.
+The default is "strict".
+This directive is currently only used/supported on OS X.
+<dt><a name="ServerBin"></a><b>ServerBin </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory containing the backends, CGI programs, filters, helper programs, notifiers, and port monitors.
+The default is "/usr/lib/cups" or "/usr/libexec/cups" depending on the platform.
+<dt><a name="ServerKeychain"></a><b>ServerKeychain </b><i>path</i>
+<dd style="margin-left: 5.0em">Specifies the location of TLS certificates and private keys.
+The default is "/Library/Keychains/System.keychain" on OS X and "/etc/cups/ssl" on all other operating systems.
+OS X uses its keychain database to store certificates and keys while other platforms use separate files in the specified directory, *.crt for PEM-encoded certificates and *.key for PEM-encoded private keys.
+<dt><a name="ServerRoot"></a><b>ServerRoot </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory containing the server configuration files.
+The default is "/etc/cups".
+<dt><a name="SyncOnClose"></a><b>SyncOnClose Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>SyncOnClose No</b>
+<dd style="margin-left: 5.0em">Specifies whether the scheduler calls
+<b>fsync</b>(2)
+after writing configuration or state files.
+The default is "No".
+<dt><a name="SystemGroup"></a><b>SystemGroup </b><i>group-name </i>[ ... <i>group-name</i> ]
+<dd style="margin-left: 5.0em">Specifies the group(s) to use for <i>@SYSTEM</i> group authentication.
+The default contains "admin", "lpadmin", "root", "sys", and/or "system".
+<dt><a name="TempDir"></a><b>TempDir </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory where temporary files are stored.
+The default is "/var/spool/cups/tmp".
+<dt><a name="User"></a><b>User </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the user name or ID that is used when running external programs.
+The default is "lp".
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-lpd.html b/doc/help/man-cups-lpd.html
new file mode 100644
index 0000000..697518a
--- /dev/null
+++ b/doc/help/man-cups-lpd.html
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cups-lpd(8)</title>
+</head>
+<body>
+<h1 class="title">cups-lpd(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups-lpd - receive print jobs and report printer status to lpd clients
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cups-lpd</b>
+[
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-n</b>
+] [
+<b>-o</b>
+<i>option=value</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cups-lpd</b>
+is the CUPS Line Printer Daemon ("LPD") mini-server that supports legacy client systems that use the LPD protocol.
+<b>cups-lpd</b>
+does not act as a standalone network daemon but instead operates using any of the Internet "super-servers" such as
+<b>inetd</b>(8),
+<b>launchd</b>(8),
+and
+<b>systemd</b>(8).
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<dl class="man">
+<dt><b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Sets the CUPS server (and port) to use.
+<dt><b>-n</b>
+<dd style="margin-left: 5.0em">Disables reverse address lookups; normally
+<b>cups-lpd</b>
+will try to discover the hostname of the client via a reverse DNS lookup.
+<dt><b>-o </b><i>name=value</i>
+<dd style="margin-left: 5.0em">Inserts options for all print queues. Most often this is used to disable the "l" filter so that remote print jobs are filtered as needed for printing; the
+<b>inetd</b>(8)
+example below sets the "document-format" option to "application/octet-stream" which forces autodetection of the print file format.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+<b>cups-lpd</b>
+does not enforce the restricted source port number specified in RFC 1179, as using restricted ports does not prevent users from submitting print jobs.
+While this behavior is different than standard Berkeley LPD implementations, it should not affect normal client operations.
+<p>The output of the status requests follows RFC 2569, Mapping between LPD and IPP Protocols. Since many LPD implementations stray from this definition, remote status reporting to LPD clients may be unreliable.
+<h2 class="title"><a name="ERRORS">Errors</a></h2>
+Errors are sent to the system log.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+<i>/etc/inetd.conf</i>
+<i>/etc/xinetd.d/cups-lpd</i>
+<i>/System/Library/LaunchDaemons/org.cups.cups-lpd.plist</i>
+</pre>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+<h3><a name="PERFORMANCE">Performance</a></h3>
+<b>cups-lpd</b>
+performs well with small numbers of clients and printers.
+However, since a new process is created for each connection and since each process must query the printing system before each job submission, it does not scale to larger configurations.
+We highly recommend that large configurations use the native IPP support provided by CUPS instead.
+<h3><a name="SECURITY">Security</a></h3>
+<b>cups-lpd</b>
+currently does not perform any access control based on the settings in <i>cupsd.conf(5)</i> or in the <i>hosts.allow(5)</i> or <i>hosts.deny(5)</i> files used by TCP wrappers.
+Therefore, running
+<b>cups-lpd</b>
+on your server will allow any computer on your network (and perhaps the entire
+Internet) to print to your server.
+<p>While
+<b>xinetd</b>(8)
+has built-in access control support, you should use the TCP wrappers package with
+<b>inetd</b>(8)
+to limit access to only those computers that should be able to print through your server.
+<p><b>cups-lpd</b>
+is not enabled by the standard CUPS distribution.
+Please consult with your operating system vendor to determine whether it is enabled by default on your system.
+<h2 class="title"><a name="EXAMPLE">Example</a></h2>
+If you are using
+<b>inetd</b>(8),
+add the following line to the <i>inetd.conf</i> file to enable the
+<b>cups-lpd</b>
+mini-server:
+<pre class="man">
+
+ printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd \
+ -o document-format=application/octet-stream
+
+</pre>
+<p><i>Note:</i> If you are using Solaris 10 or higher, you must run the
+<b>inetdconv</b>(1m)
+program to register the changes to the <i>inetd.conf</i> file.
+<p>CUPS includes configuration files for
+<b>launchd</b>(8),
+<b>systemd</b>(8),
+and
+<b>xinetd(8).</b>
+Simply enable the
+<b>cups-lpd</b>
+service using the corresponding control program.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<b>inetconv</b>(1m),
+<b>inetd</b>(8),
+<b>launchd</b>(8),
+<b>xinetd</b>(8),
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+RFC 2569
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-snmp.conf.html b/doc/help/man-cups-snmp.conf.html
new file mode 100644
index 0000000..e0c18bd
--- /dev/null
+++ b/doc/help/man-cups-snmp.conf.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>snmp.conf(5)</title>
+</head>
+<body>
+<h1 class="title">snmp.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+snmp.conf - snmp configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The
+<b>snmp.conf</b>
+file configures how the standard CUPS network backends (http, https, ipp, ipps, lpd, snmp, and socket) access printer information using SNMPv1 and is normally located in the <i>/etc/cups</i> directory.
+Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.
+<p>The Community and DebugLevel directives are used by all backends. The remainder apply only to the SNMP backend -
+<a href="man-cups-snmp.html?TOPIC=Man+Pages"><b>cups-snmp</b>(8).</a>
+<h2 class="title"><a name="DIRECTIVES">Directives</a></h2>
+The following directives are understood by the CUPS network backends:
+<dl class="man">
+<dt><b>Address @IF(</b><i>name</i><b>)</b>
+<dd style="margin-left: 5.0em"><dt><b>Address @LOCAL</b>
+<dd style="margin-left: 5.0em"><dt><b>Address </b><i>address</i>
+<dd style="margin-left: 5.0em">Sends SNMP broadcast queries (for discovery) to the specified address(es).
+There is no default for the broadcast address.
+<dt><b>Community </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the community name to use.
+Only a single community name may be specified.
+The default community name is "public".
+<dt><b>DebugLevel </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the logging level from 0 (none) to 3 (everything).
+Typically only used for debugging (thus the name).
+The default debug level is 0.
+<dt><b>DeviceURI "</b><i>regular expression</i><b>" </b><i>device-uri </i>[... <i>device-uri</i>]
+<dd style="margin-left: 5.0em">Specifies one or more device URIs that should be used for a given make and model string.
+The regular expression is used to match the detected make and model, and the device URI strings must be of the form "scheme://%s[:port]/[path]", where "%s" represents the detected address or hostname.
+There are no default device URI matching rules.
+<dt><b>HostNameLookups on</b>
+<dd style="margin-left: 5.0em"><dt><b>HostNameLookups off</b>
+<dd style="margin-left: 5.0em">Specifies whether the addresses of printers should be converted to hostnames or left as numeric IP addresses.
+The default is "off".
+<dt><b>MaxRunTime </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of seconds that the SNMP backend will scan the
+network for printers.
+The default is 120 seconds (2 minutes).
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups-snmp.html?TOPIC=Man+Pages"><b>cups-snmp</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-snmp.html b/doc/help/man-cups-snmp.html
new file mode 100644
index 0000000..faa5763
--- /dev/null
+++ b/doc/help/man-cups-snmp.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cups-snmp(8)</title>
+</head>
+<body>
+<h1 class="title">cups-snmp(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+snmp - cups snmp backend
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>/usr/lib/cups/backend/snmp</b>
+<i>ip-address-or-hostname</i>
+<br>
+<b>/usr/libexec/cups/backend/snmp</b>
+<i>ip-address-or-hostname</i>
+<br>
+<b>lpinfo</b>
+<b>-v</b>
+<b>--include-schemes</b>
+snmp
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The CUPS SNMP backend provides legacy discovery and identification of network printers using SNMPv1.
+When used for discovery through the scheduler, the backend will list all printers that respond to a broadcast SNMPv1 query with the "public" community name.
+Additional queries are then sent to printers that respond in order to determine the correct device URI, make and model, and other information needed for printing.
+<p>In the first form, the SNMP backend is run directly by the user to look up the device URI and other information when you have an IP address or hostname.
+This can be used for programs that need to configure print queues where the user has supplied an address but nothing else.
+<p>In the second form, the SNMP backend is run indirectly using the
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+command.
+The output provides all printers detected via SNMP on the configured
+broadcast addresses.
+<i>Note: no broadcast addresses are configured by default.</i>
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+The DebugLevel value can be overridden using the CUPS_DEBUG_LEVEL environment variable.
+The MaxRunTime value can be overridden using the CUPS_MAX_RUN_TIME environment variable.
+<h2 class="title"><a name="FILES">Files</a></h2>
+The SNMP backend reads the <i>/etc/cups/snmp.conf</i> configuration file, if
+present, to set the default broadcast address, community name, and logging
+level.
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The CUPS SNMP backend uses the information from the Host, Printer, and Port Monitor MIBs along with some vendor private MIBs and intelligent port probes to determine the correct device URI and make and model for each printer.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-cups-snmp.conf.html?TOPIC=Man+Pages"><b>cups-snmp.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups.html b/doc/help/man-cups.html
new file mode 100644
index 0000000..bc7390c
--- /dev/null
+++ b/doc/help/man-cups.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cups(1)</title>
+</head>
+<body>
+<h1 class="title">cups(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups - a standards-based, open source printing system
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>CUPS</b>
+is the software you use to print from applications like word processors, email readers, photo editors, and web browsers. It converts the page descriptions produced by your application (put a paragraph here, draw a line there, and so forth) into something your printer can understand and then sends the information to the printer for printing.
+<p>Now, since every printer manufacturer does things differently, printing can be very complicated.
+<b>CUPS</b>
+does its best to hide this from you and your application so that you can concentrate on printing and less on how to print. Generally, the only time you need to know anything about your printer is when you use it for the first time, and even then
+<b>CUPS</b>
+can often figure things out on its own.
+<h3><a name="HOW_DOES_IT_WORK_">How Does It Work?</a></h3>
+The first time you print to a printer,
+<b>CUPS</b>
+creates a queue to keep track of the current status of the printer (everything OK, out of paper, etc.) and any pages you have printed. Most of the time the queue points to a printer connected directly to your computer via a USB port, however it can also point to a printer on your network, a printer on the Internet, or multiple printers depending on the configuration. Regardless of where the queue points, it will look like any other printer to you and your applications.
+<p>Every time you print something,
+<b>CUPS</b>
+creates a job which contains the queue you are sending the print to, the name of the document you are printing, and the page descriptions. Job are numbered (queue-1, queue-2, and so forth) so you can monitor the job as it is printed or cancel it if you see a mistake. When
+<b>CUPS</b>
+gets a job for printing, it determines the best programs (filters, printer drivers, port monitors, and backends) to convert the pages into a printable format and then runs them to actually print the job.
+<p>When the print job is completely printed,
+<b>CUPS</b>
+removes the job from the queue and moves on to any other jobs you have submitted. You can also be notified when the job is finished, or if there are any errors during printing, in several different ways.
+<h3><a name="WHERE_DO_I_BEGIN_">Where Do I Begin?</a></h3>
+The easiest way to start is by using the web interface to configure your printer. Go to "<a href="http://localhost:631"">http://localhost:631"</a> and choose the Administration tab at the top of the page. Click/press on the Add Printer button and follow the prompts.
+<p>When you are asked for a username and password, enter your login username and password or the "root" username and password.
+<p>After the printer is added you will be asked to set the default printer options (paper size, output mode, etc.) for the printer. Make any changes as needed and then click/press on the Set Default Options button to save them. Some printers also support auto-configuration - click/press on the Query Printer for Default Options button to update the options automatically.
+<p>Once you have added the printer, you can print to it from any application. You can also choose Print Test Page from the maintenance menu to print a simple test page and verify that everything is working properly.
+<p>You can also use the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+and
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+commands to add printers to
+<b>CUPS</b>.
+Additionally, your operating system may include graphical user interfaces or automatically create printer queues when you connect a printer to your computer.
+<h3><a name="HOW_DO_I_GET_HELP_">How Do I Get Help?</a></h3>
+The
+<b>CUPS</b>
+web site (<a href="http://www.CUPS.org">http://www.CUPS.org</a>) provides access to the
+<i>cups</i>
+and
+<i>cups-devel</i>
+mailing lists, additional documentation and resources, and a bug report database. Most vendors also provide online discussion forums to ask printing questions for your operating system of choice.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+<b>CUPS</b>
+commands use the following environment variables to override the default locations of files and so forth. For security reasons, these environment variables are ignored for setuid programs:
+<dl class="man">
+<dt><b>CUPS_ANYROOT</b>
+<dd style="margin-left: 5.0em">Whether to allow any X.509 certificate root (Y or N).
+<dt><b>CUPS_CACHEDIR</b>
+<dd style="margin-left: 5.0em">The directory where semi-persistent cache files can be found.
+<dt><b>CUPS_DATADIR</b>
+<dd style="margin-left: 5.0em">The directory where data files can be found.
+<dt><b>CUPS_ENCRYPTION</b>
+<dd style="margin-left: 5.0em">The default level of encryption (Always, IfRequested, Never, Required).
+<dt><b>CUPS_EXPIREDCERTS</b>
+<dd style="margin-left: 5.0em">Whether to allow expired X.509 certificates (Y or N).
+<dt><b>CUPS_GSSSERVICENAME</b>
+<dd style="margin-left: 5.0em">The Kerberos service name used for authentication.
+<dt><b>CUPS_SERVER</b>
+<dd style="margin-left: 5.0em">The hostname/IP address and port number of the CUPS scheduler (hostname:port or ipaddress:port).
+<dt><b>CUPS_SERVERBIN</b>
+<dd style="margin-left: 5.0em">The directory where server helper programs, filters, backend, etc. can be found.
+<dt><b>CUPS_SERVERROOT</b>
+<dd style="margin-left: 5.0em">The root directory of the server.
+<dt><b>CUPS_STATEDIR</b>
+<dd style="margin-left: 5.0em">The directory where state files can be found.
+<dt><b>CUPS_USER</b>
+<dd style="margin-left: 5.0em">Specifies the name of the user for print requests.
+<dt><b>HOME</b>
+<dd style="margin-left: 5.0em">Specifies the home directory of the current user.
+<dt><b>IPP_PORT</b>
+<dd style="margin-left: 5.0em">Specifies the default port number for IPP requests.
+<dt><b>LOCALEDIR</b>
+<dd style="margin-left: 5.0em">Specifies the location of localization files.
+<dt><b>LPDEST</b>
+<dd style="margin-left: 5.0em">Specifies the default print queue (System V standard).
+<dt><b>PRINTER</b>
+<dd style="margin-left: 5.0em">Specifies the default print queue (Berkeley standard).
+<dt><b>TMPDIR</b>
+<dd style="margin-left: 5.0em">Specifies the location of temporary files.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+<i>~/.cups/client.conf</i>
+<i>~/.cups/lpoptions</i>
+</pre>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+<b>CUPS</b>
+conforms to the Internet Printing Protocol version 2.1 and implements the Berkeley and System V UNIX print commands.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-client.conf.html?TOPIC=Man+Pages"><b>client.conf</b>(7),</a>
+<a href="man-cupsctl.html?TOPIC=Man+Pages"><b>cupsctl</b>(8),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+CUPS Web Site (<a href="http://www.CUPS.org)">http://www.CUPS.org)</a>,
+PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp">http://www.pwg.org/ipp</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsaccept.html b/doc/help/man-cupsaccept.html
new file mode 100644
index 0000000..fe46291
--- /dev/null
+++ b/doc/help/man-cupsaccept.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsaccept(8)</title>
+</head>
+<body>
+<h1 class="title">cupsaccept(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsaccept/cupsreject - accept/reject jobs sent to a destination
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsaccept</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>hostname[:port]</i>
+]
+<i>destination(s)</i>
+<br>
+<b>cupsreject</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>hostname[:port]</i>
+] [
+<b>-r</b>
+<i>reason</i>
+]
+<i>destination(s)</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The
+<b>cupsaccept</b>
+command instructs the printing system to accept print jobs to the specified destinations.
+<p>The
+<b>cupsreject</b>
+command instructs the printing system to reject print jobs to the
+specified destinations.
+The <i>-r</i> option sets the reason for rejecting print jobs. If not specified, the reason defaults to "Reason Unknown".
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are supported by both
+<b>cupsaccept</b>
+and
+<b>cupsreject</b>:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Sets the username that is sent when connecting to the server.
+<dt><b>-h </b><i>hostname[:port]</i>
+<dd style="margin-left: 5.0em">Chooses an alternate server.
+<dt><b>-r </b>"<i>reason</i>"
+<dd style="margin-left: 5.0em">Sets the reason string that is shown for a printer that is rejecting jobs.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The
+<b>cupsaccept</b>
+and
+<b>cupsreject</b>
+commands correspond to the System V printing system commands "accept" and "reject", respectively.
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
+Also, printer and class names are <i>not</i> case-sensitive.
+<p>Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsaddsmb.html b/doc/help/man-cupsaddsmb.html
new file mode 100644
index 0000000..cb2901e
--- /dev/null
+++ b/doc/help/man-cupsaddsmb.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsaddsmb(8)</title>
+</head>
+<body>
+<h1 class="title">cupsaddsmb(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsaddsmb - export printers to samba for windows clients
+
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsaddsmb</b>
+[
+<b>-H</b>
+<i>samba-server</i>
+] [
+<b>-U</b>
+<i>samba-user[%samba-password]</i>
+] [
+<b>-h</b>
+<i>cups-server[:port]</i>
+] [
+<b>-v</b>
+]
+<b>-a</b>
+<br>
+<b>cupsaddsmb</b>
+[
+<b>-H</b>
+<i>samba-server</i>
+] [
+<b>-U</b>
+<i>samba-user[%samba-password]</i>
+] [
+<b>-h</b>
+<i>cups-server[:port]</i>
+] [
+<b>-v</b>
+]
+<i>printer</i>
+[ ...
+<i>printer</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cupsaddsmb</b> program 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.
+<h3><a name="SAMBA_CONFIGURATION">Samba Configuration</a></h3>
+<b>cupsaddsmb</b> uses the RPC-based printing support in SAMBA to provide printer drivers and PPD files to Windows client machines.
+In order to use this functionality, you must first configure the SAMBA
+<b>smb.conf</b>(5)
+file to support printing through CUPS and provide a printer driver download
+share, as follows:
+<pre class="man">
+
+ [global]
+ load printers = yes
+ printing = cups
+ printcap name = cups
+
+ [printers]
+ comment = All Printers
+ path = /var/spool/samba
+ browseable = no
+ public = yes
+ guest ok = yes
+ writable = no
+ printable = yes
+
+ [print$]
+ comment = Printer Drivers
+ path = /etc/samba/drivers
+ browseable = yes
+ guest ok = no
+ read only = yes
+ write list = root
+
+</pre>
+This configuration assumes a FHS-compliant installation of SAMBA; adjust the [printers] and [print$] share paths accordingly on your system as needed.
+<h3><a name="MICROSOFT_POSTSCRIPT_DRIVERS_FOR_WINDOWS">Microsoft Postscript Drivers For Windows</a></h3>
+The base driver for Windows 2000 and higher is the Microsoft PostScript driver, which is available on any system running Windows 2000 or higher in the %WINDIR%\SYSTEM32\SPOOL\DRIVERS\W32X86\3 folder for 32-bit drivers and %WINDIR%\SYSTEM32\SPOOL\DRIVERS\X64\3 folder for 64-bit drivers.
+<p>Copy the 32-bit drivers to the <i>/usr/share/cups/drivers</i> directory and the 64-bit drivers to the <i>/usr/share/cups/drivers/x64</i> directory exactly as named below:
+<pre class="man">
+
+ ps5ui.dll
+ pscript.hlp
+ pscript.ntf
+ pscript5.dll
+
+</pre>
+<b>Note:</b> Unlike Windows, case is significant - make sure that you use the lowercase filenames shown above, otherwise <b>cupsaddsmb</b> will fail to export the drivers.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>cupsaddsmb</b> supports the following options:
+<dl class="man">
+<dt><b>-H </b><i>samba-server</i>
+<dd style="margin-left: 5.0em">Specifies the SAMBA server which defaults to the CUPS server.
+<dt><b>-U </b><i>samba-user</i>[<b>%</b><i>samba-password</i>]
+<dd style="margin-left: 5.0em">Specifies the SAMBA print admin username which defaults to your current username.
+If the username contains a percent (%) character, then the text following the percent is treated as the SAMBA password to use.
+<dt><b>-a</b>
+<dd style="margin-left: 5.0em">Exports all known printers.
+Otherwise only the named printers are exported.
+<dt><b>-h </b><i>cups-server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies a different CUPS server to use.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies that verbose information should be shown.
+This is useful for debugging SAMBA configuration problems.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<b>rpcclient</b>(1),
+<b>smbclient</b>(1),
+<b>smbd</b>(8),
+<b>smb.conf</b>(5),
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsctl.html b/doc/help/man-cupsctl.html
new file mode 100644
index 0000000..6ab47db
--- /dev/null
+++ b/doc/help/man-cupsctl.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsctl(8)</title>
+</head>
+<body>
+<h1 class="title">cupsctl(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsctl - configure cupsd.conf options
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsctl</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>--</b>[<b>no-</b>]<b>debug-logging</b>
+] [
+<b>--</b>[<b>no-</b>]<b>remote-admin</b>
+] [
+<b>--</b>[<b>no-</b>]<b>remote-any</b>
+] [
+<b>--</b>[<b>no-</b>]<b>share-printers</b>
+] [
+<b>--</b>[<b>no-</b>]<b>user-cancel-any</b>
+] [
+<i>name=value</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsctl</b> updates or queries the <i>cupsd.conf</i> file for a server. When
+no changes are requested, the current configuration values are written to the
+standard output in the format "name=value", one per line.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Enables encryption on the connection to the scheduler.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username to use when authenticating with the scheduler.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies the server address.
+<dt><b>--fR[fBno-fR]fBdebug-logging</b>
+<dd style="margin-left: 5.0em">Enables (disables) debug logging to the <i>error_log</i> file.
+<dt><b>--fR[fBno-fR]fBremote-admin</b>
+<dd style="margin-left: 5.0em">Enables (disables) remote administration.
+<dt><b>--fR[fBno-fR]fBremote-any</b>
+<dd style="margin-left: 5.0em">Enables (disables) printing from any address, e.g., the Internet.
+<dt><b>--fR[fBno-fR]fBshare-printers</b>
+<dd style="margin-left: 5.0em">Enables (disables) sharing of local printers with other computers.
+<dt><b>--fR[fBno-fR]fBuser-cancel-any</b>
+<dd style="margin-left: 5.0em">Allows (prevents) users to cancel jobs owned by others.
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Display the current settings:
+<pre class="man">
+
+ cupsctl
+
+</pre>
+Enable debug logging:
+<pre class="man">
+
+ cupsctl --debug-logging
+
+</pre>
+Get the current debug logging state:
+<pre class="man">
+
+ cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'
+
+</pre>
+Disable printer sharing:
+<pre class="man">
+
+ cupsctl --no-share-printers
+</pre>
+<h2 class="title"><a name="KNOWN_ISSUES">Known Issues</a></h2>
+You cannot set the Listen or Port directives using <b>cupsctl</b>.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd-helper.html b/doc/help/man-cupsd-helper.html
new file mode 100644
index 0000000..324408b
--- /dev/null
+++ b/doc/help/man-cupsd-helper.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsd-helper(8)</title>
+</head>
+<body>
+<h1 class="title">cupsd-helper(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd-helper - cupsd helper programs
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cups-deviced</b>
+<i>request-id</i>
+<i>limit</i>
+<i>user-id</i>
+<i>options</i>
+<br>
+<b>cups-driverd</b>
+<b>cat</b>
+<i>ppd-name</i>
+<br>
+<b>cups-driverd</b>
+<b>list</b>
+<i>request_id</i>
+<i>limit</i>
+<i>options</i>
+<br>
+<b>cups-exec</b>
+<i>sandbox-profile</i>
+[
+<i>-g</i>
+<i>group-id</i>
+] [
+<i>-n</i>
+<i>nice-value</i>
+] [
+<i>-u</i>
+<i>user-id</i>
+]
+<i>/path/to/program</i>
+<i>argv0</i>
+<i>...</i>
+<i>argvN</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cupsd-helper</b> programs perform long-running operations on behalf of the scheduler,
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8).</a>
+The <b>cups-deviced</b> helper program runs each CUPS
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7)</a>
+with no arguments in order to discover the available printers.
+<p>The <b>cups-driverd</b> helper program lists all available printer drivers, a subset of "matching" printer drivers, or a copy of a specific driver PPD file.
+<p>The <b>cups-exec</b> helper program runs backends, filters, and other programs. On OS X these programs are run in a secure sandbox.
+<h2 class="title"><a name="FILES">Files</a></h2>
+The <b>cups-driverd</b> program looks for PPD and driver information files in the following directories:
+<pre class="man">
+
+ <i>/Library/Printers</i>
+ <i>/opt/share/ppd</i>
+ <i>/System/Library/Printers</i>
+ <i>/usr/local/share/ppd</i>
+ <i>/usr/share/cups/drv</i>
+ <i>/usr/share/cups/model</i>
+ <i>/usr/share/ppd</i>
+</pre>
+<p>PPD files can be compressed using the
+<b>gzip</b>(1)
+program or placed in compressed
+<b>tar</b>(1)
+archives to further reduce their size.
+<p>Driver information files must conform to the format defined in
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5).</a>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd-logs.html b/doc/help/man-cupsd-logs.html
new file mode 100644
index 0000000..2550681
--- /dev/null
+++ b/doc/help/man-cupsd-logs.html
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsd-logs(5)</title>
+</head>
+<body>
+<h1 class="title">cupsd-logs(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd-logs - cupsd log files (access_log, error_log, and page_log)
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+normally maintains three log files: <i>access_log</i> to track requests that are submitted to the scheduler, <i>error_log</i> to track progress and errors, and <i>page_log</i> to track pages that are printed.
+Configuration directives in
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5)</a>
+and
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+control what information is logged and where it is stored.
+<h3><a name="ACCESS_LOG_FILE_FORMAT">Access Log File Format</a></h3>
+The <i>access_log</i> file lists each HTTP resource that is accessed by a web browser or client.
+Each line is in an extended version of the so-called "Common Log Format" used by many web servers and web reporting tools:
+<pre class="man">
+
+ <i>host group user date-time </i>"<i>method resource version</i>" <i>status bytes
+ ipp-operation ipp-status</i>
+
+</pre>
+For example:
+<pre class="man">
+
+ 10.0.1.2 - - [01/Dec/2005:21:50:28 +0000] "POST / HTTP/1.1" 200 317
+ CUPS-Get-Printers successful-ok-ignored-or-substituted-attributes
+ localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
+ 200 0 - -
+ localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1"
+ 200 157 CUPS-Get-Printers
+ successful-ok-ignored-or-substituted-attributes
+ localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1"
+ 200 1411 CUPS-Get-Devices -
+ localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
+ 200 6667 - -
+
+</pre>
+The <i>host</i> field will normally only be an IP address unless you have enabled the HostNameLookups directive in the <i>cupsd.conf</i> file or if the IP address corresponds to your local machine.
+<p>The <i>group</i> field always contains "-".
+<p>The <i>user</i> field is the authenticated username of the requesting user.
+If no username and password is supplied for the request then this field contains "-".
+<p>The <i>date-time</i> field is the date and time of the request in local time and is in the format "[DD/MON/YYYY:HH:MM:SS +ZZZZ]".
+<p>The <i>method</i> field is the HTTP method used: "GET", "HEAD", "OPTIONS", "POST", or "PUT".
+"GET" requests are used to get files from the server, both for the web interface and to get configuration and log files.
+"HEAD" requests are used to get information about a resource prior to a "GET".
+"OPTIONS" requests are used to upgrade connections to TLS encryption.
+"POST" requests are used for web interface forms and IPP requests.
+"PUT" requests are used to upload configuration files.
+<p>The <i>resource</i> field is the filename of the requested resource.
+<p>The <i>version</i> field is the HTTP specification version used by the client.
+For CUPS clients this will always be "HTTP/1.1".
+<p>The <i>status</i> field contains the HTTP result status of the request, as follows:
+<div style="margin-left: 5.0em;">
+<dl class="man">
+<dt>200
+<dd style="margin-left: 5.0em">Successful operation.
+<dt>201
+<dd style="margin-left: 5.0em">File created/modified successfully.
+<dt>304
+<dd style="margin-left: 5.0em">The requested file has not changed.
+<dt>400
+<dd style="margin-left: 5.0em">Bad HTTP request; typically this means that you have a malicious program trying to access your server.
+<dt>401
+<dd style="margin-left: 5.0em">Unauthorized, authentication (username + password) is required.
+<dt>403
+<dd style="margin-left: 5.0em">Access is forbidden; typically this means that a client tried to access a file or resource they do not have permission to access.
+<dt>404
+<dd style="margin-left: 5.0em">The file or resource does not exist.
+<dt>405
+<dd style="margin-left: 5.0em">URL access method is not allowed; typically this means you have a web browser using your server as a proxy.
+<dt>413
+<dd style="margin-left: 5.0em">Request too large; typically this means that a client tried to print a file larger than the MaxRequestSize allows.
+<dt>426
+<dd style="margin-left: 5.0em">Upgrading to TLS-encrypted connection.
+<dt>500
+<dd style="margin-left: 5.0em">Server error; typically this happens when the server is unable to open/create a file - consult the error_log file for details.
+<dt>501
+<dd style="margin-left: 5.0em">The client requested encryption but encryption support is not enabled/compiled in.
+<dt>505
+<dd style="margin-left: 5.0em">HTTP version number not supported; typically this means that you have a malicious program trying to access your server.
+</div>
+</dl>
+<p>The <i>bytes</i> field contains the number of bytes in the request.
+For POST requests the bytes field contains the number of bytes of non-IPP data that is received from the client.
+<p>The <i>ipp-operation</i> field contains either "-" for non-IPP requests or the IPP operation name for POST requests containing an IPP request.
+<p>The <i>ipp-status</i> field contains either "-" for non-IPP requests or the IPP status code name for POST requests containing an IPP response.
+<h3><a name="ERROR_LOG_FILE_FORMAT">Error Log File Format</a></h3>
+The <i>error_log</i> file lists messages from the scheduler - errors, warnings, etc. The LogLevel directive in the
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5)</a>
+file controls which messages are logged:
+<pre class="man">
+
+ level date-time message
+
+</pre>
+For example:
+<pre class="man">
+
+ I [20/May/1999:19:18:28 +0000] [Job 1] Queued on 'DeskJet' by 'mike'.
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[0]="DeskJet"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[1]="1"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[2]="mike"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[3]="myjob"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[4]="1"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[5]="media=
+ na_letter_8.5x11in sides=one-sided"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[6]="/var/spool/cups/
+ d000001-001"
+ I [20/May/1999:19:21:02 +0000] [Job 2] Queued on 'DeskJet' by 'mike'.
+ I [20/May/1999:19:22:24 +0000] [Job 2] Canceled by 'mike'.
+
+</pre>
+The <i>level</i> field contains the type of message:
+<dl class="man">
+<dt>A
+<dd style="margin-left: 5.0em">Alert message (LogLevel alert)
+<dt>C
+<dd style="margin-left: 5.0em">Critical error message (LogLevel crit)
+<dt>D
+<dd style="margin-left: 5.0em">Debugging message (LogLevel debug)
+<dt>d
+<dd style="margin-left: 5.0em">Detailed debugging message (LogLevel debug2)
+<dt>E
+<dd style="margin-left: 5.0em">Normal error message (LogLevel error)
+<dt>I
+<dd style="margin-left: 5.0em">Informational message (LogLevel info)
+<dt>N
+<dd style="margin-left: 5.0em">Notice message (LogLevel notice)
+<dt>W
+<dd style="margin-left: 5.0em">Warning message (LogLevel warn)
+<dt>X
+<dd style="margin-left: 5.0em">Emergency error message (LogLevel emerg)
+</dl>
+<p>The <i>date-time</i> field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the <i>access_log</i> file.
+<p>The <i>message</i> field contains a free-form textual message.
+Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID.
+<h3><a name="PAGE_LOG_FILE_FORMAT">Page Log File Format</a></h3>
+The <i>page_log</i> file lists each page or group of pages that are sent to a printer.
+By default, each line contains the following information:
+<pre class="man">
+
+ <i>printer user job-id date-time page-number num-copies job-billing
+ job-originating-host-name job-name media sides</i>
+
+ <i>printer user job-id date-time </i><b>total </b><i>num-impressions job-billing
+ job-originating-host-name job-name media sides</i>
+
+</pre>
+For example the entries for a two page job called "myjob" might look like:
+<pre class="man">
+
+ DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123
+ localhost myjob na_letter_8.5x11in one-sided
+ DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123
+ localhost myjob na_letter_8.5x11in one-sided
+
+ DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
+ localhost myjob na_letter_8.5x11in one-sided
+
+</pre>
+The PageLogFormat directive in the
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5)</a>
+file can be used to change this information.
+<p>The <i>printer</i> field contains the name of the printer that printed the page.
+If you send a job to a printer class, this field will contain the name of the printer that was assigned the job.
+<p>The <i>user</i> field contains the name of the user (the IPP requesting-user-name attribute) that submitted this file for printing.
+<p>The <i>job-id</i> field contains the job number of the page being printed.
+<p>The <i>date-time</i> field contains the date and time of when the page started printing.
+The format of this field is identical to the data-time field in the <i>access_log</i> file.
+<p>The <i>page-number</i> and <i>num-copies</i> fields contain the page number and number of copies being printed of that page.
+For printers that cannot produce copies on their own, the num-copies field will always be 1.
+<p>Lines containing the keyword "total" have a <i>num-impressions</i> field instead which provides the total number of impressions (sides) that have been printed on for the job.
+<p>The <i>job-billing</i> field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided.
+<p>The <i>job-originating-host-name</i> field contains the hostname or IP address of the client that printed the job.
+<p>The <i>job-name</i> field contains a copy of the job-name attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+<p>The <i>media</i> field contains a copy of the media or media-col/media-size attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+<p>The <i>sides</i> field contains a copy of the sides attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd.conf.html b/doc/help/man-cupsd.conf.html
new file mode 100644
index 0000000..c2ef877
--- /dev/null
+++ b/doc/help/man-cupsd.conf.html
@@ -0,0 +1,595 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsd.conf(5)</title>
+</head>
+<body>
+<h1 class="title">cupsd.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd.conf - server configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The
+<i>cupsd.conf</i>
+file configures the CUPS scheduler,
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8).</a>
+It is normally located in the
+<i>/etc/cups</i>
+directory.
+<b>Note:</b> File, directory, and user configuration directives that used to be allowed in the <b>cupsd.conf</b> file are now stored in the
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file instead in order to prevent certain types of privilege escalation attacks.
+<p>Each line in the file can be a configuration directive, a blank line, or a comment.
+Configuration directives typically consist of a name and zero or more values separated by whitespace.
+The configuration directive name and values are case-insensitive.
+Comment lines start with the # character.
+<h3><a name="TOP_LEVEL_DIRECTIVES">Top-level Directives</a></h3>
+The following top-level directives are understood by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt><a name="AccessLogLevel"></a><b>AccessLogLevel config</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLogLevel actions</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLogLevel all</b>
+<dd style="margin-left: 5.0em">Specifies the logging level for the AccessLog file.
+The "config" level logs when printers and classes are added, deleted, or modified and when configuration files are accessed or updated.
+The "actions" level logs when print jobs are submitted, held, released, modified, or canceled, and any of the conditions for "config".
+The "all" level logs all requests.
+The default access log level is "actions".
+<dt><a name="AutoPurgeJobs"></a><b>AutoPurgeJobs Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>AutoPurgeJobs No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether to purge job history data automatically when it is no longer required for quotas.
+The default is "No".
+<dt><a name="BrowseLocalProtocols"></a><b>BrowseLocalProtocols all</b>
+<dd style="margin-left: 5.0em"><dt><b>BrowseLocalProtocols dnssd</b>
+<dd style="margin-left: 5.0em"><dt><b>BrowseLocalProtocols none</b>
+<dd style="margin-left: 5.0em">Specifies which protocols to use for local printer sharing.
+The default is "dnssd" on systems that support Bonjour and "none" otherwise.
+<dt><a name="BrowseWebIF"></a><b>BrowseWebIF Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>BrowseWebIF No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether the CUPS web interface is advertised.
+The default is "No".
+<dt><a name="Browsing"></a><b>Browsing Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>Browsing No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether shared printers are advertised.
+The default is "No".
+<dt><a name="Classification"></a><b>Classification </b><i>banner</i>
+<dd style="margin-left: 5.0em"><br>
+Specifies the security classification of the server.
+Any valid banner name can be used, including "classified", "confidential", "secret", "topsecret", and "unclassified", or the banner can be omitted to disable secure printing functions.
+The default is no classification banner.
+<dt><a name="ClassifyOverride"></a><b>ClassifyOverride Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>ClassifyOverride No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option.
+The default is "No".
+<dt><a name="DefaultAuthType"></a><b>DefaultAuthType Basic</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultAuthType Negotiate</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies the default type of authentication to use.
+The default is "Basic".
+<dt><a name="DefaultEncryption"></a><b>DefaultEncryption Never</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultEncryption IfRequested</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultEncryption Required</b>
+<dd style="margin-left: 5.0em">Specifies whether encryption will be used for authenticated requests.
+The default is "Required".
+<dt><a name="DefaultLanguage"></a><b>DefaultLanguage </b><i>locale</i>
+<dd style="margin-left: 5.0em">Specifies the default language to use for text and web content.
+The default is "en".
+<dt><a name="DefaultPaperSize"></a><b>DefaultPaperSize Auto</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultPaperSize None</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultPaperSize </b><i>sizename</i>
+<dd style="margin-left: 5.0em">Specifies the default paper size for new print queues. "Auto" uses a locale-specific default, while "None" specifies there is no default paper size.
+Specific size names are typically "Letter" or "A4".
+The default is "Auto".
+<dt><a name="DefaultPolicy"></a><b>DefaultPolicy </b><i>policy-name</i>
+<dd style="margin-left: 5.0em">Specifies the default access policy to use.
+The default access policy is "default".
+<dt><a name="DefaultShared"></a><b>DefaultShared Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultShared No</b>
+<dd style="margin-left: 5.0em">Specifies whether local printers are shared by default.
+The default is "Yes".
+<dt><a name="DirtyCleanInterval"></a><b>DirtyCleanInterval </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the delay for updating of configuration and state files.
+A value of 0 causes the update to happen as soon as possible, typically within a few milliseconds.
+The default value is "30".
+<dt><a name="ErrorPolicy"></a><b>ErrorPolicy abort-job</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should be aborted (discarded) unless otherwise specified for the printer.
+<dt><b>ErrorPolicy retry-job</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should be retried at a later time unless otherwise specified for the printer.
+<dt><b>ErrorPolicy retry-this-job</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should be retried immediately unless otherwise specified for the printer.
+<dt><b>ErrorPolicy stop-printer</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should stop the printer unless otherwise specified for the printer. The 'stop-printer' error policy is the default.
+<dt><a name="FilterLimit"></a><b>FilterLimit </b><i>limit</i>
+<dd style="margin-left: 5.0em">Specifies the maximum cost of filters that are run concurrently, which can be used to minimize disk, memory, and CPU resource problems.
+A limit of 0 disables filter limiting.
+An average print to a non-PostScript printer needs a filter limit of about 200.
+A PostScript printer needs about half that (100).
+Setting the limit below these thresholds will effectively limit the scheduler to printing a single job at any time.
+The default limit is "0".
+<dt><a name="FilterNice"></a><b>FilterNice </b><i>nice-value</i>
+<dd style="margin-left: 5.0em">Specifies the scheduling priority (
+<b>nice</b>(8)
+value) of filters that are run to print a job.
+The nice value ranges from 0, the highest priority, to 19, the lowest priority.
+The default is 0.
+<dt><a name="GSSServiceName"></a><b>GSSServiceName </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the service name when using Kerberos authentication.
+The default service name is "http."
+<dt><b>HostNameLookups On</b>
+<dd style="margin-left: 5.0em"><dt><a name="HostNameLookups"></a><b>HostNameLookups Off</b>
+<dd style="margin-left: 5.0em"><dt><b>HostNameLookups Double</b>
+<dd style="margin-left: 5.0em">Specifies whether to do reverse lookups on connecting clients.
+The "Double" setting causes
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+to verify that the hostname resolved from the address matches one of the addresses returned for that hostname.
+Double lookups also prevent clients with unregistered addresses from connecting to your server.
+The default is "Off" to avoid the potential server performance problems with hostname lookups.
+Only set this option to "On" or "Double" if absolutely required.
+<dt><a name="JobKillDelay"></a><b>JobKillDelay </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the number of seconds to wait before killing the filters and backend associated with a canceled or held job.
+The default is "30".
+<dt><a name="JobRetryInterval"></a><b>JobRetryInterval </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the interval between retries of jobs in seconds.
+This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job".
+The default is "30".
+<dt><a name="JobRetryLimit"></a><b>JobRetryLimit </b><i>count</i>
+<dd style="margin-left: 5.0em">Specifies the number of retries that are done for jobs.
+This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job".
+The default is "5".
+<dt><a name="KeepAlive"></a><b>KeepAlive Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>KeepAlive No</b>
+<dd style="margin-left: 5.0em">Specifies whether to support HTTP keep-alive connections.
+The default is "Yes".
+<dt><a name="KeepAliveTimeout"></a><b>KeepAliveTimeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies how long an idle client connection remains open.
+The default is "30".
+<dt><a name="LimitIPP"></a><b>&lt;Limit </b><i>operation </i>...<b>> </b>... <b>&lt;/Limit></b>
+<dd style="margin-left: 5.0em">Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATIONS".
+<dt><a name="Limit"></a><b>&lt;Limit </b><i>method </i>...<b>> </b>... <b>&lt;/Limit></b>
+<dd style="margin-left: 5.0em"><dt><a name="LimitExcept"></a><b>&lt;LimitExcept </b><i>method </i>...<b>> </b>... <b>&lt;/LimitExcept></b>
+<dd style="margin-left: 5.0em">Specifies the HTTP methods that are being limited inside a Location section. HTTP method names are listed below in the section "HTTP METHODS".
+<dt><a name="LimitRequestBody"></a><b>LimitRequestBody </b><i>size</i>
+<dd style="margin-left: 5.0em">Specifies the maximum size of print files, IPP requests, and HTML form data.
+The default is "0" which disables the limit check.
+<dt><a name="Listen"></a><b>Listen </b><i>ipv4-address</i><b>:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>Listen [</b><i>ipv6-address</i><b>]:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>Listen *:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>Listen </b><i>/path/to/domain/socket</i>
+<dd style="margin-left: 5.0em">Listens to the specified address and port or domain socket path for connections.
+Multiple Listen directives can be provided to listen on multiple addresses.
+The Listen directive is similar to the Port directive but allows you to restrict access to specific interfaces or networks.
+<dt><a name="ListenBackLog"></a><b>ListenBackLog </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the number of pending connections that will be allowed.
+This normally only affects very busy servers that have reached the MaxClients limit, but can also be triggered by large numbers of simultaneous connections.
+When the limit is reached, the operating system will refuse additional connections until the scheduler can accept the pending ones.
+The default is the OS-defined default limit, typically either "5" for older operating systems or "128" for newer operating systems.
+<dt><a name="Location"></a><b>&lt;Location </b><i>/path</i><b>> </b>... <b>&lt;/Location></b>
+<dd style="margin-left: 5.0em">Specifies access control for the named location.
+Paths are documented below in the section "LOCATION PATHS".
+<dt><a name="LogDebugHistory"></a><b>LogDebugHistory </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the number of debugging messages that are retained for logging if an error occurs in a print job. Debug messages are logged regardless of the LogLevel setting.
+<dt><a name="LogLevel"></a><b>LogLevel </b>none
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>emerg
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>alert
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>crit
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>error
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>warn
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>notice
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>info
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>debug
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>debug2
+<dd style="margin-left: 5.0em">Specifies the level of logging for the ErrorLog file.
+The value "none" stops all logging while "debug2" logs everything.
+The default is "warn".
+<dt><a name="LogTimeFormat"></a><b>LogTimeFormat </b>standard
+<dd style="margin-left: 5.0em"><dt><b>LogTimeFormat </b>usecs
+<dd style="margin-left: 5.0em">Specifies the format of the date and time in the log files.
+The value "standard" is the default and logs whole seconds while "usecs" logs microseconds.
+<dt><a name="MaxClients"></a><b>MaxClients </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous clients that are allowed by the scheduler.
+The default is "100".
+<dt><a name="MaxClientPerHost"></a><b>MaxClientsPerHost </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous clients that are allowed from a
+single address.
+The default is the MaxClients value.
+<dt><a name="MaxCopies"></a><b>MaxCopies </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of copies that a user can print of each job.
+The default is "9999".
+<dt><a name="MaxHoldTime"></a><b>MaxHoldTime </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the maximum time a job may remain in the "indefinite" hold state before it is canceled.
+The default is "0" which disables cancellation of held jobs.
+<dt><a name="MaxJobs"></a><b>MaxJobs </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous jobs that are allowed.
+Set to "0" to allow an unlimited number of jobs.
+The default is "500".
+<dt><a name="MaxJobsPerPrinter"></a><b>MaxJobsPerPrinter </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous jobs that are allowed per printer.
+The default is "0" which allows up to MaxJobs jobs per printer.
+<dt><a name="MaxJobsPerUser"></a><b>MaxJobsPerUser </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous jobs that are allowed per user.
+The default is "0" which allows up to MaxJobs jobs per user.
+<dt><a name="MaxJobTime"></a><b>MaxJobTime </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the maximum time a job may take to print before it is canceled.
+Set to "0" to disable cancellation of "stuck" jobs.
+The default is "10800" (3 hours).
+<dt><a name="MaxLogSize"></a><b>MaxLogSize </b><i>size</i>
+<dd style="margin-left: 5.0em">Specifies the maximum size of the log files before they are rotated.
+The value "0" disables log rotation.
+The default is "1048576" (1MB).
+<dt><a name="MultipleOperationTimeout"></a><b>MultipleOperationTimeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the maximum amount of time to allow between files in a multiple file print job.
+The default is "300" (5 minutes).
+<dt><a name="PageLogFormat"></a><b>PageLogFormat </b><i>format-string</i>
+<dd style="margin-left: 5.0em">Specifies the format of PageLog lines.
+Sequences beginning with percent (%) characters are replaced with the corresponding information, while all other characters are copied literally.
+The following percent sequences are recognized:
+<pre class="man">
+
+ "%%" inserts a single percent character.
+ "%{name}" inserts the value of the specified IPP attribute.
+ "%C" inserts the number of copies for the current page.
+ "%P" inserts the current page number.
+ "%T" inserts the current date and time in common log format.
+ "%j" inserts the job ID.
+ "%p" inserts the printer name.
+ "%u" inserts the username.
+
+</pre>
+The default is the empty string, which disables page logging.
+The string "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}" creates a page log with the standard items.
+<dt><a name="PassEnv"></a><b>PassEnv </b><i>variable </i>[ ... <i>variable </i>]
+<dd style="margin-left: 5.0em">Passes the specified environment variable(s) to child processes.
+<dt><a name="Policy"></a><b>&lt;Policy </b><i>name</i><b>> </b>... <b>&lt;/Policy></b>
+<dd style="margin-left: 5.0em">Specifies access control for the named policy.
+<dt><a name="Port"></a><b>Port </b><i>number</i>
+<dd style="margin-left: 5.0em">Listens to the specified port number for connections.
+<dt><a name="PreserveJobFiles"></a><b>PreserveJobFiles Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobFiles No</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobFiles </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies whether job files (documents) are preserved after a job is printed.
+If a numeric value is specified, job files are preserved for the indicated number of seconds after printing.
+The default is "86400" (preserve 1 day).
+<dt><a name="PreserveJobHistory"></a><b>PreserveJobHistory Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobHistory No</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobHistory </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies whether the job history is preserved after a job is printed.
+If a numeric value is specified, the job history is preserved for the indicated number of seconds after printing.
+If "Yes", the job history is preserved until the MaxJobs limit is reached.
+The default is "Yes".
+<dt><a name="ReloadTimeout"></a><b>ReloadTimeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the amount of time to wait for job completion before restarting the scheduler.
+The default is "30".
+<dt><a name="RIPCache"></a><b>RIPCache </b><i>size</i>
+<dd style="margin-left: 5.0em">Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer.
+The default is "128m".
+<dt><a name="ServerAdmin"></a><b>ServerAdmin </b><i>email-address</i>
+<dd style="margin-left: 5.0em">Specifies the email address of the server administrator.
+The default value is "root@ServerName".
+<dt><a name="ServerAlias"></a><b>ServerAlias </b><i>hostname </i>[ ... <i>hostname </i>]
+<dd style="margin-left: 5.0em"><dt><b>ServerAlias *</b>
+<dd style="margin-left: 5.0em">The ServerAlias directive is used for HTTP Host header validation when clients connect to the scheduler from external interfaces.
+Using the special name "*" can expose your system to known browser-based DNS rebinding attacks, even when accessing sites through a firewall.
+If the auto-discovery of alternate names does not work, we recommend listing each alternate name with a ServerAlias directive instead of using "*".
+<dt><a name="ServerName"></a><b>ServerName </b><i>hostname</i>
+<dd style="margin-left: 5.0em">Specifies the fully-qualified hostname of the server.
+The default is the value reported by the
+<b>hostname</b>(1)
+command.
+<dt><a name="ServerTokens"></a><b>ServerTokens None</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens ProductOnly</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Major</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Minor</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Minimal</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens OS</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Full</b>
+<dd style="margin-left: 5.0em">Specifies what information is included in the Server header of HTTP responses.
+"None" disables the Server header.
+"ProductOnly" reports "CUPS".
+"Major" reports "CUPS 2".
+"Minor" reports "CUPS 2.0".
+"Minimal" reports "CUPS 2.0.0".
+"OS" reports "CUPS 2.0.0 (UNAME)" where UNAME is the output of the
+<b>uname</b>(1)
+command.
+"Full" reports "CUPS 2.0.0 (UNAME) IPP/2.0".
+The default is "Minimal".
+<dt><a name="SetEnv"></a><b>SetEnv </b><i>variable value</i>
+<dd style="margin-left: 5.0em">Set the specified environment variable to be passed to child processes.
+<dt><a name="SSLListen"></a><b>SSLListen </b><i>ipv4-address</i><b>:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>SSLListen [</b><i>ipv6-address</i><b>]:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>SSLListen *:</b><i>port</i>
+<dd style="margin-left: 5.0em">Listens on the specified address and port for encrypted connections.
+<dt><a name="SSLOptions"></a><b>SSLOptions </b>[<i>AllowRC4</i>] [<i>AllowSSL3</i>]
+<dd style="margin-left: 5.0em"><dt><b>SSLOptions None</b>
+<dd style="margin-left: 5.0em">Sets encryption options.
+By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites.
+The <i>AllowRC4</i> option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The <i>AllowSSL3</i> option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+<dt><a name="SSLPort"></a><b>SSLPort </b><i>port</i>
+<dd style="margin-left: 5.0em">Listens on the specified port for encrypted connections.
+<dt><a name="StrictConformance"></a><b>StrictConformance Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>StrictConformance No</b>
+<dd style="margin-left: 5.0em">Specifies whether the scheduler requires clients to strictly adhere to the IPP specifications.
+The default is "No".
+<dt><a name="Timeout"></a><b>Timeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the HTTP request timeout.
+The default is "300" (5 minutes).
+<dt><a name="WebInterface"></a><b>WebInterface yes</b>
+<dd style="margin-left: 5.0em"><dt><b>WebInterface no</b>
+<dd style="margin-left: 5.0em">Specifies whether the web interface is enabled.
+The default is "No".
+</dl>
+<h3><a name="HTTP_METHOD_NAMES">Http Method Names</a></h3>
+The following HTTP methods are supported by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt>GET
+<dd style="margin-left: 5.0em">Used by a client to download icons and other printer resources and to access the CUPS web interface.
+<dt>HEAD
+<dd style="margin-left: 5.0em">Used by a client to get the type, size, and modification date of resources.
+<dt>OPTIONS
+<dd style="margin-left: 5.0em">Used by a client to establish a secure (SSL/TLS) connection.
+<dt>POST
+<dd style="margin-left: 5.0em">Used by a client to submit IPP requests and HTML forms from the CUPS web interface.
+<dt>PUT
+<dd style="margin-left: 5.0em">Used by a client to upload configuration files.
+</dl>
+<h3><a name="IPP_OPERATION_NAMES">Ipp Operation Names</a></h3>
+The following IPP operations are supported by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt>CUPS-Accept-Jobs
+<dd style="margin-left: 5.0em">Allows a printer to accept new jobs.
+<dt>CUPS-Add-Modify-Class
+<dd style="margin-left: 5.0em">Adds or modifies a printer class.
+<dt>CUPS-Add-Modify-Printer
+<dd style="margin-left: 5.0em">Adds or modifies a printer.
+<dt>CUPS-Authenticate-Job
+<dd style="margin-left: 5.0em">Releases a job that is held for authentication.
+<dt>CUPS-Delete-Class
+<dd style="margin-left: 5.0em">Deletes a printer class.
+<dt>CUPS-Delete-Printer
+<dd style="margin-left: 5.0em">Deletes a printer.
+<dt>CUPS-Get-Classes
+<dd style="margin-left: 5.0em">Gets a list of printer classes.
+<dt>CUPS-Get-Default
+<dd style="margin-left: 5.0em">Gets the server default printer or printer class.
+<dt>CUPS-Get-Devices
+<dd style="margin-left: 5.0em">Gets a list of devices that are currently available.
+<dt>CUPS-Get-Document
+<dd style="margin-left: 5.0em">Gets a document file for a job.
+<dt>CUPS-Get-PPD
+<dd style="margin-left: 5.0em">Gets a PPD file.
+<dt>CUPS-Get-PPDs
+<dd style="margin-left: 5.0em">Gets a list of installed PPD files.
+<dt>CUPS-Get-Printers
+<dd style="margin-left: 5.0em">Gets a list of printers.
+<dt>CUPS-Move-Job
+<dd style="margin-left: 5.0em">Moves a job.
+<dt>CUPS-Reject-Jobs
+<dd style="margin-left: 5.0em">Prevents a printer from accepting new jobs.
+<dt>CUPS-Set-Default
+<dd style="margin-left: 5.0em">Sets the server default printer or printer class.
+<dt>Cancel-Job
+<dd style="margin-left: 5.0em">Cancels a job.
+<dt>Cancel-Jobs
+<dd style="margin-left: 5.0em">Cancels one or more jobs.
+<dt>Cancel-My-Jobs
+<dd style="margin-left: 5.0em">Cancels one or more jobs creates by a user.
+<dt>Cancel-Subscription
+<dd style="margin-left: 5.0em">Cancels a subscription.
+<dt>Close-Job
+<dd style="margin-left: 5.0em">Closes a job that is waiting for more documents.
+<dt>Create-Job
+<dd style="margin-left: 5.0em">Creates a new job with no documents.
+<dt>Create-Job-Subscriptions
+<dd style="margin-left: 5.0em">Creates a subscription for job events.
+<dt>Create-Printer-Subscriptions
+<dd style="margin-left: 5.0em">Creates a subscription for printer events.
+<dt>Get-Job-Attributes
+<dd style="margin-left: 5.0em">Gets information about a job.
+<dt>Get-Jobs
+<dd style="margin-left: 5.0em">Gets a list of jobs.
+<dt>Get-Notifications
+<dd style="margin-left: 5.0em">Gets a list of event notifications for a subscription.
+<dt>Get-Printer-Attributes
+<dd style="margin-left: 5.0em">Gets information about a printer or printer class.
+<dt>Get-Subscription-Attributes
+<dd style="margin-left: 5.0em">Gets information about a subscription.
+<dt>Get-Subscriptions
+<dd style="margin-left: 5.0em">Gets a list of subscriptions.
+<dt>Hold-Job
+<dd style="margin-left: 5.0em">Holds a job from printing.
+<dt>Hold-New-Jobs
+<dd style="margin-left: 5.0em">Holds all new jobs from printing.
+<dt>Pause-Printer
+<dd style="margin-left: 5.0em">Stops processing of jobs by a printer or printer class.
+<dt>Pause-Printer-After-Current-Job
+<dd style="margin-left: 5.0em">Stops processing of jobs by a printer or printer class after the current job is finished.
+<dt>Print-Job
+<dd style="margin-left: 5.0em">Creates a new job with a single document.
+<dt>Purge-Jobs
+<dd style="margin-left: 5.0em">Cancels one or more jobs and deletes the job history.
+<dt>Release-Held-New-Jobs
+<dd style="margin-left: 5.0em">Allows previously held jobs to print.
+<dt>Release-Job
+<dd style="margin-left: 5.0em">Allows a job to print.
+<dt>Renew-Subscription
+<dd style="margin-left: 5.0em">Renews a subscription.
+<dt>Restart-Job
+<dd style="margin-left: 5.0em">Reprints a job, if possible.
+<dt>Send-Document
+<dd style="margin-left: 5.0em">Adds a document to a job.
+<dt>Set-Job-Attributes
+<dd style="margin-left: 5.0em">Changes job information.
+<dt>Set-Printer-Attributes
+<dd style="margin-left: 5.0em">Changes printer or printer class information.
+<dt>Validate-Job
+<dd style="margin-left: 5.0em">Validates options for a new job.
+</dl>
+<h3><a name="LOCATION_PATHS">Location Paths</a></h3>
+The following paths are commonly used when configuring
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt>/
+<dd style="margin-left: 5.0em">The path for all get operations (get-printers, get-jobs, etc.)
+<dt>/admin
+<dd style="margin-left: 5.0em">The path for all administration operations (add-printer, delete-printer, start-printer, etc.)
+<dt>/admin/conf
+<dd style="margin-left: 5.0em">The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)
+<dt>/admin/log
+<dd style="margin-left: 5.0em">The path for access to the CUPS log files (access_log, error_log, page_log)
+<dt>/classes
+<dd style="margin-left: 5.0em">The path for all printer classes
+<dt>/classes/name
+<dd style="margin-left: 5.0em">The resource for the named printer class
+<dt>/jobs
+<dd style="margin-left: 5.0em">The path for all jobs (hold-job, release-job, etc.)
+<dt>/jobs/id
+<dd style="margin-left: 5.0em">The path for the specified job.
+<dt>/printers
+<dd style="margin-left: 5.0em">The path for all printers
+<dt>/printers/name
+<dd style="margin-left: 5.0em">The path for the named printer
+<dt>/printers/name.png
+<dd style="margin-left: 5.0em">The icon file path for the named printer
+<dt>/printers/name.ppd
+<dd style="margin-left: 5.0em">The PPD file path for the named printer
+</dl>
+<h3><a name="DIRECTIVES_VALID_WITHIN_LOCATION_AND_LIMIT_SECTIONS">Directives Valid Within Location And Limit Sections</a></h3>
+The following directives may be placed inside Location and Limit sections in the <b>cupsd.conf</b> file:
+<dl class="man">
+<dt><b>Allow all</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow none</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>host.domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow *.</b><i>domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>ipv4-address</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>ipv4-address</i><b>/</b><i>netmask</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>ipv4-address</i><b>/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow [</b><i>ipv6-address</i><b>]</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow [</b><i>ipv6-address</i><b>]/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow @IF(</b><i>name</i><b>)</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow @LOCAL</b>
+<dd style="margin-left: 5.0em">Allows access from the named hosts, domains, addresses, or interfaces.
+The Order directive controls whether Allow lines are evaluated before or after Deny lines.
+<dt><b>AuthType None</b>
+<dd style="margin-left: 5.0em"><dt><b>AuthType Basic</b>
+<dd style="margin-left: 5.0em"><dt><b>AuthType Default</b>
+<dd style="margin-left: 5.0em"><dt><b>AuthType Negotiate</b>
+<dd style="margin-left: 5.0em">Specifies the type of authentication required.
+The value "Default" corresponds to the DefaultAuthType value.
+<dt><b>Deny all</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny none</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>host.domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny *.</b><i>domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>ipv4-address</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>ipv4-address</i><b>/</b><i>netmask</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>ipv4-address</i><b>/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny [</b><i>ipv6-address</i><b>]</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny [</b><i>ipv6-address</i><b>]/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny @IF(</b><i>name</i><b>)</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny @LOCAL</b>
+<dd style="margin-left: 5.0em">Denies access from the named hosts, domains, addresses, or interfaces.
+The Order directive controls whether Deny lines are evaluated before or after Allow lines.
+<dt><b>Encryption IfRequested</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Never</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Required</b>
+<dd style="margin-left: 5.0em">Specifies the level of encryption that is required for a particular location.
+The default value is "IfRequested".
+<dt><b>Order allow,deny</b>
+<dd style="margin-left: 5.0em">Specifies that access is denied by default. Allow lines are then processed followed by Deny lines to determine whether a client may access a particular resource.
+<dt><b>Order deny,allow</b>
+<dd style="margin-left: 5.0em">Specifies that access is allowed by default. Deny lines are then processed followed by Allow lines to determine whether a client may access a particular resource.
+<dt><b>Require group </b><i>group-name </i>[ <i>group-name </i>... ]
+<dd style="margin-left: 5.0em">Specifies that an authenticated user must be a member of one of the named groups.
+<dt><b>Require user {</b><i>user-name</i>|<b>@</b><i>group-name</i>} ...
+<dd style="margin-left: 5.0em">Specifies that an authenticated user must match one of the named users or be a member of one of the named groups.
+The group name "@SYSTEM" corresponds to the list of groups defined by the SystemGroup directive in the
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file.
+The group name "@OWNER" corresponds to the owner of the resource, for example the person that submitted a print job.
+<dt><b>Require valid-user</b>
+<dd style="margin-left: 5.0em">Specifies that any authenticated user is acceptable.
+<dt><b>Satisfy all</b>
+<dd style="margin-left: 5.0em">Specifies that all Allow, AuthType, Deny, Order, and Require conditions must be satisfied to allow access.
+<dt><b>Satisfy any</b>
+<dd style="margin-left: 5.0em">Specifies that any a client may access a resource if either the authentication (AuthType/Require) or address (Allow/Deny/Order) conditions are satisfied.
+For example, this can be used to require authentication only for remote accesses.
+</dl>
+<h3><a name="DIRECTIVES_VALID_WITHIN_POLICY_SECTIONS">Directives Valid Within Policy Sections</a></h3>
+The following directives may be placed inside Policy sections in the <b>cupsd.conf</b> file:
+<dl class="man">
+<dt><b>JobPrivateAccess all</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateAccess default</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateAccess </b>{<i>user</i>|<b>@</b><i>group</i>|<b>@ACL</b>|<b>@OWNER</b>|<b>@SYSTEM</b>} ...
+<dd style="margin-left: 5.0em">Specifies an access list for a job's private values.
+The "default" access list is "@OWNER @SYSTEM".
+"@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values.
+"@OWNER" maps to the job's owner.
+"@SYSTEM" maps to the groups listed for the SystemGroup directive in the
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file.
+<dt><b>JobPrivateValues all</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateValues default</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateValues none</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateValues </b><i>attribute-name </i>[ ... <i>attribute-name </i>]
+<dd style="margin-left: 5.0em">Specifies the list of job values to make private.
+The "default" values are "job-name", "job-originating-host-name", "job-originating-user-name", and "phone".
+<dt><b>SubscriptionPrivateAccess all</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateAccess default</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateAccess </b>{<i>user</i>|<b>@</b><i>group</i>|<b>@ACL</b>|<b>@OWNER</b>|<b>@SYSTEM</b>} ...
+<dd style="margin-left: 5.0em">Specifies an access list for a subscription's private values.
+The "default" access list is "@OWNER @SYSTEM".
+"@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values.
+"@OWNER" maps to the job's owner.
+"@SYSTEM" maps to the groups listed for the SystemGroup directive in the
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file.
+<dt><b>SubscriptionPrivateValues all</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateValues default</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateValues none</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateValues </b><i>attribute-name </i>[ ... <i>attribute-name </i>]
+<dd style="margin-left: 5.0em">Specifies the list of subscription values to make private.
+The "default" values are "notify-events", "notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and "notify-user-data".
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The <b>cupsd.conf</b> file format is based on the Apache HTTP Server configuration file format.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Log everything with a maximum log file size of 32 megabytes:
+<pre class="man">
+
+ AccessLogLevel all
+ LogLevel debug2
+ MaxLogSize 32m
+
+</pre>
+Require authentication for accesses from outside the 10. network:
+<pre class="man">
+
+ &lt;Location />
+ Order allow,deny
+ Allow from 10./8
+ AuthType Basic
+ Require valid-user
+ Satisfy any
+ &lt;/Location>
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd.html b/doc/help/man-cupsd.html
new file mode 100644
index 0000000..de12942
--- /dev/null
+++ b/doc/help/man-cupsd.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsd(8)</title>
+</head>
+<body>
+<h1 class="title">cupsd(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd - cups scheduler
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsd</b>
+[
+<b>-c</b>
+<i>config-file</i>
+] [
+<b>-f</b>
+] [
+<b>-F</b>
+] [
+<b>-h</b>
+] [
+<b>-l</b>
+] [
+<b>-t</b>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsd</b>
+is the scheduler for CUPS. It implements a printing system based upon the Internet Printing Protocol, version 2.1. If no options are specified on the command-line then the default configuration file
+<i>/etc/cups/cupsd.conf</i>
+will be used.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<dl class="man">
+<dt><b>-c</b><i> config-file</i>
+<dd style="margin-left: 5.0em">Uses the named configuration file.
+<dt><b>-f</b>
+<dd style="margin-left: 5.0em">Run
+<b>cupsd</b>
+in the foreground; the default is to run in the background as a "daemon".
+<dt><b>-F</b>
+<dd style="margin-left: 5.0em">Run
+<b>cupsd</b>
+in the foreground but detach the process from the controlling terminal and current directory. This is useful for running
+<b>cupsd</b>
+from
+<b>init</b>(8).
+<dt><b>-h</b>
+<dd style="margin-left: 5.0em">Shows the program usage.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">This option is passed to
+<b>cupsd</b>
+when it is run from
+<b>launchd</b>(8)
+or
+<b>systemd</b>(8).
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Test the configuration file for syntax errors.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+<i>/etc/cups/classes.conf</i>
+<i>/etc/cups/cups-files.conf</i>
+<i>/etc/cups/cupsd.conf</i>
+<i>/usr/share/cups/mime/mime.convs</i>
+<i>/usr/share/cups/mime/mime.types</i>
+<i>/etc/cups/printers.conf</i>
+<i>/etc/cups/subscriptions.conf</i>
+</pre>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+<b>cupsd</b>
+implements all of the required IPP/2.1 attributes and operations. It also implements several CUPS-specific administrative operations.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Run
+<b>cupsd</b>
+in the background with the default configuration file:
+<pre class="man">
+
+ cupsd
+
+</pre>
+Test a configuration file called
+<i>test.conf</i>:
+<pre class="man">
+
+ cupsd -t -c test.conf
+
+</pre>
+Run
+<b>cupsd</b>
+in the foreground with a test configuration file called
+<i>test.conf</i>:
+<pre class="man">
+
+ cupsd -f -c test.conf
+
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cups-lpd.html?TOPIC=Man+Pages"><b>cups-lpd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd-helper.html?TOPIC=Man+Pages"><b>cupsd-helper</b>(8),</a>
+<a href="man-cupsd-logs.html?TOPIC=Man+Pages"><b>cupsd-logs</b>(8),</a>
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+<b>launchd</b>(8),
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<b>systemd</b>(8),
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsenable.html b/doc/help/man-cupsenable.html
new file mode 100644
index 0000000..fe00393
--- /dev/null
+++ b/doc/help/man-cupsenable.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsenable(8)</title>
+</head>
+<body>
+<h1 class="title">cupsenable(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsdisable, cupsenable - stop/start printers and classes
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsdisable</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-r</b>
+<i>reason</i>
+] [
+<b>--hold</b>
+]
+<i>destination(s)</i>
+<br>
+<b>cupsenable</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>--release</b>
+]
+<i>destination(s)</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsenable</b>
+starts the named printers or classes while
+<b>cupsdisable</b>
+stops the named printers or classes.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options may be used:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption of the connection to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Uses the specified username when connecting to the server.
+<dt><b>-c</b>
+<dd style="margin-left: 5.0em">Cancels all jobs on the named destination.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Uses the specified server and port.
+<dt><b>--hold</b>
+<dd style="margin-left: 5.0em">Holds remaining jobs on the named printer.
+Useful for allowing the current job to complete before performing maintenance.
+<dt><b>-r "</b><i>reason</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the message associated with the stopped state.
+If no reason is specified then the message is set to "Reason Unknown".
+<dt><b>--release</b>
+<dd style="margin-left: 5.0em">Releases pending jobs for printing.
+Use after running <b>cupsdisable</b> with the <i>--hold</i> option to resume printing.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
+Also, printer and class names are <i>not</i> case-sensitive.
+<p>The System V versions of these commands are <b>disable</b> and <b>enable</b>, respectively.
+They have been renamed to avoid conflicts with the
+<b>bash</b>(1)
+build-in commands of the same names.
+<p>The CUPS versions of <b>disable</b> and <b>enable</b> may ask the user for an access password depending on the printing system configuration.
+This differs from the System V versions which require the root user to execute these commands.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8),</a>
+<b>cupsreject</b>(8),
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+
+</body>
+</html>
diff --git a/doc/help/man-cupsfilter.html b/doc/help/man-cupsfilter.html
new file mode 100644
index 0000000..1e32c1e
--- /dev/null
+++ b/doc/help/man-cupsfilter.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupsfilter(8)</title>
+</head>
+<body>
+<h1 class="title">cupsfilter(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsfilter - convert a file to another format using cups filters
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsfilter</b>
+[
+<b>--list-filters</b>
+] [
+<b>-D</b>
+] [
+<b>-U</b>
+<i>user</i>
+] [
+<b>-c</b>
+<i>config-file</i>
+] [
+<b>-d</b>
+<i>printer</i>
+] [
+<b>-e</b>
+] [
+<b>-i</b>
+<i>mime/type</i>
+] [
+<b>-j</b>
+<i>job-id[,N]</i>
+] [
+<b>-m</b>
+<i>mime/type</i>
+] [
+<b>-n</b>
+<i>copies</i>
+] [
+<b>-o</b>
+<i>name=value</i>
+] [
+<b>-p</b>
+<i>filename.ppd</i>
+] [
+<b>-t</b>
+<i>title</i>
+] [
+<b>-u</b>
+]
+<i>filename</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsfilter</b>
+is a front-end to the CUPS filter subsystem which allows you to convert a file to a specific format, just as if you had printed the file through CUPS. By default,
+<b>cupsfilter</b>
+generates a PDF file. The converted file is sent to the standard output.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<dl class="man">
+<dt><b>--list-filters</b>
+<dd style="margin-left: 5.0em">Do not actually run the filters, just print the filters used to stdout.
+<dt><b>-D</b>
+<dd style="margin-left: 5.0em">Delete the input file after conversion.
+<dt><b>-U </b><i>user</i>
+<dd style="margin-left: 5.0em">Specifies the username passed to the filters. The default is the name of the current user.
+<dt><b>-c </b><i>config-file</i>
+<dd style="margin-left: 5.0em">Uses the named cups-files.conf configuration file.
+<dt><b>-d </b><i>printer</i>
+<dd style="margin-left: 5.0em">Uses information from the named printer.
+<dt><b>-e</b>
+<dd style="margin-left: 5.0em">Use every filter from the PPD file.
+<dt><b>-i </b><i>mime/type</i>
+<dd style="margin-left: 5.0em">Specifies the source file type. The default file type is guessed using the filename and contents of the file.
+<dt><b>-j </b><i>job-id[,N]</i>
+<dd style="margin-left: 5.0em">Converts document N from the specified job. If N is omitted, document 1 is converted.
+<dt><b>-m </b><i>mime/type</i>
+<dd style="margin-left: 5.0em">Specifies the destination file type. The default file type is application/pdf. Use printer/foo to convert to the printer format defined by the filters in the PPD file.
+<dt><b>-n </b><i>copies</i>
+<dd style="margin-left: 5.0em">Specifies the number of copies to generate.
+<dt><b>-o </b><i>name=value</i>
+<dd style="margin-left: 5.0em">Specifies options to pass to the CUPS filters.
+<dt><b>-p </b><i>filename.ppd</i>
+<dd style="margin-left: 5.0em">Specifies the PPD file to use.
+<dt><b>-t </b><i>title</i>
+<dd style="margin-left: 5.0em">Specifies the document title.
+<dt><b>-u</b>
+<dd style="margin-left: 5.0em">Delete the PPD file after conversion.
+</dl>
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+<b>cupsfilter</b>
+returns a non-zero exit status on any error.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+All of the standard
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1)</a>
+environment variables affect the operation of
+<b>cupsfilter</b>.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+/etc/cups/cups-files.conf
+/etc/cups/*.convs
+/etc/cups/*.types
+/usr/share/cups/mime/*.convs
+/usr/share/cups/mime/*.types
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+Unlike when printing, filters run using the
+<b>cupsfilter</b>
+command use the current user and security session. This may result in different output or unexpected behavior.
+<h2 class="title"><a name="EXAMPLE">Example</a></h2>
+The following command will generate a PDF preview of job 42 for a printer named "myprinter" and save it to a file named "preview.pdf":
+<pre class="man">
+
+ cupsfilter -m application/pdf -d myprinter -j 42 >preview.pdf
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<b>filter(7),</b>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(7),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(7),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupstestdsc.html b/doc/help/man-cupstestdsc.html
new file mode 100644
index 0000000..5a99948
--- /dev/null
+++ b/doc/help/man-cupstestdsc.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupstestdsc(1)</title>
+</head>
+<body>
+<h1 class="title">cupstestdsc(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupstestdsc - test conformance of postscript files (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupstestdsc</b>
+[
+<b>-h</b>
+]
+<i>filename.ps</i>
+[ ...
+<i>filenameN.ps</i>
+]
+<br>
+<b>cupstestdsc</b>
+[
+<b>-h</b>
+]
+<b>-</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupstestdsc</b> tests the conformance of PostScript files to the Adobe PostScript Language Document Structuring Conventions Specification version 3.0.
+The results of testing and any other output are sent to the standard output.
+The second form of the command reads PostScript from the standard input.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+<i>This program is deprecated and will be removed in a future release of CUPS.</i>
+<p><b>cupstestdsc</b> only validates the DSC comments in a PostScript file and does not attempt to validate the PostScript code itself.
+Developers must ensure that the PostScript they generate follows the rules defined by Adobe.
+Specifically, all pages must be independent of each other, code outside page descriptions may not affect the graphics state (current font, color, transform matrix, etc.), and device-specific commands such as setpagedevice should not be used.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+Adobe PostScript Language Document Structuring Conventions
+Specification, Version 3.0.
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupstestppd.html b/doc/help/man-cupstestppd.html
new file mode 100644
index 0000000..28d2518
--- /dev/null
+++ b/doc/help/man-cupstestppd.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>cupstestppd(1)</title>
+</head>
+<body>
+<h1 class="title">cupstestppd(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupstestppd - test conformance of ppd files
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupstestppd</b>
+[
+<b>-I</b>
+<i>category</i>
+] [
+<b>-R</b>
+<i>rootdir</i>
+] [
+<b>-W</b>
+<i>category</i>
+] [
+<b>-q</b>
+] [
+<b>-r</b>
+] [
+<b>-v</b>[<b>v</b>]
+]
+<i>filename.ppd[.gz]</i>
+[ ...
+<i>filename.ppd[.gz]</i>
+]
+<br>
+<b>cupstestppd</b>
+[
+<b>-R</b>
+<i>rootdir</i>
+] [
+<b>-W</b>
+<i>category</i>
+] [
+<b>-q</b>
+] [
+<b>-r</b>
+] [
+<b>-v</b>[<b>v</b>]
+]
+<b>-</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupstestppd</b> tests the conformance of PPD files to the Adobe PostScript Printer Description file format specification version 4.3.
+It can also be used to list the supported options and available fonts in a PPD file.
+The results of testing and any other output are sent to the standard output.
+<p>The first form of <b>cupstestppd</b> tests one or more PPD files on the command-line.
+The second form tests the PPD file provided on the standard input.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>cupstestppd</b> supports the following options:
+<dl class="man">
+<dt><b>-I filename</b>
+<dd style="margin-left: 5.0em">Ignores all PCFileName warnings.
+<dt><b>-I filters</b>
+<dd style="margin-left: 5.0em">Ignores all filter errors.
+<dt><b>-I profiles</b>
+<dd style="margin-left: 5.0em">Ignores all profile errors.
+<dt><b>-R </b><i>rootdir</i>
+<dd style="margin-left: 5.0em">Specifies an alternate root directory for the filter, pre-filter, and other support file checks.
+<dt><b>-W constraints</b>
+<dd style="margin-left: 5.0em">Report all UIConstraint errors as warnings.
+<dt><b>-W defaults</b>
+<dd style="margin-left: 5.0em">Except for size-related options, report all default option errors as warnings.
+<dt><b>-W filters</b>
+<dd style="margin-left: 5.0em">Report all filter errors as warnings.
+<dt><b>-W profiles</b>
+<dd style="margin-left: 5.0em">Report all profile errors as warnings.
+<dt><b>-W sizes</b>
+<dd style="margin-left: 5.0em">Report all media size errors as warnings.
+<dt><b>-W translations</b>
+<dd style="margin-left: 5.0em">Report all translation errors as warnings.
+<dt><b>-W all</b>
+<dd style="margin-left: 5.0em">Report all of the previous errors as warnings.
+<dt><b>-W none</b>
+<dd style="margin-left: 5.0em">Report all of the previous errors as errors.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em">Specifies that no information should be displayed.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em">Relaxes the PPD conformance requirements so that common whitespace, control character, and formatting problems are not treated as hard errors.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies that detailed conformance testing results should be displayed rather than the concise PASS/FAIL/ERROR status.
+<dt><b>-vv</b>
+<dd style="margin-left: 5.0em">Specifies that all information in the PPD file should be displayed in addition to the detailed conformance testing results.
+</dl>
+<p>The <i>-q</i>, <i>-v</i>, and <i>-vv</i> options are mutually exclusive.
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+<b>cupstestppd</b> returns zero on success and non-zero on error.
+The error codes are as follows:
+<dl class="man">
+<dt>1
+<dd style="margin-left: 5.0em">Bad command-line arguments or missing PPD filename.
+<dt>2
+<dd style="margin-left: 5.0em">Unable to open or read PPD file.
+<dt>3
+<dd style="margin-left: 5.0em">The PPD file contains format errors that cannot be skipped.
+<dt>4
+<dd style="margin-left: 5.0em">The PPD file does not conform to the Adobe PPD specification.
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+The following command will test all PPD files under the current directory and print the names of each file that does not conform:
+<pre class="man">
+
+ find . -name \*.ppd \! -exec cupstestppd -q '{}' \; -print
+
+</pre>
+The next command tests all PPD files under the current directory and print detailed conformance testing results for the files that do not conform:
+<pre class="man">
+
+ find . -name \*.ppd \! -exec cupstestppd -q '{}' \; \
+ -exec cupstestppd -v '{}' \;
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+Adobe PostScript Printer Description File Format Specification, Version 4.3.
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-filter.html b/doc/help/man-filter.html
new file mode 100644
index 0000000..bb4f620
--- /dev/null
+++ b/doc/help/man-filter.html
@@ -0,0 +1,189 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>filter(7)</title>
+</head>
+<body>
+<h1 class="title">filter(7)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+filter - cups file conversion filter interface
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>filter</b>
+<i>job</i>
+<i>user</i>
+<i>title</i>
+<i>num-copies</i>
+<i>options</i>
+[
+<i>filename</i>
+]
+<pre class="man">
+
+<b>#include &lt;cups/cups.h></b>
+
+<b>ssize_t cupsBackChannelRead</b>(<b>char *</b><i>buffer</i>, <b>size_t </b><i>bytes</i>,
+ <b>double </b><i>timeout</i>);
+
+<b>cups_sc_status_t cupsSideChannelDoRequest</b>(<b>cups_sc_command_t </b><i>command</i>,
+ <b>char *</b><i>data</i>, <b>int *</b><i>datalen</i>,
+ <b>double </b><i>timeout</i>);
+
+<b>#include &lt;cups/ppd.h></b>
+
+<b>const char *cupsGetOption</b>(<b>const char *</b><i>name</i>, <b>int </b><i>num_options</i>,
+ <b>cups_option_t *</b><i>options</i>);
+
+<b>int cupsMarkOptions</b>(<b>ppd_file_t *</b><i>ppd</i>, <b>int </b><i>num_options</i>,
+ <b>cups_option_t *</b><i>options</i>);
+
+<b>int cupsParseOptions</b>(<b>const char *</b><i>arg</i>, <b>int </b><i>num_options</i>,
+ <b>cups_option_t **</b><i>options</i>);
+
+<b>ppd_choice_t *ppdFindMarkedChoice</b>(<b>ppd_file_t *</b><i>ppd</i>, <b>const char *</b><i>keyword</i>);
+
+<b>void ppdMarkDefaults</b>(<b>ppd_file_t *</b><i>ppd</i>);
+
+<b>ppd_file_t *ppdOpenFile</b>(<b>const char *</b><i>filename</i>);
+</pre>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The CUPS filter interface provides a standard method for adding support for new document types or printers to CUPS.
+Each filter is capable of converting from one or more input formats to another format that can either be printed directly or piped into another filter to get it to a printable format.
+<p>Filters <b>MUST</b> be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the file format.
+All output <b>MUST</b> be sent to the standard output.
+Filters <b>MUST NOT</b> attempt to communicate directly with the printer, other processes, or other services.
+<p>The command name (<i>argv[0]</i>) is set to the name of the destination printer but is also available in the <b>PRINTER</b><i> environment variable.
+</i><h2 class="title"><a name="OPTIONS">Options</a></h2>
+Options are passed in <i>argv[5]</i> and are encoded from the corresponding IPP attributes used when the job was submitted. Use the
+<b>cupsParseOptions</b>()
+function to load the options into a <b>cups_option_t</b> array and the
+<b>cupsGetOption</b>()
+function to get the value of a specific attribute.
+Be careful to look for common aliases of IPP attributes such as "landscape" for the IPP "orientation-requested" attribute.
+<p>Options passed on the command-line typically do not include the default choices the printer's PPD file. Use the
+<b>ppdMarkDefaults</b>()
+and
+<b>cupsMarkOptions</b>()
+functions in the CUPS library to apply the options to the PPD defaults and map any IPP attributes to the corresponding PPD options.
+Use
+<b>ppdFindMarkedChoice</b>()
+to get the user-selected choice for a PPD option. For example, a filter might use the following code to determine the current value of the <b>Duplex</b> PPD option:
+<pre class="man">
+
+ ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+ cups_option_t *options = NULL;
+ int num_options = cupsParseOptions(argv[5], 0, &amp;options);
+
+ ppdMarkDefaults(ppd);
+ cupsMarkOptions(ppd, num_options, options);
+
+ ppd_choice_t *choice = ppdFindMarkedChoice(ppd, "Duplex");
+</pre>
+<p>Raster filters should use option choices set through the raster page header, as those reflect the options in effect for a given page.
+Options specified on the command-line determine the default values for the entire job, which can be overridden on a per-page basis.
+<h2 class="title"><a name="LOG_MESSAGES">Log Messages</a></h2>
+Messages sent to the standard error are generally stored in the printer's "printer-state-message" attribute and the current <b>ErrorLog</b> file.
+Each line begins with a standard prefix:
+<dl class="man">
+<dt><b>ALERT: </b><i>message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "alert" log level.
+<dt><b>ATTR: </b><i>attribute=value </i>[ <i>... attribute=value</i>]
+<dd style="margin-left: 5.0em">Sets the named job or printer attribute(s). The following job attributes can be set: "job-media-progress". The following printer attributes can be set:
+"auth-info-required", "marker-colors", "marker-high-levels", "marker-levels",
+"marker-low-levels", "marker-message", "marker-names", "marker-types",
+"printer-alert", and "printer-alert-description".
+<dt><b>CRIT: </b><i>message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "critical" log level.
+<dt><b>DEBUG: </b><i>message</i>
+<dd style="margin-left: 5.0em">Adds the specified message to the current <b>ErrorLog</b> using the "debug" log level.
+<b>DEBUG</b> messages are never stored in the "printer-state-message" attribute.
+<dt><b>DEBUG2: </b><i>message</i>
+<dd style="margin-left: 5.0em"><br>
+Adds the specified message to the current <b>ErrorLog</b> using the "debug2" log level.
+<b>DEBUG2</b> messages are never stored in the "printer-state-message" attribute.
+<dt><b>EMERG: </b><i>message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "emergency" log level.
+<dt><b>ERROR:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "error" log level.
+<dt><b>INFO:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute. If the current <b>LogLevel</b> is set to "debug2", also adds the specified message to the current <b>ErrorLog</b> using the "info" log level.
+<dt><b>NOTICE:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "notice" log level.
+<dt><b>PAGE:</b><i> page-number #-copies</i>
+<dd style="margin-left: 5.0em"><dt><b>PAGE:</b><i> total #-pages</i>
+<dd style="margin-left: 5.0em">Adds an entry to the current <b>PageLog</b>. The first form adds <i>#-copies</i> to the "job-media-sheets-completed" attribute. The second form sets the "job-media-sheets-completed" attribute to <i>#-pages</i>.
+<dt><b>PPD:</b><i> Keyword=Value</i> [ <i>... KeywordN=Value</i> ]
+<dd style="margin-left: 5.0em">Sets the named keywords in the printer's PPD file. This is typically used to update default option keywords such as <b>DefaultPageSize</b> and the various installable options in the PPD file.
+<dt><b>STATE:</b><i> printer-state-reason </i>[ <i>... printer-state-reason</i> ]
+<dd style="margin-left: 5.0em"><dt><b>STATE: +</b><i> printer-state-reason </i>[ <i>... printer-state-reason</i> ]
+<dd style="margin-left: 5.0em"><dt><b>STATE: -</b><i> printer-state-reason </i>[ <i>... printer-state-reason</i> ]
+<dd style="margin-left: 5.0em">Sets, adds, or removes "printer-state-reason" keywords for the current queue. Typically this is used to indicate media, ink, and toner conditions on a printer.
+<dt><b>WARNING:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "warning" log level.
+</dl>
+<h2 class="title"><a name="ENVIRONMENT_VARIABLES">Environment Variables</a></h2>
+The following environment variables are defined by the CUPS
+server when executing the filter:
+<dl class="man">
+<dt><b>CHARSET</b>
+<dd style="margin-left: 5.0em">The default text character set, typically "utf-8".
+<dt><b>CLASS</b>
+<dd style="margin-left: 5.0em">When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set.
+<dt><b>CONTENT_TYPE</b>
+<dd style="margin-left: 5.0em">The MIME media type associated with the submitted job file, for example "application/postscript".
+<dt><b>CUPS_CACHEDIR</b>
+<dd style="margin-left: 5.0em">The directory where semi-persistent cache files can be found and stored.
+<dt><b>CUPS_DATADIR</b>
+<dd style="margin-left: 5.0em">The directory where data files can be found.
+<dt><b>CUPS_FILETYPE</b>
+<dd style="margin-left: 5.0em">The type of file being printed: "job-sheet" for a banner page and "document"
+for a regular print file.
+<dt><b>CUPS_MAX_MESSAGE</b>
+<dd style="margin-left: 5.0em">The maximum size of a message sent to <i>stderr</i>, including any leading prefix and the trailing newline.
+<dt><b>CUPS_SERVERROOT</b>
+<dd style="margin-left: 5.0em">The root directory of the server.
+<dt><b>FINAL_CONTENT_TYPE</b>
+<dd style="margin-left: 5.0em">The MIME media type associated with the output destined for the printer, for example "application/vnd.cups-postscript".
+<dt><b>LANG</b>
+<dd style="margin-left: 5.0em">The default language locale (typically C or en).
+<dt><b>PATH</b>
+<dd style="margin-left: 5.0em">The standard execution path for external programs that may be run by the filter.
+<dt><b>PPD</b>
+<dd style="margin-left: 5.0em">The full pathname of the PostScript Printer Description (PPD) file for this printer.
+<dt><b>PRINTER</b>
+<dd style="margin-left: 5.0em">The name of the printer.
+<dt><b>RIP_CACHE</b>
+<dd style="margin-left: 5.0em">The recommended amount of memory to use for Raster Image Processors (RIPs).
+<dt><b>SOFTWARE</b>
+<dd style="margin-left: 5.0em">The name and version number of the server (typically CUPS/<i>major.minor</i>).
+<dt><b>TZ</b>
+<dd style="margin-left: 5.0em">The timezone of the server.
+<dt><b>USER</b>
+<dd style="margin-left: 5.0em">The user executing the filter, typically "lp" or "root"; consult the <i>cups-files.conf</i> file for the current setting.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+While the filter interface is compatible with System V interface
+scripts, it will only work with the System V interface script as the
+only filter. Typically the interface script will be provided via the
+<i>lpadmin(8)</i> command using the <i>-i</i> option.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+CUPS filters are not meant to be run directly by the user.
+Aside from the legacy System V interface issues (<i>argv[0]</i> is the printer name), CUPS filters also expect specific environment variables and file descriptors, and typically run in a user session that (on OS X) has additional restrictions that affect how it runs.
+Unless you are a developer and know what you are doing, please do not run filters directly.
+Instead, use the
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8)</a>
+program to use the appropriate filters to do the conversions you need.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ippfind.html b/doc/help/man-ippfind.html
new file mode 100644
index 0000000..41445fe
--- /dev/null
+++ b/doc/help/man-ippfind.html
@@ -0,0 +1,204 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ippfind(1)</title>
+</head>
+<body>
+<h1 class="title">ippfind(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ippfind - find internet printing protocol printers
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ippfind</b>
+[
+<i>options</i>
+] <i>regtype</i>[<b>,</b><i>subtype</i>][<b>.</b><i>domain</i><b>.</b>] ... [
+<i>expression</i>
+ ... ]
+<br>
+<b>ippfind</b>
+[
+<i>options</i>
+] <i>name</i>[<b>.</b><i>regtype</i>[<b>.</b><i>domain</i><b>.</b>]] ... [
+<i>expression</i>
+ ... ]
+<br>
+<b>ippfind</b>
+<b>--help</b>
+<br>
+<b>ippfind</b>
+<b>--version</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ippfind</b> finds services registered with a DNS server or available through local devices.
+Its primary purpose is to find IPP printers and show their URIs, show their current status, or run commands.
+<h3><a name="REGISTRATION_TYPES">Registration Types</a></h3>
+<b>ippfind</b> supports the following registration types:
+<dl class="man">
+<dt>_http._tcp
+<dd style="margin-left: 5.0em">HyperText Transport Protocol (HTTP, RFC 2616)
+<dt>_https._tcp
+<dd style="margin-left: 5.0em">Secure HyperText Transport Protocol (HTTPS, RFC 2818)
+<dt>_ipp._tcp
+<dd style="margin-left: 5.0em">Internet Printing Protocol (IPP, RFC 2911)
+<dt>_ipps._tcp
+<dd style="margin-left: 5.0em">Secure Internet Printing Protocol (IPPS, draft)
+<dt>_printer._tcp
+<dd style="margin-left: 5.0em">Line Printer Daemon (LPD, RFC 1179)
+</dl>
+<h3><a name="EXPRESSIONS">Expressions</a></h3>
+<b>ippfind</b> supports expressions much like the
+<b>find</b>(1)
+utility.
+However, unlike
+<b>find</b>(1),
+<b>ippfind</b> uses POSIX regular expressions instead of shell filename matching patterns.
+If <i>--exec</i>, <i>-l</i>, <i>--ls</i>, <i>-p</i>, <i>--print</i>, <i>--print-name</i>, <i>-q</i>, <i>--quiet</i>, <i>-s</i>, or <i>-x</i> is not specified, <b>ippfind</b> adds <i>--print</i> to print the service URI of anything it finds.
+The following expressions are supported:
+<dl class="man">
+<dt><b>-d </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--domain </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the domain matches the given regular expression.
+<dt><b>--false</b>
+<dd style="margin-left: 5.0em">Always false.
+<dt><b>-h </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--host </b><i>regex</i>
+<dd style="margin-left: 5.0em">True is the hostname matches the given regular expression.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em"><dt><b>--ls</b>
+<dd style="margin-left: 5.0em">Lists attributes returned by Get-Printer-Attributes for IPP printers and traditional <i>find</i> "-ls" output for HTTP URLs.
+The result is true if the URI is accessible, false otherwise.
+<dt><b>--local</b>
+<dd style="margin-left: 5.0em">True if the service is local to this computer.
+<dt><b>-n </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--name </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the service instance name matches the given regular expression.
+<dt><b>--path </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the URI resource path matches the given regular expression.
+<dt><b>-P </b><i>number</i>[<b>-</b><i>number</i>]
+<dd style="margin-left: 5.0em"><dt><b>--port </b><i>number</i>[<b>-</b><i>number</i>]
+<dd style="margin-left: 5.0em">True if the port matches the given number or range.
+<dt><b>-p</b>
+<dd style="margin-left: 5.0em"><dt><b>--print</b>
+<dd style="margin-left: 5.0em">Prints the URI if the result of previous expressions is true.
+The result is always true.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em"><dt><b>--quiet</b>
+<dd style="margin-left: 5.0em">Quiet mode - just returns the exit codes below.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em"><dt><b>--remote</b>
+<dd style="margin-left: 5.0em">True if the service is not local to this computer.
+<dt><b>-s</b>
+<dd style="margin-left: 5.0em"><dt><b>--print-name</b>
+<dd style="margin-left: 5.0em">Prints the service instance name if the result of previous expressions is true.
+The result is always true.
+<dt><b>--true</b>
+<dd style="margin-left: 5.0em">Always true.
+<dt><b>-t </b><i>key</i>
+<dd style="margin-left: 5.0em"><dt><b>--txt </b><i>key</i>
+<dd style="margin-left: 5.0em">True if the TXT record contains the named key.
+<dt><b>--txt-</b><i>key regex</i>
+<dd style="margin-left: 5.0em">True if the TXT record contains the named key and matches the given regular expression.
+<dt><b>-u </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--uri </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the URI matches the given regular expression.
+<dt><b>-x </b><i>utility </i>[ <i>argument </i>... ] <b>;</b>
+<dd style="margin-left: 5.0em"><dt><b>--exec </b><i>utility </i>[ <i>argument </i>... ] <b>;</b>
+<dd style="margin-left: 5.0em">Executes the specified program if the current result is true.
+"{foo}" arguments are replaced with the corresponding value - see SUBSTITUTIONS below.
+</dl>
+<p>Expressions may also contain modifiers:
+<dl class="man">
+<dt><b>( </b><i>expression </i><b>)</b>
+<dd style="margin-left: 5.0em">Group the result of expressions.
+<dt><b>! </b><i>expression</i>
+<dd style="margin-left: 5.0em"><dt><b>--not </b><i>expression</i>
+<dd style="margin-left: 5.0em">Unary NOT of the expression.
+<dt><i>expression expression</i>
+<dd style="margin-left: 5.0em"><dt><i>expression </i><b>--and </b><i>expression</i>
+<dd style="margin-left: 5.0em">Logical AND of expressions.
+<dt><i>expression </i><b>--or </b><i>expression</i>
+<dd style="margin-left: 5.0em">Logical OR of expressions.
+</dl>
+<h3><a name="SUBSTITUTIONS">Substitutions</a></h3>
+The substitutions for "{foo}" in <i>-e</i> and <i>--exec</i> are:
+<dl class="man">
+<dt><b>{service_domain}</b>
+<dd style="margin-left: 5.0em">Domain name, e.g., "example.com.", "local.", etc.
+<dt><b>{service_hostname}</b>
+<dd style="margin-left: 5.0em">Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
+<dt><b>{service_name}</b>
+<dd style="margin-left: 5.0em">Service instance name, e.g., "My Fine Printer".
+<dt><b>{service_port}</b>
+<dd style="margin-left: 5.0em">Port number for server, typically 631 for IPP and 80 for HTTP.
+<dt><b>{service_regtype}</b>
+<dd style="margin-left: 5.0em">DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
+<dt><b>{service_scheme}</b>
+<dd style="margin-left: 5.0em">URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
+<dt><b>{}</b>
+<dd style="margin-left: 5.0em"><dt><b>{service_uri}</b>
+<dd style="margin-left: 5.0em">URI for service, e.g., "ipp://printer.local./ipp/print", "<a href="http://printer.local./"">http://printer.local./"</a>, etc.
+<dt><b>{txt_</b><i>key</i><b>}</b>
+<dd style="margin-left: 5.0em">Value of TXT record <i>key</i> (lowercase).
+</dl>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ippfind</b> supports the following options:
+<dl class="man">
+<dt><b>--help</b>
+<dd style="margin-left: 5.0em">Show program help.
+<dt><b>--version</b>
+<dd style="margin-left: 5.0em">Show program version.
+<dt><b>-4</b>
+<dd style="margin-left: 5.0em">Use IPv4 when listing.
+<dt><b>-6</b>
+<dd style="margin-left: 5.0em">Use IPv6 when listing.
+<dt><b>-T </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specify find timeout in seconds.
+If 1 or less, <b>ippfind</b> stops as soon as it thinks it has found everything.
+The default timeout is 1 second.
+<dt><b>-V </b><i>version</i>
+<dd style="margin-left: 5.0em">Specifies the IPP version when listing.
+Supported values are "1.1", "2.0", "2.1", and "2.2".
+</dl>
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+<b>ippfind</b> returns 0 if the result for all processed expressions is true, 1 if the result of any processed expression is false, 2 if browsing or any query or resolution failed, 3 if an undefined option or invalid expression was specified, and 4 if it ran out of memory.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+When executing a program, <b>ippfind</b> sets the following environment variables for the matching service registration:
+<dl class="man">
+<dt><b>IPPFIND_SERVICE_DOMAIN</b>
+<dd style="margin-left: 5.0em">Domain name, e.g., "example.com.", "local.", etc.
+<dt><b>IPPFIND_SERVICE_HOSTNAME</b>
+<dd style="margin-left: 5.0em">Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
+<dt><b>IPPFIND_SERVICE_NAME</b>
+<dd style="margin-left: 5.0em">Service instance name, e.g., "My Fine Printer".
+<dt><b>IPPFIND_SERVICE_PORT</b>
+<dd style="margin-left: 5.0em">Port number for server, typically 631 for IPP and 80 for HTTP.
+<dt><b>IPPFIND_SERVICE_REGTYPE</b>
+<dd style="margin-left: 5.0em">DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
+<dt><b>IPPFIND_SERVICE_SCHEME</b>
+<dd style="margin-left: 5.0em">URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
+<dt><b>IPPFIND_SERVICE_URI</b>
+<dd style="margin-left: 5.0em">URI for service, e.g., "ipp://printer.local./ipp/print", "<a href="http://printer.local./"">http://printer.local./"</a>, etc.
+<dt><b>IPPFIND_TXT_fIKEYfR</b>
+<dd style="margin-left: 5.0em">Values of TXT record <i>KEY</i> (uppercase).
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+To show the status of all registered IPP printers on your network, run:
+<pre class="man">
+
+ ippfind --ls
+
+</pre>
+Similarly, to send a PostScript test page to every PostScript printer, run:
+<pre class="man">
+
+ ippfind --txt-pdl application/postscript --exec ipptool
+ -f onepage-letter.ps '{}' print-job.test \;
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(1)</a>
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2013-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ipptool.html b/doc/help/man-ipptool.html
index 189613a..f3e3dc0 100644
--- a/doc/help/man-ipptool.html
+++ b/doc/help/man-ipptool.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE HTML>
<html>
<!-- SECTION: Man Pages -->
<head>
@@ -10,148 +10,212 @@
<h2 class="title"><a name="NAME">Name</a></h2>
ipptool - perform internet printing protocol requests
<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
-<b>ipptool
-</b>[ -4 ] [ -6 ] [ -C ] [ -E ] [ -I ] [ -L ] [ -S ] [ -T
-<i>seconds
-</i>] [ -V
-<i>version
-</i>] [ -X ] [ -c ] [ -d
-<i>name=value
-</i>] [ -f
-<i>filename
-</i>] [ -i
-<i>seconds
-</i>] [ -n
-<i>repeat-count
-</i>] [ -q ] [ -t ] [ -v ]
-<i>URI
-</i><i>filename
-</i>[
-<i>... filenameN
-</i>]
+<b>ipptool</b>
+[
+<b>--help</b>
+] [
+<b>--stop-after-include-error</b>
+] [
+<b>--version</b>
+] [
+<b>-4</b>
+] [
+<b>-6</b>
+] [
+<b>-C</b>
+] [
+<b>-E</b>
+] [
+<b>-I</b>
+] [
+<b>-L</b>
+] [
+<b>-P</b>
+<i>filename.plist</i>
+] [
+<b>-S</b>
+] [
+<b>-T</b>
+<i>seconds</i>
+] [
+<b>-V</b>
+<i>version</i>
+] [
+<b>-X</b>
+] [
+<b>-c</b>
+] [
+<b>-d</b>
+<i>name=value</i>
+] [
+<b>-f</b>
+<i>filename</i>
+] [
+<b>-i</b>
+<i>seconds</i>
+] [
+<b>-n</b>
+<i>repeat-count</i>
+] [
+<b>-q</b>
+] [
+<b>-t</b>
+] [
+<b>-v</b><b>]</b>
+<i>printer-uri</i>
+<i>testfile</i>
+[ ...
+<i>testfile</i>
+]
<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
-<i>ipptool</i> sends IPP requests to the specified URI and tests and/or displays the results. Each named file defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The file format is described in <a href='man-ipptoolfile.html?TOPIC=Man+Pages'>ipptoolfile(5)</a>.
+<b>ipptool</b>
+sends IPP requests to the specified
+<i>printer-uri</i>
+and tests and/or displays the results.
+Each named
+<i>testfile</i>
+defines one or more requests, including the expected response status, attributes, and values.
+Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed.
+The
+<i>testfile</i>
+format is described in
+<a href="man-ipptoolfile.html?TOPIC=Man+Pages"><b>ipptoolfile</b>(5).</a>
<h2 class="title"><a name="OPTIONS">Options</a></h2>
-The following options are recognized by <i>ipptool</i>:
-<dl>
-<dt>-4
-</dt>
-<dd>Specifies that <i>ipptool</i> must connect to the printer or server using IPv4.
-</dd>
-<dt>-6
-</dt>
-<dd>Specifies that <i>ipptool</i> must connect to the printer or server using IPv6.
-</dd>
-<dt>-C
-</dt>
-<dd>Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
-</dd>
-<dt>-E
-</dt>
-<dd>Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
-</dd>
-<dt>-I
-</dt>
-<dd>Specifies that <i>ipptool</i> will continue past errors.
-</dd>
-<dt>-L
-</dt>
-<dd>Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
-</dd>
-<dt>-S
-</dt>
-<dd>Forces (dedicated) SSL encryption when connecting to the server.
-</dd>
-<dt>-T seconds
-</dt>
-<dd>Specifies a timeout for IPP requests in seconds.
-</dd>
-<dt>-V version
-</dt>
-<dd>Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used.
-</dd>
-<dt>-X
-</dt>
-<dd>Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the <i>-i</i> (interval) and <i>-n</i> (repeat-count) options.
-</dd>
-<dt>-c
-</dt>
-<dd>Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
-</dd>
-<dt>-d name=value
-</dt>
-<dd>Defines the named variable.
-</dd>
-<dt>-f filename
-</dt>
-<dd>Defines the default request filename for tests.
-</dd>
-<dt>-i seconds
-</dt>
-<dd>Specifies that the (last) file should be repeated at the specified interval. This option is incompatible with the <i>-X</i> (XML plist output) option.
-</dd>
-<dt>-l
-</dt>
-<dd>Specifies that plain text output is desired.
-</dd>
-<dt>-n repeat-count
-</dt>
-<dd>Specifies that the (last) file should be repeated the specified number of times. This option is incompatible with the <i>-X</i> (XML plist output) option.
-</dd>
-<dt>-t
-</dt>
-<dd>Specifies that CUPS test report output is desired instead of the plain text output.
-</dd>
-<dt>-v
-</dt>
-<dd>Specifies that all request and response attributes should be output in CUPS test mode (<i>-t</i>). This is the default for XML output.
-</dd>
+The following options are recognized by
+<b>ipptool:</b>
+<dl class="man">
+<dt><b>--help</b>
+<dd style="margin-left: 5.0em">Shows program help.
+<dt><b>--stop-after-include-error</b>
+<dd style="margin-left: 5.0em">Tells
+<b>ipptool</b>
+to stop if an error occurs in an included file. Normally
+<b>ipptool</b>
+will continue with subsequent tests after the INCLUDE directive.
+<dt><b>--version</b>
+<dd style="margin-left: 5.0em">Shows the version of
+<b>ipptool</b>
+being used.
+<dt><b>-4</b>
+<dd style="margin-left: 5.0em">Specifies that
+<b>ipptool</b>
+must connect to the printer or server using IPv4.
+<dt><b>-6</b>
+<dd style="margin-left: 5.0em">Specifies that
+<b>ipptool</b>
+must connect to the printer or server using IPv6.
+<dt><b>-C</b>
+<dd style="margin-left: 5.0em">Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP.
+The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
+<dt><b>-I</b>
+<dd style="margin-left: 5.0em">Specifies that
+<b>ipptool</b>
+will continue past errors.
+<dt><b>-L</b>
+<dd style="margin-left: 5.0em">Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP.
+The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
+<dt><b>-P</b><i> filename.plist</i>
+<dd style="margin-left: 5.0em">Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (<b>-t</b>).
+This option is incompatible with the <b>-i</b> (interval) and <b>-n</b> (repeat-count) options.
+<dt><b>-S</b>
+<dd style="margin-left: 5.0em">Forces (dedicated) TLS encryption when connecting to the server.
+<dt><b>-T</b><i> seconds</i>
+<dd style="margin-left: 5.0em">Specifies a timeout for IPP requests in seconds.
+<dt><b>-V</b><i> version</i>
+<dd style="margin-left: 5.0em">Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used.
+<dt><b>-X</b>
+<dd style="margin-left: 5.0em">Specifies that XML (Apple plist) output is desired instead of the plain text report.
+This option is incompatible with the <b>-i</b> (interval) and <b>-n</b> (repeat-count) options.
+<dt><b>-c</b>
+<dd style="margin-left: 5.0em">Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
+<dt><b>-d</b><i> name=value</i>
+<dd style="margin-left: 5.0em">Defines the named variable.
+<dt><b>-f</b><i> filename</i>
+<dd style="margin-left: 5.0em">Defines the default request filename for tests.
+<dt><b>-i</b><i> seconds</i>
+<dd style="margin-left: 5.0em">Specifies that the (last)
+<i>testfile</i>
+should be repeated at the specified interval.
+This option is incompatible with the <b>-X</b> (XML plist output) option.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Specifies that plain text output is desired.
+<dt><b>-n</b><i> repeat-count</i>
+<dd style="margin-left: 5.0em">Specifies that the (last)
+<i>testfile</i>
+should be repeated the specified number of times.
+This option is incompatible with the <i>-X</i> (XML plist output) option.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em">Be quiet and produce no output.
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Specifies that CUPS test report output is desired instead of the plain text output.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies that all request and response attributes should be output in CUPS test mode (<b>-t</b>).
+This is the default for XML output.
</dl>
-<h2 class="title"><a name="COMPATIBILITY">Compatibility</a></h2>
-The <i>ipptool</i> program is unique to CUPS.
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+The
+<b>ipptool</b>
+program returns 0 if all tests were successful and 1 otherwise.
+<h2 class="title"><a name="FILES">Files</a></h2>
+The following standard files are available:
+<pre class="man">
+<i>color.jpg</i>
+<i>create-printer-subscription.test</i>
+<i>document-a4.pdf</i>
+<i>document-a4.ps</i>
+<i>document-letter.pdf</i>
+<i>document-letter.ps</i>
+<i>get-completed-jobs.test</i>
+<i>get-jobs.test</i>
+<i>get-notifications.test</i>
+<i>get-printer-attributes.test</i>
+<i>get-subscriptions.test</i>
+<i>gray.jpg</i>
+<i>ipp-1.1.test</i>
+<i>ipp-2.0.test</i>
+<i>ipp-2.1.test</i>
+<i>ipp-2.2.test</i>
+<i>ipp-everywhere.test</i>
+<i>onepage-a4.pdf</i>
+<i>onepage-a4.ps</i>
+<i>onepage-letter.pdf</i>
+<i>onepage-letter.ps</i>
+<i>print-job.test</i>
+<i>print-job-deflate.test</i>
+<i>print-job-gzip.test</i>
+<i>testfile.jpg</i>
+<i>testfile.pcl</i>
+<i>testfile.pdf</i>
+<i>testfile.ps</i>
+<i>testfile.txt</i>
+<i>validate-job.test</i>
+</pre>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The
+<b>ipptool</b>
+program is unique to CUPS and conforms to the Internet Printing Protocol up to version 2.2.
<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
Get a list of completed jobs for "myprinter":
-<pre>
+<pre class="man">
+
ipptool ipp://localhost/printers/myprinter get-completed-jobs.test
</pre>
<p>Send email notifications to "user@example.com" when "myprinter" changes:
-<pre>
- ipptool -d recipient=mailto:user@example.com
+<pre class="man">
+
+ ipptool -d recipient=mailto:user@example.com \
ipp://localhost/printers/myprinter create-printer-subscription.test
</pre>
-<h2 class="title"><a name="STANDARD_FILES">Standard Files</a></h2>
-The following standard files are available:
-<pre>
- color.jpg
- create-printer-subscription.test
- document-a4.pdf
- document-a4.ps
- document-letter.pdf
- document-letter.ps
- get-completed-jobs.test
- get-jobs.test
- get-printer-attributes.test
- gray.jpg
- ipp-1.1.test
- ipp-2.0.test
- ipp-2.1.test
- ipp-2.2.test
- onepage-a4.pdf
- onepage-a4.ps
- onepage-letter.pdf
- onepage-letter.ps
- print-job.test
- testfile.jpg
- testfile.pdf
- testfile.ps
- testfile.txt
-</pre>
<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
-<a href='man-ipptoolfile.html?TOPIC=Man+Pages'>ipptoolfile(5)</a>,
-<br>
-<a href='http://localhost:631/help'>http://localhost:631/help</a>
+<a href="man-ipptoolfile.html?TOPIC=Man+Pages"><b>ipptoolfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp\-registrations)">http://www.iana.org/assignments/ipp\-registrations)</a>,
+PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp">http://www.pwg.org/ipp</a>)
+RFC 2911 (<a href="http://tools.ietf.org/html/rfc2911)">http://tools.ietf.org/html/rfc2911)</a>,
<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright 2007-2013 by Apple Inc.
+Copyright &copy; 2007-2015 by Apple Inc.
</body>
</html>
diff --git a/doc/help/man-ipptoolfile.html b/doc/help/man-ipptoolfile.html
index 8c75389..4f54d64 100644
--- a/doc/help/man-ipptoolfile.html
+++ b/doc/help/man-ipptoolfile.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE HTML>
<html>
<!-- SECTION: Man Pages -->
<head>
@@ -9,15 +9,16 @@
<h1 class="title">ipptoolfile(5)</h1>
<h2 class="title"><a name="NAME">Name</a></h2>
ipptoolfile - ipptool file format
-
<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
-The <a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a> program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curly braces, for example:
-<pre>
+The
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(1)</a>
+program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curly braces, for example:
+<pre class="man">
# This is a comment
{
# The name of the test
- NAME "Print PostScript Job"
+ NAME "Print PostScript File"
# The request to send
OPERATION Print-Job
@@ -30,9 +31,7 @@ The <a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a> program accepts fr
# The response to expect
STATUS successful-ok
- EXPECT attributes-charset OF-TYPE charset
- EXPECT attributes-natural-language OF-TYPE naturalLanguage
- EXPECT job-id OF-TYPE integer
+ EXPECT job-id OF-TYPE integer WITH-VALUE >0
EXPECT job-uri OF-TYPE uri
}
{
@@ -50,393 +49,234 @@ The <a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a> program accepts fr
# The response to expect
STATUS successful-ok
- EXPECT attributes-charset OF-TYPE charset
- EXPECT attributes-natural-language OF-TYPE naturalLanguage
- EXPECT job-id OF-TYPE integer
+ EXPECT job-id OF-TYPE integer WITH-VALUE $job-id
EXPECT job-uri OF-TYPE uri
- EXPECT job-state OF-TYPE enum
+ EXPECT job-state OF-TYPE enum WITH-VALUE 3,4,5,6,7,8,9
EXPECT job-originating-user-name OF-TYPE name WITH-VALUE "$user"
}
</pre>
-
-<h2 class="title"><a name="TOP-LEVEL_DIRECTIVES">Top-level Directives</a></h2>
-The following directives can be used outside of a test:
-<dl>
-<dt>{ test }
-</dt>
-<dd>Defines a test.
-</dd>
-<dt>DEFINE variable-name value
-</dt>
-<dd>Defines the named variable to the given value. This is equivalent to specifying
-"-d variable-name=value" on the <i>ipptool</i> command-line.
-</dd>
-<dt>DEFINE-DEFAULT variable-name value
-</dt>
-<dd>Defines the named variable to the given value if it does not already have a
-value.
-</dd>
-<dt>IGNORE-ERRORS yes
-</dt>
-<dd></dd>
-<dt>IGNORE-ERRORS no
-</dt>
-<dd>Specifies whether, by default, <i>ipptool</i> will ignore errors and continue with
-subsequent tests.
-</dd>
-<dt>INCLUDE "filename"
-</dt>
-<dd></dd>
-<dt>INCLUDE &lt;filename>
-</dt>
-<dd>Includes another test file. The first form includes a file relative to the
-current test file, while the second form includes a file from the <i>ipptool</i>
+<h3><a name="TOP_LEVEL_DIRECTIVES">Top-level Directives</a></h3>
+The following directives can be used outside of a <i>test</i>:
+<dl class="man">
+<dt><b>{ </b><i>test </i><b>}</b>
+<dd style="margin-left: 5.0em">Defines a test.
+<dt><b>DEFINE </b><i>variable-name value</i>
+<dd style="margin-left: 5.0em">Defines the named variable to the given value. This is equivalent to specifying <i>-d variable-name=value</i> on the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+command-line.
+<dt><b>DEFINE-DEFAULT </b><i>variable-name value</i>
+<dd style="margin-left: 5.0em">Defines the named variable to the given value if it does not already have a value.
+<dt><b>FILE-ID "</b><i>identifier</i><b>"</b>
+<dd style="margin-left: 5.0em">Specifies an identifier string for the current file.
+<dt><b>IGNORE-ERRORS yes</b>
+<dd style="margin-left: 5.0em"><dt><b>IGNORE-ERRORS no</b>
+<dd style="margin-left: 5.0em">Specifies whether, by default,
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+will ignore errors and continue with subsequent tests.
+<dt><b>INCLUDE "</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>INCLUDE &lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em">Includes another test file. The first form includes a file relative to the current test file, while the second form includes a file from the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
include directory.
-</dd>
-<dt>INCLUDE-IF-DEFINED name "filename"
-</dt>
-<dd></dd>
-<dt>INCLUDE-IF-DEFINED name &lt;filename>
-</dt>
-<dd>Includes another test file if the named variable is defined. The first form
-includes a file relative to the current test file, while the second form
-includes a file from the <i>ipptool</i> include directory.
-</dd>
-<dt>INCLUDE-IF-NOT-DEFINED name "filename"
-</dt>
-<dd></dd>
-<dt>INCLUDE-IF-NOT-DEFINED name &lt;filename>
-</dt>
-<dd>Includes another test file if the named variable is not defined. The first form
-includes a file relative to the current test file, while the second form
-includes a file from the <i>ipptool</i> include directory.
-</dd>
-<dt>SKIP-IF-DEFINED variable-name
-</dt>
-<dd></dd>
-<dt>SKIP-IF-NOT-DEFINED variable-name
-</dt>
-<dd>Specifies that the remainder of the test file should be skipped when the
-variable is or is not defined.
-</dd>
-<dt>TRANSFER auto
-</dt>
-<dd>Specifies that tests will, by default, use "Transfer-Encoding: chunked" for
-requests with attached files and "Content-Length:" for requests without attached
-files.
-</dd>
-<dt>TRANSFER chunked
-</dt>
-<dd>Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding:
-chunked" header. This is the default and is equivalent to specifying "-c" on the
-<i>ipptool</i> command-line. Support for chunked requests is required for
-conformance with all versions of IPP.
-</dd>
-<dt>TRANSFER length
-</dt>
-<dd>Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:"
-header. This is equivalent to specifying "-l" on the <i>ipptool</i> command-line.
-Support for content length requests is required for conformance with all
-versions of IPP.
-</dd>
-<dt>VERSION 1.0
-</dt>
-<dd></dd>
-<dt>VERSION 1.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.0
-</dt>
-<dd></dd>
-<dt>VERSION 2.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.2
-</dt>
-<dd>Specifies the default IPP version number to use for the tests that follow.
-
-</dd>
+<dt><b>INCLUDE-IF-DEFINED </b><i>name </i><b>"</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>INCLUDE-IF-DEFINED </b><i>name </i><b>&lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em">Includes another test file if the named variable is defined. The first form includes a file relative to the current test file, while the second form includes a file from the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+include directory.
+<dt><b>INCLUDE-IF-NOT-DEFINED </b><i>name </i><b>"</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>INCLUDE-IF-NOT-DEFINED </b><i>name </i><b>&lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em">Includes another test file if the named variable is not defined. The first form includes a file relative to the current test file, while the second form includes a file from the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+include directory.
+<dt><b>SKIP-IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em"><dt><b>SKIP-IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Specifies that the remainder of the test file should be skipped when the variable is or is not defined.
+<dt><b>STOP-AFTER-INCLUDE-ERROR no</b>
+<dd style="margin-left: 5.0em"><dt><b>STOP-AFTER-INCLUDE-ERROR yes</b>
+<dd style="margin-left: 5.0em">Specifies whether tests will be stopped after an error in an included file.
+<dt><b>TRANSFER auto</b>
+<dd style="margin-left: 5.0em">Specifies that tests will, by default, use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
+<dt><b>TRANSFER chunked</b>
+<dd style="margin-left: 5.0em">Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding: chunked" header. This is the default and is equivalent to specifying <i>-c</i> on the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+command-line. Support for chunked requests is required for conformance with all versions of IPP.
+<dt><b>TRANSFER length</b>
+<dd style="margin-left: 5.0em">Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:" header. This is equivalent to specifying <i>-l</i> on the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+command-line. Support for content length requests is required for conformance with all versions of IPP.
+<dt><b>VERSION 1.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 1.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.2</b>
+<dd style="margin-left: 5.0em">Specifies the default IPP version number to use for the tests that follow.
</dl>
-<h2 class="title"><a name="TEST_DIRECTIVES">Test Directives</a></h2>
-The following directives are understood in a test:
-<dl>
-<dt>ATTR tag attribute-name value(s)
-</dt>
-<dd>Adds an attribute to the test request. Values are separated by the comma (",")
-character - escape commas using the "" character.
-</dd>
-<dt>ATTR collection attribute-name { MEMBER tag member-name value(s) ... } [ ... { ... } ]
-</dt>
-<dd>Adds a collection attribute to the test request. Member attributes follow the
-same syntax as regular attributes and can themselves be nested collections.
-Multiple collection values can be supplied as needed.
-</dd>
-<dt>DELAY seconds
-</dt>
-<dd>Specifies a delay before this test will be run.
-</dd>
-<dt>DISPLAY attribute-name
-</dt>
-<dd>Specifies that value of the named attribute should be output as part of the
+<h3><a name="TEST_DIRECTIVES">Test Directives</a></h3>
+The following directives are understood within a <i>test</i>:
+<dl class="man">
+<dt><b>ATTR </b><i>tag attribute-name value(s)</i>
+<dd style="margin-left: 5.0em">Adds an attribute to the test request. Values are separated by the comma (",") character - escape commas using the "" character. Common attributes and values are listed in the IANA IPP registry - see references below.
+<dt><b>ATTR collection </b><i>attribute-name </i><b>{ MEMBER </b><i>tag member-name value(s) ... </i><b>}</b> [ <i>... </i><b>,{ </b><i>... </i><b>} </b>]
+<dd style="margin-left: 5.0em">Adds a collection attribute to the test request. Member attributes follow the same syntax as regular attributes and can themselves be nested collections. Multiple collection values can be supplied as needed, separated by commas.
+<dt><b>COMPRESSION deflate</b>
+<dd style="margin-left: 5.0em"><dt><b>COMPRESSION gzip</b>
+<dd style="margin-left: 5.0em"><dt><b>COMPRESSION none</b>
+<dd style="margin-left: 5.0em">Uses the specified compression on the document data following the attributes in a Print-Job or Send-Document request.
+<dt><b>DELAY </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies a delay before this test will be run.
+<dt><b>DISPLAY </b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Specifies that value of the named attribute should be output as part of the
test report.
-</dd>
-<dt>EXPECT attribute-name [ predicate(s) ]
-</dt>
-<dd></dd>
-<dt>EXPECT ?attribute-name predicate(s)
-</dt>
-<dd></dd>
-<dt>EXPECT !attribute-name
-</dt>
-<dd>Specifies that the response must/may/must not include the named attribute.
-Additional requirements can be added as predicates - see the "EXPECT PREDICATES"
-section for more information on predicates.
-</dd>
-<dt>FILE filename
-</dt>
-<dd>Specifies a file to include at the end of the request. This is typically used
-when sending a test print file.
-</dd>
-<dt>GROUP tag
-</dt>
-<dd>Specifies the group tag for subsequent attributes in the request.
-</dd>
-<dt>IGNORE-ERRORS yes
-</dt>
-<dd></dd>
-<dt>IGNORE-ERRORS no
-</dt>
-<dd>Specifies whether <i>ipptool</i> will ignore errors and continue with subsequent
-tests.
-</dd>
-<dt>NAME "literal string"
-</dt>
-<dd>Specifies the human-readable name of the test.
-</dd>
-<dt>OPERATION operation-code
-</dt>
-<dd>Specifies the operation to be performed.
-</dd>
-<dt>REQUEST-ID number
-</dt>
-<dd></dd>
-<dt>REQUEST-ID random
-</dt>
-<dd>Specifies the request-id value to use in the request, either an integer or the
-word "random" to use a randomly generated value (the default).
-</dd>
-<dt>RESOURCE path
-</dt>
-<dd>Specifies an alternate resource path that is used for the HTTP POST request.
-The default is the resource from the URI provided to the <i>ipptool</i> program.
-</dd>
-<dt>SKIP-IF-DEFINED variable-name
-</dt>
-<dd></dd>
-<dt>SKIP-IF-NOT-DEFINED variable-name
-</dt>
-<dd>Specifies that the current test should be skipped when the variable is or is not
-defined.
-</dd>
-<dt>SKIP-PREVIOUS-ERROR yes
-</dt>
-<dd></dd>
-<dt>SKIP-PREVIOUS-ERROR no
-</dt>
-<dd>Specifies whether <i>ipptool</i> will skip the current test if the previous test
-resulted in an error/failure.
-</dd>
-<dt>STATUS status-code [ predicate ]
-</dt>
-<dd>Specifies an expected response status-code value. Additional requirements can be
-added as predicates - see the "STATUS PREDICATES" section for more information
-on predicates.
-</dd>
-<dt>TRANSFER auto
-</dt>
-<dd>Specifies that this test will use "Transfer-Encoding: chunked" if it has an
-attached file or "Content-Length:" otherwise.
-</dd>
-<dt>TRANSFER chunked
-</dt>
-<dd>Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked"
-header.
-</dd>
-<dt>TRANSFER length
-</dt>
-<dd>Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
-</dd>
-<dt>VERSION 1.0
-</dt>
-<dd></dd>
-<dt>VERSION 1.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.0
-</dt>
-<dd></dd>
-<dt>VERSION 2.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.2
-</dt>
-<dd>Specifies the IPP version number to use for this test.
-
-</dd>
+<dt><b>EXPECT </b><i>attribute-name </i>[ <i>predicate(s) </i>]
+<dd style="margin-left: 5.0em"><dt><b>EXPECT ?</b><i>attribute-name predicate(s)</i>
+<dd style="margin-left: 5.0em"><dt><b>EXPECT !</b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Specifies that the response must/may/must not include the named attribute. Additional requirements can be added as predicates - see the "EXPECT PREDICATES" section for more information on predicates. Attribute names can specify member attributes by separating the attribute and member names with the forward slash, for example "media-col/media-size/x-dimension".
+<dt><b>EXPECT-ALL </b><i>attribute-name </i>[ <i>predicate(s) </i>]
+<dd style="margin-left: 5.0em"><dt><b>EXPECT-ALL ?</b><i>attribute-name predicate(s)</i>
+<dd style="margin-left: 5.0em">Specifies that the response must/may include the named attribute and that all occurrences of that attribute must match the given predicates.
+<dt><b>FILE filename</b>
+<dd style="margin-left: 5.0em">Specifies a file to include at the end of the request. This is typically used when sending a test print file.
+<dt><b>GROUP tag</b>
+<dd style="margin-left: 5.0em">Specifies the group tag for subsequent attributes in the request.
+<dt><b>IGNORE-ERRORS yes</b>
+<dd style="margin-left: 5.0em"><dt><b>IGNORE-ERRORS no</b>
+<dd style="margin-left: 5.0em">Specifies whether
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+will ignore errors and continue with subsequent tests.
+<dt><b>NAME "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em">Specifies the human-readable name of the test.
+<dt><b>OPERATION </b><i>operation-code</i>
+<dd style="margin-left: 5.0em">Specifies the operation to be performed.
+<dt><b>PAUSE "</b><i>message</i><b>"</b>
+<dd style="margin-left: 5.0em">Displays the provided message and waits for the user to press a key to continue.
+<dt><b>REQUEST-ID </b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>REQUEST-ID random</b>
+<dd style="margin-left: 5.0em">Specifies the request-id value to use in the request, either an integer or the word "random" to use a randomly generated value (the default).
+<dt><b>RESOURCE </b><i>path</i>
+<dd style="margin-left: 5.0em">Specifies an alternate resource path that is used for the HTTP POST request. The default is the resource from the URI provided to the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+program.
+<dt><b>SKIP-IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em"><dt><b>SKIP-IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Specifies that the current test should be skipped when the variable is or is not defined.
+<dt><b>SKIP-PREVIOUS-ERROR yes</b>
+<dd style="margin-left: 5.0em"><dt><b>SKIP-PREVIOUS-ERROR no</b>
+<dd style="margin-left: 5.0em">Specifies whether
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+will skip the current test if the previous test resulted in an error/failure.
+<dt><b>STATUS </b><i>status-code </i>[ <i>predicate</i> ]
+<dd style="margin-left: 5.0em">Specifies an expected response status-code value. Additional requirements can be added as predicates - see the "STATUS PREDICATES" section for more information on predicates.
+<dt><b>TEST-ID "</b><i>identifier</i>"
+<dd style="margin-left: 5.0em">Specifies an identifier string for the current test.
+<dt><b>TRANSFER auto</b>
+<dd style="margin-left: 5.0em">Specifies that this test will use "Transfer-Encoding: chunked" if it has an attached file or "Content-Length:" otherwise.
+<dt><b>TRANSFER chunked</b>
+<dd style="margin-left: 5.0em">Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" header.
+<dt><b>TRANSFER length</b>
+<dd style="margin-left: 5.0em">Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
+<dt><b>VERSION 1.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 1.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.2</b>
+<dd style="margin-left: 5.0em">Specifies the IPP version number to use for this test.
</dl>
-<h2 class="title"><a name="EXPECT_PREDICATES">Expect Predicates</a></h2>
-The following predicates are understood following the EXPECT test directive:
-<dl>
-<dt>COUNT number
-</dt>
-<dd>Requires the EXPECT attribute to have the specified number of values.
-</dd>
-<dt>DEFINE-MATCH variable-name
-</dt>
-<dd>Defines the variable to "1" when the EXPECT condition matches. A side-effect of
-this predicate is that this EXPECT will never fail a test.
-</dd>
-<dt>DEFINE-NO-MATCH variable-name
-</dt>
-<dd>Defines the variable to "1" when the EXPECT condition does not match. A side-
-effect of this predicate is that this EXPECT will never fail a test.
-</dd>
-<dt>DEFINE-VALUE variable-name
-</dt>
-<dd>Defines the variable to the value of the attribute when the EXPECT condition
-matches. A side-effect of this predicate is that this EXPECT will never fail a test.
-</dd>
-<dt>IF-DEFINED variable-name
-</dt>
-<dd>Makes the EXPECT conditions apply only if the specified variable is defined.
-</dd>
-<dt>IF-NOT-DEFINED variable-name
-</dt>
-<dd>Makes the EXPECT conditions apply only if the specified variable is not
-defined.
-</dd>
-<dt>IN-GROUP tag
-</dt>
-<dd>Requires the EXPECT attribute to be in the specified group tag.
-</dd>
-<dt>OF-TYPE tag[,tag,...]
-</dt>
-<dd>Requires the EXPECT attribute to use the specified value tag(s).
-</dd>
-<dt>REPEAT-LIMIT number
-</dt>
-<dd></dd>
-<dd>Specifies the maximum number of times to repeat. The default value is 1000.
-</dd>
-<dt>REPEAT-MATCH
-</dt>
-<dd></dd>
-<dt>REPEAT-NO-MATCH
-</dt>
-<dd>Specifies that the current test should be repeated when the EXPECT condition
-matches or does not match.
-</dd>
-<dt>SAME-COUNT-AS attribute-name
-</dt>
-<dd>Requires the EXPECT attribute to have the same number of values as the specified
-parallel attribute.
-</dd>
-<dt>WITH-ALL-VALUES "literal string"
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the literal string. Comparisons are case-sensitive.
-</dd>
-<dt>WITH-ALL-VALUES &lt;number
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES =number
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES >number
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES number[,number,...]
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
-</dd>
-<dt>WITH-ALL-VALUES "false"
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES "true"
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the boolean value given.
-</dd>
-<dt>WITH-ALL-VALUES "/regular expression/"
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
-</dd>
-<dt>WITH-VALUE "literal string"
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the literal string. Comparisons are case-sensitive.
-</dd>
-<dt>WITH-VALUE &lt;number
-</dt>
-<dd></dd>
-<dt>WITH-VALUE =number
-</dt>
-<dd></dd>
-<dt>WITH-VALUE >number
-</dt>
-<dd></dd>
-<dt>WITH-VALUE number[,number,...]
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
-</dd>
-<dt>WITH-VALUE "false"
-</dt>
-<dd></dd>
-<dt>WITH-VALUE "true"
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the boolean value given.
-</dd>
-<dt>WITH-VALUE "/regular expression/"
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
-
-</dd>
+<h3><a name="EXPECT_PREDICATES">Expect Predicates</a></h3>
+The following predicates are understood following the <b>EXPECT</b> test directive:
+<dl class="man">
+<dt><b>COUNT </b><i>number</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to have the specified number of values.
+<dt><b>DEFINE-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition matches. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>DEFINE-NO-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition does not match. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>DEFINE-VALUE </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to the value of the attribute when the <b>EXPECT</b> condition matches. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is defined.
+<dt><b>IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is not defined.
+<dt><b>IN-GROUP </b><i>tag</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to be in the specified group tag.
+<dt><b>OF-TYPE </b><i>tag[,tag,...]</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to use one of the specified value tag(s).
+<dt><b>REPEAT-LIMIT </b><i>number</i>
+<dd style="margin-left: 5.0em"><br>
+Specifies the maximum number of times to repeat if the <b>REPEAT-MATCH</b> or <b>REPEAT-NO-MATCH</b> predicate is specified. The default value is 1000.
+<dt><b>REPEAT-MATCH</b>
+<dd style="margin-left: 5.0em"><dt><b>REPEAT-NO-MATCH</b>
+<dd style="margin-left: 5.0em">Specifies that the current test should be repeated when the <b>EXPECT</b> condition matches or does not match.
+<dt><b>SAME-COUNT-AS </b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to have the same number of values as the specified parallel attribute.
+<dt><b>WITH-ALL-HOSTNAMES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-HOSTNAMES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all URI values contain a matching hostname.
+<dt><b>WITH-ALL-RESOURCES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-RESOURCES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all URI values contain a matching resource (including leading /).
+<dt><b>WITH-ALL-SCHEMES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-SCHEMES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all URI values contain a matching scheme.
+<dt><b>WITH-ALL-VALUES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the literal string. Comparisons are case-sensitive.
+<dt><b>WITH-ALL-VALUES &lt;</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES =</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES ></b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES </b><i>number</i>[<i>,...,number</i>]
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
+<dt><b>WITH-ALL-VALUES "false"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES "true"</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the boolean value given.
+<dt><b>WITH-ALL-VALUES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+<dt><b>WITH-HOSTNAME "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-HOSTNAME "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching hostname.
+<dt><b>WITH-RESOURCE "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-RESOURCE "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching resource (including leading /).
+<dt><b>WITH-SCHEME "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-SCHEME "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching scheme.
+<dt><b>WITH-VALUE "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the literal string. Comparisons are case-sensitive.
+<dt><b>WITH-VALUE &lt;</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE =</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE ></b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE </b><i>number</i>[<i>,...,number</i>]
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
+<dt><b>WITH-VALUE "false"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE "true"</b>
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the boolean value given.
+<dt><b>WITH-VALUE "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+<dt><b>WITH-VALUE-FROM </b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Requires that the value(s) of the <b>EXPECT</b> attribute matches the value(s) in the specified attribute.
+For example, "EXPECT job-sheets WITH-VALUE-FROM job-sheets-supported" requires that the "job-sheets" value is listed as a value of the "job-sheets-supported" attribute.
</dl>
-<h2 class="title"><a name="STATUS_PREDICATES">Status Predicates</a></h2>
-The following predicates are understood following the STATUS test directive:
-<dl>
-<dt>DEFINE-MATCH variable-name
-</dt>
-<dd>Defines the variable to "1" when the STATUS matches. A side-effect of this predicate is that this STATUS will never fail a test.
-</dd>
-<dt>DEFINE-NO-MATCH variable-name
-</dt>
-<dd>Defines the variable to "1" when the STATUS does not match. A side-effect of this predicate is that this STATUS will never fail a test.
-</dd>
-<dt>IF-DEFINED variable-name
-</dt>
-<dd>Makes the STATUS apply only if the specified variable is defined.
-</dd>
-<dt>IF-NOT-DEFINED variable-name
-</dt>
-<dd>Makes the STATUS apply only if the specified variable is not defined.
-</dd>
-<dt>REPEAT-LIMIT number
-</dt>
-<dd></dd>
-<dd>Specifies the maximum number of times to repeat. The default value is 1000.
-</dd>
-<dt>REPEAT-MATCH
-</dt>
-<dd></dd>
-<dt>REPEAT-NO-MATCH
-</dt>
-<dd>Specifies that the current test should be repeated when the response status-code
-matches or does not match the value specified by the STATUS directive.
-
-</dd>
+<h3><a name="STATUS_PREDICATES">Status Predicates</a></h3>
+The following predicates are understood following the <b>STATUS</b> test directive:
+<dl class="man">
+<dt><b>DEFINE-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>STATUS</b> matches. A side-effect of this predicate is that this <b>STATUS</b> will never fail a test.
+<dt><b>DEFINE-NO-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>STATUS</b> does not match. A side-effect of this predicate is that this <b>STATUS</b> will never fail a test.
+<dt><b>IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>STATUS</b> apply only if the specified variable is defined.
+<dt><b>IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>STATUS</b> apply only if the specified variable is not defined.
+<dt><b>REPEAT-LIMIT </b><i>number</i>
+<dd style="margin-left: 5.0em"><br>
+Specifies the maximum number of times to repeat. The default value is 1000.
+<dt><b>REPEAT-MATCH</b>
+<dd style="margin-left: 5.0em"><dt><b>REPEAT-NO-MATCH</b>
+<dd style="margin-left: 5.0em">Specifies that the current test should be repeated when the response status-code matches or does not match the value specified by the STATUS directive.
</dl>
-<h2 class="title"><a name="OPERATION_CODES">Operation Codes</a></h2>
-Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from
-RFC 2911 and other IPP extension specifications. Here is a complete list:
-<pre>
+<h3><a name="OPERATION_CODES">Operation Codes</a></h3>
+Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 2911 and other IPP extension specifications. Here is a complete list of names supported by
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8):</a>
+<pre class="man">
+
Activate-Printer
CUPS-Accept-Jobs
CUPS-Add-Modify-Class
@@ -461,8 +301,8 @@ RFC 2911 and other IPP extension specifications. Here is a complete list:
Cancel-Subscription
Close-Job
Create-Job
- Create-Job-Subscription
- Create-Printer-Subscription
+ Create-Job-Subscriptions
+ Create-Printer-Subscriptions
Deactivate-Printer
Disable-Printer
Enable-Printer
@@ -494,6 +334,7 @@ RFC 2911 and other IPP extension specifications. Here is a complete list:
Resume-Printer
Schedule-Job-After
Send-Document
+ Send-Hardcopy-Document
Send-Notifications
Send-URI
Set-Job-Attributes
@@ -504,11 +345,15 @@ RFC 2911 and other IPP extension specifications. Here is a complete list:
Validate-Document
Validate-Job
</pre>
+<h3><a name="STATUS_CODES">Status Codes</a></h3>
+Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 2911 and other IPP extension specifications. Here is a complete list of the names supported by
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8):</a>
+<pre class="man">
-<h2 class="title"><a name="STATUS_CODES">Status Codes</a></h2>
-Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
-2911 and other IPP extension specifications. Here is a complete list:
-<pre>
+ client-error-account-authorization-failed
+ client-error-account-closed
+ client-error-account-info-needed
+ client-error-account-limit-reached
client-error-attributes-not-settable
client-error-attributes-or-values-not-supported
client-error-bad-request
@@ -537,6 +382,10 @@ Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
client-error-timeout
client-error-too-many-subscriptions
client-error-uri-scheme-not-supported
+ cups-error-account-authorization-failed
+ cups-error-account-closed
+ cups-error-account-info-needed
+ cups-error-account-limit-reached
cups-see-other
redirection-other-site
server-error-busy
@@ -559,11 +408,11 @@ Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
successful-ok-ignored-subscriptions
successful-ok-too-many-events
</pre>
+<h3><a name="TAGS">Tags</a></h3>
+Value and group tags correspond to the names from RFC 2911 and other IPP extension specifications. Here are the group tags:
+<pre class="man">
-<h2 class="title"><a name="TAGS">Tags</a></h2>
-Value and group tags correspond to the names from RFC 2911 and other IPP
-extension specifications. Here are the group tags:
-<pre>
+ document-attributes-tag
event-notification-attributes-tag
job-attributes-tag
operation-attributes-tag
@@ -572,7 +421,8 @@ extension specifications. Here are the group tags:
unsupported-attributes-tag
</pre>
<p>Here are the value tags:
-<pre>
+<pre class="man">
+
admin-define
boolean
charset
@@ -599,78 +449,59 @@ extension specifications. Here are the group tags:
uri
uriScheme
</pre>
-
-<h2 class="title"><a name="VARIABLES">Variables</a></h2>
-The <i>ipptool</i> program maintains a list of variables that can be used in any
-literal string or attribute value by specifying "$variable-name". Aside from
-variables defined using the "-d" option or "DEFINE" directive, the following
-pre-defined variables are available:
-<dl>
-<dt>$$
-</dt>
-<dd>Inserts a single "$" character.
-</dd>
-<dt>$ENV[name]
-</dt>
-<dd>Inserts the value of the named environment variable, or an empty string if the
-environment variable is not defined.
-</dd>
-<dt>$filename
-</dt>
-<dd>Inserts the filename provided to <i>ipptool</i> with the "-f" option.
-</dd>
-<dt>$hostname
-</dt>
-<dd>Inserts the hostname from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$job-id
-</dt>
-<dd>Inserts the last job-id value returned in a test response or 0 if no job-id has
-been seen.
-</dd>
-<dt>$job-uri
-</dt>
-<dd>Inserts the last job-uri value returned in a test response or an empty string if
-no job-uri has been seen.
-</dd>
-<dt>$scheme
-</dt>
-<dd>Inserts the scheme from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$notify-subscription-id
-</dt>
-<dd>Inserts the last notify-subscription-id value returned in a test response or 0 if
-no notify-subscription-id has been seen.
-</dd>
-<dt>$port
-</dt>
-<dd>Inserts the port number from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$resource
-</dt>
-<dd>Inserts the resource path from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$uri
-</dt>
-<dd>Inserts the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$user
-</dt>
-<dd>Inserts the current user's login name.
-</dd>
-<dt>$username
-</dt>
-<dd>Inserts the username from the URI provided to <i>ipptool</i>, if any.
-
-</dd>
+<h3><a name="VARIABLES">Variables</a></h3>
+The
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+program maintains a list of variables that can be used in any literal string or attribute value by specifying "<i>$variable-name</i>". Aside from variables defined using the <i>-d</i> option or <b>DEFINE</b> directive, the following pre-defined variables are available:
+<dl class="man">
+<dt><b>$$</b>
+<dd style="margin-left: 5.0em">Inserts a single "$" character.
+<dt><b>$ENV[</b><i>name</i><b>]</b>
+<dd style="margin-left: 5.0em">Inserts the value of the named environment variable, or an empty string if the environment variable is not defined.
+<dt><b>$filename</b>
+<dd style="margin-left: 5.0em">Inserts the filename provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+with the <i>-f</i> option.
+<dt><b>$filetype</b>
+<dd style="margin-left: 5.0em">Inserts the MIME media type for the filename provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+with the <i>-f</i> option.
+<dt><b>$hostname</b>
+<dd style="margin-left: 5.0em">Inserts the hostname from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$job-id</b>
+<dd style="margin-left: 5.0em">Inserts the last "job-id" attribute value returned in a test response or 0 if no "job-id" attribute has been seen.
+<dt><b>$job-uri</b>
+<dd style="margin-left: 5.0em">Inserts the last "job-uri" attribute value returned in a test response or an empty string if no "job-uri" attribute has been seen.
+<dt><b>$notify-subscription-id</b>
+<dd style="margin-left: 5.0em">Inserts the last "notify-subscription-id" attribute value returned in a test response or 0 if no "notify-subscription-id" attribute has been seen.
+<dt><b>$port</b>
+<dd style="margin-left: 5.0em">Inserts the port number from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$resource</b>
+<dd style="margin-left: 5.0em">Inserts the resource path from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$scheme</b>
+<dd style="margin-left: 5.0em">Inserts the scheme from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$uri</b>
+<dd style="margin-left: 5.0em">Inserts the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$uriuser</b>
+<dd style="margin-left: 5.0em">Inserts the username from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8),</a>
+if any.
+<dt><b>$user</b>
+<dd style="margin-left: 5.0em">Inserts the current user's login name.
</dl>
<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
-<a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a>,
-<br>
-<a href='http://localhost:631/help'>http://localhost:631/help</a>
-
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp-registrations)">http://www.iana.org/assignments/ipp-registrations)</a>,
+PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp)">http://www.pwg.org/ipp)</a>,
+RFC 2911 (<a href="http://tools.ietf.org/html/rfc3911">http://tools.ietf.org/html/rfc3911</a>)
<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright 2007-2013 by Apple Inc.
+Copyright &copy; 2007-2015 by Apple Inc.
</body>
</html>
diff --git a/doc/help/man-lp.html b/doc/help/man-lp.html
new file mode 100644
index 0000000..73d7c2d
--- /dev/null
+++ b/doc/help/man-lp.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lp(1)</title>
+</head>
+<body>
+<h1 class="title">lp(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lp - print files
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lp</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-d </b><i>destination</i>[<b>/</b><i>instance</i>]
+] [
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-m</b>
+] [
+<b>-n</b>
+<i>num-copies</i>
+] [
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+] [
+<b>-q</b>
+<i>priority</i>
+] [
+<b>-s</b>
+] [
+<b>-t</b>
+<i>title</i>
+] [
+<b>-H</b>
+<i>handling</i>
+] [
+<b>-P</b>
+<i>page-list</i>
+] [
+<b>--</b>
+] [
+<i>file(s)</i>
+]
+<br>
+<b>lp</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-i</b>
+<i>job-id</i>
+] [
+<b>-n</b>
+<i>num-copies</i>
+] [
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+] [
+<b>-q</b>
+<i>priority</i>
+] [
+<b>-t</b>
+<i>title</i>
+] [
+<b>-H</b>
+<i>handling</i>
+] [
+<b>-P</b>
+<i>page-list</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lp</b> submits files for printing or alters a pending job.
+Use a filename of "-" to force printing from the standard input.
+<h3><a name="THE_DEFAULT_DESTINATION">The Default Destination</a></h3>
+CUPS provides many ways to set the default destination. The <b>LPDEST</b> and <b>PRINTER</b> environment variables are consulted first.
+If neither are set, the current default set using the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command is used, followed by the default set using the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized by <i>lp</i>:
+<dl class="man">
+<dt><b>--</b>
+<dd style="margin-left: 5.0em">Marks the end of options; use this to print a file whose name begins with a dash (-).
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the username to use when connecting to the server.
+<dt><b>-c</b>
+<dd style="margin-left: 5.0em">This option is provided for backwards-compatibility only. On systems that support it, this option forces the print file to be copied to the spool directory before printing.
+In CUPS, print files are always sent to the scheduler via IPP which has the same effect.
+<dt><b>-d </b><i>destination</i>
+<dd style="margin-left: 5.0em">Prints files to the named printer.
+<dt><b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Chooses an alternate server.
+<dt><b>-i </b><i>job-id</i>
+<dd style="margin-left: 5.0em">Specifies an existing job to modify.
+<dt><b>-m</b>
+<dd style="margin-left: 5.0em">Sends an email when the job is completed.
+<dt><b>-n </b><i>copies</i>
+<dd style="margin-left: 5.0em">Sets the number of copies to print.
+<dt><b>-o "</b><i>name</i><b>=</b><i>value </i>[ ... <i>name</i><b>=</b><i>value </i>]<b>"</b>
+<dd style="margin-left: 5.0em">Sets one or more job options.
+<dt><b>-q </b><i>priority</i>
+<dd style="margin-left: 5.0em">Sets the job priority from 1 (lowest) to 100 (highest).
+The default priority is 50.
+<dt><b>-s</b>
+<dd style="margin-left: 5.0em">Do not report the resulting job IDs (silent mode.)
+<dt><b>-t "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the job name.
+<dt><b>-H </b><i>hh:mm</i>
+<dd style="margin-left: 5.0em"><dt><b>-H hold</b>
+<dd style="margin-left: 5.0em"><dt><b>-H immediate</b>
+<dd style="margin-left: 5.0em"><dt><b>-H restart</b>
+<dd style="margin-left: 5.0em"><dt><b>-H resume</b>
+<dd style="margin-left: 5.0em">Specifies when the job should be printed.
+A value of <i>immediate</i> will print the file immediately, a value of <i>hold</i> will hold the job indefinitely, and a UTC time value (HH:MM) will hold the job until the specified UTC (not local) time.
+Use a value of <i>resume</i> with the <i>-i</i> option to resume a held job.
+Use a value of <i>restart</i> with the <i>-i</i> option to restart a completed job.
+<dt><b>-P </b><i>page-list</i>
+<dd style="margin-left: 5.0em">Specifies which pages to print in the document.
+The list can contain a list of numbers and ranges (#-#) separated by commas, e.g., "1,3-5,16".
+The page numbers refer to the output pages and not the document's original pages - options like "number-up" can affect the numbering of the pages.
+</dl>
+<h3><a name="COMMON_JOB_OPTIONS">Common Job Options</a></h3>
+Aside from the printer-specific options reported by the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command, the following generic options are available:
+<dl class="man">
+<dt><b>-o media=</b><i>size</i>
+<dd style="margin-left: 5.0em">Sets the page size to <i>size</i>. Most printers support at least the size names "a4", "letter", and "legal".
+<dt><b>-o orientation-requested=4</b>
+<dd style="margin-left: 5.0em">Prints the job in landscape (rotated 90 degrees).
+<dt><b>-o sides=one-sided</b>
+<dd style="margin-left: 5.0em">Prints on one side of the paper.
+<dt><b>-o sides=two-sided-long-edge</b>
+<dd style="margin-left: 5.0em">Prints on both sides of the paper for portrait output.
+<dt><b>-o sides=two-sided-short-edge</b>
+<dd style="margin-left: 5.0em">Prints on both sides of the paper for landscape output.
+<dt><b>-o fit-to-page</b>
+<dd style="margin-left: 5.0em">Scales the print file to fit on the page.
+<dt><b>-o number-up=</b>{<i>2|4|6|9|16</i>}
+<dd style="margin-left: 5.0em">Prints 2, 4, 6, 9, or 16 document (input) pages on each output page.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
+Also, printer and class names are <i>not</i> case-sensitive.
+<p>The <i>-q</i> option accepts a different range of values than the Solaris lp command, matching the IPP job priority values (1-100, 100 is highest priority) instead of the Solaris values (0-39, 0 is highest priority).
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Print two copies of a document to the default printer:
+<pre class="man">
+
+ lp -n 2 filename
+
+</pre>
+Print a double-sided legal document to a printer called "foo":
+<pre class="man">
+
+ lp -d foo -o media=legal -o sides=two-sided-long-edge filename
+
+</pre>
+Print a presentation document 2-up to a printer called "foo":
+<pre class="man">
+
+ lp -d foo -o number-up=2 filename
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpadmin.html b/doc/help/man-lpadmin.html
new file mode 100644
index 0000000..2a74cf0
--- /dev/null
+++ b/doc/help/man-lpadmin.html
@@ -0,0 +1,182 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpadmin(8)</title>
+</head>
+<body>
+<h1 class="title">lpadmin(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpadmin - configure cups printers and classes
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpadmin</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-d</b>
+<i>destination</i>
+<br>
+<b>lpadmin</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-p</b>
+<i>destination</i>
+[
+<b>-R</b>
+<i>name-default</i>
+]
+<i>option(s)</i>
+<br>
+<b>lpadmin</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-x</b>
+<i>destination</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpadmin</b> configures printer and class queues provided by CUPS.
+It can also be used to set the server default printer or class.
+<p>When specified before the <i>-d</i>, <i>-p</i>, or <i>-x</i> options, the <i>-E</i> option forces encryption when connecting to the server.
+<p>The first form of the command (<i>-d</i>) sets the default printer or class to <i>destination</i>.
+Subsequent print jobs submitted via the
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1)</a>
+or
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1)</a>
+commands will use this destination unless the user specifies otherwise with the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command.
+<p>The second form of the command (<i>-p</i>) configures the named printer or class. The additional options are described below.
+<p>The third form of the command (<i>-x</i>) deletes the printer or class <i>destination</i>.
+Any jobs that are pending for the destination will be removed and any job that is currently printed will be aborted.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized when configuring a printer queue:
+<dl class="man">
+<dt><b>-c </b><i>class</i>
+<dd style="margin-left: 5.0em">Adds the named <i>printer</i> to <i>class</i>.
+If <i>class</i> does not exist it is created automatically.
+<dt><b>-i </b><i>interface</i>
+<dd style="margin-left: 5.0em">Sets a System V style interface script for the printer.
+This option cannot be specified with the <i>-P</i> option (PPD file) and is intended for providing support for legacy printer drivers.
+<dt><b>-m </b><i>model</i>
+<dd style="margin-left: 5.0em">Sets a standard System V interface script or PPD file for the printer from the <i>model</i> directory or using one of the driver interfaces.
+Use the <i>-m</i> option with the
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+command to get a list of supported models.
+The model "raw" clears any existing interface script or PPD file and the model "everywhere" queries the printer referred to by the specified IPP <i>device-uri</i>.
+<dt><b>-o cupsIPPSupplies=true</b>
+<dd style="margin-left: 5.0em"><dt><b>-o cupsIPPSupplies=false</b>
+<dd style="margin-left: 5.0em">Specifies whether IPP supply level values should be reported.
+<dt><b>-o cupsSNMPSupplies=true</b>
+<dd style="margin-left: 5.0em"><dt><b>-o cupsSNMPSupplies=false</b>
+<dd style="margin-left: 5.0em">Specifies whether SNMP supply level (RFC 3805) values should be reported.
+<dt><b>-o job-k-limit=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets the kilobyte limit for per-user quotas.
+The value is an integer number of kilobytes; one kilobyte is 1024 bytes.
+<dt><b>-o job-page-limit=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets the page limit for per-user quotas.
+The value is the integer number of pages that can be printed; double-sided pages are counted as two pages.
+<dt><b>-o job-quota-period=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets the accounting period for per-user quotas.
+The value is an integer number of seconds; 86,400 seconds are in one day.
+<dt><b>-o job-sheets-default=</b><i>banner</i>
+<dd style="margin-left: 5.0em"><dt><b>-o job-sheets-default=</b><i>banner</i><b>,</b><i>banner</i>
+<dd style="margin-left: 5.0em">Sets the default banner page(s) to use for print jobs.
+<dt><b>-o </b><i>name</i><b>=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets a PPD option for the printer.
+PPD options can be listed using the <i>-l</i> option with the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command.
+<dt><b>-o </b><i>name</i><b>-default=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets a default server-side option for the destination.
+Any print-time option can be defaulted, e.g., "-o number-up-default=2" to set the default "number-up" option value to 2.
+<dt><b>-o port-monitor=</b><i>name</i>
+<dd style="margin-left: 5.0em">Sets the binary communications program to use when printing, "none", "bcp", or "tbcp".
+The default program is "none".
+The specified port monitor must be listed in the printer's PPD file.
+<dt><b>-o printer-error-policy=</b><i>name</i>
+<dd style="margin-left: 5.0em">Sets the error policy to be used when the printer backend is unable to send the job to the printer.
+The name must be one of "abort-job", "retry-job", "retry-current-job", or "stop-printer".
+The default error policy is "stop-printer" for printers and "retry-current-job" for
+classes.
+<dt><b>-o printer-is-shared=true</b>
+<dd style="margin-left: 5.0em"><dt><b>-o printer-is-shared=false</b>
+<dd style="margin-left: 5.0em">Sets the destination to shared/published or unshared/unpublished.
+Shared/published destinations are publicly announced by the server on the LAN based on the browsing configuration in <i>cupsd.conf</i>, while unshared/unpublished destinations are not announced.
+The default value is "true".
+<dt><b>-o printer-op-policy=</b><i>name</i>
+<dd style="margin-left: 5.0em">Sets the IPP operation policy associated with the destination.
+The name must be defined in the <i>cupsd.conf</i> in a Policy section.
+The default operation policy is "default".
+<dt><b>-R </b><i>name</i><b>-default</b>
+<dd style="margin-left: 5.0em">Deletes the named option from <i>printer</i>.
+<dt><b>-r </b><i>class</i>
+<dd style="margin-left: 5.0em">Removes the named <i>printer</i> from <i>class</i>.
+If the resulting class becomes empty it is removed.
+<dt><b>-u allow:</b>{<i>user</i>|<b>@</b><i>group</i>}{<b>,</b><i>user</i>|<b>,@</b><i>group</i>}*
+<dd style="margin-left: 5.0em"><dt><b>-u deny:</b>{<i>user</i>|<b>@</b><i>group</i>}{<b>,</b><i>user</i>|<b>,@</b><i>group</i>}*
+<dd style="margin-left: 5.0em"><dt><b>-u allow:all</b>
+<dd style="margin-left: 5.0em"><dt><b>-u deny:none</b>
+<dd style="margin-left: 5.0em">Sets user-level access control on a destination.
+Names starting with "@" are interpreted as UNIX groups.
+The latter two forms turn user-level access control off.
+<dt><b>-v "</b><i>device-uri</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the <i>device-uri</i> attribute of the printer queue.
+Use the <i>-v</i> option with the
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+command to get a list of supported device URIs and schemes.
+<dt><b>-D "</b><i>info</i><b>"</b>
+<dd style="margin-left: 5.0em">Provides a textual description of the destination.
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Enables the destination and accepts jobs; this is the same as running the
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8)</a>
+and
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8)</a>
+programs on the destination.
+<dt><b>-L "</b><i>location</i><b>"</b>
+<dd style="margin-left: 5.0em">Provides a textual location of the destination.
+<dt><b>-P </b><i>ppd-file</i>
+<dd style="margin-left: 5.0em">Specifies a PostScript Printer Description file to use with the printer.
+If specified, this option overrides the <i>-i</i> option (interface script).
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
+Also, printer and class names are <i>not</i> case-sensitive.
+Finally, the CUPS version of <b>lpadmin</b> may ask the user for an access password depending on the printing system configuration.
+This differs from the System V version which requires the root user to execute this command.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The CUPS version of <b>lpadmin</b> does not support all of the System V or Solaris printing system configuration options.
+<h2 class="title"><a name="EXAMPLE">Example</a></h2>
+Create an IPP Everywhere print queue:
+<pre class="man">
+
+ lpadmin -p myprinter -E -v ipp://myprinter.local/ipp/print -m everywhere
+
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8),</a>
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8),</a>
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpc.html b/doc/help/man-lpc.html
new file mode 100644
index 0000000..e482a78
--- /dev/null
+++ b/doc/help/man-lpc.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpc(8)</title>
+</head>
+<body>
+<h1 class="title">lpc(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpc - line printer control program
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpc</b>
+[
+<i>command</i>
+[
+<i>parameter(s)</i>
+] ]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpc</b> provides limited control over printer and class queues provided by CUPS. It can also be used to query the state of queues.
+<p>If no command is specified on the command-line, <b>lpc</b> displays a prompt and accepts commands from the standard input.
+<h3><a name="COMMANDS">Commands</a></h3>
+The <b>lpc</b> program accepts a subset of commands accepted by the Berkeley <b>lpc</b> program of the same name:
+<dl class="man">
+<dt><b>exit</b>
+<dd style="margin-left: 5.0em">Exits the command interpreter.
+<dt><b>help </b>[<i>command</i>]
+<dd style="margin-left: 5.0em"><dt><b>? </b>[<i>command</i>]
+<dd style="margin-left: 5.0em">Displays a short help message.
+<dt><b>quit</b>
+<dd style="margin-left: 5.0em">Exits the command interpreter.
+<dt><b>status </b>[<i>queue</i>]
+<dd style="margin-left: 5.0em">Displays the status of one or more printer or class queues.
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+Since <b>lpc</b> is geared towards the Berkeley printing system, it is impossible to use <b>lpc</b> to configure printer or class queues provided by CUPS.
+To configure printer or class queues you must use the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command or another CUPS-compatible client with that functionality.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8),</a>
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpinfo.html b/doc/help/man-lpinfo.html
new file mode 100644
index 0000000..bafd2bf
--- /dev/null
+++ b/doc/help/man-lpinfo.html
@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpinfo(8)</title>
+</head>
+<body>
+<h1 class="title">lpinfo(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpinfo - show available devices or drivers
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpinfo</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-l</b>
+] [
+<b>--device-id</b>
+<i>device-id-string</i>
+] [
+<b>--exclude-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--include-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--language</b>
+<i>locale</i>
+] [
+<b>--make-and-model</b>
+<i>name</i>
+] [
+<b>--product</b>
+<i>name</i>
+]
+<b>-m</b>
+<br>
+<b>lpinfo</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-l</b>
+] [
+<b>--exclude-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--include-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--timeout</b>
+<i>seconds</i>
+]
+<b>-v</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpinfo</b> lists the available devices or drivers known to the CUPS server.
+The first form (<i>-m</i>) lists the available drivers, while the second form (<i>-v</i>) lists the available devices.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>lpinfo</b> accepts the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Sets the username to use when connecting to the server.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Selects an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Shows a "long" listing of devices or drivers.
+<dt><b>--device-id </b><i>device-id-string</i>
+<dd style="margin-left: 5.0em">Specifies the IEEE-1284 device ID to match when listing drivers with the <i>-m</i> option.
+<dt><b>--exclude-schemes </b><i>scheme-list</i>
+<dd style="margin-left: 5.0em">Specifies a comma-delimited list of device or PPD schemes that should be excluded from the results.
+Static PPD files use the "file" scheme.
+<dt><b>--include-schemes </b><i>scheme-list</i>
+<dd style="margin-left: 5.0em">Specifies a comma-delimited list of device or PPD schemes that should be included in the results.
+Static PPD files use the "file" scheme.
+<dt><b>--language </b><i>locale</i>
+<dd style="margin-left: 5.0em">Specifies the language to match when listing drivers with the <i>-m</i> option.
+<dt><b>--make-and-model </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the make and model to match when listing drivers with the <i>-m</i> option.
+<dt><b>--product </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the product to match when listing drivers with the <i>-m</i> option.
+<dt><b>--timeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the timeout when listing devices with the <i>-v</i> option.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The <i>lpinfo</i> command is unique to CUPS.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+List all devices:
+<pre class="man">
+
+ lpinfo -v
+
+</pre>
+List all drivers:
+<pre class="man">
+
+ lpinfo -m
+
+</pre>
+List drivers matching "HP LaserJet":
+<pre class="man">
+
+ lpinfo --make-and-model "HP LaserJet" -m
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpmove.html b/doc/help/man-lpmove.html
new file mode 100644
index 0000000..8e902cd
--- /dev/null
+++ b/doc/help/man-lpmove.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpmove(8)</title>
+</head>
+<body>
+<h1 class="title">lpmove(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpmove - move a job or all jobs to a new destination
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpmove</b>
+[
+<b>-E</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-U</b>
+<i>username</i>
+]
+<i>job</i>
+<i>destination</i>
+<br>
+<b>lpmove</b>
+[
+<b>-E</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-U</b>
+<i>username</i>
+]
+<i>source</i>
+<i>destination</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpmove</b> moves the specified <i>job</i> or all jobs from <i>source</i> to <i>destination</i>. <i>job</i> can be the job ID number or the old destination and job ID.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The <b>lpmove</b> command supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Move job 123 from "oldprinter" to "newprinter":
+<pre class="man">
+
+ lpmove 123 newprinter
+
+ <i>or</i>
+
+ lpmove oldprinter-123 newprinter
+
+</pre>
+Move all jobs from "oldprinter" to "newprinter":
+<pre class="man">
+
+ lpmove oldprinter newprinter
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpoptions.html b/doc/help/man-lpoptions.html
new file mode 100644
index 0000000..0aeed45
--- /dev/null
+++ b/doc/help/man-lpoptions.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpoptions(1)</title>
+</head>
+<body>
+<h1 class="title">lpoptions(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpoptions - display or set printer options and defaults
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-d </b><i>destination</i>[<b>/</b><i>instance</i>]
+[
+<b>-l</b>
+]
+<br>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-p </b><i>destination</i>[<b>/</b><i>instance</i>]
+]
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>] ...
+<br>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-p </b><i>destination</i>[<b>/</b><i>instance</i>]
+]
+<b>-r</b>
+<i>option</i>
+<br>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-x </b><i>destination</i>[<b>/</b><i>instance</i>]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpoptions</b> displays or sets printer options and defaults.
+If no printer is specified using the <i>-p</i> option, the default printer is used as described in
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1).</a>
+<p>If no <i>-l</i>, <i>-o</i>, or <i>-r</i> options are specified, the current options are reported on the standard output.
+<p>Options set with the <b>lpoptions</b> command are used by the
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1)</a>
+and
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1)</a>
+commands when submitting jobs.
+<p>When run by the root user, <b>lpoptions</b> gets and sets default options and instances for all users in the <i>/etc/cups/lpoptions</i> file.
+Otherwise, the per-user defaults are managed in the <i>~/.cups/lpoptions</i> file.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>lpoptions</b> supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Enables encryption when communicating with the CUPS server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Uses an alternate username.
+<dt><b>-d </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Sets the user default printer to <i>destination</i>.
+If <i>instance</i> is supplied then that particular instance is used.
+This option overrides the system default printer for the current user.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Uses an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Lists the printer specific options and their current settings.
+<dt><b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Specifies a new option for the named destination.
+<dt><b>-p </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Sets the destination and instance, if specified, for any options that follow.
+If the named instance does not exist then it is created.
+Destinations can only be created using the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+program.
+<dt><b>-r </b><i>option</i>
+<dd style="margin-left: 5.0em">Removes the specified option from the named destination.
+<dt><b>-x </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Removes the options for the named destination and instance, if specified.
+If the named instance does not exist then this does nothing.
+Destinations can only be removed using the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>~/.cups/lpoptions</i> - user defaults and instances created by non-root users.
+<br>
+<i>/etc/cups/lpoptions</i> - system-wide defaults and instances created by the root user.
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The <b>lpoptions</b> command is unique to CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpq.html b/doc/help/man-lpq.html
new file mode 100644
index 0000000..d54378e
--- /dev/null
+++ b/doc/help/man-lpq.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpq(1)</title>
+</head>
+<body>
+<h1 class="title">lpq(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpq - show printer queue status
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpq</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+] [
+<b>-a</b>
+] [
+<b>-l</b>
+] [
+<b>+</b><i>interval</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpq</b> shows the current print queue status on the named printer.
+Jobs queued on the default destination will be shown if no printer or class is specified on the command-line.
+<p>The <i>+interval</i> option allows you to continuously report the jobs in the queue until the queue is empty; the list of jobs is shown once every <i>interval</i> seconds.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>lpq</b> supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate printer or class name.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-a</b>
+<dd style="margin-left: 5.0em">Reports jobs on all printers.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Requests a more verbose (long) reporting format.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpr.html b/doc/help/man-lpr.html
new file mode 100644
index 0000000..98fc7c6
--- /dev/null
+++ b/doc/help/man-lpr.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpr(1)</title>
+</head>
+<body>
+<h1 class="title">lpr(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpr - print files
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpr</b>
+[
+<b>-E</b>
+] [
+<b>-H </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+] [
+<b>-#</b>
+<i>num-copies</i>
+[
+<b>-h</b>
+] [
+<b>-l</b>
+] [
+<b>-m</b>
+] [
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+] [
+<b>-p</b>
+] [
+<b>-q</b>
+] [
+<b>-r</b>
+] [
+<b>-C</b>
+<i>title</i>
+] [
+<b>-J</b>
+<i>title</i>
+] [
+<b>-T</b>
+<i>title</i>
+] [
+<i>file(s)</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpr</b> submits files for printing.
+Files named on the command line are sent to the named printer or the default destination if no destination is specified.
+If no files are listed on the command-line, <b>lpr</b> reads the print file from the standard input.
+<h3><a name="THE_DEFAULT_DESTINATION">The Default Destination</a></h3>
+CUPS provides many ways to set the default destination. The <b>LPDEST</b> and <b>PRINTER</b> environment variables are consulted first.
+If neither are set, the current default set using the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command is used, followed by the default set using the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized by <i>lpr</i>:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-H </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-C "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>-J "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>-T "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the job name/title.
+<dt><b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Prints files to the named printer.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-# </b><i>copies</i>
+<dd style="margin-left: 5.0em">Sets the number of copies to print.
+<dt><b>-h</b>
+<dd style="margin-left: 5.0em">Disables banner printing. This option is equivalent to <i>-o job-sheets=none</i>.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Specifies that the print file is already formatted for the destination and should be sent without filtering.
+This option is equivalent to <i>-o raw</i>.
+<dt><b>-m</b>
+<dd style="margin-left: 5.0em">Send an email on job completion.
+<dt><b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets a job option.
+<dt><b>-p</b>
+<dd style="margin-left: 5.0em">Specifies that the print file should be formatted with a shaded header with the date, time, job name, and page number.
+This option is equivalent to <i>-o prettyprint</i> and is only useful when printing text files.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em">Hold job for printing.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em">Specifies that the named print files should be deleted after submitting them.
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The <i>-c</i>, <i>-d</i>, <i>-f</i>, <i>-g</i>, <i>-i</i>, <i>-n</i>, <i>-t</i>, <i>-v</i>, and <i>-w</i> options are not supported by CUPS and produce a warning message if used.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Print two copies of a document to the default printer:
+<pre class="man">
+
+ lpr -# 2 filename
+
+</pre>
+Print a double-sided legal document to a printer called "foo":
+<pre class="man">
+
+ lpr -P foo -o media=legal -o sides=two-sided-long-edge filename
+
+</pre>
+Print a presentation document 2-up to a printer called "foo":
+<pre class="man">
+
+ lpr -P foo -o number-up=2 filename
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lprm.html b/doc/help/man-lprm.html
new file mode 100644
index 0000000..558da4e
--- /dev/null
+++ b/doc/help/man-lprm.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lprm(1)</title>
+</head>
+<body>
+<h1 class="title">lprm(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lprm - cancel print jobs
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lprm</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>server</i>[<i>:port</i>]
+] [
+<b>-P</b>
+<i>destination</i>[<i>/instance</i>]
+] [
+<b>-</b>
+] [
+<i>job-id(s)</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lprm</b>
+cancels print jobs that have been queued for printing.
+If no arguments are supplied, the current job on the default destination is canceled.
+You can specify one or more job ID numbers to cancel those jobs or use the <i>-</i> option to cancel all jobs.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The
+<b>lprm</b>
+command supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-P </b><i>destination</i>[<i>/instance</i>]
+<dd style="margin-left: 5.0em">Specifies the destination printer or class.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-h </b><i>server</i>[<i>:port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The CUPS version of
+<b>lprm</b>
+is compatible with the standard Berkeley command of the same name.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Cancel the current job on the default printer:
+<pre class="man">
+
+ lprm
+
+</pre>
+Cancel job 1234:
+<pre class="man">
+
+ lprm 1234
+
+</pre>
+Cancel all jobs:
+<pre class="man">
+
+ lprm -
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpstat.html b/doc/help/man-lpstat.html
new file mode 100644
index 0000000..3b7024e
--- /dev/null
+++ b/doc/help/man-lpstat.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>lpstat(1)</title>
+</head>
+<body>
+<h1 class="title">lpstat(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpstat - print cups status information
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpstat</b>
+[
+<b>-E</b>
+] [
+<b>-H</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-l</b>
+] [
+<b>-W</b>
+<i>which-jobs</i>
+] [
+<b>-a</b>
+[
+<i>destination(s)</i>
+] ] [
+<b>-c</b>
+[
+<i>class(es)</i>
+] ] [
+<b>-d</b>
+] [
+<b>-o</b>
+[
+<i>destination(s)</i>
+] ] [
+<b>-p</b>
+[
+<i>printer(s)</i>
+] ] [
+<b>-r</b>
+] [
+<b>-R</b>
+] [
+<b>-s</b>
+] [
+<b>-t</b>
+] [
+<b>-u</b>
+[
+<i>user(s)</i>
+] ] [
+<b>-v</b>
+[
+<i>printer(s)</i>
+] ]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpstat</b> displays status information about the current classes, jobs, and printers.
+When run with no arguments, <b>lpstat</b> will list active jobs queued by the current user.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The <b>lpstat</b> command supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-H</b>
+<dd style="margin-left: 5.0em">Shows the server hostname and port.
+<dt><b>-R</b>
+<dd style="margin-left: 5.0em">Shows the ranking of print jobs.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-W </b><i>which-jobs</i>
+<dd style="margin-left: 5.0em">Specifies which jobs to show, "completed" or "not-completed" (the default).
+This option <i>must</i> appear before the <i>-o</i> option and/or any printer names, otherwise the default ("not-completed") value will be used in the request to the scheduler.
+<dt><b>-a </b>[<i>printer(s)</i>]
+<dd style="margin-left: 5.0em">Shows the accepting state of printer queues.
+If no printers are specified then all printers are listed.
+<dt><b>-c </b>[<i>class(es)</i>]
+<dd style="margin-left: 5.0em">Shows the printer classes and the printers that belong to them.
+If no classes are specified then all classes are listed.
+<dt><b>-d</b>
+<dd style="margin-left: 5.0em">Shows the current default destination.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Shows a long listing of printers, classes, or jobs.
+<dt><b>-o </b>[<i>destination(s)</i>]
+<dd style="margin-left: 5.0em">Shows the jobs queued on the specified destinations.
+If no destinations are specified all jobs are shown.
+<dt><b>-p </b>[<i>printer(s)</i>]
+<dd style="margin-left: 5.0em">Shows the printers and whether they are enabled for printing.
+If no printers are specified then all printers are listed.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em">Shows whether the CUPS server is running.
+<dt><b>-s</b>
+<dd style="margin-left: 5.0em">Shows a status summary, including the default destination, a list of classes and their member printers, and a list of printers and their associated devices.
+This is equivalent to using the <i>-d</i>, <i>-c</i>, and <i>-v</i> options.
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Shows all status information.
+This is equivalent to using the <i>-r</i>, <i>-d</i>, <i>-c</i>, <i>-v</i>, <i>-a</i>, <i>-p</i>, and <i>-o</i> options.
+<dt><b>-u </b>[<i>user(s)</i>]
+<dd style="margin-left: 5.0em">Shows a list of print jobs queued by the specified users.
+If no users are specified, lists the jobs queued by the current user.
+<dt><b>-v </b>[<i>printer(s)</i>]
+<dd style="margin-left: 5.0em">Shows the printers and what device they are attached to.
+If no printers are specified then all printers are listed.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", and "#".
+Also, printer and class names are <i>not</i> case-sensitive.
+<p>The <i>-h</i>, <i>-E</i>, <i>-U</i>, and <i>-W</i> options are unique to CUPS.
+<p>The Solaris <i>-f</i>, <i>-P</i>, and <i>-S</i> options are silently ignored.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-mailto.conf.html b/doc/help/man-mailto.conf.html
new file mode 100644
index 0000000..05b1e14
--- /dev/null
+++ b/doc/help/man-mailto.conf.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>mailto.conf(5)</title>
+</head>
+<body>
+<h1 class="title">mailto.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+mailto.conf - configuration file for cups email notifier
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>mailto.conf</b> file defines the local mail server and email notification preferences for CUPS.
+<p>Each line in the file can be a configuration directive, a blank line, or a comment.
+Configuration directives typically consist of a name and zero or more values separated by whitespace.
+The configuration directive name and values are case-insensitive.
+Comment lines start with the # character.
+<h3><a name="DIRECTIVES">Directives</a></h3>
+<dl class="man">
+<dt><b>Cc </b><i>cc-address@domain.com</i>
+<dd style="margin-left: 5.0em">Specifies an additional recipient for all email notifications.
+<dt><b>From </b><i>from-address@domain.com</i>
+<dd style="margin-left: 5.0em">Specifies the sender of email notifications.
+<dt><b>Sendmail </b><i>sendmail command and options</i>
+<dd style="margin-left: 5.0em">Specifies the sendmail command to use when sending email notifications.
+Only one <i>Sendmail</i> or <i>SMTPServer</i> line may be present in the <b>mailto.conf</b> file.
+If multiple lines are present, only the last one is used.
+<dt><b>SMTPServer </b><i>servername</i>
+<dd style="margin-left: 5.0em">Specifies a SMTP server to send email notifications to.
+Only one <i>Sendmail</i> or <i>SMTPServer</i> line may be present in the <b>mailto.conf</b> file.
+If multiple lines are present, only the last one is used.
+<dt><b>Subject </b><i>subject-prefix</i>
+<dd style="margin-left: 5.0em">Specifies a prefix string for the subject line of an email notification.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-mime.convs.html b/doc/help/man-mime.convs.html
new file mode 100644
index 0000000..4d41262
--- /dev/null
+++ b/doc/help/man-mime.convs.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>mime.convs(5)</title>
+</head>
+<body>
+<h1 class="title">mime.convs(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+mime.convs - mime type conversion file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>mime.convs</b> file defines the filters that are available for converting files from one format to another.
+The standard filters support text, PDF, PostScript, and many types of image files.
+<p>Additional filters are specified in files with the extension <i>.convs</i> in the CUPS configuration directory.
+<p>Each line in the <b>mime.convs</b> file is a comment, blank, or filter
+line.
+Comment lines start with the # character.
+Filter lines specify the source and destination MIME types along with a relative cost associated with the filter and the filter to run:
+<pre class="man">
+
+ source/type destination/type cost filter
+
+</pre>
+The <i>source/type</i> field specifies the source MIME media type that is consumed by the filter.
+<p>The <i>destination/type</i> field specifies the destination MIME media type that is produced by the filter.
+<p>The <i>cost</i> field specifies the relative cost for running the filter.
+A value of 100 means that the filter uses a large amount of resources while a value of 0 means that the filter uses very few resources.
+<p>The <i>filter</i> field specifies the filter program filename.
+Filenames are relative to the CUPS filter directory.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>/etc/cups</i> - Typical CUPS configuration directory.
+<br>
+<i>/usr/lib/cups/filter</i> - Typical CUPS filter directory.
+<br>
+<i>/usr/libexec/cups/filter</i> - CUPS filter directory on OS X.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Define a filter that converts PostScript documents to CUPS Raster format:
+<pre class="man">
+
+ application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
+
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-mime.types.html b/doc/help/man-mime.types.html
new file mode 100644
index 0000000..34168d5
--- /dev/null
+++ b/doc/help/man-mime.types.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>mime.types(5)</title>
+</head>
+<body>
+<h1 class="title">mime.types(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+mime.types - mime type description file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>mime.types</b> file defines the recognized file types.
+<p>Additional file types are specified in files with the extension <i>.types</i> in the CUPS configuration directory.
+<p>Each line in the <b>mime.types</b> file is a comment, blank, or rule line.
+Comment lines start with the # character.
+Rule lines start with the MIME media type and are optionally followed by a series of file recognition rules:
+<pre class="man">
+
+ <i>mime/type </i>[ <i>rule </i>... <i>rule </i>]
+
+</pre>
+Rules can be extended over multiple lines using the backslash character (\):
+<pre class="man">
+
+ <i>mime/type </i>[ <i>really-really-really-long-rule </i>... <b>\
+ </b><i>rule </i>]
+
+</pre>
+MIME media types specified by the <i>mime/type</i> field are case-insensitive and are sorted in ascending alphanumeric order for the purposes of matching.
+See the "TYPE MATCHING AND PRIORITY" section for more information.
+<p>The rules may be grouped using parenthesis, joined using "+" for a logical AND, joined using "," or whitespace for a logical OR, and negated using "!".
+<h3><a name="RULES">Rules</a></h3>
+Rules take two forms - a filename extension by itself and functions with test
+values inside parenthesis.
+The following functions are available:
+<dl class="man">
+<dt><b>match("</b><i>pattern</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the filename matches the given shell wildcard <i>pattern</i>.
+<dt><b>ascii(</b><i>offset</i><b>,</b><i>length</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the <i>length</i> bytes starting at <i>offset</i> are valid printable ASCII (CR, NL, TAB, BS, 32-126).
+<dt><b>printable(</b><i>offset</i><b>,</b><i>length</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the <i>length</i> bytes starting at <i>offset</i> are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254).
+<dt><b>priority(</b><i>number</i><b>)</b>
+<dd style="margin-left: 5.0em">Specifies the relative priority of this MIME media type.
+The default priority is 100.
+Larger values have higher priority while smaller values have lower priority.
+<dt><b>string(</b><i>offset</i><b>,"</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the bytes starting at <i>offset</i> are identical to <i>string</i>.
+<dt><b>istring(</b><i>offset</i><b>,"</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the bytes starting at <i>offset</i> match <i>string</i> without respect to case.
+<dt><b>char(</b><i>offset</i><b>,</b><i>value</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the byte at <i>offset</i> is identical to <i>value</i>.
+<dt><b>short(</b><i>offset</i><b>,</b><i>value</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the 16-bit big-endian integer at <i>offset</i> is identical to <i>value</i>.
+<dt><b>int(</b><i>offset</i><b>,</b><i>value</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the 32-bit big-endian integer at <i>offset</i> is identical to <i>value</i>.
+<dt><b>locale("</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if current locale matches <i>string</i>.
+<dt><b>contains(</b><i>offset</i><b>,</b><i>range</i><b>,"</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the bytes starting at <i>offset</i> for <i>range</i> bytes contains <i>string</i>.
+</dl>
+<h3><a name="STRING_CONSTANTS">String Constants</a></h3>
+String constants can be specified inside quotes ("") for strings containing whitespace and angle brackets (&lt;>) for hexadecimal strings.
+<h3><a name="TYPE_MATCHING_AND_PRIORITY">Type Matching And Priority</a></h3>
+When CUPS needs to determine the MIME media type of a given file, it checks every MIME media type defined in the <i>.types</i> files.
+When two or more types match a given file, the type chosen will depend on the type name and priority, with higher-priority types being used over lower-priority ones.
+If the types have the same priority, the type names are sorted alphanumerically in ascending order and the first type is chosen.
+<p>For example, if two types "text/bar" and "text/foo" are defined as matching the
+extension "doc", normally the type "text/bar" will be chosen since its name is
+alphanumerically smaller than "text/foo".
+However, if "text/foo" also defines a higher priority than "text/bar", "text/foo" will be chosen instead.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>/etc/cups</i> - Typical CUPS configuration directory.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Define two MIME media types for raster data, with one being a subset with higher priority:
+<pre class="man">
+
+ application/vnd.cups-raster string(0,"RaSt") string(0,"tSaR") \
+ string(0,"RaS2") string(0,"2SaR") \
+ string(0,"RaS3") string(0,"3SaR")
+
+ image/pwg-raster string(0,"RaS2") + \
+ string(4,PwgRaster&lt;00>) priority(150)
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-notifier.html b/doc/help/man-notifier.html
new file mode 100644
index 0000000..0a2cec0
--- /dev/null
+++ b/doc/help/man-notifier.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>notifier(7)</title>
+</head>
+<body>
+<h1 class="title">notifier(7)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+notifier - cups notification interface
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>notifier</b>
+<i>recipient</i>
+[
+<i>user-data</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The CUPS notifier interface provides a standard method for adding support for new event notification methods to CUPS.
+Each notifier delivers one or more IPP events from the standard input to the specified recipient.
+<p>Notifiers <b>MUST</b> read IPP messages from the standard input using the
+<b>ippNew</b>()
+and
+<b>ippReadFile</b>()
+functions and exit on error.
+Notifiers are encouraged to exit after a suitable period of inactivity, however they may exit after reading the first message or stay running until an error is seen.
+Notifiers inherit the environment and can use the logging mechanism documented in
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7).</a>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdc.html b/doc/help/man-ppdc.html
new file mode 100644
index 0000000..7e5063e
--- /dev/null
+++ b/doc/help/man-ppdc.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ppdc(1)</title>
+</head>
+<body>
+<h1 class="title">ppdc(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdc - cups ppd compiler (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdc</b>
+[
+<b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+] [
+<b>-I</b>
+<i>include-directory</i>
+] [
+<b>-c</b>
+<i>message-catalog</i>
+] [
+<b>-d</b>
+<i>output-directory</i>
+] [
+<b>-l</b>
+<i>language(s)</i>
+] [
+<b>-m</b>
+] [
+<b>-t</b>
+] [
+<b>-v</b>
+] [
+<b>-z</b>
+] [
+<b>--cr</b>
+] [
+<b>--crlf</b>
+] [
+<b>--lf</b>
+]
+<i>source-file</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdc</b> compiles PPDC source files into one or more PPD files.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdc</b> supports the following options:
+<dl class="man">
+<dt><b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets the named variable for use in the source file.
+It is equivalent to using the <i>#define</i> directive in the source file.
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+<dt><b>-c </b><i>message-catalog</i>
+<dd style="margin-left: 5.0em">Specifies a single message catalog file in GNU gettext (filename.po) or Apple strings (filename.strings) format to be used for localization.
+<dt><b>-d </b><i>output-directory</i>
+<dd style="margin-left: 5.0em">Specifies the output directory for PPD files.
+The default output directory is "ppd".
+<dt><b>-l </b><i>language(s)</i>
+<dd style="margin-left: 5.0em">Specifies one or more languages to use when localizing the PPD file(s).
+The default language is "en" (English).
+Separate multiple languages with commas, for example "de_DE,en_UK,es_ES,es_MX,es_US,fr_CA,fr_FR,it_IT" will create PPD files with German, UK English, Spanish (Spain, Mexico, and US), French (France and Canada), and Italian languages in each file.
+<dt><b>-m</b>
+<dd style="margin-left: 5.0em">Specifies that the output filename should be based on the ModelName value instead of FileName or PCFilenName.
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Specifies that PPD files should be tested instead of generated.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies verbose output, basically a running status of which files are being loaded or written.
+<b>-z</b>
+Generates compressed PPD files (filename.ppd.gz).
+The default is to generate uncompressed PPD files.
+<dt><b>--cr</b>
+<dd style="margin-left: 5.0em"><dt><b>--crlf</b>
+<dd style="margin-left: 5.0em"><dt><b>--lf</b>
+<dd style="margin-left: 5.0em">Specifies the line ending to use - carriage return, carriage return and line feed, or line feed alone.
+The default is to use the line feed character alone.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdcfile.html b/doc/help/man-ppdcfile.html
new file mode 100644
index 0000000..4e42797
--- /dev/null
+++ b/doc/help/man-ppdcfile.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ppdcfile(5)</title>
+</head>
+<body>
+<h1 class="title">ppdcfile(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdcfile - cups ppd compiler source file format
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1).</a>
+This man page provides a quick reference to the supported keywords and should be used in conjunction with the online help for CUPS.
+<p>The source file format is plain ASCII text that can be edited using your favorite text editor. Comments are supported using the C (/* ... */) and C++ (// ...) comment mechanisms.
+<p>Printer driver information can be grouped and shared using curly braces ({ ... }); PPD files are written when a close brace or end-of-file is seen and a PCFileName directive has been defined.
+<p>Directives may be placed anywhere on a line and are followed by one or more values. The following is a list of the available directives and the values they accept:
+<dl class="man">
+<dt><b>#define </b><i>name value</i>
+<dd style="margin-left: 5.0em"><dt><b>#elif </b>{<i>name </i>| <i>value</i>}
+<dd style="margin-left: 5.0em"><dt><b>#else</b>
+<dd style="margin-left: 5.0em"><dt><b>#endif</b>
+<dd style="margin-left: 5.0em"><dt><b>#font </b><i>name encoding "version" charset status</i>
+<dd style="margin-left: 5.0em"><dt><b>#if </b>{<i>name </i>| <i>value</i>}
+<dd style="margin-left: 5.0em"><dt><b>#include &lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em"><dt><b>#include "</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>#media </b><i>name width length</i>
+<dd style="margin-left: 5.0em"><dt><b>#media "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>width length</i>
+<dd style="margin-left: 5.0em"><dt><b>#po </b><i>locale </i><b>"</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Attribute </b><i>name </i><b>"" </b><i>value</i>
+<dd style="margin-left: 5.0em"><dt><b>Attribute </b><i>name keyword value</i>
+<dd style="margin-left: 5.0em"><dt><b>Attribute </b><i>name </i><b>"</b><i>keyword</i><b>/</b><i>text</i><b>" </b><i>value</i>
+<dd style="margin-left: 5.0em"><dt><b>Choice </b><i>name </i><b>"</b><i>code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Choice "</b><i>name</i><b>/</b><i>text</i><b>" "</b><i>code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>ColorDevice </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>ColorModel </b><i>name colorspace colororder compression</i>
+<dd style="margin-left: 5.0em"><dt><b>ColorModel "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>colorspace colororder compression</i>
+<dd style="margin-left: 5.0em"><dt><b>ColorProfile </b><i>resolution</i><b>/</b><i>mediatype gamma density matrix</i>
+<dd style="margin-left: 5.0em"><dt><b>Copyright "</b><i>text</i>"
+<dd style="margin-left: 5.0em"><dt><b>CustomMedia </b><i>name width length left bottom right top </i><b>"</b><i>size-code</i><b>" "</b><i>region-code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>CustomMedia "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>width length left bottom right top </i><b>"</b><i>size-code</i><b>" "</b><i>region-code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Cutter </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>Darkness </b><i>temperature name</i>
+<dd style="margin-left: 5.0em"><dt><b>Darkness </b><i>temperature </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>DriverType </b><i>type</i>
+<dd style="margin-left: 5.0em"><dt><b>Duplex </b><i>type</i>
+<dd style="margin-left: 5.0em"><dt><b>Filter Imime-type cost program</b>
+<dd style="margin-left: 5.0em"><dt><b>Finishing </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>Finishing "</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Font *</b>
+<dd style="margin-left: 5.0em"><dt><b>Font </b><i>name encoding </i><b>"</b><i>version</i><b>" </b><i>charset status</i>
+<dd style="margin-left: 5.0em"><dt><b>Group </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>Group "</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>HWMargins </b><i>left bottom right top</i>
+<dd style="margin-left: 5.0em"><dt><b>InputSlot </b><i>position name</i>
+<dd style="margin-left: 5.0em"><dt><b>InputSlot </b><i>position </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Installable </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>Installable "</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>LocAttribute </b><i>name </i><b>"</b><i>keyword</i><b>/</b><i>text</i><b>" </b><i>value</i>
+<dd style="margin-left: 5.0em"><dt><b>ManualCopies </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>Manufacturer "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>MaxSize </b><i>width length</i>
+<dd style="margin-left: 5.0em"><dt><b>MediaSize </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>MediaType </b><i>type name</i>
+<dd style="margin-left: 5.0em"><dt><b>MediaType </b><i>type </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>MinSize </b><i>width length</i>
+<dd style="margin-left: 5.0em"><dt><b>ModelName "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>ModelNumber </b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>Option </b><i>name type section order</i>
+<dd style="margin-left: 5.0em"><dt><b>Option "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>type section order</i>
+<dd style="margin-left: 5.0em"><dt><b>PCFileName "</b><i>filename.ppd</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Resolution </b><i>colorspace bits-per-color row-count row-feed row-step name</i>
+<dd style="margin-left: 5.0em"><dt><b>Resolution </b><i>colorspace bits-per-color row-count row-feed row-step </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>SimpleColorProfile </b><i>resolution</i><b>/</b><i>mediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust</i>
+<dd style="margin-left: 5.0em"><dt><b>Throughput </b><i>pages-per-minute</i>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 *Option2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 Choice1 *Option2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 *Option2 Choice2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 Choice1 *Option2 Choice2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>VariablePaperSize </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>Version </b><i>number</i>
+<dd style="margin-left: 5.0em"></dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdhtml.html b/doc/help/man-ppdhtml.html
new file mode 100644
index 0000000..e009f7e
--- /dev/null
+++ b/doc/help/man-ppdhtml.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ppdhtml(1)</title>
+</head>
+<body>
+<h1 class="title">ppdhtml(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdhtml - cups html summary generator (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdhtml</b>
+[
+<b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+] [
+<b>-I</b>
+<i>include-directory</i>
+]
+<i>source-file</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdhtml</b> reads a driver information file and produces a HTML summary page that lists all of the drivers in a file and the supported options.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdhtml</b> supports the following options:
+<dl class="man">
+<dt><b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets the named variable for use in the source file.
+It is equivalent to using the <i>#define</i> directive in the source file.
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdi.html b/doc/help/man-ppdi.html
new file mode 100644
index 0000000..bb5c08b
--- /dev/null
+++ b/doc/help/man-ppdi.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ppdi(1)</title>
+</head>
+<body>
+<h1 class="title">ppdi(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdi - import ppd files (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdi</b>
+[
+<b>-I</b>
+<i>include-directory</i>
+] [
+<b>-o</b>
+<i>source-file</i>
+]
+<i>ppd-file</i>
+[ ...
+<i>ppd-file</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdi</b> imports one or more PPD files into a PPD compiler source file.
+Multiple languages of the same PPD file are merged into a single printer definition to facilitate accurate changes for all localizations.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdi</b> supports the following options:
+<dl class="man">
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+<dt><b>-o </b><i>source-file</i>
+<dd style="margin-left: 5.0em">Specifies the PPD source file to update.
+If the source file does not exist, a new source file is created.
+Otherwise the existing file is merged with the new PPD file(s) on the command-line.
+If no source file is specified, the filename <i>ppdi.drv</i> is used.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdmerge.html b/doc/help/man-ppdmerge.html
new file mode 100644
index 0000000..efb0950
--- /dev/null
+++ b/doc/help/man-ppdmerge.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ppdmerge(1)</title>
+</head>
+<body>
+<h1 class="title">ppdmerge(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdmerge - merge ppd files (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdmerge</b>
+[
+<b>-o</b>
+<i>output-ppd-file</i>
+]
+<i>ppd-file</i>
+<i>ppd-file</i>
+[ ...
+<i>ppd-file</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdmerge</b> merges two or more PPD files into a single, multi-language
+PPD file.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdmerge</b> supports the following options:
+<dl class="man">
+<dt><b>-o </b><i>output-ppd-file</i>
+<dd style="margin-left: 3.0em">Specifies the PPD file to create.
+If not specified, the merged PPD file is written to the standard output.
+If the output file already exists, it is silently overwritten.
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+<b>ppdmerge</b> does not check whether the merged PPD files are for the same device.
+Merging of different device PPDs will yield unpredictable results.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdpo.html b/doc/help/man-ppdpo.html
new file mode 100644
index 0000000..4696f1c
--- /dev/null
+++ b/doc/help/man-ppdpo.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>ppdpo(1)</title>
+</head>
+<body>
+<h1 class="title">ppdpo(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdpo - ppd message catalog generator (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdpo</b>
+[
+<b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+] [
+<b>-I</b>
+<i>include-directory</i>
+] [
+<b>-o</b>
+<i>output-file</i>
+]
+<i>source-file</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdpo</b> extracts UI strings from PPDC source files and updates either a GNU gettext or OS X strings format message catalog source file for translation.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdpo</b> supports the following options:
+<dl class="man">
+<dt><b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets the named variable for use in the source file.
+It is equivalent to using the <i>#define</i> directive in the source file.
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+<dt><b>-o </b><i>output-file</i>
+<dd style="margin-left: 5.0em">Specifies the output file.
+The supported extensions are <i>.po</i> or <i>.po.gz</i> for GNU gettext format message catalogs and <i>.strings</i> for OS X strings files.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<b>ppdcfile(5),</b>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-printers.conf.html b/doc/help/man-printers.conf.html
new file mode 100644
index 0000000..8dfcce0
--- /dev/null
+++ b/doc/help/man-printers.conf.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>printers.conf(5)</title>
+</head>
+<body>
+<h1 class="title">printers.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+printers.conf - printer configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>printers.conf</b> file defines the local printers that are available. It is normally located in the <i>/etc/cups</i> directory and is maintained by the
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+program. This file is not intended to be edited or managed manually.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-subscriptions.conf.html b/doc/help/man-subscriptions.conf.html
new file mode 100644
index 0000000..0c7b5d0
--- /dev/null
+++ b/doc/help/man-subscriptions.conf.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ <title>subscriptions.conf(5)</title>
+</head>
+<body>
+<h1 class="title">subscriptions.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+subscriptions.conf - subscription configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>subscriptions.conf</b> file defines the local event notification subscriptions that are active. It is normally located in the <i>/etc/cups</i> directory and is maintained by the
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+program. This file is not intended to be edited or managed manually.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/network.html b/doc/help/network.html
index e8c2219..e29c9a4 100644
--- a/doc/help/network.html
+++ b/doc/help/network.html
@@ -14,7 +14,7 @@
<P>Every network printer or print server has a unique Internet Protocol (IP) address associated with it. This address is either configured manually or set using an automatic network protocol such as the <A HREF="#BOOTP">Boot Protocol (BOOTP)</A>, <A HREF="#DHCP">Dynamic Host Control Protocol (DHCP)</A>, Reverse Address Resolution Protocol (RARP), or ZeroConf.</P>
-<P>You can normally find the IP address of a printer on the printer's control panel or by printing the configuration or status page. The <A HREF="#SNMP">Simple Network Management Protocol (SNMP)</A> can also be used to get the IP address remotely, which happens automatically when you visit the CUPS administration web page or choose an available CUPS device when adding a printer.</P>
+<P>You can normally find the IP address of a printer on the printer's control panel or by printing the configuration or status page. The <A HREF="#SNMP">Simple Network Management Protocol (SNMP)</A> can also be used to get the IP address remotely.</P>
<H2 CLASS="title"><A NAME="CONFIG">Configuring the IP Address</A></H2>
@@ -38,13 +38,7 @@ host <I>hostname</I> {
<H3><A NAME="BOOTP">Configuring the IP Address Using BOOTP</A></H3>
-<P>The BOOTP protocol is used when you need to provide additional information such as the location of a configuration file to the network interface. Using the standard <TT>bootpd(8)</TT> program supplied with UNIX you simply need to add a line to the <VAR>/etc/bootptab</VAR> file; for IRIX:</P>
-
-<PRE CLASS="command">
-myprinter 08:00:69:00:12:34 192.0.2.2 <VAR>myprinter.boot</VAR>
-</PRE>
-
-<P>Newer versions of <TT>bootpd</TT> use a different format:</P>
+<P>The BOOTP protocol is used when you need to provide additional information such as the location of a configuration file to the network interface. Using the standard <TT>bootpd(8)</TT> program supplied with UNIX you simply need to add a line to the <VAR>/etc/bootptab</VAR> file:</P>
<PRE CLASS="command">
myprinter:ha=080069001234:ip=192.0.2.2:<VAR>t144=myprinter.boot</VAR>
@@ -108,7 +102,7 @@ socket://<i>ip-address-or-hostname</i>:<i>port-number</i>/?option=value&amp;opti
<H3><A NAME="IPP">Internet Printing Protocol (IPP)</A></H3>
-<P>IPP is the only protocol that CUPS supports natively and is supported by some network printers and print servers. However, since many printers do not implement IPP properly, only use IPP when the vendor actually documents official support for it. IPP printing normally happens over port 631 and uses the <tt>http</tt>, <tt>ipp</tt>, and <tt>ipps</tt> URI schemes:</P>
+<P>IPP is the only protocol that CUPS supports natively and is supported by most network printers and print servers. IPP printing normally happens over port 631 and uses the <tt>http</tt> (Windows), <tt>ipp</tt>, and <tt>ipps</tt> URI schemes:</P>
<PRE>
http://<i>ip-address-or-hostname</i>:<i>port-number</i>/<i>resource</i>
@@ -140,10 +134,6 @@ ipps://<i>ip-address-or-hostname</i>:<i>port-number</i>/<i>resource</i>?<i>optio
</THEAD>
<TBODY>
<TR>
- <TD><TT>compression=gzip</TT></TD>
- <TD>Specifies that print data should be compressed before sending.</TD>
-</TR>
-<TR>
<TD><TT>encryption=always</TT></TD>
<TD>Specifies that the connection to the IPP server should be encrypted using SSL.</TD>
</TR>
@@ -276,11 +266,11 @@ lpd://<i>username@ip-address-or-hostname</i>/<i>queue</i>?<i>option=value&amp;op
</TR>
<TR>
<TD><TT>sanitize_title=no</TT></TD>
- <TD>Specifies that the job title string should not be restricted to ASCII characters.</TD>
+ <TD>Specifies that the job title string should not be restricted to ASCII alphanumeric and space characters.</TD>
</TR>
<TR>
<TD><TT>sanitize_title=yes</TT></TD>
- <TD>Specifies that the job title string should be restricted to ASCII characters.</TD>
+ <TD>Specifies that the job title string should be restricted to ASCII alphanumeric and space characters.</TD>
</TR>
<TR>
<TD><TT>snmp=false</TT></TD>
diff --git a/doc/help/overview.html b/doc/help/overview.html
index 4a4b173..367434d 100644
--- a/doc/help/overview.html
+++ b/doc/help/overview.html
@@ -47,14 +47,9 @@ different ways.</P>
<H2 CLASS="title"><A NAME="BEGIN">Where Do I Begin?</A></H2>
-<P>Click on the <A HREF="http://localhost:631/admin">Administration</A> tab at
-the top of this page. Click on the <VAR>Add Printer</VAR> button and follow the
-prompts.</P>
+<P>Click on the <var>Administration</var> tab. Click on the <var>Add Printer</var> button and follow the prompts.</P>
-<BLOCKQUOTE>When you are asked for a username and password, enter your login
-username and password or the "root" username and password. On MacOS X, the login
-username (or "short name") is typically your first and last name in
-lowercase.</BLOCKQUOTE>
+<BLOCKQUOTE>When you are asked for a username and password, enter your login username and password or the "root" username and password. On OS X<sup>&reg;</sup>, the login username (or "short name") is typically your first and last name in lowercase.</BLOCKQUOTE>
<P>After the printer is added, CUPS will ask you to set the default printer
options (paper size, output mode, etc.) for the printer. Make any changes as
diff --git a/doc/help/policies.html b/doc/help/policies.html
index 18f4c80..8a0fc31 100644
--- a/doc/help/policies.html
+++ b/doc/help/policies.html
@@ -14,12 +14,12 @@
<H2 CLASS="title"><A NAME="BASICS">The Basics</A></H2>
-<P>Operation policies are used for all IPP requests sent to the scheduler and are evaluated <em>after</em> the <A HREF="ref-cupsd-conf.html#Location"><TT>Location</TT></A> based access control rules. This means that operation policies can only add additional security restrictions to a request, never relax them. Use <TT>Location</TT> based access control rules for server-wide limits and operation policies for limits on individual printers, tasks, or services.</P>
+<P>Operation policies are used for all IPP requests sent to the scheduler and are evaluated <em>after</em> the <A HREF="man-cupsd.conf.html#Location"><TT>Location</TT></A> based access control rules. This means that operation policies can only add additional security restrictions to a request, never relax them. Use <TT>Location</TT> based access control rules for server-wide limits and operation policies for limits on individual printers, tasks, or services.</P>
-<P>Policies are stored in the <VAR>cupsd.conf</VAR> file in <A HREF="ref-cupsd-conf.html#Policy"><TT>Policy</TT></A> sections. Each policy has an alphanumeric name that is used to select it. Inside the policy section are one or more <A
-HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list the operations that are affected by the rules inside it. <A HREF="#LISTING01">Listing 1</A> shows the default operation policy, appropriately called "default", that is shipped with CUPS.</P>
+<P>Policies are stored in the <VAR>cupsd.conf</VAR> file in <A HREF="man-cupsd.conf.html#Policy"><TT>Policy</TT></A> sections. Each policy has an alphanumeric name that is used to select it. Inside the policy section are one or more <A
+HREF="man-cupsd.conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list the operations that are affected by the rules inside it. <A HREF="#LISTING01">Listing 1</A> shows the default operation policy, appropriately called "default", that is shipped with CUPS.</P>
-<P>The easiest way to add a policy to the <VAR>cupsd.conf</VAR> file is to use the web interface. Click on the <VAR>Administration</VAR> tab and then the <VAR>Edit Configuration File</VAR> button to edit the current <VAR>cupsd.conf</VAR> file. Click on the <VAR>Save Changes</VAR> button to save the changes and restart the scheduler. If you edit the <VAR>cupsd.conf</VAR> file from the console, make sure to <A HREF="ref-cupsd-conf.html">restart the cupsd process</A> before trying to use the new policy.</P>
+<P>The easiest way to add a policy to the <VAR>cupsd.conf</VAR> file is to use the web interface. Click on the <VAR>Administration</VAR> tab and then the <VAR>Edit Configuration File</VAR> button to edit the current <VAR>cupsd.conf</VAR> file. Click on the <VAR>Save Changes</VAR> button to save the changes and restart the scheduler. If you edit the <VAR>cupsd.conf</VAR> file from the console, make sure to <A HREF="man-cupsd.conf.html">restart the cupsd process</A> before trying to use the new policy.</P>
<PRE CLASS="example">
<EM>Listing 1: <A NAME="LISTING01">Default Operation Policy</A></EM>
@@ -39,7 +39,7 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
7
8 # All administration operations require an administrator
to authenticate...
- 9 &lt;Limit CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class
+ 9 &lt;Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class
CUPS-Delete-Class CUPS-Set-Default>
10 AuthType Default
11 Require user @SYSTEM
@@ -97,10 +97,10 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<P>The operation names are listed on a single line with spaces separating them. Each name corresponds to the IPP operation described in any of the IETF or PWG standards documents for the Internet Printing Protocol. <A HREF="#TABLE01">Table 1</A> lists all of the operations that have been defined along with their usage in CUPS.</P>
-<P>The access control rules are listed after the <TT>Limit</TT> line and are the same as those used for <A HREF="ref-cupsd-conf.html#Location"><TT>Location</TT></A> sections. In this case, we require the owner of the job ("@OWNER") or a member of the <A HREF="ref-cupsd-conf.html#SystemGroup"><TT>SystemGroup</TT></A> ("@SYSTEM") to do the operation. Because we do not include an <A HREF="ref-cupsd-conf.html#AuthType"><TT>AuthType</TT></A> directive here, the user information can come from the IPP request itself or the authenticated username from the HTTP request. The administrative operations starting on line 9, however, <em>do</em> use the <TT>AuthType</TT> directive, and so administrative operations need to be authenticated:</P>
+<P>The access control rules are listed after the <TT>Limit</TT> line and are the same as those used for <A HREF="man-cupsd.conf.html#Location"><TT>Location</TT></A> sections. In this case, we require the owner of the job ("@OWNER") or a member of the <A HREF="man-cups-files.conf.html#SystemGroup"><TT>SystemGroup</TT></A> ("@SYSTEM") to do the operation. Because we do not include an <A HREF="man-cupsd.conf.html#AuthType"><TT>AuthType</TT></A> directive here, the user information can come from the IPP request itself or the authenticated username from the HTTP request. The administrative operations starting on line 9, however, <em>do</em> use the <TT>AuthType</TT> directive, and so administrative operations need to be authenticated:</P>
<PRE CLASS="example">
- 9 &lt;Limit CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class
+ 9 &lt;Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class
CUPS-Delete-Class CUPS-Set-Default>
10 AuthType Default
11 Require user @SYSTEM
@@ -154,19 +154,39 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
</THEAD>
<TBODY>
<TR>
- <TD NOWRAP><TT>Print-Job</TT></TD>
- <TD>Yes</TD>
- <TD>Creates a print job with a single file.</TD>
+ <TD NOWRAP><TT>Activate-Printer</TT></TD>
+ <TD>No</TD>
+ <TD>Activates a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Print-URI</TT></TD>
+ <TD NOWRAP><TT>Cancel-Current-Job</TT></TD>
<TD>No</TD>
- <TD>Create a print job with a single URI.</TD>
+ <TD>Cancels the current job on a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Validate-Job</TT></TD>
+ <TD NOWRAP><TT>Cancel-Job</TT></TD>
<TD>Yes</TD>
- <TD>Validates a print request before printing.</TD>
+ <TD>Cancels a print job.</TD>
+</TR>
+<TR>
+ <TD NOWRAP><TT>Cancel-Jobs</TT></TD>
+ <TD>Yes</TD>
+ <TD>Cancels all print jobs.</TD>
+</TR>
+<TR>
+ <TD NOWRAP><TT>Cancel-My-Jobs</TT></TD>
+ <TD>Yes</TD>
+ <TD>Cancels a user's print job.</TD>
+</TR>
+<TR>
+ <TD NOWRAP><TT>Cancel-Subscription</TT></TD>
+ <TD>Yes</TD>
+ <TD>Cancels an event subscription.</TD>
+</TR>
+<TR>
+ <TD NOWRAP><TT>Close-Job</TT></TD>
+ <TD>Yes</TD>
+ <TD>Closes a user's print job so that it can be printed.</TD>
</TR>
<TR>
<TD NOWRAP><TT>Create-Job</TT></TD>
@@ -174,19 +194,29 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Creates a print job with no files or URIs.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Send-Document</TT></TD>
+ <TD NOWRAP><TT>Create-Job-Subscriptions</TT></TD>
<TD>Yes</TD>
- <TD>Adds a file to a print job.</TD>
+ <TD>Creates one or more event subscriptions for a job.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Send-URI</TT></TD>
+ <TD NOWRAP><TT>Create-Printer-Subscriptions</TT></TD>
+ <TD>Yes</TD>
+ <TD>Creates one or more event subscriptions for a printer or the server.</TD>
+</TR>
+<TR>
+ <TD NOWRAP><TT>Deactivate-Printer</TT></TD>
<TD>No</TD>
- <TD>Adds a URI to a print job.</TD>
+ <TD>Deactivates a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Cancel-Job</TT></TD>
+ <TD NOWRAP><TT>Disable-Printer</TT></TD>
<TD>Yes</TD>
- <TD>Cancels a print job.</TD>
+ <TD>Stops a printer or class.</TD>
+</TR>
+<TR>
+ <TD NOWRAP><TT>Enable-Printer</TT></TD>
+ <TD>Yes</TD>
+ <TD>Starts a printer or class.</TD>
</TR>
<TR>
<TD NOWRAP><TT>Get-Job-Attributes</TT></TD>
@@ -199,78 +229,82 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Gets a list of jobs.</TD>
</TR>
<TR>
+ <TD NOWRAP><TT>Get-Notifications</TT></TD>
+ <TD>Yes</TD>
+ <TD>Gets (pending) events for an event subscription.</TD>
+</TR>
+<TR>
<TD NOWRAP><TT>Get-Printer-Attributes</TT></TD>
<TD>Yes</TD>
<TD>Gets information and options associated with a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Hold-Job</TT></TD>
+ <TD NOWRAP><TT>Get-Printer-Supported-Values</TT></TD>
<TD>Yes</TD>
- <TD>Holds a print job for printing.</TD>
+ <TD>Gets -supported attributes for a printer based on job
+ options.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Release-Job</TT></TD>
+ <TD NOWRAP><TT>Get-Subscription-Attributes</TT></TD>
<TD>Yes</TD>
- <TD>Releases a print job for printing.</TD>
+ <TD>Gets information for an event subscription.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Restart-Job</TT></TD>
+ <TD NOWRAP><TT>Get-Subscriptions</TT></TD>
<TD>Yes</TD>
- <TD>Reprints a print job.</TD>
+ <TD>Gets a list of event subscriptions.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Pause-Printer</TT></TD>
+ <TD NOWRAP><TT>Hold-Job</TT></TD>
<TD>Yes</TD>
- <TD>Stops a printer or class.</TD>
+ <TD>Holds a print job for printing.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Resume-Printer</TT></TD>
+ <TD NOWRAP><TT>Hold-New-Jobs</TT></TD>
<TD>Yes</TD>
- <TD>Starts a printer or class.</TD>
+ <TD>Holds new jobs submitted to a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Purge-Jobs</TT></TD>
+ <TD NOWRAP><TT>Pause-Printer</TT></TD>
<TD>Yes</TD>
- <TD>Cancels all jobs on the server or a printer or class
- and removes the job history information.</TD>
+ <TD>Stops a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Set-Printer-Attributes</TT></TD>
+ <TD NOWRAP><TT>Pause-Printer-After-Current-Job</TT></TD>
<TD>No</TD>
- <TD>Sets printer or class information; CUPS uses
- CUPS-Add-Modify-Printer and CUPS-Add-Modify-Class
- instead.</TD>
+ <TD>Stops a printer or class after the current job is finished.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Set-Job-Attributes</TT></TD>
+ <TD NOWRAP><TT>Print-Job</TT></TD>
<TD>Yes</TD>
- <TD>Changes job options.</TD>
+ <TD>Creates a print job with a single file.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Get-Printer-Supported-Values</TT></TD>
+ <TD NOWRAP><TT>Print-URI</TT></TD>
<TD>No</TD>
- <TD>Gets -supported attributes for a printer based on job
- options.</TD>
+ <TD>Create a print job with a single URI.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Create-Printer-Subscription</TT></TD>
- <TD>Yes</TD>
- <TD>Creates an event subscription for a printer or the server.</TD>
+ <TD NOWRAP><TT>Promote-Job</TT></TD>
+ <TD>No</TD>
+ <TD>Prints a job before others.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Create-Job-Subscription</TT></TD>
+ <TD NOWRAP><TT>Purge-Jobs</TT></TD>
<TD>Yes</TD>
- <TD>Creates an event subscription for a job.</TD>
+ <TD>Cancels all jobs on the server or a printer or class
+ and removes the job history information.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Get-Subscription-Attributes</TT></TD>
+ <TD NOWRAP><TT>Release-Held-New-Jobs</TT></TD>
<TD>Yes</TD>
- <TD>Gets information for an event subscription.</TD>
+ <TD>Releases jobs that were held because of the
+ Hold-New-Jobs operation.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Get-Subscriptions</TT></TD>
+ <TD NOWRAP><TT>Release-Job</TT></TD>
<TD>Yes</TD>
- <TD>Gets a list of event subscriptions.</TD>
+ <TD>Releases a print job for printing.</TD>
</TR>
<TR>
<TD NOWRAP><TT>Renew-Subscription</TT></TD>
@@ -278,65 +312,62 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Renews an event subscription that is about to expire.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Cancel-Subscription</TT></TD>
- <TD>Yes</TD>
- <TD>Cancels an event subscription.</TD>
+ <TD NOWRAP><TT>Reprocess-Job</TT></TD>
+ <TD>No</TD>
+ <TD>Reprints a job on a different printer or class; CUPS has the
+ CUPS-Move-Job operation instead.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Get-Notifications</TT></TD>
+ <TD NOWRAP><TT>Restart-Job</TT></TD>
<TD>Yes</TD>
- <TD>Gets (pending) events for an event subscription.</TD>
+ <TD>Reprints a print job.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Send-Notifications</TT></TD>
+ <TD NOWRAP><TT>Restart-Printer</TT></TD>
<TD>No</TD>
- <TD>Sends events for an event subscription.</TD>
+ <TD>Restarts a printer or class, resuming print jobs as needed.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Get-Printer-Support-Files</TT></TD>
+ <TD NOWRAP><TT>Resubmit-Job</TT></TD>
<TD>No</TD>
- <TD>Gets printer driver files for a Novell client.</TD>
+ <TD>Reprints a job with new options.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Enable-Printer</TT></TD>
- <TD>Yes</TD>
- <TD>Starts a printer or class.</TD>
+ <TD NOWRAP><TT>Resume-Job</TT></TD>
+ <TD>No</TD>
+ <TD>Resumes printing of a stopped job.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Disable-Printer</TT></TD>
+ <TD NOWRAP><TT>Resume-Printer</TT></TD>
<TD>Yes</TD>
- <TD>Stops a printer or class.</TD>
-</TR>
-<TR>
- <TD NOWRAP><TT>Pause-Printer-After-Current-Job</TT></TD>
- <TD>No</TD>
- <TD>Stops a printer or class after the current job is finished.</TD>
+ <TD>Starts a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Hold-New-Jobs</TT></TD>
+ <TD NOWRAP><TT>Schedule-Job-After</TT></TD>
<TD>No</TD>
- <TD>Holds new jobs submitted to a printer or class.</TD>
+ <TD>Prints a job after others.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Release-Held-New-Jobs</TT></TD>
- <TD>No</TD>
- <TD>Releases jobs that were held because of the
- Hold-New-Jobs operation.</TD>
+ <TD NOWRAP><TT>Send-Document</TT></TD>
+ <TD>Yes</TD>
+ <TD>Adds a file to a print job.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Deactivate-Printer</TT></TD>
+ <TD NOWRAP><TT>Send-URI</TT></TD>
<TD>No</TD>
- <TD>Deactivates a printer or class.</TD>
+ <TD>Adds a URI to a print job.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Activate-Printer</TT></TD>
- <TD>No</TD>
- <TD>Activates a printer or class.</TD>
+ <TD NOWRAP><TT>Set-Printer-Attributes</TT></TD>
+ <TD>Yes</TD>
+ <TD>Sets printer or class information; CUPS uses
+ CUPS-Add-Modify-Printer and CUPS-Add-Modify-Class
+ for most attributes instead.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Restart-Printer</TT></TD>
- <TD>No</TD>
- <TD>Restarts a printer or class, resuming print jobs as needed.</TD>
+ <TD NOWRAP><TT>Set-Job-Attributes</TT></TD>
+ <TD>Yes</TD>
+ <TD>Changes job options.</TD>
</TR>
<TR>
<TD NOWRAP><TT>Shutdown-Printer</TT></TD>
@@ -349,45 +380,30 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Powers a printer or class on.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Reprocess-Job</TT></TD>
- <TD>No</TD>
- <TD>Reprints a job on a different printer or class; CUPS has the
- CUPS-Move-Job operation instead.</TD>
-</TR>
-<TR>
- <TD NOWRAP><TT>Cancel-Current-Job</TT></TD>
- <TD>No</TD>
- <TD>Cancels the current job on a printer or class.</TD>
-</TR>
-<TR>
<TD NOWRAP><TT>Suspend-Current-Job</TT></TD>
<TD>No</TD>
<TD>Stops the current job on a printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Resume-Job</TT></TD>
+ <TD NOWRAP><TT>Validate-Document</TT></TD>
<TD>No</TD>
- <TD>Resumes printing of a stopped job.</TD>
+ <TD>Validates a document request before sending.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>Promote-Job</TT></TD>
- <TD>No</TD>
- <TD>Prints a job before others.</TD>
-</TR>
-<TR>
- <TD NOWRAP><TT>Schedule-Job-After</TT></TD>
- <TD>No</TD>
- <TD>Prints a job after others.</TD>
+ <TD NOWRAP><TT>Validate-Job</TT></TD>
+ <TD>Yes</TD>
+ <TD>Validates a print request before printing.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Get-Default</TT> *</TD>
+ <TD NOWRAP><TT>CUPS-Accept-Jobs</TT></TD>
<TD>Yes</TD>
- <TD>Gets the server/network default printer or class.</TD>
+ <TD>Sets a printer's or class' printer-is-accepting-jobs
+ attribute to true.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Get-Printers</TT> *</TD>
+ <TD NOWRAP><TT>CUPS-Add-Modify-Class</TT></TD>
<TD>Yes</TD>
- <TD>Gets a list of printers and/or classes.</TD>
+ <TD>Adds or modifies a class.</TD>
</TR>
<TR>
<TD NOWRAP><TT>CUPS-Add-Modify-Printer</TT></TD>
@@ -395,19 +411,9 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Adds or modifies a printer.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Delete-Printer</TT> *</TD>
- <TD>Yes</TD>
- <TD>Removes a printer.</TD>
-</TR>
-<TR>
- <TD NOWRAP><TT>CUPS-Get-Classes</TT> *</TD>
- <TD>Yes</TD>
- <TD>Gets a list of classes.</TD>
-</TR>
-<TR>
- <TD NOWRAP><TT>CUPS-Add-Modify-Class</TT></TD>
+ <TD NOWRAP><TT>CUPS-Authenticate-Job</TT></TD>
<TD>Yes</TD>
- <TD>Adds or modifies a class.</TD>
+ <TD>Authenticates a job for printing.</TD>
</TR>
<TR>
<TD NOWRAP><TT>CUPS-Delete-Class</TT> *</TD>
@@ -415,21 +421,19 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Removes a class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Accept-Jobs</TT></TD>
+ <TD NOWRAP><TT>CUPS-Delete-Printer</TT> *</TD>
<TD>Yes</TD>
- <TD>Sets a printer's or class' printer-is-accepting-jobs
- attribute to true.</TD>
+ <TD>Removes a printer.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Reject-Jobs</TT></TD>
+ <TD NOWRAP><TT>CUPS-Get-Classes</TT> *</TD>
<TD>Yes</TD>
- <TD>Sets a printer's or class' printer-is-accepting-jobs
- attribute to false.</TD>
+ <TD>Gets a list of classes.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Set-Default</TT> *</TD>
+ <TD NOWRAP><TT>CUPS-Get-Default</TT> *</TD>
<TD>Yes</TD>
- <TD>Sets the server/network default printer or class.</TD>
+ <TD>Gets the server/network default printer or class.</TD>
</TR>
<TR>
<TD NOWRAP><TT>CUPS-Get-Devices</TT> *</TD>
@@ -437,24 +441,35 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
<TD>Gets a list of printer devices.</TD>
</TR>
<TR>
+ <TD NOWRAP><TT>CUPS-Get-Document</TT></TD>
+ <TD>Yes</TD>
+ <TD>Retrieves a document file from a job.</TD>
+</TR>
+<TR>
<TD NOWRAP><TT>CUPS-Get-PPDs</TT> *</TD>
<TD>Yes</TD>
<TD>Gets a list of printer drivers or manufacturers.</TD>
</TR>
<TR>
+ <TD NOWRAP><TT>CUPS-Get-Printers</TT> *</TD>
+ <TD>Yes</TD>
+ <TD>Gets a list of printers and/or classes.</TD>
+</TR>
+<TR>
<TD NOWRAP><TT>CUPS-Move-Job</TT></TD>
<TD>Yes</TD>
<TD>Moves a job to a different printer or class.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Authenticate-Job</TT></TD>
+ <TD NOWRAP><TT>CUPS-Reject-Jobs</TT></TD>
<TD>Yes</TD>
- <TD>Authenticates a job for printing.</TD>
+ <TD>Sets a printer's or class' printer-is-accepting-jobs
+ attribute to false.</TD>
</TR>
<TR>
- <TD NOWRAP><TT>CUPS-Get-Document</TT></TD>
+ <TD NOWRAP><TT>CUPS-Set-Default</TT> *</TD>
<TD>Yes</TD>
- <TD>Retrieves a document file from a job.</TD>
+ <TD>Sets the server/network default printer or class.</TD>
</TR>
</TBODY>
</TABLE></DIV>
@@ -477,7 +492,7 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
&lt;/Limit>
</PRE>
-<P>The directives inside the <TT>Limit</TT> subsection can use any of the normal limiting directives: <A HREF="ref-cupsd-conf.html#Allow"><TT>Allow</TT></A>, <A HREF="ref-cupsd-conf.html#AuthType"><TT>AuthType</TT></A>, <A HREF="ref-cupsd-conf.html#Deny"><TT>Deny</TT></A>, <A HREF="ref-cupsd-conf.html#Encryption"><TT>Encryption</TT></A>, <A HREF="ref-cupsd-conf.html#Require"><TT>Require</TT></A>, and <A HREF="ref-cupsd-conf.html#Satisfy"><TT>Satisfy</TT></A>. <A HREF="#TABLE02">Table 2</A> lists some basic "recipes" for different access control rules.</P>
+<P>The directives inside the <TT>Limit</TT> subsection can use any of the normal limiting directives: <A HREF="man-cupsd.conf.html#Allow"><TT>Allow</TT></A>, <A HREF="man-cupsd.conf.html#AuthType"><TT>AuthType</TT></A>, <A HREF="man-cupsd.conf.html#Deny"><TT>Deny</TT></A>, <A HREF="man-cupsd.conf.html#Encryption"><TT>Encryption</TT></A>, <A HREF="man-cupsd.conf.html#Require"><TT>Require</TT></A>, and <A HREF="man-cupsd.conf.html#Satisfy"><TT>Satisfy</TT></A>. <A HREF="#TABLE02">Table 2</A> lists some basic "recipes" for different access control rules.</P>
<DIV CLASS="table"><TABLE WIDTH="80%" SUMMARY="Access Control Recipes">
<CAPTION>Table 2: <A NAME="TABLE02">Access Control Recipes</A></CAPTION>
@@ -584,7 +599,7 @@ Allow from @LOCAL</PRE></TD>
<H2 CLASS="title"><A NAME="SELECT">Using Policies</A></H2>
-<P>Once you have created a policy, you can use it in two ways. The first way is to assign it as the default policy for the system using the <A HREF="ref-cupsd-conf.html#DefaultPolicy"><TT>DefaultPolicy</TT></A> directive in the <VAR>cupsd.conf</VAR> file. For example, add the following line to the <VAR>cupsd.conf</VAR> file to use the "lab999" policy from the previous section:</P>
+<P>Once you have created a policy, you can use it in two ways. The first way is to assign it as the default policy for the system using the <A HREF="man-cupsd.conf.html#DefaultPolicy"><TT>DefaultPolicy</TT></A> directive in the <VAR>cupsd.conf</VAR> file. For example, add the following line to the <VAR>cupsd.conf</VAR> file to use the "lab999" policy from the previous section:</P>
<PRE CLASS="example">
DefaultPolicy lab999
diff --git a/doc/help/postscript-driver.html b/doc/help/postscript-driver.html
index fde5890..1469f45 100644
--- a/doc/help/postscript-driver.html
+++ b/doc/help/postscript-driver.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/ppd-compiler.html b/doc/help/ppd-compiler.html
index 27decdb..729e268 100644
--- a/doc/help/ppd-compiler.html
+++ b/doc/help/ppd-compiler.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/raster-driver.html b/doc/help/raster-driver.html
index 0399f05..8055705 100644
--- a/doc/help/raster-driver.html
+++ b/doc/help/raster-driver.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
diff --git a/doc/help/ref-access_log.html b/doc/help/ref-access_log.html
deleted file mode 100644
index 015ea17..0000000
--- a/doc/help/ref-access_log.html
+++ /dev/null
@@ -1,140 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>access_log</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">access_log</H1>
-
-<P>The <VAR>access_log</VAR> file lists each HTTP resource that
-is accessed by a web browser or client. Each line is in an
-extended version of the so-called "Common Log Format" used by
-many web servers and web reporting tools:</P>
-
-<P CLASS="command">
-
-host group user date-time \"method resource version\" status
-bytes ipp-operation ipp-status<BR>
-
-<BR>
-
-10.0.1.2 - - [01/Dec/2005:21:50:28 +0000] "POST / HTTP/1.1" 200
-317 CUPS-Get-Printers
-successful-ok-ignored-or-substituted-attributes<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
-200 0 - -<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200
-157 CUPS-Get-Printers
-successful-ok-ignored-or-substituted-attributes<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200
-1411 CUPS-Get-Devices -<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
-200 6667 - -<BR>
-
-</P>
-
-<P>The <I>host</I> field will normally only be an IP address
-unless you have enabled the <A
-HREF="ref-cupsd-conf.html#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive in the <VAR>cupsd.conf</VAR> file or if the IP address
-corresponds to your local machine.</P>
-
-<P>The <I>group</I> field always contains "-".</P>
-
-<P>The <I>user</I> field is the authenticated username of the
-requesting user. If no username and password is supplied for the
-request then this field contains "-".</P>
-
-<P>The <I>date-time</I> field is the date and time of the request
-in local time and is in the format:</P>
-
-<P CLASS="command">
-[DD/MON/YYYY:HH:MM:SS +ZZZZ]
-</P>
-
-<P>The <I>method</I> field is the HTTP method used: "GET",
-"OPTIONS", "PUT", or "POST". "GET" requests are used to get files
-from the server, both for the web interface and to get
-configuration and log files. "OPTIONS" requests are used to
-upgrade connections to TLS encryption. "PUT" requests are used to
-upload configuration files. "POST" requests are used for web
-interface forms and IPP requests.</P>
-
-<P>The <I>resource</I> field is the filename of the requested
-resource.</P>
-
-<P>The <I>version</I> field is the HTTP specification version used by the
-client. For CUPS clients this will always be "HTTP/1.1".</P>
-
-<P>The <I>status</I> field contains the HTTP result status of the
-request, as follows:</P>
-
-<UL>
-
- <LI><CODE>200</CODE> - Successful operation.</LI>
-
- <LI><CODE>201</CODE> - File created/modified successfully.</LI>
-
- <LI><CODE>304</CODE> - The requested file has not changed.</LI>
-
- <LI><CODE>400</CODE> - Bad HTTP request; typically this
- means that you have a malicious program trying to access
- your server.</LI>
-
- <LI><CODE>401</CODE> - Unauthorized, authentication
- (username + password) is required.</LI>
-
- <LI><CODE>403</CODE> - Access is forbidden; typically
- this means that a client tried to access a file or
- resource they do not have permission to access.</LI>
-
- <LI><CODE>404</CODE> - The file or resource does not
- exist.</LI>
-
- <LI><CODE>405</CODE> - URL access method is not allowed;
- typically this means you have a web browser using your
- server as a proxy.</LI>
-
- <LI><CODE>413</CODE> - Request too large; typically this
- means that a client tried to print a file larger than the
- <A
- HREF="ref-cupsd-conf.html#MaxRequestSize"><CODE>MaxRequestSize</CODE></A>
- allows.</LI>
-
- <LI><CODE>426</CODE> - Upgrading to TLS-encrypted
- connection.</LI>
-
- <LI><CODE>500</CODE> - Server error; typically this
- happens when the server is unable to open/create a file -
- consult the <VAR>error_log</VAR> file for details.</LI>
-
- <LI><CODE>501</CODE> - The client requested encryption
- but encryption support is not enabled/compiled in.</LI>
-
- <LI><CODE>505</CODE> - HTTP version number not supported;
- typically this means that you have a malicious program
- trying to access your server.</LI>
-
-</UL>
-
-<P>The <I>bytes</I> field contains the number of bytes in the
-request. For POST requests the <I>bytes</I> field contains the
-number of bytes of non-IPP data that is received from the
-client.</P>
-
-<P>The <I>ipp-operation</I> field contains either "-" for non-IPP
-requests or the IPP operation name for POST requests containing
-an IPP request.</P>
-
-<P>The <I>ipp-status</I> field contains either "-" for non-IPP
-requests or the IPP status code name for POST requests containing
-an IPP response.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-classes-conf.html b/doc/help/ref-classes-conf.html
deleted file mode 100644
index 4171bb2..0000000
--- a/doc/help/ref-classes-conf.html
+++ /dev/null
@@ -1,565 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>classes.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">classes.conf</H1>
-
-<P>The CUPS scheduler (cupsd) uses the
-<VAR>/etc/cups/classes.conf</VAR> file to store the list of
-available classes. This file contains only locally defined
-classes, not remote classes that are created automatically via
-browsing. 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>While the class configuration file consists of plain text and
-can be modified using your favorite text editor, you should
-normally use the <A HREF="man-lpadmin.html">lpadmin(8)</A>
-command, web interface, or any of the available GUIs to manage
-your classes instead. If you do choose to edit this file
-manually, you will need to stop the scheduler first, make your
-changes, and then start the scheduler to make them active.</P>
-
-
-<H2 CLASS="title"><A NAME="Accepting">Accepting</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- Accepting yes
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Accepting</CODE> directive defines the initial state
-of the <VAR>printer-is-accepting-jobs</VAR> attribute. This state
-is also set by the <CODE>accept(8)</CODE> and
-<CODE>reject(8)</CODE> commands:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/accept classname
-/usr/sbin/reject classname</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="AllowUser">AllowUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- AllowUser foo_user
- AllowUser @bar_group
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AllowUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-allowed</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -u allow:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#DenyUser"><CODE>DenyUser</CODE></A>.</P>
-
-
-<H2 CLASS="title"><A NAME="Class">Class</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Class</CODE> directive begins a class definition.
-Classes are added using the <CODE>lpadmin(8)</CODE> command:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -c classname</KBD>
-</PRE>
-
-
-<H2 CLASS="title"><A NAME="DefaultClass">DefaultClass</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;DefaultClass name&gt;
- ...
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultClass</CODE> directive begins a class
-definition as the default server destination. The default server
-destination can be set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -d classname</KBD>
-</PRE>
-
-<P>Note that the server default destination settings can be
-overridden by the user's default destination settings which are
-normally set using the <CODE>lpoptions(1)</CODE> command.</P>
-
-
-<H2 CLASS="title"><A NAME="DenyUser">DenyUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- DenyUser foo_user
- DenyUser @bar_group
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DenyUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-denied</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -u deny:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#AllowUser"><CODE>AllowUser</CODE></A></P>
-
-
-<H2 CLASS="title"><A NAME="Info">Info</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- Info My Class
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Info</CODE> directive defines the string for the
-<VAR>printer-info</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -D "My Class"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="JobSheets">JobSheets</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- JobSheets none,standard
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobSheets</CODE> directive specifies the default
-banner pages to print before and after a print job. In the above
-example, only a <VAR>standard</VAR> banner will print after each
-job. The <CODE>lpadmin(8)</CODE> command is normally used to set
-the default banners:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-sheets-default=none,standard</KBD>
-</PRE>
-
-<P>If only one banner file is specified, it will be printed
-before the files in the job. If a second banner file is
-specified, it is printed after the files in the job.</P>
-
-<P>The available banner pages depend on the local system
-configuration; CUPS includes the following standard banner
-files:</P>
-
-<UL>
-
- <LI><CODE>none</CODE> - Do not produce a banner
- page.</LI>
-
- <LI><CODE>classified</CODE> - A banner page with a
- &quot;classified&quot; label at the top and bottom.</LI>
-
- <LI><CODE>confidential</CODE> - A banner page with a
- &quot;confidential&quot; label at the top and bottom.</LI>
-
- <LI><CODE>secret</CODE> - A banner page with a
- &quot;secret&quot; label at the top and bottom.</LI>
-
- <LI><CODE>standard</CODE> - A banner page with no label
- at the top and bottom.</LI>
-
- <LI><CODE>topsecret</CODE> - A banner page with a
- &quot;top secret&quot; label at the top and bottom.</LI>
-
- <LI><CODE>unclassified</CODE> - A banner page with an
- &quot;unclassified&quot; label at the top and bottom.</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="KLimit">KLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- KLimit 1234
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KLimit</CODE> directive defines the value of the
-<VAR>job-k-limit</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-k-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Location">Location</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- Location Building 3321
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Location</CODE> directive defines the string for the
-<VAR>printer-location</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -L "Building 3321"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="OpPolicy">OpPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- OpPolicy default
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>OpPolicy</CODE> directive sets the operation policy
-that is used for the printer. The <CODE>lpadmin(8)</CODE> command
-sets the current operation policy:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o printer-op-policy=default</KBD>
-</PRE>
-
-<P>The default policy is named "default". All policies correspond
-to those defined using the <VAR>cupsd.conf</VAR> <A
-HREF="ref-cupsd-conf.html#Policy"><CODE>Policy</CODE></A>
-section.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Option">Option</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- Option name value
- Option scaling 100
- Option page-left 72
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Option</CODE> directive specifies a default job
-template attribute value. It is mapped to
-<CODE>name-default</CODE> in the printer attributes and applied
-to jobs as <CODE>name</CODE>.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLimit">PageLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- PageLimit 1234
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLimit</CODE> directive defines the value of the
-<VAR>job-page-limit</VAR> attribute. It can be set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-page-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Printer">Printer</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- Printer foo
- Printer bar
- Printer bleep
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Printer</CODE> directive adds a printer to a class.
-Printers are added to a class using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -c classname</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="QuotaPeriod">QuotaPeriod</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- QuotaPeriod 604800
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>QuotaPeriod</CODE> directive defines the value of
-the <VAR>job-quota-period</VAR> attribute. Typical values are
-86400 (1 day), 604800 (1 week), 2592000 (1 month), and 31536000
-(1 year). It is set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-quota-period=604800</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Shared">Shared</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- Shared yes
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Shared</CODE> directive defines the initial value of
-the <VAR>printer-is-shared</VAR> attribute. The strings
-<VAR>yes</VAR> and <VAR>no</VAR> correspond to the true and false
-values, respectively. The <CODE>lpadmin(8)</CODE> command sets
-the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o printer-is-shared=true</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="State">State</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- State idle
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>State</CODE> directive defines the initial value of
-the <VAR>printer-state</VAR> attribute. The strings
-<VAR>idle</VAR> and <VAR>stopped</VAR> correspond to the IPP
-enumeration values 3 and 5, respectively. The
-<CODE>cupsenable(8)</CODE> and <CODE>cupsdisable(8)</CODE>
-commands set the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/cupsenable classname</KBD>
-<KBD>/usr/sbin/cupsdisable classname</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="StateMessage">StateMessage</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- StateMessage Class is lonely.
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateMessage</CODE> directive defines the initial
-string for the <VAR>printer-state-message</VAR> attribute. The
-following are some example messages:</P>
-
-<PRE CLASS="command">
-StateMessage Connected to host_name...
-StateMessage Connecting to printer_queue on port port_number...
-StateMessage Network host host_name is busy; will retry in 30 seconds...
-StateMessage Class busy; will retry in 10 seconds...
-StateMessage Class is busy; retrying print job...
-StateMessage Print file accepted - job ID id_number.
-StateMessage Waiting for job to complete
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="StateTime">StateTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
- ...
- StateTime 1133542425
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateTime</CODE> directive defines the UNIX time
-(seconds since Jan 1, 1970) for the last state change of the
-queue. It is mapped to the <VAR>printer-state-change-time</VAR>
-attribute.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-client-conf.html b/doc/help/ref-client-conf.html
deleted file mode 100644
index 03d1ea0..0000000
--- a/doc/help/ref-client-conf.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>client.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">client.conf</H1>
-
-<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>
-
-<H2 CLASS="title"><A NAME="Encryption">Encryption</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Encryption Never
-Encryption IfRequested
-Encryption Required
-Encryption Always
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Encryption</CODE> directive specifies the default
-encryption settings for the client.</P>
-
-<P>The default setting is <VAR>IfRequested</VAR>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="GSSServiceName">GSSServiceName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-GSSServiceName http
-GSSServiceName ipp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>GSSServiceName</CODE> directive sets the Kerberos service name to use. The default is <CODE>http</CODE> for compatibility with Microsoft Windows.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerName">ServerName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerName foo.bar.com
-ServerName 11.22.33.44
-ServerName foo.bar.com:8631
-<SPAN CLASS="info">CUPS 1.6</SPAN>ServerName foo.bar.com/version=1.1
-<SPAN CLASS="info">CUPS 1.6</SPAN>ServerName foo.bar.com:8631/version=1.1
-</PRE>
-
-<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>
-
-<P>The default port number is 631 but can be overridden by adding a colon followed by the desired port number to the value.</P>
-
-<P>By default, CUPS 1.6 and later use IPP/2.0 to communicate with the server. Add "/version=1.1" to force IPP/1.1 which is required for CUPS 1.3.12 and earlier.</P>
-
-<P>The default is to use the local server ("<VAR>localhost</VAR>") or domain socket, if so configured.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-<P>Only one <CODE>ServerName</CODE> directive may appear. If multiple names are
-present, only the last one is used. This directive is not supported on OS X 10.7 or later.</P>
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="User">User</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-User joe
-User bob
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>User</CODE> directive sets the user name to use. The default is the username associated with the current login.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-cups-files-conf.html.in b/doc/help/ref-cups-files-conf.html.in
deleted file mode 100644
index 07049d9..0000000
--- a/doc/help/ref-cups-files-conf.html.in
+++ /dev/null
@@ -1,538 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>cups-files.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">cups-files.conf</H1>
-
-<P>The <VAR>/etc/cups/cups-files.conf</VAR> file contains configuration <I>directives</I> that control the files, directories. users. and groups that are used by the CUPS scheduler, <CODE>cupsd(8)</CODE>. 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>
-
-<H2 CLASS="title"><A NAME="AccessLog">AccessLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-AccessLog /var/log/cups/access_log
-AccessLog /var/log/cups/access_log-%s
-AccessLog syslog
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AccessLog</CODE> directive sets the name of the
-access log file. If the filename is not absolute then it is
-assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-access log file is stored in "common log format" and can be used
-by any web access reporting tool to generate a report on CUPS
-server activity.</P>
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.</P>
-
-<P>The special name "syslog" can be used to send the access
-information to the system log instead of a plain file.</P>
-
-<P>The default access log file is
-<VAR>@CUPS_LOGDIR@/access_log</VAR>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.15</SPAN><A NAME="ConfigFilePerm">ConfigFilePerm</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ConfigFilePerm 0644
-ConfigFilePerm 0640
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ConfigFilePerm</CODE> directive specifies the permissions to use when the scheduler writes configuration and cache files, typically in response to IPP or HTTP requests. The default is @CUPS_CONFIG_FILE_PERM@.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The permissions for the <VAR>printers.conf</VAR> file are always masked to only allow access from the scheduler user (typically root). This is done because printer device URIs sometimes contain sensitive authentication information that should not be generally known on the system. There is no way to disable this security feature.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="DataDir">DataDir</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DataDir /usr/share/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DataDir</CODE> directive sets the directory to use
-for data files.</P>
-
-
-<H2 CLASS="title"><A NAME="DocumentRoot">DocumentRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DocumentRoot /usr/share/doc/cups
-DocumentRoot /foo/bar/doc/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DocumentRoot</CODE> directive specifies the location
-of web content for the HTTP server in CUPS. If an absolute path
-is not specified then it is assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default directory is <VAR>@CUPS_DOCROOT@</VAR>.</P>
-
-<P>Documents are first looked up in a sub-directory for the
-primary language requested by the client (e.g.
-<VAR>@CUPS_DOCROOT@/fr/...</VAR>) and then directly under
-the <CODE>DocumentRoot</CODE> directory (e.g.
-<VAR>@CUPS_DOCROOT@/...</VAR>), so it is possible to
-localize the web content by providing subdirectories for each
-language needed.</P>
-
-
-<H2 CLASS="title"><A NAME="ErrorLog">ErrorLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ErrorLog /var/log/cups/error_log
-ErrorLog /var/log/cups/error_log-%s
-ErrorLog syslog
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ErrorLog</CODE> directive sets the name of the error
-log file. If the filename is not absolute then it is assumed to
-be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default error log file is <VAR>@CUPS_LOGDIR@/error_log</VAR>.</P>
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.</P>
-
-<P>The special name "syslog" can be used to send the error
-information to the system log instead of a plain file.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="FatalErrors">FatalErrors</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FatalErrors none
-FatalErrors all
-FatalErrors browse
-FatalErrors config
-FatalErrors listen
-FatalErrors log
-FatalErrors permissions
-FatalErrors all -permissions
-FatalErrors config permissions log
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FatalErrors</CODE> directive determines whether certain kinds of
-errors are fatal. The following kinds of errors are currently recognized:</P>
-
-<UL>
-
- <LI><CODE>none</CODE> - No errors are fatal</LI>
-
- <LI><CODE>all</CODE> - All of the errors below are fatal</LI>
-
- <LI><CODE>browse</CODE> - Browsing initialization errors are fatal,
- for example failed binding to the CUPS browse port or failed connections
- to LDAP servers</LI>
-
- <LI><CODE>config</CODE> - Configuration file syntax errors are
- fatal</LI>
-
- <LI><CODE>listen</CODE> - Listen or Port errors are fatal, except for
- IPv6 failures on the loopback or "any" addresses</LI>
-
- <LI><CODE>log</CODE> - Log file creation or write errors are fatal</LI>
-
- <LI><CODE>permissions</CODE> - Bad startup file permissions are
- fatal, for example shared SSL certificate and key files with world-
- read permissions</LI>
-
-</UL>
-
-<P>Multiple errors can be listed, and the form "-kind" can be used with
-<CODE>all</CODE> to remove specific kinds of errors. The default setting is
-<CODE>@CUPS_FATAL_ERRORS@</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.18</SPAN><A NAME="FileDevice">FileDevice</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FileDevice Yes
-FileDevice No
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FileDevice</CODE> directive determines whether the
-scheduler allows new printers to be added using device URIs of
-the form <CODE>file:/filename</CODE>. File devices are most often
-used to test new printer drivers and do not support raw file
-printing.</P>
-
-<P>The default setting is <CODE>No</CODE>.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>File devices are managed by the scheduler. Since the
-scheduler normally runs as the root user, file devices
-can be used to overwrite system files and potentially
-gain unauthorized access to the system. If you must
-create printers using file devices, we recommend that
-you set the <CODE>FileDevice</CODE> directive to
-<CODE>Yes</CODE> for only as long as you need to add the
-printers to the system, and then reset the directive to
-<CODE>No</CODE>.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.3</SPAN><A NAME="FontPath">FontPath</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FontPath /foo/bar/fonts
-FontPath /usr/share/cups/fonts:/foo/bar/fonts
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FontPath</CODE> directive specifies the font path to
-use when searching for fonts. The default font path is
-<CODE>/usr/share/cups/fonts</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Group">Group</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Group lp
-Group nobody
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Group</CODE> directive specifies the UNIX group that
-filter and CGI programs run as. The default group is
-system-specific but is usually <CODE>lp</CODE> or
-<CODE>nobody</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.15</SPAN><A NAME="LogFilePerm">LogFilePerm</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogFilePerm 0644
-LogFilePerm 0600
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LogFilePerm</CODE> directive specifies the
-permissions to use when writing log files. The default
-is @CUPS_LOG_FILE_PERM@.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLog">PageLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PageLog /var/log/cups/page_log
-PageLog /var/log/cups/page_log-%s
-PageLog syslog
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLog</CODE> directive sets the name of the page
-log file. If the filename is not absolute then it is assumed to
-be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default page log file is <VAR>@CUPS_LOGDIR@/page_log</VAR>.</P>
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.</P>
-
-<P>The special name "syslog" can be used to send the page
-information to the system log instead of a plain file.</P>
-
-
-<H2 CLASS="title"><A NAME="Printcap">Printcap</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Printcap
-Printcap /etc/printcap
-Printcap /etc/printers.conf
-Printcap /Library/Preferences/org.cups.printers.plist
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Printcap</CODE> directive controls whether or not a
-printcap file is automatically generated and updated with a list
-of available printers. If specified with no value, then no
-printcap file will be generated. The default is to generate a
-file named <VAR>@CUPS_DEFAULT_PRINTCAP@</VAR>.</P>
-
-<P>When a filename is specified (e.g. <VAR>@CUPS_DEFAULT_PRINTCAP@</VAR>),
-the printcap file is written whenever a printer is added or
-removed. The printcap file can then be used by applications that
-are hardcoded to look at the printcap file for the available
-printers.</P>
-
-
-<H2 CLASS="title"><A NAME="PrintcapFormat">PrintcapFormat</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PrintcapFormat BSD
-PrintcapFormat Solaris
-PrintcapFormat plist
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PrintcapFormat</CODE> directive controls the output format of the
-printcap file. The default is to generate the plist format on OS X, the
-Solaris format on Solaris, and the BSD format on other operating systems.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.3</SPAN><A NAME="RemoteRoot">RemoteRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RemoteRoot remroot
-RemoteRoot root
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RemoteRoot</CODE> directive sets the username for
-unauthenticated root requests from remote hosts. The default
-username is <VAR>remroot</VAR>. Setting <CODE>RemoteRoot</CODE>
-to <VAR>root</VAR> effectively disables this security
-mechanism.</P>
-
-
-<H2 CLASS="title"><A NAME="RequestRoot">RequestRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RequestRoot /var/spool/cups
-RequestRoot /foo/bar/spool/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RequestRoot</CODE> directive sets the directory for
-incoming IPP requests and HTML forms. If an absolute path is not
-provided then it is assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default request directory is <VAR>@CUPS_REQUESTS@</VAR>.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerBin">ServerBin</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerBin /usr/lib/cups
-ServerBin /foo/bar/lib/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerBin</CODE> directive sets the directory for
-server-run executables. If an absolute path is not provided then
-it is assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default executable directory is <VAR>/usr/lib/cups</VAR>,
-<VAR>/usr/lib32/cups</VAR>, or <VAR>/usr/libexec/cups</VAR>
-depending on the operating system.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerCertificate">ServerCertificate</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerCertificate /etc/cups/ssl/server.crt
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerCertificate</CODE> directive specifies the
-location of the SSL certificate file used by the server when
-negotiating encrypted connections. The certificate must not be
-encrypted (password protected) since the scheduler normally runs
-in the background and will be unable to ask for a password.</P>
-
-<P>The default certificate file is
-<VAR>/etc/cups/ssl/server.crt</VAR>.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerKey">ServerKey</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerKey /etc/cups/ssl/server.key
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerKey</CODE> directive specifies the location of
-the SSL private key file used by the server when negotiating
-encrypted connections.</P>
-
-<P>The default key file is
-<VAR>/etc/cups/ssl/server.crt</VAR>.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerRoot">ServerRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerRoot /etc/cups
-ServerRoot /foo/bar/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerRoot</CODE> directive specifies the absolute
-path to the server configuration and state files. It is also used
-to resolve relative paths in the <VAR>cupsd.conf</VAR> file. The
-default server directory is <VAR>/etc/cups</VAR>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6.4</SPAN><A NAME="SyncOnClose">SyncOnClose</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SyncOnClose No
-SyncOnClose Yes
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SyncOnClose</CODE> directive determines whether the scheduler
-flushes changes to configuration and state files to disk. The default is
-<CODE>No</CODE> which relies on the operating system to schedule a suitable
-time to write changes to disk.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>Setting <CODE>SyncOnClose</CODE> to <CODE>Yes</CODE> makes the scheduler use the <CODE>fsync(2)</CODE> system call to write all changes to disk, however the drive or network file system server may still delay writing data to disk. Do not depend on this functionality to prevent data loss in the event of unexpected hardware failure.</P>
-
-<P>Enabling <CODE>SyncOnClose</CODE> may also cause the scheduler to periodically become unresponsive while it waits for changes to be written.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="SystemGroup">SystemGroup</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SystemGroup lpadmin
-SystemGroup sys
-SystemGroup system
-SystemGroup root
-SystemGroup root lpadmin
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SystemGroup</CODE> directive specifies the system
-administration group for <CODE>System</CODE> authentication.
-Multiple groups can be listed, separated with spaces. The default
-group list is <CODE>@CUPS_SYSTEM_GROUPS@</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="TempDir">TempDir</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-TempDir /var/tmp
-TempDir /foo/bar/tmp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>TempDir</CODE> directive specifies an absolute path
-for the directory to use for temporary files. The default
-directory is <VAR>@CUPS_REQUESTS@/tmp</VAR>.</P>
-
-<P>Temporary directories must be world-writable and should have
-the "sticky" permission bit enabled so that other users cannot
-delete filter temporary files. The following commands will create
-an appropriate temporary directory called
-<VAR>/foo/bar/tmp</VAR>:</P>
-
-<PRE CLASS="command">
-<KBD>mkdir /foo/bar/tmp</KBD>
-<KBD>chmod a+rwxt /foo/bar/tmp</KBD>
-</PRE>
-
-
-<H2 CLASS="title"><A NAME="User">User</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-User lp
-User guest
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>User</CODE> directive specifies the UNIX user that
-filter and CGI programs run as. The default user is
-<CODE>@CUPS_USER@</CODE>.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>You may not use user <CODE>root</CODE>, as that would expose
-the system to unacceptable security risks. The scheduler will
-automatically choose user <CODE>nobody</CODE> if you specify a
-user whose ID is 0.</P>
-
-</BLOCKQUOTE>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-cupsd-conf.html.in b/doc/help/ref-cupsd-conf.html.in
deleted file mode 100644
index 989765d..0000000
--- a/doc/help/ref-cupsd-conf.html.in
+++ /dev/null
@@ -1,2162 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>cupsd.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">cupsd.conf</H1>
-
-<P>The <VAR>/etc/cups/cupsd.conf</VAR> file contains
-configuration <I>directives</I> that control how the server
-functions. Each directive is listed on a line by itself followed
-by its value. Comments are introduced using the number sign ("#")
-character at the beginning of a line.</P>
-
-<P>Since the server configuration file consists of plain text,
-you can use your favorite text editor to make changes to it.
-After making any changes, restart the <CODE>cupsd(8)</CODE>
-process using the startup script for your operating system:</P>
-
-<UL>
-
- <LI>AIX, IRIX, Linux, Solaris:
- <PRE CLASS="command">
-/etc/init.d/cups restart
- </PRE></LI>
-
- <LI>HP-UX:
- <PRE CLASS="command">
-/sbin/init.d/cups restart
- </PRE></LI>
-
- <LI>MacOS X:
- <PRE CLASS="command">
-sudo launchctl unload /System/Library/LaunchDaemons/org.cups.cupsd.plist
-sudo launchctl load /System/Library/LaunchDaemons/org.cups.cupsd.plist
- </PRE></LI>
-
-</UL>
-
-<P>You can also edit this file from the CUPS web interface, which
-automatically handles restarting the scheduler.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The specification of time units ("w" for weeks, "h" for hours, etc.) in the various time interval directives is new in CUPS 1.6/OS X 10.8. Prior releases of CUPS only supported time intervals in seconds.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="AccessLogLevel">AccessLogLevel</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-AccessLogLevel config
-AccessLogLevel actions
-AccessLogLevel all
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AccessLogLevel</CODE> directive controls which requests are logged
-to the access log file. The following levels are defined:</P>
-
-<UL>
-
- <LI><CODE>config</CODE>; Log when printers and classes are added,
- deleted, or modified and when configuration files are accessed or
- updated.</LI>
-
- <LI><CODE>actions</CODE>; Log when print jobs are submitted,
- held, released, modified, or canceled, and any of the conditions
- for <CODE>config</CODE>.</LI>
-
- <LI><CODE>all</CODE>; Log all requests.</LI>
-
-</UL>
-
-<P>The default access log level is <CODE>@CUPS_ACCESS_LOG_LEVEL@</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Allow">Allow</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ...
- Allow from All
- Allow from None
- Allow from *.example.com
- Allow from .example.com
- Allow from host.example.com
- Allow from nnn.*
- Allow from nnn.nnn.*
- Allow from nnn.nnn.nnn.*
- Allow from nnn.nnn.nnn.nnn
- Allow from nnn.nnn.nnn.nnn/mm
- Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
- Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
- Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
- Allow from @LOCAL
- Allow from @IF(name)
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Allow</CODE> directive specifies a hostname, IP
-address, or network that is allowed access to the server.
-<CODE>Allow</CODE> directives are cumulative, so multiple
-<CODE>Allow</CODE> directives can be used to allow access for
-multiple hosts or networks.</P>
-
-<P>Host and domain name matching require that you enable the <A
-HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive.</P>
-
-<P>The <CODE>/mm</CODE> notation specifies a CIDR netmask, as shown in
-<A HREF="#TABLE1">Table 1</A>.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="CIDR Netmasks">
-<CAPTION>Table 1: <A NAME="TABLE1">CIDR Netmasks</A></CAPTION>
-<TR>
- <TH WIDTH="10%">mm</TH>
- <TH WIDTH="20%">netmask</TH>
- <TH WIDTH="10%">mm</TH>
- <TH WIDTH="20%">netmask</TH>
-</TR>
-<TR>
- <TD ALIGN="CENTER">0</TD>
- <TD ALIGN="CENTER">0.0.0.0</TD>
- <TD ALIGN="CENTER">8</TD>
- <TD ALIGN="CENTER">255.0.0.0</TD>
-</TR>
-<TR>
- <TD ALIGN="CENTER">1</TD>
- <TD ALIGN="CENTER">128.0.0.0</TD>
- <TD ALIGN="CENTER">16</TD>
- <TD ALIGN="CENTER">255.255.0.0</TD>
-</TR>
-<TR>
- <TD ALIGN="CENTER">2</TD>
- <TD ALIGN="CENTER">192.0.0.0</TD>
- <TD ALIGN="CENTER">24</TD>
- <TD ALIGN="CENTER">255.255.255.0</TD>
-</TR>
-<TR>
- <TD ALIGN="CENTER">...</TD>
- <TD ALIGN="CENTER">...</TD>
- <TD ALIGN="CENTER">32</TD>
- <TD ALIGN="CENTER">255.255.255.255</TD>
-</TR>
-</TABLE></DIV>
-
-<P>The <CODE>@LOCAL</CODE> name will allow access from all local
-interfaces. The <CODE>@IF(name)</CODE> name will allow access
-from the named interface. In both cases, CUPS only allows access
-from the network that the interface(s) are configured for -
-requests arriving on the interface from a foreign network will
-<em>not</em> be accepted.</P>
-
-<P>The <CODE>Allow</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="AuthType">AuthType</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ...
- AuthType None
- AuthType Basic
- AuthType Digest
- AuthType BasicDigest
- AuthType Negotiate
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AuthType</CODE> directive defines the type of
-authentication to perform:</P>
-
-<UL>
-
- <LI><CODE>None</CODE> - No authentication should be
- performed (default)</LI>
-
- <LI><CODE>Basic</CODE> - Basic authentication should be
- performed using the UNIX password and group files</LI>
-
- <LI><CODE>Digest</CODE> - Digest authentication should be
- performed using the <VAR>/etc/cups/passwd.md5</VAR>
- file</LI>
-
- <LI><CODE>BasicDigest</CODE> - Basic authentication
- should be performed using the
- <VAR>/etc/cups/passwd.md5</VAR> file</LI>
-
- <LI><CODE>Negotiate</CODE> - Kerberos authentication
- should be performed</LI>
-
-</UL>
-
-<P>When using <CODE>Basic</CODE>, <CODE>Digest</CODE>,
-<CODE>BasicDigest</CODE>, or <CODE>Negotiate</CODE> authentication,
-clients connecting through the <CODE>localhost</CODE> interface can
-also authenticate using certificates.</P>
-
-<P>The <CODE>AuthType</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="AutoPurgeJobs">AutoPurgeJobs</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-AutoPurgeJobs Yes
-AutoPurgeJobs No
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AutoPurgeJobs</CODE> directive specifies whether or
-not to purge completed jobs once they are no longer required for
-quotas. This option has no effect if quotas are not enabled. The
-default setting is <CODE>No</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="BrowseLocalProtocols">BrowseLocalProtocols</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-BrowseLocalProtocols all
-BrowseLocalProtocols none
-BrowseLocalProtocols dnssd
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>BrowseLocalProtocols</CODE> directive specifies the
-protocols to use when advertising local shared printers on the
-network. Multiple protocols can be specified by separating them
-with spaces. The default is "<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE>".</P>
-
-
-<H2 CLASS="title"><A NAME="BrowseWebIF">BrowseWebIF</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-BrowseWebIF On
-BrowseWebIF Off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>BrowseWebIF</CODE> directive controls whether the CUPS web
-interface is advertised via DNS-SD. The default setting is
-<CODE>Off</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Browsing">Browsing</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Browsing On
-Browsing Off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Browsing</CODE> directive controls whether or not
-printer sharing is enabled. The default setting is
-<CODE>@CUPS_BROWSING@</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Classification">Classification</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Classification
-Classification classified
-Classification confidential
-Classification secret
-Classification topsecret
-Classification unclassified
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Classification</CODE> directive sets the
-classification level on the server. When this option is set, at
-least one of the banner pages is forced to the classification
-level, and the classification is placed on each page of output.
-The default is no classification level.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.10</SPAN><A NAME="ClassifyOverride">ClassifyOverride</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ClassifyOverride Yes
-ClassifyOverride No
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ClassifyOverride</CODE> directive specifies whether
-users can override the default classification level on the
-server. When the server classification is set, users can change
-the classification using the <CODE>job-sheets</CODE> option and
-can choose to only print one security banner before or after the
-job. If the <CODE>job-sheets</CODE> option is set to
-<CODE>none</CODE> then the server default classification is
-used.</P>
-
-<P>The default is to not allow classification overrides.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultAuthType">DefaultAuthType</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultAuthType Basic
-DefaultAuthType BasicDigest
-DefaultAuthType Digest
-DefaultAuthType Negotiate
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultAuthType</CODE> directive specifies the type
-of authentication to use for IPP operations that require a
-username. The default is <CODE>Basic</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultEncryption">DefaultEncryption</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultEncryption Never
-DefaultEncryption IfRequested
-DefaultEncryption Required
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultEncryption</CODE> directive specifies the
-type of encryption to use when performing authentication. The
-default is <CODE>Required</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="DefaultLanguage">DefaultLanguage</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultLanguage de
-DefaultLanguage en
-DefaultLanguage es
-DefaultLanguage fr
-DefaultLanguage it
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultLanguage</CODE> directive specifies the
-default language to use for client connections. Setting the
-default language also sets the default character set if a
-language localization file exists for it. The default language
-is "en" for English.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="DefaultPaperSize">DefaultPaperSize</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultPaperSize Letter
-DefaultPaperSize A4
-DefaultPaperSize Auto
-DefaultPaperSize None
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultPaperSize</CODE> directive specifies the default paper
-size to use when creating new printers. The default is <CODE>Auto</CODE>
-which uses a paper size appropriate for the system default locale. A value
-of <CODE>None</CODE> tells the scheduler to not set the default paper
-size.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultPolicy">DefaultPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultPolicy default
-DefaultPolicy authenticated
-DefaultPolicy foo
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultPolicy</CODE> directive specifies the default
-policy to use for IPP operation. The default is
-<CODE>default</CODE>. CUPS also includes a policy called
-<CODE>authenticated</CODE> that requires a username and password for printing
-and other job operations.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultShared">DefaultShared</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultShared yes
-DefaultShared no
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultShared</CODE> directive specifies whether
-printers are shared (published) by default. The default is
-<CODE>@CUPS_DEFAULT_SHARED@</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Deny">Deny</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ..
- Deny from All
- Deny from None
- Deny from *.example.com
- Deny from .example.com
- Deny from host.example.com
- Deny from nnn.*
- Deny from nnn.nnn.*
- Deny from nnn.nnn.nnn.*
- Deny from nnn.nnn.nnn.nnn
- Deny from nnn.nnn.nnn.nnn/mm
- Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
- Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
- Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
- Deny from @LOCAL
- Deny from @IF(name)
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Deny</CODE> directive specifies a hostname, IP
-address, or network that is denied access to the server.
-<CODE>Deny</CODE> directives are cumulative, so multiple
-<CODE>Deny</CODE> directives can be used to deny access for
-multiple hosts or networks.</P>
-
-<P>Host and domain name matching require that you enable the <A
-HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive.</P>
-
-<P>The <CODE>/mm</CODE> notation specifies a CIDR netmask, a shown in
-<A HREF="TABLE1">Table 1</A>.</P>
-
-<P>The <CODE>@LOCAL</CODE> name will deny access from all local
-interfaces. The <CODE>@IF(name)</CODE> name will deny access from
-the named interface. In both cases, CUPS only denies access from
-the network that the interface(s) are configured for - requests
-arriving on the interface from a foreign network will
-<em>not</em> be denied.</P>
-
-<P>The <CODE>Deny</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="DirtyCleanInterval">DirtyCleanInterval</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DirtyCleanInterval 1w
-DirtyCleanInterval 1d
-DirtyCleanInterval 1h
-DirtyCleanInterval 1m
-DirtyCleanInterval 30
-DirtyCleanInterval 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DirtyCleanInterval</CODE> directive specifies the amount of time to wait before updating configuration and state files for printers, classes, subscriptions, and jobs in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix). A value of <CODE>0</CODE> causes the update to occur as soon as possible, typically within a few milliseconds.</P>
-
-<P>The default value is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><A NAME="Encryption">Encryption</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ...
- Encryption Never
- Encryption IfRequested
- Encryption Required
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Encryption</CODE> directive must appear instead a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section and specifies the
-encryption settings for that location. The default setting is
-<CODE>IfRequested</CODE> for all locations.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.3/OS X 10.5</SPAN><A NAME="ErrorPolicy">ErrorPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ErrorPolicy abort-job
-ErrorPolicy retry-job
-ErrorPolicy stop-printer
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ErrorPolicy</CODE> directive defines the default policy that
-is used when a backend is unable to send a print job to the
-printer.</P>
-
-<P>The following values are supported:</P>
-
-<UL>
-
- <LI><CODE>abort-job</CODE> - Abort the job and proceed
- with the next job in the queue</LI>
-
- <LI><CODE>retry-job</CODE> - Retry the job after waiting
- for N seconds; the <VAR>cupsd.conf</VAR> <A
- HREF="#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
- directive controls the value of N</LI>
-
- <LI><CODE>retry-this-job</CODE> - Retry the current job immediately
- and indefinitely.</LI>
-
- <LI><CODE>stop-printer</CODE> - Stop the printer and keep
- the job for future printing; this is the default
- value</LI>
-
-</UL>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.3</SPAN><A NAME="FilterLimit">FilterLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FilterLimit 0
-FilterLimit 200
-FilterLimit 1000
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FilterLimit</CODE> directive sets the maximum cost
-of all running job filters. It can be used to limit the number of
-filter programs that are run on a server to minimize disk,
-memory, and CPU resource problems. A limit of 0 disables filter
-limiting.</P>
-
-<P>An average print to a non-PostScript printer needs a filter
-limit of about 200. A PostScript printer needs about half that
-(100). Setting the limit below these thresholds will effectively
-limit the scheduler to printing a single job at any time.</P>
-
-<P>The default limit is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.16</SPAN><A NAME="FilterNice">FilterNice</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FilterNice 0
-FilterNice 10
-FilterNice 19
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FilterNice</CODE> directive sets the <B>nice(1)</B>
-value to assign to filter processes. The nice value ranges from
-0, the highest priority, to 19, the lowest priority. The default
-is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="GSSServiceName">GSSServiceName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-GSSServiceName http
-GSSServiceName ipp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>GSSServiceName</CODE> directive sets the Kerberos service name to use. The default is <CODE>@CUPS_DEFAULT_GSSSERVICE_NAME@</CODE> for compatibility with Microsoft Windows.</P>
-
-
-<H2 CLASS="title"><A NAME="HostNameLookups">HostNameLookups</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-HostNameLookups On
-HostNameLookups Off
-HostNameLookups Double
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>HostNameLookups</CODE> directive controls whether or
-not CUPS looks up the hostname for connecting clients. The
-<CODE>Double</CODE> setting causes CUPS to verify that the
-hostname resolved from the address matches one of the addresses
-returned for that hostname. <CODE>Double</CODE> lookups also
-prevent clients with unregistered addresses from connecting to
-your server.</P>
-
-<P>The default is <CODE>Off</CODE> to avoid the potential server
-performance problems with hostname lookups. Set this option to
-<CODE>On</CODE> or <CODE>Double</CODE> only if absolutely
-required.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.9</SPAN><A NAME="Include">Include</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Include filename
-Include /foo/bar/filename
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Include</CODE> directive includes the named file in
-the <CODE>cupsd.conf</CODE> file. If no leading path is provided,
-the file is assumed to be relative to the <A
-HREF="ref-cups-files-conf.html#ServerRoot"><CODE>ServerRoot</CODE></A> directory.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="JobPrivateAccess">JobPrivateAccess</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobPrivateAccess all
-JobPrivateAccess default
-JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobPrivateAccess</CODE> directive specifies the access list for a
-job's private values. The "default" access list is "@OWNER @SYSTEM". "@ACL" maps
-to the printer's requesting-user-name-allowed or requesting-user-name-denied
-values.</P>
-
-<P>The <CODE>JobPrivateAccess</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="JobPrivateValues">JobPrivateValues</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobPrivateValues all
-JobPrivateValues default
-JobPrivateValues none
-JobPrivateValues attribute-name-1 [ ... attribute-name-N ]
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobPrivateValues</CODE> directive specifies the list of job values
-to make private. The "default" values are "job-name",
-"job-originating-host-name", "job-originating-user-name", and "phone".</P>
-
-<P>The <CODE>JobPrivateValues</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="JobRetryInterval">JobRetryInterval</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobRetryInterval 1w
-JobRetryInterval 1d
-JobRetryInterval 1h
-JobRetryInterval 1m
-JobRetryInterval 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobRetryInterval</CODE> directive specifies the amount of time to wait before retrying a job in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix). This is typically used for fax queues but can also be used with normal print queues whose error policy is <CODE>retry-job</CODE> or <CODE>retry-current-job</CODE>.</P>
-
-<P>The default is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="JobKillDelay">JobKillDelay</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobKillDelay 1w
-JobKillDelay 1d
-JobKillDelay 1h
-JobKillDelay 1m
-JobKillDelay 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobKillDelay</CODE> directive specifies the amount of time to wait before killing the filters and backend associated with a canceled or held job in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="JobRetryLimit">JobRetryLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobRetryLimit 5
-JobRetryLimit 50
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobRetryLimit</CODE> directive specifies the maximum
-number of times the scheduler will try to print a job. This is
-typically used for fax queues but can also be used with normal
-print queues whose error policy is <CODE>retry-job</CODE>. The
-default is 5 times.</P>
-
-
-<H2 CLASS="title"><A NAME="KeepAlive">KeepAlive</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-KeepAlive On
-KeepAlive Off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KeepAlive</CODE> directive controls whether or not
-to support persistent HTTP connections. The default is
-<CODE>On</CODE>.</P>
-
-<P>HTTP/1.1 clients automatically support persistent connections,
-while HTTP/1.0 clients must specifically request them using the
-<CODE>Keep-Alive</CODE> attribute in the <CODE>Connection:</CODE>
-field of each request.</P>
-
-
-<H2 CLASS="title"><A NAME="KeepAliveTimeout">KeepAliveTimeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-KeepAliveTimeout 1w
-KeepAliveTimeout 1d
-KeepAliveTimeout 1h
-KeepAliveTimeout 1m
-KeepAliveTimeout 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KeepAliveTimeout</CODE> directive controls how long a persistent HTTP connection will remain open after the last request in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Limit">Limit (Location)</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- &lt;Limit GET POST&gt;
- ...
- &lt;/Limit&gt;
-
- &lt;Limit ALL&gt;
- ...
- &lt;/Limit&gt;
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Limit</CODE> directive groups access control
-directives for specific types of HTTP requests and must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A> section.
-Access can be limited for individual request types
-(<CODE>DELETE</CODE>, <CODE>GET</CODE>, <CODE>HEAD</CODE>,
-<CODE>OPTIONS</CODE>, <CODE>POST</CODE>, <CODE>PUT</CODE>, and
-<CODE>TRACE</CODE>) or for all request types (<CODE>ALL</CODE>).
-The request type names are case-sensitive for compatibility with
-Apache.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="LimitIPP">Limit (Policy)</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Policy name&gt;
- &lt;Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer&gt;
- ...
- &lt;/Limit&gt;
-
- &lt;Limit All&gt;
- ...
- &lt;/Limit&gt;
-&lt;/Policy&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>When included in <A HREF="#Policy"><CODE>Policy</CODE></A>
-sections, the <CODE>Limit</CODE> directive groups access control
-directives for specific IPP operations. Multiple operations can
-be listed, separated by spaces. Table 2 lists the supported
-operations.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="Supported IPP Operations">
-<CAPTION>Table 2: <A NAME="TABLE2">Supported IPP Operations</A></CAPTION>
-<THEAD>
-<TR>
- <TH>Operation Name</TH>
- <TH>Description</TH>
-</TR>
-</THEAD>
-<TBODY>
-<TR>
- <TD>All</TD>
- <TD>All operations - used as the default limit for
- operations that are not listed</TD>
-</TR>
-<TR>
- <TD>Cancel-Job</TD>
- <TD>Cancel a job</TD>
-</TR>
-<TR>
- <TD>Cancel-Subscription</TD>
- <TD>Cancel a subscription</TD>
-</TR>
-<TR>
- <TD>Create-Job</TD>
- <TD>Create a new, empty job</TD>
-</TR>
-<TR>
- <TD>Create-Job-Subscription</TD>
- <TD>Creates a notification subscription on a job</TD>
-</TR>
-<TR>
- <TD>Create-Printer-Subscription</TD>
- <TD>Creates a notification subscription on a printer</TD>
-</TR>
-<TR>
- <TD>CUPS-Accept-Jobs</TD>
- <TD>Sets the printer-is-accepting-jobs value for a printer to true</TD>
-</TR>
-<TR>
- <TD>CUPS-Add-Modify-Class</TD>
- <TD>Adds or modifies a class</TD>
-</TR>
-<TR>
- <TD>CUPS-Add-Modify-Printer</TD>
- <TD>Adds or modifies a printer</TD>
-</TR>
-<TR>
- <TD>CUPS-Authenticate-Job</TD>
- <TD>Authenticates a job for printing</TD>
-</TR>
-<TR>
- <TD>CUPS-Delete-Class</TD>
- <TD>Deletes a class</TD>
-</TR>
-<TR>
- <TD>CUPS-Delete-Printer</TD>
- <TD>Deletes a printer</TD>
-</TR>
-<TR>
- <TD>CUPS-Get-Classes</TD>
- <TD>Gets a list of classes</TD>
-</TR>
-<TR>
- <TD>CUPS-Get-Default</TD>
- <TD>Gets the (network/server) default printer or class</TD>
-</TR>
-<TR>
- <TD>CUPS-Get-Devices</TD>
- <TD>Gets a list of available devices</TD>
-</TR>
-<TR>
- <TD>CUPS-Get-PPDs</TD>
- <TD>Gets a list of available manufacturers or drivers</TD>
-</TR>
-<TR>
- <TD>CUPS-Get-Printers</TD>
- <TD>Gets a list of printers and/or classes</TD>
-</TR>
-<TR>
- <TD>CUPS-Move-Job</TD>
- <TD>Moves a job to a new destination</TD>
-</TR>
-<TR>
- <TD>CUPS-Reject-Jobs</TD>
- <TD>Sets the printer-is-accepting-jobs value for a printer to false</TD>
-</TR>
-<TR>
- <TD>CUPS-Set-Default</TD>
- <TD>Sets the network/server default printer or class</TD>
-</TR>
-<TR>
- <TD>Disable-Printer</TD>
- <TD>Sets the printer-state value for a printer to stopped</TD>
-</TR>
-<TR>
- <TD>Enable-Printer</TD>
- <TD>Sets the printer-state value for a printer to idle/processing</TD>
-</TR>
-<TR>
- <TD>Get-Job-Attributes</TD>
- <TD>Gets information about a job</TD>
-</TR>
-<TR>
- <TD>Get-Jobs</TD>
- <TD>Gets a list of jobs</TD>
-</TR>
-<TR>
- <TD>Get-Notifications</TD>
- <TD>Gets a list of events</TD>
-</TR>
-<TR>
- <TD>Get-Printer-Attributes</TD>
- <TD>Gets information about a printer or class</TD>
-</TR>
-<TR>
- <TD>Get-Subscription-Attributes</TD>
- <TD>Gets information about a notification subscription</TD>
-</TR>
-<TR>
- <TD>Get-Subscriptions</TD>
- <TD>Gets a list of notification subscriptions</TD>
-</TR>
-<TR>
- <TD>Hold-Job</TD>
- <TD>Holds a job for printing</TD>
-</TR>
-<TR>
- <TD>Pause-Printer</TD>
- <TD>Sets the printer-state value for a printer to stopped</TD>
-</TR>
-<TR>
- <TD>Print-Job</TD>
- <TD>Creates a job with a single file for printing</TD>
-</TR>
-<TR>
- <TD>Purge-Jobs</TD>
- <TD>Removes all jobs from a printer</TD>
-</TR>
-<TR>
- <TD>Release-Job</TD>
- <TD>Releases a previously held job for printing</TD>
-</TR>
-<TR>
- <TD>Renew-Subscription</TD>
- <TD>Renews a notification subscription</TD>
-</TR>
-<TR>
- <TD>Restart-Job</TD>
- <TD>Reprints a job</TD>
-</TR>
-<TR>
- <TD>Resume-Printer</TD>
- <TD>Sets the printer-state value for a printer to idle/processing</TD>
-</TR>
-<TR>
- <TD>Send-Document</TD>
- <TD>Adds a file to an job created with Create-Job</TD>
-</TR>
-<TR>
- <TD>Set-Job-Attributes</TD>
- <TD>Changes job options</TD>
-</TR>
-<TR>
- <TD>Validate-Job</TD>
- <TD>Validates job options prior to printing</TD>
-</TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="LimitExcept">LimitExcept</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- &lt;LimitExcept GET POST&gt;
- ...
- &lt;/LimitExcept&gt;
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LimitExcept</CODE> directive groups access control
-directives for specific types of HTTP requests and must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A> section.
-Unlike the <A HREF="#Limit"><CODE>Limit</CODE></A> directive,
-<CODE>LimitExcept</CODE> restricts access for all requests
-<I>except</I> those listed on the <CODE>LimitExcept</CODE>
-line.</P>
-
-
-<H2 CLASS="title"><A NAME="LimitRequestBody">LimitRequestBody</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LimitRequestBody 10485760
-LimitRequestBody 10m
-LimitRequestBody 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LimitRequestBody</CODE> directive controls the
-maximum size of print files, IPP requests, and HTML form data in
-HTTP POST requests. The default limit is 0 which disables the
-limit check.</P>
-
-
-<H2 CLASS="title"><A NAME="Listen">Listen</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Listen 127.0.0.1:631
-Listen 192.0.2.1:631
-Listen [::1]:631
-Listen *:631
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Listen</CODE> directive specifies a network address
-and port to listen for connections. Multiple <CODE>Listen</CODE>
-directives can be provided to listen on multiple addresses.</P>
-
-<P>The <CODE>Listen</CODE> directive is similar to the <A
-HREF="#Port"><CODE>Port</CODE></A> directive but allows you to
-restrict access to specific interfaces or networks.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="ListenBackLog">ListenBackLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ListenBackLog 5
-ListenBackLog 10
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ListenBackLog</CODE> directive sets the maximum
-number of pending connections the scheduler will allow. This
-normally only affects very busy servers that have reached the <A
-HREF="#MaxClients"><CODE>MaxClients</CODE></A> limit, but can
-also be triggered by large numbers of simultaneous connections.
-When the limit is reached, the operating system will refuse
-additional connections until the scheduler can accept the pending
-ones. The default is the OS-defined default limit, typically
-either 5 for older operating systems or 128 for newer operating
-systems.</P>
-
-
-<H2 CLASS="title"><A NAME="Location">Location</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin/conf&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin/log&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes/name&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /jobs&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers/name&gt;
-...
-&lt;/Location&gt;
-
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Location</CODE> directive specifies access control
-and authentication options for the specified HTTP resource or
-path. The <A HREF="#Allow"><CODE>Allow</CODE></A>, <A
-HREF="#AuthType"><CODE>AuthType</CODE></A>, <A
-HREF="#Deny"><CODE>Deny</CODE></A>, <A
-HREF="#Encryption"><CODE>Encryption</CODE></A>, <A
-HREF="#Limit"><CODE>Limit</CODE></A>, <A
-HREF="#LimitExcept"><CODE>LimitExcept</CODE></A>, <A
-HREF="#Order"><CODE>Order</CODE></A>, <A
-HREF="#Require"><CODE>Require</CODE></A>, and <A
-HREF="#Satisfy"><CODE>Satisfy</CODE></A> directives may all
-appear inside a location.</P>
-
-<P>Note that more specific resources override the less specific
-ones. So the directives inside the <CODE>/printers/name</CODE>
-location will override ones from <CODE>/printers</CODE>.
-Directives inside <CODE>/printers</CODE> will override ones from
-<CODE>/</CODE>. None of the directives are inherited.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="Common Locations on the Server">
-<CAPTION>Table 3: <A NAME="TABLE3">Common Locations on the Server</A></CAPTION>
-<THEAD>
-<TR><TH>Location</TH><TH>Description</TH></TR>
-</THEAD>
-<TBODY>
-<TR><TD><CODE>/</CODE></TD><TD>The path for all get operations (get-printers, get-jobs, etc.)</TD></TR>
-<TR><TD><CODE>/admin</CODE></TD><TD>The path for all administration operations (add-printer, delete-printer, start-printer, etc.)</TD></TR>
-<TR><TD><CODE>/admin/conf</CODE></TD><TD>The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)</TD></TR>
-<TR><TD><CODE>/admin/log</CODE></TD><TD>The path for access to the CUPS log files (access_log, error_log, page_log)</TD></TR>
-<TR><TD><CODE>/classes</CODE></TD><TD>The path for all classes</TD></TR>
-<TR><TD><CODE>/classes/name</CODE></TD><TD>The resource for class <CODE>name</CODE></TD></TR>
-<TR><TD><CODE>/jobs</CODE></TD><TD>The path for all jobs (hold-job, release-job, etc.)</TD></TR>
-<TR><TD><CODE>/jobs/id</CODE></TD><TD>The resource for job <CODE>id</CODE></TD></TR>
-<TR><TD><CODE>/printers</CODE></TD><TD>The path for all printers</TD></TR>
-<TR><TD><CODE>/printers/name</CODE></TD><TD>The path for printer <CODE>name</CODE></TD></TR>
-<TR><TD><CODE>/printers/name.ppd</CODE></TD><TD>The PPD file path for printer <CODE>name</CODE></TD></TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><A NAME="LogDebugHistory">LogDebugHistory</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogDebugHistory 0
-LogDebugHistory 200
-</PRE>
-
-<H3>Description</H3>
-
-<P>When <A HREF="#LogLevel"><CODE>LogLevel</CODE></A> is not set to
-<CODE>debug</CODE> or <CODE>debug2</CODE>, the <CODE>LogDebugHistory</CODE>
-directive specifies the number of debugging messages that are logged when an
-error occurs during printing. The default is 200 messages. A value of 0
-disables debugging history entirely and is not recommended.</P>
-
-
-<H2 CLASS="title"><A NAME="LogLevel">LogLevel</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogLevel none
-LogLevel emerg
-LogLevel alert
-LogLevel crit
-LogLevel error
-LogLevel warn
-LogLevel notice
-LogLevel info
-LogLevel debug
-LogLevel debug2
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LogLevel</CODE> directive specifies the level of
-logging for the <A HREF="ref-cups-files-conf.html#ErrorLog"><CODE>ErrorLog</CODE></A>
-file. The following values are recognized (each level logs
-everything under the preceding levels):</P>
-
-<UL>
-
- <LI><CODE>none</CODE> - Log nothing</LI>
-
- <LI><CODE>emerg</CODE> - Log emergency conditions that
- prevent the server from running</LI>
-
- <LI><CODE>alert</CODE> - Log alerts that must be handled
- immediately</LI>
-
- <LI><CODE>crit</CODE> - Log critical errors that don't
- prevent the server from running</LI>
-
- <LI><CODE>error</CODE> - Log general errors</LI>
-
- <LI><CODE>warn</CODE> - Log errors and warnings</LI>
-
- <LI><CODE>notice</CODE> - Log temporary error conditions</LI>
-
- <LI><CODE>info</CODE> - Log all requests and state
- changes</LI>
-
- <LI><CODE>debug</CODE> - Log basic debugging
- information</LI>
-
- <LI><CODE>debug2</CODE> - Log all debugging
- information</LI>
-
-</UL>
-
-<p>The default <code>LogLevel</code> is <code>@CUPS_LOG_LEVEL@</code>.</p>
-
-
-<H2 CLASS="title"><A NAME="LogTimeFormat">LogTimeFormat</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogTimeFormat standard
-LogTimeFormat usecs
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LogTimeFormat</CODE> directive specifies the format used for the
-date and time in the log files. <CODE>Standard</CODE> uses the standard Apache
-Common Log Format date and time while <CODE>usecs</CODE> adds microseconds.
-The default is <CODE>standard</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="MaxClients">MaxClients</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxClients 100
-MaxClients 1024
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxClients</CODE> directive controls the maximum
-number of simultaneous clients that will be allowed by the
-server. The default is 100 clients.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>Since each print job requires a file descriptor for the status
-pipe, the scheduler internally limits the <CODE>MaxClients</CODE>
-value to 1/3 of the available file descriptors to avoid possible
-problems when printing large numbers of jobs.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.18</SPAN><A NAME="MaxClientsPerHost">MaxClientsPerHost</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxClientsPerHost 10
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxClientsPerHost</CODE> directive controls the
-maximum number of simultaneous clients that will be allowed from
-a single host by the server. The default is the
-<CODE>MaxClients</CODE> value.</P>
-
-<P>This directive provides a small measure of protection against
-Denial of Service attacks from a single host.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.16</SPAN><A NAME="MaxCopies">MaxCopies</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxCopies 100
-MaxCopies 65535
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxCopies</CODE> directive controls the maximum
-number of copies that a user can print of a job. The default is
-@CUPS_MAX_COPIES@ copies.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>Most HP PCL laser printers internally limit the number of
-copies to 100.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="MaxHoldTime">MaxHoldTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxHoldTime 10800
-MaxHoldTime 3h
-MaxHoldTime 180m
-MaxHoldTime 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxHoldTime</CODE> directive controls the maximum number of seconds allowed for a job to remain in the "indefinite" hold state. The job is canceled automatically if it remains held indefinitely longer than the specified time interval in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<p>The default setting is <CODE>0</CODE> which disables this functionality.</P>
-
-
-<H2 CLASS="title"><A NAME="MaxJobs">MaxJobs</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobs 100
-MaxJobs 9999
-MaxJobs 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobs</CODE> directive controls the maximum number
-of jobs that are kept in memory. Once the number of jobs reaches
-the limit, the oldest completed job is automatically purged from
-the system to make room for the new one. If all of the known jobs
-are still pending or active then the new job will be
-rejected.</P>
-
-<P>Setting the maximum size to 0 disables this functionality. The
-default setting is 500.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="MaxJobsPerPrinter">MaxJobsPerPrinter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobsPerPrinter 100
-MaxJobsPerPrinter 9999
-MaxJobsPerPrinter 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobsPerPrinter</CODE> directive controls the
-maximum number of active jobs that are allowed for each printer
-or class. Once a printer or class reaches the limit, new jobs
-will be rejected until one of the active jobs is completed,
-stopped, aborted, or canceled.</P>
-
-<P>Setting the maximum to 0 disables this functionality. The
-default setting is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="MaxJobsPerUser">MaxJobsPerUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobsPerUser 100
-MaxJobsPerUser 9999
-MaxJobsPerUser 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobsPerUser</CODE> directive controls the maximum
-number of active jobs that are allowed for each user. Once a user
-reaches the limit, new jobs will be rejected until one of the
-active jobs is completed, stopped, aborted, or canceled.</P>
-
-<P>Setting the maximum to 0 disables this functionality. The
-default setting is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="MaxJobTime">MaxJobTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobTime 10800
-MaxJobTime 3h
-MaxJobTime 180m
-MaxJobTime 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobTime</CODE> directive controls the maximum number of
-seconds allowed for a job to complete printing before it is considered "stuck".
-The job is canceled automatically if it takes longer than the specified time to complete in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<p>Setting the maximum time to <CODE>0</CODE> disables this functionality. The default setting is <CODE>3h</CODE> (3 hours).</P>
-
-
-<H2 CLASS="title"><A NAME="MaxLogSize">MaxLogSize</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxLogSize 1048576
-MaxLogSize 1m
-MaxLogSize 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxLogSize</CODE> directive controls the maximum
-size of each log file. Once a log file reaches or exceeds the
-maximum size it is closed and renamed to <VAR>filename.O</VAR>.
-This allows you to rotate the logs automatically. The default
-size is 1048576 bytes (1MB).</P>
-
-<P>Setting the maximum size to 0 disables log rotation.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">Deprecated</SPAN><A NAME="MaxRequestSize">MaxRequestSize</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxRequestSize 10485760
-MaxRequestSize 10m
-MaxRequestSize 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxRequestSize</CODE> directive controls the maximum
-size of print files, IPP requests, and HTML form data in HTTP
-POST requests. The default limit is 0 which disables the limit
-check.</P>
-
-<P><B>This directive is deprecated and will be removed in a
-future CUPS release.</B> Use the <A
-HREF="#LimitRequestBody"><CODE>LimitRequestBody</CODE></A>
-directive instead.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="MultipleOperationTimeout">MultipleOperationTimeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MultipleOperationTimeout 1w
-MultipleOperationTimeout 1d
-MultipleOperationTimeout 1h
-MultipleOperationTimeout 5m
-MultipleOperationTimeout 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MultipleOperationTimeout</CODE> directive sets the maximum amount of time between files in a multi-file print job in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default is <CODE>5m</CODE> (five minutes).</P>
-
-
-<H2 CLASS="title"><A NAME="Order">Order</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ...
- Order Allow,Deny
- Order Deny,Allow
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Order</CODE> directive defines the default access
-control. The following values are supported:</P>
-
-<UL>
-
- <LI><CODE>allow,deny</CODE> - Deny requests by default,
- then check the <A HREF="#Allow"><CODE>Allow</CODE></A>
- lines followed by the <A
- HREF="#Deny"><CODE>Deny</CODE></A> lines</LI>
-
- <LI><CODE>deny,allow</CODE> - Allow requests by default,
- then check the <A HREF="#Deny"><CODE>Deny</CODE></A>
- lines followed by the <A
- HREF="#Allow"><CODE>Allow</CODE></A> lines</LI>
-
-</UL>
-
-<P>The <CODE>Order</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLogFormat">PageLogFormat</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PageLogFormat %p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}
-PageLogFormat PAGE %p %u %j %P %C %{job-billing} %{job-originating-host-name}
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLogFormat</CODE> directive sets the format of lines
-that are logged to the page log file. Sequences beginning with percent (%)
-characters are replaced with the corresponding information, while all other
-characters are copied literally. The following percent sequences are
-recognized:</P>
-
-<UL>
-
- <LI><CODE>%%</CODE>: Inserts a single percent character.</LI>
-
- <LI><CODE>%{name}</CODE>: Inserts the value of the specified IPP
- attribute.</LI>
-
- <LI><CODE>%C</CODE>: Inserts the number of copies for the current page.</LI>
-
- <LI><CODE>%P</CODE>: Inserts the current page number.</LI>
-
- <LI><CODE>%T</CODE>: Inserts the current date and time in common log
- format.</LI>
-
- <LI><CODE>%j</CODE>: Inserts the job ID.</LI>
-
- <LI><CODE>%p</CODE>: Inserts the printer name.</LI>
-
- <LI><CODE>%u</CODE>: Inserts the username.</LI>
-
-</UL>
-
-<P>The default is "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}".</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="PassEnv">PassEnv</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PassEnv MY_ENV_VARIABLE
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PassEnv</CODE> directive specifies an environment
-variable that should be passed to child processes. Normally, the
-scheduler only passes the <CODE>DYLD_LIBRARY_PATH</CODE>,
-<CODE>LD_ASSUME_KERNEL</CODE>, <CODE>LD_LIBRARY_PATH</CODE>,
-<CODE>LD_PRELOAD</CODE>, <CODE>NLSPATH</CODE>,
-<CODE>SHLIB_PATH</CODE>, <CODE>TZ</CODE>, and <CODE>VGARGS</CODE>
-environment variables to child processes.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="Policy">Policy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Policy name&gt;
- &lt;Limit operation ... operation&gt;
- ...
- &lt;/Limit&gt;
- &lt;Limit operation ... operation&gt;
- ...
- &lt;/Limit&gt;
- &lt;Limit All&gt;
- ...
- &lt;/Limit&gt;
-&lt;/Policy&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Policy</CODE> directive specifies IPP operation
-access control limits. Each policy contains 1 or more <A
-HREF="#LimitIPP"><CODE>Limit</CODE></A> sections to set the
-access control limits for specific operations - user limits,
-authentication, encryption, and allowed/denied addresses,
-domains, or hosts. The <CODE>&lt;Limit All&gt;</CODE> section
-specifies the default access control limits for operations that
-are not listed.</P>
-
-<P>Policies are named and associated with printers via the
-printer's operation policy setting
-(<CODE>printer-op-policy</CODE>). The default policy for the
-scheduler is specified using the <A
-HREF="#DefaultPolicy"><CODE>DefaultPolicy</CODE></A>
-directive.</P>
-
-
-<H2 CLASS="title"><A NAME="Port">Port</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Port 631
-Port 80
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Port</CODE> directive specifies a port to listen on.
-Multiple <CODE>Port</CODE> lines can be specified to listen on
-multiple ports. The <CODE>Port</CODE> directive is equivalent to
-"<CODE>Listen *:nnn</CODE>". The default port is 631.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>On systems that support IPv6, this directive will bind to both
-the IPv4 and IPv6 wildcard address.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="PreserveJobHistory">PreserveJobHistory</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PreserveJobHistory On
-PreserveJobHistory Off
-PreserveJobHistory 1w
-PreserveJobHistory 7d
-PreserveJobHistory 168h
-PreserveJobHistory 10080m
-PreserveJobHistory 604800
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PreserveJobHistory</CODE> directive controls whether the history of completed, canceled, or aborted print jobs is retained by the scheduler. A value of <CODE>On</CODE> preserves job information until the administrator purges it with the <CODE>cancel</CODE> command. A value of <CODE>Off</CODE> removes the job information as soon as each job is completed, canceled, or aborted. Numeric values preserve job information for the specified number of seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default value is <CODE>On</CODE>.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The <A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A>, <A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A>, and <A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A> directives can cause job history to be discarded to make room for new jobs.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="PreserveJobFiles">PreserveJobFiles</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PreserveJobFiles On
-PreserveJobFiles Off
-PreserveJobFiles 1w
-PreserveJobFiles 7d
-PreserveJobFiles 168h
-PreserveJobFiles 10080m
-PreserveJobFiles 604800
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PreserveJobFiles</CODE> directive controls whether the document files of completed, canceled, or aborted print jobs are retained. Jobs can be restarted (and reprinted) as desired until they are purged.</P>
-
-<P>A value of <CODE>On</CODE> preserves job files until the administrator purges them with the <CODE>cancel</CODE> command. A value of <CODE>Off</CODE> removes the job files as soon as each job is completed, canceled, or aborted. Numeric values preserve job files for the specified number of seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default value is <CODE>1d</CODE> (one day).</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The <A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A>, <A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A>, <A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A>, and <A HREF="#PreserveJobHistory"><CODE>PreserveJobHistory</CODE></A> directives can cause job files to be discarded sooner than specified.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.21</SPAN><A NAME="ReloadTimeout">ReloadTimeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ReloadTimeout 0
-ReloadTimeout 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ReloadTimeout</CODE> directive specifies the number
-of seconds the scheduler will wait for active jobs to complete
-before doing a restart. The default is 30 seconds.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Require">Require</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ...
- Require group foo bar
- Require user john mary
- Require valid-user
- Require user @groupname
- Require user @SYSTEM
- Require user @OWNER
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Require</CODE> directive specifies that
-authentication is required for the resource. The
-<CODE>group</CODE> keyword specifies that the authenticated user
-must be a member of one or more of the named groups that
-follow.</P>
-
-<P>The <CODE>user</CODE> keyword specifies that the
-authenticated user must be one of the named users or groups that
-follow. Group names are specified using the "@" prefix.</P>
-
-<P>The <CODE>valid-user</CODE> keyword specifies that any
-authenticated user may access the resource.</P>
-
-<P>The default is to do no authentication. This directive must
-appear inside a <A HREF="#Location"><CODE>Location</CODE></A> or
-<A HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="RIPCache">RIPCache</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RIPCache 128m
-RIPCache 1g
-RIPCache 2048k
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RIPCache</CODE> directive sets the size of the
-memory cache used by Raster Image Processor ("RIP") filters such
-as <CODE>imagetoraster</CODE> and <CODE>pstoraster</CODE>. The
-size can be suffixed with a "k" for kilobytes, "m" for megabytes,
-or "g" for gigabytes. The default cache size is "128m", or 128
-megabytes.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.16</SPAN><A NAME="RootCertDuration">RootCertDuration</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RootCertDuration 0
-RootCertDuration 1w
-RootCertDuration 1d
-RootCertDuration 1h
-RootCertDuration 5m
-RootCertDuration 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RootCertDuration</CODE> directive specifies the amount of time the <EM>root certificate</EM> remains valid in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix). The scheduler will generate a new certificate as needed when the given time interval has expired. If set to 0, the root certificate is generated only once on startup or on a restart.</P>
-
-<P>The default is <CODE>5m</CODE> (five minutes).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Satisfy">Satisfy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
- ...
- Satisfy all
- Satisfy any
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Satisfy</CODE> directive specifies whether all
-conditions must be satisfied to allow access to the resource. If
-set to <CODE>all</CODE>, then all authentication and access
-control conditions must be satisfied to allow access.</P>
-
-<P>Setting <CODE>Satisfy</CODE> to <CODE>any</CODE> allows a user
-to gain access if the authentication or access control
-requirements are satisfied. For example, you might require
-authentication for remote access, but allow local access without
-authentication.</P>
-
-<P>The default is <CODE>all</CODE>. This directive must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerAdmin">ServerAdmin</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerAdmin user@host
-ServerAdmin root@foo.bar.com
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerAdmin</CODE> directive identifies the email
-address for the administrator on the system. By default the
-administrator email address is <CODE>root@server</CODE>, where
-<CODE>server</CODE> is the <A
-HREF="#ServerName"><CODE>ServerName</CODE></A>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.3.10</SPAN><A NAME="ServerAlias">ServerAlias</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerAlias althost
-ServerAlias foo.example.com
-ServerAlias bar.example.com
-ServerAlias one.example.com two.example.com
-ServerAlias *
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerAlias</CODE> directive specifies alternate names that the server is known by. By default it contains a list of all aliases associated with the <A HREF="#ServerName"><CODE>ServerName</CODE></A>. The special name "*" can be used to allow any hostname when accessing CUPS via an external network interfaces.</P>
-
-<BLOCKQUOTE><B>Note</B>
-
-<P>The <CODE>ServerAlias</CODE> directive is used for HTTP Host header
-validation when clients connect to the scheduler from external interfaces.
-Using the special name "*" can expose your system to known browser-based
-DNS rebinding attacks, even when accessing sites through a firewall. If the
-auto-discovery of alternate names does not work, we recommend listing each
-alternate name with a ServerAlias directive instead of using "*".</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="ServerName">ServerName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerName foo.example.com
-ServerName myserver.example.com
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerName</CODE> directive specifies the hostname
-that is reported to clients. By default the server name is the
-hostname.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.21</SPAN><A NAME="ServerTokens">ServerTokens</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerTokens None
-ServerTokens ProductOnly
-ServerTokens Major
-ServerTokens Minor
-ServerTokens Minimal
-ServerTokens OS
-ServerTokens Full
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerTokens</CODE> directive specifies the
-information that is included in the <CODE>Server:</CODE> header
-of all HTTP responses. Table 4 lists the token name along with
-the text that is returned. The default is
-<CODE>Minimal</CODE>.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="ServerToken Names and Values">
-<CAPTION>Table 4: <A NAME="TABLE4">ServerToken Names and Values</A></CAPTION>
-<THEAD>
-<TR>
- <TH>Name</TH>
- <TH>Value</TH>
-</TR>
-</THEAD>
-<TBODY>
-<TR>
- <TD>None</TD>
- <TD>No <CODE>Server:</CODE> header is returned</TD>
-</TR>
-<TR>
- <TD>ProductOnly</TD>
- <TD>"CUPS"</TD>
-</TR>
-<TR>
- <TD>Major</TD>
- <TD>"CUPS 1"</TD>
-</TR>
-<TR>
- <TD>Minor</TD>
- <TD>"CUPS 1.2"</TD>
-</TR>
-<TR>
- <TD>Minimal</TD>
- <TD>"CUPS 1.2.N" where N is the patch release</TD>
-</TR>
-<TR>
- <TD>OS</TD>
- <TD>"CUPS 1.2.N (UNAME)" where N is the patch release and
- UNAME is the output of the <B>uname(1)</B> command</TD>
-</TR>
-<TR>
- <TD>Full</TD>
- <TD>"CUPS 1.2.N (UNAME) IPP/1.1" where N is the patch
- release and UNAME is the output of the <B>uname(1)</B>
- command</TD>
-</TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="SetEnv">SetEnv</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SetEnv PATH /usr/lib/cups/filter:/bin:/usr/bin:/usr/local/bin
-SetEnv MY_ENV_VAR foo
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SetEnv</CODE> directive specifies an environment
-variable that should be passed to child processes.</P>
-
-
-<H2 CLASS="title"><A NAME="SSLListen">SSLListen</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SSLListen 127.0.0.1:443
-SSLListen 192.0.2.1:443
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SSLListen</CODE> directive specifies a network
-address and port to listen for secure connections. Multiple
-<CODE>SSLListen</CODE> directives can be provided to listen on
-multiple addresses.</P>
-
-<P>The <CODE>SSLListen</CODE> directive is similar to the <A
-HREF="#SSLPort"><CODE>SSLPort</CODE></A> directive but allows you
-to restrict access to specific interfaces or networks.</P>
-
-
-<H2 CLASS="title"><A NAME="SSLOptions">SSLOptions</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SSLOptions None
-SSLOptions NoEmptyFragments
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SSLOptions</CODE> directive specifies additional SSL/TLS
-protocol options to use for encrypted connected. Currently only two
-options are supported - <code>None</code> (the default) for the most
-secure mode and <code>NoEmptyFragments</code> to allow CUPS to work with
-Microsoft Windows with the FIPS conformance mode enabled.</p>
-
-
-<H2 CLASS="title"><A NAME="SSLPort">SSLPort</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SSLPort 443
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SSLPort</CODE> directive specifies a port to listen
-on for secure connections. Multiple <CODE>SSLPort</CODE> lines
-can be specified to listen on multiple ports.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6</SPAN><A NAME="StrictConformance">StrictConformance</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-StrictConformance No
-StrictConformance Yes
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StrictConformance</CODE> directive specifies whether the scheduler
-requires strict IPP conformance for client requests, for example to not allow
-document attributes in a Create-Job request. The default is
-<code>No</code>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="SubscriptionPrivateAccess">SubscriptionPrivateAccess</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SubscriptionPrivateAccess all
-SubscriptionPrivateAccess default
-SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SubscriptionPrivateAccess</CODE> directive specifies the access list for a
-subscription's private values. The "default" access list is "@OWNER @SYSTEM".
-"@ACL" maps to the printer's requesting-user-name-allowed or
-requesting-user-name-denied values.</P>
-
-<P>The <CODE>SubscriptionPrivateAccess</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="SubscriptionPrivateValues">SubscriptionPrivateValues</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SubscriptionPrivateValues all
-SubscriptionPrivateValues default
-SubscriptionPrivateValues none
-SubscriptionPrivateValues attribute-name-1 [ ... attribute-name-N ]
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SubscriptionPrivateValues</CODE> directive specifies the list of
-subscription values to make private. The "default" values are "notify-events",
-"notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and
-"notify-user-data".</P>
-
-<P>The <CODE>SubscriptionPrivateValues</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Timeout">Timeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Timeout 1w
-Timeout 1d
-Timeout 1h
-Timeout 5m
-Timeout 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Timeout</CODE> directive controls the amount of time
-to wait before an active HTTP or IPP request times out in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default timeout is <CODE>5m</CODE> (five minutes).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="INFO">CUPS 1.5</SPAN><A NAME="WebInterface">WebInterface</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-WebInterface yes
-WebInterface no
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>WebInterface</CODE> directive specifies whether the web interface is enabled. The default value is <CODE>@CUPS_WEBIF@</CODE>.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-error_log.html b/doc/help/ref-error_log.html
deleted file mode 100644
index 0109278..0000000
--- a/doc/help/ref-error_log.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>error_log</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">error_log</H1>
-
-<P>The <VAR>error_log</VAR> file lists messages from the
-scheduler - errors, warnings, etc. The <A
-HREF="ref-cupsd-conf.html#LogLevel"><CODE>LogLevel</CODE></A>
-directive controls which messages are logged:</P>
-
-<P CLASS="command">
-
-level date-time message<BR>
-
-<BR>
-
-I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.<BR>
-
-I [20/May/1999:19:21:02 +0000] Job 2 queued on 'DeskJet' by 'mike'.<BR>
-
-I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.<BR>
-
-</P>
-
-<P>The <I>level</I> field contains the type of message:</P>
-
-<UL>
-
- <LI><CODE>A</CODE> - Alert message (LogLevel alert)
- <LI><CODE>C</CODE> - Critical error message (LogLevel crit)
- <LI><CODE>D</CODE> - Debugging message (LogLevel debug)
- <LI><CODE>d</CODE> - Detailed debugging message (LogLevel debug2)
- <LI><CODE>E</CODE> - Normal error message (LogLevel error)
- <LI><CODE>I</CODE> - Informational message (LogLevel info)
- <LI><CODE>N</CODE> - Notice message (LogLevel notice)
- <LI><CODE>W</CODE> - Warning message (LogLevel warn)
- <LI><CODE>X</CODE> - Emergency error message (LogLevel emerg)
-
-</UL>
-
-<P>The <I>date-time</I> field contains the date and time of when
-the page started printing. The format of this field is identical
-to the <I>data-time</I> field in the <VAR>access_log</VAR> file.</P>
-
-<P>The <I>message</I> fields contains a free-form textual
-message. Messages from job filters are prefixed with "<CODE>[Job
-NNN]</CODE>".</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-mailto-conf.html b/doc/help/ref-mailto-conf.html
deleted file mode 100644
index 0b95132..0000000
--- a/doc/help/ref-mailto-conf.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>mailto.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">mailto.conf</H1>
-
-<P>The <VAR>/etc/cups/mailto.conf</VAR> file contains several
-directives that defines the local mail server and email
-notification preferences for CUPS. 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>
-
-
-<H2 CLASS="title"><A NAME="Cc">Cc</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Cc bigbrother@example.com
-Cc John Doe &lt;jd@example.com>
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Cc</CODE> directive specifies an additional
-recipient ("carbon copy") for all email notifications. The
-default is to not send a copy to anyone but the subscriber.</P>
-
-
-<H2 CLASS="title"><A NAME="From">From</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-From printserver@example.com
-From Your Happy Printer &lt;printserver@example.com>
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>From</CODE> directive specifies the sender of email
-notifications. The default is the <A
-HREF="ref-cupsd-conf.html#ServerAdmin"><TT>ServerAdmin</TT><A>
-address defined in the <VAR>cupsd.conf</VAR> file.</P>
-
-
-<H2 CLASS="title"><A NAME="Sendmail">Sendmail</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Sendmail /usr/sbin/sendmail
-Sendmail /usr/lib/sendmail -bm -i
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Sendmail</CODE> directive specifies the command to
-run to deliver an email locally. This directive cannot be used
-with the <TT>SMTPServer</TT> directive, and if both
-<TT>Sendmail</TT> and <TT>SMTPServer</TT> lines appear in the
-<VAR>mailto.conf</VAR> file, only the last line is used. The
-default is <TT>/usr/sbin/sendmail</TT>.</P>
-
-
-<H2 CLASS="title"><A NAME="SMTPServer">SMTPServer</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SMTPServer mail.example.com
-SMTPServer 192.168.2.1
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SMTPServer</CODE> directive specifies a hostname or
-IP address of a (possibly remote) SMTP mail server. This
-directive cannot be used with the <TT>Sendmail</TT> directive,
-and if both <TT>Sendmail</TT> and <TT>SMTPServer</TT> lines
-appear in the <VAR>mailto.conf</VAR> file, only the last line is
-used. The default is to use the <TT>Sendmail</TT> command
-instead.</P>
-
-
-<H2 CLASS="title"><A NAME="Subject">Subject</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Subject [CUPS]
-Subject URGENT EMAIL NOTIFICATION
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Subject</CODE> directive specifies a prefix string to
-add to the subject of each email notification. The default is to
-not add a prefix string.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-page_log.html b/doc/help/ref-page_log.html
deleted file mode 100644
index 46453eb..0000000
--- a/doc/help/ref-page_log.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>page_log</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">page_log</H1>
-
-<P>The <VAR>page_log</VAR> file lists each page that is sent to a
-printer. By default, each line contains the following information:</P>
-
-<P CLASS="command">
-
-printer user job-id date-time page-number num-copies job-billing job-originating-host-name job-name media sides<BR>
-
-<BR>
-
-DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 1 acme-123 localhost myjob letter one-sided<BR>
-
-DeskJet root 2 [20/May/1999:19:21:05 +0000] 2 1 acme-123 localhost myjob letter one-sided<BR>
-
-</P>
-
-<p>The <a href="ref-cupsd-conf.html#PageLogFormat"><code>PageLogFormat</code></a>
-directive can be used to change this information.</p>
-
-<P>The <I>printer</I> field contains the name of the printer that
-printed the page. If you send a job to a printer class, this
-field will contain the name of the printer that was assigned the
-job.</P>
-
-<P>The <I>user</I> field contains the name of the user (the IPP
-<CODE>requesting-user-name</CODE> attribute) that submitted this
-file for printing.</P>
-
-<P>The <I>job-id</I> field contains the job number of the page
-being printed. Job numbers are reset to 1 whenever the spool
-directory (<VAR>/var/spool/cups</VAR>) is cleared, so don't
-depend on this number being unique!</P>
-
-<P>The <I>date-time</I> field contains the date and time of when
-the page started printing. The format of this field is identical
-to the <I>data-time</I> field in the <VAR>access_log</VAR>
-file.</P>
-
-<P>The <I>page-number</I> and <I>num-copies</I> fields contain the
-page number and number of copies being printed of that page. For
-printers that cannot produce copies on their own, the
-<I>num-copies</I> field will always be 1.</P>
-
-<P>The <I>job-billing</I> field contains a copy of the
-<CODE>job-billing</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-<P>The <I>job-originating-host-name</I> field contains the hostname or IP
-address of the client that printed the job.</P>
-
-<P>The <I>job-name</I> field contains a copy of the
-<CODE>job-name</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-<P>The <I>media</I> field contains a copy of the
-<CODE>media</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-<P>The <I>sides</I> field contains a copy of the
-<CODE>sides</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-printers-conf.html b/doc/help/ref-printers-conf.html
deleted file mode 100644
index bb44c4c..0000000
--- a/doc/help/ref-printers-conf.html
+++ /dev/null
@@ -1,719 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>printers.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">printers.conf</H1>
-
-<P>The CUPS scheduler (cupsd) uses the
-<VAR>/etc/cups/printers.conf</VAR> file to store the list of
-available printers. This file contains only locally defined
-printers, not remote printers that are created automatically via
-browsing. 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>While the printer configuration file consists of plain text
-and can be modified using your favorite text editor, you should
-normally use the <A HREF="man-lpadmin.html">lpadmin(8)</A>
-command, web interface, or any of the available GUIs to manage
-your printers instead. If you do choose to edit this file
-manually, you will need to stop the scheduler first, make your
-changes, and then start the scheduler to make them active.</P>
-
-
-<H2 CLASS="title"><A NAME="Accepting">Accepting</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Accepting yes
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Accepting</CODE> directive defines the initial state
-of the <VAR>printer-is-accepting-jobs</VAR> attribute. This state
-is also set by the <CODE>cupsaccept(8)</CODE> and
-<CODE>cupsreject(8)</CODE> commands:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/cupsaccept printername
-/usr/sbin/cupsreject printername</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="AllowUser">AllowUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- AllowUser foo_user
- AllowUser @bar_group
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AllowUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-allowed</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -u allow:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#DenyUser"><CODE>DenyUser</CODE></A>.</P>
-
-
-<H2 CLASS="title"><A NAME="DefaultPrinter">DefaultPrinter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;DefaultPrinter name&gt;
- ...
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultPrinter</CODE> directive begins a printer
-definition as the default server destination. The default server
-destination can be set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -d printername</KBD>
-</PRE>
-
-<P>Note that the server default destination settings can be
-overridden by the user's default destination settings which are
-normally set using the <CODE>lpoptions(1)</CODE> command.</P>
-
-
-<H2 CLASS="title"><A NAME="DenyUser">DenyUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- DenyUser foo_user
- DenyUser @bar_group
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DenyUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-denied</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -u deny:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#AllowUser"><CODE>AllowUser</CODE></A></P>
-
-
-<H2 CLASS="title"><A NAME="DeviceURI">DeviceURI</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- DeviceURI socket://foo.bar.com:9100
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DeviceURI</CODE> directive defines the value of the
-<VAR>device-uri-attribute</VAR> attribute. It is normally set
-using the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -v device-uri</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="ErrorPolicy">ErrorPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- ErrorPolicy abort-job
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ErrorPolicy</CODE> directive defines the policy that
-is used when a backend is unable to send a print job to the
-printer. The <CODE>lpadmin(8)</CODE> command sets the current
-error policy:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o printer-error-policy=stop-printer</KBD>
-</PRE>
-
-<P>The following values are supported:</P>
-
-<UL>
-
- <LI><CODE>abort-job</CODE> - Abort the job and proceed
- with the next job in the queue</LI>
-
- <LI><CODE>retry-current-job</CODE> - Retry the current job
- immediately</LI>
-
- <LI><CODE>retry-job</CODE> - Retry the job after waiting
- for N seconds; the <VAR>cupsd.conf</VAR> <A
- HREF="ref-cupsd-conf.html#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
- directive controls the value of N</LI>
-
- <LI><CODE>stop-printer</CODE> - Stop the printer and keep
- the job for future printing; this is the default
- value</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4</SPAN><A NAME="Filter">Filter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Filter mime/type 100 program
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Filter</CODE> directive lists a single filter program as defined
-in the printer's PPD file.</P>
-
-<P>This directive must appear inside a
-<A HREF="#Printer"><CODE>Printer</CODE></A> or
-<A HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Info">Info</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Info My Printer
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Info</CODE> directive defines the string for the
-<VAR>printer-info</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -D "My Printer"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="JobSheets">JobSheets</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- JobSheets none,standard
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobSheets</CODE> directive specifies the default
-banner pages to print before and after a print job. In the above
-example, only a <VAR>standard</VAR> banner will print after each
-job. The <CODE>lpadmin(8)</CODE> command is normally used to set
-the default banners:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-sheets-default=none,standard</KBD>
-</PRE>
-
-<P>If only one banner file is specified, it will be printed
-before the files in the job. If a second banner file is
-specified, it is printed after the files in the job.</P>
-
-<P>The available banner pages depend on the local system
-configuration; CUPS includes the following standard banner
-files:</P>
-
-<UL>
-
- <LI><CODE>none</CODE> - Do not produce a banner
- page.</LI>
-
- <LI><CODE>classified</CODE> - A banner page with a
- &quot;classified&quot; label at the top and bottom.</LI>
-
- <LI><CODE>confidential</CODE> - A banner page with a
- &quot;confidential&quot; label at the top and bottom.</LI>
-
- <LI><CODE>secret</CODE> - A banner page with a
- &quot;secret&quot; label at the top and bottom.</LI>
-
- <LI><CODE>standard</CODE> - A banner page with no label
- at the top and bottom.</LI>
-
- <LI><CODE>topsecret</CODE> - A banner page with a
- &quot;top secret&quot; label at the top and bottom.</LI>
-
- <LI><CODE>unclassified</CODE> - A banner page with an
- &quot;unclassified&quot; label at the top and bottom.</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="KLimit">KLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- KLimit 1234
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KLimit</CODE> directive defines the value of the
-<VAR>job-k-limit</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-k-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Location">Location</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Location Building 3321
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Location</CODE> directive defines the string for the
-<VAR>printer-location</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -L "Building 3321"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="OpPolicy">OpPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- OpPolicy default
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>OpPolicy</CODE> directive sets the operation policy
-that is used for the printer. The <CODE>lpadmin(8)</CODE> command
-sets the current operation policy:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o printer-op-policy=default</KBD>
-</PRE>
-
-<P>The default policy is named "default". All policies correspond
-to those defined using the <VAR>cupsd.conf</VAR> <A
-HREF="ref-cupsd-conf.html#Policy"><CODE>Policy</CODE></A>
-section.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Option">Option</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Option name value
- Option scaling 100
- Option page-left 72
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Option</CODE> directive specifies a default job
-template attribute value. It is mapped to
-<CODE>name-default</CODE> in the printer attributes and applied
-to jobs as <CODE>name</CODE>.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLimit">PageLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- PageLimit 1234
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLimit</CODE> directive defines the value of the
-<VAR>job-page-limit</VAR> attribute. It can be set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-page-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="PortMonitor">PortMonitor</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- PortMonitor bcp
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PortMonitor</CODE> directive sets the filter program that
-is used for every print job, typically to encode or package the print
-data in a format acceptable for a particular printer interface. It is
-set using the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o port-monitor=tbcp</KBD>
-</PRE>
-
-<P>The following standard port monitors are included with CUPS:</P>
-
-<UL>
-
- <LI><CODE>bcp</CODE> - Encode PostScript print data using
- the Adobe Binary Control Protocol (BCP)</LI>
-
- <LI><CODE>none</CODE> - Do not use a port monitor</LI>
-
- <LI><CODE>tbcp</CODE> - Encode PostScript print data
- using the Adobe Tagged Binary Control Protocol
- (TBCP)</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4</SPAN><A NAME="PreFilter">PreFilter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- PreFilter mime/type 100 program
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PreFilter</CODE> directive lists a single pre-filter program as
-defined in the printer's PPD file.</P>
-
-<P>This directive must appear inside a
-<A HREF="#Printer"><CODE>Printer</CODE></A> or
-<A HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Printer">Printer</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Printer</CODE> directive begins a printer
-definition. Printers are added using the <CODE>lpadmin(8)</CODE>
-command:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername ...</KBD>
-</PRE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4</SPAN><A NAME="Product">Product</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Product Acme PaperWriter
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Product</CODE> directive defines the main product string from the
-printer's PPD file and is used when advertising the queue via DNS-SD.</P>
-
-<P>This directive must appear inside a
-<A HREF="#Printer"><CODE>Printer</CODE></A> or
-<A HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="QuotaPeriod">QuotaPeriod</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- QuotaPeriod 604800
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>QuotaPeriod</CODE> directive defines the value of
-the <VAR>job-quota-period</VAR> attribute. Typical values are
-86400 (1 day), 604800 (1 week), 2592000 (1 month), and 31536000
-(1 year). It is set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-quota-period=604800</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Shared">Shared</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- Shared yes
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Shared</CODE> directive defines the initial value of
-the <VAR>printer-is-shared</VAR> attribute. The strings
-<VAR>yes</VAR> and <VAR>no</VAR> correspond to the true and false
-values, respectively. The <CODE>lpadmin(8)</CODE> command sets
-the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o printer-is-shared=true</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="State">State</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- State idle
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>State</CODE> directive defines the initial value of
-the <VAR>printer-state</VAR> attribute. The strings
-<VAR>idle</VAR> and <VAR>stopped</VAR> correspond to the IPP
-enumeration values 3 and 5, respectively. The
-<CODE>cupsenable(8)</CODE> and <CODE>cupsdisable(8)</CODE>
-commands set the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/cupsenable printername</KBD>
-<KBD>/usr/sbin/cupsdisable printername</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="StateMessage">StateMessage</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- StateMessage Printer is lonely.
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateMessage</CODE> directive defines the initial
-string for the <VAR>printer-state-message</VAR> attribute. The
-following are some example messages:</P>
-
-<PRE CLASS="command">
-StateMessage Connected to host_name...
-StateMessage Connecting to printer_queue on port port_number...
-StateMessage Network host host_name is busy; will retry in 30 seconds...
-StateMessage Printer busy; will retry in 10 seconds...
-StateMessage Printer is busy; retrying print job...
-StateMessage Print file accepted - job ID id_number.
-StateMessage Waiting for job to complete
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="StateTime">StateTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
- ...
- StateTime 1133542425
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateTime</CODE> directive defines the UNIX time
-(seconds since Jan 1, 1970) for the last state change of the
-queue. It is mapped to the <VAR>printer-state-change-time</VAR>
-attribute.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-snmp-conf.html b/doc/help/ref-snmp-conf.html
deleted file mode 100644
index 4cab237..0000000
--- a/doc/help/ref-snmp-conf.html
+++ /dev/null
@@ -1,145 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>snmp.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">snmp.conf</H1>
-
-<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 and reporting status and supply
-levels for network printers.</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="DeviceURI">DeviceURI</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DeviceURI "HP.*JetDirect.*" socket://%s:9100 socket://%s:9101 socket://%s:9102
-DeviceURI "HP.*" socket://%s
-DeviceURI "Acme.*Laser.*" lpd://%s/print
-DeviceURI "Xerox.*"
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DeviceURI</CODE> directive specifies a regular expression
-(enclosed in double quotes) that is matched against the SNMP device
-description OID returned by a printer. If the description matches the
-regular expression, each device URI that follows the regular expression
-is listed by the backend, with any occurrences of <CODE>%s</CODE>
-replaced by the device's hostname or IP address. If no URIs are listed,
-the device is ignored.</P>
-
-<P>The <CODE>DeviceURI</CODE> directives are processed serially in
-the order specified in the <VAR>snmp.conf</VAR> file until a match
-is found.</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>
-
-<H2 CLASS="title"><A NAME="MaxRunTime">MaxRunTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxRunTime 10
-MaxRunTime 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxRunTime</CODE> directive specifies the maximum
-number of seconds that the SNMP backend will spend looking for
-printer devices on the network.</P>
-
-<P>The default setting is <VAR>10</VAR>.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-subscriptions-conf.html b/doc/help/ref-subscriptions-conf.html
deleted file mode 100644
index 06cfc72..0000000
--- a/doc/help/ref-subscriptions-conf.html
+++ /dev/null
@@ -1,354 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
- <TITLE>subscriptions.conf</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">subscriptions.conf</H1>
-
-<P>The CUPS scheduler (cupsd) uses the
-<VAR>/etc/cups/subscriptions.conf</VAR> file to store the list
-of active subscriptions. 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>While the subscriptions configuration file consists of plain
-text and can be modified using your favorite text editor, you
-should normally use the command-line programs (<A
-HREF="man-lp.html">lp(1)</A> and <A
-HREF="man-lpr.html">lpr(1)</A>) or specific applications via IPP
-requests to manage your subscriptions.</P>
-
-<H2 CLASS="title"><A NAME="Events">Events</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- Events job-completed
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Events</CODE> directive lists the events, separated
-by spaces, that the subscriber is interested in. Table 1 lists
-the supported event names.</P>
-
-<P>The <CODE>Events</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="Event Names">
-<CAPTION>Table 1: <A NAME="TABLE1">Event Names</A></CAPTION>
-<THEAD>
-<TR>
- <TH>Name</TH>
- <TH>Description</TH>
-</TR>
-</THEAD>
-<TBODY>
-<TR>
- <TD>all</TD>
- <TD>All events</TD>
-</TR>
-<TR>
- <TD>job-completed</TD>
- <TD>Send notification when the job is completed</TD>
-</TR>
-<TR>
- <TD>job-config-changed</TD>
- <TD>Send notification when the job is changed</TD>
-</TR>
-<TR>
- <TD>job-created</TD>
- <TD>Send notification when a job is created</TD>
-</TR>
-<TR>
- <TD>job-progress</TD>
- <TD>Send notification for job progress</TD>
-</TR>
-<TR>
- <TD>job-state-changed</TD>
- <TD>Send notification when the job-state changes</TD>
-</TR>
-<TR>
- <TD>job-stopped</TD>
- <TD>Send notification when the job is stopped</TD>
-</TR>
-<TR>
- <TD>printer-added</TD>
- <TD>Send notification when a printer is added</TD>
-</TR>
-<TR>
- <TD>printer-changed</TD>
- <TD>Send notification when a printer is changed</TD>
-</TR>
-<TR>
- <TD>printer-config-changed</TD>
- <TD>Send notification when a printer's configuration is changed</TD>
-</TR>
-<TR>
- <TD>printer-deleted</TD>
- <TD>Send notification when a printer is deleted</TD>
-</TR>
-<TR>
- <TD>printer-modified</TD>
- <TD>Send notification when a printer is modified</TD>
-</TR>
-<TR>
- <TD>printer-state-changed</TD>
- <TD>Send notification when the printer-state changes</TD>
-</TR>
-<TR>
- <TD>printer-stopped</TD>
- <TD>Send notification when a printer is stopped</TD>
-</TR>
-<TR>
- <TD>server-audit</TD>
- <TD>Send notification when a bad request, security error, or
- authentication error occurs</TD>
-</TR>
-<TR>
- <TD>server-restarted</TD>
- <TD>Send notification when the server is restarted</TD>
-</TR>
-<TR>
- <TD>server-started</TD>
- <TD>Send notification when the server is initially started</TD>
-</TR>
-<TR>
- <TD>server-stopped</TD>
- <TD>Send notification when the server is shutdown</TD>
-</TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><A NAME="ExpirationTime">ExpirationTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- ExpirationTime 1012563145
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ExpirationTime</CODE> directive specifies the
-expiration time of the subscription as a UNIX time value. It is 0
-for subscriptions with no predefined expiration time.</P>
-
-<P>The <CODE>ExpirationTime</CODE> directive must appear inside a
-<A HREF="#Subscription"><CODE>Subscription</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Interval">Interval</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- Interval 30
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Interval</CODE> directive specifies the preferred
-time interval for event notifications in seconds.</P>
-
-<P>The <CODE>Interval</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="JobId">JobId</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- JobId 123
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobId</CODE> directive specifies the
-<CODE>job-id</CODE> for job subscriptions.</P>
-
-<P>The <CODE>JobId</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="LeaseDuration">LeaseDuration</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- LeaseDuration
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LeaseDuration</CODE> directive specifies the number
-of seconds that the subscription is valid. A value of 0 means
-that the subscription will last forever or the life of the print
-job the subscription is attached to.</P>
-
-<P>The <CODE>LeaseDuration</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="NextEventId">NextEventId</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- NextEventId 999
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>NextEventId</CODE> directive specifies the
-<CODE>notify-sequence-number</CODE> value for the next
-notification event. It starts at 1 and increases for every event
-that is delivered for the subscription.</P>
-
-<P>The <CODE>NextEventId</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="NextSubscriptionId">NextSubscriptionId</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-NextSubscriptionId 999
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>NextSubscriptionId</CODE> directive specifies the
-next subscription ID to use. It defaults to 1 more than the
-highest subscription number seen.</P>
-
-
-<H2 CLASS="title"><A NAME="Owner">Owner</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- Owner username
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Owner</CODE> directive specifies the user that owns
-this subscription.</P>
-
-<P>The <CODE>Owner</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="PrinterName">PrinterName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- PrinterName name
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PrinterName</CODE> directive specifies the name of
-the printer or class that is associated with this
-subscription.</P>
-
-<P>The <CODE>PrinterName</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Recipient">Recipient</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- Recipient mailto:foo@domain.com
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Recipient</CODE> directive specifies the
-<CODE>notify-recipient-uri</CODE> value for push-type
-notifications. The URI scheme name determines which notifier
-program is used to send the event(s).</P>
-
-<P>The <CODE>Recipient</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Subscription">Subscription</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Subscription</CODE> section defines a single
-subscription in the system. Each subscription is assigned a
-unique (to the server) number starting at 1.</P>
-
-
-<H2 CLASS="title"><A NAME="UserData">UserData</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
- ...
- UserData mailto:bar&lt;40&gt;example.com
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>UserData</CODE> directive specifies the
-<CODE>notify-user-data</CODE> value, which is normally the "to"
-address used in <CODE>mailto</CODE> notifications. Binary values
-are introduced by encoding the bytes as hexadecimal values inside
-angle brackets, e.g. "&lt;1234&gt;".</P>
-
-<P>The <CODE>UserData</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/security.html b/doc/help/security.html
index 3bd5642..d96cbf0 100644
--- a/doc/help/security.html
+++ b/doc/help/security.html
@@ -19,10 +19,7 @@ server.</P>
<H2 CLASS="title"><A NAME="AUTHENTICATION">Authentication Issues</A></H2>
-<P>When you enable remote administration, the server will use
-Basic authentication for administration tasks. The current CUPS
-server supports Basic, Digest, Kerberos, and local certificate
-authentication:</P>
+<P>When you enable remote administration, the server will use Basic authentication for administration tasks. The current CUPS server supports Basic, Kerberos, and local certificate authentication:</P>
<OL>
@@ -38,18 +35,6 @@ authentication:</P>
username and password information - this is the default on
MacOS X and systems with GNU TLS or OpenSSL installed.</P></LI>
- <LI>Digest authentication uses an MD5 checksum of the
- username, password, and domain ("CUPS"), so the original
- username and password is not sent over the network.
-
- <P>The current implementation does not authenticate the
- entire message and uses the client's IP address for the
- nonce value, making it possible to launch "man in the
- middle" and replay attacks from the same client.</P>
-
- <P><B>Recommendation:</B> Enable encryption to hide the
- username and password information.</P></LI>
-
<LI>Local certificate authentication passes 128-bit
"certificates" that identify an authenticated user.
Certificates are created on-the-fly from random data and
@@ -101,20 +86,6 @@ variety of denial of service attacks:</P>
<P><B>Recommendation:</B> None.</P></LI>
- <LI>Flooding the network with broadcast packets on port
- 631.
-
- <P>It might be possible to disable browsing if this
- condition is detected by the CUPS software, however if
- there are large numbers of printers available on the
- network such an algorithm might think that an attack was
- occurring when instead a valid update was being
- received.</P>
-
- <P><B>Recommendation:</B> Block browse packets from
- foreign or untrusted networks using a router or
- firewall.</P></LI>
-
<LI>Sending partial IPP requests; specifically, sending
part of an attribute value and then stopping
transmission.
@@ -146,27 +117,7 @@ variety of denial of service attacks:</P>
<H2 CLASS="title"><A NAME="ENCRYPTION">Encryption Issues</A></H2>
-<P>CUPS supports 128-bit SSL 3.0 and TLS 1.0 encryption of
-network connections via the OpenSSL, GNU TLS, and CDSA encryption
-libraries. In additional to the potential security issues posed
-by the SSL and TLS protocols, CUPS currently has the following
-additional issue:</P>
-
-<OL>
-
- <LI>Certification validation/revocation; currently CUPS
- does not validate or revoke server or client certificates
- when establishing a secure connection. This can
- potentially lead to "man in the middle" and
- impersonation/spoofing attacks over unsecured networks.
- Future versions of CUPS will support both validation and
- revocation of server certificates.
-
- <P><B>Recommendation:</B> Do not depend on encryption for
- security when connecting to servers over the Internet or
- untrusted WAN links.</P></LI>
-
-</OL>
+<P>CUPS supports 128-bit TLS encryption of network connections via the GNU TLS library, OS X Security framework, and Windows Schannel APIs. Secure deployment of TLS depends on proper certificate management and software maintenance.</P>
</BODY>
</HTML>
diff --git a/doc/help/spec-browsing.html b/doc/help/spec-browsing.html
deleted file mode 100644
index 3a29132..0000000
--- a/doc/help/spec-browsing.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<!-- SECTION: Specifications -->
-<head>
- <title>CUPS Browse Protocol</title>
- <meta name='keywords' content='Programming'>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</head>
-<body>
-<!--
- "$Id$"
-
- CUPS Browse Protocol specification for CUPS.
-
- Copyright 2008-2012 by Apple Inc.
- Copyright 1997-2005 by Easy Software Products.
-
- These coded instructions, statements, and computer programs are the
- property of Apple Inc. and are protected by Federal copyright
- law. Distribution and use rights are outlined in the file "LICENSE.txt"
- which should have been included with this file. If this file is
- file is missing or damaged, see the license at "http://www.cups.org/".
--->
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The CUPS Browse Protocol was deprecated in CUPS 1.4 and is no longer supported.</P>
-
-</BLOCKQUOTE>
-
-<H1 CLASS="title">CUPS Browse Protocol</H1>
-
-<h2><a name='INTRO'>Introduction</a></h2>
-
-<p>This specification describes the CUPS browsing protocol which was used for
-printer sharing. The protocol was a UDP/IP-based broadcast service that
-operated on IP service port 631 by default. Each broadcast packet described
-a single printer or class being shared.</p>
-
-<p>For simple networks with a single subnet, a CUPS system sharing a printer
-(the <em>server</em>) would periodically broadcast that printer's availability
-and status information to the subnet. Every other CUPS system on the subnet
-(the <em>clients</em>) would receive the broadcast and make that printer
-available to local users. If a client stopped receiving broadcasts from the
-server, or if the server sent a special "deleted" broadcast message, the
-client would remove its copy of the printer.</p>
-
-<p>For larger networks with multiple subnets, a relay configuration could be used
-where one or more client systems polled the server and then broadcast the
-availability and status information for the server's shared printers to the
-clients' local subnets.</p>
-
-<p>A key feature of CUPS printer sharing was support for <em>implicit
-classes</em>, which are automatically-created classes for printers that are
-shared by multiple servers. These implicit classes provided automatic load
-balancing and fail-safe printing functionality transparently to the user.</p>
-
-
-<h2><a name='SECURITY'>Security Considerations</a></h2>
-
-<p>Like most discovery protocols, CUPS browse packets were not encrypted or
-signed, so it was possible for malicious systems on a network to advertise
-or remove printers on that network to cause denial of service or information
-disclosure. In order to combat this, CUPS logged incoming browse packets and
-provided access controls to limit browse packet reception to known hosts.</p>
-
-
-<h2><a name='FORMAT'>Browse Packet Format</a></h2>
-
-<p>Each broadcast packet is an ASCII text string of up to 1450 bytes ending
-with a line feed (0x0a). The general format is:</p>
-
-<p class='summary'>
-printer-type printer-state printer-uri "printer-location" "printer-info"
-"printer-make-and-model" name=value name2=value2 ...
-</p>
-
-<p>Each of the fields contains the value of the corresponding IPP attribute.
-The trailing "name=value" information is used to convey default job template
-attribute values (job-sheets-default, media-default, etc.), authentication
-requirements (auth-info-required), and additional IPP URI options that are
-requested by the server (ipp-options).</p>
-
-<h3>ABNF Definition</h3>
-
-<p>The following ABNF definition [RFC4234, RFC3986] defines the format of each
-browse packet:</p>
-
-<pre class='command'>
-PACKET = TYPE WSP STATE WSP URI WSP LOCATION WSP INFO WSP
- MAKE-AND-MODEL WSP *[ WSP ATTR-NAME "=" ATTR-VALUE ] LF
-
-TYPE = 1*HEXDIG
-
-STATE = "3" / "4" / "5"
-
-URI = "ipp://" ( 1*NAMECHAR / IP-literal / IPv4address )
- [ ":" 1*DIGIT ] ( "/printers/" / "/classes/" ) 1*NAMECHAR
-NAMECHAR = %x21.22.24.26-2E.30-7E / %x25 HEXDIG HEXDIG
-IP-literal = See RFC 3986
-IPv4address = See RFC 3986
-
-LOCATION = QUOTED-STRING
-INFO = QUOTED-STRING
-MAKE-AND-MODEL = QUOTED-STRING
-
-ATTR-NAME = 1*( ALPHA / DIGIT / "-" / "." )
-ATTR-VALUE = QUOTED-STRING / 1*UNQUOTE-CHAR
-
-QUOTED-STRING = DQUOTE *QUOTED-CHAR DQUOTE
-QUOTED-CHAR = %x20.21.23-5B.5D-7E / UTF8-CHAR / %x5C %x5C / %x5C %x22
-UNQUOTE-CHAR = %x21.23-26.28-5B.5D-7E / UTF8-CHAR
-UTF8-CHAR = %xC0.DF %x80.BF / %xE0.EF %x80.BF %x80.BF /
- %xF0.F7 %x80.BF %x80.BF %x80.BF
-</pre>
-
-</body>
-</html>
diff --git a/doc/help/spec-cmp.html b/doc/help/spec-cmp.html
index 2c66e32..d2a44ac 100644
--- a/doc/help/spec-cmp.html
+++ b/doc/help/spec-cmp.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE html>
<HTML>
<!-- SECTION: Specifications -->
<HEAD>
@@ -11,9 +11,10 @@
<P>This developer guide documents the guidelines and processes we use when developing and maintaining CUPS and related software. Our goal is to provide reliable and efficient software and documentation that addresses the needs of our users.</P>
+
<H2 CLASS="title"><A NAME="OVERVIEW">Overview</A></H2>
-<P>CUPS is developed by Apple Inc. and distributed as open source software under a combination of GNU GPL2 and GNU LGPL2 licenses with exceptions to allow linking to OpenSSL (which has a GPL-incompatible license) and for developers on Apple's operating systems to develop CUPS-based software until alternate license terms. Significant contributions to CUPS must be licensed to Apple using the <A HREF="http://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">Apple Contributor Agreement</A>.</P>
+<P>CUPS is developed by Apple Inc. and distributed as open source software under a combination of GNU GPL2 and GNU LGPL2 licenses with exceptions to allow developers on Apple's operating systems to develop CUPS-based software under alternate license terms. Significant contributions to CUPS must be licensed to Apple using the <A HREF="https://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">Apple Contributor Agreement</A>.</P>
<P>Apple releases updates to the CUPS software approximately every three months. Each release has a version number consisting of the major version (currently 1), minor version (currently 6), and patch version (starting at 0) separated by the period, for example "1.6.0". Releases where only the patch version number changes will contain only bug fixes to the previous release, for example "1.6.1" includes bug fixes for the "1.6.0" release. New features require the major or minor version numbers to change, for example "1.6.0" release contains new features compared to the "1.5.3" release. Multiple beta and "candidate" releases generally precede each new feature release, for example "1.5b1", "1.5b2", and "1.5rc1" preceded the "1.5.0" release. Finally, we also post regular Subversion snapshot releases, for example "1.6svn-r10486", which represent a snapshot of the development for the next feature release.</P>
@@ -26,48 +27,26 @@
<H3><A NAME="CONTACT">How to Contact the Developers</A></H3>
-<P>The <A HREF="http://lists.cups.org/">CUPS Mailing Lists</A> are the primary means of asking questions and informally discussing issues and feature requests with the CUPS developers and other experienced CUPS users and developers. Table 1 shows the available mailing lists and their focus:</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="CUPS Forums">
-<CAPTION>Table 1: CUPS Mailing Lists</CAPTION>
-<TR>
- <TH>List</TH>
- <TH>Focus/Purpose</TH>
-</TR>
-<TR>
- <TD>cups</TD>
- <TD>General discussion and usage questions for the CUPS software</TD>
-</TR>
-<TR>
- <TD>cups-bugs</TD>
- <TD>Discussion of bugs and issues in the CUPS software</TD>
-</TR>
-<TR>
- <TD>cups-commit</TD>
- <TD>Report of all commits to the Subversion repository (read-only)</TD>
-</TR>
-<TR>
- <TD>cups-dev</TD>
- <TD>Development questions and discussion of new features in the CUPS software</TD>
-</TR>
-</TABLE></DIV>
+<P>The <A HREF="https://www.cups.org/lists.php">CUPS.org mailing lists</A> are the primary means of asking questions and informally discussing issues and feature requests with the CUPS developers and other experienced CUPS users and developers. The <a href="https://www.cups.org/mailman/listinfo/cups">cups&#x40;cups.org</a> mailing list is intended for CUPS usage questions and new software announcements while the <a href="https://www.cups.org/mailman/listinfo/cups-devel">cups-devel&#x40;cups.org</a> mailing list provides a forum for CUPS developers and monitoring new bugs.</p>
<H3><A NAME="SUBMIT">How to Submit a Bug Report or Feature Request</A></H3>
-<P>The CUPS "<A HREF="http://www.cups.org/str.php">Bugs &amp; Features</A>" page provides access to the CUPS <em>Software Trouble Report</em> (STR) database and is the formal way to submit a bug report or feature request to the CUPS developers. Please note, however, that we <em>do not</em> provide answers to usage questions or resolve problems in third-party software on this page - use the <A HREF="#CONTACT">CUPS Mailing Lists</A> for that instead.</P>
+<P>The CUPS.org <A HREF="https://www.cups.org/str.php">Bugs</A> page provides access to the CUPS <em>Software Trouble Report</em> (STR) database and is the formal way to submit a bug report or feature request to the CUPS developers. Please note, however, that we <em>do not</em> provide answers to usage questions or resolve problems in third-party software on this page - use the <A HREF="#CONTACT">CUPS.org mailing lists</A> for that instead.</P>
-<P>Unlike discussions that occur on the CUPS Mailing Lists, formal bug reports and feature requests must be acted on by the CUPS developers. This does not mean that every bug report is resolved or every feature request is implemented, but we do respond and keep track of them all for posterity.</P>
+<P>Unlike discussions that occur on the CUPS.org mailing lists, formal bug reports and feature requests must be acted on by the CUPS developers. This does not mean that every bug report is resolved or every feature request is implemented, but we do respond and keep track of them all for posterity.</P>
-<BLOCKQUOTE>Please use the search feature of the Bugs &amp; Features page before submitting a new bug report or feature request. If you see an existing report that matches your issue, please post a message to that report ("I have this issue as well", "I would also like to see", etc.) rather than submitting a new report. This helps speed the resolution of your issue by reducing the CUPS developers' work load and identifying popular issues.</BLOCKQUOTE>
+<BLOCKQUOTE><B>Note:</B>
+
+<P>Please use the search feature of the Bugs page before submitting a new bug report or feature request. If you see an existing report that matches your issue, please post a message to that report ("I have this issue as well", "I would also like to see", etc.) rather than submitting a new report. This helps speed the resolution of your issue by reducing the CUPS developers' work load and identifying popular issues.</P></BLOCKQUOTE>
<H3><A NAME="PATCH">How to Prepare a Patch</A></H3>
-<P>When submitting a bug report or feature request, you can include patch files that resolve the bug or implement the feature to speed the inclusion of that bug fix or feature in a new CUPS release. For changes to existing files, we prefer a unified diff against the current Subversion <VAR>trunk</VAR> branch, which can be generated easily using the following Subversion command:</P>
+<P>When submitting a bug report or feature request, you can include patch files that resolve the bug or implement the feature to speed the inclusion of that bug fix or feature in a new CUPS release. For changes to existing files, we prefer a unified diff against the current GIT "master" branch, which can be generated easily using the following Git command:</P>
<PRE CLASS="command">
-svn diff >filename.patch
+git format-patch remotes/trunk >filename.patch
</PRE>
<P>If you produce a patch using a released source archive, use one of the following commands instead:</P>
@@ -82,7 +61,7 @@ diff -urN olddirectory directory >filename.patch
<BLOCKQUOTE><B>Note:</B>
-<P>Patches and files must conform to the standards outlined in the "<A HREF="#CODING">Coding Guidelines</A>" and "<A HREF="#MAKEFILES">Makefile Guidelines</A>" sections in this document. In addition, since Apple Inc. provides CUPS under multiple licenses, we require that you <A HREF="http://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">license</A> significant changes and files to us for inclusion in CUPS. The CUPS developers will inform you if licensing is required.</P></BLOCKQUOTE>
+<P>Patches and files must conform to the standards outlined in the "<A HREF="#CODING">Coding Guidelines</A>" and "<A HREF="#MAKEFILES">Makefile Guidelines</A>" sections in this document. In addition, since Apple Inc. provides CUPS under multiple licenses, we require that you <A HREF="https://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">license</A> significant changes and files to us for inclusion in CUPS. The CUPS developers will inform you if licensing is required.</P></BLOCKQUOTE>
<H2 CLASS="title"><A NAME="PRACTICES">Software Development Practices</A></H2>
@@ -151,6 +130,8 @@ MAJOR.MINORsvn-rREV
<A HREF="http://subversion.apache.org/" TARGET="_blank">subversion.apache.org</A>
</PRE>
+<p>A public read-only Git mirror is maintained for external developers. Details can be found on the CUPS.org <a href="https://www.cups.org/software.php">Software</a> page.</P>
+
<P>Source files are "checked in" with each change so that modifications can be tracked, and each checkin must reference any applicable STRs. The following format <em>must</em> be used for commit log messages:</P>
<PRE CLASS="command">
@@ -159,27 +140,7 @@ Summary of the change on one line followed by bug number (STR #NNNN)
Detailed list of changes.
</PRE>
-<P>Primary development occurs on the <var>trunk</var> branch, with changes merged back to release branches as needed. Table 2 shows the URLs developers use for the various CUPS sub-projects and branches:</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="CUPS Subversion URLs">
-<CAPTION>Table 2: CUPS Subversion URLs</CAPTION>
-<TR>
- <TH>URL</TH>
- <TH>Purpose</TH>
-</TR>
-<TR>
- <TD><A HREF="http://svn.cups.org/public/cups/trunk/">https://svn.cups.org/public/cups/trunk/</A></TD>
- <TD>Primary CUPS development branch</TD>
-</TR>
-<TR>
- <TD><A HREF="http://svn.cups.org/public/cups/branches/">https://svn.cups.org/public/cups/branches/</A></TD>
- <TD>CUPS maintenance branches (merge-only)</TD>
-</TR>
-<TR>
- <TD><A HREF="http://svn.cups.org/public/cups/tags/">https://svn.cups.org/public/cups/tags/</A></TD>
- <TD>CUPS release tags (read-only)</TD>
-</TR>
-</TABLE></DIV>
+<P>Primary development occurs on the <var>trunk</var> branch, with changes merged back to release branches as needed.</P>
<P>The branch for a MAJOR.MINOR release are created when the first production release (MAJOR.MINOR.0) is made using the name "branch-MAJOR.MINOR". Release tags are created for every beta, candidate, and production release using the name "release-MAJOR.MINORbNUMBER", "release-MAJOR.MINORrcNUMBER", or "release-MAJOR.MINOR.PATCH", respectively. No release tags are created for developer snapshots.</P>
@@ -193,7 +154,7 @@ Detailed list of changes.
<H3>Build System</H3>
-<P>The CUPS build system uses <A HREF="http://www.gnu.org/software/autoconf/">GNU autoconf</A> to tailor the library to the local operating system. Project files for the current release of Visual C++ are also provided for Microsoft Windows<SUP>&reg;</SUP>. To improve portability, makefiles must not make use of features unique to <A HREF="http://www.gnu.org/software/make/">GNU make</A>. See the <A HREF="#MAKEFILES">Makefile Guidelines</A> section for a description of the allowed make features and makefile guidelines.</P>
+<P>The CUPS build system uses <A HREF="http://www.gnu.org/software/autoconf/">GNU autoconf</A> to tailor the library to the local operating system. Project files for the current release of Microsoft Visual Studio are also provided for Microsoft Windows<SUP>&reg;</SUP>. To improve portability, makefiles must not make use of features unique to <A HREF="http://www.gnu.org/software/make/">GNU make</A>. See the <A HREF="#MAKEFILES">Makefile Guidelines</A> section for a description of the allowed make features and makefile guidelines.</P>
<P>Additional GNU build programs such as <A HREF="http://www.gnu.org/software/automake">GNU automake</A> and <A HREF="http://www.gnu.org/software/libtool">GNU libtool</A> must not be used. GNU automake produces non-portable makefiles which depend on GNU-specific extensions, and GNU libtool is not portable or reliable enough for CUPS.</P>
@@ -216,7 +177,7 @@ tools/makesrcdist <I>version</I>
rpmbuild -ta cups-<I>version</I>-source.tar.gz
</PRE>
-<P>The <VAR>cups.list</VAR> file is generated by the <VAR>configure</VAR> script and produces binary packages for many platforms using the <A HREF="http://www.epmhome.org/" TARGET="_blank">EPM</A> software. Table 3 shows the targets that are available for each type of binary package:</P>
+<P>The <VAR>cups.list</VAR> file is generated by the <VAR>configure</VAR> script and produces binary packages for many platforms using the <A HREF="https://www.msweet.org/projects.php?Z2" TARGET="_blank">EPM</A> software. Table 3 shows the targets that are available for each type of binary package:</P>
<DIV CLASS="table"><TABLE SUMMARY="Binary Package Targets">
<CAPTION>Table 3: Binary Package Targets</CAPTION>
@@ -225,10 +186,6 @@ rpmbuild -ta cups-<I>version</I>-source.tar.gz
<TH>Type of Package</TH>
</TR>
<TR>
- <TD>aix</TD>
- <TD>AIX installp</TD>
-</TR>
-<TR>
<TD>bsd</TD>
<TD>*BSD pkg_install</TD>
</TR>
@@ -237,18 +194,10 @@ rpmbuild -ta cups-<I>version</I>-source.tar.gz
<TD>Debian dpkg</TD>
</TR>
<TR>
- <TD>depot</TD>
- <TD>HP-UX swinstall</TD>
-</TR>
-<TR>
<TD>epm</TD>
<TD>Portable tarball with install script</TD>
</TR>
<TR>
- <TD>inst</TD>
- <TD>IRIX inst/tardist</TD>
-</TR>
-<TR>
<TD>pkg</TD>
<TD>Solaris pkgadd</TD>
</TR>
@@ -257,28 +206,16 @@ rpmbuild -ta cups-<I>version</I>-source.tar.gz
<TD>RPM binary</TD>
</TR>
<TR>
- <TD>setld</TD>
- <TD>Tru64 UNIX setld</TD>
-</TR>
-<TR>
<TD>slackware</TD>
<TD>Slackware install</TD>
</TR>
-<TR>
- <TD>swinstall</TD>
- <TD>HP-UX swinstall</TD>
-</TR>
-<TR>
- <TD>tardist</TD>
- <TD>IRIX inst/tardist</TD>
-</TR>
</TABLE></DIV>
<P>Finally, the <VAR>tools/testrpm</VAR> and <VAR>tools/testosx</VAR> scripts can be used to create binary packages from the current working copy for testing on Linux and OS X, respectively:</P>
<PRE CLASS="command">
tools/testrpm
-sudo rpm -U /usr/src/redhat/RPMS/i386/cups*.rpm
+sudo rpm -U /usr/src/redhat/RPMS/{arm,i386,x64_64}/cups*.rpm
sudo tools/testosx
open cups.pkg
@@ -298,7 +235,7 @@ make test
<H2 CLASS="title"><A NAME="STR">Trouble Report Processing</A></H2>
-<P>A Software Trouble Report ("STR") must be submitted every time a user or vendor experiences a problem with the CUPS software. Trouble reports are maintained on the <A HREF="http://www.cups.org/str.php" TARGET="_blank">Bugs &amp; Features</A> page with one of the following states:</P>
+<P>A Software Trouble Report ("STR") must be submitted every time a user or vendor experiences a problem with the CUPS software. Trouble reports are maintained on the <A HREF="https://www.cups.org/str.php" TARGET="_blank">Bugs</A> page with one of the following states:</P>
<OL>
@@ -415,34 +352,28 @@ make test
<P>The ".cxx" extension is used because it is the only common C++ extension between Linux, OS X, UNIX, and Windows.</P></BLOCKQUOTE>
-<P>The top of each source file contains a header giving the name of the file, the purpose or nature of the source file, the copyright and licensing notice, and the functions contained in the file. The file name and revision information is provided by the Subversion "&#36;Id$" tag:</P>
+<P>The top of each source file contains a header giving the name of the file, the purpose or nature of the source file, and the copyright and licensing notice. The file name and revision information is provided by the Subversion "&#36;Id$" tag:</P>
<PRE CLASS="command">
/*
* "&#36;Id$"
*
- * Description of file contents.
+ * Description of file contents.
*
- * Copyright 2012 by Apple Inc.
+ * Copyright 2013 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * function1() - Description 1.
- * function2() - Description 2.
- * function3() - Description 3.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
</PRE>
<P>For source files that are subject to the Apple OS-Developed Software exception, the following additional comment appears after the contact information:</P>
<PRE CLASS="command">
- * This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
</PRE>
<P>The bottom of each source file contains a trailer giving the name of the file using the Subversion "&#36;Id$" tag. The primary purpose of this is to mark the end of a source file; if the trailer is missing it is possible that code has been lost near the end of the file:</P>
@@ -454,6 +385,17 @@ make test
</PRE>
+<H3>Header Files</H3>
+
+<P>All public header files must include the <var>versioning.h</var> header file, or a header that does so. Function declarations are then "decorated" with the correct <tt>_CUPS_API_major_minor</tt> macro to define its availability based on the build environment, for example:</p>
+
+<PRE CLASS="command">
+extern int cupsDoThis(int foo, int bar) _CUPS_API_2_0;
+</PRE>
+
+<P>Private API header files must be named with the suffix "-private", for example the <var>cups.h</var> header file defines all of the public CUPS APIs while the <var>cups-private.h</var> header file defines all of the private CUPS APIs as well. Typically a private API header file will include the corresponding public API header file.</P>
+
+
<H3>Comments</H3>
<P>All source code utilizes block comments within functions to describe the operations being performed by a group of statements; avoid putting a comment per line unless absolutely necessary, and then consider refactoring the code so that it is not necessary. C source files use the block comment format ("/* comment */") since many vendor C compilers still do not support C99/C++ comments ("// comment"):</P>
@@ -645,15 +587,15 @@ enum
#
# "&#36;Id$"
#
-# Makefile for ...
+# Makefile for ...
#
-# Copyright 2012 by Apple Inc.
+# Copyright 2013 by Apple Inc.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
</PRE>
@@ -889,7 +831,7 @@ libname.a: $(OBJECTS)
<H3>Shared Libraries</H3>
-<P>Shared libraries have a prefix of "lib" and the extension ".dylib", ".sl", ".so", or "_s.a" depending on the operating system. A typical shared library is composed of several targets that look like:</P>
+<P>Shared libraries have a prefix of "lib" and the extension ".dylib" or ".so" depending on the operating system. A typical shared library is composed of several targets that look like:</P>
<PRE CLASS="command">
libname.so: $(OBJECTS)
@@ -899,13 +841,6 @@ libname.so: $(OBJECTS)
&rarr; $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR)
&rarr; $(LN) libname.so.$(DSOVERSION) libname.so
-libname.sl: $(OBJECTS)
-&rarr; echo $(DSOCOMMAND) libname.sl.$(DSOVERSION) ...
-&rarr; $(DSOCOMMAND) libname.sl.$(DSOVERSION) $(OBJECTS)
-&rarr; $(RM) libname.sl libname.sl.$(DSOMAJOR)
-&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl.$(DSOMAJOR)
-&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl
-
libname.dylib: $(OBJECTS)
&rarr; echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ...
&rarr; $(DSOCOMMAND) libname.$(DSOVERSION).dylib \
@@ -917,14 +852,6 @@ libname.dylib: $(OBJECTS)
&rarr; $(RM) libname.$(DSOMAJOR).dylib
&rarr; $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib
&rarr; $(LN) libname.$(DSOVERSION).dylib libname.dylib
-
-libname_s.a: $(OBJECTS)
-&rarr; echo $(DSOCOMMAND) libname_s.o ...
-&rarr; $(DSOCOMMAND) libname_s.o $(OBJECTS) $(LIBS)
-&rarr; echo $(LIBCOMMAND) libname_s.a libname_s.o
-&rarr; $(RM) $@
-&rarr; $(LIBCOMMAND) libname_s.a libname_s.o
-&rarr; $(CHMOD) +x libname_s.a
</PRE>
diff --git a/doc/help/spec-design.html b/doc/help/spec-design.html
index 28a14eb..76cbd9c 100644
--- a/doc/help/spec-design.html
+++ b/doc/help/spec-design.html
@@ -31,7 +31,7 @@ WIDTH="768" HEIGHT="768" ALT="CUPS Block Diagram"></TD></TR>
<H4>Config Files</H4>
-<P>The scheduler uses several configuration files to store the server settings (<A HREF="ref-cupsd-conf.html">cupsd.conf</A>), available classes (<A HREF="ref-classes-conf.html">classes.conf</A>), available printers (<A HREF="ref-printers-conf.html">printers.conf</A>), current notification subscriptions (<A HREF="ref-subscriptions-conf.html">subscriptions.conf</A>), and supported file types and filters (<A HREF="man-mime.types.html">mime.types</A>, <A HREF="man-mime.convs.html">mime.convs</A>). In addition, PostScript Printer Description ("PPD") files or interface scripts are associated with each printer, and the scheduler has cache files for remote printers, PPD files, and current jobs to optimize the scheduler's startup speed and availability.</P>
+<P>The scheduler uses several configuration files to store the server settings (<A HREF="man-cupsd.conf.html">cupsd.conf</A>), available classes (<A HREF="man-classes.conf.html">classes.conf</A>), available printers (<A HREF="man-printers.conf.html">printers.conf</A>), current notification subscriptions (<A HREF="man-subscriptions.conf.html">subscriptions.conf</A>), and supported file types and filters (<A HREF="man-mime.types.html">mime.types</A>, <A HREF="man-mime.convs.html">mime.convs</A>). In addition, PostScript Printer Description ("PPD") files or interface scripts are associated with each printer, and the scheduler has cache files for remote printers, PPD files, and current jobs to optimize the scheduler's startup speed and availability.</P>
<H4>Job Files</H4>
@@ -41,8 +41,8 @@ WIDTH="768" HEIGHT="768" ALT="CUPS Block Diagram"></TD></TR>
<H4>Log Files</H4>
-<P>The scheduler keeps three kinds of log files which are normally stored in the <VAR>/var/log/cups</VAR> directory. The <A HREF="ref-access_log.html">access_log</A> file lists every HTTP and IPP request that is processed by the scheduler. The <A HREF="ref-error_log.html">error_log</A> file contains messages from the scheduler and its helper applications that can be used
-to track down problems. The <A HREF="ref-page_log.html">page_log</A> file lists every page that is printed, allowing for simple print accounting.</P>
+<P>The scheduler keeps three kinds of log files which are normally stored in the <VAR>/var/log/cups</VAR> directory. The <A HREF="man-cupsd-logs.html">access_log</A> file lists every HTTP and IPP request that is processed by the scheduler. The <A HREF="man-cupsd-logs.html">error_log</A> file contains messages from the scheduler and its helper applications that can be used
+to track down problems. The <A HREF="man-cupsd-logs.html">page_log</A> file lists every page that is printed, allowing for simple print accounting.</P>
<P>Log files are rotated automatically by the scheduler when they reach the configured size limit, by default 1MB. If the limit is set to 0 then no rotation is performed in the scheduler - this mode is often used by Linux distributions so they can use the <B>logrotated(8)</B> program to rotate them instead.</P>
@@ -148,7 +148,7 @@ CUPS_SERVERBIN/notifier/foo recipient user-data
<P>Backends (<A HREF="man-backend.html">backend(7)</A>) send print data to the printer and enumerate available printers/devices as needed. Backends use the same interface as filters.</P>
-<P>CUPS includes backends for AppSocket (JetDirect), IPP, LPD, parallel, SCSI, serial, and USB connections. Additional backends can be added as needed without additional configuration.</P>
+<P>CUPS includes backends for AppSocket (JetDirect), IPP, LPD, and USB connections and DNS-SD and SNMP for discovery. Additional backends can be added as needed without additional configuration.</P>
<H2 CLASS="title"><A NAME="PROGRAMMING">Programming Interfaces</A></H2>
diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html
index e06270c..3a9fd6c 100644
--- a/doc/help/spec-ipp.html
+++ b/doc/help/spec-ipp.html
@@ -12,7 +12,7 @@
CUPS IPP specification for CUPS.
- Copyright 2007-2012 by Apple Inc.
+ Copyright 2007-2013 by Apple Inc.
Copyright 1997-2007 by Easy Software Products.
These coded instructions, statements, and computer programs are the
@@ -369,7 +369,8 @@ Print-Job request:
<dd>The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute.
- <dt>"job-billing" (text(MAX)):<span class='info'>CUPS 1.1</span>
+ <dt>"job-billing" (text(MAX))<span class='info'>CUPS 1.1</span> or
+ "job-account-id (text(MAX))"<span class='info'>CUPS 1.7</span>:
<dd>The client OPTIONALLY supplies a billing string that is logged
with the page accounting information.
@@ -476,7 +477,8 @@ Create-Job request:
<dd>The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute.
- <dt>"job-billing" (text(MAX)):<span class='info'>CUPS 1.1</span>
+ <dt>"job-billing" (text(MAX))<span class='info'>CUPS 1.1</span> or
+ "job-account-id (text(MAX))<span class='info'>CUPS 1.7</span>:
<dd>The client OPTIONALLY supplies a billing string that is logged
with the page accounting information.
@@ -2169,6 +2171,12 @@ document (fit-to-page=false). The default value is false.
<p>The job-billing attribute provides a text value to associate with a job
for billing purposes.
+<blockquote><b>Note:</b> This attribute has been superceded by the "job-account-id" attribute defined in PWG 5100.11: Job and Printer Extensions - Set 2.</blockquote>
+
+<h4><a name="job-cancel-after">job-cancel-after (integer(1:MAX))</a><span class='info'>CUPS 2.0</span></h4>
+
+<p>The job-cancel-after attribute provides the maximum number of seconds that are allowed for processing a job.</p>
+
<h4><a name="job-hold-until">job-hold-until (keyword | name(MAX))</a><span class='info'>CUPS 1.1</span></h4>
<p>The job-hold-until attribute specifies a hold time. In addition to the
diff --git a/doc/help/spec-pdf.html b/doc/help/spec-pdf.html
index 407f478..7276c90 100644
--- a/doc/help/spec-pdf.html
+++ b/doc/help/spec-pdf.html
@@ -9,16 +9,7 @@
<H1 CLASS="title">CUPS PDF Format</H1>
-<P>CUPS PDF files (application/vnd.cups-pdf) are device-dependent
-PDF/A files that contain a job ticket information. These files
-are typically produced by the CUPS <CODE>pdftopdf</CODE> filter
-which handles job ticket generation, imposition, page labeling,
-scaling, and other formatting options requested by the user. CUPS
-PDF files are intended for direct consumption by a PDF-capable
-printer, PDF RIP, or the <CODE>pdftops</CODE> filter.</P>
-
-<P>More information will be posted here as the PDF workflow
-filters are added to CUPS.</P>
+<P>CUPS PDF files (application/vnd.cups-pdf) are device-dependent PDF files that contain a job ticket information.</P>
</BODY>
</HTML>
diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html
index 75a927f..58c50f7 100644
--- a/doc/help/spec-ppd.html
+++ b/doc/help/spec-ppd.html
@@ -38,7 +38,19 @@ P.example {
font-style: italic;
margin-left: 36pt;
}
-
+
+DL.man DD {
+ margin-left: 5em;
+}
+
+DL.man DT {
+ margin-left: 0;
+}
+
+PRE.man {
+ margin: 0;
+}
+
PRE.example {
background: #eeeeee;
border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
}
A:link, A:visited {
- font-weight: normal;
+ font-weight: inherit;
text-decoration: none;
}
@@ -410,7 +422,11 @@ div.contents ul.subcontents li {
<li><a href="#cupsIPPFinishings">cupsIPPFinishings</a></li>
<li><a href="#cupsIPPReason">cupsIPPReason</a></li>
<li><a href="#cupsIPPSupplies">cupsIPPSupplies</a></li>
+ <li><a href="#cupsJobAccountId">cupsJobAccountId</a></li>
+ <li><a href="#cupsJobAccountingUserId">cupsJobAccountingUserId</a></li>
+ <li><a href="#cupsJobPassword">cupsJobPassword</a></li>
<li><a href="#cupsLanguages">cupsLanguages</a></li>
+ <li><a href="#cupsMandatory">cupsMandatory</a></li>
<li><a href="#cupsManualCopies">cupsManualCopies</a></li>
<li><a href="#cupsMarkerName">cupsMarkerName</a></li>
<li><a href="#cupsMarkerNotice">cupsMarkerNotice</a></li>
@@ -1706,6 +1722,49 @@ http://www.vendor.com/help"
*cupsIPPSupplies: False
</pre>
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountId'>cupsJobAccountId</a></h3>
+
+<p class='summary'>*cupsJobAccountId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-account-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-account-id IPP attribute.</em>
+*cupsJobAccountId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountingUserId'>cupsJobAccountingUserId</a></h3>
+
+<p class='summary'>*cupsJobAccountingUserId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-accounting-user-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-accounting-user-id IPP attribute.</em>
+*cupsJobAccountingUserId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobPassword'>cupsJobPassword</a></h3>
+
+<p class='summary'>*cupsJobPassword: "format"</p>
+
+<p>This keyword defines the format of the job-password IPP attribute, if supported by the printer. Currently the only supported format is "1111" indicating a 4-digit PIN code.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer supports 4-digit PIN codes.</em>
+*cupsJobPassword: "1111"
+</pre>
+
+
<h3><span class='info'>CUPS 1.2/OS X 10.5</span><a name='cupsLanguages'>cupsLanguages</a></h3>
<p class='summary'>*cupsLanguages: "locale list"</p>
@@ -1721,6 +1780,21 @@ list of locale names ("en", "en_US", "fr_CA", etc.)</p>
*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
</pre>
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsMandatory'>cupsMandatory</a></h3>
+
+<p class='summary'>*cupsMandatory: "attribute1 attribute2 ... attributeN"</p>
+
+<p>This keyword defines a list of IPP attributes that must be provided when submitting a print job creation request.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify that the user must supply a job-password</em>
+*cupsMandatory: "job-password job-password-encryption"
+</pre>
+
+
<h3><a name='cupsManualCopies'>cupsManualCopies</a></h3>
<p class='summary'>*cupsManualCopies: boolean</p>
@@ -1953,7 +2027,7 @@ PPD file extensions was used. Currently it must be the string
<p class="summary">*JCLToPDFInterpreter: "JCL"</p>
-<p>This keyword provfides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
+<p>This keyword provides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
<p>Example:</p>
@@ -2249,6 +2323,18 @@ the device.</p>
<h2 class='title'><a name='HISTORY'>Change History</a></h2>
+<h3>Changes in CUPS 1.7</h3>
+
+<ul>
+
+ <li>Added <a href="#cupsJobAccountId"><tt>cupsJobAccountId</tt></a>,
+ <a href="#cupsJobAccountingUserId"><tt>cupsJobAccountingUserId</tt></a>,
+ <a href="#cupsJobPassword"><tt>cupsJobPassword</tt></a>,
+ <a href="#cupsMandatory"><tt>cupsMandatory</tt></a> keywords.</li>
+
+</ul>
+
+
<h3>Changes in CUPS 1.6</h3>
<ul>
diff --git a/doc/help/standard.html.in b/doc/help/standard.html.in
deleted file mode 100644
index f957fe2..0000000
--- a/doc/help/standard.html.in
+++ /dev/null
@@ -1,181 +0,0 @@
-<HTML>
-<!-- SECTION: Getting Started -->
-<HEAD>
- <TITLE>Standard Configuration</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">Standard Configuration</H1>
-
-<P>This document describes the standard configuration for this CUPS
-server.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<!-- Packagers: Change the following statement and the following sections
- if you make any changes to the standard CUPS distribution that are
- not automatically updated by the configure script. -->
-<P>This file reflects the standard CUPS configuration as distributed
-by Apple Inc, the developer of CUPS.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="CUPSD">cupsd Configuration</A></H2>
-
-<P><CODE>cupsd(8)</CODE> is configured by default to show
-printers shared by other systems and only allow local access to
-the system and its printers. Administration operations require
-Basic authentication with membership in the group
-"@CUPS_GROUP@".</P>
-
-<P>Connections are accepted via domain socket
-(<VAR>@CUPS_DEFAULT_DOMAINSOCKET@</VAR>) or "localhost"
-(127.0.0.1).</P>
-
-<H3><A NAME="SETTINGS">Settings</A></H3>
-
-<DIV CLASS="table"><TABLE SUMMARY="Default Values">
-<CAPTION>Table 1: Default Values</CAPTION>
-<TR>
- <TH>Directive</TH>
- <TH>Value</TH>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#Browsing">Browsing</A></CODE></TD>
- <TD><CODE>@CUPS_BROWSING@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseLocalProtocols">BrowseLocalProtocols</A></CODE></TD>
- <TD><CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseRemoteProtocols">BrowseRemoteProtocols</A></CODE></TD>
- <TD><CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseShortNames">BrowseShortNames</A></CODE></TD>
- <TD><CODE>@CUPS_BROWSE_SHORT_NAMES@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#ConfigFilePerm">ConfigFilePerm</A></CODE></TD>
- <TD><CODE>@CUPS_CONFIG_FILE_PERM@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#DefaultShared">DefaultShared</A></CODE></TD>
- <TD><CODE>@CUPS_DEFAULT_SHARED@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#ImplicitClasses">ImplicitClasses</A></CODE></TD>
- <TD><CODE>@CUPS_IMPLICIT_CLASSES@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#LogFilePerm">LogFilePerm</A></CODE></TD>
- <TD><CODE>@CUPS_LOG_FILE_PERM@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#MaxCopies">MaxCopies</A></CODE></TD>
- <TD><CODE>@CUPS_MAX_COPIES@</CODE></TD>
-</TR>
-<TR>
- <TD><CODE><A HREF="ref-cupsd-conf.html#UseNetworkDefault">UseNetworkDefault</A></CODE></TD>
- <TD><CODE>@CUPS_USE_NETWORK_DEFAULT@</CODE></TD>
-</TR>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><A NAME="DIRECTORIES">Directories</A></H2>
-
-<DIV CLASS="table"><TABLE SUMMARY="Directories">
-<CAPTION>Table 2: Directories</CAPTION>
-<TR>
- <TH>Directory</TH>
- <TH>Purpose</TH>
-</TR>
-<TR>
- <TD><VAR>@CUPS_SERVERROOT@</VAR></TD>
- <TD>The location of configuration files such as
- <VAR>printers.conf</VAR>. Overridden by the <A
- HREF="ref-cupsd-conf.html#ServerRoot"><CODE>ServerRoot</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@bindir@</VAR></TD>
- <TD>The location of user programs.</TD>
-</TR>
-<TR>
- <TD><VAR>@includedir@</VAR></TD>
- <TD>The location of CUPS include files.</TD>
-</TR>
-<TR>
- <TD><VAR>@libdir@</VAR></TD>
- <TD>The location of CUPS library files.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_SERVERBIN@</VAR></TD>
- <TD>The location of server programs such as backends and
- filters. Overridden by the <A
- HREF="ref-cupsd-conf.html#ServerBin"><CODE>ServerBin</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@sbindir@</VAR></TD>
- <TD>The location of administrator programs.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_DATADIR@</VAR></TD>
- <TD>The location of data files such as fonts. Overridden
- by the <A
- HREF="ref-cupsd-conf.html#DataDir"><CODE>DataDir</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_DOCROOT@</VAR></TD>
- <TD>The location of documentation files. Overridden by
- the <A
- HREF="ref-cupsd-conf.html#DocumentRoot"><CODE>DocumentRoot</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_LOCALEDIR@</VAR></TD>
- <TD>The location of localization files.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_CACHEDIR@</VAR></TD>
- <TD>The location of cache files such as
- <VAR>ppds.dat</VAR> and <VAR>remote.cache</VAR>.
- Overridden by the <A
- HREF="ref-cupsd-conf.html#CacheDir"><CODE>CacheDir</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_LOGDIR@</VAR></TD>
- <TD>The location of the <VAR>access_log</VAR>,
- <VAR>error_log</VAR>, and <VAR>page_log</VAR> files.
- Overridden by the <A
- HREF="ref-cupsd-conf.html#AccessLog"><CODE>AccessLog</CODE></A>,
- <A
- HREF="ref-cupsd-conf.html#ErrorLog"><CODE>ErrorLog</CODE></A>,
- <A
- HREF="ref-cupsd-conf.html#PageLog"><CODE>PageLog</CODE></A>,
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_STATEDIR@</VAR></TD>
- <TD>The location of the domain socket file and state data
- such as authentication certificates. Overridden by the <A
- HREF="ref-cupsd-conf.html#StateDir"><CODE>StateDir</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
- <TD><VAR>@CUPS_REQUESTS@</VAR></TD>
- <TD>The location of spooled print jobs. Overridden by the
- <A
- HREF="ref-cupsd-conf.html#RequestRoot"><CODE>RequestRoot</CODE></A>
- directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-</TABLE></DIV>
-
-</BODY>
-</HTML>
diff --git a/doc/help/whatsnew.html b/doc/help/whatsnew.html
deleted file mode 100644
index 1d77c67..0000000
--- a/doc/help/whatsnew.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<HTML>
-<!-- SECTION: Getting Started -->
-<HEAD>
- <TITLE>What's New in CUPS 1.6</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">What's New in CUPS 1.6</H1>
-
-<P>CUPS 1.6 provides many changes and new features to CUPS 1.5.x. This page provides a high-level outline of these changes. If you have never used CUPS before, read the <A HREF="overview.html">"Overview of CUPS"</A> document instead.</P>
-
-<H2 CLASS="title"><A NAME="COMMANDS">General</A></H2>
-
-<OL START="1">
-
- <LI><EM>Bonjour Support;</EM> Bonjour printer sharing and discovery is now also supported using Avahi.</LI>
-
- <LI><EM>Color Management;</EM> ICC profiles referenced by PPD files are now registered on systems with D-BUS and colord installed.</LI>
-
- <LI><EM>Default Username;</EM> CUPS now supports the <CODE>CUPS_USER</CODE> environment variable and <CODE>User</CODE> directive in the <VAR>client.conf</VAR> file to override the default username.</LI>
-
- <LI><EM>Open Printing Filters;</EM> The parallel and serial backends, php_cups scripting module, and bannertops, commandtoescpx, commandtopclx, imagetops, imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops filters are now provided as part of a separate cups-filters project hosted by the Linux Foundation.</LI>
-
- <LI><EM>Passwords;</EM> Passwords up to 127 characters are now supported.</LI>
-
- <LI><EM>Printer Options;</EM> The "brightness", "columns", "fitplot", "gamma", "hue", "natural-scaling", "penwidth", "position", "ppi", "saturation", and "scaling" options are not longer supported by CUPS directly, while the "page-bottom", "page-left", "page-right", "page-top", "prettyprint", and "wrap" options have been deprecated.</LI>
-
-</OL>
-
-
-<H2 CLASS="title"><A NAME="SCHEDULER">Scheduler</A></H2>
-
-<OL START="7">
-
- <LI><EM>Authentication;</EM> The scheduler now supports a <CODE>DefaultAuthType</CODE> value of <CODE>auto</CODE> which automatically chooses between Basic (username/password) and Negotiate (Kerberos) authentication.</LI>
-
- <LI><EM>IPP Conformance;</EM> The scheduler now correctly reports the "number-of-documents" attribute for jobs and fully conforms to the latest IPP/2.1 test suite.</LI>
-
- <LI><EM>Permissions;</EM> Filters and backends may no longer have group write permissions enabled.</LI>
-
- <LI><EM>PPD Files;</EM> PPD files can now be packaged and installed as compressed tar files to reduce the amount of disk space required. Dynamic PPD updates are now also consolidated so that a printer's PPD file is updated once at the end of a job.</LI>
-
- <LI><EM>Sharing Protocols;</EM> The scheduler no longer supports the CUPS, LDAP, or SLP protocols for printer sharing.</LI>
-
- <LI><EM>Time-Based Job Limits;</EM> New <CODE>MaxHoldTime</CODE> and <CODE>MaxJobTime</CODE> directives, combined with support for time values in the <CODE>PreserveJobFiles</CODE> and <CODE>PreserveJobHistory</CODE> directives, allow administrators to define time-based job limits and behaviors.</LI>
-
-</OL>
-
-
-<H2 CLASS="title"><A NAME="CUPSAPI">CUPS API</A></H2>
-
-<OL START="13">
-
- <LI><EM>Destination-Based Printing;</EM> Inspired by IPP Everywhere, new dynamic destination-based APIs allow applications to discover, query, and use both shared and network printers directly and display localized user interfaces with full conflict resolution without static configuration files. These APIs provide equivalent functionality offered by PPD-based printer drivers without the disadvantages of static configuration files.</LI>
-
- <LI><EM>IPP;</EM> IPP requests now default to protocol version 2.0, and the <CODE>ipp_t</CODE> and <CODE>ipp_value_t</CODE> structures are now private by default. New software should be developed using the corresponding accessor functions instead of directly accessing these structures.</LI>
-
- <LI><EM>PPD;</EM> The PPD functions are now officially deprecated in favor of the new destination-based printing APIs.</LI>
-
- <LI><EM>SNMP Support;</EM> The <CODE>cupsSideChannelSNMPGet</CODE> and <CODE>cupsSideChannelSNMPWalk</CODE> functions now support OIDs and values up to 64k in length.</LI>
-
-</OL>
-
-</BODY>
-</HTML>
diff --git a/doc/images/generic.png b/doc/images/generic.png
new file mode 100644
index 0000000..08430fc
--- /dev/null
+++ b/doc/images/generic.png
Binary files differ
diff --git a/doc/index.html.in b/doc/index.html.in
index 5838144..8ec1d2f 100644
--- a/doc/index.html.in
+++ b/doc/index.html.in
@@ -1,107 +1,55 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/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="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Home&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Online&nbsp;Help&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Jobs&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Printers&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS is the standards-based, open source printing system developed by
-<A HREF="http://www.apple.com/">Apple Inc.</A> for OS<SUP>&reg;</SUP> X and
-other UNIX<SUP>&reg;</SUP>-like operating systems.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS for Users</H2>
-
-<P><A HREF="help/overview.html">Overview of CUPS</A></P>
-
-<P><A HREF="help/options.html">Command-Line Printing and Options</A></P>
-
-<P><A HREF="help/whatsnew.html">What's New in CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">User Forum</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS for Administrators</H2>
-
-<P><A HREF="admin">Adding Printers and Classes</A></P>
-
-<P><A HREF="help/policies.html">Managing Operation Policies</A></P>
-
-<P><A HREF="help/accounting.html">Printer Accounting Basics</A></P>
-
-<P><A HREF="help/security.html">Server Security</A></P>
-
-<P><A HREF="help/kerberos.html">Using Kerberos Authentication</A></P>
-
-<P><A HREF="help/network.html">Using Network Printers</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">cupsd.conf Reference</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Find Printer Drivers</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS for Developers</H2>
-
-<P><A HREF="help/api-overview.html">Introduction to CUPS Programming</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API</A></P>
-
-<P><A HREF="help/api-filter.html">Filter and Backend Programming</A></P>
-
-<P><A HREF="help/api-httpipp.html">HTTP and IPP APIs</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API</A></P>
-
-<P><A HREF="help/api-raster.html">Raster API</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD Compiler Driver Information File Reference</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Developer Forum</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> Copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <title>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body>
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a class="active" href="/">Home</a></li>
+ <li><a href="/admin">Administration</a></li>
+ <li><a href="/classes/">Classes</a></li>
+ <li><a href="/help/">Help</a></li>
+ <li><a href="/jobs/">Jobs</a></li>
+ <li><a href="/printers/">Printers</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>CUPS @CUPS_VERSION@</h1>
+ <p>CUPS is the standards-based, open source printing system developed by <a href="http://www.apple.com/">Apple Inc.</a> for OS X<sup>&reg;</sup> and other UNIX<sup>&reg;</sup>-like operating systems.</p>
+ </div>
+ <div class="row">
+ <div class="thirds">
+ <h2>CUPS for Users</h2>
+ <p><a href="help/overview.html">Overview of CUPS</a></p>
+ <p><a href="help/options.html">Command-Line Printing and Options</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups">User Forum</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS for Administrators</h2>
+ <p><a href="admin">Adding Printers and Classes</a></p>
+ <p><a href="help/policies.html">Managing Operation Policies</a></p>
+ <p><a href="help/network.html">Using Network Printers</a></p>
+ <p><a href="help/man-cupsd.conf.html">cupsd.conf Reference</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS for Developers</h2>
+ <p><a href="help/api-overview.html">Introduction to CUPS Programming</a></p>
+ <p><a href="help/api-cups.html">CUPS API</a></p>
+ <p><a href="help/api-filter.html">Filter and Backend Programming</a></p>
+ <p><a href="help/api-httpipp.html">HTTP and IPP APIs</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">Developer Forum</a></p>
+ </div>
+ </div>
+ </div>
+ <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+ </body>
+</html>
diff --git a/doc/ja/index.html.in b/doc/ja/index.html.in
index e62d8f1..61e9d08 100644
--- a/doc/ja/index.html.in
+++ b/doc/ja/index.html.in
@@ -1,107 +1,55 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>ホーム - CUPS 1.6</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;ホーム&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;管ç†&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;クラス&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;ヘルプ&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;ジョブ&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;プリンター&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS ã¯ã€OS<SUP>&reg;</SUP> X ãŠã‚ˆã³ãã®ä»–ã® UNIX <SUP>&reg;</SUP> ç³» OS ã®ãŸã‚ã«ã€
-<A HREF="http://www.apple.com/">Apple Inc.</A>
-ã«ã‚ˆã£ã¦é–‹ç™ºã•ã‚ŒãŸæ¨™æº–ベースã®ã‚ªãƒ¼ãƒ—ンソースå°åˆ·ã‚·ã‚¹ãƒ†ãƒ ã§ã™ã€‚</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>ユーザーå‘ã‘</H2>
-
-<P><A HREF="help/overview.html">CUPS ã®æ¦‚è¦</A></P>
-
-<P><A HREF="help/options.html">コマンドラインã‹ã‚‰ã®å°åˆ·ã¨ã‚ªãƒ—ション</A></P>
-
-<P><A HREF="help/whatsnew.html">CUPS 1.6 ã®æ–°æ©Ÿèƒ½</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">ユーザーフォーラム</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>管ç†è€…å‘ã‘</H2>
-
-<P><A HREF="admin">プリンターã¨ã‚¯ãƒ©ã‚¹ã®è¿½åŠ </A></P>
-
-<P><A HREF="help/policies.html">æ“作ãƒãƒªã‚·ãƒ¼ã®ç®¡ç†ã«ã¤ã„ã¦</A></P>
-
-<P><A HREF="help/accounting.html">プリンターアカウンティングã®åŸºæœ¬</A></P>
-
-<P><A HREF="help/security.html">サーãƒãƒ¼ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼</A></P>
-
-<P><A HREF="help/kerberos.html">Kerberos èªè¨¼ã®ä½¿ã„æ–¹</A></P>
-
-<P><A HREF="help/network.html">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—リンターã®ä½¿ã„æ–¹</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">cupsd.conf リファレンス</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">プリンタードライãƒãƒ¼ã®æ¤œç´¢</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>開発者å‘ã‘</H2>
-
-<P><A HREF="help/api-overview.html">CUPS プログラミングã®ã‚¤ãƒ³ãƒˆãƒ­ãƒ€ã‚¯ã‚·ãƒ§ãƒ³</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API</A></P>
-
-<P><A HREF="help/api-filter.html">フィルタã¨ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ãƒ—ログラミング</A></P>
-
-<P><A HREF="help/api-httpipp.html">HTTP 㨠IPP 㮠API</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API</A></P>
-
-<P><A HREF="help/api-raster.html">ラスター API</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD コンパイラー用ドライãƒãƒ¼æƒ…報ファイル リファレンス</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">開発者フォーラム</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS is copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <title>ホーム - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body>
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a class="active" href="/">ホーム</a></li>
+ <li><a href="/admin">管ç†</a></li>
+ <li><a href="/classes/">クラス</a></li>
+ <li><a href="/help/">ヘルプ</a></li>
+ <li><a href="/jobs/">ジョブ</a></li>
+ <li><a href="/printers/">プリンター</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>CUPS @CUPS_VERSION@</h1>
+ <p>CUPS ã¯ã€OS X<sup>&reg;</sup> ãŠã‚ˆã³ãã®ä»–ã® UNIX <SUP>&reg;</sup> ç³» OS ã®ãŸã‚ã«ã€<a href="http://www.apple.com/">Apple Inc.</a> ã«ã‚ˆã£ã¦é–‹ç™ºã•ã‚ŒãŸæ¨™æº–ベースã®ã‚ªãƒ¼ãƒ—ンソースå°åˆ·ã‚·ã‚¹ãƒ†ãƒ ã§ã™ã€‚</p>
+ </div>
+ <div class="row">
+ <div class="thirds">
+ <h2>CUPS ユーザーå‘ã‘</h2>
+ <p><a href="help/overview.html">CUPS ã®æ¦‚è¦</a></p>
+ <p><a href="help/options.html">コマンドラインã‹ã‚‰ã®å°åˆ·ã¨ã‚ªãƒ—ション</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups">ユーザーフォーラム</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS 管ç†è€…å‘ã‘</h2>
+ <p><a href="admin">プリンターã¨ã‚¯ãƒ©ã‚¹ã®è¿½åŠ </a></p>
+ <p><a href="help/policies.html">æ“作ãƒãƒªã‚·ãƒ¼ã®ç®¡ç†</a></p>
+ <p><a href="help/network.html">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—リンターã®ä½¿ã„æ–¹</a></p>
+ <p><a href="help/man-cupsd.conf.html">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—リンターã®ä½¿ã„æ–¹</a></p>
+ </div>
+ <div class="thirds">
+ <h2>CUPS 開発者å‘ã‘</h2>
+ <p><a href="help/api-overview.html">CUPS プログラミングã®å°Žå…¥</a></p>
+ <p><a href="help/api-cups.html">CUPS API</a></p>
+ <p><a href="help/api-filter.html">フィルタã¨ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ãƒ—ログラミング</a></p>
+ <p><a href="help/api-httpipp.html">HTTP 㨠IPP 㮠API</a></p>
+ <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">開発者フォーラム</a></p>
+ </div>
+ </div>
+ </div>
+ <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+ </body>
+</html>
diff --git a/doc/ru/index.html.in b/doc/ru/index.html.in
index d1300e1..ccbfdde 100644
--- a/doc/ru/index.html.in
+++ b/doc/ru/index.html.in
@@ -1,103 +1,56 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>Ðачало - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Ðачало&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;ÐдминиÑтрирование&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Группы&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Справка&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;ЗаданиÑ&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Принтеры&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS — Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтво Ñтандартов, ÑÐ²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ð¿Ð¾Ð´ÑиÑтема печати, Ñ€Ð°Ð·Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ <A HREF="http://www.apple.com/">Apple Inc.</A> Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ ÑиÑтемы Mac OS<SUP>&reg;</SUP> X и других UNIX<SUP>&reg;</SUP>-подобных операционных ÑиÑтем.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹</H2>
-
-<P><A HREF="help/overview.html">Введение в CUPS</A></P>
-
-<P><A HREF="help/options.html">Печать из командной Ñтроки</A></P>
-
-<P><A HREF="help/whatsnew.html">Что нового в CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Форум пользователей</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов</H2>
-
-<P><A HREF="admin">Добавление принтеров и групп</A></P>
-
-<P><A HREF="help/policies.html">Управление доÑтупом</A></P>
-
-<P><A HREF="help/accounting.html">ИÑпользование реÑурÑов</A></P>
-
-<P><A HREF="help/security.html">БезопаÑноÑÑ‚ÑŒ ÑиÑтемы</A></P>
-
-<P><A HREF="help/kerberos.html">ИÑпользование аутентификации Kerberos</A></P>
-
-<P><A HREF="help/network.html">ИÑпользование Ñетевых принтеров</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Справочник по cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">ПоиÑк драйверов принтера</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²</H2>
-
-<P><A HREF="help/api-overview.html">Введение в разработку CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API</A></P>
-
-<P><A HREF="help/api-filter.html">Разработка фильтров и модулей</A></P>
-
-<P><A HREF="help/api-httpipp.html">API доÑтупа по HTTP и IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API</A></P>
-
-<P><A HREF="help/api-raster.html">Raster API</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">Справочник по компилÑтору PPD</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Форум разработчиков</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS а также логотип CUPS ÑвлÑÑŽÑ‚ÑÑ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированными торговыми марками <A HREF="http://www.apple.com">Apple Inc.</A> ÐвторÑкие права на CUPS принадлежат (2007-2013) компании Apple Inc. Ð’Ñе права защищены.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <title>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body>
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a class="active" href="/">Ðачало</a></li>
+ <li><a href="/admin">ÐдминиÑтрирование</a></li>
+ <li><a href="/classes/">Группы</a></li>
+ <li><a href="/help/">Справка</a></li>
+ <li><a href="/jobs/">ЗаданиÑ</a></li>
+ <li><a href="/printers/">Принтеры</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>CUPS 2.0.1</h1>
+ <P>CUPS — Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтво Ñтандартов, ÑÐ²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ð¿Ð¾Ð´ÑиÑтема печати, Ñ€Ð°Ð·Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ <A HREF="http://www.apple.com/">Apple Inc.</A> Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ ÑиÑтемы Mac OS<SUP>&reg;</SUP> X и других UNIX<SUP>&reg;</SUP>-подобных операционных ÑиÑтем.</P>
+ </div>
+ <div class="row">
+ <div class="thirds">
+ <H2>CUPS Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹</H2>
+ <P><A HREF="help/overview.html">Введение в CUPS</A></P>
+ <P><A HREF="help/options.html">Печать из командной Ñтроки</A></P>
+ <P><A HREF="http://www.cups.org/lists.php?LIST=cups">Форум пользователей</A></P>
+ </div>
+ <div class="thirds">
+ <H2>CUPS Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов</H2>
+ <P><A HREF="admin">Добавление принтеров и групп</A></P>
+ <P><A HREF="help/policies.html">Управление доÑтупом</A></P>
+ <P><A HREF="help/network.html">ИÑпользование Ñетевых принтеров</A></P>
+ <p><a href="help/man-cupsd.conf.html">Справочник по cupsd.conf</a></p>
+ </div>
+ <div class="thirds">
+
+ <H2>CUPS Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²</H2>
+ <P><A HREF="help/api-overview.html">Введение в разработку CUPS</A></P>
+ <P><A HREF="help/api-cups.html">CUPS API</A></P>
+ <P><A HREF="help/api-filter.html">Разработка фильтров и модулей</A></P>
+ <P><A HREF="help/api-httpipp.html">API доÑтупа по HTTP и IPP</A></P>
+ <P><A HREF="http://www.cups.org/lists.php?LIST=cups-devel">Форум разработчиков</A></P>
+</div>
+ </div>
+ </div>
+ <div class="footer">CUPS а также логотип CUPS ÑвлÑÑŽÑ‚ÑÑ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированными торговыми марками <A HREF="http://www.apple.com">Apple Inc.</A> ÐвторÑкие права на CUPS принадлежат (2007-2014) компании Apple Inc. Ð’Ñе права защищены.</div>
+ </body>
+</html>
diff --git a/examples/Makefile b/examples/Makefile
index 2a3b1b7..f4737a6 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 3247 2011-05-12 06:22:31Z msweet $"
#
# PPD compiler example makefile for CUPS.
#
@@ -124,5 +124,5 @@ uninstall:
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 3247 2011-05-12 06:22:31Z msweet $".
#
diff --git a/examples/ppdx.c b/examples/ppdx.c
index 86961f0..920f8db 100644
--- a/examples/ppdx.c
+++ b/examples/ppdx.c
@@ -1,5 +1,5 @@
/*
- * "$Id: ppdx.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppdx.c 3833 2012-05-23 22:51:18Z msweet $"
*
* Example code for encoding and decoding large amounts of data in a PPD file.
* This would typically be used in a driver to save configuration/state
@@ -310,5 +310,5 @@ ppdxWriteData(const char *name, /* I - Base name of keyword */
/*
- * End of "$Id: ppdx.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppdx.c 3833 2012-05-23 22:51:18Z msweet $".
*/
diff --git a/examples/ppdx.h b/examples/ppdx.h
index 40a459d..14f34b3 100644
--- a/examples/ppdx.h
+++ b/examples/ppdx.h
@@ -1,5 +1,5 @@
/*
- * "$Id: ppdx.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppdx.h 3833 2012-05-23 22:51:18Z msweet $"
*
* Header for PPD data encoding example code.
*
@@ -78,5 +78,5 @@ extern void ppdxWriteData(const char *name, const void *data,
#endif /* !_PPDX_H */
/*
- * End of "$Id: ppdx.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppdx.h 3833 2012-05-23 22:51:18Z msweet $".
*/
diff --git a/examples/testppdx.c b/examples/testppdx.c
index daa147b..372f3d5 100644
--- a/examples/testppdx.c
+++ b/examples/testppdx.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testppdx.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testppdx.c 3833 2012-05-23 22:51:18Z msweet $"
*
* Test program for PPD data encoding example code.
*
@@ -113,5 +113,5 @@ main(void)
/*
- * End of "$Id: testppdx.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testppdx.c 3833 2012-05-23 22:51:18Z msweet $".
*/
diff --git a/filter/Dependencies b/filter/Dependencies
index 159135b..3087485 100644
--- a/filter/Dependencies
+++ b/filter/Dependencies
@@ -1,61 +1,68 @@
error.o: error.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h \
../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \
- ../cups/array.h ../cups/language.h ../cups/ppd.h \
+ ../cups/array.h ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
../cups/debug-private.h ../cups/string-private.h ../config.h
interpret.o: interpret.c ../cups/raster-private.h ../cups/raster.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
- ../cups/debug-private.h ../cups/string-private.h ../config.h
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+ ../cups/ppd.h ../cups/debug-private.h ../cups/string-private.h \
+ ../config.h
raster.o: raster.c ../cups/raster-private.h ../cups/raster.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
- ../cups/debug-private.h ../cups/string-private.h ../config.h
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+ ../cups/ppd.h ../cups/debug-private.h ../cups/string-private.h \
+ ../config.h
commandtops.o: commandtops.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/sidechannel.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/sidechannel.h
gziptoany.o: gziptoany.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
common.o: common.c common.h ../cups/string-private.h ../config.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+ ../cups/ppd.h
pstops.o: pstops.c common.h ../cups/string-private.h ../config.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
- ../cups/language-private.h ../cups/transcode.h
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+ ../cups/ppd.h ../cups/language-private.h ../cups/transcode.h
rasterbench.o: rasterbench.c ../config.h ../cups/raster.h ../cups/cups.h \
../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \
- ../cups/array.h ../cups/language.h ../cups/ppd.h
+ ../cups/array.h ../cups/language.h ../cups/pwg.h ../cups/ppd.h
rastertoepson.o: rastertoepson.c ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h ../cups/ppd.h ../cups/string-private.h ../config.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/raster.h
+ ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+ ../cups/string-private.h ../config.h ../cups/language-private.h \
+ ../cups/transcode.h ../cups/raster.h
rastertohp.o: rastertohp.c ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h ../cups/ppd.h ../cups/string-private.h ../config.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/raster.h
+ ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+ ../cups/string-private.h ../config.h ../cups/language-private.h \
+ ../cups/transcode.h ../cups/raster.h
rastertolabel.o: rastertolabel.c ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h ../cups/ppd.h ../cups/string-private.h ../config.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/raster.h
+ ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+ ../cups/string-private.h ../config.h ../cups/language-private.h \
+ ../cups/transcode.h ../cups/raster.h
rastertopwg.o: rastertopwg.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/raster.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/raster.h
testraster.o: testraster.c ../cups/raster-private.h ../cups/raster.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
- ../cups/debug-private.h ../cups/string-private.h ../config.h
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+ ../cups/ppd.h ../cups/debug-private.h ../cups/string-private.h \
+ ../config.h
diff --git a/filter/Makefile b/filter/Makefile
index ea27f12..322705b 100644
--- a/filter/Makefile
+++ b/filter/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12568 2015-03-25 13:49:23Z msweet $"
#
# Filter makefile for CUPS.
#
@@ -110,6 +110,7 @@ install-exec:
$(INSTALL_DIR) $(SYMROOT); \
for file in $(FILTERS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -139,6 +140,7 @@ install-libs: $(INSTALLSTATIC)
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
cp $(LIBCUPSIMAGE) $(SYMROOT); \
+ dsymutil $(SYMROOT)/$(LIBCUPSIMAGE); \
fi
installstatic:
@@ -365,6 +367,12 @@ rastertopwg: rastertopwg.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE)
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ rastertopwg.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS)
+rastertopwg-static: rastertopwg.o ../cups/$(LIBCUPSSTATIC) libcupsimage.a
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ rastertopwg.o libcupsimage.a \
+ ../cups/$(LIBCUPSSTATIC) $(IMGLIBS) $(DSOLIBS) $(COMMONLIBS) \
+ $(SSLLIBS) $(DNSSDLIBS) $(LIBGSSAPI)
+
#
# testraster
@@ -396,5 +404,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12568 2015-03-25 13:49:23Z msweet $".
#
diff --git a/filter/commandtops.c b/filter/commandtops.c
index f44a5ef..a5f0609 100644
--- a/filter/commandtops.c
+++ b/filter/commandtops.c
@@ -1,26 +1,15 @@
/*
- * "$Id: commandtops.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: commandtops.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * PostScript command filter for CUPS.
+ * PostScript command filter for CUPS.
*
- * Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- *
- * Contents:
- *
- * main() - Process a CUPS command file.
- * auto_configure() - Automatically configure the printer using
- * PostScript query commands and/or SNMP lookups.
- * begin_ps() - Send the standard PostScript prolog.
- * end_ps() - Send the standard PostScript trailer.
- * print_self_test_page() - Print a self-test page.
- * report_levels() - Report supply levels.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -309,9 +298,7 @@ auto_configure(ppd_file_t *ppd, /* I - PPD file */
bufptr = buffer;
buffer[0] = '\0';
- while ((bytes = cupsBackChannelRead(bufptr,
- sizeof(buffer) - (bufptr - buffer) - 1,
- 10.0)) > 0)
+ while ((bytes = cupsBackChannelRead(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer) - 1, 10.0)) > 0)
{
/*
* No newline at the end? Go on reading ...
@@ -534,5 +521,5 @@ report_levels(ppd_file_t *ppd, /* I - PPD file */
/*
- * End of "$Id: commandtops.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: commandtops.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/filter/common.c b/filter/common.c
index 6f62642..73fb370 100644
--- a/filter/common.c
+++ b/filter/common.c
@@ -1,29 +1,18 @@
/*
- * "$Id: common.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: common.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Common filter routines for CUPS.
+ * Common filter routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * SetCommonOptions() - Set common filter options for media size,
- * etc.
- * UpdatePageVars() - Update the page variables for the orientation.
- * WriteComment() - Write a DSC comment.
- * WriteCommon() - Write common procedures...
- * WriteLabelProlog() - Write the prolog with the classification
- * and page label.
- * WriteLabels() - Write the actual page labels.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -481,7 +470,7 @@ WriteTextComment(const char *name, /* I - Comment name ("Title", etc.) */
*/
printf("%%%%%s: (", name);
- len = 5 + strlen(name);
+ len = 5 + (int)strlen(name);
while (*value)
{
@@ -531,5 +520,5 @@ WriteTextComment(const char *name, /* I - Comment name ("Title", etc.) */
/*
- * End of "$Id: common.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: common.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/filter/common.h b/filter/common.h
index 49f36de..9693ce8 100644
--- a/filter/common.h
+++ b/filter/common.h
@@ -1,5 +1,5 @@
/*
- * "$Id: common.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: common.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Common filter definitions for CUPS.
*
@@ -74,5 +74,5 @@ extern void WriteTextComment(const char *name, const char *value);
/*
- * End of "$Id: common.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: common.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/filter/error.c b/filter/error.c
index a91f0ca..4331365 100644
--- a/filter/error.c
+++ b/filter/error.c
@@ -1,27 +1,18 @@
/*
- * "$Id: error.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: error.c 12747 2015-06-24 15:55:05Z msweet $"
*
- * Raster error handling for CUPS.
+ * Raster error handling for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsRasterAddError() - Add an error message to the error buffer.
- * _cupsRasterClearError() - Clear the error buffer.
- * cupsRasterErrorString() - Return the last error from a raster function.
- * get_error_buffer() - Return a pointer to thread local storage.
- * raster_init() - Initialize error buffer once.
- * raster_destructor() - Free memory allocated by get_error_buffer().
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -62,9 +53,11 @@ _cupsRasterAddError(const char *f, /* I - Printf-style error message */
/* Error buffer */
va_list ap; /* Pointer to additional arguments */
char s[2048]; /* Message string */
- size_t bytes; /* Bytes in message string */
+ ssize_t bytes; /* Bytes in message string */
+ DEBUG_printf(("_cupsRasterAddError(f=\"%s\", ...)", f));
+
va_start(ap, f);
bytes = vsnprintf(s, sizeof(s), f, ap);
va_end(ap);
@@ -72,12 +65,14 @@ _cupsRasterAddError(const char *f, /* I - Printf-style error message */
if (bytes <= 0)
return;
+ DEBUG_printf(("1_cupsRasterAddError: %s", s));
+
bytes ++;
- if (bytes >= sizeof(s))
+ if ((size_t)bytes >= sizeof(s))
return;
- if (bytes > (size_t)(buf->end - buf->current))
+ if (bytes > (ssize_t)(buf->end - buf->current))
{
/*
* Allocate more memory...
@@ -87,7 +82,7 @@ _cupsRasterAddError(const char *f, /* I - Printf-style error message */
size_t size; /* Size of buffer */
- size = buf->end - buf->start + 2 * bytes + 1024;
+ size = (size_t)(buf->end - buf->start + 2 * bytes + 1024);
if (buf->start)
temp = realloc(buf->start, size);
@@ -110,7 +105,7 @@ _cupsRasterAddError(const char *f, /* I - Printf-style error message */
* Append the message to the end of the current string...
*/
- memcpy(buf->current, s, bytes);
+ memcpy(buf->current, s, (size_t)bytes);
buf->current += bytes - 1;
}
@@ -167,8 +162,7 @@ cupsRasterErrorString(void)
* Local globals...
*/
-static pthread_key_t raster_key = -1;
- /* Thread local storage key */
+static pthread_key_t raster_key = 0; /* Thread local storage key */
static pthread_once_t raster_key_once = PTHREAD_ONCE_INIT;
/* One-time initialization object */
@@ -195,7 +189,7 @@ get_error_buffer(void)
* Initialize the global data exactly once...
*/
- DEBUG_puts("get_error_buffer()");
+ DEBUG_puts("3get_error_buffer()");
pthread_once(&raster_key_once, raster_init);
@@ -206,7 +200,7 @@ get_error_buffer(void)
if ((buf = (_cups_raster_error_t *)pthread_getspecific(raster_key))
== NULL)
{
- DEBUG_puts("get_error_buffer: allocating memory for thread...");
+ DEBUG_puts("4get_error_buffer: allocating memory for thread.");
/*
* No, allocate memory as set the pointer for the key...
@@ -215,7 +209,7 @@ get_error_buffer(void)
buf = calloc(1, sizeof(_cups_raster_error_t));
pthread_setspecific(raster_key, buf);
- DEBUG_printf((" buf=%p\n", buf));
+ DEBUG_printf(("4get_error_buffer: buf=%p", buf));
}
/*
@@ -235,8 +229,7 @@ raster_init(void)
{
pthread_key_create(&raster_key, raster_destructor);
- DEBUG_printf(("raster_init(): raster_key=%x(%u)\n", (unsigned)raster_key,
- (unsigned)raster_key));
+ DEBUG_printf(("3raster_init(): raster_key=%x(%u)", (unsigned)raster_key, (unsigned)raster_key));
}
@@ -251,7 +244,7 @@ raster_destructor(void *value) /* I - Data to free */
/* Error buffer */
- DEBUG_printf(("raster_destructor(value=%p)\n", value));
+ DEBUG_printf(("3raster_destructor(value=%p)", value));
if (buf->start)
free(buf->start);
@@ -282,5 +275,5 @@ get_error_buffer(void)
/*
- * End of "$Id: error.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: error.c 12747 2015-06-24 15:55:05Z msweet $".
*/
diff --git a/filter/gziptoany.c b/filter/gziptoany.c
index 079a8c7..9af404d 100644
--- a/filter/gziptoany.c
+++ b/filter/gziptoany.c
@@ -1,22 +1,18 @@
/*
- * "$Id: gziptoany.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: gziptoany.c 12655 2015-05-22 17:26:40Z msweet $"
*
- * GZIP/raw pre-filter for CUPS.
+ * GZIP/raw pre-filter for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Copy (and uncompress) files to stdout.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -36,7 +32,7 @@ main(int argc, /* I - Number of command-line arguments */
{
cups_file_t *fp; /* File */
char buffer[8192]; /* Data buffer */
- int bytes; /* Number of bytes read/written */
+ ssize_t bytes; /* Number of bytes read/written */
int copies; /* Number of copies */
@@ -44,7 +40,7 @@ main(int argc, /* I - Number of command-line arguments */
* Check command-line...
*/
- if (argc != 7)
+ if (argc < 6 || argc > 7)
{
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]"),
@@ -66,8 +62,14 @@ main(int argc, /* I - Number of command-line arguments */
* Open the file...
*/
- if ((fp = cupsFileOpen(argv[6], "r")) == NULL)
+ if (argc == 6)
+ {
+ copies = 1;
+ fp = cupsFileStdin();
+ }
+ else if ((fp = cupsFileOpen(argv[6], "r")) == NULL)
{
+ fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", argv[6]);
_cupsLangPrintError("ERROR", _("Unable to open print file"));
return (1);
}
@@ -84,12 +86,13 @@ main(int argc, /* I - Number of command-line arguments */
cupsFileRewind(fp);
while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
- if (write(1, buffer, bytes) < bytes)
+ if (write(1, buffer, (size_t)bytes) < bytes)
{
_cupsLangPrintFilter(stderr, "ERROR",
_("Unable to write uncompressed print data: %s"),
strerror(errno));
- cupsFileClose(fp);
+ if (argc == 7)
+ cupsFileClose(fp);
return (1);
}
@@ -101,12 +104,13 @@ main(int argc, /* I - Number of command-line arguments */
* Close the file and return...
*/
- cupsFileClose(fp);
+ if (argc == 7)
+ cupsFileClose(fp);
return (0);
}
/*
- * End of "$Id: gziptoany.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: gziptoany.c 12655 2015-05-22 17:26:40Z msweet $".
*/
diff --git a/filter/interpret.c b/filter/interpret.c
index 2a2f352..624a2a7 100644
--- a/filter/interpret.c
+++ b/filter/interpret.c
@@ -1,39 +1,18 @@
/*
- * "$Id: interpret.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: interpret.c 12746 2015-06-24 13:28:36Z msweet $"
*
- * PPD command interpreter for CUPS.
+ * PPD command interpreter for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsRasterInterpretPPD() - Interpret PPD commands to create a page header.
- * _cupsRasterExecPS() - Execute PostScript code to initialize a page
- * header.
- * cleartomark_stack() - Clear to the last mark ([) on the stack.
- * copy_stack() - Copy the top N stack objects.
- * delete_stack() - Free memory used by a stack.
- * error_object() - Add an object's value to the current error
- * message.
- * error_stack() - Add a stack to the current error message.
- * index_stack() - Copy the Nth value on the stack.
- * new_stack() - Create a new stack.
- * pop_stock() - Pop the top object off the stack.
- * push_stack() - Push an object on the stack.
- * roll_stack() - Rotate stack objects.
- * scan_ps() - Scan a string for the next PS object.
- * setpagedevice() - Simulate the PostScript setpagedevice operator.
- * DEBUG_object() - Print an object value.
- * DEBUG_stack() - Print a stack.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -112,8 +91,8 @@ static int setpagedevice(_cups_ps_stack_t *st,
cups_page_header2_t *h,
int *preferred_bits);
#ifdef DEBUG
-static void DEBUG_object(_cups_ps_obj_t *obj);
-static void DEBUG_stack(_cups_ps_stack_t *st);
+static void DEBUG_object(const char *prefix, _cups_ps_obj_t *obj);
+static void DEBUG_stack(const char *prefix, _cups_ps_stack_t *st);
#endif /* DEBUG */
@@ -162,7 +141,8 @@ cupsRasterInterpretPPD(
float left, /* Left position */
bottom, /* Bottom position */
right, /* Right position */
- top; /* Top position */
+ top, /* Top position */
+ temp1, temp2; /* Temporary variables for swapping */
int preferred_bits; /* Preferred bits per color */
@@ -189,7 +169,7 @@ cupsRasterInterpretPPD(
h->PageSize[1] = 792;
h->HWResolution[0] = 100;
h->HWResolution[1] = 100;
- h->cupsBitsPerColor = 1;
+ h->cupsBitsPerColor = 1;
h->cupsColorOrder = CUPS_ORDER_CHUNKED;
h->cupsColorSpace = CUPS_CSPACE_K;
h->cupsBorderlessScalingFactor = 1.0f;
@@ -200,7 +180,7 @@ cupsRasterInterpretPPD(
h->cupsImagingBBox[2] = 612.0f;
h->cupsImagingBBox[3] = 792.0f;
- strcpy(h->cupsPageSizeName, "Letter");
+ strlcpy(h->cupsPageSizeName, "Letter", sizeof(h->cupsPageSizeName));
#ifdef __APPLE__
/*
@@ -301,6 +281,67 @@ cupsRasterInterpretPPD(
top = 792.0f;
}
+ /*
+ * Handle orientation...
+ */
+
+ switch (h->Orientation)
+ {
+ case CUPS_ORIENT_0 :
+ default :
+ /* Do nothing */
+ break;
+
+ case CUPS_ORIENT_90 :
+ temp1 = h->cupsPageSize[0];
+ h->cupsPageSize[0] = h->cupsPageSize[1];
+ h->cupsPageSize[1] = temp1;
+
+ temp1 = left;
+ temp2 = right;
+ left = h->cupsPageSize[0] - top;
+ right = h->cupsPageSize[0] - bottom;
+ bottom = h->cupsPageSize[1] - temp1;
+ top = h->cupsPageSize[1] - temp2;
+ break;
+
+ case CUPS_ORIENT_180 :
+ temp1 = left;
+ temp2 = bottom;
+ left = h->cupsPageSize[0] - right;
+ right = h->cupsPageSize[0] - temp1;
+ bottom = h->cupsPageSize[1] - top;
+ top = h->cupsPageSize[1] - temp2;
+ break;
+
+ case CUPS_ORIENT_270 :
+ temp1 = h->cupsPageSize[0];
+ h->cupsPageSize[0] = h->cupsPageSize[1];
+ h->cupsPageSize[1] = temp1;
+
+ temp1 = left;
+ temp2 = right;
+ left = bottom;
+ right = top;
+ bottom = h->cupsPageSize[1] - temp2;
+ top = h->cupsPageSize[1] - temp1;
+ break;
+ }
+
+ if (left > right)
+ {
+ temp1 = left;
+ left = right;
+ right = temp1;
+ }
+
+ if (bottom > top)
+ {
+ temp1 = bottom;
+ bottom = top;
+ top = temp1;
+ }
+
h->PageSize[0] = (unsigned)(h->cupsPageSize[0] *
h->cupsBorderlessScalingFactor);
h->PageSize[1] = (unsigned)(h->cupsPageSize[1] *
@@ -352,9 +393,9 @@ cupsRasterInterpretPPD(
* Compute the bitmap parameters...
*/
- h->cupsWidth = (int)((right - left) * h->cupsBorderlessScalingFactor *
+ h->cupsWidth = (unsigned)((right - left) * h->cupsBorderlessScalingFactor *
h->HWResolution[0] / 72.0f + 0.5f);
- h->cupsHeight = (int)((top - bottom) * h->cupsBorderlessScalingFactor *
+ h->cupsHeight = (unsigned)((top - bottom) * h->cupsBorderlessScalingFactor *
h->HWResolution[1] / 72.0f + 0.5f);
switch (h->cupsColorSpace)
@@ -470,6 +511,7 @@ _cupsRasterExecPS(
int *preferred_bits,/* O - Preferred bits per color */
const char *code) /* I - PS code to execute */
{
+ int error = 0; /* Error condition? */
_cups_ps_stack_t *st; /* PostScript value stack */
_cups_ps_obj_t *obj; /* Object from top of stack */
char *codecopy, /* Copy of code */
@@ -477,7 +519,7 @@ _cupsRasterExecPS(
DEBUG_printf(("_cupsRasterExecPS(h=%p, preferred_bits=%p, code=\"%s\")\n",
- h, preferred_bits, code ? code : "(null)"));
+ h, preferred_bits, code));
/*
* Copy the PostScript code and create a stack...
@@ -505,8 +547,8 @@ _cupsRasterExecPS(
while ((obj = scan_ps(st, &codeptr)) != NULL)
{
#ifdef DEBUG
- DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)\n", st->num_objs));
- DEBUG_object(obj);
+ DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)", st->num_objs));
+ DEBUG_object("_cupsRasterExecPS", obj);
#endif /* DEBUG */
switch (obj->type)
@@ -519,11 +561,11 @@ _cupsRasterExecPS(
pop_stack(st);
if (cleartomark_stack(st))
- _cupsRasterAddError("cleartomark: Stack underflow!\n");
+ _cupsRasterAddError("cleartomark: Stack underflow.\n");
#ifdef DEBUG
- DEBUG_puts(" dup: ");
- DEBUG_stack(st);
+ DEBUG_puts("1_cupsRasterExecPS: dup");
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
break;
@@ -535,7 +577,7 @@ _cupsRasterExecPS(
#ifdef DEBUG
DEBUG_puts("_cupsRasterExecPS: copy");
- DEBUG_stack(st);
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
}
break;
@@ -546,7 +588,7 @@ _cupsRasterExecPS(
#ifdef DEBUG
DEBUG_puts("_cupsRasterExecPS: dup");
- DEBUG_stack(st);
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
break;
@@ -558,7 +600,7 @@ _cupsRasterExecPS(
#ifdef DEBUG
DEBUG_puts("_cupsRasterExecPS: index");
- DEBUG_stack(st);
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
}
break;
@@ -569,7 +611,7 @@ _cupsRasterExecPS(
#ifdef DEBUG
DEBUG_puts("_cupsRasterExecPS: pop");
- DEBUG_stack(st);
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
break;
@@ -588,7 +630,7 @@ _cupsRasterExecPS(
#ifdef DEBUG
DEBUG_puts("_cupsRasterExecPS: roll");
- DEBUG_stack(st);
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
}
}
@@ -600,7 +642,7 @@ _cupsRasterExecPS(
#ifdef DEBUG
DEBUG_puts("_cupsRasterExecPS: setpagedevice");
- DEBUG_stack(st);
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
break;
@@ -611,13 +653,13 @@ _cupsRasterExecPS(
break;
case CUPS_PS_OTHER :
- _cupsRasterAddError("Unknown operator \"%s\"!\n", obj->value.other);
- DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\"!\n",
- obj->value.other));
+ _cupsRasterAddError("Unknown operator \"%s\".\n", obj->value.other);
+ error = 1;
+ DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\".", obj->value.other));
break;
}
- if (obj && obj->type == CUPS_PS_OTHER)
+ if (error)
break;
}
@@ -632,8 +674,8 @@ _cupsRasterExecPS(
error_stack(st, "Stack not empty:");
#ifdef DEBUG
- DEBUG_puts("_cupsRasterExecPS: Stack not empty:");
- DEBUG_stack(st);
+ DEBUG_puts("_cupsRasterExecPS: Stack not empty");
+ DEBUG_stack("_cupsRasterExecPS", st);
#endif /* DEBUG */
delete_stack(st);
@@ -904,7 +946,7 @@ push_stack(_cups_ps_stack_t *st, /* I - Stack */
st->alloc_objs += 32;
- if ((temp = realloc(st->objs, st->alloc_objs *
+ if ((temp = realloc(st->objs, (size_t)st->alloc_objs *
sizeof(_cups_ps_obj_t))) == NULL)
return (NULL);
@@ -934,7 +976,7 @@ roll_stack(_cups_ps_stack_t *st, /* I - Stack */
int n; /* Index into array */
- DEBUG_printf((" roll_stack(st=%p, s=%d, c=%d)\n", st, s, c));
+ DEBUG_printf(("3roll_stack(st=%p, s=%d, c=%d)", st, s, c));
/*
* Range check input...
@@ -965,12 +1007,12 @@ roll_stack(_cups_ps_stack_t *st, /* I - Stack */
s = -s;
- if ((temp = calloc(s, sizeof(_cups_ps_obj_t))) == NULL)
+ if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL)
return (-1);
- memcpy(temp, st->objs + n, s * sizeof(_cups_ps_obj_t));
- memmove(st->objs + n, st->objs + n + s, (c - s) * sizeof(_cups_ps_obj_t));
- memcpy(st->objs + n + c - s, temp, s * sizeof(_cups_ps_obj_t));
+ memcpy(temp, st->objs + n, (size_t)s * sizeof(_cups_ps_obj_t));
+ memmove(st->objs + n, st->objs + n + s, (size_t)(c - s) * sizeof(_cups_ps_obj_t));
+ memcpy(st->objs + n + c - s, temp, (size_t)s * sizeof(_cups_ps_obj_t));
}
else
{
@@ -978,13 +1020,12 @@ roll_stack(_cups_ps_stack_t *st, /* I - Stack */
* Shift up...
*/
- if ((temp = calloc(s, sizeof(_cups_ps_obj_t))) == NULL)
+ if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL)
return (-1);
- memcpy(temp, st->objs + n + c - s, s * sizeof(_cups_ps_obj_t));
- memmove(st->objs + n + s, st->objs + n,
- (c - s) * sizeof(_cups_ps_obj_t));
- memcpy(st->objs + n, temp, s * sizeof(_cups_ps_obj_t));
+ memcpy(temp, st->objs + n + c - s, (size_t)s * sizeof(_cups_ps_obj_t));
+ memmove(st->objs + n + s, st->objs + n, (size_t)(c - s) * sizeof(_cups_ps_obj_t));
+ memcpy(st->objs + n, temp, (size_t)s * sizeof(_cups_ps_obj_t));
}
free(temp);
@@ -1103,7 +1144,7 @@ scan_ps(_cups_ps_stack_t *st, /* I - Stack */
ch = (ch << 3) + *cur - '0';
}
- *valptr++ = ch;
+ *valptr++ = (char)ch;
}
else if (*cur == '\r')
{
@@ -1180,7 +1221,7 @@ scan_ps(_cups_ps_stack_t *st, /* I - Stack */
ch |= tolower(*cur) - 'a' + 10;
}
- *valptr++ = ch;
+ *valptr++ = (char)ch;
}
if (*cur != '>')
@@ -1393,7 +1434,7 @@ setpagedevice(
* Now pull /name and value pairs from the dictionary...
*/
- DEBUG_puts("setpagedevice: Dictionary:");
+ DEBUG_puts("3setpagedevice: Dictionary:");
for (obj ++; obj < end; obj ++)
{
@@ -1408,8 +1449,8 @@ setpagedevice(
obj ++;
#ifdef DEBUG
- DEBUG_printf(("setpagedevice: /%s ", name));
- DEBUG_object(obj);
+ DEBUG_printf(("4setpagedevice: /%s ", name));
+ DEBUG_object("setpagedevice", obj);
#endif /* DEBUG */
/*
@@ -1559,7 +1600,7 @@ setpagedevice(
* Ignore unknown name+value...
*/
- DEBUG_printf((" Unknown name (\"%s\") or value...\n", name));
+ DEBUG_printf(("4setpagedevice: Unknown name (\"%s\") or value...\n", name));
while (obj[1].type != CUPS_PS_NAME && obj < end)
obj ++;
@@ -1576,91 +1617,92 @@ setpagedevice(
*/
static void
-DEBUG_object(_cups_ps_obj_t *obj) /* I - Object to print */
+DEBUG_object(const char *prefix, /* I - Prefix string */
+ _cups_ps_obj_t *obj) /* I - Object to print */
{
switch (obj->type)
{
case CUPS_PS_NAME :
- DEBUG_printf(("/%s\n", obj->value.name));
+ DEBUG_printf(("4%s: /%s\n", prefix, obj->value.name));
break;
case CUPS_PS_NUMBER :
- DEBUG_printf(("%g\n", obj->value.number));
+ DEBUG_printf(("4%s: %g\n", prefix, obj->value.number));
break;
case CUPS_PS_STRING :
- DEBUG_printf(("(%s)\n", obj->value.string));
+ DEBUG_printf(("4%s: (%s)\n", prefix, obj->value.string));
break;
case CUPS_PS_BOOLEAN :
if (obj->value.boolean)
- DEBUG_puts("true");
+ DEBUG_printf(("4%s: true", prefix));
else
- DEBUG_puts("false");
+ DEBUG_printf(("4%s: false", prefix));
break;
case CUPS_PS_NULL :
- DEBUG_puts("null");
+ DEBUG_printf(("4%s: null", prefix));
break;
case CUPS_PS_START_ARRAY :
- DEBUG_puts("[");
+ DEBUG_printf(("4%s: [", prefix));
break;
case CUPS_PS_END_ARRAY :
- DEBUG_puts("]");
+ DEBUG_printf(("4%s: ]", prefix));
break;
case CUPS_PS_START_DICT :
- DEBUG_puts("<<");
+ DEBUG_printf(("4%s: <<", prefix));
break;
case CUPS_PS_END_DICT :
- DEBUG_puts(">>");
+ DEBUG_printf(("4%s: >>", prefix));
break;
case CUPS_PS_START_PROC :
- DEBUG_puts("{");
+ DEBUG_printf(("4%s: {", prefix));
break;
case CUPS_PS_END_PROC :
- DEBUG_puts("}");
+ DEBUG_printf(("4%s: }", prefix));
break;
case CUPS_PS_CLEARTOMARK :
- DEBUG_puts("--cleartomark--");
+ DEBUG_printf(("4%s: --cleartomark--", prefix));
break;
case CUPS_PS_COPY :
- DEBUG_puts("--copy--");
+ DEBUG_printf(("4%s: --copy--", prefix));
break;
case CUPS_PS_DUP :
- DEBUG_puts("--dup--");
+ DEBUG_printf(("4%s: --dup--", prefix));
break;
case CUPS_PS_INDEX :
- DEBUG_puts("--index--");
+ DEBUG_printf(("4%s: --index--", prefix));
break;
case CUPS_PS_POP :
- DEBUG_puts("--pop--");
+ DEBUG_printf(("4%s: --pop--", prefix));
break;
case CUPS_PS_ROLL :
- DEBUG_puts("--roll--");
+ DEBUG_printf(("4%s: --roll--", prefix));
break;
case CUPS_PS_SETPAGEDEVICE :
- DEBUG_puts("--setpagedevice--");
+ DEBUG_printf(("4%s: --setpagedevice--", prefix));
break;
case CUPS_PS_STOPPED :
- DEBUG_puts("--stopped--");
+ DEBUG_printf(("4%s: --stopped--", prefix));
break;
case CUPS_PS_OTHER :
- DEBUG_printf(("--%s--\n", obj->value.other));
+ DEBUG_printf(("4%s: --%s--", prefix, obj->value.other));
break;
}
}
@@ -1671,18 +1713,19 @@ DEBUG_object(_cups_ps_obj_t *obj) /* I - Object to print */
*/
static void
-DEBUG_stack(_cups_ps_stack_t *st) /* I - Stack */
+DEBUG_stack(const char *prefix, /* I - Prefix string */
+ _cups_ps_stack_t *st) /* I - Stack */
{
int c; /* Looping var */
_cups_ps_obj_t *obj; /* Current object on stack */
for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++)
- DEBUG_object(obj);
+ DEBUG_object(prefix, obj);
}
#endif /* DEBUG */
/*
- * End of "$Id: interpret.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: interpret.c 12746 2015-06-24 13:28:36Z msweet $".
*/
diff --git a/filter/pstops.c b/filter/pstops.c
index 3f7d0f4..2cdde86 100644
--- a/filter/pstops.c
+++ b/filter/pstops.c
@@ -1,51 +1,18 @@
/*
- * "$Id: pstops.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: pstops.c 12655 2015-05-22 17:26:40Z msweet $"
*
- * PostScript filter for CUPS.
+ * PostScript filter for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry.
- * add_page() - Add a page to the pages array.
- * cancel_job() - Flag the job as canceled.
- * check_range() - Check to see if the current page is selected for
- * printing.
- * copy_bytes() - Copy bytes from the input file to stdout.
- * copy_comments() - Copy all of the comments section.
- * copy_dsc() - Copy a DSC-conforming document.
- * copy_non_dsc() - Copy a document that does not conform to the DSC.
- * copy_page() - Copy a page description.
- * copy_prolog() - Copy the document prolog section.
- * copy_setup() - Copy the document setup section.
- * copy_trailer() - Copy the document trailer.
- * do_prolog() - Send the necessary document prolog commands.
- * do_setup() - Send the necessary document setup commands.
- * doc_printf() - Send a formatted string to stdout and/or the temp
- * file.
- * doc_puts() - Send a nul-terminated string to stdout and/or the
- * temp file.
- * doc_write() - Send data to stdout and/or the temp file.
- * end_nup() - End processing for N-up printing.
- * include_feature() - Include a printer option/feature command.
- * parse_text() - Parse a text value in a comment.
- * set_pstops_options() - Set pstops options.
- * skip_page() - Skip past a page that won't be printed.
- * start_nup() - Start processing for N-up printing.
- * write_label_prolog() - Write the prolog with the classification and page
- * label.
- * write_labels() - Write the actual page labels.
- * write_options() - Write options provided via %%IncludeFeature.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -236,7 +203,7 @@ main(int argc, /* I - Number of command-line args */
int num_options; /* Number of print options */
cups_option_t *options; /* Print options */
char line[8192]; /* Line buffer */
- size_t len; /* Length of line buffer */
+ ssize_t len; /* Length of line buffer */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
@@ -297,7 +264,12 @@ main(int argc, /* I - Number of command-line args */
if ((fp = cupsFileOpen(argv[6], "r")) == NULL)
{
- _cupsLangPrintError("ERROR", _("Unable to open print file"));
+ if (!JobCanceled)
+ {
+ fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", argv[6]);
+ _cupsLangPrintError("ERROR", _("Unable to open print file"));
+ }
+
return (1);
}
}
@@ -306,7 +278,7 @@ main(int argc, /* I - Number of command-line args */
* Read the first line to see if we have DSC comments...
*/
- if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0)
+ if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0)
{
fputs("DEBUG: The print file is empty.\n", stderr);
return (1);
@@ -355,13 +327,13 @@ main(int argc, /* I - Number of command-line args */
fputs("DEBUG: Skipping PJL header...\n", stderr);
while (strstr(line, "ENTER LANGUAGE") == NULL && strncmp(line, "%!", 2))
- if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0)
+ if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0)
break;
if (!strncmp(line, "%!", 2))
break;
- if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0)
+ if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0)
break;
}
@@ -511,11 +483,11 @@ check_range(pstops_doc_t *doc, /* I - Document information */
{
lower = 1;
range ++;
- upper = strtol(range, (char **)&range, 10);
+ upper = (int)strtol(range, (char **)&range, 10);
}
else
{
- lower = strtol(range, (char **)&range, 10);
+ lower = (int)strtol(range, (char **)&range, 10);
if (*range == '-')
{
@@ -523,7 +495,7 @@ check_range(pstops_doc_t *doc, /* I - Document information */
if (!isdigit(*range & 255))
upper = 65535;
else
- upper = strtol(range, (char **)&range, 10);
+ upper = (int)strtol(range, (char **)&range, 10);
}
else
upper = lower;
@@ -569,14 +541,14 @@ copy_bytes(cups_file_t *fp, /* I - File to read from */
if (nleft > sizeof(buffer) || length == 0)
nbytes = sizeof(buffer);
else
- nbytes = nleft;
+ nbytes = (ssize_t)nleft;
- if ((nbytes = cupsFileRead(fp, buffer, nbytes)) < 1)
+ if ((nbytes = cupsFileRead(fp, buffer, (size_t)nbytes)) < 1)
return;
- nleft -= nbytes;
+ nleft -= (size_t)nbytes;
- fwrite(buffer, 1, nbytes, stdout);
+ fwrite(buffer, 1, (size_t)nbytes, stdout);
}
}
@@ -741,13 +713,13 @@ copy_comments(cups_file_t *fp, /* I - File to read from */
}
else if (!strcmp(line, "%%EndComments"))
{
- linelen = cupsFileGetLine(fp, line, linesize);
+ linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
break;
}
else if (strncmp(line, "%!", 2) && strncmp(line, "%cups", 5))
doc_printf(doc, "%s\n", line);
- if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+ if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
break;
}
@@ -860,9 +832,9 @@ copy_dsc(cups_file_t *fp, /* I - File to read from */
while (strncmp(line, "%%Page:", 7) && strncmp(line, "%%Trailer", 9))
{
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
- if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+ if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
break;
}
@@ -905,7 +877,7 @@ copy_dsc(cups_file_t *fp, /* I - File to read from */
doc_puts(doc, "showpage\n");
end_nup(doc, doc->number_up);
- pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset;
+ pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset);
}
if (doc->slow_duplex && (doc->page & 1))
@@ -929,7 +901,7 @@ copy_dsc(cups_file_t *fp, /* I - File to read from */
doc_puts(doc, "showpage\n");
end_nup(doc, doc->number_up);
- pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset;
+ pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset);
}
/*
@@ -1006,7 +978,7 @@ copy_dsc(cups_file_t *fp, /* I - File to read from */
if (!number)
{
pageinfo = (pstops_page_t *)cupsArrayFirst(doc->pages);
- copy_bytes(doc->temp, 0, pageinfo->offset);
+ copy_bytes(doc->temp, 0, (size_t)pageinfo->offset);
}
/*
@@ -1041,7 +1013,7 @@ copy_dsc(cups_file_t *fp, /* I - File to read from */
pageinfo->bounding_box[2], pageinfo->bounding_box[3]);
}
- copy_bytes(doc->temp, pageinfo->offset, pageinfo->length);
+ copy_bytes(doc->temp, pageinfo->offset, (size_t)pageinfo->length);
pageinfo = doc->slow_order ? (pstops_page_t *)cupsArrayPrev(doc->pages) :
(pstops_page_t *)cupsArrayNext(doc->pages);
@@ -1079,11 +1051,13 @@ copy_non_dsc(cups_file_t *fp, /* I - File to read from */
ssize_t linelen, /* I - Length of initial line */
size_t linesize) /* I - Size of line buffer */
{
- int copy; /* Current copy */
- char buffer[8192]; /* Copy buffer */
- int bytes; /* Number of bytes copied */
+ int copy; /* Current copy */
+ char buffer[8192]; /* Copy buffer */
+ ssize_t bytes; /* Number of bytes copied */
+ (void)linesize;
+
/*
* First let the user know that they are attempting to print a file
* that may not print correctly...
@@ -1175,17 +1149,17 @@ copy_non_dsc(cups_file_t *fp, /* I - File to read from */
puts("%%EndPageSetup");
puts("%%BeginDocument: nondsc");
- fwrite(line, linelen, 1, stdout);
+ fwrite(line, (size_t)linelen, 1, stdout);
if (doc->temp)
- cupsFileWrite(doc->temp, line, linelen);
+ cupsFileWrite(doc->temp, line, (size_t)linelen);
while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
{
- fwrite(buffer, 1, bytes, stdout);
+ fwrite(buffer, 1, (size_t)bytes, stdout);
if (doc->temp)
- cupsFileWrite(doc->temp, buffer, bytes);
+ cupsFileWrite(doc->temp, buffer, (size_t)bytes);
}
puts("%%EndDocument");
@@ -1303,7 +1277,8 @@ copy_page(cups_file_t *fp, /* I - File to read from */
if (doc->ap_input_slot || doc->ap_manual_feed)
{
- if (doc->page == 1)
+ if ((doc->page == 1 && (!doc->slow_order || !Duplex)) ||
+ (doc->page == 2 && doc->slow_order && Duplex))
{
/*
* First page/sheet gets AP_FIRSTPAGE_* options...
@@ -1366,7 +1341,7 @@ copy_page(cups_file_t *fp, /* I - File to read from */
memcpy(bounding_box, doc->bounding_box, sizeof(bounding_box));
- while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+ while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
{
if (!strncmp(line, "%%PageBoundingBox:", 18))
{
@@ -1399,24 +1374,24 @@ copy_page(cups_file_t *fp, /* I - File to read from */
switch (Orientation)
{
case 1 : /* Landscape */
- bounding_box[0] = PageLength - temp_bbox[3];
+ bounding_box[0] = (int)(PageLength - temp_bbox[3]);
bounding_box[1] = temp_bbox[0];
- bounding_box[2] = PageLength - temp_bbox[1];
+ bounding_box[2] = (int)(PageLength - temp_bbox[1]);
bounding_box[3] = temp_bbox[2];
break;
case 2 : /* Reverse Portrait */
- bounding_box[0] = PageWidth - temp_bbox[2];
- bounding_box[1] = PageLength - temp_bbox[3];
- bounding_box[2] = PageWidth - temp_bbox[0];
- bounding_box[3] = PageLength - temp_bbox[1];
+ bounding_box[0] = (int)(PageWidth - temp_bbox[2]);
+ bounding_box[1] = (int)(PageLength - temp_bbox[3]);
+ bounding_box[2] = (int)(PageWidth - temp_bbox[0]);
+ bounding_box[3] = (int)(PageLength - temp_bbox[1]);
break;
case 3 : /* Reverse Landscape */
bounding_box[0] = temp_bbox[1];
- bounding_box[1] = PageWidth - temp_bbox[2];
+ bounding_box[1] = (int)(PageWidth - temp_bbox[2]);
bounding_box[2] = temp_bbox[3];
- bounding_box[3] = PageWidth - temp_bbox[0];
+ bounding_box[3] = (int)(PageWidth - temp_bbox[0]);
break;
}
@@ -1549,7 +1524,7 @@ copy_page(cups_file_t *fp, /* I - File to read from */
{
int feature = 0; /* In a Begin/EndFeature block? */
- while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+ while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
{
if (!strncmp(line, "%%EndPageSetup", 14))
break;
@@ -1581,7 +1556,7 @@ copy_page(cups_file_t *fp, /* I - File to read from */
break;
if (!feature || (doc->number_up == 1 && !doc->fit_to_page))
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
}
/*
@@ -1589,7 +1564,7 @@ copy_page(cups_file_t *fp, /* I - File to read from */
*/
if (linelen > 0 && !strncmp(line, "%%EndPageSetup", 14))
- linelen = cupsFileGetLine(fp, line, linesize);
+ linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
}
if (first_page)
@@ -1638,14 +1613,14 @@ copy_page(cups_file_t *fp, /* I - File to read from */
else if (!strncmp(line, "%%BeginDocument", 15) ||
!strncmp(line, "%ADO_BeginApplication", 21))
{
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
level ++;
}
else if ((!strncmp(line, "%%EndDocument", 13) ||
!strncmp(line, "%ADO_EndApplication", 19)) && level > 0)
{
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
level --;
}
@@ -1660,16 +1635,16 @@ copy_page(cups_file_t *fp, /* I - File to read from */
int bytes; /* Bytes of data */
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
bytes = atoi(strchr(line, ':') + 1);
while (bytes > 0)
{
- if (bytes > linesize)
+ if ((size_t)bytes > linesize)
linelen = cupsFileRead(fp, line, linesize);
else
- linelen = cupsFileRead(fp, line, bytes);
+ linelen = cupsFileRead(fp, line, (size_t)bytes);
if (linelen < 1)
{
@@ -1678,15 +1653,15 @@ copy_page(cups_file_t *fp, /* I - File to read from */
return (0);
}
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
bytes -= linelen;
}
}
else
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
}
- while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0);
+ while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0);
/*
* Finish up this page and return...
@@ -1694,7 +1669,7 @@ copy_page(cups_file_t *fp, /* I - File to read from */
end_nup(doc, number);
- pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset;
+ pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset);
return (linelen);
}
@@ -1720,9 +1695,9 @@ copy_prolog(cups_file_t *fp, /* I - File to read from */
if (!strncmp(line, "%%BeginSetup", 12) || !strncmp(line, "%%Page:", 7))
break;
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
- if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+ if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
break;
}
@@ -1732,18 +1707,18 @@ copy_prolog(cups_file_t *fp, /* I - File to read from */
if (!strncmp(line, "%%BeginProlog", 13))
{
- while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+ while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
{
if (!strncmp(line, "%%EndProlog", 11) ||
!strncmp(line, "%%BeginSetup", 12) ||
!strncmp(line, "%%Page:", 7))
break;
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
}
if (!strncmp(line, "%%EndProlog", 11))
- linelen = cupsFileGetLine(fp, line, linesize);
+ linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
else
fputs("DEBUG: The %%EndProlog comment is missing.\n", stderr);
}
@@ -1778,9 +1753,9 @@ copy_setup(cups_file_t *fp, /* I - File to read from */
if (!strncmp(line, "%%Page:", 7))
break;
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
- if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+ if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
break;
}
@@ -1807,14 +1782,14 @@ copy_setup(cups_file_t *fp, /* I - File to read from */
num_options = include_feature(ppd, line, num_options, &options);
}
else if (strncmp(line, "%%BeginSetup", 12))
- doc_write(doc, line, linelen);
+ doc_write(doc, line, (size_t)linelen);
- if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+ if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
break;
}
if (!strncmp(line, "%%EndSetup", 10))
- linelen = cupsFileGetLine(fp, line, linesize);
+ linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
else
fputs("DEBUG: The %%EndSetup comment is missing.\n", stderr);
}
@@ -1851,6 +1826,8 @@ copy_trailer(cups_file_t *fp, /* I - File to read from */
* Write the trailer comments...
*/
+ (void)ppd;
+
puts("%%Trailer");
while (linelen > 0)
@@ -1860,9 +1837,9 @@ copy_trailer(cups_file_t *fp, /* I - File to read from */
else if (strncmp(line, "%%Trailer", 9) &&
strncmp(line, "%%Pages:", 8) &&
strncmp(line, "%%BoundingBox:", 14))
- fwrite(line, 1, linelen, stdout);
+ fwrite(line, 1, (size_t)linelen, stdout);
- linelen = cupsFileGetLine(fp, line, linesize);
+ linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
}
fprintf(stderr, "DEBUG: Wrote %d pages...\n", number);
@@ -2044,21 +2021,21 @@ doc_printf(pstops_doc_t *doc, /* I - Document information */
{
va_list ap; /* Pointer to arguments */
char buffer[1024]; /* Output buffer */
- size_t bytes; /* Number of bytes to write */
+ ssize_t bytes; /* Number of bytes to write */
va_start(ap, format);
bytes = vsnprintf(buffer, sizeof(buffer), format, ap);
va_end(ap);
- if (bytes > sizeof(buffer))
+ if ((size_t)bytes > sizeof(buffer))
{
_cupsLangPrintFilter(stderr, "ERROR",
_("Buffer overflow detected, aborting."));
exit(1);
}
- doc_write(doc, buffer, bytes);
+ doc_write(doc, buffer, (size_t)bytes);
}
@@ -2704,7 +2681,7 @@ skip_page(cups_file_t *fp, /* I - File to read from */
level = 0;
- while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+ while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
{
if (level == 0 &&
(!strncmp(line, "%%Page:", 7) || !strncmp(line, "%%Trailer", 9)))
@@ -2723,17 +2700,16 @@ skip_page(cups_file_t *fp, /* I - File to read from */
* Skip binary data...
*/
- int bytes; /* Bytes of data */
-
+ ssize_t bytes; /* Bytes of data */
bytes = atoi(strchr(line, ':') + 1);
while (bytes > 0)
{
- if (bytes > linesize)
- linelen = cupsFileRead(fp, line, linesize);
+ if ((size_t)bytes > linesize)
+ linelen = (ssize_t)cupsFileRead(fp, line, linesize);
else
- linelen = cupsFileRead(fp, line, bytes);
+ linelen = (ssize_t)cupsFileRead(fp, line, (size_t)bytes);
if (linelen < 1)
{
@@ -2763,15 +2739,15 @@ start_nup(pstops_doc_t *doc, /* I - Document information */
{
int pos; /* Position on page */
int x, y; /* Relative position of subpage */
- float w, l, /* Width and length of subpage */
+ double w, l, /* Width and length of subpage */
tx, ty; /* Translation values for subpage */
- float pagew, /* Printable width of page */
+ double pagew, /* Printable width of page */
pagel; /* Printable height of page */
int bboxx, /* BoundingBox X origin */
bboxy, /* BoundingBox Y origin */
bboxw, /* BoundingBox width */
bboxl; /* BoundingBox height */
- float margin = 0; /* Current margin for border */
+ double margin = 0; /* Current margin for border */
if (doc->number_up > 1)
@@ -2792,8 +2768,8 @@ start_nup(pstops_doc_t *doc, /* I - Document information */
{
bboxx = 0;
bboxy = 0;
- bboxw = PageWidth;
- bboxl = PageLength;
+ bboxw = (int)PageWidth;
+ bboxl = (int)PageLength;
}
fprintf(stderr, "DEBUG: pagew = %.1f, pagel = %.1f\n", pagew, pagel);
@@ -3124,7 +3100,7 @@ start_nup(pstops_doc_t *doc, /* I - Document information */
if (doc->page_border && show_border)
{
int rects; /* Number of border rectangles */
- float fscale; /* Scaling value for points */
+ double fscale; /* Scaling value for points */
rects = (doc->page_border & PSTOPS_BORDERDOUBLE) ? 2 : 1;
@@ -3364,7 +3340,7 @@ write_options(
{
int i; /* Looping var */
ppd_option_t *option; /* PPD option */
- int min_order; /* Minimum OrderDependency value */
+ float min_order; /* Minimum OrderDependency value */
char *doc_setup, /* DocumentSetup commands to send */
*any_setup; /* AnySetup commands to send */
@@ -3429,5 +3405,5 @@ write_options(
/*
- * End of "$Id: pstops.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: pstops.c 12655 2015-05-22 17:26:40Z msweet $".
*/
diff --git a/filter/raster.c b/filter/raster.c
index 29522e5..5251f31 100644
--- a/filter/raster.c
+++ b/filter/raster.c
@@ -1,44 +1,20 @@
/*
- * "$Id: raster.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: raster.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * Raster file routines for CUPS.
+ * Raster file routines for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * This file is part of the CUPS Imaging library.
+ * This file is part of the CUPS Imaging library.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * cupsRasterClose() - Close a raster stream.
- * cupsRasterOpen() - Open a raster stream using a file descriptor.
- * cupsRasterOpenIO() - Open a raster stream using a callback function.
- * cupsRasterReadHeader() - Read a raster page header and store it in a
- * version 1 page header structure.
- * cupsRasterReadHeader2() - Read a raster page header and store it in a
- * version 2 page header structure.
- * cupsRasterReadPixels() - Read raster pixels.
- * cupsRasterWriteHeader() - Write a raster page header from a version 1
- * page header structure.
- * cupsRasterWriteHeader2() - Write a raster page header from a version 2
- * page header structure.
- * cupsRasterWritePixels() - Write raster pixels.
- * cups_raster_read_header() - Read a raster page header.
- * cups_raster_read() - Read through the raster buffer.
- * cups_raster_update() - Update the raster header and row count for the
- * current page.
- * cups_raster_write() - Write a row of compressed raster data...
- * cups_read_fd() - Read bytes from a file.
- * cups_swap() - Swap bytes in raster data...
- * cups_write_fd() - Write bytes to a file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -62,7 +38,7 @@ struct _cups_raster_s /**** Raster stream data ****/
cups_raster_iocb_t iocb; /* IO callback */
cups_mode_t mode; /* Read/write mode */
cups_page_header2_t header; /* Raster header for current page */
- int count, /* Current row run-length count */
+ unsigned count, /* Current row run-length count */
remaining, /* Remaining rows in page image */
bpp; /* Bytes per pixel/color */
unsigned char *pixels, /* Pixels for current row */
@@ -74,6 +50,9 @@ struct _cups_raster_s /**** Raster stream data ****/
*bufptr, /* Current (read) position in buffer */
*bufend; /* End of current (read) buffer */
size_t bufsize; /* Buffer size */
+#ifdef DEBUG
+ size_t iocount; /* Number of bytes read/written */
+#endif /* DEBUG */
};
@@ -81,15 +60,15 @@ struct _cups_raster_s /**** Raster stream data ****/
* Local functions...
*/
-static int cups_raster_io(cups_raster_t *r, unsigned char *buf, int bytes);
+static ssize_t cups_raster_io(cups_raster_t *r, unsigned char *buf, size_t bytes);
static unsigned cups_raster_read_header(cups_raster_t *r);
-static int cups_raster_read(cups_raster_t *r, unsigned char *buf,
- int bytes);
-static void cups_raster_update(cups_raster_t *r);
-static int cups_raster_write(cups_raster_t *r,
+static ssize_t cups_raster_read(cups_raster_t *r, unsigned char *buf,
+ size_t bytes);
+static int cups_raster_update(cups_raster_t *r);
+static ssize_t cups_raster_write(cups_raster_t *r,
const unsigned char *pixels);
static ssize_t cups_read_fd(void *ctx, unsigned char *buf, size_t bytes);
-static void cups_swap(unsigned char *buf, int bytes);
+static void cups_swap(unsigned char *buf, size_t bytes);
static ssize_t cups_write_fd(void *ctx, unsigned char *buf, size_t bytes);
@@ -217,7 +196,7 @@ cupsRasterOpenIO(
r->sync == CUPS_RASTER_REVSYNCv2)
r->swapped = 1;
- DEBUG_printf(("r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync));
+ DEBUG_printf(("1cupsRasterOpenIO: r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync));
}
else
{
@@ -244,8 +223,7 @@ cupsRasterOpenIO(
break;
}
- if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync))
- < sizeof(r->sync))
+ if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) < (ssize_t)sizeof(r->sync))
{
_cupsRasterAddError("Unable to write raster stream header: %s\n",
strerror(errno));
@@ -281,7 +259,10 @@ cupsRasterReadHeader(
*/
if (!cups_raster_read_header(r))
+ {
+ memset(h, 0, sizeof(cups_page_header_t));
return (0);
+ }
/*
* Copy the header to the user-supplied buffer...
@@ -309,8 +290,13 @@ cupsRasterReadHeader2(
* Get the raster header...
*/
+ DEBUG_printf(("cupsRasterReadHeader2(r=%p, h=%p)", r, h));
+
if (!cups_raster_read_header(r))
+ {
+ memset(h, 0, sizeof(cups_page_header2_t));
return (0);
+ }
/*
* Copy the header to the user-supplied buffer...
@@ -335,18 +321,25 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
unsigned char *p, /* I - Pointer to pixel buffer */
unsigned len) /* I - Number of bytes to read */
{
- int bytes; /* Bytes read */
+ ssize_t bytes; /* Bytes read */
unsigned cupsBytesPerLine; /* cupsBytesPerLine value */
unsigned remaining; /* Bytes remaining */
unsigned char *ptr, /* Pointer to read buffer */
byte, /* Byte from file */
*temp; /* Pointer into buffer */
- int count; /* Repetition count */
+ unsigned count; /* Repetition count */
+
+ DEBUG_printf(("cupsRasterReadPixels(r=%p, p=%p, len=%u)", r, p, len));
if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0 ||
r->header.cupsBytesPerLine == 0)
+ {
+ DEBUG_puts("1cupsRasterReadPixels: Returning 0.");
return (0);
+ }
+
+ DEBUG_printf(("1cupsRasterReadPixels: compressed=%d, remaining=%u", r->compressed, r->remaining));
if (!r->compressed)
{
@@ -357,7 +350,10 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
r->remaining -= len / r->header.cupsBytesPerLine;
if (cups_raster_io(r, p, len) < (ssize_t)len)
+ {
+ DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
return (0);
+ }
/*
* Swap bytes as needed...
@@ -373,6 +369,8 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
* Return...
*/
+ DEBUG_printf(("1cupsRasterReadPixels: Returning %u", len));
+
return (len);
}
@@ -401,15 +399,18 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
*/
if (!cups_raster_read(r, &byte, 1))
+ {
+ DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
return (0);
+ }
- r->count = byte + 1;
+ r->count = (unsigned)byte + 1;
if (r->count > 1)
ptr = r->pixels;
temp = ptr;
- bytes = cupsBytesPerLine;
+ bytes = (ssize_t)cupsBytesPerLine;
while (bytes > 0)
{
@@ -418,7 +419,10 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
*/
if (!cups_raster_read(r, &byte, 1))
+ {
+ DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
return (0);
+ }
if (byte & 128)
{
@@ -426,13 +430,16 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
* Copy N literal pixels...
*/
- count = (257 - byte) * r->bpp;
+ count = (unsigned)(257 - byte) * r->bpp;
- if (count > bytes)
- count = bytes;
+ if (count > (unsigned)bytes)
+ count = (unsigned)bytes;
if (!cups_raster_read(r, temp, count))
+ {
+ DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
return (0);
+ }
temp += count;
bytes -= count;
@@ -443,9 +450,9 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
* Repeat the next N bytes...
*/
- count = (byte + 1) * r->bpp;
- if (count > bytes)
- count = bytes;
+ count = ((unsigned)byte + 1) * r->bpp;
+ if (count > (unsigned)bytes)
+ count = (unsigned)bytes;
if (count < r->bpp)
break;
@@ -453,7 +460,10 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
bytes -= count;
if (!cups_raster_read(r, temp, r->bpp))
+ {
+ DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
return (0);
+ }
temp += r->bpp;
count -= r->bpp;
@@ -475,7 +485,7 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
r->header.cupsBitsPerPixel == 12 ||
r->header.cupsBitsPerPixel == 16) &&
r->swapped)
- cups_swap(ptr, bytes);
+ cups_swap(ptr, (size_t)bytes);
/*
* Update pointers...
@@ -483,14 +493,14 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
if (remaining >= cupsBytesPerLine)
{
- bytes = cupsBytesPerLine;
+ bytes = (ssize_t)cupsBytesPerLine;
r->pcurrent = r->pixels;
r->count --;
r->remaining --;
}
else
{
- bytes = remaining;
+ bytes = (ssize_t)remaining;
r->pcurrent = r->pixels + bytes;
}
@@ -499,7 +509,7 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
*/
if (ptr != p)
- memcpy(p, ptr, bytes);
+ memcpy(p, ptr, (size_t)bytes);
}
else
{
@@ -508,9 +518,9 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
*/
if ((unsigned)(bytes = (int)(r->pend - r->pcurrent)) > remaining)
- bytes = remaining;
+ bytes = (ssize_t)remaining;
- memcpy(p, r->pcurrent, bytes);
+ memcpy(p, r->pcurrent, (size_t)bytes);
r->pcurrent += bytes;
if (r->pcurrent >= r->pend)
@@ -521,10 +531,12 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
}
}
- remaining -= bytes;
+ remaining -= (unsigned)bytes;
p += bytes;
}
+ DEBUG_printf(("1cupsRasterReadPixels: Returning %u", len));
+
return (len);
}
@@ -554,7 +566,8 @@ cupsRasterWriteHeader(
memset(&(r->header), 0, sizeof(r->header));
memcpy(&(r->header), h, sizeof(cups_page_header_t));
- cups_raster_update(r);
+ if (!cups_raster_update(r))
+ return (0);
/*
* Write the raster header...
@@ -628,8 +641,9 @@ cupsRasterWriteHeader(
fh.cupsInteger[15] = htonl(r->header.cupsInteger[15]);
/* VendorLength */
- memcpy(fh.cupsReal, r->header.cupsReal,
- sizeof(fh.cupsReal) + sizeof(fh.cupsString));
+ void *dst = fh.cupsReal; /* Bypass bogus compiler warning */
+ void *src = r->header.cupsReal;
+ memcpy(dst, src, sizeof(fh.cupsReal) + sizeof(fh.cupsString));
/* VendorData */
strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent,
@@ -669,7 +683,8 @@ cupsRasterWriteHeader2(
memcpy(&(r->header), h, sizeof(cups_page_header2_t));
- cups_raster_update(r);
+ if (!cups_raster_update(r))
+ return (0);
/*
* Write the raster header...
@@ -724,14 +739,10 @@ cupsRasterWriteHeader2(
fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]);
fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]);
fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]);
- fh.cupsInteger[3] = htonl((unsigned)(r->header.cupsImagingBBox[0] *
- r->header.HWResolution[0]));
- fh.cupsInteger[4] = htonl((unsigned)(r->header.cupsImagingBBox[1] *
- r->header.HWResolution[1]));
- fh.cupsInteger[5] = htonl((unsigned)(r->header.cupsImagingBBox[2] *
- r->header.HWResolution[0]));
- fh.cupsInteger[6] = htonl((unsigned)(r->header.cupsImagingBBox[3] *
- r->header.HWResolution[1]));
+ fh.cupsInteger[3] = htonl((unsigned)(r->header.cupsImagingBBox[0] * r->header.HWResolution[0] / 72.0));
+ fh.cupsInteger[4] = htonl((unsigned)(r->header.cupsImagingBBox[1] * r->header.HWResolution[1] / 72.0));
+ fh.cupsInteger[5] = htonl((unsigned)(r->header.cupsImagingBBox[2] * r->header.HWResolution[0] / 72.0));
+ fh.cupsInteger[6] = htonl((unsigned)(r->header.cupsImagingBBox[3] * r->header.HWResolution[1] / 72.0));
fh.cupsInteger[7] = htonl(0xffffff);
return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh));
@@ -755,7 +766,7 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
unsigned char *p, /* I - Bytes to write */
unsigned len)/* I - Number of bytes to write */
{
- int bytes; /* Bytes read */
+ ssize_t bytes; /* Bytes read */
unsigned remaining; /* Bytes remaining */
@@ -817,24 +828,29 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
* Write the byte-swapped buffer...
*/
- return (cups_raster_io(r, r->buffer, len));
+ bytes = cups_raster_io(r, r->buffer, len);
}
else
- return (cups_raster_io(r, p, len));
+ bytes = cups_raster_io(r, p, len);
+
+ if (bytes < len)
+ return (0);
+ else
+ return (len);
}
/*
* Otherwise, compress each line...
*/
- for (remaining = len; remaining > 0; remaining -= bytes, p += bytes)
+ for (remaining = len; remaining > 0; remaining -= (unsigned)bytes, p += bytes)
{
/*
* Figure out the number of remaining bytes on the current line...
*/
- if ((bytes = remaining) > (int)(r->pend - r->pcurrent))
- bytes = (int)(r->pend - r->pcurrent);
+ if ((bytes = (ssize_t)remaining) > (ssize_t)(r->pend - r->pcurrent))
+ bytes = (ssize_t)(r->pend - r->pcurrent);
if (r->count > 0)
{
@@ -842,9 +858,9 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
* Check to see if this line is the same as the previous line...
*/
- if (memcmp(p, r->pcurrent, bytes))
+ if (memcmp(p, r->pcurrent, (size_t)bytes))
{
- if (!cups_raster_write(r, r->pixels))
+ if (cups_raster_write(r, r->pixels) <= 0)
return (0);
r->count = 0;
@@ -873,10 +889,15 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
r->remaining --;
if (r->remaining == 0)
- return (cups_raster_write(r, r->pixels));
+ {
+ if (cups_raster_write(r, r->pixels) <= 0)
+ return (0);
+ else
+ return (len);
+ }
else if (r->count == 256)
{
- if (cups_raster_write(r, r->pixels) == 0)
+ if (cups_raster_write(r, r->pixels) <= 0)
return (0);
r->count = 0;
@@ -893,7 +914,7 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
* Copy the raster data to the buffer...
*/
- memcpy(r->pcurrent, p, bytes);
+ memcpy(r->pcurrent, p, (size_t)bytes);
r->pcurrent += bytes;
@@ -913,7 +934,10 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
r->remaining --;
if (r->remaining == 0)
- return (cups_raster_write(r, r->pixels));
+ {
+ if (cups_raster_write(r, r->pixels) <= 0)
+ return (0);
+ }
}
}
}
@@ -930,12 +954,16 @@ static unsigned /* O - 1 on success, 0 on fail */
cups_raster_read_header(
cups_raster_t *r) /* I - Raster stream */
{
- int len; /* Length for read/swap */
+ size_t len; /* Length for read/swap */
+
+ DEBUG_printf(("3cups_raster_read_header(r=%p), r->mode=%d", r, r ? r->mode : 0));
if (r == NULL || r->mode != CUPS_RASTER_READ)
return (0);
+ DEBUG_printf(("4cups_raster_read_header: r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount));
+
/*
* Get the length of the raster header...
*/
@@ -945,14 +973,19 @@ cups_raster_read_header(
else
len = sizeof(cups_page_header2_t);
+ DEBUG_printf(("4cups_raster_read_header: len=%d", (int)len));
+
/*
* Read the header...
*/
memset(&(r->header), 0, sizeof(r->header));
- if (cups_raster_read(r, (unsigned char *)&(r->header), len) < len)
+ if (cups_raster_read(r, (unsigned char *)&(r->header), len) < (ssize_t)len)
+ {
+ DEBUG_printf(("4cups_raster_read_header: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount));
return (0);
+ }
/*
* Swap bytes as needed...
@@ -964,21 +997,19 @@ cups_raster_read_header(
temp; /* Temporary copy */
- DEBUG_puts("Swapping header bytes...");
+ DEBUG_puts("4cups_raster_read_header: Swapping header bytes.");
for (len = 81, s = &(r->header.AdvanceDistance);
len > 0;
len --, s ++)
{
- DEBUG_printf(("%08x =>", *s));
-
temp = *s;
*s = ((temp & 0xff) << 24) |
((temp & 0xff00) << 8) |
((temp & 0xff0000) >> 8) |
((temp & 0xff000000) >> 24);
- DEBUG_printf((" %08x\n", *s));
+ DEBUG_printf(("4cups_raster_read_header: %08x => %08x", temp, *s));
}
}
@@ -986,9 +1017,12 @@ cups_raster_read_header(
* Update the header and row count...
*/
- cups_raster_update(r);
+ if (!cups_raster_update(r))
+ return (0);
+
+ DEBUG_printf(("4cups_raster_read_header: cupsBitsPerPixel=%u, cupsBitsPerColor=%u, cupsBytesPerLine=%u, cupsWidth=%u, cupsHeight=%u, r->bpp=%d", r->header.cupsBitsPerPixel, r->header.cupsBitsPerColor, r->header.cupsBytesPerLine, r->header.cupsWidth, r->header.cupsHeight, r->bpp));
- return (r->header.cupsBytesPerLine != 0 && r->header.cupsHeight != 0);
+ return (r->header.cupsBitsPerPixel > 0 && r->header.cupsBitsPerPixel <= 240 && r->header.cupsBitsPerColor > 0 && r->header.cupsBitsPerColor <= 16 && r->header.cupsBytesPerLine > 0 && r->header.cupsBytesPerLine <= 0x7fffffff && r->header.cupsHeight != 0 && (r->header.cupsBytesPerLine % r->bpp) == 0);
}
@@ -996,30 +1030,41 @@ cups_raster_read_header(
* 'cups_raster_io()' - Read/write bytes from a context, handling interruptions.
*/
-static int /* O - Bytes read or -1 */
+static ssize_t /* O - Bytes read/write or -1 */
cups_raster_io(cups_raster_t *r, /* I - Raster stream */
- unsigned char *buf, /* I - Buffer for read/write */
- int bytes) /* I - Number of bytes to read/write */
+ unsigned char *buf, /* I - Buffer for read/write */
+ size_t bytes) /* I - Number of bytes to read/write */
{
- ssize_t count; /* Number of bytes read/written */
- size_t total; /* Total bytes read/written */
+ ssize_t count, /* Number of bytes read/written */
+ total; /* Total bytes read/written */
- DEBUG_printf(("4cups_raster_io(r=%p, buf=%p, bytes=%d)", r, buf, bytes));
+ DEBUG_printf(("5cups_raster_io(r=%p, buf=%p, bytes=" CUPS_LLFMT ")", r, buf, CUPS_LLCAST bytes));
- for (total = 0; total < (size_t)bytes; total += count, buf += count)
+ for (total = 0; total < (ssize_t)bytes; total += count, buf += count)
{
- count = (*r->iocb)(r->ctx, buf, bytes - total);
+ count = (*r->iocb)(r->ctx, buf, bytes - (size_t)total);
- DEBUG_printf(("5cups_raster_io: count=%d, total=%d", (int)count,
- (int)total));
+ DEBUG_printf(("6cups_raster_io: count=%d, total=%d", (int)count, (int)total));
if (count == 0)
+ {
+ DEBUG_puts("6cups_raster_io: Returning 0.");
return (0);
+ }
else if (count < 0)
+ {
+ DEBUG_puts("6cups_raster_io: Returning -1 on error.");
return (-1);
+ }
+
+#ifdef DEBUG
+ r->iocount += (size_t)count;
+#endif /* DEBUG */
}
- return ((int)total);
+ DEBUG_printf(("6cups_raster_io: Returning " CUPS_LLFMT ".", CUPS_LLCAST total));
+
+ return (total);
}
@@ -1027,17 +1072,17 @@ cups_raster_io(cups_raster_t *r, /* I - Raster stream */
* 'cups_raster_read()' - Read through the raster buffer.
*/
-static int /* O - Number of bytes read */
+static ssize_t /* O - Number of bytes read */
cups_raster_read(cups_raster_t *r, /* I - Raster stream */
unsigned char *buf, /* I - Buffer */
- int bytes) /* I - Number of bytes to read */
+ size_t bytes) /* I - Number of bytes to read */
{
- int count, /* Number of bytes read */
+ ssize_t count, /* Number of bytes read */
remaining, /* Remaining bytes in buffer */
total; /* Total bytes read */
- DEBUG_printf(("cups_raster_read(r=%p, buf=%p, bytes=%d)\n", r, buf, bytes));
+ DEBUG_printf(("5cups_raster_read(r=%p, buf=%p, bytes=" CUPS_LLFMT ")\n", r, buf, CUPS_LLCAST bytes));
if (!r->compressed)
return (cups_raster_io(r, buf, bytes));
@@ -1046,20 +1091,21 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
* Allocate a read buffer as needed...
*/
- count = 2 * r->header.cupsBytesPerLine;
+ count = (ssize_t)(2 * r->header.cupsBytesPerLine);
+ if (count < 65536)
+ count = 65536;
if ((size_t)count > r->bufsize)
{
- int offset = (int)(r->bufptr - r->buffer);
+ ssize_t offset = r->bufptr - r->buffer;
/* Offset to current start of buffer */
- int end = (int)(r->bufend - r->buffer);
- /* Offset to current end of buffer */
+ ssize_t end = r->bufend - r->buffer;/* Offset to current end of buffer */
unsigned char *rptr; /* Pointer in read buffer */
if (r->buffer)
- rptr = realloc(r->buffer, count);
+ rptr = realloc(r->buffer, (size_t)count);
else
- rptr = malloc(count);
+ rptr = malloc((size_t)count);
if (!rptr)
return (0);
@@ -1067,7 +1113,7 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
r->buffer = rptr;
r->bufptr = rptr + offset;
r->bufend = rptr + end;
- r->bufsize = count;
+ r->bufsize = (size_t)count;
}
/*
@@ -1075,13 +1121,12 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
*/
for (total = 0, remaining = (int)(r->bufend - r->bufptr);
- total < bytes;
+ total < (ssize_t)bytes;
total += count, buf += count)
{
- count = bytes - total;
+ count = (ssize_t)bytes - total;
- DEBUG_printf(("count=%d, remaining=%d, buf=%p, bufptr=%p, bufend=%p...\n",
- count, remaining, buf, r->bufptr, r->bufend));
+ DEBUG_printf(("6cups_raster_read: count=" CUPS_LLFMT ", remaining=" CUPS_LLFMT ", buf=%p, bufptr=%p, bufend=%p", CUPS_LLCAST count, CUPS_LLCAST remaining, buf, r->bufptr, r->bufend));
if (remaining == 0)
{
@@ -1097,6 +1142,10 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
r->bufptr = r->buffer;
r->bufend = r->buffer + remaining;
+
+#ifdef DEBUG
+ r->iocount += (size_t)remaining;
+#endif /* DEBUG */
}
else
{
@@ -1104,11 +1153,15 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
* Read directly into "buf"...
*/
- count = (*r->iocb)(r->ctx, buf, count);
+ count = (*r->iocb)(r->ctx, buf, (size_t)count);
if (count <= 0)
return (0);
+#ifdef DEBUG
+ r->iocount += (size_t)count;
+#endif /* DEBUG */
+
continue;
}
}
@@ -1152,12 +1205,14 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
* Use memcpy() for a large read...
*/
- memcpy(buf, r->bufptr, count);
+ memcpy(buf, r->bufptr, (size_t)count);
r->bufptr += count;
remaining -= count;
}
}
+ DEBUG_printf(("6cups_raster_read: Returning %ld", (long)total));
+
return (total);
}
@@ -1167,7 +1222,7 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */
* current page.
*/
-static void
+static int /* O - 1 on success, 0 on failure */
cups_raster_update(cups_raster_t *r) /* I - Raster stream */
{
if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1 ||
@@ -1248,6 +1303,10 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */
r->header.cupsNumColors = r->header.cupsColorSpace -
CUPS_CSPACE_DEVICE1 + 1;
break;
+
+ default :
+ /* Unknown color space */
+ return (0);
}
}
@@ -1260,6 +1319,9 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */
else
r->bpp = (r->header.cupsBitsPerColor + 7) / 8;
+ if (r->bpp == 0)
+ r->bpp = 1;
+
/*
* Set the number of remaining rows...
*/
@@ -1278,11 +1340,21 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */
if (r->pixels != NULL)
free(r->pixels);
- r->pixels = calloc(r->header.cupsBytesPerLine, 1);
+ if ((r->pixels = calloc(r->header.cupsBytesPerLine, 1)) == NULL)
+ {
+ r->pcurrent = NULL;
+ r->pend = NULL;
+ r->count = 0;
+
+ return (0);
+ }
+
r->pcurrent = r->pixels;
r->pend = r->pixels + r->header.cupsBytesPerLine;
r->count = 0;
}
+
+ return (1);
}
@@ -1290,7 +1362,7 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */
* 'cups_raster_write()' - Write a row of compressed raster data...
*/
-static int /* O - Number of bytes written */
+static ssize_t /* O - Number of bytes written */
cups_raster_write(
cups_raster_t *r, /* I - Raster stream */
const unsigned char *pixels) /* I - Pixel data to write */
@@ -1300,17 +1372,20 @@ cups_raster_write(
*pend, /* End of raster buffer */
*plast; /* Pointer to last pixel */
unsigned char *wptr; /* Pointer into write buffer */
- int bpp, /* Bytes per pixel */
+ unsigned bpp, /* Bytes per pixel */
count; /* Count */
- DEBUG_printf(("cups_raster_write(r=%p, pixels=%p)\n", r, pixels));
+ DEBUG_printf(("3cups_raster_write(r=%p, pixels=%p)\n", r, pixels));
/*
* Allocate a write buffer as needed...
*/
count = r->header.cupsBytesPerLine * 2;
+ if (count < 65536)
+ count = 65536;
+
if ((size_t)count > r->bufsize)
{
if (r->buffer)
@@ -1319,7 +1394,10 @@ cups_raster_write(
wptr = malloc(count);
if (!wptr)
+ {
+ DEBUG_printf(("4cups_raster_write: Unable to allocate " CUPS_LLFMT " bytes for raster buffer: %s", CUPS_LLCAST count, strerror(errno)));
return (-1);
+ }
r->buffer = wptr;
r->bufsize = count;
@@ -1333,7 +1411,7 @@ cups_raster_write(
pend = pixels + r->header.cupsBytesPerLine;
plast = pend - bpp;
wptr = r->buffer;
- *wptr++ = r->count - 1;
+ *wptr++ = (unsigned char)(r->count - 1);
/*
* Write using a modified PackBits compression...
@@ -1364,7 +1442,7 @@ cups_raster_write(
if (memcmp(ptr, ptr + bpp, bpp))
break;
- *wptr++ = count - 1;
+ *wptr++ = (unsigned char)(count - 1);
for (count = bpp; count > 0; count --)
*wptr++ = *ptr++;
}
@@ -1384,7 +1462,7 @@ cups_raster_write(
ptr += bpp;
}
- *wptr++ = 257 - count;
+ *wptr++ = (unsigned char)(257 - count);
count *= bpp;
memcpy(wptr, start, count);
@@ -1392,7 +1470,9 @@ cups_raster_write(
}
}
- return (cups_raster_io(r, r->buffer, (int)(wptr - r->buffer)));
+ DEBUG_printf(("4cups_raster_write: Writing " CUPS_LLFMT " bytes.", CUPS_LLCAST (wptr - r->buffer)));
+
+ return (cups_raster_io(r, r->buffer, (size_t)(wptr - r->buffer)));
}
@@ -1416,7 +1496,12 @@ cups_read_fd(void *ctx, /* I - File descriptor as pointer */
while ((count = read(fd, buf, bytes)) < 0)
#endif /* WIN32 */
if (errno != EINTR && errno != EAGAIN)
+ {
+ DEBUG_printf(("4cups_read_fd: %s", strerror(errno)));
return (-1);
+ }
+
+ DEBUG_printf(("4cups_read_fd: Returning %d bytes.", (int)count));
return (count);
}
@@ -1428,7 +1513,7 @@ cups_read_fd(void *ctx, /* I - File descriptor as pointer */
static void
cups_swap(unsigned char *buf, /* I - Buffer to swap */
- int bytes) /* I - Number of bytes to swap */
+ size_t bytes) /* I - Number of bytes to swap */
{
unsigned char even, odd; /* Temporary variables */
@@ -1468,12 +1553,15 @@ cups_write_fd(void *ctx, /* I - File descriptor pointer */
while ((count = write(fd, buf, bytes)) < 0)
#endif /* WIN32 */
if (errno != EINTR && errno != EAGAIN)
+ {
+ DEBUG_printf(("4cups_write_fd: %s", strerror(errno)));
return (-1);
+ }
return (count);
}
/*
- * End of "$Id: raster.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: raster.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/filter/rasterbench.c b/filter/rasterbench.c
index b21df91..56d2778 100644
--- a/filter/rasterbench.c
+++ b/filter/rasterbench.c
@@ -1,25 +1,18 @@
/*
- * "$Id: rasterbench.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rasterbench.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Raster benchmark program for CUPS.
+ * Raster benchmark program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Benchmark the raster read/write functions.
- * compute_median() - Compute the median time for a test.
- * read_test() - Benchmark the raster read functions.
- * write_test() - Benchmark the raster write functions.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -181,7 +174,7 @@ get_time(void)
static void
read_test(int fd) /* I - File descriptor to read from */
{
- int y; /* Looping var */
+ unsigned y; /* Looping var */
cups_raster_t *r; /* Raster stream */
cups_page_header2_t header; /* Page header */
unsigned char buffer[8 * TEST_WIDTH];
@@ -263,8 +256,8 @@ static void
write_test(int fd, /* I - File descriptor to write to */
cups_mode_t mode) /* I - Write mode */
{
- int page, x, y; /* Looping vars */
- int count; /* Number of bytes to set */
+ unsigned page, x, y; /* Looping vars */
+ unsigned count; /* Number of bytes to set */
cups_raster_t *r; /* Raster stream */
cups_page_header2_t header; /* Page header */
unsigned char data[32][8 * TEST_WIDTH];
@@ -295,7 +288,7 @@ write_test(int fd, /* I - File descriptor to write to */
break;
}
- data[y][x] = CUPS_RAND();
+ data[y][x] = (unsigned char)CUPS_RAND();
}
}
@@ -351,5 +344,5 @@ write_test(int fd, /* I - File descriptor to write to */
/*
- * End of "$Id: rasterbench.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rasterbench.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/filter/rastertoepson.c b/filter/rastertoepson.c
index 8533b77..578b0e7 100644
--- a/filter/rastertoepson.c
+++ b/filter/rastertoepson.c
@@ -1,28 +1,18 @@
/*
- * "$Id: rastertoepson.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertoepson.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * EPSON ESC/P and ESC/P2 filter for CUPS.
+ * EPSON ESC/P and ESC/P2 filter for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * Setup() - Prepare the printer for printing.
- * StartPage() - Start a page of graphics.
- * EndPage() - Finish a page of graphics.
- * Shutdown() - Shutdown the printer.
- * CompressData() - Compress a line of graphics.
- * OutputLine() - Output a line of graphics.
- * main() - Main entry and processing of driver.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -66,17 +56,17 @@ unsigned char *Planes[6], /* Output buffers */
*CompBuffer, /* Compression buffer */
*LineBuffers[2]; /* Line bitmap buffers */
int Model, /* Model number */
- NumPlanes, /* Number of color planes */
+ EjectPage, /* Eject the page when done? */
+ Shingling, /* Shingle output? */
+ Canceled; /* Has the current job been canceled? */
+unsigned NumPlanes, /* Number of color planes */
Feed, /* Number of lines to skip */
- EjectPage; /* Eject the page when done? */
-int DotBit, /* Bit in buffers */
+ DotBit, /* Bit in buffers */
DotBytes, /* # bytes in a dot column */
DotColumns, /* # columns in 1/60 inch */
LineCount, /* # of lines processed */
EvenOffset, /* Offset into 'even' buffers */
- OddOffset, /* Offset into 'odd' buffers */
- Shingling, /* Shingle output? */
- Canceled; /* Has the current job been canceled? */
+ OddOffset; /* Offset into 'odd' buffers */
/*
@@ -89,8 +79,8 @@ void EndPage(const cups_page_header2_t *header);
void Shutdown(void);
void CancelJob(int sig);
-void CompressData(const unsigned char *line, int length, int plane,
- int type, int xstep, int ystep);
+void CompressData(const unsigned char *line, unsigned length, unsigned plane,
+ unsigned type, unsigned xstep, unsigned ystep);
void OutputLine(const cups_page_header2_t *header);
void OutputRows(const cups_page_header2_t *header, int row);
@@ -125,9 +115,33 @@ StartPage(
const ppd_file_t *ppd, /* I - PPD file */
const cups_page_header2_t *header) /* I - Page header */
{
- int n, t; /* Numbers */
- int plane; /* Looping var */
+ int n, t; /* Numbers */
+ unsigned plane; /* Looping var */
+
+
+ /*
+ * Show page device dictionary...
+ */
+ fprintf(stderr, "DEBUG: StartPage...\n");
+ fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex);
+ fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]);
+ fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
+ fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]);
+ fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed);
+ fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition);
+ fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies);
+ fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation);
+ fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]);
+ fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth);
+ fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight);
+ fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType);
+ fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor);
+ fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel);
+ fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine);
+ fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder);
+ fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace);
+ fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression);
/*
* Send a reset sequence.
@@ -211,27 +225,26 @@ StartPage(
if (Model < EPSON_ICOLOR)
{
pwrite("\033(U\001\000", 5); /* Resolution/units */
- putchar(3600 / header->HWResolution[1]);
+ putchar((int)(3600 / header->HWResolution[1]));
}
else
{
pwrite("\033(U\005\000", 5);
- putchar(1440 / header->HWResolution[1]);
- putchar(1440 / header->HWResolution[1]);
- putchar(1440 / header->HWResolution[0]);
+ putchar((int)(1440 / header->HWResolution[1]));
+ putchar((int)(1440 / header->HWResolution[1]));
+ putchar((int)(1440 / header->HWResolution[0]));
putchar(0xa0); /* n/1440ths... */
putchar(0x05);
}
- n = header->PageSize[1] * header->HWResolution[1] / 72.0;
+ n = (int)(header->PageSize[1] * header->HWResolution[1] / 72.0);
pwrite("\033(C\002\000", 5); /* Page length */
putchar(n);
putchar(n >> 8);
if (ppd)
- t = (ppd->sizes[1].length - ppd->sizes[1].top) *
- header->HWResolution[1] / 72.0;
+ t = (int)((ppd->sizes[1].length - ppd->sizes[1].top) * header->HWResolution[1] / 72.0);
else
t = 0;
@@ -274,7 +287,7 @@ StartPage(
* Allocate memory for a line/row of graphics...
*/
- if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
+ if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL)
{
fputs("ERROR: Unable to allocate memory\n", stderr);
exit(1);
@@ -285,7 +298,7 @@ StartPage(
if (header->cupsCompression || DotBytes)
{
- if ((CompBuffer = calloc(2, header->cupsWidth)) == NULL)
+ if ((CompBuffer = calloc(2, header->cupsWidth + 1)) == NULL)
{
fputs("ERROR: Unable to allocate memory\n", stderr);
exit(1);
@@ -296,8 +309,7 @@ StartPage(
if (DotBytes)
{
- if ((LineBuffers[0] = calloc(DotBytes,
- header->cupsWidth * (Shingling + 1))) == NULL)
+ if ((LineBuffers[0] = calloc((size_t)DotBytes, header->cupsWidth * (size_t)(Shingling + 1))) == NULL)
{
fputs("ERROR: Unable to allocate memory\n", stderr);
exit(1);
@@ -398,11 +410,11 @@ CancelJob(int sig) /* I - Signal */
void
CompressData(const unsigned char *line, /* I - Data to compress */
- int length,/* I - Number of bytes */
- int plane, /* I - Color plane */
- int type, /* I - Type of compression */
- int xstep, /* I - X resolution */
- int ystep) /* I - Y resolution */
+ unsigned length,/* I - Number of bytes */
+ unsigned plane, /* I - Color plane */
+ unsigned type, /* I - Type of compression */
+ unsigned xstep, /* I - X resolution */
+ unsigned ystep) /* I - Y resolution */
{
const unsigned char *line_ptr, /* Current byte pointer */
*line_end, /* End-of-line byte pointer */
@@ -509,7 +521,7 @@ CompressData(const unsigned char *line, /* I - Data to compress */
count ++;
}
- *comp_ptr++ = 257 - count;
+ *comp_ptr++ = (unsigned char)(257 - count);
*comp_ptr++ = *line_ptr++;
}
else
@@ -530,9 +542,9 @@ CompressData(const unsigned char *line, /* I - Data to compress */
count ++;
}
- *comp_ptr++ = count - 1;
+ *comp_ptr++ = (unsigned char)(count - 1);
- memcpy(comp_ptr, start, count);
+ memcpy(comp_ptr, start, (size_t)count);
comp_ptr += count;
}
}
@@ -572,12 +584,12 @@ CompressData(const unsigned char *line, /* I - Data to compress */
length *= 8;
printf("\033."); /* Raster graphics */
- putchar(type);
- putchar(ystep);
- putchar(xstep);
+ putchar((int)type);
+ putchar((int)ystep);
+ putchar((int)xstep);
putchar(1);
- putchar(length);
- putchar(length >> 8);
+ putchar((int)length);
+ putchar((int)(length >> 8));
}
else
{
@@ -587,15 +599,15 @@ CompressData(const unsigned char *line, /* I - Data to compress */
printf("\033i");
putchar(ctable[plane]);
- putchar(type);
+ putchar((int)type);
putchar(1);
- putchar(length & 255);
- putchar(length >> 8);
+ putchar((int)length);
+ putchar((int)(length >> 8));
putchar(1);
putchar(0);
}
- pwrite(line_ptr, line_end - line_ptr);
+ pwrite(line_ptr, (size_t)(line_end - line_ptr));
fflush(stdout);
}
@@ -610,11 +622,11 @@ OutputLine(
{
if (header->cupsRowCount)
{
- int width;
+ unsigned width;
unsigned char *tempptr,
*evenptr,
*oddptr;
- register int x;
+ unsigned int x;
unsigned char bit;
const unsigned char *pixel;
unsigned char *temp;
@@ -667,13 +679,19 @@ OutputLine(
}
for (width = header->cupsWidth, tempptr = CompBuffer;
- width > 0;
+ width > 1;
width -= 2, tempptr += 2, oddptr += DotBytes * 2,
evenptr += DotBytes * 2)
{
evenptr[0] = tempptr[0];
oddptr[0] = tempptr[1];
}
+
+ if (width == 1)
+ {
+ evenptr[0] = tempptr[0];
+ oddptr[0] = tempptr[1];
+ }
}
else
{
@@ -724,10 +742,9 @@ OutputLine(
}
else
{
- int plane; /* Current plane */
- int bytes; /* Bytes per plane */
- int xstep, ystep; /* X & Y resolutions */
-
+ unsigned plane; /* Current plane */
+ unsigned bytes; /* Bytes per plane */
+ unsigned xstep, ystep; /* X & Y resolutions */
/*
* Write a single line of bitmap data as needed...
@@ -744,7 +761,7 @@ OutputLine(
*/
if (!Planes[plane][0] &&
- memcmp(Planes[plane], Planes[plane] + 1, bytes - 1) == 0)
+ memcmp(Planes[plane], Planes[plane] + 1, (size_t)bytes - 1) == 0)
continue;
/*
@@ -754,14 +771,13 @@ OutputLine(
if (Feed > 0)
{
pwrite("\033(v\002\000", 5); /* Relative vertical position */
- putchar(Feed);
- putchar(Feed >> 8);
+ putchar((int)Feed);
+ putchar((int)(Feed >> 8));
Feed = 0;
}
- CompressData(Planes[plane], bytes, plane, header->cupsCompression, xstep,
- ystep);
+ CompressData(Planes[plane], bytes, plane, header->cupsCompression, xstep, ystep);
}
Feed ++;
@@ -778,8 +794,8 @@ OutputRows(
const cups_page_header2_t *header, /* I - Page image header */
int row) /* I - Row number (0 or 1) */
{
- unsigned i, n; /* Looping vars */
- int dot_count, /* Number of bytes to print */
+ unsigned i, n, /* Looping vars */
+ dot_count, /* Number of bytes to print */
dot_min; /* Minimum number of bytes */
unsigned char *dot_ptr, /* Pointer to print data */
*ptr; /* Current data */
@@ -788,8 +804,7 @@ OutputRows(
dot_min = DotBytes * DotColumns;
if (LineBuffers[row][0] != 0 ||
- memcmp(LineBuffers[row], LineBuffers[row] + 1,
- header->cupsWidth * DotBytes - 1))
+ memcmp(LineBuffers[row], LineBuffers[row] + 1, header->cupsWidth * DotBytes - 1))
{
/*
* Skip leading space...
@@ -826,8 +841,8 @@ OutputRows(
{
putchar(0x1b);
putchar('$');
- putchar(i & 255);
- putchar(i >> 8);
+ putchar((int)(i & 255));
+ putchar((int)(i >> 8));
}
/*
@@ -867,9 +882,9 @@ OutputRows(
break;
}
- n = (unsigned)dot_count / DotBytes;
- putchar(n & 255);
- putchar(n / 256);
+ n = dot_count / DotBytes;
+ putchar((int)(n & 255));
+ putchar((int)(n / 256));
/*
* Write the graphics data...
@@ -888,6 +903,9 @@ OutputRows(
putchar(0);
}
+ if (dot_count & 1)
+ putchar(*ptr);
+
/*
* Move the head back and print the odd bytes...
*/
@@ -898,8 +916,8 @@ OutputRows(
{
putchar(0x1b);
putchar('$');
- putchar(i & 255);
- putchar(i >> 8);
+ putchar((int)(i & 255));
+ putchar((int)(i >> 8));
}
if (header->HWResolution[0] == 120)
@@ -908,14 +926,17 @@ OutputRows(
printf("\033*\003"); /* Select bit image */
n = (unsigned)dot_count / DotBytes;
- putchar(n & 255);
- putchar(n / 256);
+ putchar((int)(n & 255));
+ putchar((int)(n / 256));
for (n = dot_count / 2, ptr = dot_ptr + 1; n > 0; n --, ptr += 2)
{
putchar(0);
putchar(*ptr);
}
+
+ if (dot_count & 1)
+ putchar(0);
}
else
pwrite(dot_ptr, dot_count);
@@ -958,7 +979,7 @@ main(int argc, /* I - Number of command-line arguments */
cups_page_header2_t header; /* Page header from file */
ppd_file_t *ppd; /* PPD file */
int page; /* Current page */
- int y; /* Current line */
+ unsigned y; /* Current line */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
@@ -1090,9 +1111,9 @@ main(int argc, /* I - Number of command-line arguments */
if ((y & 127) == 0)
{
_cupsLangPrintFilter(stderr, "INFO",
- _("Printing page %d, %d%% complete."),
+ _("Printing page %d, %u%% complete."),
page, 100 * y / header.cupsHeight);
- fprintf(stderr, "ATTR: job-media-progress=%d\n",
+ fprintf(stderr, "ATTR: job-media-progress=%u\n",
100 * y / header.cupsHeight);
}
@@ -1153,5 +1174,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: rastertoepson.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertoepson.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/filter/rastertohp.c b/filter/rastertohp.c
index e016e5f..1f54f92 100644
--- a/filter/rastertohp.c
+++ b/filter/rastertohp.c
@@ -1,29 +1,18 @@
/*
- * "$Id: rastertohp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertohp.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * Hewlett-Packard Page Control Language filter for CUPS.
+ * Hewlett-Packard Page Control Language filter for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * Setup() - Prepare the printer for printing.
- * StartPage() - Start a page of graphics.
- * EndPage() - Finish a page of graphics.
- * Shutdown() - Shutdown the printer.
- * CancelJob() - Cancel the current job...
- * CompressData() - Compress a line of graphics.
- * OutputLine() - Output a line of graphics.
- * main() - Main entry and processing of driver.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -47,10 +36,10 @@
unsigned char *Planes[4], /* Output buffers */
*CompBuffer, /* Compression buffer */
*BitBuffer; /* Buffer for output bits */
-int NumPlanes, /* Number of color planes */
+unsigned NumPlanes, /* Number of color planes */
ColorBits, /* Number of bits per color */
- Feed, /* Number of lines to skip */
- Duplex, /* Current duplex mode */
+ Feed; /* Number of lines to skip */
+int Duplex, /* Current duplex mode */
Page, /* Current page number */
Canceled; /* Has the current job been canceled? */
@@ -65,7 +54,7 @@ void EndPage(void);
void Shutdown(void);
void CancelJob(int sig);
-void CompressData(unsigned char *line, int length, int plane, int type);
+void CompressData(unsigned char *line, unsigned length, unsigned plane, unsigned type);
void OutputLine(cups_page_header2_t *header);
@@ -93,7 +82,7 @@ void
StartPage(ppd_file_t *ppd, /* I - PPD file */
cups_page_header2_t *header) /* I - Page header */
{
- int plane; /* Looping var */
+ unsigned plane; /* Looping var */
/*
@@ -101,39 +90,15 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
*/
fprintf(stderr, "DEBUG: StartPage...\n");
- fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass);
- fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor);
- fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType);
- fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType);
-
- fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance);
- fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia);
- fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate);
- fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia);
fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex);
- fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0],
- header->HWResolution[1]);
- fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n",
- header->ImagingBoundingBox[0], header->ImagingBoundingBox[1],
- header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
- fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet);
- fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog);
- fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge);
- fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0],
- header->Margins[1]);
+ fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]);
+ fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
+ fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]);
fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed);
fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition);
- fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight);
- fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint);
- fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint);
fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies);
fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation);
- fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp);
- fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0],
- header->PageSize[1]);
- fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations);
- fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch);
- fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble);
+ fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]);
fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth);
fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight);
fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType);
@@ -287,33 +252,33 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
printf("\033*g26W");
putchar(2); /* Format 2 */
- putchar(NumPlanes); /* Output planes */
+ putchar((int)NumPlanes); /* Output planes */
- putchar(header->HWResolution[0] >> 8); /* Black resolution */
- putchar(header->HWResolution[0]);
- putchar(header->HWResolution[1] >> 8);
- putchar(header->HWResolution[1]);
+ putchar((int)(header->HWResolution[0] >> 8));/* Black resolution */
+ putchar((int)header->HWResolution[0]);
+ putchar((int)(header->HWResolution[1] >> 8));
+ putchar((int)header->HWResolution[1]);
putchar(0);
putchar(1 << ColorBits); /* # of black levels */
- putchar(header->HWResolution[0] >> 8); /* Cyan resolution */
- putchar(header->HWResolution[0]);
- putchar(header->HWResolution[1] >> 8);
- putchar(header->HWResolution[1]);
+ putchar((int)(header->HWResolution[0] >> 8));/* Cyan resolution */
+ putchar((int)header->HWResolution[0]);
+ putchar((int)(header->HWResolution[1] >> 8));
+ putchar((int)header->HWResolution[1]);
putchar(0);
putchar(1 << ColorBits); /* # of cyan levels */
- putchar(header->HWResolution[0] >> 8); /* Magenta resolution */
- putchar(header->HWResolution[0]);
- putchar(header->HWResolution[1] >> 8);
- putchar(header->HWResolution[1]);
+ putchar((int)(header->HWResolution[0] >> 8));/* Magenta resolution */
+ putchar((int)header->HWResolution[0]);
+ putchar((int)(header->HWResolution[1] >> 8));
+ putchar((int)header->HWResolution[1]);
putchar(0);
putchar(1 << ColorBits); /* # of magenta levels */
- putchar(header->HWResolution[0] >> 8); /* Yellow resolution */
- putchar(header->HWResolution[0]);
- putchar(header->HWResolution[1] >> 8);
- putchar(header->HWResolution[1]);
+ putchar((int)(header->HWResolution[0] >> 8));/* Yellow resolution */
+ putchar((int)header->HWResolution[0]);
+ putchar((int)(header->HWResolution[1] >> 8));
+ putchar((int)header->HWResolution[1]);
putchar(0);
putchar(1 << ColorBits); /* # of yellow levels */
@@ -321,7 +286,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
}
else
{
- printf("\033*t%dR", header->HWResolution[0]);
+ printf("\033*t%uR", header->HWResolution[0]);
/* Set resolution */
if (header->cupsColorSpace == CUPS_CSPACE_KCMY)
@@ -341,8 +306,8 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
* Set size and position of graphics...
*/
- printf("\033*r%dS", header->cupsWidth); /* Set width */
- printf("\033*r%dT", header->cupsHeight); /* Set height */
+ printf("\033*r%uS", header->cupsWidth); /* Set width */
+ printf("\033*r%uT", header->cupsHeight); /* Set height */
printf("\033&a0H"); /* Set horizontal position */
@@ -356,7 +321,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
printf("\033*r1A"); /* Start graphics */
if (header->cupsCompression)
- printf("\033*b%dM", /* Set compression */
+ printf("\033*b%uM", /* Set compression */
header->cupsCompression);
Feed = 0; /* No blank lines yet */
@@ -365,7 +330,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
* Allocate memory for a line of graphics...
*/
- if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
+ if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL)
{
fputs("ERROR: Unable to allocate memory\n", stderr);
exit(1);
@@ -380,7 +345,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
BitBuffer = NULL;
if (header->cupsCompression)
- CompBuffer = malloc(header->cupsBytesPerLine * 2);
+ CompBuffer = malloc(header->cupsBytesPerLine * 2 + 2);
else
CompBuffer = NULL;
}
@@ -463,15 +428,15 @@ CancelJob(int sig) /* I - Signal */
void
CompressData(unsigned char *line, /* I - Data to compress */
- int length, /* I - Number of bytes */
- int plane, /* I - Color plane */
- int type) /* I - Type of compression */
+ unsigned length, /* I - Number of bytes */
+ unsigned plane, /* I - Color plane */
+ unsigned type) /* I - Type of compression */
{
unsigned char *line_ptr, /* Current byte pointer */
*line_end, /* End-of-line byte pointer */
*comp_ptr, /* Pointer into compression buffer */
*start; /* Start of compression sequence */
- int count; /* Count of bytes for output */
+ unsigned count; /* Count of bytes for output */
switch (type)
@@ -501,7 +466,7 @@ CompressData(unsigned char *line, /* I - Data to compress */
count < 256;
count ++);
- comp_ptr[0] = count - 1;
+ comp_ptr[0] = (unsigned char)(count - 1);
comp_ptr[1] = line_ptr[0];
}
@@ -546,7 +511,7 @@ CompressData(unsigned char *line, /* I - Data to compress */
count ++;
}
- *comp_ptr++ = 257 - count;
+ *comp_ptr++ = (unsigned char)(257 - count);
*comp_ptr++ = *line_ptr++;
}
else
@@ -567,7 +532,7 @@ CompressData(unsigned char *line, /* I - Data to compress */
count ++;
}
- *comp_ptr++ = count - 1;
+ *comp_ptr++ = (unsigned char)(count - 1);
memcpy(comp_ptr, start, count);
comp_ptr += count;
@@ -584,7 +549,7 @@ CompressData(unsigned char *line, /* I - Data to compress */
*/
printf("\033*b%d%c", (int)(line_end - line_ptr), plane);
- fwrite(line_ptr, line_end - line_ptr, 1, stdout);
+ fwrite(line_ptr, (size_t)(line_end - line_ptr), 1, stdout);
}
@@ -595,7 +560,7 @@ CompressData(unsigned char *line, /* I - Data to compress */
void
OutputLine(cups_page_header2_t *header) /* I - Page header */
{
- int plane, /* Current plane */
+ unsigned plane, /* Current plane */
bytes, /* Bytes to write */
count; /* Bytes to convert */
unsigned char bit, /* Current plane data */
@@ -644,15 +609,15 @@ OutputLine(cups_page_header2_t *header) /* I - Page header */
{
bit = plane_ptr[0];
- bit0 = ((bit & 64) << 1) | ((bit & 16) << 2) | ((bit & 4) << 3) | ((bit & 1) << 4);
- bit1 = (bit & 128) | ((bit & 32) << 1) | ((bit & 8) << 2) | ((bit & 2) << 3);
+ bit0 = (unsigned char)(((bit & 64) << 1) | ((bit & 16) << 2) | ((bit & 4) << 3) | ((bit & 1) << 4));
+ bit1 = (unsigned char)((bit & 128) | ((bit & 32) << 1) | ((bit & 8) << 2) | ((bit & 2) << 3));
if (count > 1)
{
bit = plane_ptr[1];
- bit0 |= (bit & 1) | ((bit & 4) >> 1) | ((bit & 16) >> 2) | ((bit & 64) >> 3);
- bit1 |= ((bit & 2) >> 1) | ((bit & 8) >> 2) | ((bit & 32) >> 3) | ((bit & 128) >> 4);
+ bit0 |= (unsigned char)((bit & 1) | ((bit & 4) >> 1) | ((bit & 16) >> 2) | ((bit & 64) >> 3));
+ bit1 |= (unsigned char)(((bit & 2) >> 1) | ((bit & 8) >> 2) | ((bit & 32) >> 3) | ((bit & 128) >> 4));
}
bit_ptr[0] = bit0;
@@ -683,7 +648,7 @@ main(int argc, /* I - Number of command-line arguments */
int fd; /* File descriptor */
cups_raster_t *ras; /* Raster stream for printing */
cups_page_header2_t header; /* Page header from file */
- int y; /* Current line */
+ unsigned y; /* Current line */
ppd_file_t *ppd; /* PPD file */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
@@ -814,9 +779,9 @@ main(int argc, /* I - Number of command-line arguments */
if ((y & 127) == 0)
{
_cupsLangPrintFilter(stderr, "INFO",
- _("Printing page %d, %d%% complete."),
+ _("Printing page %d, %u%% complete."),
Page, 100 * y / header.cupsHeight);
- fprintf(stderr, "ATTR: job-media-progress=%d\n",
+ fprintf(stderr, "ATTR: job-media-progress=%u\n",
100 * y / header.cupsHeight);
}
@@ -882,5 +847,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: rastertohp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertohp.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/filter/rastertolabel.c b/filter/rastertolabel.c
index cb2847c..f5c6d12 100644
--- a/filter/rastertolabel.c
+++ b/filter/rastertolabel.c
@@ -1,29 +1,18 @@
/*
- * "$Id: rastertolabel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertolabel.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * Label printer filter for CUPS.
+ * Label printer filter for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2001-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2001-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * Setup() - Prepare the printer for printing.
- * StartPage() - Start a page of graphics.
- * EndPage() - Finish a page of graphics.
- * CancelJob() - Cancel the current job...
- * OutputLine() - Output a line of graphics.
- * PCLCompress() - Output a PCL (mode 3) compressed line.
- * ZPLCompress() - Output a run-length compression sequence.
- * main() - Main entry and processing of driver.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -78,10 +67,10 @@
unsigned char *Buffer; /* Output buffer */
unsigned char *CompBuffer; /* Compression buffer */
unsigned char *LastBuffer; /* Last buffer */
+unsigned Feed; /* Number of lines to skip */
int LastSet; /* Number of repeat characters */
int ModelNumber, /* cupsModelNumber attribute */
Page, /* Current page */
- Feed, /* Number of lines to skip */
Canceled; /* Non-zero if job is canceled */
@@ -93,9 +82,9 @@ void Setup(ppd_file_t *ppd);
void StartPage(ppd_file_t *ppd, cups_page_header2_t *header);
void EndPage(ppd_file_t *ppd, cups_page_header2_t *header);
void CancelJob(int sig);
-void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header, int y);
-void PCLCompress(unsigned char *line, int length);
-void ZPLCompress(char repeat_char, int repeat_count);
+void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header, unsigned y);
+void PCLCompress(unsigned char *line, unsigned length);
+void ZPLCompress(unsigned char repeat_char, unsigned repeat_count);
/*
@@ -169,7 +158,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
cups_page_header2_t *header) /* I - Page header */
{
ppd_choice_t *choice; /* Marked choice */
- int length; /* Actual label length */
+ unsigned length; /* Actual label length */
/*
@@ -177,39 +166,15 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
*/
fprintf(stderr, "DEBUG: StartPage...\n");
- fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass);
- fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor);
- fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType);
- fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType);
-
- fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance);
- fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia);
- fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate);
- fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia);
fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex);
- fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0],
- header->HWResolution[1]);
- fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n",
- header->ImagingBoundingBox[0], header->ImagingBoundingBox[1],
- header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
- fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet);
- fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog);
- fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge);
- fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0],
- header->Margins[1]);
+ fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]);
+ fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
+ fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]);
fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed);
fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition);
- fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight);
- fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint);
- fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint);
fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies);
fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation);
- fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp);
- fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0],
- header->PageSize[1]);
- fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations);
- fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch);
- fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble);
+ fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]);
fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth);
fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight);
fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType);
@@ -219,9 +184,6 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder);
fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace);
fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression);
- fprintf(stderr, "DEBUG: cupsRowCount = %d\n", header->cupsRowCount);
- fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed);
- fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep);
switch (ModelNumber)
{
@@ -289,7 +251,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL &&
strcmp(choice->choice, "Default"))
{
- float val = atof(choice->choice);
+ double val = atof(choice->choice);
if (val >= 3.0)
printf("S%.0f\n", val);
@@ -302,13 +264,13 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
*/
if (header->cupsCompression > 0 && header->cupsCompression <= 100)
- printf("D%d\n", 15 * header->cupsCompression / 100);
+ printf("D%u\n", 15 * header->cupsCompression / 100);
/*
* Set label size...
*/
- printf("q%d\n", (header->cupsWidth + 7) & ~7);
+ printf("q%u\n", (header->cupsWidth + 7) & ~7U);
break;
case ZEBRA_ZPL :
@@ -317,13 +279,13 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
*/
if (header->cupsCompression > 0 && header->cupsCompression <= 100)
- printf("~SD%02d\n", 30 * header->cupsCompression / 100);
+ printf("~SD%02u\n", 30 * header->cupsCompression / 100);
/*
* Start bitmap graphics...
*/
- printf("~DGR:CUPS.GRF,%d,%d,\n",
+ printf("~DGR:CUPS.GRF,%u,%u,\n",
header->cupsHeight * header->cupsBytesPerLine,
header->cupsBytesPerLine);
@@ -344,8 +306,8 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
printf("! 0 %u %u %u %u\r\n", header->HWResolution[0],
header->HWResolution[1], header->cupsHeight,
header->NumCopies);
- printf("PAGE-WIDTH %d\r\n", header->cupsWidth);
- printf("PAGE-HEIGHT %d\r\n", header->cupsWidth);
+ printf("PAGE-WIDTH %u\r\n", header->cupsWidth);
+ printf("PAGE-HEIGHT %u\r\n", header->cupsWidth);
break;
case INTELLITECH_PCL :
@@ -391,14 +353,15 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
break;
default : /* Custom size */
- printf("\033!f%dZ", header->PageSize[1] * 300 / 72);
+ printf("\033!f%uZ", header->PageSize[1] * 300 / 72);
break;
}
- printf("\033&l%dP", /* Set page length */
+ printf("\033&l%uP", /* Set page length */
header->PageSize[1] / 12);
printf("\033&l0E"); /* Set top margin to 0 */
- printf("\033&l%dX", header->NumCopies);
+ if (header->NumCopies)
+ printf("\033&l%uX", header->NumCopies);
/* Set number copies */
printf("\033&l0L"); /* Turn off perforation skip */
@@ -409,11 +372,11 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
if (Page == 1)
{
if (header->cupsRowFeed) /* inPrintRate */
- printf("\033!p%dS", header->cupsRowFeed);
+ printf("\033!p%uS", header->cupsRowFeed);
- if (header->cupsCompression != ~0)
+ if (header->cupsCompression != ~0U)
/* inPrintDensity */
- printf("\033&d%dA", 30 * header->cupsCompression / 100 - 15);
+ printf("\033&d%uA", 30 * header->cupsCompression / 100 - 15);
if ((choice = ppdFindMarkedChoice(ppd, "inPrintMode")) != NULL)
{
@@ -424,14 +387,14 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
fputs("\033!p1M", stdout);
if (header->cupsRowCount) /* inTearInterval */
- printf("\033!n%dT", header->cupsRowCount);
+ printf("\033!n%uT", header->cupsRowCount);
}
else
{
fputs("\033!p2M", stdout);
if (header->cupsRowStep) /* inCutInterval */
- printf("\033!n%dC", header->cupsRowStep);
+ printf("\033!n%uC", header->cupsRowStep);
}
}
}
@@ -440,12 +403,12 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
* Setup graphics...
*/
- printf("\033*t%dR", header->HWResolution[0]);
+ printf("\033*t%uR", header->HWResolution[0]);
/* Set resolution */
- printf("\033*r%dS", header->cupsWidth);
+ printf("\033*r%uS", header->cupsWidth);
/* Set width */
- printf("\033*r%dT", header->cupsHeight);
+ printf("\033*r%uT", header->cupsHeight);
/* Set height */
printf("\033&a0H"); /* Set horizontal position */
@@ -567,7 +530,7 @@ EndPage(ppd_file_t *ppd, /* I - PPD file */
*/
if (header->cupsRowStep != 200)
- printf("^LT%u\n", header->cupsRowStep);
+ printf("^LT%d\n", header->cupsRowStep);
/*
* Set media type...
@@ -639,13 +602,6 @@ EndPage(ppd_file_t *ppd, /* I - PPD file */
puts("^IDR:CUPS.GRF^FS");
puts("^XZ");
-
- /*
- * Free compression buffers...
- */
-
- free(CompBuffer);
- free(LastBuffer);
break;
case ZEBRA_CPCL :
@@ -714,6 +670,18 @@ EndPage(ppd_file_t *ppd, /* I - PPD file */
*/
free(Buffer);
+
+ if (CompBuffer)
+ {
+ free(CompBuffer);
+ CompBuffer = NULL;
+ }
+
+ if (LastBuffer)
+ {
+ free(LastBuffer);
+ LastBuffer = NULL;
+ }
}
@@ -741,17 +709,19 @@ CancelJob(int sig) /* I - Signal */
void
OutputLine(ppd_file_t *ppd, /* I - PPD file */
cups_page_header2_t *header, /* I - Page header */
- int y) /* I - Line number */
+ unsigned y) /* I - Line number */
{
- int i; /* Looping var */
+ unsigned i; /* Looping var */
unsigned char *ptr; /* Pointer into buffer */
unsigned char *compptr; /* Pointer into compression buffer */
- char repeat_char; /* Repeated character */
- int repeat_count; /* Number of repeated characters */
- static const char *hex = "0123456789ABCDEF";
+ unsigned char repeat_char; /* Repeated character */
+ unsigned repeat_count; /* Number of repeated characters */
+ static const unsigned char *hex = (const unsigned char *)"0123456789ABCDEF";
/* Hex digits */
+ (void)ppd;
+
switch (ModelNumber)
{
case DYMO_3x0 :
@@ -777,17 +747,6 @@ OutputLine(ppd_file_t *ppd, /* I - PPD file */
putchar(0x16);
fwrite(Buffer, header->cupsBytesPerLine, 1, stdout);
fflush(stdout);
-
-#ifdef __sgi
- /*
- * This hack works around a bug in the IRIX serial port driver when
- * run at high baud rates (e.g. 115200 baud)... This results in
- * slightly slower label printing, but at least the labels come
- * out properly.
- */
-
- sginap(1);
-#endif /* __sgi */
}
else
Feed ++;
@@ -919,14 +878,14 @@ OutputLine(ppd_file_t *ppd, /* I - PPD file */
void
PCLCompress(unsigned char *line, /* I - Line to compress */
- int length) /* I - Length of line */
+ unsigned length) /* I - Length of line */
{
unsigned char *line_ptr, /* Current byte pointer */
*line_end, /* End-of-line byte pointer */
*comp_ptr, /* Pointer into compression buffer */
*start, /* Start of compression sequence */
*seed; /* Seed buffer pointer */
- int count, /* Count of bytes for output */
+ unsigned count, /* Count of bytes for output */
offset; /* Offset of bytes for output */
@@ -956,7 +915,7 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
offset = 0;
- if ((count = line_end - line_ptr) > 8)
+ if ((count = (unsigned)(line_end - line_ptr)) > 8)
count = 8;
line_ptr += count;
@@ -977,7 +936,7 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
if (line_ptr == line_end)
break;
- offset = line_ptr - start;
+ offset = (unsigned)(line_ptr - start);
/*
* Find up to 8 non-matching bytes...
@@ -1006,7 +965,7 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
* Output multi-byte offset...
*/
- *comp_ptr++ = ((count - 1) << 5) | 31;
+ *comp_ptr++ = (unsigned char)(((count - 1) << 5) | 31);
offset -= 31;
while (offset >= 255)
@@ -1015,7 +974,7 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
offset -= 255;
}
- *comp_ptr++ = offset;
+ *comp_ptr++ = (unsigned char)offset;
}
else
{
@@ -1023,7 +982,7 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
* Output single-byte offset...
*/
- *comp_ptr++ = ((count - 1) << 5) | offset;
+ *comp_ptr++ = (unsigned char)(((count - 1) << 5) | offset);
}
memcpy(comp_ptr, start, count);
@@ -1035,7 +994,7 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
*/
printf("\033*b%dW", (int)(comp_ptr - CompBuffer));
- fwrite(CompBuffer, comp_ptr - CompBuffer, 1, stdout);
+ fwrite(CompBuffer, (size_t)(comp_ptr - CompBuffer), 1, stdout);
/*
* Save this line as a "seed" buffer for the next...
@@ -1051,8 +1010,8 @@ PCLCompress(unsigned char *line, /* I - Line to compress */
*/
void
-ZPLCompress(char repeat_char, /* I - Character to repeat */
- int repeat_count) /* I - Number of repeated characters */
+ZPLCompress(unsigned char repeat_char, /* I - Character to repeat */
+ unsigned repeat_count) /* I - Number of repeated characters */
{
if (repeat_count > 1)
{
@@ -1073,7 +1032,7 @@ ZPLCompress(char repeat_char, /* I - Character to repeat */
if (repeat_count >= 20)
{
- putchar('f' + repeat_count / 20);
+ putchar((int)('f' + repeat_count / 20));
repeat_count %= 20;
}
@@ -1082,14 +1041,14 @@ ZPLCompress(char repeat_char, /* I - Character to repeat */
*/
if (repeat_count > 0)
- putchar('F' + repeat_count);
+ putchar((int)('F' + repeat_count));
}
/*
* Then the character to be repeated...
*/
- putchar(repeat_char);
+ putchar((int)repeat_char);
}
@@ -1104,7 +1063,7 @@ main(int argc, /* I - Number of command-line arguments */
int fd; /* File descriptor */
cups_raster_t *ras; /* Raster stream for printing */
cups_page_header2_t header; /* Page header from file */
- int y; /* Current line */
+ unsigned y; /* Current line */
ppd_file_t *ppd; /* PPD file */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
@@ -1246,9 +1205,9 @@ main(int argc, /* I - Number of command-line arguments */
if ((y & 15) == 0)
{
_cupsLangPrintFilter(stderr, "INFO",
- _("Printing page %d, %d%% complete."),
+ _("Printing page %d, %u%% complete."),
Page, 100 * y / header.cupsHeight);
- fprintf(stderr, "ATTR: job-media-progress=%d\n",
+ fprintf(stderr, "ATTR: job-media-progress=%u\n",
100 * y / header.cupsHeight);
}
@@ -1308,5 +1267,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: rastertolabel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertolabel.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/filter/rastertopwg.c b/filter/rastertopwg.c
index 7011885..0388bf4 100644
--- a/filter/rastertopwg.c
+++ b/filter/rastertopwg.c
@@ -1,21 +1,17 @@
/*
- * "$Id: rastertopwg.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertopwg.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * CUPS raster to PWG raster format filter for CUPS.
+ * CUPS raster to PWG raster format filter for CUPS.
*
- * Copyright 2011 Apple Inc.
+ * Copyright 2011, 2014-2015 Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright law.
- * Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright law.
+ * Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry for filter.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -41,9 +37,9 @@ main(int argc, /* I - Number of command-line args */
*outras; /* Output raster stream */
cups_page_header2_t inheader, /* Input raster page header */
outheader; /* Output raster page header */
- int y; /* Current line */
+ unsigned y; /* Current line */
unsigned char *line; /* Line buffer */
- int page = 0, /* Current page */
+ unsigned page = 0, /* Current page */
page_width, /* Actual page width */
page_height, /* Actual page height */
page_top, /* Top margin */
@@ -94,6 +90,29 @@ main(int argc, /* I - Number of command-line args */
while (cupsRasterReadHeader2(inras, &inheader))
{
/*
+ * Show page device dictionary...
+ */
+
+ fprintf(stderr, "DEBUG: Duplex = %d\n", inheader.Duplex);
+ fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", inheader.HWResolution[0], inheader.HWResolution[1]);
+ fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", inheader.ImagingBoundingBox[0], inheader.ImagingBoundingBox[1], inheader.ImagingBoundingBox[2], inheader.ImagingBoundingBox[3]);
+ fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", inheader.Margins[0], inheader.Margins[1]);
+ fprintf(stderr, "DEBUG: ManualFeed = %d\n", inheader.ManualFeed);
+ fprintf(stderr, "DEBUG: MediaPosition = %d\n", inheader.MediaPosition);
+ fprintf(stderr, "DEBUG: NumCopies = %d\n", inheader.NumCopies);
+ fprintf(stderr, "DEBUG: Orientation = %d\n", inheader.Orientation);
+ fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", inheader.PageSize[0], inheader.PageSize[1]);
+ fprintf(stderr, "DEBUG: cupsWidth = %d\n", inheader.cupsWidth);
+ fprintf(stderr, "DEBUG: cupsHeight = %d\n", inheader.cupsHeight);
+ fprintf(stderr, "DEBUG: cupsMediaType = %d\n", inheader.cupsMediaType);
+ fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", inheader.cupsBitsPerColor);
+ fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", inheader.cupsBitsPerPixel);
+ fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", inheader.cupsBytesPerLine);
+ fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", inheader.cupsColorOrder);
+ fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", inheader.cupsColorSpace);
+ fprintf(stderr, "DEBUG: cupsCompression = %d\n", inheader.cupsCompression);
+
+ /*
* Compute the real raster size...
*/
@@ -101,18 +120,21 @@ main(int argc, /* I - Number of command-line args */
fprintf(stderr, "PAGE: %d %d\n", page, inheader.NumCopies);
- page_width = (int)(inheader.cupsPageSize[0] * inheader.HWResolution[0] /
- 72.0);
- page_height = (int)(inheader.cupsPageSize[1] * inheader.HWResolution[1] /
- 72.0);
- page_left = (int)(inheader.cupsImagingBBox[0] *
- inheader.HWResolution[0] / 72.0);
- page_bottom = (int)(inheader.cupsImagingBBox[1] *
- inheader.HWResolution[1] / 72.0);
+ page_width = (unsigned)(inheader.cupsPageSize[0] * inheader.HWResolution[0] / 72.0);
+ page_height = (unsigned)(inheader.cupsPageSize[1] * inheader.HWResolution[1] / 72.0);
+ page_left = (unsigned)(inheader.cupsImagingBBox[0] * inheader.HWResolution[0] / 72.0);
+ page_bottom = (unsigned)(inheader.cupsImagingBBox[1] * inheader.HWResolution[1] / 72.0);
page_top = page_height - page_bottom - inheader.cupsHeight;
linesize = (page_width * inheader.cupsBitsPerPixel + 7) / 8;
lineoffset = page_left * inheader.cupsBitsPerPixel / 8; /* Round down */
+ if (page_left > page_width || page_top > page_height || page_bottom > page_height)
+ {
+ _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data."));
+ fprintf(stderr, "DEBUG: Bad bottom/left/top margin on page %d.\n", page);
+ return (1);
+ }
+
switch (inheader.cupsColorSpace)
{
case CUPS_CSPACE_W :
@@ -192,14 +214,14 @@ main(int argc, /* I - Number of command-line args */
sizeof(outheader.OutputType));
else
{
- fprintf(stderr, "DEBUG: Unsupported print-content-type \"%s\".\n", val);
+ fputs("DEBUG: Unsupported print-content-optimize value.\n", stderr);
outheader.OutputType[0] = '\0';
}
}
if ((val = cupsGetOption("print-quality", num_options, options)) != NULL)
{
- int quality = atoi(val); /* print-quality value */
+ unsigned quality = (unsigned)atoi(val); /* print-quality value */
if (quality >= IPP_QUALITY_DRAFT && quality <= IPP_QUALITY_HIGH)
outheader.cupsInteger[8] = quality;
@@ -233,8 +255,7 @@ main(int argc, /* I - Number of command-line args */
sizeof(outheader.cupsRenderingIntent));
else
{
- fprintf(stderr, "DEBUG: Unsupported print-rendering-intent \"%s\".\n",
- val);
+ fputs("DEBUG: Unsupported print-rendering-intent value.\n", stderr);
outheader.cupsRenderingIntent[0] = '\0';
}
}
@@ -270,7 +291,7 @@ main(int argc, /* I - Number of command-line args */
{
if (inheader.Tumble)
{
- outheader.cupsInteger[1] = -1;/* CrossFeedTransform */
+ outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */
outheader.cupsInteger[2] = 1; /* FeedTransform */
outheader.cupsInteger[3] = page_width - page_left -
@@ -286,7 +307,7 @@ main(int argc, /* I - Number of command-line args */
else
{
outheader.cupsInteger[1] = 1; /* CrossFeedTransform */
- outheader.cupsInteger[2] = -1;/* FeedTransform */
+ outheader.cupsInteger[2] = ~0U;/* FeedTransform */
outheader.cupsInteger[3] = page_left;
/* ImageBoxLeft */
@@ -302,8 +323,8 @@ main(int argc, /* I - Number of command-line args */
{
if (inheader.Tumble)
{
- outheader.cupsInteger[1] = -1;/* CrossFeedTransform */
- outheader.cupsInteger[2] = -1;/* FeedTransform */
+ outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */
+ outheader.cupsInteger[2] = ~0U;/* FeedTransform */
outheader.cupsInteger[3] = page_width - page_left -
inheader.cupsWidth;
@@ -334,8 +355,8 @@ main(int argc, /* I - Number of command-line args */
{
if (inheader.Tumble)
{
- outheader.cupsInteger[1] = -1;/* CrossFeedTransform */
- outheader.cupsInteger[2] = -1;/* FeedTransform */
+ outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */
+ outheader.cupsInteger[2] = ~0U;/* FeedTransform */
outheader.cupsInteger[3] = page_width - page_left -
inheader.cupsWidth;
@@ -368,7 +389,7 @@ main(int argc, /* I - Number of command-line args */
* Unsupported value...
*/
- fprintf(stderr, "DEBUG: Unsupported cupsBackSide \"%s\".\n", back->value);
+ fputs("DEBUG: Unsupported cupsBackSide value.\n", stderr);
outheader.cupsInteger[1] = 1; /* CrossFeedTransform */
outheader.cupsInteger[2] = 1; /* FeedTransform */
@@ -409,6 +430,9 @@ main(int argc, /* I - Number of command-line args */
* Copy raster data...
*/
+ if (linesize < inheader.cupsBytesPerLine)
+ linesize = inheader.cupsBytesPerLine;
+
line = malloc(linesize);
memset(line, white, linesize);
@@ -423,7 +447,14 @@ main(int argc, /* I - Number of command-line args */
for (y = inheader.cupsHeight; y > 0; y --)
{
- cupsRasterReadPixels(inras, line + lineoffset, inheader.cupsBytesPerLine);
+ if (cupsRasterReadPixels(inras, line + lineoffset, inheader.cupsBytesPerLine) != inheader.cupsBytesPerLine)
+ {
+ _cupsLangPrintFilter(stderr, "ERROR", _("Error reading raster data."));
+ fprintf(stderr, "DEBUG: Unable to read line %d for page %d.\n",
+ inheader.cupsHeight - y + page_top + 1, page);
+ return (1);
+ }
+
if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine))
{
_cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data."));
@@ -457,5 +488,5 @@ main(int argc, /* I - Number of command-line args */
/*
- * End of "$Id: rastertopwg.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertopwg.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/filter/spec-ppd.shtml b/filter/spec-ppd.shtml
index b6bdcc4..89d7060 100644
--- a/filter/spec-ppd.shtml
+++ b/filter/spec-ppd.shtml
@@ -1264,6 +1264,49 @@ http://www.vendor.com/help"
*cupsIPPSupplies: False
</pre>
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountId'>cupsJobAccountId</a></h3>
+
+<p class='summary'>*cupsJobAccountId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-account-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-account-id IPP attribute.</em>
+*cupsJobAccountId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountingUserId'>cupsJobAccountingUserId</a></h3>
+
+<p class='summary'>*cupsJobAccountingUserId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-accounting-user-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-accounting-user-id IPP attribute.</em>
+*cupsJobAccountingUserId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobPassword'>cupsJobPassword</a></h3>
+
+<p class='summary'>*cupsJobPassword: "format"</p>
+
+<p>This keyword defines the format of the job-password IPP attribute, if supported by the printer. Currently the only supported format is "1111" indicating a 4-digit PIN code.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer supports 4-digit PIN codes.</em>
+*cupsJobPassword: "1111"
+</pre>
+
+
<h3><span class='info'>CUPS 1.2/OS X 10.5</span><a name='cupsLanguages'>cupsLanguages</a></h3>
<p class='summary'>*cupsLanguages: "locale list"</p>
@@ -1279,6 +1322,21 @@ list of locale names ("en", "en_US", "fr_CA", etc.)</p>
*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
</pre>
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsMandatory'>cupsMandatory</a></h3>
+
+<p class='summary'>*cupsMandatory: "attribute1 attribute2 ... attributeN"</p>
+
+<p>This keyword defines a list of IPP attributes that must be provided when submitting a print job creation request.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify that the user must supply a job-password</em>
+*cupsMandatory: "job-password job-password-encryption"
+</pre>
+
+
<h3><a name='cupsManualCopies'>cupsManualCopies</a></h3>
<p class='summary'>*cupsManualCopies: boolean</p>
@@ -1511,7 +1569,7 @@ PPD file extensions was used. Currently it must be the string
<p class="summary">*JCLToPDFInterpreter: "JCL"</p>
-<p>This keyword provfides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
+<p>This keyword provides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
<p>Example:</p>
@@ -1807,6 +1865,18 @@ the device.</p>
<h2 class='title'><a name='HISTORY'>Change History</a></h2>
+<h3>Changes in CUPS 1.7</h3>
+
+<ul>
+
+ <li>Added <a href="#cupsJobAccountId"><tt>cupsJobAccountId</tt></a>,
+ <a href="#cupsJobAccountingUserId"><tt>cupsJobAccountingUserId</tt></a>,
+ <a href="#cupsJobPassword"><tt>cupsJobPassword</tt></a>,
+ <a href="#cupsMandatory"><tt>cupsMandatory</tt></a> keywords.</li>
+
+</ul>
+
+
<h3>Changes in CUPS 1.6</h3>
<ul>
diff --git a/filter/testraster.c b/filter/testraster.c
index dc5dbe6..b2220b2 100644
--- a/filter/testraster.c
+++ b/filter/testraster.c
@@ -1,27 +1,18 @@
/*
- * "$Id: testraster.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testraster.c 12746 2015-06-24 13:28:36Z msweet $"
*
- * Raster test program routines for CUPS.
+ * Raster test program routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Test the raster functions.
- * do_ppd_tests() - Test the default option commands in a PPD file.
- * do_ps_tests() - Test standard PostScript commands.
- * do_ras_file() - Test reading of a raster file.
- * do_raster_tests() - Test reading and writing of raster data.
- * print_changes() - Print differences in the page header.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -29,6 +20,7 @@
*/
#include <cups/raster-private.h>
+#include <math.h>
/*
@@ -172,13 +164,12 @@ static cups_page_header2_t setpagedevice_header =
1, /* cupsRowFeed */
1, /* cupsRowStep */
0, /* cupsNumColors */
- 1.001, /* cupsBorderlessScalingFactor */
- { 612.0, 792.1 }, /* cupsPageSize */
- { 0.0, 0.0, 0.0, 0.0 }, /* cupsImagingBBox */
+ 1.001f, /* cupsBorderlessScalingFactor */
+ { 612.0f, 792.1f }, /* cupsPageSize */
+ { 0.0f, 0.0f, 0.0f, 0.0f }, /* cupsImagingBBox */
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
/* cupsInteger[16] */
- { 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1,
- 14.1, 15.1, 16.1 }, /* cupsReal[16] */
+ { 1.1f, 2.1f, 3.1f, 4.1f, 5.1f, 6.1f, 7.1f, 8.1f, 9.1f, 10.1f, 11.1f, 12.1f, 13.1f, 14.1f, 15.1f, 16.1f }, /* cupsReal[16] */
{ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16" }, /* cupsString[16] */
"Marker Type", /* cupsMarkerType */
@@ -505,6 +496,8 @@ do_ras_file(const char *filename) /* I - Filename */
free(data);
}
+ printf("EOF at %ld\n", (long)lseek(fd, SEEK_CUR, 0));
+
cupsRasterClose(ras);
close(fd);
@@ -519,7 +512,7 @@ do_ras_file(const char *filename) /* I - Filename */
static int /* O - Number of errors */
do_raster_tests(cups_mode_t mode) /* O - Write mode */
{
- int page, x, y; /* Looping vars */
+ unsigned page, x, y; /* Looping vars */
FILE *fp; /* Raster file */
cups_raster_t *r; /* Raster stream */
cups_page_header2_t header, /* Page header */
@@ -610,7 +603,7 @@ do_raster_tests(cups_mode_t mode) /* O - Write mode */
else
{
for (x = 0; x < header.cupsBytesPerLine; x ++)
- data[x] = x;
+ data[x] = (unsigned char)x;
for (y = 0; y < 64; y ++)
if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
@@ -636,7 +629,7 @@ do_raster_tests(cups_mode_t mode) /* O - Write mode */
else
{
for (x = 0; x < header.cupsBytesPerLine; x ++)
- data[x] = x / 4;
+ data[x] = (unsigned char)(x / 4);
for (y = 0; y < 64; y ++)
if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
@@ -1020,22 +1013,21 @@ print_changes(
printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors,
expected->cupsNumColors);
- if (header->cupsBorderlessScalingFactor !=
- expected->cupsBorderlessScalingFactor)
+ if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001)
printf(" cupsBorderlessScalingFactor %g, expected %g\n",
header->cupsBorderlessScalingFactor,
expected->cupsBorderlessScalingFactor);
- if (header->cupsPageSize[0] != expected->cupsPageSize[0] ||
- header->cupsPageSize[1] != expected->cupsPageSize[1])
+ if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 ||
+ fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001)
printf(" cupsPageSize [%g %g], expected [%g %g]\n",
header->cupsPageSize[0], header->cupsPageSize[1],
expected->cupsPageSize[0], expected->cupsPageSize[1]);
- if (header->cupsImagingBBox[0] != expected->cupsImagingBBox[0] ||
- header->cupsImagingBBox[1] != expected->cupsImagingBBox[1] ||
- header->cupsImagingBBox[2] != expected->cupsImagingBBox[2] ||
- header->cupsImagingBBox[3] != expected->cupsImagingBBox[3])
+ if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 ||
+ fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 ||
+ fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 ||
+ fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001)
printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n",
header->cupsImagingBBox[0], header->cupsImagingBBox[1],
header->cupsImagingBBox[2], header->cupsImagingBBox[3],
@@ -1048,7 +1040,7 @@ print_changes(
expected->cupsInteger[i]);
for (i = 0; i < 16; i ++)
- if (header->cupsReal[i] != expected->cupsReal[i])
+ if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001)
printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i],
expected->cupsReal[i]);
@@ -1074,5 +1066,5 @@ print_changes(
/*
- * End of "$Id: testraster.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testraster.c 12746 2015-06-24 13:28:36Z msweet $".
*/
diff --git a/install-sh b/install-sh
index 41d944e..956458f 100755
--- a/install-sh
+++ b/install-sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id$"
+# "$Id: install-sh 11025 2013-06-07 01:00:33Z msweet $"
#
# Install a program, script, or datafile.
#
diff --git a/locale/Dependencies b/locale/Dependencies
index 7a08bb2..29e13ce 100644
--- a/locale/Dependencies
+++ b/locale/Dependencies
@@ -1,22 +1,16 @@
checkpo.o: checkpo.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
po2strings.o: po2strings.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
strings2po.o: strings2po.c
-translate.o: translate.c ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
diff --git a/locale/Makefile b/locale/Makefile
index 22aca43..bd7185b 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -1,23 +1,23 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12233 2014-10-25 00:03:02Z msweet $"
#
-# Locale file makefile for CUPS.
+# Locale file makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1993-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1993-2007 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
-OBJS = checkpo.o po2strings.o strings2po.o translate.o
-TARGETS = checkpo po2strings strings2po translate
+OBJS = checkpo.o po2strings.o strings2po.o
+TARGETS = checkpo po2strings strings2po
#
@@ -159,7 +159,7 @@ pot: checkpo po2strings
#
checkpo: checkpo.o ../cups/$(LIBCUPSSTATIC)
- echo Linking $<...
+ echo Linking $@...
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o checkpo checkpo.o \
../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
$(COMMONLIBS) $(LIBZ)
@@ -178,7 +178,7 @@ checkall: checkpo
#
po2strings: po2strings.o ../cups/$(LIBCUPSSTATIC)
- echo Linking $<...
+ echo Linking $@...
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o po2strings po2strings.o \
../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
$(COMMONLIBS) $(LIBZ)
@@ -192,25 +192,11 @@ po2strings: po2strings.o ../cups/$(LIBCUPSSTATIC)
#
strings2po: strings2po.o
- echo Linking $<...
+ echo Linking $@...
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o strings2po strings2po.o
#
-# translate - A simple utility which uses Google to translate the cups.pot
-# file to one of several languages.
-#
-# translate outfile language
-#
-
-translate: translate.o ../cups/$(LIBCUPSSTATIC)
- echo Linking $<...
- $(CC) $(ARCHFLAGS) $(LDFLAGS) -o translate translate.o \
- ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
- $(COMMONLIBS) $(LIBZ)
-
-
-#
# Dependencies...
#
@@ -218,5 +204,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12233 2014-10-25 00:03:02Z msweet $".
#
diff --git a/locale/checkpo.c b/locale/checkpo.c
index 002e64f..14e74a2 100644
--- a/locale/checkpo.c
+++ b/locale/checkpo.c
@@ -1,10 +1,10 @@
/*
- * "$Id: checkpo.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: checkpo.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Verify that translations in the .po file have the same number and type of
* printf-style format strings.
*
- * Copyright 2007-2010 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -338,7 +338,7 @@ abbreviate(const char *s, /* I - String to abbreviate */
}
if (*s)
- strcpy(bufptr, "...");
+ memcpy(bufptr, "...", 4);
else
*bufptr = '\0';
@@ -409,5 +409,5 @@ free_formats(cups_array_t *fmts) /* I - Array of format strings */
/*
- * End of "$Id: checkpo.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: checkpo.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/locale/cups.header b/locale/cups.header
index 275aef4..85dcb39 100644
--- a/locale/cups.header
+++ b/locale/cups.header
@@ -1,16 +1,16 @@
#
# "$Id$"
#
-# Message catalog template for CUPS.
+# Message catalog template for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 2005-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
#
diff --git a/locale/cups.pot b/locale/cups.pot
index dbeeec3..e6c5beb 100644
--- a/locale/cups.pot
+++ b/locale/cups.pot
@@ -1,16 +1,16 @@
#
# "$Id$"
#
-# Message catalog template for CUPS.
+# Message catalog template for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 2005-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
#
@@ -30,7 +30,7 @@ msgid ""
msgstr ""
"Project-Id-Version: CUPS 1.6\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
+"POT-Creation-Date: 2015-07-20 14:24-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"
@@ -39,363 +39,363 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: systemv/lpstat.c:1992 systemv/lpstat.c:2117
+#: systemv/lpstat.c:1867 systemv/lpstat.c:1990
msgid "\t\t(all)"
msgstr ""
-#: systemv/lpstat.c:1995 systemv/lpstat.c:1998 systemv/lpstat.c:2120
-#: systemv/lpstat.c:2123
+#: systemv/lpstat.c:1870 systemv/lpstat.c:1873 systemv/lpstat.c:1993
+#: systemv/lpstat.c:1996
msgid "\t\t(none)"
msgstr ""
-#: berkeley/lpc.c:434
+#: berkeley/lpc.c:426
#, c-format
msgid "\t%d entries"
msgstr ""
-#: systemv/lpstat.c:841 systemv/lpstat.c:857
+#: systemv/lpstat.c:783 systemv/lpstat.c:799
#, c-format
msgid "\t%s"
msgstr ""
-#: systemv/lpstat.c:1973 systemv/lpstat.c:2098
+#: systemv/lpstat.c:1848 systemv/lpstat.c:1971
msgid "\tAfter fault: continue"
msgstr ""
-#: systemv/lpstat.c:1591 systemv/lpstat.c:1942 systemv/lpstat.c:2068
+#: systemv/lpstat.c:1471 systemv/lpstat.c:1817 systemv/lpstat.c:1941
#, c-format
msgid "\tAlerts: %s"
msgstr ""
-#: systemv/lpstat.c:1996 systemv/lpstat.c:2121
+#: systemv/lpstat.c:1871 systemv/lpstat.c:1994
msgid "\tBanner required"
msgstr ""
-#: systemv/lpstat.c:1997 systemv/lpstat.c:2122
+#: systemv/lpstat.c:1872 systemv/lpstat.c:1995
msgid "\tCharset sets:"
msgstr ""
-#: systemv/lpstat.c:1961 systemv/lpstat.c:2086
+#: systemv/lpstat.c:1836 systemv/lpstat.c:1959
msgid "\tConnection: direct"
msgstr ""
-#: systemv/lpstat.c:1952 systemv/lpstat.c:2078
+#: systemv/lpstat.c:1827 systemv/lpstat.c:1951
msgid "\tConnection: remote"
msgstr ""
-#: systemv/lpstat.c:1916 systemv/lpstat.c:2042
+#: systemv/lpstat.c:1793 systemv/lpstat.c:1917
msgid "\tContent types: any"
msgstr ""
-#: systemv/lpstat.c:2000 systemv/lpstat.c:2125
+#: systemv/lpstat.c:1875 systemv/lpstat.c:1998
msgid "\tDefault page size:"
msgstr ""
-#: systemv/lpstat.c:1999 systemv/lpstat.c:2124
+#: systemv/lpstat.c:1874 systemv/lpstat.c:1997
msgid "\tDefault pitch:"
msgstr ""
-#: systemv/lpstat.c:2001 systemv/lpstat.c:2126
+#: systemv/lpstat.c:1876 systemv/lpstat.c:1999
msgid "\tDefault port settings:"
msgstr ""
-#: systemv/lpstat.c:1922 systemv/lpstat.c:2048
+#: systemv/lpstat.c:1799 systemv/lpstat.c:1923
#, c-format
msgid "\tDescription: %s"
msgstr ""
-#: systemv/lpstat.c:1915 systemv/lpstat.c:2041
+#: systemv/lpstat.c:1792 systemv/lpstat.c:1916
msgid "\tForm mounted:"
msgstr ""
-#: systemv/lpstat.c:1994 systemv/lpstat.c:2119
+#: systemv/lpstat.c:1869 systemv/lpstat.c:1992
msgid "\tForms allowed:"
msgstr ""
-#: systemv/lpstat.c:1956 systemv/lpstat.c:2082
+#: systemv/lpstat.c:1831 systemv/lpstat.c:1955
#, c-format
msgid "\tInterface: %s.ppd"
msgstr ""
-#: systemv/lpstat.c:1965 systemv/lpstat.c:2090
+#: systemv/lpstat.c:1840 systemv/lpstat.c:1963
#, c-format
msgid "\tInterface: %s/interfaces/%s"
msgstr ""
-#: systemv/lpstat.c:1969 systemv/lpstat.c:2094
+#: systemv/lpstat.c:1844 systemv/lpstat.c:1967
#, c-format
msgid "\tInterface: %s/ppd/%s.ppd"
msgstr ""
-#: systemv/lpstat.c:1947 systemv/lpstat.c:2073
+#: systemv/lpstat.c:1822 systemv/lpstat.c:1946
#, c-format
msgid "\tLocation: %s"
msgstr ""
-#: systemv/lpstat.c:1972 systemv/lpstat.c:2097
+#: systemv/lpstat.c:1847 systemv/lpstat.c:1970
msgid "\tOn fault: no alert"
msgstr ""
-#: systemv/lpstat.c:1917 systemv/lpstat.c:2043
+#: systemv/lpstat.c:1794 systemv/lpstat.c:1918
msgid "\tPrinter types: unknown"
msgstr ""
-#: systemv/lpstat.c:1572
+#: systemv/lpstat.c:1454
#, c-format
msgid "\tStatus: %s"
msgstr ""
-#: systemv/lpstat.c:1977 systemv/lpstat.c:1991 systemv/lpstat.c:2102
-#: systemv/lpstat.c:2116
+#: systemv/lpstat.c:1852 systemv/lpstat.c:1866 systemv/lpstat.c:1975
+#: systemv/lpstat.c:1989
msgid "\tUsers allowed:"
msgstr ""
-#: systemv/lpstat.c:1984 systemv/lpstat.c:2109
+#: systemv/lpstat.c:1859 systemv/lpstat.c:1982
msgid "\tUsers denied:"
msgstr ""
-#: berkeley/lpc.c:436
+#: berkeley/lpc.c:428
msgid "\tdaemon present"
msgstr ""
-#: berkeley/lpc.c:432
+#: berkeley/lpc.c:424
msgid "\tno entries"
msgstr ""
-#: berkeley/lpc.c:404 berkeley/lpc.c:416
+#: berkeley/lpc.c:396 berkeley/lpc.c:408
#, c-format
msgid "\tprinter is on device '%s' speed -1"
msgstr ""
-#: berkeley/lpc.c:429
+#: berkeley/lpc.c:421
msgid "\tprinting is disabled"
msgstr ""
-#: berkeley/lpc.c:427
+#: berkeley/lpc.c:419
msgid "\tprinting is enabled"
msgstr ""
-#: systemv/lpstat.c:1594
+#: systemv/lpstat.c:1474
#, c-format
msgid "\tqueued for %s"
msgstr ""
-#: berkeley/lpc.c:424
+#: berkeley/lpc.c:416
msgid "\tqueuing is disabled"
msgstr ""
-#: berkeley/lpc.c:422
+#: berkeley/lpc.c:414
msgid "\tqueuing is enabled"
msgstr ""
-#: systemv/lpstat.c:1908 systemv/lpstat.c:2034
+#: systemv/lpstat.c:1785 systemv/lpstat.c:1909
msgid "\treason unknown"
msgstr ""
-#: systemv/cupstestppd.c:454
+#: systemv/cupstestppd.c:434
msgid ""
"\n"
" DETAILED CONFORMANCE TEST RESULTS"
msgstr ""
-#: systemv/cupstestppd.c:3800
+#: systemv/cupstestppd.c:3864
msgid " Ignore specific warnings."
msgstr ""
-#: systemv/cupstestppd.c:3804
+#: systemv/cupstestppd.c:3868
msgid " Issue warnings instead of errors."
msgstr ""
-#: systemv/cupstestppd.c:410 systemv/cupstestppd.c:415
+#: systemv/cupstestppd.c:390 systemv/cupstestppd.c:395
msgid " REF: Page 15, section 3.1."
msgstr ""
-#: systemv/cupstestppd.c:405
+#: systemv/cupstestppd.c:385
msgid " REF: Page 15, section 3.2."
msgstr ""
-#: systemv/cupstestppd.c:425
+#: systemv/cupstestppd.c:405
msgid " REF: Page 19, section 3.3."
msgstr ""
-#: systemv/cupstestppd.c:378
+#: systemv/cupstestppd.c:358
msgid " REF: Page 20, section 3.4."
msgstr ""
-#: systemv/cupstestppd.c:430
+#: systemv/cupstestppd.c:410
msgid " REF: Page 27, section 3.5."
msgstr ""
-#: systemv/cupstestppd.c:373
+#: systemv/cupstestppd.c:353
msgid " REF: Page 42, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:420
+#: systemv/cupstestppd.c:400
msgid " REF: Pages 16-17, section 3.2."
msgstr ""
-#: systemv/cupstestppd.c:390
+#: systemv/cupstestppd.c:370
msgid " REF: Pages 42-45, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:384
+#: systemv/cupstestppd.c:364
msgid " REF: Pages 45-46, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:395
+#: systemv/cupstestppd.c:375
msgid " REF: Pages 48-49, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:400
+#: systemv/cupstestppd.c:380
msgid " REF: Pages 52-54, section 5.2."
msgstr ""
-#: berkeley/lpq.c:559
+#: berkeley/lpq.c:528
#, c-format
msgid " %-39.39s %.0f bytes"
msgstr ""
-#: systemv/cupstestppd.c:589
+#: systemv/cupstestppd.c:569
#, c-format
msgid " PASS Default%s"
msgstr ""
-#: systemv/cupstestppd.c:524
+#: systemv/cupstestppd.c:504
msgid " PASS DefaultImageableArea"
msgstr ""
-#: systemv/cupstestppd.c:558
+#: systemv/cupstestppd.c:538
msgid " PASS DefaultPaperDimension"
msgstr ""
-#: systemv/cupstestppd.c:631
+#: systemv/cupstestppd.c:611
msgid " PASS FileVersion"
msgstr ""
-#: systemv/cupstestppd.c:675
+#: systemv/cupstestppd.c:655
msgid " PASS FormatVersion"
msgstr ""
-#: systemv/cupstestppd.c:695
+#: systemv/cupstestppd.c:675
msgid " PASS LanguageEncoding"
msgstr ""
-#: systemv/cupstestppd.c:715
+#: systemv/cupstestppd.c:695
msgid " PASS LanguageVersion"
msgstr ""
-#: systemv/cupstestppd.c:769
+#: systemv/cupstestppd.c:749
msgid " PASS Manufacturer"
msgstr ""
-#: systemv/cupstestppd.c:809
+#: systemv/cupstestppd.c:789
msgid " PASS ModelName"
msgstr ""
-#: systemv/cupstestppd.c:829
+#: systemv/cupstestppd.c:809
msgid " PASS NickName"
msgstr ""
-#: systemv/cupstestppd.c:889
+#: systemv/cupstestppd.c:869
msgid " PASS PCFileName"
msgstr ""
-#: systemv/cupstestppd.c:964
+#: systemv/cupstestppd.c:944
msgid " PASS PSVersion"
msgstr ""
-#: systemv/cupstestppd.c:869
+#: systemv/cupstestppd.c:849
msgid " PASS PageRegion"
msgstr ""
-#: systemv/cupstestppd.c:849
+#: systemv/cupstestppd.c:829
msgid " PASS PageSize"
msgstr ""
-#: systemv/cupstestppd.c:924
+#: systemv/cupstestppd.c:904
msgid " PASS Product"
msgstr ""
-#: systemv/cupstestppd.c:999
+#: systemv/cupstestppd.c:979
msgid " PASS ShortNickName"
msgstr ""
-#: systemv/cupstestppd.c:1374
+#: systemv/cupstestppd.c:1354
#, c-format
msgid " WARN %s has no corresponding options."
msgstr ""
-#: systemv/cupstestppd.c:1486
+#: systemv/cupstestppd.c:1466
#, c-format
msgid ""
" WARN %s shares a common prefix with %s\n"
" REF: Page 15, section 3.2."
msgstr ""
-#: systemv/cupstestppd.c:1345
+#: systemv/cupstestppd.c:1325
#, c-format
msgid ""
" WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n"
" REF: Page 122, section 5.17"
msgstr ""
-#: systemv/cupstestppd.c:1744
+#: systemv/cupstestppd.c:1724
msgid " WARN File contains a mix of CR, LF, and CR LF line endings."
msgstr ""
-#: systemv/cupstestppd.c:1390
+#: systemv/cupstestppd.c:1370
msgid ""
" WARN LanguageEncoding required by PPD 4.3 spec.\n"
" REF: Pages 56-57, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1726
+#: systemv/cupstestppd.c:1706
#, c-format
msgid " WARN Line %d only contains whitespace."
msgstr ""
-#: systemv/cupstestppd.c:1398
+#: systemv/cupstestppd.c:1378
msgid ""
" WARN Manufacturer required by PPD 4.3 spec.\n"
" REF: Pages 58-59, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1749
+#: systemv/cupstestppd.c:1729
msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF."
msgstr ""
-#: systemv/cupstestppd.c:1382
+#: systemv/cupstestppd.c:1362
#, c-format
msgid ""
" WARN Obsolete PPD version %.1f.\n"
" REF: Page 42, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:1413
+#: systemv/cupstestppd.c:1393
msgid ""
" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1421
+#: systemv/cupstestppd.c:1401
msgid ""
" WARN PCFileName should contain a unique filename.\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1456
+#: systemv/cupstestppd.c:1436
msgid ""
" WARN Protocols contains PJL but JCL attributes are not set.\n"
" REF: Pages 78-79, section 5.7."
msgstr ""
-#: systemv/cupstestppd.c:1447
+#: systemv/cupstestppd.c:1427
msgid ""
" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
" REF: Pages 78-79, section 5.7."
msgstr ""
-#: systemv/cupstestppd.c:1430
+#: systemv/cupstestppd.c:1410
msgid ""
" WARN ShortNickName required by PPD 4.3 spec.\n"
" REF: Pages 64-65, section 5.3."
@@ -409,376 +409,376 @@ msgstr ""
msgid " cupstestdsc [options] -"
msgstr ""
-#: systemv/cupstestppd.c:3795
+#: systemv/cupstestppd.c:3859
msgid " program | cupstestppd [options] -"
msgstr ""
-#: systemv/cupstestppd.c:3727
+#: systemv/cupstestppd.c:3791
#, c-format
msgid ""
" %s \"%s %s\" conflicts with \"%s %s\"\n"
" (constraint=\"%s %s %s %s\")."
msgstr ""
-#: systemv/cupstestppd.c:2248
+#: systemv/cupstestppd.c:2228
#, c-format
msgid " %s %s %s does not exist."
msgstr ""
-#: systemv/cupstestppd.c:3884
+#: systemv/cupstestppd.c:3948
#, c-format
msgid " %s %s file \"%s\" has the wrong capitalization."
msgstr ""
-#: systemv/cupstestppd.c:2318
+#: systemv/cupstestppd.c:2298
#, c-format
msgid ""
" %s Bad %s choice %s.\n"
" REF: Page 122, section 5.17"
msgstr ""
-#: systemv/cupstestppd.c:3487 systemv/cupstestppd.c:3536
-#: systemv/cupstestppd.c:3575
+#: systemv/cupstestppd.c:3551 systemv/cupstestppd.c:3600
+#: systemv/cupstestppd.c:3639
#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s."
msgstr ""
-#: systemv/cupstestppd.c:3441
+#: systemv/cupstestppd.c:3505
#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s."
msgstr ""
-#: systemv/cupstestppd.c:2389
+#: systemv/cupstestppd.c:2369 systemv/cupstestppd.c:2391
#, c-format
msgid " %s Bad cupsFilter value \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2475
+#: systemv/cupstestppd.c:2487 systemv/cupstestppd.c:2509
#, c-format
msgid " %s Bad cupsFilter2 value \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2964
+#: systemv/cupstestppd.c:3008
#, c-format
msgid " %s Bad cupsICCProfile %s."
msgstr ""
-#: systemv/cupstestppd.c:2571
+#: systemv/cupstestppd.c:2615
#, c-format
msgid " %s Bad cupsPreFilter value \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:1822
+#: systemv/cupstestppd.c:1802
#, c-format
msgid " %s Bad cupsUIConstraints %s: \"%s\""
msgstr ""
-#: systemv/cupstestppd.c:3391
+#: systemv/cupstestppd.c:3455
#, c-format
msgid " %s Bad language \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2433 systemv/cupstestppd.c:2529
-#: systemv/cupstestppd.c:2615 systemv/cupstestppd.c:2673
-#: systemv/cupstestppd.c:2728 systemv/cupstestppd.c:2783
-#: systemv/cupstestppd.c:2838 systemv/cupstestppd.c:2891
-#: systemv/cupstestppd.c:3013
+#: systemv/cupstestppd.c:2445 systemv/cupstestppd.c:2573
+#: systemv/cupstestppd.c:2659 systemv/cupstestppd.c:2717
+#: systemv/cupstestppd.c:2772 systemv/cupstestppd.c:2827
+#: systemv/cupstestppd.c:2882 systemv/cupstestppd.c:2935
+#: systemv/cupstestppd.c:3057
#, c-format
msgid " %s Bad permissions on %s file \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2373 systemv/cupstestppd.c:2459
-#: systemv/cupstestppd.c:2555 systemv/cupstestppd.c:2642
-#: systemv/cupstestppd.c:2697 systemv/cupstestppd.c:2752
-#: systemv/cupstestppd.c:2807 systemv/cupstestppd.c:2862
+#: systemv/cupstestppd.c:2353 systemv/cupstestppd.c:2471
+#: systemv/cupstestppd.c:2599 systemv/cupstestppd.c:2686
+#: systemv/cupstestppd.c:2741 systemv/cupstestppd.c:2796
+#: systemv/cupstestppd.c:2851 systemv/cupstestppd.c:2906
#, c-format
msgid " %s Bad spelling of %s - should be %s."
msgstr ""
-#: systemv/cupstestppd.c:2907
+#: systemv/cupstestppd.c:2951
#, c-format
msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID."
msgstr ""
-#: systemv/cupstestppd.c:2205
+#: systemv/cupstestppd.c:2185
#, c-format
msgid " %s Default choices conflicting."
msgstr ""
-#: systemv/cupstestppd.c:1803
+#: systemv/cupstestppd.c:1783
#, c-format
msgid " %s Empty cupsUIConstraints %s"
msgstr ""
-#: systemv/cupstestppd.c:3519 systemv/cupstestppd.c:3559
+#: systemv/cupstestppd.c:3583 systemv/cupstestppd.c:3623
#, c-format
msgid " %s Missing \"%s\" translation string for option %s, choice %s."
msgstr ""
-#: systemv/cupstestppd.c:3427
+#: systemv/cupstestppd.c:3491
#, c-format
msgid " %s Missing \"%s\" translation string for option %s."
msgstr ""
-#: systemv/cupstestppd.c:2418 systemv/cupstestppd.c:2514
-#: systemv/cupstestppd.c:2600 systemv/cupstestppd.c:2658
-#: systemv/cupstestppd.c:2713 systemv/cupstestppd.c:2768
-#: systemv/cupstestppd.c:2823 systemv/cupstestppd.c:2875
-#: systemv/cupstestppd.c:2998
+#: systemv/cupstestppd.c:2430 systemv/cupstestppd.c:2558
+#: systemv/cupstestppd.c:2644 systemv/cupstestppd.c:2702
+#: systemv/cupstestppd.c:2757 systemv/cupstestppd.c:2812
+#: systemv/cupstestppd.c:2867 systemv/cupstestppd.c:2919
+#: systemv/cupstestppd.c:3042
#, c-format
msgid " %s Missing %s file \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:3121
+#: systemv/cupstestppd.c:3165
#, c-format
msgid ""
" %s Missing REQUIRED PageRegion option.\n"
" REF: Page 100, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:3106
+#: systemv/cupstestppd.c:3150
#, c-format
msgid ""
" %s Missing REQUIRED PageSize option.\n"
" REF: Page 99, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:2013 systemv/cupstestppd.c:2054
+#: systemv/cupstestppd.c:1993 systemv/cupstestppd.c:2034
#, c-format
msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
msgstr ""
-#: systemv/cupstestppd.c:1908
+#: systemv/cupstestppd.c:1888
#, c-format
msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
msgstr ""
-#: systemv/cupstestppd.c:1840
+#: systemv/cupstestppd.c:1820
#, c-format
msgid " %s Missing cupsUIResolver %s"
msgstr ""
-#: systemv/cupstestppd.c:1999 systemv/cupstestppd.c:2040
+#: systemv/cupstestppd.c:1979 systemv/cupstestppd.c:2020
#, c-format
msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"."
msgstr ""
-#: systemv/cupstestppd.c:1892
+#: systemv/cupstestppd.c:1872
#, c-format
msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\""
msgstr ""
-#: systemv/cupstestppd.c:3613
+#: systemv/cupstestppd.c:3677
#, c-format
msgid " %s No base translation \"%s\" is included in file."
msgstr ""
-#: systemv/cupstestppd.c:2294
+#: systemv/cupstestppd.c:2274
#, c-format
msgid ""
" %s REQUIRED %s does not define choice None.\n"
" REF: Page 122, section 5.17"
msgstr ""
-#: systemv/cupstestppd.c:3180 systemv/cupstestppd.c:3194
+#: systemv/cupstestppd.c:3224 systemv/cupstestppd.c:3238
#, c-format
msgid " %s Size \"%s\" defined for %s but not for %s."
msgstr ""
-#: systemv/cupstestppd.c:3160
+#: systemv/cupstestppd.c:3204
#, c-format
msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)."
msgstr ""
-#: systemv/cupstestppd.c:3332
+#: systemv/cupstestppd.c:3395
#, c-format
msgid " %s Size \"%s\" should be \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:3292
+#: systemv/cupstestppd.c:3344
#, c-format
msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:3041
+#: systemv/cupstestppd.c:3085
#, c-format
msgid " %s cupsICCProfile %s hash value collides with %s."
msgstr ""
-#: systemv/cupstestppd.c:1963
+#: systemv/cupstestppd.c:1943
#, c-format
msgid " %s cupsUIResolver %s causes a loop."
msgstr ""
-#: systemv/cupstestppd.c:1945
+#: systemv/cupstestppd.c:1925
#, c-format
msgid " %s cupsUIResolver %s does not list at least two different options."
msgstr ""
-#: systemv/cupstestppd.c:1168
+#: systemv/cupstestppd.c:1148
#, c-format
msgid ""
" **FAIL** %s must be 1284DeviceID\n"
" REF: Page 72, section 5.5"
msgstr ""
-#: systemv/cupstestppd.c:580
+#: systemv/cupstestppd.c:560
#, c-format
msgid ""
" **FAIL** Bad Default%s %s\n"
" REF: Page 40, section 4.5."
msgstr ""
-#: systemv/cupstestppd.c:514
+#: systemv/cupstestppd.c:494
#, c-format
msgid ""
" **FAIL** Bad DefaultImageableArea %s\n"
" REF: Page 102, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:550
+#: systemv/cupstestppd.c:530
#, c-format
msgid ""
" **FAIL** Bad DefaultPaperDimension %s\n"
" REF: Page 103, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:623
+#: systemv/cupstestppd.c:603
#, c-format
msgid ""
" **FAIL** Bad FileVersion \"%s\"\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:667
+#: systemv/cupstestppd.c:647
#, c-format
msgid ""
" **FAIL** Bad FormatVersion \"%s\"\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1025
+#: systemv/cupstestppd.c:1005
msgid ""
" **FAIL** Bad JobPatchFile attribute in file\n"
" REF: Page 24, section 3.4."
msgstr ""
-#: systemv/cupstestppd.c:1213
+#: systemv/cupstestppd.c:1193
#, c-format
msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."
msgstr ""
-#: systemv/cupstestppd.c:1227
+#: systemv/cupstestppd.c:1207
#, c-format
msgid " **FAIL** Bad LanguageVersion %s - must be English."
msgstr ""
-#: systemv/cupstestppd.c:743 systemv/cupstestppd.c:760
+#: systemv/cupstestppd.c:723 systemv/cupstestppd.c:740
#, c-format
msgid ""
" **FAIL** Bad Manufacturer (should be \"%s\")\n"
" REF: Page 211, table D.1."
msgstr ""
-#: systemv/cupstestppd.c:800
+#: systemv/cupstestppd.c:780
#, c-format
msgid ""
" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n"
" REF: Pages 59-60, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:956
+#: systemv/cupstestppd.c:936
msgid ""
" **FAIL** Bad PSVersion - not \"(string) int\".\n"
" REF: Pages 62-64, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:917
+#: systemv/cupstestppd.c:897
msgid ""
" **FAIL** Bad Product - not \"(string)\".\n"
" REF: Page 62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:991
+#: systemv/cupstestppd.c:971
msgid ""
" **FAIL** Bad ShortNickName - longer than 31 chars.\n"
" REF: Pages 64-65, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1149
+#: systemv/cupstestppd.c:1129
#, c-format
msgid ""
" **FAIL** Bad option %s choice %s\n"
" REF: Page 84, section 5.9"
msgstr ""
-#: systemv/cupstestppd.c:3754 systemv/cupstestppd.c:3776
+#: systemv/cupstestppd.c:3818 systemv/cupstestppd.c:3840
#, c-format
msgid " **FAIL** Default option code cannot be interpreted: %s"
msgstr ""
-#: systemv/cupstestppd.c:1286
+#: systemv/cupstestppd.c:1266
#, c-format
msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters."
msgstr ""
-#: systemv/cupstestppd.c:1259
+#: systemv/cupstestppd.c:1239
#, c-format
msgid " **FAIL** Default translation string for option %s contains 8-bit characters."
msgstr ""
-#: systemv/cupstestppd.c:2101
+#: systemv/cupstestppd.c:2081
#, c-format
msgid " **FAIL** Group names %s and %s differ only by case."
msgstr ""
-#: systemv/cupstestppd.c:2146
+#: systemv/cupstestppd.c:2126
#, c-format
msgid " **FAIL** Multiple occurrences of option %s choice name %s."
msgstr ""
-#: systemv/cupstestppd.c:2163
+#: systemv/cupstestppd.c:2143
#, c-format
msgid " **FAIL** Option %s choice names %s and %s differ only by case."
msgstr ""
-#: systemv/cupstestppd.c:2123
+#: systemv/cupstestppd.c:2103
#, c-format
msgid " **FAIL** Option names %s and %s differ only by case."
msgstr ""
-#: systemv/cupstestppd.c:600
+#: systemv/cupstestppd.c:580
#, c-format
msgid ""
" **FAIL** REQUIRED Default%s\n"
" REF: Page 40, section 4.5."
msgstr ""
-#: systemv/cupstestppd.c:499
+#: systemv/cupstestppd.c:479
msgid ""
" **FAIL** REQUIRED DefaultImageableArea\n"
" REF: Page 102, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:535
+#: systemv/cupstestppd.c:515
msgid ""
" **FAIL** REQUIRED DefaultPaperDimension\n"
" REF: Page 103, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:641
+#: systemv/cupstestppd.c:621
msgid ""
" **FAIL** REQUIRED FileVersion\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:685
+#: systemv/cupstestppd.c:665
msgid ""
" **FAIL** REQUIRED FormatVersion\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1076
+#: systemv/cupstestppd.c:1056
#, c-format
msgid ""
" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
@@ -786,68 +786,68 @@ msgid ""
" REF: Page 102, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:705
+#: systemv/cupstestppd.c:685
msgid ""
" **FAIL** REQUIRED LanguageEncoding\n"
" REF: Pages 56-57, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:725
+#: systemv/cupstestppd.c:705
msgid ""
" **FAIL** REQUIRED LanguageVersion\n"
" REF: Pages 57-58, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:779
+#: systemv/cupstestppd.c:759
msgid ""
" **FAIL** REQUIRED Manufacturer\n"
" REF: Pages 58-59, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:819
+#: systemv/cupstestppd.c:799
msgid ""
" **FAIL** REQUIRED ModelName\n"
" REF: Pages 59-60, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:839
+#: systemv/cupstestppd.c:819
msgid ""
" **FAIL** REQUIRED NickName\n"
" REF: Page 60, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:899
+#: systemv/cupstestppd.c:879
msgid ""
" **FAIL** REQUIRED PCFileName\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:974
+#: systemv/cupstestppd.c:954
msgid ""
" **FAIL** REQUIRED PSVersion\n"
" REF: Pages 62-64, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:879
+#: systemv/cupstestppd.c:859
msgid ""
" **FAIL** REQUIRED PageRegion\n"
" REF: Page 100, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:1045
+#: systemv/cupstestppd.c:1025
msgid ""
" **FAIL** REQUIRED PageSize\n"
" REF: Page 41, section 5.\n"
" REF: Page 99, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:859
+#: systemv/cupstestppd.c:839
msgid ""
" **FAIL** REQUIRED PageSize\n"
" REF: Pages 99-100, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:1098
+#: systemv/cupstestppd.c:1078
#, c-format
msgid ""
" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
@@ -855,25 +855,25 @@ msgid ""
" REF: Page 103, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:934
+#: systemv/cupstestppd.c:914
msgid ""
" **FAIL** REQUIRED Product\n"
" REF: Page 62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1009
+#: systemv/cupstestppd.c:989
msgid ""
" **FAIL** REQUIRED ShortNickName\n"
" REF: Page 64-65, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:334 systemv/cupstestppd.c:353
-#: systemv/cupstestppd.c:365
+#: systemv/cupstestppd.c:314 systemv/cupstestppd.c:333
+#: systemv/cupstestppd.c:345
#, c-format
msgid " **FAIL** Unable to open PPD file - %s on line %d."
msgstr ""
-#: systemv/cupstestppd.c:1498
+#: systemv/cupstestppd.c:1478
#, c-format
msgid " %d ERRORS FOUND"
msgstr ""
@@ -942,7 +942,7 @@ msgid ""
" REF: Page 43, %%Pages:"
msgstr ""
-#: systemv/cupstestppd.c:1500
+#: systemv/cupstestppd.c:1480
msgid " NO ERRORS FOUND"
msgstr ""
@@ -975,6 +975,14 @@ msgstr ""
msgid " Warning: obsolete DSC version %.1f in file."
msgstr ""
+#: test/ippfind.c:2796
+msgid " ! expression Unary NOT of expression."
+msgstr ""
+
+#: test/ippfind.c:2795
+msgid " ( expressions ) Group expressions."
+msgstr ""
+
#: systemv/cupsctl.c:210
msgid " --[no-]debug-logging Turn debug logging on/off."
msgstr ""
@@ -995,35 +1003,135 @@ msgstr ""
msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job."
msgstr ""
-#: ppdc/ppdc.cxx:455
+#: ppdc/ppdc.cxx:450
msgid " --cr End lines with CR (Mac OS 9)."
msgstr ""
-#: ppdc/ppdc.cxx:457
+#: ppdc/ppdc.cxx:452
msgid " --crlf End lines with CR + LF (Windows)."
msgstr ""
-#: ppdc/ppdc.cxx:459
+#: test/ippfind.c:2777
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2778
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+#: test/ippfind.c:2798
+msgid " --false Always false."
+msgstr ""
+
+#: test/ipptool.c:4858
+msgid " --help Show help."
+msgstr ""
+
+#: test/ippfind.c:2760
+msgid " --help Show this help."
+msgstr ""
+
+#: test/ippfind.c:2780
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+
+#: ppdc/ppdc.cxx:454
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr ""
-#: test/ipptool.c:4485
+#: scheduler/cupsfilter.c:1483
+msgid " --list-filters List filters that will be used."
+msgstr ""
+
+#: test/ippfind.c:2782
+msgid " --local True if service is local."
+msgstr ""
+
+#: test/ippfind.c:2781
+msgid " --ls List attributes."
+msgstr ""
+
+#: test/ippfind.c:2783
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2797
+msgid " --not expression Unary NOT of expression."
+msgstr ""
+
+#: test/ippfind.c:2784
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2785
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+
+#: test/ippfind.c:2786
+msgid " --print Print URI if true."
+msgstr ""
+
+#: test/ippfind.c:2787
+msgid " --print-name Print service name if true."
+msgstr ""
+
+#: test/ippfind.c:2788
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+
+#: test/ippfind.c:2789
+msgid " --remote True if service is remote."
+msgstr ""
+
+#: test/ipptool.c:4859
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+
+#: test/ippfind.c:2799
+msgid " --true Always true."
+msgstr ""
+
+#: test/ippfind.c:2790
+msgid " --txt key True if the TXT record contains the key."
+msgstr ""
+
+#: test/ippfind.c:2791
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2792
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2761
+msgid " --version Show program version."
+msgstr ""
+
+#: test/ipptool.c:4861
+msgid " --version Show version."
+msgstr ""
+
+#: test/ippfind.c:2754 test/ipptool.c:4862
msgid " -4 Connect using IPv4."
msgstr ""
-#: test/ipptool.c:4486
+#: test/ippfind.c:2755 test/ipptool.c:4863
msgid " -6 Connect using IPv6."
msgstr ""
-#: test/ipptool.c:4487
+#: test/ipptool.c:4864
msgid " -C Send requests using chunking (default)."
msgstr ""
-#: scheduler/cupsfilter.c:1434
+#: scheduler/cupsfilter.c:1484
msgid " -D Remove the input file when finished."
msgstr ""
-#: ppdc/ppdc.cxx:438 ppdc/ppdhtml.cxx:175 ppdc/ppdpo.cxx:255
+#: ppdc/ppdc.cxx:433 ppdc/ppdhtml.cxx:180 ppdc/ppdpo.cxx:250
msgid " -D name=value Set named variable to value."
msgstr ""
@@ -1031,11 +1139,11 @@ msgstr ""
msgid " -E Encrypt the connection."
msgstr ""
-#: test/ipptool.c:4489
+#: test/ipptool.c:4866
msgid " -E Test with HTTP Upgrade to TLS."
msgstr ""
-#: scheduler/main.c:2057
+#: scheduler/main.c:2180
msgid " -F Run in the foreground but detach from console."
msgstr ""
@@ -1043,450 +1151,828 @@ msgstr ""
msgid " -H samba-server Use the named SAMBA server."
msgstr ""
-#: test/ipptool.c:4491
+#: test/ipptool.c:4868
msgid " -I Ignore errors."
msgstr ""
-#: ppdc/ppdc.cxx:440 ppdc/ppdhtml.cxx:177 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:257
+#: ppdc/ppdc.cxx:435 ppdc/ppdhtml.cxx:182 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:252
msgid " -I include-dir Add include directory to search path."
msgstr ""
-#: systemv/cupstestppd.c:3799
+#: systemv/cupstestppd.c:3863
msgid " -I {filename,filters,none,profiles}"
msgstr ""
-#: test/ipptool.c:4492
+#: test/ipptool.c:4869
msgid " -L Send requests using content-length."
msgstr ""
-#: scheduler/cupsfilter.c:1436
+#: test/ipptool.c:4871
+msgid " -P filename.plist Produce XML plist to a file and test report to standard output."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1485
msgid " -P filename.ppd Set PPD file."
msgstr ""
-#: systemv/cupstestppd.c:3801
+#: test/ippfind.c:2764
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+
+#: systemv/cupstestppd.c:3865
msgid " -R root-directory Set alternate root."
msgstr ""
-#: test/ipptool.c:4494
+#: test/ipptool.c:4872
msgid " -S Test with SSL encryption."
msgstr ""
-#: test/ipptool.c:4496
+#: test/ippfind.c:2756
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr ""
+
+#: test/ipptool.c:4874
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr ""
-#: scheduler/cupsfilter.c:1437 systemv/cupsaddsmb.c:288 systemv/cupsctl.c:206
+#: scheduler/cupsfilter.c:1486 systemv/cupsaddsmb.c:288 systemv/cupsctl.c:206
msgid " -U username Specify username."
msgstr ""
-#: test/ipptool.c:4498
+#: test/ippfind.c:2758 test/ipptool.c:4876
msgid " -V version Set default IPP version."
msgstr ""
-#: systemv/cupstestppd.c:3802
+#: systemv/cupstestppd.c:3866
msgid " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}"
msgstr ""
-#: test/ipptool.c:4500
+#: test/ipptool.c:4878
msgid " -X Produce XML plist instead of plain text."
msgstr ""
+#: test/ippdiscover.c:818
+msgid " -a Browse for all services."
+msgstr ""
+
#: systemv/cupsaddsmb.c:289
msgid " -a Export all printers."
msgstr ""
-#: ppdc/ppdc.cxx:442
+#: test/ipptool.c:4880
+msgid " -c Produce CSV output."
+msgstr ""
+
+#: ppdc/ppdc.cxx:437
msgid " -c catalog.po Load the specified message catalog."
msgstr ""
-#: scheduler/cupsfilter.c:1438 scheduler/main.c:2055
+#: scheduler/cupsfilter.c:1487
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr ""
+
+#: scheduler/main.c:2178
msgid " -c cupsd.conf Set cupsd.conf file to use."
msgstr ""
-#: test/ipptool.c:4502
+#: test/ippdiscover.c:819
+msgid " -d domain Browse/resolve in specified domain."
+msgstr ""
+
+#: test/ipptool.c:4881
msgid " -d name=value Set named variable to value."
msgstr ""
-#: ppdc/ppdc.cxx:444
+#: ppdc/ppdc.cxx:439
msgid " -d output-dir Specify the output directory."
msgstr ""
-#: scheduler/cupsfilter.c:1440
+#: scheduler/cupsfilter.c:1488
msgid " -d printer Use the named printer."
msgstr ""
-#: scheduler/cupsfilter.c:1442
+#: test/ippfind.c:2765
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1489
msgid " -e Use every filter from the PPD file."
msgstr ""
-#: scheduler/main.c:2056
+#: scheduler/main.c:2179
msgid " -f Run in the foreground."
msgstr ""
-#: test/ipptool.c:4504
+#: test/ipptool.c:4883
msgid " -f filename Set default request filename."
msgstr ""
-#: scheduler/main.c:2059
+#: scheduler/main.c:2182
msgid " -h Show this usage message."
msgstr ""
+#: test/ippfind.c:2766
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+
#: systemv/cupsaddsmb.c:290 systemv/cupsctl.c:207
msgid " -h server[:port] Specify server address."
msgstr ""
-#: scheduler/cupsfilter.c:1444
+#: scheduler/cupsfilter.c:1490
msgid " -i mime/type Set input MIME type (otherwise auto-typed)."
msgstr ""
-#: test/ipptool.c:4506
+#: test/ipptool.c:4885
msgid " -i seconds Repeat the last file with the given time interval."
msgstr ""
-#: scheduler/cupsfilter.c:1446
+#: scheduler/cupsfilter.c:1491
msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)."
msgstr ""
-#: scheduler/main.c:2060
-msgid " -l Run cupsd from launchd(8)."
+#: test/ippfind.c:2767
+msgid " -l List attributes."
msgstr ""
-#: ppdc/ppdc.cxx:446
+#: test/ipptool.c:4887
+msgid " -l Produce plain text output."
+msgstr ""
+
+#: scheduler/main.c:2183
+msgid " -l Run cupsd on demand."
+msgstr ""
+
+#: ppdc/ppdc.cxx:441
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
msgstr ""
-#: ppdc/ppdc.cxx:448
+#: ppdc/ppdc.cxx:443
msgid " -m Use the ModelName value as the filename."
msgstr ""
-#: scheduler/cupsfilter.c:1448
+#: scheduler/cupsfilter.c:1492
msgid " -m mime/type Set output MIME type (otherwise application/pdf)."
msgstr ""
-#: scheduler/cupsfilter.c:1450
+#: scheduler/cupsfilter.c:1493
msgid " -n copies Set number of copies."
msgstr ""
-#: test/ipptool.c:4508
+#: test/ipptool.c:4888
msgid " -n count Repeat the last file the given number of times."
msgstr ""
+#: test/ippfind.c:2768
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+
#: ppdc/ppdi.cxx:133
msgid " -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
-#: ppdc/ppdmerge.cxx:370
+#: ppdc/ppdmerge.cxx:364
msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)."
msgstr ""
-#: scheduler/cupsfilter.c:1451
+#: scheduler/cupsfilter.c:1494
msgid " -o name=value Set option(s)."
msgstr ""
-#: scheduler/cupsfilter.c:1452
+#: test/ippfind.c:2769
+msgid " -p Print URI if true."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1495
msgid " -p filename.ppd Set PPD file."
msgstr ""
-#: systemv/cupstestppd.c:3806 test/ipptool.c:4510
+#: test/ippdiscover.c:820
+msgid " -p program Run specified program for each service."
+msgstr ""
+
+#: test/ippfind.c:2770
+msgid " -q Quietly report match via exit code."
+msgstr ""
+
+#: systemv/cupstestppd.c:3870 test/ipptool.c:4890
msgid " -q Run silently."
msgstr ""
-#: systemv/cupstestppd.c:3807
+#: test/ippfind.c:2771
+msgid " -r True if service is remote."
+msgstr ""
+
+#: systemv/cupstestppd.c:3871
msgid " -r Use 'relaxed' open mode."
msgstr ""
-#: test/ipptool.c:4511
+#: test/ippfind.c:2772
+msgid " -s Print service name if true."
+msgstr ""
+
+#: test/ipptool.c:4891
msgid " -t Produce a test report."
msgstr ""
-#: ppdc/ppdc.cxx:450
+#: ppdc/ppdc.cxx:445
msgid " -t Test PPDs instead of generating them."
msgstr ""
-#: scheduler/main.c:2061
+#: scheduler/main.c:2184
msgid " -t Test the configuration file."
msgstr ""
-#: scheduler/cupsfilter.c:1453
+#: test/ippfind.c:2773
+msgid " -t key True if the TXT record contains the key."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1496
msgid " -t title Set title."
msgstr ""
-#: scheduler/cupsfilter.c:1454
+#: test/ippdiscover.c:821
+msgid " -t type Browse/resolve with specified type."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1497
msgid " -u Remove the PPD file when finished."
msgstr ""
-#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3808 test/ipptool.c:4512
-#: ppdc/ppdc.cxx:452 ppdc/ppdpo.cxx:259
+#: test/ippfind.c:2774
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+
+#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3872 test/ipptool.c:4892
+#: ppdc/ppdc.cxx:447 ppdc/ppdpo.cxx:254
msgid " -v Be verbose."
msgstr ""
-#: systemv/cupstestppd.c:3809
+#: systemv/cupstestppd.c:3873
msgid " -vv Be very verbose."
msgstr ""
-#: ppdc/ppdc.cxx:453
+#: test/ippfind.c:2775
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+#: ppdc/ppdc.cxx:448
msgid " -z Compress PPD files using GNU zip."
msgstr ""
-#: systemv/cupstestppd.c:332 systemv/cupstestppd.c:351
-#: systemv/cupstestppd.c:363 systemv/cupstestppd.c:496
-#: systemv/cupstestppd.c:511 systemv/cupstestppd.c:532
-#: systemv/cupstestppd.c:547 systemv/cupstestppd.c:577
-#: systemv/cupstestppd.c:597 systemv/cupstestppd.c:620
-#: systemv/cupstestppd.c:638 systemv/cupstestppd.c:664
-#: systemv/cupstestppd.c:682 systemv/cupstestppd.c:702
-#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:740
-#: systemv/cupstestppd.c:757 systemv/cupstestppd.c:776
-#: systemv/cupstestppd.c:797 systemv/cupstestppd.c:816
-#: systemv/cupstestppd.c:836 systemv/cupstestppd.c:856
-#: systemv/cupstestppd.c:876 systemv/cupstestppd.c:896
-#: systemv/cupstestppd.c:914 systemv/cupstestppd.c:931
-#: systemv/cupstestppd.c:953 systemv/cupstestppd.c:971
-#: systemv/cupstestppd.c:988 systemv/cupstestppd.c:1006
-#: systemv/cupstestppd.c:1022 systemv/cupstestppd.c:1042
-#: systemv/cupstestppd.c:1073 systemv/cupstestppd.c:1095
-#: systemv/cupstestppd.c:1146 systemv/cupstestppd.c:1165
-#: systemv/cupstestppd.c:1209 systemv/cupstestppd.c:1223
-#: systemv/cupstestppd.c:1255 systemv/cupstestppd.c:1282
-#: systemv/cupstestppd.c:1800 systemv/cupstestppd.c:1819
-#: systemv/cupstestppd.c:1837 systemv/cupstestppd.c:1889
-#: systemv/cupstestppd.c:1905 systemv/cupstestppd.c:1942
-#: systemv/cupstestppd.c:1960 systemv/cupstestppd.c:1996
-#: systemv/cupstestppd.c:2010 systemv/cupstestppd.c:2037
-#: systemv/cupstestppd.c:2051 systemv/cupstestppd.c:2097
-#: systemv/cupstestppd.c:2119 systemv/cupstestppd.c:2142
-#: systemv/cupstestppd.c:2159 systemv/cupstestppd.c:2201
-#: systemv/cupstestppd.c:2244 systemv/cupstestppd.c:2291
-#: systemv/cupstestppd.c:2315 systemv/cupstestppd.c:2369
-#: systemv/cupstestppd.c:2385 systemv/cupstestppd.c:2415
-#: systemv/cupstestppd.c:2429 systemv/cupstestppd.c:2455
-#: systemv/cupstestppd.c:2471 systemv/cupstestppd.c:2511
-#: systemv/cupstestppd.c:2525 systemv/cupstestppd.c:2551
-#: systemv/cupstestppd.c:2567 systemv/cupstestppd.c:2597
-#: systemv/cupstestppd.c:2611 systemv/cupstestppd.c:2638
-#: systemv/cupstestppd.c:2655 systemv/cupstestppd.c:2669
-#: systemv/cupstestppd.c:2693 systemv/cupstestppd.c:2710
-#: systemv/cupstestppd.c:2724 systemv/cupstestppd.c:2748
-#: systemv/cupstestppd.c:2765 systemv/cupstestppd.c:2779
-#: systemv/cupstestppd.c:2803 systemv/cupstestppd.c:2820
-#: systemv/cupstestppd.c:2834 systemv/cupstestppd.c:2858
-#: systemv/cupstestppd.c:2872 systemv/cupstestppd.c:2887
-#: systemv/cupstestppd.c:2904 systemv/cupstestppd.c:2960
-#: systemv/cupstestppd.c:2995 systemv/cupstestppd.c:3009
-#: systemv/cupstestppd.c:3037 systemv/cupstestppd.c:3102
-#: systemv/cupstestppd.c:3117 systemv/cupstestppd.c:3156
-#: systemv/cupstestppd.c:3176 systemv/cupstestppd.c:3190
-#: systemv/cupstestppd.c:3387 systemv/cupstestppd.c:3423
-#: systemv/cupstestppd.c:3437 systemv/cupstestppd.c:3483
-#: systemv/cupstestppd.c:3515 systemv/cupstestppd.c:3532
-#: systemv/cupstestppd.c:3555 systemv/cupstestppd.c:3571
-#: systemv/cupstestppd.c:3609 systemv/cupstestppd.c:3750
-#: systemv/cupstestppd.c:3772 systemv/cupstestppd.c:3880
+#: test/ippfind.c:2818
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr ""
+
+#: test/ippfind.c:2819
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+
+#: test/ippfind.c:2821
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr ""
+
+#: test/ippfind.c:2822
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr ""
+
+#: test/ippfind.c:2823
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr ""
+
+#: test/ippfind.c:2824
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr ""
+
+#: test/ippfind.c:2825
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr ""
+
+#: test/ippfind.c:2826
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr ""
+
+#: test/ippfind.c:2801
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+
+#: test/ippfind.c:2803
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+
+#: test/ippfind.c:2800
+msgid " expression expression Logical AND."
+msgstr ""
+
+#: test/ippfind.c:2808
+msgid " {service_domain} Domain name"
+msgstr ""
+
+#: test/ippfind.c:2809
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr ""
+
+#: test/ippfind.c:2810
+msgid " {service_name} Service instance name"
+msgstr ""
+
+#: test/ippfind.c:2811
+msgid " {service_port} Port number"
+msgstr ""
+
+#: test/ippfind.c:2812
+msgid " {service_regtype} DNS-SD registration type"
+msgstr ""
+
+#: test/ippfind.c:2813
+msgid " {service_scheme} URI scheme"
+msgstr ""
+
+#: test/ippfind.c:2814
+msgid " {service_uri} URI"
+msgstr ""
+
+#: test/ippfind.c:2815
+msgid " {txt_*} Value of TXT record key"
+msgstr ""
+
+#: test/ippfind.c:2807
+msgid " {} URI"
+msgstr ""
+
+#: systemv/cupstestppd.c:312 systemv/cupstestppd.c:331
+#: systemv/cupstestppd.c:343 systemv/cupstestppd.c:476
+#: systemv/cupstestppd.c:491 systemv/cupstestppd.c:512
+#: systemv/cupstestppd.c:527 systemv/cupstestppd.c:557
+#: systemv/cupstestppd.c:577 systemv/cupstestppd.c:600
+#: systemv/cupstestppd.c:618 systemv/cupstestppd.c:644
+#: systemv/cupstestppd.c:662 systemv/cupstestppd.c:682
+#: systemv/cupstestppd.c:702 systemv/cupstestppd.c:720
+#: systemv/cupstestppd.c:737 systemv/cupstestppd.c:756
+#: systemv/cupstestppd.c:777 systemv/cupstestppd.c:796
+#: systemv/cupstestppd.c:816 systemv/cupstestppd.c:836
+#: systemv/cupstestppd.c:856 systemv/cupstestppd.c:876
+#: systemv/cupstestppd.c:894 systemv/cupstestppd.c:911
+#: systemv/cupstestppd.c:933 systemv/cupstestppd.c:951
+#: systemv/cupstestppd.c:968 systemv/cupstestppd.c:986
+#: systemv/cupstestppd.c:1002 systemv/cupstestppd.c:1022
+#: systemv/cupstestppd.c:1053 systemv/cupstestppd.c:1075
+#: systemv/cupstestppd.c:1126 systemv/cupstestppd.c:1145
+#: systemv/cupstestppd.c:1189 systemv/cupstestppd.c:1203
+#: systemv/cupstestppd.c:1235 systemv/cupstestppd.c:1262
+#: systemv/cupstestppd.c:1780 systemv/cupstestppd.c:1799
+#: systemv/cupstestppd.c:1817 systemv/cupstestppd.c:1869
+#: systemv/cupstestppd.c:1885 systemv/cupstestppd.c:1922
+#: systemv/cupstestppd.c:1940 systemv/cupstestppd.c:1976
+#: systemv/cupstestppd.c:1990 systemv/cupstestppd.c:2017
+#: systemv/cupstestppd.c:2031 systemv/cupstestppd.c:2077
+#: systemv/cupstestppd.c:2099 systemv/cupstestppd.c:2122
+#: systemv/cupstestppd.c:2139 systemv/cupstestppd.c:2181
+#: systemv/cupstestppd.c:2224 systemv/cupstestppd.c:2271
+#: systemv/cupstestppd.c:2295 systemv/cupstestppd.c:2349
+#: systemv/cupstestppd.c:2365 systemv/cupstestppd.c:2387
+#: systemv/cupstestppd.c:2427 systemv/cupstestppd.c:2441
+#: systemv/cupstestppd.c:2467 systemv/cupstestppd.c:2483
+#: systemv/cupstestppd.c:2505 systemv/cupstestppd.c:2555
+#: systemv/cupstestppd.c:2569 systemv/cupstestppd.c:2595
+#: systemv/cupstestppd.c:2611 systemv/cupstestppd.c:2641
+#: systemv/cupstestppd.c:2655 systemv/cupstestppd.c:2682
+#: systemv/cupstestppd.c:2699 systemv/cupstestppd.c:2713
+#: systemv/cupstestppd.c:2737 systemv/cupstestppd.c:2754
+#: systemv/cupstestppd.c:2768 systemv/cupstestppd.c:2792
+#: systemv/cupstestppd.c:2809 systemv/cupstestppd.c:2823
+#: systemv/cupstestppd.c:2847 systemv/cupstestppd.c:2864
+#: systemv/cupstestppd.c:2878 systemv/cupstestppd.c:2902
+#: systemv/cupstestppd.c:2916 systemv/cupstestppd.c:2931
+#: systemv/cupstestppd.c:2948 systemv/cupstestppd.c:3004
+#: systemv/cupstestppd.c:3039 systemv/cupstestppd.c:3053
+#: systemv/cupstestppd.c:3081 systemv/cupstestppd.c:3146
+#: systemv/cupstestppd.c:3161 systemv/cupstestppd.c:3200
+#: systemv/cupstestppd.c:3220 systemv/cupstestppd.c:3234
+#: systemv/cupstestppd.c:3451 systemv/cupstestppd.c:3487
+#: systemv/cupstestppd.c:3501 systemv/cupstestppd.c:3547
+#: systemv/cupstestppd.c:3579 systemv/cupstestppd.c:3596
+#: systemv/cupstestppd.c:3619 systemv/cupstestppd.c:3635
+#: systemv/cupstestppd.c:3673 systemv/cupstestppd.c:3814
+#: systemv/cupstestppd.c:3836 systemv/cupstestppd.c:3944
msgid " FAIL"
msgstr ""
-#: systemv/cupstestppd.c:1306
+#: systemv/cupstestppd.c:1286
msgid " PASS"
msgstr ""
-#: berkeley/lpq.c:565
+#: cups/ipp.c:5227
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#: cups/ipp.c:5238
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#: cups/ipp.c:4858
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:4850
+#, c-format
+msgid "\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:4876
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#: cups/ipp.c:5290
+#, c-format
+msgid "\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#: cups/ipp.c:5299
+#, c-format
+msgid "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#: cups/ipp.c:4976
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4984
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4968
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4928
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4960
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4936
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4944
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4920
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4952
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4890
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#: cups/ipp.c:5205
+#, c-format
+msgid "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:5196
+#, c-format
+msgid "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:5399
+#, c-format
+msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section 4.1.9)."
+msgstr ""
+
+#: cups/ipp.c:5409
+#, c-format
+msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section 4.1.9)."
+msgstr ""
+
+#: cups/ipp.c:5167
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#: cups/ipp.c:5176
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#: cups/ipp.c:5345
+#, c-format
+msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section 4.1.8)."
+msgstr ""
+
+#: cups/ipp.c:5355
+#, c-format
+msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section 4.1.8)."
+msgstr ""
+
+#: cups/ipp.c:4904
+#, c-format
+msgid "\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#: cups/ipp.c:5047
+#, c-format
+msgid "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 section 4.1.13)."
+msgstr ""
+
+#: cups/ipp.c:5028
+#, c-format
+msgid "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#: cups/ipp.c:4997
+#, c-format
+msgid "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#: cups/ipp.c:5012
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 2911 section 4.1.15)."
msgstr ""
-#: berkeley/lpq.c:570
+#: cups/ipp.c:5109
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#: cups/ipp.c:5118
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#: cups/ipp.c:5261
+#, c-format
+msgid "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#: cups/ipp.c:5270
+#, c-format
+msgid "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#: berkeley/lpq.c:533
#, c-format
msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
msgstr ""
-#: systemv/lpstat.c:835
+#: cups/dest-localization.c:114
+#, c-format
+msgid "%d x %d mm"
+msgstr ""
+
+#: cups/dest-localization.c:106
+#, c-format
+msgid "%g x %g"
+msgstr ""
+
+#: cups/dest-localization.c:169 cups/dest-localization.c:176
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#: cups/dest-localization.c:183
+#, c-format
+msgid "%s (%s, %s)"
+msgstr ""
+
+#: cups/dest-localization.c:160
+#, c-format
+msgid "%s (Borderless)"
+msgstr ""
+
+#: cups/dest-localization.c:167 cups/dest-localization.c:174
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr ""
+
+#: cups/dest-localization.c:181
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr ""
+
+#: systemv/lpstat.c:777
#, c-format
msgid "%s accepting requests since %s"
msgstr ""
-#: scheduler/ipp.c:10166
+#: scheduler/ipp.c:9986
#, c-format
msgid "%s cannot be changed."
msgstr ""
-#: berkeley/lpc.c:189
+#: berkeley/lpc.c:181
#, c-format
msgid "%s is not implemented by the CUPS version of lpc."
msgstr ""
-#: berkeley/lpq.c:656
+#: berkeley/lpq.c:618
#, c-format
msgid "%s is not ready"
msgstr ""
-#: berkeley/lpq.c:649
+#: berkeley/lpq.c:611
#, c-format
msgid "%s is ready"
msgstr ""
-#: berkeley/lpq.c:652
+#: berkeley/lpq.c:614
#, c-format
msgid "%s is ready and printing"
msgstr ""
-#: filter/rastertoepson.c:985 filter/rastertohp.c:711
-#: filter/rastertolabel.c:1134
+#: filter/rastertoepson.c:982 filter/rastertohp.c:700
+#: filter/rastertolabel.c:1120
#, c-format
msgid "%s job-id user title copies options [file]"
msgstr ""
-#: systemv/lpstat.c:839
+#: systemv/lpstat.c:781
#, c-format
msgid "%s not accepting requests since %s -"
msgstr ""
-#: scheduler/ipp.c:691
+#: scheduler/ipp.c:617
#, c-format
msgid "%s not supported."
msgstr ""
-#: systemv/lpstat.c:850
+#: systemv/lpstat.c:792
#, c-format
msgid "%s/%s accepting requests since %s"
msgstr ""
-#: systemv/lpstat.c:855
+#: systemv/lpstat.c:797
#, c-format
msgid "%s/%s not accepting requests since %s -"
msgstr ""
-#: berkeley/lpq.c:557
+#: berkeley/lpq.c:526
#, c-format
msgid "%s: %-33.33s [job %d localhost]"
msgstr ""
#. TRANSLATORS: Message is "subject: error"
-#: cups/langprintf.c:86 scheduler/cupsfilter.c:716 systemv/lpadmin.c:805
-#: systemv/lpadmin.c:856 systemv/lpadmin.c:906 systemv/lpadmin.c:962
-#: systemv/lpadmin.c:1060 systemv/lpadmin.c:1112 systemv/lpadmin.c:1168
-#: systemv/lpadmin.c:1478
+#: cups/langprintf.c:77 scheduler/cupsfilter.c:726 systemv/lpadmin.c:803
+#: systemv/lpadmin.c:854 systemv/lpadmin.c:904 systemv/lpadmin.c:960
+#: systemv/lpadmin.c:1058 systemv/lpadmin.c:1110 systemv/lpadmin.c:1166
+#: systemv/lpadmin.c:1581
#, c-format
msgid "%s: %s"
msgstr ""
-#: systemv/cancel.c:294 systemv/cancel.c:357
+#: systemv/cancel.c:305 systemv/cancel.c:368
#, c-format
msgid "%s: %s failed: %s"
msgstr ""
+#: systemv/lpadmin.c:1216
+#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#: test/ippfind.c:777 test/ipptool.c:381
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr ""
+
#: systemv/cupsaccept.c:68
#, c-format
msgid "%s: Don't know what to do."
msgstr ""
-#: berkeley/lpq.c:237 berkeley/lpr.c:362 systemv/lp.c:608
+#: berkeley/lpq.c:225 berkeley/lpr.c:358 systemv/lp.c:602
#, c-format
msgid "%s: Error - %s environment variable names non-existent destination \"%s\"."
msgstr ""
-#: berkeley/lpq.c:144 berkeley/lpq.c:215 berkeley/lpr.c:234 berkeley/lpr.c:337
-#: systemv/lp.c:163 systemv/lp.c:583 systemv/lp.c:703 systemv/lp.c:752
-#: systemv/lpstat.c:208 systemv/lpstat.c:286 systemv/lpstat.c:388
-#: systemv/lpstat.c:417 systemv/lpstat.c:441 systemv/lpstat.c:500
-#: systemv/lpstat.c:566 systemv/lpstat.c:627 systemv/lpstat.c:753
-#: systemv/lpstat.c:938 systemv/lpstat.c:1199 systemv/lpstat.c:1442
-#: systemv/lpstat.c:1701
+#: berkeley/lpq.c:133 berkeley/lpq.c:203 berkeley/lpr.c:230 berkeley/lpr.c:333
+#: systemv/lp.c:157 systemv/lp.c:577 systemv/lp.c:697 systemv/lp.c:746
+#: systemv/lpstat.c:195 systemv/lpstat.c:241 systemv/lpstat.c:332
+#: systemv/lpstat.c:361 systemv/lpstat.c:385 systemv/lpstat.c:444
+#: systemv/lpstat.c:510 systemv/lpstat.c:571 systemv/lpstat.c:696
+#: systemv/lpstat.c:880 systemv/lpstat.c:1141 systemv/lpstat.c:1339
+#: systemv/lpstat.c:1579
#, c-format
msgid "%s: Error - add '/version=1.1' to server name."
msgstr ""
-#: systemv/lp.c:240
+#: systemv/lp.c:234
#, c-format
msgid "%s: Error - bad job ID."
msgstr ""
-#: systemv/lp.c:228
+#: systemv/lp.c:222
#, c-format
msgid "%s: Error - cannot print files and alter jobs simultaneously."
msgstr ""
-#: systemv/lp.c:521
+#: systemv/lp.c:515
#, c-format
msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
msgstr ""
-#: systemv/lp.c:470
+#: systemv/lp.c:464
#, c-format
msgid "%s: Error - expected character set after \"-S\" option."
msgstr ""
-#: systemv/lp.c:489
+#: systemv/lp.c:483
#, c-format
msgid "%s: Error - expected content type after \"-T\" option."
msgstr ""
-#: berkeley/lpr.c:249
+#: berkeley/lpr.c:245
#, c-format
msgid "%s: Error - expected copies after \"-#\" option."
msgstr ""
-#: systemv/lp.c:273
+#: systemv/lp.c:267
#, c-format
msgid "%s: Error - expected copies after \"-n\" option."
msgstr ""
-#: berkeley/lpr.c:210
+#: berkeley/lpr.c:206
#, c-format
msgid "%s: Error - expected destination after \"-P\" option."
msgstr ""
-#: systemv/lpstat.c:241
-#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
-
-#: systemv/lp.c:138
+#: systemv/lp.c:132
#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
msgstr ""
-#: systemv/lp.c:177
+#: systemv/lp.c:171
#, c-format
msgid "%s: Error - expected form after \"-f\" option."
msgstr ""
-#: systemv/lp.c:400
+#: systemv/lp.c:394
#, c-format
msgid "%s: Error - expected hold name after \"-H\" option."
msgstr ""
-#: berkeley/lpr.c:104
+#: berkeley/lpr.c:100
#, c-format
msgid "%s: Error - expected hostname after \"-H\" option."
msgstr ""
-#: berkeley/lpq.c:180 berkeley/lprm.c:123 systemv/cancel.c:124
-#: systemv/cupsaccept.c:123 systemv/lp.c:198 systemv/lpstat.c:311
+#: berkeley/lpq.c:169 berkeley/lprm.c:123 systemv/cancel.c:124
+#: systemv/cupsaccept.c:123 systemv/lp.c:192 systemv/lpstat.c:266
#, c-format
msgid "%s: Error - expected hostname after \"-h\" option."
msgstr ""
-#: systemv/lp.c:380
+#: systemv/lp.c:374
#, c-format
msgid "%s: Error - expected mode list after \"-y\" option."
msgstr ""
-#: berkeley/lpr.c:272
+#: berkeley/lpr.c:268
#, c-format
msgid "%s: Error - expected name after \"-%c\" option."
msgstr ""
-#: berkeley/lpr.c:154 systemv/lp.c:297
+#: berkeley/lpr.c:150 systemv/lp.c:291
#, c-format
msgid "%s: Error - expected option=value after \"-o\" option."
msgstr ""
-#: systemv/lp.c:450
+#: systemv/lp.c:444
#, c-format
msgid "%s: Error - expected page list after \"-P\" option."
msgstr ""
-#: systemv/lp.c:317
+#: systemv/lp.c:311
#, c-format
msgid "%s: Error - expected priority after \"-%c\" option."
msgstr ""
@@ -1496,14 +1982,14 @@ msgstr ""
msgid "%s: Error - expected reason text after \"-r\" option."
msgstr ""
-#: systemv/lp.c:363
+#: systemv/lp.c:357
#, c-format
msgid "%s: Error - expected title after \"-t\" option."
msgstr ""
-#: berkeley/lpq.c:108 berkeley/lpr.c:85 berkeley/lprm.c:104
-#: systemv/cancel.c:94 systemv/cupsaccept.c:101 systemv/lp.c:116
-#: systemv/lpadmin.c:438 systemv/lpstat.c:137
+#: berkeley/lpq.c:97 berkeley/lpr.c:81 berkeley/lprm.c:104 systemv/cancel.c:95
+#: systemv/cupsaccept.c:101 systemv/lp.c:110 systemv/lpadmin.c:426
+#: systemv/lpstat.c:124
#, c-format
msgid "%s: Error - expected username after \"-U\" option."
msgstr ""
@@ -1513,88 +1999,103 @@ msgstr ""
msgid "%s: Error - expected username after \"-u\" option."
msgstr ""
-#: berkeley/lpr.c:126
+#: berkeley/lpr.c:122
#, c-format
msgid "%s: Error - expected value after \"-%c\" option."
msgstr ""
-#: systemv/lpstat.c:157 systemv/lpstat.c:171
+#: systemv/lpstat.c:144 systemv/lpstat.c:158
#, c-format
msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."
msgstr ""
-#: berkeley/lpq.c:242 berkeley/lpr.c:367 systemv/lp.c:613
+#: berkeley/lpq.c:230 berkeley/lpr.c:363 systemv/lp.c:607
#, c-format
msgid "%s: Error - no default destination available."
msgstr ""
-#: systemv/lp.c:339
+#: systemv/lp.c:333
#, c-format
msgid "%s: Error - priority must be between 1 and 100."
msgstr ""
-#: berkeley/lpr.c:370 systemv/lp.c:616
+#: berkeley/lpr.c:366 systemv/lp.c:610
#, c-format
msgid "%s: Error - scheduler not responding."
msgstr ""
-#: berkeley/lpr.c:315 systemv/lp.c:553
+#: berkeley/lpr.c:311 systemv/lp.c:547
#, c-format
msgid "%s: Error - too many files - \"%s\"."
msgstr ""
-#: berkeley/lpr.c:297 systemv/lp.c:536
+#: berkeley/lpr.c:293 systemv/lp.c:530
#, c-format
msgid "%s: Error - unable to access \"%s\" - %s"
msgstr ""
-#: berkeley/lpr.c:413 systemv/lp.c:647
+#: berkeley/lpr.c:409 systemv/lp.c:641
#, c-format
msgid "%s: Error - unable to queue from stdin - %s."
msgstr ""
-#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:214
+#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:222
#, c-format
msgid "%s: Error - unknown destination \"%s\"."
msgstr ""
-#: berkeley/lpq.c:148
+#: berkeley/lpq.c:137
#, c-format
msgid "%s: Error - unknown destination \"%s/%s\"."
msgstr ""
-#: berkeley/lpr.c:283 berkeley/lprm.c:139 systemv/cancel.c:156
-#: systemv/cupsaccept.c:164 systemv/lp.c:512 systemv/lpstat.c:512
+#: berkeley/lpr.c:279 berkeley/lprm.c:139 systemv/cancel.c:163
+#: systemv/cupsaccept.c:164 systemv/lp.c:506 systemv/lpstat.c:456
#, c-format
msgid "%s: Error - unknown option \"%c\"."
msgstr ""
-#: systemv/cupsaccept.c:157 systemv/lp.c:503
+#: systemv/cupsaccept.c:157 systemv/lp.c:497
#, c-format
msgid "%s: Error - unknown option \"%s\"."
msgstr ""
-#: systemv/lp.c:217
+#: systemv/lp.c:211
#, c-format
msgid "%s: Expected job ID after \"-i\" option."
msgstr ""
-#: systemv/lpstat.c:570 systemv/lpstat.c:610
+#: systemv/lpstat.c:514 systemv/lpstat.c:554
#, c-format
msgid "%s: Invalid destination name in list \"%s\"."
msgstr ""
-#: scheduler/cupsfilter.c:569
+#: scheduler/cupsfilter.c:579
#, c-format
msgid "%s: Invalid filter string \"%s\"."
msgstr ""
-#: systemv/lp.c:427
+#: test/ipptool.c:312
+#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#: test/ippfind.c:749 test/ipptool.c:349
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr ""
+
+#: test/ippfind.c:762 test/ipptool.c:363
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr ""
+
+#: systemv/lp.c:421
#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
msgstr ""
-#: scheduler/cupsfilter.c:460
+#: scheduler/cupsfilter.c:451
#, c-format
msgid "%s: No filter to convert from %s/%s to %s/%s."
msgstr ""
@@ -1604,243 +2105,273 @@ msgstr ""
msgid "%s: Operation failed: %s"
msgstr ""
-#: berkeley/lpq.c:94 berkeley/lpr.c:71 berkeley/lprm.c:67 systemv/cancel.c:81
-#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:102
-#: systemv/lpadmin.c:239 systemv/lpinfo.c:88 systemv/lpmove.c:73
-#: systemv/lpstat.c:102 test/ipptool.c:307 test/ipptool.c:324
+#: berkeley/lpq.c:83 berkeley/lpr.c:67 berkeley/lprm.c:67 systemv/cancel.c:82
+#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:96
+#: systemv/lpadmin.c:230 systemv/lpinfo.c:88 systemv/lpmove.c:73
+#: systemv/lpstat.c:88 test/ipptool.c:294 test/ipptool.c:338
#, c-format
msgid "%s: Sorry, no encryption support."
msgstr ""
-#: berkeley/lpq.c:296 scheduler/cupsfilter.c:1224 systemv/cancel.c:237
+#: systemv/lpadmin.c:1223
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#: berkeley/lpq.c:284 scheduler/cupsfilter.c:1275 systemv/cancel.c:245
#: systemv/cupsaddsmb.c:144 systemv/cupsaddsmb.c:171
#, c-format
msgid "%s: Unable to connect to server."
msgstr ""
-#: systemv/cancel.c:317
+#: systemv/cancel.c:328
#, c-format
msgid "%s: Unable to contact server."
msgstr ""
-#: scheduler/cupsfilter.c:425
+#: systemv/lpadmin.c:1236
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#: scheduler/cupsfilter.c:416
#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
msgstr ""
-#: ppdc/ppdmerge.cxx:96
+#: test/ipptool.c:321
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
+#: ppdc/ppdmerge.cxx:90
#, c-format
msgid "%s: Unable to open %s: %s"
msgstr ""
-#: scheduler/cupsfilter.c:664 ppdc/ppdmerge.cxx:112
+#: scheduler/cupsfilter.c:674 ppdc/ppdmerge.cxx:106
#, c-format
msgid "%s: Unable to open PPD file: %s on line %d."
msgstr ""
-#: scheduler/cupsfilter.c:392
+#: scheduler/cupsfilter.c:383
#, c-format
msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
msgstr ""
-#: berkeley/lpq.c:151 systemv/lpstat.c:631
+#: systemv/lpadmin.c:1207
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#: berkeley/lpq.c:140 systemv/lpstat.c:575
#, c-format
msgid "%s: Unknown destination \"%s\"."
msgstr ""
-#: scheduler/cupsfilter.c:437
+#: scheduler/cupsfilter.c:428
#, c-format
msgid "%s: Unknown destination MIME type %s/%s."
msgstr ""
-#: scheduler/cupsfilter.c:1429
+#: scheduler/cupsfilter.c:1479
#, c-format
msgid "%s: Unknown option \"%c\"."
msgstr ""
-#: scheduler/cupsfilter.c:417
+#: test/ippfind.c:648
+#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr ""
+
+#: test/ippfind.c:928
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr ""
+
+#: scheduler/cupsfilter.c:408
#, c-format
msgid "%s: Unknown source MIME type %s/%s."
msgstr ""
-#: berkeley/lpr.c:140
+#: berkeley/lpr.c:136
#, c-format
msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct."
msgstr ""
-#: systemv/lp.c:477
+#: systemv/lp.c:471
#, c-format
msgid "%s: Warning - character set option ignored."
msgstr ""
-#: systemv/lp.c:496
+#: systemv/lp.c:490
#, c-format
msgid "%s: Warning - content type option ignored."
msgstr ""
-#: systemv/lp.c:184
+#: systemv/lp.c:178
#, c-format
msgid "%s: Warning - form option ignored."
msgstr ""
-#: systemv/lp.c:387
+#: systemv/lp.c:381
#, c-format
msgid "%s: Warning - mode option ignored."
msgstr ""
-#: ppdc/sample.c:310
+#: ppdc/sample.c:305
msgid "-1"
msgstr ""
-#: ppdc/sample.c:301
+#: ppdc/sample.c:296
msgid "-10"
msgstr ""
-#: ppdc/sample.c:393
+#: ppdc/sample.c:388
msgid "-100"
msgstr ""
-#: ppdc/sample.c:392
+#: ppdc/sample.c:387
msgid "-105"
msgstr ""
-#: ppdc/sample.c:300
+#: ppdc/sample.c:295
msgid "-11"
msgstr ""
-#: ppdc/sample.c:391
+#: ppdc/sample.c:386
msgid "-110"
msgstr ""
-#: ppdc/sample.c:390
+#: ppdc/sample.c:385
msgid "-115"
msgstr ""
-#: ppdc/sample.c:299
+#: ppdc/sample.c:294
msgid "-12"
msgstr ""
-#: ppdc/sample.c:389
+#: ppdc/sample.c:384
msgid "-120"
msgstr ""
-#: ppdc/sample.c:298
+#: ppdc/sample.c:293
msgid "-13"
msgstr ""
-#: ppdc/sample.c:297
+#: ppdc/sample.c:292
msgid "-14"
msgstr ""
-#: ppdc/sample.c:296
+#: ppdc/sample.c:291
msgid "-15"
msgstr ""
-#: ppdc/sample.c:309
+#: ppdc/sample.c:304
msgid "-2"
msgstr ""
-#: ppdc/sample.c:409
+#: ppdc/sample.c:404
msgid "-20"
msgstr ""
-#: ppdc/sample.c:408
+#: ppdc/sample.c:403
msgid "-25"
msgstr ""
-#: ppdc/sample.c:308
+#: ppdc/sample.c:303
msgid "-3"
msgstr ""
-#: ppdc/sample.c:407
+#: ppdc/sample.c:402
msgid "-30"
msgstr ""
-#: ppdc/sample.c:406
+#: ppdc/sample.c:401
msgid "-35"
msgstr ""
-#: ppdc/sample.c:307
+#: ppdc/sample.c:302
msgid "-4"
msgstr ""
-#: ppdc/sample.c:405
+#: ppdc/sample.c:400
msgid "-40"
msgstr ""
-#: ppdc/sample.c:404
+#: ppdc/sample.c:399
msgid "-45"
msgstr ""
-#: ppdc/sample.c:306
+#: ppdc/sample.c:301
msgid "-5"
msgstr ""
-#: ppdc/sample.c:403
+#: ppdc/sample.c:398
msgid "-50"
msgstr ""
-#: ppdc/sample.c:402
+#: ppdc/sample.c:397
msgid "-55"
msgstr ""
-#: ppdc/sample.c:305
+#: ppdc/sample.c:300
msgid "-6"
msgstr ""
-#: ppdc/sample.c:401
+#: ppdc/sample.c:396
msgid "-60"
msgstr ""
-#: ppdc/sample.c:400
+#: ppdc/sample.c:395
msgid "-65"
msgstr ""
-#: ppdc/sample.c:304
+#: ppdc/sample.c:299
msgid "-7"
msgstr ""
-#: ppdc/sample.c:399
+#: ppdc/sample.c:394
msgid "-70"
msgstr ""
-#: ppdc/sample.c:398
+#: ppdc/sample.c:393
msgid "-75"
msgstr ""
-#: ppdc/sample.c:303
+#: ppdc/sample.c:298
msgid "-8"
msgstr ""
-#: ppdc/sample.c:397
+#: ppdc/sample.c:392
msgid "-80"
msgstr ""
-#: ppdc/sample.c:396
+#: ppdc/sample.c:391
msgid "-85"
msgstr ""
-#: ppdc/sample.c:302
+#: ppdc/sample.c:297
msgid "-9"
msgstr ""
-#: ppdc/sample.c:395
+#: ppdc/sample.c:390
msgid "-90"
msgstr ""
-#: ppdc/sample.c:394
+#: ppdc/sample.c:389
msgid "-95"
msgstr ""
-#: ppdc/sample.c:311
+#: ppdc/sample.c:306
msgid "0"
msgstr ""
-#: ppdc/sample.c:312
+#: ppdc/sample.c:307
msgid "1"
msgstr ""
-#: ppdc/sample.c:384
+#: ppdc/sample.c:379
msgid "1 inch/sec."
msgstr ""
@@ -1852,7 +2383,7 @@ msgstr ""
msgid "1.25x2.25\""
msgstr ""
-#: ppdc/sample.c:432
+#: ppdc/sample.c:427
msgid "1.5 inch/sec."
msgstr ""
@@ -1872,11 +2403,11 @@ msgstr ""
msgid "1.50x2.00\""
msgstr ""
-#: ppdc/sample.c:321
+#: ppdc/sample.c:316
msgid "10"
msgstr ""
-#: ppdc/sample.c:443
+#: ppdc/sample.c:438
msgid "10 inches/sec."
msgstr ""
@@ -1892,39 +2423,39 @@ msgstr ""
msgid "10 x 14"
msgstr ""
-#: ppdc/sample.c:423
+#: ppdc/sample.c:418
msgid "100"
msgstr ""
-#: ppdc/sample.c:334
+#: ppdc/sample.c:329
msgid "100 mm/sec."
msgstr ""
-#: ppdc/sample.c:424
+#: ppdc/sample.c:419
msgid "105"
msgstr ""
-#: ppdc/sample.c:322
+#: ppdc/sample.c:317
msgid "11"
msgstr ""
-#: ppdc/sample.c:444
+#: ppdc/sample.c:439
msgid "11 inches/sec."
msgstr ""
-#: ppdc/sample.c:425
+#: ppdc/sample.c:420
msgid "110"
msgstr ""
-#: ppdc/sample.c:426
+#: ppdc/sample.c:421
msgid "115"
msgstr ""
-#: ppdc/sample.c:323
+#: ppdc/sample.c:318
msgid "12"
msgstr ""
-#: ppdc/sample.c:445
+#: ppdc/sample.c:440
msgid "12 inches/sec."
msgstr ""
@@ -1932,11 +2463,11 @@ msgstr ""
msgid "12 x 11"
msgstr ""
-#: ppdc/sample.c:427
+#: ppdc/sample.c:422
msgid "120"
msgstr ""
-#: ppdc/sample.c:335
+#: ppdc/sample.c:330
msgid "120 mm/sec."
msgstr ""
@@ -1948,7 +2479,7 @@ msgstr ""
msgid "120x72dpi"
msgstr ""
-#: ppdc/sample.c:324
+#: ppdc/sample.c:319
msgid "13"
msgstr ""
@@ -1956,15 +2487,15 @@ msgstr ""
msgid "136dpi"
msgstr ""
-#: ppdc/sample.c:325
+#: ppdc/sample.c:320
msgid "14"
msgstr ""
-#: ppdc/sample.c:326
+#: ppdc/sample.c:321
msgid "15"
msgstr ""
-#: ppdc/sample.c:328
+#: ppdc/sample.c:323
msgid "15 mm/sec."
msgstr ""
@@ -1972,23 +2503,23 @@ msgstr ""
msgid "15 x 11"
msgstr ""
-#: ppdc/sample.c:336
+#: ppdc/sample.c:331
msgid "150 mm/sec."
msgstr ""
-#: ppdc/sample.c:283
+#: ppdc/sample.c:278
msgid "150dpi"
msgstr ""
-#: ppdc/sample.c:368
+#: ppdc/sample.c:363
msgid "16"
msgstr ""
-#: ppdc/sample.c:369
+#: ppdc/sample.c:364
msgid "17"
msgstr ""
-#: ppdc/sample.c:370
+#: ppdc/sample.c:365
msgid "18"
msgstr ""
@@ -1996,19 +2527,19 @@ msgstr ""
msgid "180dpi"
msgstr ""
-#: ppdc/sample.c:371
+#: ppdc/sample.c:366
msgid "19"
msgstr ""
-#: ppdc/sample.c:313
+#: ppdc/sample.c:308
msgid "2"
msgstr ""
-#: ppdc/sample.c:385
+#: ppdc/sample.c:380
msgid "2 inches/sec."
msgstr ""
-#: ppdc/sample.c:270
+#: ppdc/sample.c:262
msgid "2-Sided Printing"
msgstr ""
@@ -2064,7 +2595,7 @@ msgstr ""
msgid "2.38x5.50\""
msgstr ""
-#: ppdc/sample.c:433
+#: ppdc/sample.c:428
msgid "2.5 inches/sec."
msgstr ""
@@ -2084,15 +2615,15 @@ msgstr ""
msgid "2.9 x 1\""
msgstr ""
-#: ppdc/sample.c:372
+#: ppdc/sample.c:367
msgid "20"
msgstr ""
-#: ppdc/sample.c:329
+#: ppdc/sample.c:324
msgid "20 mm/sec."
msgstr ""
-#: ppdc/sample.c:337
+#: ppdc/sample.c:332
msgid "200 mm/sec."
msgstr ""
@@ -2100,19 +2631,19 @@ msgstr ""
msgid "203dpi"
msgstr ""
-#: ppdc/sample.c:373
+#: ppdc/sample.c:368
msgid "21"
msgstr ""
-#: ppdc/sample.c:374
+#: ppdc/sample.c:369
msgid "22"
msgstr ""
-#: ppdc/sample.c:375
+#: ppdc/sample.c:370
msgid "23"
msgstr ""
-#: ppdc/sample.c:376
+#: ppdc/sample.c:371
msgid "24"
msgstr ""
@@ -2124,35 +2655,35 @@ msgstr ""
msgid "240x72dpi"
msgstr ""
-#: ppdc/sample.c:377
+#: ppdc/sample.c:372
msgid "25"
msgstr ""
-#: ppdc/sample.c:338
+#: ppdc/sample.c:333
msgid "250 mm/sec."
msgstr ""
-#: ppdc/sample.c:378
+#: ppdc/sample.c:373
msgid "26"
msgstr ""
-#: ppdc/sample.c:379
+#: ppdc/sample.c:374
msgid "27"
msgstr ""
-#: ppdc/sample.c:380
+#: ppdc/sample.c:375
msgid "28"
msgstr ""
-#: ppdc/sample.c:381
+#: ppdc/sample.c:376
msgid "29"
msgstr ""
-#: ppdc/sample.c:314
+#: ppdc/sample.c:309
msgid "3"
msgstr ""
-#: ppdc/sample.c:386
+#: ppdc/sample.c:381
msgid "3 inches/sec."
msgstr ""
@@ -2212,15 +2743,15 @@ msgstr ""
msgid "3.50x1.00\""
msgstr ""
-#: ppdc/sample.c:382
+#: ppdc/sample.c:377
msgid "30"
msgstr ""
-#: ppdc/sample.c:330
+#: ppdc/sample.c:325
msgid "30 mm/sec."
msgstr ""
-#: ppdc/sample.c:339
+#: ppdc/sample.c:334
msgid "300 mm/sec."
msgstr ""
@@ -2228,7 +2759,7 @@ msgstr ""
msgid "300dpi"
msgstr ""
-#: ppdc/sample.c:410
+#: ppdc/sample.c:405
msgid "35"
msgstr ""
@@ -2240,11 +2771,11 @@ msgstr ""
msgid "360x180dpi"
msgstr ""
-#: ppdc/sample.c:315
+#: ppdc/sample.c:310
msgid "4"
msgstr ""
-#: ppdc/sample.c:387
+#: ppdc/sample.c:382
msgid "4 inches/sec."
msgstr ""
@@ -2284,23 +2815,23 @@ msgstr ""
msgid "4.00x6.50\""
msgstr ""
-#: ppdc/sample.c:411
+#: ppdc/sample.c:406
msgid "40"
msgstr ""
-#: ppdc/sample.c:331
+#: ppdc/sample.c:326
msgid "40 mm/sec."
msgstr ""
-#: ppdc/sample.c:412
+#: ppdc/sample.c:407
msgid "45"
msgstr ""
-#: ppdc/sample.c:316
+#: ppdc/sample.c:311
msgid "5"
msgstr ""
-#: ppdc/sample.c:437
+#: ppdc/sample.c:432
msgid "5 inches/sec."
msgstr ""
@@ -2308,19 +2839,19 @@ msgstr ""
msgid "5 x 7"
msgstr ""
-#: ppdc/sample.c:413
+#: ppdc/sample.c:408
msgid "50"
msgstr ""
-#: ppdc/sample.c:414
+#: ppdc/sample.c:409
msgid "55"
msgstr ""
-#: ppdc/sample.c:317
+#: ppdc/sample.c:312
msgid "6"
msgstr ""
-#: ppdc/sample.c:438
+#: ppdc/sample.c:433
msgid "6 inches/sec."
msgstr ""
@@ -2352,15 +2883,15 @@ msgstr ""
msgid "6.00x6.50\""
msgstr ""
-#: ppdc/sample.c:415
+#: ppdc/sample.c:410
msgid "60"
msgstr ""
-#: ppdc/sample.c:332
+#: ppdc/sample.c:327
msgid "60 mm/sec."
msgstr ""
-#: ppdc/sample.c:261
+#: ppdc/sample.c:253
msgid "600dpi"
msgstr ""
@@ -2372,15 +2903,15 @@ msgstr ""
msgid "60x72dpi"
msgstr ""
-#: ppdc/sample.c:416
+#: ppdc/sample.c:411
msgid "65"
msgstr ""
-#: ppdc/sample.c:318
+#: ppdc/sample.c:313
msgid "7"
msgstr ""
-#: ppdc/sample.c:440
+#: ppdc/sample.c:435
msgid "7 inches/sec."
msgstr ""
@@ -2388,23 +2919,19 @@ msgstr ""
msgid "7 x 9"
msgstr ""
-#: ppdc/sample.c:417
+#: ppdc/sample.c:412
msgid "70"
msgstr ""
-#: ppdc/sample.c:252
-msgid "720dpi"
-msgstr ""
-
-#: ppdc/sample.c:418
+#: ppdc/sample.c:413
msgid "75"
msgstr ""
-#: ppdc/sample.c:319
+#: ppdc/sample.c:314
msgid "8"
msgstr ""
-#: ppdc/sample.c:441
+#: ppdc/sample.c:436
msgid "8 inches/sec."
msgstr ""
@@ -2440,23 +2967,23 @@ msgstr ""
msgid "8.00x6.50\""
msgstr ""
-#: ppdc/sample.c:419
+#: ppdc/sample.c:414
msgid "80"
msgstr ""
-#: ppdc/sample.c:333
+#: ppdc/sample.c:328
msgid "80 mm/sec."
msgstr ""
-#: ppdc/sample.c:420
+#: ppdc/sample.c:415
msgid "85"
msgstr ""
-#: ppdc/sample.c:320
+#: ppdc/sample.c:315
msgid "9"
msgstr ""
-#: ppdc/sample.c:442
+#: ppdc/sample.c:437
msgid "9 inches/sec."
msgstr ""
@@ -2472,32 +2999,32 @@ msgstr ""
msgid "9-Pin Series"
msgstr ""
-#: ppdc/sample.c:421
+#: ppdc/sample.c:416
msgid "90"
msgstr ""
-#: ppdc/sample.c:422
+#: ppdc/sample.c:417
msgid "95"
msgstr ""
-#: berkeley/lpc.c:213
+#: berkeley/lpc.c:205
msgid "?Invalid help command unknown."
msgstr ""
-#: cgi-bin/admin.c:2368
+#: cgi-bin/admin.c:2354
msgid "A Samba password is required to export printer drivers"
msgstr ""
-#: cgi-bin/admin.c:2364
+#: cgi-bin/admin.c:2350
msgid "A Samba username is required to export printer drivers"
msgstr ""
-#: scheduler/ipp.c:2381
+#: scheduler/ipp.c:2252
#, c-format
msgid "A class named \"%s\" already exists."
msgstr ""
-#: scheduler/ipp.c:1004
+#: scheduler/ipp.c:915
#, c-format
msgid "A printer named \"%s\" already exists."
msgstr ""
@@ -2638,24 +3165,24 @@ msgstr ""
msgid "ARCH E Long Edge"
msgstr ""
-#: cgi-bin/classes.c:169 cgi-bin/printers.c:172
+#: cgi-bin/classes.c:161 cgi-bin/printers.c:164
msgid "Accept Jobs"
msgstr ""
-#: cups/http-support.c:1345
+#: cups/http-support.c:1347
msgid "Accepted"
msgstr ""
-#: cgi-bin/admin.c:570
+#: cgi-bin/admin.c:546
msgid "Add Class"
msgstr ""
-#: cgi-bin/admin.c:882
+#: cgi-bin/admin.c:859
msgid "Add Printer"
msgstr ""
-#: cgi-bin/admin.c:444 cgi-bin/admin.c:477 cgi-bin/admin.c:525
-#: cgi-bin/admin.c:535
+#: cgi-bin/admin.c:420 cgi-bin/admin.c:453 cgi-bin/admin.c:501
+#: cgi-bin/admin.c:511
msgid "Add RSS Subscription"
msgstr ""
@@ -2663,28 +3190,28 @@ msgstr ""
msgid "Address"
msgstr ""
-#: cgi-bin/admin.c:210 cgi-bin/admin.c:284 cgi-bin/admin.c:2745
+#: cgi-bin/admin.c:186 cgi-bin/admin.c:260 cgi-bin/admin.c:2731
msgid "Administration"
msgstr ""
-#: ppdc/sample.c:429
+#: ppdc/sample.c:424
msgid "Always"
msgstr ""
-#: backend/socket.c:130
+#: backend/socket.c:121
msgid "AppSocket/HP JetDirect"
msgstr ""
-#: ppdc/sample.c:450
+#: ppdc/sample.c:445
msgid "Applicator"
msgstr ""
-#: scheduler/ipp.c:1079
+#: scheduler/ipp.c:998
#, c-format
msgid "Attempt to set %s printer-state to bad value %d."
msgstr ""
-#: scheduler/ipp.c:325
+#: scheduler/ipp.c:239
#, c-format
msgid "Attribute groups are out of order (%x < %x)."
msgstr ""
@@ -2737,306 +3264,335 @@ msgstr ""
msgid "B9"
msgstr ""
-#: scheduler/ipp.c:11091
+#: scheduler/ipp.c:10931
#, c-format
msgid "Bad 'document-format' value \"%s\"."
msgstr ""
-#: cups/dest.c:1679
+#: cups/dest.c:1737
msgid "Bad NULL dests pointer"
msgstr ""
-#: cups/ppd.c:345
+#: cups/ppd.c:303
msgid "Bad OpenGroup"
msgstr ""
-#: cups/ppd.c:347
+#: cups/ppd.c:305
msgid "Bad OpenUI/JCLOpenUI"
msgstr ""
-#: cups/ppd.c:349
+#: cups/ppd.c:307
msgid "Bad OrderDependency"
msgstr ""
-#: cups/ppd-cache.c:149 cups/ppd-cache.c:196 cups/ppd-cache.c:234
-#: cups/ppd-cache.c:240 cups/ppd-cache.c:256 cups/ppd-cache.c:272
-#: cups/ppd-cache.c:281 cups/ppd-cache.c:289 cups/ppd-cache.c:306
-#: cups/ppd-cache.c:314 cups/ppd-cache.c:329 cups/ppd-cache.c:337
-#: cups/ppd-cache.c:358 cups/ppd-cache.c:370 cups/ppd-cache.c:385
-#: cups/ppd-cache.c:397 cups/ppd-cache.c:419 cups/ppd-cache.c:427
-#: cups/ppd-cache.c:445 cups/ppd-cache.c:453 cups/ppd-cache.c:468
-#: cups/ppd-cache.c:476 cups/ppd-cache.c:494 cups/ppd-cache.c:502
-#: cups/ppd-cache.c:529 cups/ppd-cache.c:575 cups/ppd-cache.c:583
-#: cups/ppd-cache.c:591
+#: cups/ppd-cache.c:434 cups/ppd-cache.c:481 cups/ppd-cache.c:566
+#: cups/ppd-cache.c:572 cups/ppd-cache.c:588 cups/ppd-cache.c:604
+#: cups/ppd-cache.c:613 cups/ppd-cache.c:621 cups/ppd-cache.c:638
+#: cups/ppd-cache.c:646 cups/ppd-cache.c:661 cups/ppd-cache.c:669
+#: cups/ppd-cache.c:690 cups/ppd-cache.c:702 cups/ppd-cache.c:717
+#: cups/ppd-cache.c:729 cups/ppd-cache.c:751 cups/ppd-cache.c:759
+#: cups/ppd-cache.c:777 cups/ppd-cache.c:785 cups/ppd-cache.c:800
+#: cups/ppd-cache.c:808 cups/ppd-cache.c:826 cups/ppd-cache.c:834
+#: cups/ppd-cache.c:861 cups/ppd-cache.c:931 cups/ppd-cache.c:939
+#: cups/ppd-cache.c:947
msgid "Bad PPD cache file."
msgstr ""
-#: cups/http-support.c:1360
+#: cups/http-support.c:1362
msgid "Bad Request"
msgstr ""
-#: cups/snmp.c:1002
+#: cups/snmp.c:954
msgid "Bad SNMP version number"
msgstr ""
-#: cups/ppd.c:350
+#: cups/ppd.c:308
msgid "Bad UIConstraints"
msgstr ""
-#: scheduler/ipp.c:1416
+#: cups/http-support.c:1456
+msgid "Bad arguments to function"
+msgstr ""
+
+#: scheduler/ipp.c:1368
#, c-format
msgid "Bad copies value %d."
msgstr ""
-#: cups/ppd.c:358
+#: cups/ppd.c:316
msgid "Bad custom parameter"
msgstr ""
-#: cups/http-support.c:1512 scheduler/ipp.c:2467
+#: cups/http-support.c:1598 scheduler/ipp.c:2347
#, c-format
msgid "Bad device-uri \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2506
+#: scheduler/ipp.c:2386
#, c-format
msgid "Bad device-uri scheme \"%s\"."
msgstr ""
-#: scheduler/ipp.c:8339 scheduler/ipp.c:8355 scheduler/ipp.c:9575
+#: scheduler/ipp.c:8143 scheduler/ipp.c:8161 scheduler/ipp.c:9387
#, c-format
msgid "Bad document-format \"%s\"."
msgstr ""
-#: scheduler/ipp.c:9591
+#: scheduler/ipp.c:9405
#, c-format
msgid "Bad document-format-default \"%s\"."
msgstr ""
-#: cups/util.c:929
+#: cups/util.c:823
msgid "Bad filename buffer"
msgstr ""
-#: scheduler/ipp.c:1631
-msgid "Bad job-name value: Bad UTF-8 sequence."
+#: cups/http-support.c:1465
+msgid "Bad hostname/address in URI"
msgstr ""
-#: scheduler/ipp.c:1634
-msgid "Bad job-name value: Name too long."
+#: scheduler/ipp.c:1543
+#, c-format
+msgid "Bad job-name value: %s"
msgstr ""
-#: scheduler/ipp.c:1585
+#: scheduler/ipp.c:1536
msgid "Bad job-name value: Wrong type or count."
msgstr ""
-#: scheduler/ipp.c:10181
+#: scheduler/ipp.c:10001
msgid "Bad job-priority value."
msgstr ""
-#: scheduler/ipp.c:1446
+#: scheduler/ipp.c:1398
#, c-format
msgid "Bad job-sheets value \"%s\"."
msgstr ""
-#: scheduler/ipp.c:1430
+#: scheduler/ipp.c:1382
msgid "Bad job-sheets value type."
msgstr ""
-#: scheduler/ipp.c:10211
+#: scheduler/ipp.c:10031
msgid "Bad job-state value."
msgstr ""
-#: scheduler/ipp.c:3089 scheduler/ipp.c:3541 scheduler/ipp.c:6193
-#: scheduler/ipp.c:6340 scheduler/ipp.c:7773 scheduler/ipp.c:8042
-#: scheduler/ipp.c:8890 scheduler/ipp.c:9116 scheduler/ipp.c:9471
-#: scheduler/ipp.c:10074
+#: scheduler/ipp.c:2970 scheduler/ipp.c:3432 scheduler/ipp.c:5937
+#: scheduler/ipp.c:6084 scheduler/ipp.c:7572 scheduler/ipp.c:7841
+#: scheduler/ipp.c:8705 scheduler/ipp.c:8929 scheduler/ipp.c:9281
+#: scheduler/ipp.c:9894
#, c-format
msgid "Bad job-uri \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2147 scheduler/ipp.c:5737
+#: scheduler/ipp.c:2018 scheduler/ipp.c:5475
#, c-format
msgid "Bad notify-pull-method \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2111 scheduler/ipp.c:5701
+#: scheduler/ipp.c:1982 scheduler/ipp.c:5439
#, c-format
msgid "Bad notify-recipient-uri \"%s\"."
msgstr ""
-#: scheduler/ipp.c:1462
+#: scheduler/ipp.c:1414
#, c-format
msgid "Bad number-up value %d."
msgstr ""
-#: cups/adminutil.c:292
+#: cups/adminutil.c:281
#, c-format
msgid "Bad option + choice on line %d."
msgstr ""
-#: scheduler/ipp.c:1479
+#: scheduler/ipp.c:1431
#, c-format
msgid "Bad page-ranges values %d-%d."
msgstr ""
-#: scheduler/ipp.c:2549
-#, c-format
-msgid "Bad port-monitor \"%s\"."
+#: cups/http-support.c:1462
+msgid "Bad port number in URI"
msgstr ""
-#: cups/dest.c:676 cups/dest.c:1333
-msgid "Bad printer URI."
+#: scheduler/ipp.c:2429
+#, c-format
+msgid "Bad port-monitor \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2610
+#: scheduler/ipp.c:2490
#, c-format
msgid "Bad printer-state value %d."
msgstr ""
-#: scheduler/ipp.c:293
+#: cups/dest.c:610 cups/dest.c:1297 cups/dest.c:1344
+msgid "Bad printer-uri."
+msgstr ""
+
+#: scheduler/ipp.c:207
#, c-format
msgid "Bad request ID %d."
msgstr ""
-#: scheduler/ipp.c:278
+#: scheduler/ipp.c:192
#, c-format
msgid "Bad request version number %d.%d."
msgstr ""
-#: cgi-bin/admin.c:1484
+#: cups/http-support.c:1459
+msgid "Bad resource in URI"
+msgstr ""
+
+#: cups/http-support.c:1471
+msgid "Bad scheme in URI"
+msgstr ""
+
+#: cgi-bin/admin.c:1470
msgid "Bad subscription ID"
msgstr ""
-#: cups/ppd.c:360
+#: cups/http-support.c:1468
+msgid "Bad username in URI"
+msgstr ""
+
+#: cups/ppd.c:318
msgid "Bad value string"
msgstr ""
-#: cgi-bin/admin.c:3290 cgi-bin/admin.c:3536
+#: cups/http-support.c:1474
+msgid "Bad/empty URI"
+msgstr ""
+
+#: cgi-bin/admin.c:3276 cgi-bin/admin.c:3522
msgid "Banners"
msgstr ""
-#: ppdc/sample.c:287
+#: ppdc/sample.c:282
msgid "Bond Paper"
msgstr ""
-#: backend/usb-darwin.c:1846
+#: backend/usb-darwin.c:2024
#, c-format
msgid "Boolean expected for waiteof option \"%s\"."
msgstr ""
-#: filter/pstops.c:2057
+#: filter/pstops.c:2034
msgid "Buffer overflow detected, aborting."
msgstr ""
-#: ppdc/sample.c:254
+#: ppdc/sample.c:277
msgid "CMYK"
msgstr ""
-#: ppdc/sample.c:363
+#: ppdc/sample.c:358
msgid "CPCL Label Printer"
msgstr ""
-#: cgi-bin/admin.c:1485 cgi-bin/admin.c:1524 cgi-bin/admin.c:1534
+#: cgi-bin/classes.c:165 cgi-bin/printers.c:168
+msgid "Cancel Jobs"
+msgstr ""
+
+#: cgi-bin/admin.c:1471 cgi-bin/admin.c:1510 cgi-bin/admin.c:1520
msgid "Cancel RSS Subscription"
msgstr ""
-#: backend/ipp.c:2027
+#: backend/ipp.c:2206
msgid "Canceling print job."
msgstr ""
-#: scheduler/ipp.c:2590
+#: scheduler/ipp.c:2470
msgid "Cannot share a remote Kerberized printer."
msgstr ""
-#: ppdc/sample.c:279
+#: ppdc/sample.c:271
msgid "Cassette"
msgstr ""
-#: cgi-bin/admin.c:1655 cgi-bin/admin.c:1797 cgi-bin/admin.c:1810
-#: cgi-bin/admin.c:1821
+#: cgi-bin/admin.c:1641 cgi-bin/admin.c:1783 cgi-bin/admin.c:1796
+#: cgi-bin/admin.c:1807
msgid "Change Settings"
msgstr ""
-#: scheduler/ipp.c:2159 scheduler/ipp.c:5749
+#: scheduler/ipp.c:2030 scheduler/ipp.c:5487
#, c-format
msgid "Character set \"%s\" not supported."
msgstr ""
-#: cgi-bin/classes.c:195 cgi-bin/classes.c:322
+#: cgi-bin/classes.c:187 cgi-bin/classes.c:314
msgid "Classes"
msgstr ""
-#: cgi-bin/printers.c:182
+#: cgi-bin/printers.c:174
msgid "Clean Print Heads"
msgstr ""
-#: scheduler/ipp.c:3993
+#: scheduler/ipp.c:3884
msgid "Close-Job doesn't support the job-uri attribute."
msgstr ""
-#: ppdc/sample.c:282
+#: ppdc/sample.c:276
msgid "Color"
msgstr ""
-#: ppdc/sample.c:253
+#: ppdc/sample.c:274
msgid "Color Mode"
msgstr ""
-#: berkeley/lpc.c:204
+#: berkeley/lpc.c:196
msgid ""
"Commands may be abbreviated. Commands are:\n"
"\n"
"exit help quit status ?"
msgstr ""
-#: cups/snmp.c:1006
+#: cups/snmp.c:958
msgid "Community name uses indefinite length"
msgstr ""
-#: backend/ipp.c:802 backend/lpd.c:888 backend/socket.c:409
+#: backend/ipp.c:858 backend/lpd.c:879 backend/socket.c:400
msgid "Connected to printer."
msgstr ""
-#: backend/ipp.c:707 backend/lpd.c:711 backend/socket.c:328
+#: backend/ipp.c:763 backend/lpd.c:702 backend/socket.c:319
msgid "Connecting to printer."
msgstr ""
-#: cups/http-support.c:1333
+#: cups/http-support.c:1335
msgid "Continue"
msgstr ""
-#: ppdc/sample.c:365
+#: ppdc/sample.c:360
msgid "Continuous"
msgstr ""
-#: backend/lpd.c:1037 backend/lpd.c:1169
+#: backend/lpd.c:1028 backend/lpd.c:1160
msgid "Control file sent successfully."
msgstr ""
-#: backend/ipp.c:1261 backend/lpd.c:481
+#: backend/ipp.c:1358 backend/lpd.c:472
msgid "Copying print data."
msgstr ""
-#: cups/http-support.c:1342
+#: cups/http-support.c:1344
msgid "Created"
msgstr ""
-#: cups/ppd.c:1113 cups/ppd.c:1153 cups/ppd.c:1398 cups/ppd.c:1501
+#: cups/ppd.c:1069 cups/ppd.c:1109 cups/ppd.c:1354 cups/ppd.c:1457
msgid "Custom"
msgstr ""
-#: ppdc/sample.c:359
+#: ppdc/sample.c:354
msgid "CustominCutInterval"
msgstr ""
-#: ppdc/sample.c:357
+#: ppdc/sample.c:352
msgid "CustominTearInterval"
msgstr ""
-#: ppdc/sample.c:343
+#: ppdc/sample.c:338
msgid "Cut"
msgstr ""
-#: ppdc/sample.c:451
+#: ppdc/sample.c:446
msgid "Cutter"
msgstr ""
@@ -3048,23 +3604,23 @@ msgstr ""
msgid "Darkness"
msgstr ""
-#: backend/lpd.c:1122
+#: backend/lpd.c:1113
msgid "Data file sent successfully."
msgstr ""
-#: cgi-bin/admin.c:2094 cgi-bin/admin.c:2105 cgi-bin/admin.c:2150
+#: cgi-bin/admin.c:2080 cgi-bin/admin.c:2091 cgi-bin/admin.c:2136
msgid "Delete Class"
msgstr ""
-#: cgi-bin/admin.c:2179 cgi-bin/admin.c:2190 cgi-bin/admin.c:2235
+#: cgi-bin/admin.c:2165 cgi-bin/admin.c:2176 cgi-bin/admin.c:2221
msgid "Delete Printer"
msgstr ""
-#: ppdc/sample.c:281
+#: ppdc/sample.c:273
msgid "DeskJet Series"
msgstr ""
-#: scheduler/ipp.c:1361
+#: scheduler/ipp.c:1297
#, c-format
msgid "Destination \"%s\" is not accepting jobs."
msgstr ""
@@ -3080,45 +3636,45 @@ msgid ""
" location = %s"
msgstr ""
-#: ppdc/sample.c:436
+#: ppdc/sample.c:431
msgid "Direct Thermal Media"
msgstr ""
-#: cups/file.c:296
+#: cups/file.c:258
#, c-format
msgid "Directory \"%s\" contains a relative path."
msgstr ""
-#: cups/file.c:268
+#: cups/file.c:230
#, c-format
msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
msgstr ""
-#: cups/file.c:285
+#: cups/file.c:247
#, c-format
msgid "Directory \"%s\" is a file."
msgstr ""
-#: cups/file.c:256
+#: cups/file.c:218
#, c-format
msgid "Directory \"%s\" not available: %s"
msgstr ""
-#: cups/file.c:241
+#: cups/file.c:203
#, c-format
msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
msgstr ""
-#: ppdc/sample.c:345
+#: ppdc/sample.c:340
msgid "Disabled"
msgstr ""
-#: scheduler/ipp.c:6242
+#: scheduler/ipp.c:5986
#, c-format
msgid "Document #%d does not exist in job #%d."
msgstr ""
-#: ppdc/sample.c:275
+#: ppdc/sample.c:267
msgid "Duplexer"
msgstr ""
@@ -3126,26 +3682,30 @@ msgstr ""
msgid "Dymo"
msgstr ""
-#: ppdc/sample.c:431
+#: ppdc/sample.c:426
msgid "EPL1 Label Printer"
msgstr ""
-#: ppdc/sample.c:434
+#: ppdc/sample.c:429
msgid "EPL2 Label Printer"
msgstr ""
-#: cgi-bin/admin.c:1849 cgi-bin/admin.c:1861 cgi-bin/admin.c:1915
-#: cgi-bin/admin.c:1922 cgi-bin/admin.c:1957 cgi-bin/admin.c:1970
-#: cgi-bin/admin.c:1994 cgi-bin/admin.c:2067
+#: cgi-bin/admin.c:1835 cgi-bin/admin.c:1847 cgi-bin/admin.c:1901
+#: cgi-bin/admin.c:1908 cgi-bin/admin.c:1943 cgi-bin/admin.c:1956
+#: cgi-bin/admin.c:1980 cgi-bin/admin.c:2053
msgid "Edit Configuration File"
msgstr ""
-#: cups/adminutil.c:337
+#: cups/adminutil.c:326
msgid "Empty PPD file."
msgstr ""
+#: cups/http.c:4648
+msgid "Encryption is not supported."
+msgstr ""
+
#. TRANSLATORS: Banner/cover sheet after the print job.
-#: cgi-bin/admin.c:3561
+#: cgi-bin/admin.c:3547
msgid "Ending Banner"
msgstr ""
@@ -3153,19 +3713,7 @@ msgstr ""
msgid "English"
msgstr ""
-#: systemv/lppasswd.c:193
-msgid "Enter old password:"
-msgstr ""
-
-#: systemv/lppasswd.c:224
-msgid "Enter password again:"
-msgstr ""
-
-#: systemv/lppasswd.c:212
-msgid "Enter password:"
-msgstr ""
-
-#: scheduler/client.c:2435
+#: scheduler/client.c:2226
msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
msgstr ""
@@ -3257,7 +3805,7 @@ msgstr ""
msgid "Envelope DL"
msgstr ""
-#: ppdc/sample.c:269
+#: ppdc/sample.c:261
msgid "Envelope Feed"
msgstr ""
@@ -3381,16 +3929,24 @@ msgstr ""
msgid "Envelope You4 Long Edge"
msgstr ""
+#: test/ippfind.c:2817
+msgid "Environment Variables:"
+msgstr ""
+
#: ppdc/sample.c:240
msgid "Epson"
msgstr ""
-#: cgi-bin/admin.c:3604
+#: cgi-bin/admin.c:3590
msgid "Error Policy"
msgstr ""
-#: filter/rastertopwg.c:403 filter/rastertopwg.c:418 filter/rastertopwg.c:429
-#: filter/rastertopwg.c:440
+#: filter/rastertopwg.c:423
+msgid "Error reading raster data."
+msgstr ""
+
+#: filter/rastertopwg.c:395 filter/rastertopwg.c:413 filter/rastertopwg.c:431
+#: filter/rastertopwg.c:442
msgid "Error sending raster data."
msgstr ""
@@ -3398,43 +3954,43 @@ msgstr ""
msgid "Error: need hostname after \"-h\" option."
msgstr ""
-#: ppdc/sample.c:355
+#: ppdc/sample.c:350
msgid "Every 10 Labels"
msgstr ""
-#: ppdc/sample.c:347
+#: ppdc/sample.c:342
msgid "Every 2 Labels"
msgstr ""
-#: ppdc/sample.c:348
+#: ppdc/sample.c:343
msgid "Every 3 Labels"
msgstr ""
-#: ppdc/sample.c:349
+#: ppdc/sample.c:344
msgid "Every 4 Labels"
msgstr ""
-#: ppdc/sample.c:350
+#: ppdc/sample.c:345
msgid "Every 5 Labels"
msgstr ""
-#: ppdc/sample.c:351
+#: ppdc/sample.c:346
msgid "Every 6 Labels"
msgstr ""
-#: ppdc/sample.c:352
+#: ppdc/sample.c:347
msgid "Every 7 Labels"
msgstr ""
-#: ppdc/sample.c:353
+#: ppdc/sample.c:348
msgid "Every 8 Labels"
msgstr ""
-#: ppdc/sample.c:354
+#: ppdc/sample.c:349
msgid "Every 9 Labels"
msgstr ""
-#: ppdc/sample.c:346
+#: ppdc/sample.c:341
msgid "Every Label"
msgstr ""
@@ -3442,14 +3998,18 @@ msgstr ""
msgid "Executive"
msgstr ""
-#: cups/http-support.c:1388
+#: cups/http-support.c:1390
msgid "Expectation Failed"
msgstr ""
-#: cgi-bin/admin.c:2356 cgi-bin/admin.c:2375
+#: cgi-bin/admin.c:2342 cgi-bin/admin.c:2361
msgid "Export Printers to Samba"
msgstr ""
+#: test/ippfind.c:2763
+msgid "Expressions:"
+msgstr ""
+
#: systemv/cupstestdsc.c:172 systemv/cupstestdsc.c:189
#: systemv/cupstestdsc.c:214 systemv/cupstestdsc.c:231
#: systemv/cupstestdsc.c:255 systemv/cupstestdsc.c:273
@@ -3472,27 +4032,27 @@ msgstr ""
msgid "Fanfold US"
msgstr ""
-#: cups/file.c:300
+#: cups/file.c:262
#, c-format
msgid "File \"%s\" contains a relative path."
msgstr ""
-#: cups/file.c:275
+#: cups/file.c:237
#, c-format
msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
msgstr ""
-#: cups/file.c:289
+#: cups/file.c:251
#, c-format
msgid "File \"%s\" is a directory."
msgstr ""
-#: cups/file.c:261
+#: cups/file.c:223
#, c-format
msgid "File \"%s\" not available: %s"
msgstr ""
-#: cups/file.c:247
+#: cups/file.c:209
#, c-format
msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
msgstr ""
@@ -3501,13 +4061,13 @@ msgstr ""
msgid "File Folder "
msgstr ""
-#: scheduler/ipp.c:2485
+#: scheduler/ipp.c:2365
#, c-format
msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"."
msgstr ""
-#: filter/rastertoepson.c:1117 filter/rastertohp.c:845
-#: filter/rastertolabel.c:1273
+#: filter/rastertoepson.c:1114 filter/rastertohp.c:834
+#: filter/rastertolabel.c:1259
#, c-format
msgid "Finished page %d."
msgstr ""
@@ -3516,38 +4076,38 @@ msgstr ""
msgid "Folio"
msgstr ""
-#: cups/http-support.c:1367
+#: cups/http-support.c:1369
msgid "Forbidden"
msgstr ""
-#: cups/ppd.c:742 cups/ppd.c:1302
+#: cups/ppd.c:700 cups/ppd.c:1258
msgid "General"
msgstr ""
-#: ppdc/sample.c:259
+#: ppdc/sample.c:251
msgid "Generic"
msgstr ""
-#: cups/snmp.c:1016
+#: cups/snmp.c:968
msgid "Get-Response-PDU uses indefinite length"
msgstr ""
-#: ppdc/sample.c:290
+#: ppdc/sample.c:285
msgid "Glossy Paper"
msgstr ""
-#: scheduler/ipp.c:3067 scheduler/ipp.c:3467 scheduler/ipp.c:4005
-#: scheduler/ipp.c:6171 scheduler/ipp.c:6318 scheduler/ipp.c:7750
-#: scheduler/ipp.c:8868 scheduler/ipp.c:9094 scheduler/ipp.c:9449
-#: scheduler/ipp.c:10052
+#: scheduler/ipp.c:2948 scheduler/ipp.c:3358 scheduler/ipp.c:3896
+#: scheduler/ipp.c:5915 scheduler/ipp.c:6062 scheduler/ipp.c:7549
+#: scheduler/ipp.c:8683 scheduler/ipp.c:8907 scheduler/ipp.c:9259
+#: scheduler/ipp.c:9872
msgid "Got a printer-uri attribute but no job-id."
msgstr ""
-#: ppdc/sample.c:255
+#: ppdc/sample.c:275
msgid "Grayscale"
msgstr ""
-#: ppdc/sample.c:280
+#: ppdc/sample.c:272
msgid "HP"
msgstr ""
@@ -3559,87 +4119,95 @@ msgstr ""
msgid "Help file not in index."
msgstr ""
-#: cups/ipp.c:2689 cups/ipp.c:2716 cups/ipp.c:2739
+#: cups/ipp.c:3183 cups/ipp.c:3210 cups/ipp.c:3233
msgid "IPP 1setOf attribute with incompatible value tags."
msgstr ""
-#: cups/ipp.c:2652
+#: cups/ipp.c:3146
msgid "IPP attribute has no name."
msgstr ""
-#: cups/ipp.c:5521
+#: cups/ipp.c:7016
msgid "IPP attribute is not a member of the message."
msgstr ""
-#: cups/ipp.c:3092
+#: cups/ipp.c:3594
msgid "IPP begCollection value not 0 bytes."
msgstr ""
-#: cups/ipp.c:2882
+#: cups/ipp.c:3376
msgid "IPP boolean value not 1 byte."
msgstr ""
-#: cups/ipp.c:2943
+#: cups/ipp.c:3437
msgid "IPP date value not 11 bytes."
msgstr ""
-#: cups/ipp.c:3113
+#: cups/ipp.c:3615
msgid "IPP endCollection value not 0 bytes."
msgstr ""
-#: cups/ipp.c:2857
+#: cups/ipp.c:3351
msgid "IPP enum value not 4 bytes."
msgstr ""
-#: cups/ipp.c:2581
+#: cups/ipp.c:3075
msgid "IPP extension tag larger than 0x7FFFFFFF."
msgstr ""
-#: cups/ipp.c:2854
+#: cups/ipp.c:3348
msgid "IPP integer value not 4 bytes."
msgstr ""
-#: cups/ipp.c:3054
+#: cups/ipp.c:3547
msgid "IPP language length overflows value."
msgstr ""
-#: cups/ipp.c:2766
+#: cups/ipp.c:3556
+msgid "IPP language length too large."
+msgstr ""
+
+#: cups/ipp.c:3260
msgid "IPP member name is not empty."
msgstr ""
-#: cups/ipp.c:3139
+#: cups/ipp.c:3641
msgid "IPP memberName value is empty."
msgstr ""
-#: cups/ipp.c:3131
+#: cups/ipp.c:3633
msgid "IPP memberName with no attribute."
msgstr ""
-#: cups/ipp.c:2635
+#: cups/ipp.c:3129
msgid "IPP name larger than 32767 bytes."
msgstr ""
-#: cups/ipp.c:3020
+#: cups/ipp.c:3514
msgid "IPP nameWithLanguage value less than minimum 4 bytes."
msgstr ""
-#: cups/ipp.c:2988
+#: cups/ipp.c:3671
+msgid "IPP octetString length too large."
+msgstr ""
+
+#: cups/ipp.c:3482
msgid "IPP rangeOfInteger value not 8 bytes."
msgstr ""
-#: cups/ipp.c:2961
+#: cups/ipp.c:3455
msgid "IPP resolution value not 9 bytes."
msgstr ""
-#: cups/ipp.c:3072
+#: cups/ipp.c:3574
msgid "IPP string length overflows value."
msgstr ""
-#: cups/ipp.c:3016
+#: cups/ipp.c:3510
msgid "IPP textWithLanguage value less than minimum 4 bytes."
msgstr ""
-#: cups/ipp.c:2840
+#: cups/ipp.c:3334
msgid "IPP value larger than 32767 bytes."
msgstr ""
@@ -3647,47 +4215,47 @@ msgstr ""
msgid "ISOLatin1"
msgstr ""
-#: cups/ppd.c:353
+#: cups/ppd.c:311
msgid "Illegal control character"
msgstr ""
-#: cups/ppd.c:354
+#: cups/ppd.c:312
msgid "Illegal main keyword string"
msgstr ""
-#: cups/ppd.c:355
+#: cups/ppd.c:313
msgid "Illegal option keyword string"
msgstr ""
-#: cups/ppd.c:356
+#: cups/ppd.c:314
msgid "Illegal translation string"
msgstr ""
-#: cups/ppd.c:357
+#: cups/ppd.c:315
msgid "Illegal whitespace character"
msgstr ""
-#: ppdc/sample.c:274
+#: ppdc/sample.c:266
msgid "Installable Options"
msgstr ""
-#: ppdc/sample.c:277
+#: ppdc/sample.c:269
msgid "Installed"
msgstr ""
-#: ppdc/sample.c:293
+#: ppdc/sample.c:288
msgid "IntelliBar Label Printer"
msgstr ""
-#: ppdc/sample.c:292
+#: ppdc/sample.c:287
msgid "Intellitech"
msgstr ""
-#: cups/http-support.c:1394
+#: cups/http-support.c:1396
msgid "Internal Server Error"
msgstr ""
-#: cups/ppd.c:344
+#: cups/ppd.c:302
msgid "Internal error"
msgstr ""
@@ -3699,20 +4267,24 @@ msgstr ""
msgid "Internet Postage 3-Part"
msgstr ""
-#: backend/ipp.c:310
+#: backend/ipp.c:323
msgid "Internet Printing Protocol"
msgstr ""
-#: cups/dest-options.c:837
+#: cups/pwg-media.c:293 cups/pwg-media.c:312
+msgid "Invalid media name arguments."
+msgstr ""
+
+#: cups/dest-options.c:1032
msgid "Invalid media size."
msgstr ""
-#: filter/commandtops.c:125
+#: filter/commandtops.c:114
#, c-format
msgid "Invalid printer command \"%s\"."
msgstr ""
-#: cups/ppd.c:1420
+#: cups/ppd.c:1376
msgid "JCL"
msgstr ""
@@ -3772,93 +4344,93 @@ msgstr ""
msgid "JIS B9"
msgstr ""
-#: scheduler/ipp.c:9166
+#: scheduler/ipp.c:8979
#, c-format
msgid "Job #%d cannot be restarted - no files."
msgstr ""
-#: scheduler/ipp.c:3107 scheduler/ipp.c:3337 scheduler/ipp.c:3392
-#: scheduler/ipp.c:3569 scheduler/ipp.c:4015 scheduler/ipp.c:5835
-#: scheduler/ipp.c:6211 scheduler/ipp.c:6358 scheduler/ipp.c:6658
-#: scheduler/ipp.c:7597 scheduler/ipp.c:7619 scheduler/ipp.c:7791
-#: scheduler/ipp.c:8016 scheduler/ipp.c:8059 scheduler/ipp.c:8908
-#: scheduler/ipp.c:9134 scheduler/ipp.c:9489 scheduler/ipp.c:10092
+#: scheduler/ipp.c:2988 scheduler/ipp.c:3222 scheduler/ipp.c:3281
+#: scheduler/ipp.c:3460 scheduler/ipp.c:3906 scheduler/ipp.c:5573
+#: scheduler/ipp.c:5955 scheduler/ipp.c:6102 scheduler/ipp.c:6440
+#: scheduler/ipp.c:7396 scheduler/ipp.c:7418 scheduler/ipp.c:7590
+#: scheduler/ipp.c:7815 scheduler/ipp.c:7858 scheduler/ipp.c:8723
+#: scheduler/ipp.c:8947 scheduler/ipp.c:9299 scheduler/ipp.c:9912
#, c-format
msgid "Job #%d does not exist."
msgstr ""
-#: scheduler/ipp.c:3601
+#: scheduler/ipp.c:3492
#, c-format
msgid "Job #%d is already aborted - can't cancel."
msgstr ""
-#: scheduler/ipp.c:3595
+#: scheduler/ipp.c:3486
#, c-format
msgid "Job #%d is already canceled - can't cancel."
msgstr ""
-#: scheduler/ipp.c:3607
+#: scheduler/ipp.c:3498
#, c-format
msgid "Job #%d is already completed - can't cancel."
msgstr ""
-#: scheduler/ipp.c:7817 scheduler/ipp.c:8101 scheduler/ipp.c:10107
+#: scheduler/ipp.c:7616 scheduler/ipp.c:7900 scheduler/ipp.c:9927
#, c-format
msgid "Job #%d is finished and cannot be altered."
msgstr ""
-#: scheduler/ipp.c:9148
+#: scheduler/ipp.c:8961
#, c-format
msgid "Job #%d is not complete."
msgstr ""
-#: scheduler/ipp.c:3122
+#: scheduler/ipp.c:3003
#, c-format
msgid "Job #%d is not held for authentication."
msgstr ""
-#: scheduler/ipp.c:8922
+#: scheduler/ipp.c:8737
#, c-format
msgid "Job #%d is not held."
msgstr ""
-#: cgi-bin/ipp-var.c:1055
+#: cgi-bin/ipp-var.c:1038
msgid "Job Completed"
msgstr ""
-#: cgi-bin/ipp-var.c:1053
+#: cgi-bin/ipp-var.c:1036
msgid "Job Created"
msgstr ""
-#: cgi-bin/ipp-var.c:1059
+#: cgi-bin/ipp-var.c:1042
msgid "Job Options Changed"
msgstr ""
-#: cgi-bin/ipp-var.c:1057
+#: cgi-bin/ipp-var.c:1040
msgid "Job Stopped"
msgstr ""
-#: scheduler/ipp.c:10189
+#: scheduler/ipp.c:10009
msgid "Job is completed and cannot be changed."
msgstr ""
-#: cgi-bin/jobs.c:198
+#: cgi-bin/jobs.c:192
msgid "Job operation failed"
msgstr ""
-#: scheduler/ipp.c:10225 scheduler/ipp.c:10244 scheduler/ipp.c:10255
+#: scheduler/ipp.c:10045 scheduler/ipp.c:10062 scheduler/ipp.c:10073
msgid "Job state cannot be changed."
msgstr ""
-#: scheduler/ipp.c:9014
+#: scheduler/ipp.c:8827
msgid "Job subscriptions cannot be renewed."
msgstr ""
-#: cgi-bin/jobs.c:103 cgi-bin/jobs.c:114 cgi-bin/jobs.c:195
+#: cgi-bin/jobs.c:97 cgi-bin/jobs.c:108 cgi-bin/jobs.c:189
msgid "Jobs"
msgstr ""
-#: backend/lpd.c:186
+#: backend/lpd.c:177
msgid "LPD/LPR Host or Printer"
msgstr ""
@@ -3866,11 +4438,11 @@ msgstr ""
msgid "Label Printer"
msgstr ""
-#: ppdc/sample.c:446
+#: ppdc/sample.c:441
msgid "Label Top"
msgstr ""
-#: scheduler/ipp.c:2168 scheduler/ipp.c:5758
+#: scheduler/ipp.c:2039 scheduler/ipp.c:5496
#, c-format
msgid "Language \"%s\" not supported."
msgstr ""
@@ -3879,7 +4451,7 @@ msgstr ""
msgid "Large Address"
msgstr ""
-#: ppdc/sample.c:291
+#: ppdc/sample.c:286
msgid "LaserJet Series PCL 4/5"
msgstr ""
@@ -3895,39 +4467,43 @@ msgstr ""
msgid "Light"
msgstr ""
-#: cups/ppd.c:352
+#: cups/ppd.c:310
msgid "Line longer than the maximum allowed (255 characters)"
msgstr ""
-#: cgi-bin/admin.c:2393
+#: cgi-bin/admin.c:2379
msgid "List Available Printers"
msgstr ""
-#: ppdc/sample.c:272
+#: cups/localize.c:291
+msgid "Load paper."
+msgstr ""
+
+#: ppdc/sample.c:264
msgid "Long-Edge (Portrait)"
msgstr ""
-#: cups/http-support.c:1620
-msgid "Looking for printer."
+#: cups/http-support.c:1725
+msgid "Looking for printer..."
msgstr ""
-#: ppdc/sample.c:268
+#: ppdc/sample.c:260
msgid "Manual Feed"
msgstr ""
-#: cups/ppd.c:789 cups/ppd.c:1357
+#: cups/ppd.c:747 cups/ppd.c:1313
msgid "Media Size"
msgstr ""
-#: cups/ppd.c:793 cups/ppd.c:1361 ppdc/sample.c:262
+#: cups/ppd.c:751 cups/ppd.c:1317 ppdc/sample.c:254
msgid "Media Source"
msgstr ""
-#: ppdc/sample.c:364
+#: ppdc/sample.c:359
msgid "Media Tracking"
msgstr ""
-#: cups/ppd.c:791 cups/ppd.c:1359 ppdc/sample.c:285
+#: cups/ppd.c:749 cups/ppd.c:1315 ppdc/sample.c:280
msgid "Media Type"
msgstr ""
@@ -3935,79 +4511,87 @@ msgstr ""
msgid "Medium"
msgstr ""
-#: cups/ppd.c:341
+#: cups/ppd.c:299
msgid "Memory allocation error"
msgstr ""
-#: cups/ppd.c:361
+#: cups/ppd.c:319
msgid "Missing CloseGroup"
msgstr ""
-#: cups/ppd.c:342
+#: cups/ppd.c:300
msgid "Missing PPD-Adobe-4.x header"
msgstr ""
-#: cups/ppd.c:351
+#: cups/ppd.c:309
msgid "Missing asterisk in column 1"
msgstr ""
-#: scheduler/ipp.c:6234
+#: scheduler/ipp.c:5978
msgid "Missing document-number attribute."
msgstr ""
-#: cups/adminutil.c:273
+#: cups/adminutil.c:262
#, c-format
msgid "Missing double quote on line %d."
msgstr ""
-#: cgi-bin/admin.c:736 cgi-bin/admin.c:2106 cgi-bin/admin.c:2191
-#: cgi-bin/admin.c:2785 cgi-bin/admin.c:3039 cgi-bin/admin.c:3150
-#: cgi-bin/admin.c:3860
+#: cgi-bin/admin.c:712 cgi-bin/admin.c:2092 cgi-bin/admin.c:2177
+#: cgi-bin/admin.c:2771 cgi-bin/admin.c:3025 cgi-bin/admin.c:3136
+#: cgi-bin/admin.c:3846
msgid "Missing form variable"
msgstr ""
-#: scheduler/ipp.c:9543
+#: scheduler/ipp.c:9353
msgid "Missing last-document attribute in request."
msgstr ""
-#: cups/pwg-media.c:535
+#: cups/pwg-media.c:555
msgid "Missing media or media-col."
msgstr ""
-#: cups/pwg-media.c:454
+#: cups/pwg-media.c:474
msgid "Missing media-size in media-col."
msgstr ""
-#: scheduler/ipp.c:6788
+#: scheduler/ipp.c:6581
msgid "Missing notify-subscription-ids attribute."
msgstr ""
-#: cups/ppd.c:359
+#: cups/ppd.c:317
msgid "Missing option keyword"
msgstr ""
-#: scheduler/ipp.c:3248 scheduler/ipp.c:3273
+#: scheduler/ipp.c:3129 scheduler/ipp.c:3154
msgid "Missing requesting-user-name attribute."
msgstr ""
-#: scheduler/ipp.c:461
+#: scheduler/ipp.c:388
msgid "Missing required attributes."
msgstr ""
-#: cups/adminutil.c:254
+#: cups/http-support.c:1486
+msgid "Missing resource in URI"
+msgstr ""
+
+#: cups/http-support.c:1480
+msgid "Missing scheme in URI"
+msgstr ""
+
+#: cups/adminutil.c:243
#, c-format
msgid "Missing value on line %d."
msgstr ""
-#: cups/ppd.c:343
+#: cups/ppd.c:301
msgid "Missing value string"
msgstr ""
-#: cups/pwg-media.c:442
+#: cups/pwg-media.c:462
msgid "Missing x-dimension in media-size."
msgstr ""
-#: cups/pwg-media.c:448
+#: cups/pwg-media.c:468
msgid "Missing y-dimension in media-size."
msgstr ""
@@ -4020,96 +4604,96 @@ msgid ""
" device-id = %s"
msgstr ""
-#: cgi-bin/admin.c:570
+#: test/ippfind.c:2794
+msgid "Modifiers:"
+msgstr ""
+
+#: cgi-bin/admin.c:546
msgid "Modify Class"
msgstr ""
-#: cgi-bin/admin.c:882
+#: cgi-bin/admin.c:859
msgid "Modify Printer"
msgstr ""
-#: cgi-bin/ipp-var.c:425 cgi-bin/ipp-var.c:516
+#: cgi-bin/ipp-var.c:413 cgi-bin/ipp-var.c:504
msgid "Move All Jobs"
msgstr ""
-#: cgi-bin/ipp-var.c:364 cgi-bin/ipp-var.c:423 cgi-bin/ipp-var.c:514
+#: cgi-bin/ipp-var.c:352 cgi-bin/ipp-var.c:411 cgi-bin/ipp-var.c:502
msgid "Move Job"
msgstr ""
-#: cups/http-support.c:1351
+#: cups/http-support.c:1353
msgid "Moved Permanently"
msgstr ""
-#: cups/ppd.c:340
+#: cups/ppd.c:298
msgid "NULL PPD file pointer"
msgstr ""
-#: cups/snmp.c:1053
+#: cups/snmp.c:1005
msgid "Name OID uses indefinite length"
msgstr ""
-#: scheduler/ipp.c:1142
+#: scheduler/ipp.c:1061
msgid "Nested classes are not allowed."
msgstr ""
-#: ppdc/sample.c:430
+#: ppdc/sample.c:425
msgid "Never"
msgstr ""
-#: ppdc/sample.c:256
-msgid "New Stylus Color Series"
-msgstr ""
-
-#: ppdc/sample.c:258
-msgid "New Stylus Photo Series"
-msgstr ""
-
-#: cups/ppd.c:1949
+#: cups/ppd.c:1904
msgid "No"
msgstr ""
-#: cups/http-support.c:1348
+#: cups/http-support.c:1350
msgid "No Content"
msgstr ""
-#: cups/util.c:1304
+#: cups/util.c:1123
msgid "No PPD name"
msgstr ""
-#: cups/snmp.c:1047
+#: cups/snmp.c:999
msgid "No VarBind SEQUENCE"
msgstr ""
-#: cups/adminutil.c:788
+#: cups/adminutil.c:777
msgid "No Windows printer drivers are installed."
msgstr ""
-#: cups/request.c:568 cups/request.c:914
+#: cups/request.c:570 cups/request.c:933
msgid "No active connection"
msgstr ""
-#: scheduler/ipp.c:3518
+#: cups/request.c:350
+msgid "No active connection."
+msgstr ""
+
+#: scheduler/ipp.c:3409
#, c-format
msgid "No active jobs on %s."
msgstr ""
-#: scheduler/ipp.c:302
+#: scheduler/ipp.c:216
msgid "No attributes in request."
msgstr ""
-#: scheduler/ipp.c:3149
+#: scheduler/ipp.c:3030
msgid "No authentication information provided."
msgstr ""
-#: cups/snmp.c:1004
+#: cups/snmp.c:956
msgid "No community name"
msgstr ""
-#: scheduler/ipp.c:6034
+#: scheduler/ipp.c:5778
msgid "No default printer."
msgstr ""
-#: cgi-bin/ipp-var.c:436 scheduler/ipp.c:7363
+#: cgi-bin/ipp-var.c:424 scheduler/ipp.c:7162
msgid "No destinations added."
msgstr ""
@@ -4117,72 +4701,84 @@ msgstr ""
msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
msgstr ""
-#: cups/snmp.c:1034
+#: cups/snmp.c:986
msgid "No error-index"
msgstr ""
-#: cups/snmp.c:1026
+#: cups/snmp.c:978
msgid "No error-status"
msgstr ""
-#: scheduler/ipp.c:8305 scheduler/ipp.c:9557
+#: scheduler/ipp.c:8105 scheduler/ipp.c:9367
msgid "No file in print request."
msgstr ""
-#: cups/util.c:923
+#: cups/util.c:817
msgid "No modification time"
msgstr ""
-#: cups/snmp.c:1051
+#: cups/snmp.c:1003
msgid "No name OID"
msgstr ""
-#: filter/rastertoepson.c:1147 filter/rastertohp.c:876
-#: filter/rastertolabel.c:1302
+#: filter/rastertoepson.c:1144 filter/rastertohp.c:865
+#: filter/rastertolabel.c:1288
msgid "No pages were found."
msgstr ""
-#: cups/util.c:917
+#: cups/util.c:811
msgid "No printer name"
msgstr ""
-#: cups/util.c:1837
+#: cups/util.c:1647
msgid "No printer-uri found"
msgstr ""
-#: cups/util.c:1822
+#: cups/util.c:1631
msgid "No printer-uri found for class"
msgstr ""
-#: scheduler/ipp.c:6437
+#: scheduler/ipp.c:6186
msgid "No printer-uri in request."
msgstr ""
-#: cups/snmp.c:1018
+#: cups/http.c:2260
+msgid "No request URI."
+msgstr ""
+
+#: cups/http.c:2277
+msgid "No request protocol version."
+msgstr ""
+
+#: cups/request.c:358
+msgid "No request sent."
+msgstr ""
+
+#: cups/snmp.c:970
msgid "No request-id"
msgstr ""
-#: scheduler/ipp.c:5643
+#: scheduler/ipp.c:5381
msgid "No subscription attributes in request."
msgstr ""
-#: scheduler/ipp.c:7690
+#: scheduler/ipp.c:7489
msgid "No subscriptions found."
msgstr ""
-#: cups/snmp.c:1042
+#: cups/snmp.c:994
msgid "No variable-bindings SEQUENCE"
msgstr ""
-#: cups/snmp.c:997
+#: cups/snmp.c:949
msgid "No version number"
msgstr ""
-#: ppdc/sample.c:367
+#: ppdc/sample.c:362
msgid "Non-continuous (Mark sensing)"
msgstr ""
-#: ppdc/sample.c:366
+#: ppdc/sample.c:361
msgid "Non-continuous (Web sensing)"
msgstr ""
@@ -4190,27 +4786,27 @@ msgstr ""
msgid "Normal"
msgstr ""
-#: cups/http-support.c:1370
+#: cups/http-support.c:1372
msgid "Not Found"
msgstr ""
-#: cups/http-support.c:1382
+#: cups/http-support.c:1384
msgid "Not Implemented"
msgstr ""
-#: ppdc/sample.c:276
+#: ppdc/sample.c:268
msgid "Not Installed"
msgstr ""
-#: cups/http-support.c:1357
+#: cups/http-support.c:1359
msgid "Not Modified"
msgstr ""
-#: cups/http-support.c:1385
+#: cups/http-support.c:1387
msgid "Not Supported"
msgstr ""
-#: scheduler/ipp.c:1554 scheduler/ipp.c:10787
+#: scheduler/ipp.c:1506 scheduler/ipp.c:10626
msgid "Not allowed to print."
msgstr ""
@@ -4222,15 +4818,15 @@ msgstr ""
msgid "Note: this program only validates the DSC comments, not the PostScript itself."
msgstr ""
-#: cups/http-support.c:1339 cups/ppd.c:338
+#: cups/http-support.c:1341 cups/http-support.c:1477 cups/ppd.c:296
msgid "OK"
msgstr ""
-#: ppdc/sample.c:271
+#: ppdc/sample.c:263
msgid "Off (1-Sided)"
msgstr ""
-#: ppdc/sample.c:361
+#: ppdc/sample.c:356
msgid "Oki"
msgstr ""
@@ -4238,76 +4834,69 @@ msgstr ""
msgid "Online Help"
msgstr ""
-#: cups/adminutil.c:955
+#: cups/adminutil.c:944
#, c-format
msgid "Open of %s failed: %s"
msgstr ""
-#: cups/ppd.c:346
+#: cups/ppd.c:304
msgid "OpenGroup without a CloseGroup first"
msgstr ""
-#: cups/ppd.c:348
+#: cups/ppd.c:306
msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
msgstr ""
-#: cgi-bin/admin.c:3631
+#: cgi-bin/admin.c:3617
msgid "Operation Policy"
msgstr ""
-#: filter/pstops.c:2205
+#: filter/pstops.c:2182
#, c-format
msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
msgstr ""
-#: cgi-bin/admin.c:3281 cgi-bin/admin.c:3365
+#: cgi-bin/admin.c:3267 cgi-bin/admin.c:3351
msgid "Options Installed"
msgstr ""
-#: scheduler/cupsfilter.c:1433 scheduler/main.c:2054 systemv/cupsaddsmb.c:284
-#: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3797
-#: test/ipptool.c:4484 ppdc/ppdc.cxx:437 ppdc/ppdhtml.cxx:174
-#: ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:369 ppdc/ppdpo.cxx:254
+#: scheduler/cupsfilter.c:1482 scheduler/main.c:2177 systemv/cupsaddsmb.c:284
+#: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3861
+#: test/ippfind.c:2753 test/ipptool.c:4857 ppdc/ppdc.cxx:432
+#: ppdc/ppdhtml.cxx:179 ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:363
+#: ppdc/ppdpo.cxx:249
msgid "Options:"
msgstr ""
-#: cups/ppd-cache.c:157
+#: cups/ppd-cache.c:442
msgid "Out of date PPD cache file."
msgstr ""
-#: cups/ppd-cache.c:1384
+#: cups/ppd-cache.c:1810
msgid "Out of memory."
msgstr ""
-#: cups/ppd.c:795 cups/ppd.c:1363
+#: cups/ppd.c:753 cups/ppd.c:1319
msgid "Output Mode"
msgstr ""
-#: systemv/lpstat.c:1295 systemv/lpstat.c:1299
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr ""
-
-#: systemv/lpstat.c:1289
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
+#: cups/localize.c:316
+msgid "Output bin is almost full."
msgstr ""
-#: systemv/lpstat.c:1313 systemv/lpstat.c:1317
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
+#: cups/localize.c:318
+msgid "Output bin is full."
msgstr ""
-#: systemv/lpstat.c:1307
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#: cups/localize.c:314
+msgid "Output bin is missing."
msgstr ""
#: systemv/cupstestdsc.c:399
msgid "PASS"
msgstr ""
-#: ppdc/sample.c:260
+#: ppdc/sample.c:252
msgid "PCL Laser Printer"
msgstr ""
@@ -4335,23 +4924,39 @@ msgstr ""
msgid "PRC32K Oversize Long Edge"
msgstr ""
-#: cups/snmp.c:1014
+#: cups/snmp.c:966
msgid "Packet does not contain a Get-Response-PDU"
msgstr ""
-#: cups/snmp.c:993
+#: cups/snmp.c:945
msgid "Packet does not start with SEQUENCE"
msgstr ""
-#: ppdc/sample.c:360
+#: cups/localize.c:293
+msgid "Paper jam."
+msgstr ""
+
+#: cups/localize.c:310
+msgid "Paper tray is almost empty."
+msgstr ""
+
+#: cups/localize.c:312
+msgid "Paper tray is empty."
+msgstr ""
+
+#: cups/localize.c:308
+msgid "Paper tray is missing."
+msgstr ""
+
+#: ppdc/sample.c:355
msgid "ParamCustominCutInterval"
msgstr ""
-#: ppdc/sample.c:358
+#: ppdc/sample.c:353
msgid "ParamCustominTearInterval"
msgstr ""
-#: cups/auth.c:199 cups/auth.c:367
+#: cups/auth.c:195 cups/auth.c:362
#, c-format
msgid "Password for %s on %s? "
msgstr ""
@@ -4361,15 +4966,15 @@ msgstr ""
msgid "Password for %s required to access %s via SAMBA: "
msgstr ""
-#: cgi-bin/classes.c:167
+#: cgi-bin/classes.c:159
msgid "Pause Class"
msgstr ""
-#: cgi-bin/printers.c:170
+#: cgi-bin/printers.c:162
msgid "Pause Printer"
msgstr ""
-#: ppdc/sample.c:448
+#: ppdc/sample.c:443
msgid "Peel-Off"
msgstr ""
@@ -4381,19 +4986,19 @@ msgstr ""
msgid "Photo Labels"
msgstr ""
-#: ppdc/sample.c:286
+#: ppdc/sample.c:281
msgid "Plain Paper"
msgstr ""
-#: cgi-bin/admin.c:3299 cgi-bin/admin.c:3580
+#: cgi-bin/admin.c:3285 cgi-bin/admin.c:3566
msgid "Policies"
msgstr ""
-#: cgi-bin/admin.c:3306 cgi-bin/admin.c:3649 cgi-bin/admin.c:3662
+#: cgi-bin/admin.c:3292 cgi-bin/admin.c:3635 cgi-bin/admin.c:3648
msgid "Port Monitor"
msgstr ""
-#: ppdc/sample.c:278
+#: ppdc/sample.c:270
msgid "PostScript Printer"
msgstr ""
@@ -4413,7 +5018,11 @@ msgstr ""
msgid "Postcard Long Edge"
msgstr ""
-#: ppdc/sample.c:295
+#: backend/ipp.c:965 backend/ipp.c:973
+msgid "Preparing to print."
+msgstr ""
+
+#: ppdc/sample.c:290
msgid "Print Density"
msgstr ""
@@ -4421,153 +5030,139 @@ msgstr ""
msgid "Print Job:"
msgstr ""
-#: ppdc/sample.c:340
+#: ppdc/sample.c:335
msgid "Print Mode"
msgstr ""
-#: ppdc/sample.c:383
+#: ppdc/sample.c:378
msgid "Print Rate"
msgstr ""
-#: cgi-bin/printers.c:179
+#: cgi-bin/printers.c:171
msgid "Print Self-Test Page"
msgstr ""
-#: ppdc/sample.c:327
+#: ppdc/sample.c:322
msgid "Print Speed"
msgstr ""
-#: cgi-bin/ipp-var.c:792
+#: cgi-bin/ipp-var.c:780
msgid "Print Test Page"
msgstr ""
-#: ppdc/sample.c:356
+#: ppdc/sample.c:351
msgid "Print and Cut"
msgstr ""
-#: ppdc/sample.c:344
+#: ppdc/sample.c:339
msgid "Print and Tear"
msgstr ""
-#: backend/ipp.c:1575
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-#: backend/ipp.c:1565
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
-#: backend/socket.c:438 backend/usb-unix.c:191
+#: backend/socket.c:429 backend/usb-unix.c:184
msgid "Print file sent."
msgstr ""
-#: backend/ipp.c:1526
-msgid "Print file was not accepted."
-msgstr ""
-
-#: backend/ipp.c:2001
+#: backend/ipp.c:2180
msgid "Print job canceled at printer."
msgstr ""
-#: backend/ipp.c:1996
+#: backend/ipp.c:2172
msgid "Print job too large."
msgstr ""
-#: cgi-bin/ipp-var.c:1047
+#: backend/ipp.c:1654
+msgid "Print job was not accepted."
+msgstr ""
+
+#: cgi-bin/ipp-var.c:1030
msgid "Printer Added"
msgstr ""
-#: ppdc/sample.c:263
+#: ppdc/sample.c:255
msgid "Printer Default"
msgstr ""
-#: cgi-bin/ipp-var.c:1051
+#: cgi-bin/ipp-var.c:1034
msgid "Printer Deleted"
msgstr ""
-#: cgi-bin/ipp-var.c:1049
+#: cgi-bin/ipp-var.c:1032
msgid "Printer Modified"
msgstr ""
-#: cgi-bin/ipp-var.c:1045
+#: cgi-bin/ipp-var.c:1028
msgid "Printer Paused"
msgstr ""
-#: ppdc/sample.c:294
+#: ppdc/sample.c:289
msgid "Printer Settings"
msgstr ""
-#: backend/ipp.c:1999
+#: backend/ipp.c:2175
msgid "Printer cannot print supplied content."
msgstr ""
+#: backend/ipp.c:2178
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
#: cups/notify.c:126
msgid "Printer:"
msgstr ""
-#: cgi-bin/printers.c:204 cgi-bin/printers.c:332
+#: cgi-bin/printers.c:196 cgi-bin/printers.c:324
msgid "Printers"
msgstr ""
-#: filter/rastertoepson.c:1093 filter/rastertohp.c:817
-#: filter/rastertolabel.c:1249
+#: filter/rastertoepson.c:1090 filter/rastertohp.c:806
+#: filter/rastertolabel.c:1235
#, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr ""
-
-#: cgi-bin/classes.c:173 cgi-bin/printers.c:176
-msgid "Purge Jobs"
+msgid "Printing page %d, %u%% complete."
msgstr ""
#: ppdc/sample.c:155
msgid "Quarto"
msgstr ""
-#: scheduler/ipp.c:1549 scheduler/ipp.c:10782
+#: scheduler/ipp.c:1501 scheduler/ipp.c:10621
msgid "Quota limit reached."
msgstr ""
-#: berkeley/lpq.c:520
+#: berkeley/lpq.c:490
msgid "Rank Owner Job File(s) Total Size"
msgstr ""
-#. TRANSLATORS: Pri is job priority.
-#: berkeley/lpq.c:516
-msgid "Rank Owner Pri Job Files Total Size"
-msgstr ""
-
-#: cgi-bin/classes.c:171 cgi-bin/printers.c:174
+#: cgi-bin/classes.c:163 cgi-bin/printers.c:166
msgid "Reject Jobs"
msgstr ""
-#: backend/lpd.c:1033 backend/lpd.c:1165
+#: backend/lpd.c:1024 backend/lpd.c:1156
#, c-format
msgid "Remote host did not accept control file (%d)."
msgstr ""
-#: backend/lpd.c:1118
+#: backend/lpd.c:1109
#, c-format
msgid "Remote host did not accept data file (%d)."
msgstr ""
-#: ppdc/sample.c:428
+#: ppdc/sample.c:423
msgid "Reprint After Error"
msgstr ""
-#: cups/http-support.c:1373
+#: cups/http-support.c:1375
msgid "Request Entity Too Large"
msgstr ""
-#: cups/ppd.c:797 cups/ppd.c:1365 ppdc/sample.c:231
+#: cups/ppd.c:755 cups/ppd.c:1321 ppdc/sample.c:231
msgid "Resolution"
msgstr ""
-#: cgi-bin/classes.c:165
+#: cgi-bin/classes.c:157
msgid "Resume Class"
msgstr ""
-#: cgi-bin/printers.c:167
+#: cgi-bin/printers.c:159
msgid "Resume Printer"
msgstr ""
@@ -4575,69 +5170,73 @@ msgstr ""
msgid "Return Address"
msgstr ""
-#: ppdc/sample.c:449
+#: ppdc/sample.c:444
msgid "Rewind"
msgstr ""
-#: cups/adminutil.c:2052
+#: cups/adminutil.c:2041
#, c-format
msgid "Running command: %s %s -N -A %s -c '%s'"
msgstr ""
-#: cups/snmp.c:995
+#: cups/snmp.c:947
msgid "SEQUENCE uses indefinite length"
msgstr ""
-#: cups/http-support.c:1397
+#: cups/http-support.c:1399
msgid "SSL/TLS Negotiation Error"
msgstr ""
-#: cups/http-support.c:1354
+#: cups/http-support.c:1356
msgid "See Other"
msgstr ""
-#: backend/usb-darwin.c:543 backend/usb-libusb.c:459
+#: backend/usb-darwin.c:564 backend/usb-libusb.c:346
msgid "Sending data to printer."
msgstr ""
-#: cgi-bin/ipp-var.c:1061
+#: cgi-bin/ipp-var.c:1044
msgid "Server Restarted"
msgstr ""
-#: cgi-bin/ipp-var.c:1067
+#: cgi-bin/ipp-var.c:1050
msgid "Server Security Auditing"
msgstr ""
-#: cgi-bin/ipp-var.c:1063
+#: cgi-bin/ipp-var.c:1046
msgid "Server Started"
msgstr ""
-#: cgi-bin/ipp-var.c:1065
+#: cgi-bin/ipp-var.c:1048
msgid "Server Stopped"
msgstr ""
-#: cups/http-support.c:1391
+#: cups/tls-darwin.c:1030 cups/tls-gnutls.c:1049
+msgid "Server credentials not set."
+msgstr ""
+
+#: cups/http-support.c:1393
msgid "Service Unavailable"
msgstr ""
-#: cgi-bin/admin.c:2786 cgi-bin/admin.c:2832 cgi-bin/admin.c:2989
-#: cgi-bin/admin.c:3008
+#: cgi-bin/admin.c:2772 cgi-bin/admin.c:2818 cgi-bin/admin.c:2975
+#: cgi-bin/admin.c:2994
msgid "Set Allowed Users"
msgstr ""
-#: cgi-bin/admin.c:3035
+#: cgi-bin/admin.c:3021
msgid "Set As Server Default"
msgstr ""
-#: cgi-bin/admin.c:3135
+#: cgi-bin/admin.c:3121
msgid "Set Class Options"
msgstr ""
-#: cgi-bin/admin.c:3135 cgi-bin/admin.c:3309 cgi-bin/admin.c:3691
+#: cgi-bin/admin.c:3121 cgi-bin/admin.c:3295 cgi-bin/admin.c:3677
msgid "Set Printer Options"
msgstr ""
-#: cgi-bin/admin.c:3861 cgi-bin/admin.c:3905 cgi-bin/admin.c:3923
+#: cgi-bin/admin.c:3847 cgi-bin/admin.c:3891 cgi-bin/admin.c:3909
msgid "Set Publishing"
msgstr ""
@@ -4645,30 +5244,30 @@ msgstr ""
msgid "Shipping Address"
msgstr ""
-#: ppdc/sample.c:273
+#: ppdc/sample.c:265
msgid "Short-Edge (Landscape)"
msgstr ""
-#: ppdc/sample.c:288
+#: ppdc/sample.c:283
msgid "Special Paper"
msgstr ""
-#: backend/lpd.c:1074
+#: backend/lpd.c:1065
#, c-format
msgid "Spooling job, %.0f%% complete."
msgstr ""
-#: ppdc/sample.c:341
+#: ppdc/sample.c:336
msgid "Standard"
msgstr ""
#. TRANSLATORS: Banner/cover sheet before the print job.
-#: cgi-bin/admin.c:3552
+#: cgi-bin/admin.c:3538
msgid "Starting Banner"
msgstr ""
-#: filter/rastertoepson.c:1069 filter/rastertohp.c:793
-#: filter/rastertolabel.c:1225
+#: filter/rastertoepson.c:1066 filter/rastertohp.c:782
+#: filter/rastertolabel.c:1211
#, c-format
msgid "Starting page %d."
msgstr ""
@@ -4677,20 +5276,16 @@ msgstr ""
msgid "Statement"
msgstr ""
-#: ppdc/sample.c:251
-msgid "Stylus Color Series"
-msgstr ""
-
-#: ppdc/sample.c:257
-msgid "Stylus Photo Series"
-msgstr ""
-
-#: scheduler/ipp.c:3664 scheduler/ipp.c:6804 scheduler/ipp.c:7503
-#: scheduler/ipp.c:9002
+#: scheduler/ipp.c:3555 scheduler/ipp.c:6597 scheduler/ipp.c:7302
+#: scheduler/ipp.c:8815
#, c-format
msgid "Subscription #%d does not exist."
msgstr ""
+#: test/ippfind.c:2806
+msgid "Substitutions:"
+msgstr ""
+
#: ppdc/sample.c:157
msgid "Super A"
msgstr ""
@@ -4703,7 +5298,7 @@ msgstr ""
msgid "Super B/A3"
msgstr ""
-#: cups/http-support.c:1336
+#: cups/http-support.c:1338
msgid "Switching Protocols"
msgstr ""
@@ -4719,306 +5314,278 @@ msgstr ""
msgid "Tabloid Oversize Long Edge"
msgstr ""
-#: ppdc/sample.c:342
+#: ppdc/sample.c:337
msgid "Tear"
msgstr ""
-#: ppdc/sample.c:447
+#: ppdc/sample.c:442
msgid "Tear-Off"
msgstr ""
-#: ppdc/sample.c:388
+#: ppdc/sample.c:383
msgid "Tear-Off Adjust Position"
msgstr ""
-#: scheduler/ipp.c:6508 scheduler/ipp.c:6586 scheduler/ipp.c:6602
-#: scheduler/ipp.c:6620
+#: scheduler/ipp.c:1337
+#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr ""
+
+#: scheduler/ipp.c:6257 scheduler/ipp.c:6337 scheduler/ipp.c:6350
+#: scheduler/ipp.c:6362 scheduler/ipp.c:6377
#, c-format
msgid "The %s attribute cannot be provided with job-ids."
msgstr ""
-#: scheduler/ipp.c:1381
+#: scheduler/ipp.c:1316
#, c-format
-msgid "The '%s' Job Description attribute cannot be supplied in a job creation request."
+msgid "The '%s' Job Status attribute cannot be supplied in a job creation request."
msgstr ""
-#: scheduler/ipp.c:5233
+#: scheduler/ipp.c:5190
#, c-format
msgid "The '%s' operation attribute cannot be supplied in a Create-Job request."
msgstr ""
-#: scheduler/ipp.c:7034
+#: scheduler/ipp.c:6827
#, c-format
msgid "The PPD file \"%s\" could not be found."
msgstr ""
-#: scheduler/ipp.c:7021
+#: scheduler/ipp.c:6814
#, c-format
msgid "The PPD file \"%s\" could not be opened: %s"
msgstr ""
-#: filter/rastertoepson.c:1038 filter/rastertohp.c:764
-#: filter/rastertolabel.c:1189
+#: filter/rastertoepson.c:1035 filter/rastertohp.c:753
+#: filter/rastertolabel.c:1175
msgid "The PPD file could not be opened."
msgstr ""
-#: cgi-bin/admin.c:749
+#: cgi-bin/admin.c:725
msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
msgstr ""
-#: cups/localize.c:353
+#: cups/localize.c:338
msgid "The developer unit needs to be replaced."
msgstr ""
-#: cups/localize.c:351
+#: cups/localize.c:336
msgid "The developer unit will need to be replaced soon."
msgstr ""
-#: cups/localize.c:343
+#: cups/localize.c:328
msgid "The fuser's temperature is high."
msgstr ""
-#: cups/localize.c:345
+#: cups/localize.c:330
msgid "The fuser's temperature is low."
msgstr ""
-#: scheduler/ipp.c:2195
+#: scheduler/ipp.c:2066
msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
msgstr ""
-#: scheduler/ipp.c:2178 scheduler/ipp.c:5768
+#: scheduler/ipp.c:2049 scheduler/ipp.c:5506
#, c-format
msgid "The notify-user-data value is too large (%d > 63 octets)."
msgstr ""
-#: cups/localize.c:349
+#: cups/localize.c:334
msgid "The optical photoconductor needs to be replaced."
msgstr ""
-#: cups/localize.c:347
+#: cups/localize.c:332
msgid "The optical photoconductor will need to be replaced soon."
msgstr ""
-#: cups/localize.c:331
-msgid "The output bin is almost full."
-msgstr ""
-
-#: cups/localize.c:333
-msgid "The output bin is full."
-msgstr ""
-
-#: cups/localize.c:329
-msgid "The output bin is missing."
+#: backend/ipp.c:985
+msgid "The printer configuration is incorrect or the printer no longer exists."
msgstr ""
-#: cups/localize.c:325
-msgid "The paper tray is almost empty."
-msgstr ""
-
-#: cups/localize.c:327
-msgid "The paper tray is empty."
-msgstr ""
-
-#: cups/localize.c:323
-msgid "The paper tray is missing."
-msgstr ""
-
-#: cups/localize.c:306
-msgid "The paper tray needs to be filled."
-msgstr ""
-
-#: backend/ipp.c:925
-msgid "The printer URI is incorrect or no longer exists."
+#: backend/lpd.c:627 backend/lpd.c:1017 backend/lpd.c:1099 backend/lpd.c:1149
+msgid "The printer did not respond."
msgstr ""
-#: backend/lpd.c:636 backend/lpd.c:1026 backend/lpd.c:1108 backend/lpd.c:1158
-msgid "The printer did not respond."
+#: backend/ipp.c:829 backend/ipp.c:948 backend/ipp.c:1062 backend/ipp.c:1459
+#: backend/ipp.c:1626 backend/lpd.c:836 backend/socket.c:379
+#: backend/usb-unix.c:124 backend/usb-unix.c:414 backend/usb-unix.c:497
+msgid "The printer is in use."
msgstr ""
-#: backend/ipp.c:908 backend/ipp.c:915
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+#: cups/localize.c:320
+msgid "The printer is low on ink."
msgstr ""
-#: backend/ipp.c:773 backend/ipp.c:890 backend/ipp.c:1002 backend/ipp.c:1352
-#: backend/ipp.c:1503 backend/lpd.c:845 backend/socket.c:388
-#: backend/usb-unix.c:131 backend/usb-unix.c:424 backend/usb-unix.c:507
-msgid "The printer is in use."
+#: cups/localize.c:298
+msgid "The printer is low on toner."
msgstr ""
-#: backend/runloop.c:254 backend/runloop.c:374 cups/localize.c:311
+#: backend/runloop.c:243 backend/runloop.c:363 cups/localize.c:296
msgid "The printer is not connected."
msgstr ""
-#: backend/ipp.c:751 backend/ipp.c:784 backend/ipp.c:886 backend/lpd.c:824
-#: backend/lpd.c:865 backend/socket.c:367 backend/socket.c:400
+#: backend/ipp.c:807 backend/ipp.c:840 backend/ipp.c:944 backend/lpd.c:815
+#: backend/lpd.c:856 backend/socket.c:358 backend/socket.c:391
msgid "The printer is not responding."
msgstr ""
-#: backend/runloop.c:396
+#: backend/runloop.c:385
msgid "The printer is now connected."
msgstr ""
-#: backend/usb-darwin.c:1286
+#: backend/usb-darwin.c:1342
msgid "The printer is now online."
msgstr ""
-#: backend/usb-darwin.c:1307
+#: backend/usb-darwin.c:1381
msgid "The printer is offline."
msgstr ""
-#: cups/localize.c:335
-msgid "The printer is running low on ink."
-msgstr ""
-
-#: cups/localize.c:313
-msgid "The printer is running low on toner."
-msgstr ""
-
-#: backend/ipp.c:766 backend/lpd.c:838 backend/socket.c:381
+#: backend/ipp.c:822 backend/lpd.c:829 backend/socket.c:372
msgid "The printer is unreachable at this time."
msgstr ""
-#: cups/localize.c:337
+#: cups/localize.c:322
msgid "The printer may be out of ink."
msgstr ""
-#: cups/localize.c:315
+#: cups/localize.c:300
msgid "The printer may be out of toner."
msgstr ""
-#: backend/ipp.c:760 backend/lpd.c:832 backend/socket.c:375
+#: backend/ipp.c:816 backend/lpd.c:823 backend/socket.c:366
msgid "The printer may not exist or is unavailable at this time."
msgstr ""
-#: cgi-bin/admin.c:931
+#: cgi-bin/admin.c:908
msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
msgstr ""
-#: scheduler/ipp.c:876 scheduler/ipp.c:1136 scheduler/ipp.c:3313
-#: scheduler/ipp.c:3484 scheduler/ipp.c:5216 scheduler/ipp.c:5602
-#: scheduler/ipp.c:5916 scheduler/ipp.c:6474 scheduler/ipp.c:7239
-#: scheduler/ipp.c:7295 scheduler/ipp.c:7609 scheduler/ipp.c:7875
-#: scheduler/ipp.c:7964 scheduler/ipp.c:7997 scheduler/ipp.c:8320
-#: scheduler/ipp.c:8713 scheduler/ipp.c:8794 scheduler/ipp.c:9961
-#: scheduler/ipp.c:10415 scheduler/ipp.c:10745 scheduler/ipp.c:10827
-#: scheduler/ipp.c:11201
+#: scheduler/ipp.c:787 scheduler/ipp.c:1055 scheduler/ipp.c:3194
+#: scheduler/ipp.c:3375 scheduler/ipp.c:5173 scheduler/ipp.c:5340
+#: scheduler/ipp.c:5654 scheduler/ipp.c:6223 scheduler/ipp.c:7032
+#: scheduler/ipp.c:7088 scheduler/ipp.c:7408 scheduler/ipp.c:7674
+#: scheduler/ipp.c:7763 scheduler/ipp.c:7796 scheduler/ipp.c:8120
+#: scheduler/ipp.c:8527 scheduler/ipp.c:8609 scheduler/ipp.c:9781
+#: scheduler/ipp.c:10233 scheduler/ipp.c:10584 scheduler/ipp.c:10666
+#: scheduler/ipp.c:11041
msgid "The printer or class does not exist."
msgstr ""
-#: scheduler/ipp.c:1319
+#: scheduler/ipp.c:1255
msgid "The printer or class is not shared."
msgstr ""
-#: cups/localize.c:317
+#: cups/localize.c:302
msgid "The printer's cover is open."
msgstr ""
-#: cups/localize.c:321
+#: cups/localize.c:306
msgid "The printer's door is open."
msgstr ""
-#: cups/localize.c:319
+#: cups/localize.c:304
msgid "The printer's interlock is open."
msgstr ""
-#: cups/localize.c:339
+#: cups/localize.c:324
msgid "The printer's waste bin is almost full."
msgstr ""
-#: cups/localize.c:341
+#: cups/localize.c:326
msgid "The printer's waste bin is full."
msgstr ""
-#: scheduler/ipp.c:982 scheduler/ipp.c:2359
+#: scheduler/ipp.c:893 scheduler/ipp.c:2230
#, c-format
msgid "The printer-uri \"%s\" contains invalid characters."
msgstr ""
-#: scheduler/ipp.c:3290
+#: scheduler/ipp.c:3171
msgid "The printer-uri attribute is required."
msgstr ""
-#: scheduler/ipp.c:966
+#: scheduler/ipp.c:877
msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
msgstr ""
-#: scheduler/ipp.c:2343
+#: scheduler/ipp.c:2214
msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
msgstr ""
-#: cgi-bin/admin.c:474
+#: cgi-bin/admin.c:450
msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
msgstr ""
-#: scheduler/client.c:2458
+#: scheduler/client.c:2249
msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it."
msgstr ""
-#: scheduler/ipp.c:6569
+#: scheduler/ipp.c:6321
#, c-format
msgid "The which-jobs value \"%s\" is not supported."
msgstr ""
-#: scheduler/ipp.c:5846
+#: scheduler/ipp.c:5584
msgid "There are too many subscriptions."
msgstr ""
-#: cups/localize.c:308
-msgid "There is a paper jam."
-msgstr ""
-
-#: backend/usb-darwin.c:379 backend/usb-darwin.c:438 backend/usb-darwin.c:505
-#: backend/usb-darwin.c:526 backend/usb-libusb.c:384 backend/usb-libusb.c:438
+#: backend/usb-darwin.c:398 backend/usb-darwin.c:457 backend/usb-darwin.c:526
+#: backend/usb-darwin.c:547 backend/usb-libusb.c:271 backend/usb-libusb.c:325
msgid "There was an unrecoverable USB error."
msgstr ""
-#: ppdc/sample.c:435
+#: ppdc/sample.c:430
msgid "Thermal Transfer Media"
msgstr ""
-#: scheduler/ipp.c:1543
+#: scheduler/ipp.c:1495
msgid "Too many active jobs."
msgstr ""
-#: scheduler/ipp.c:1437
+#: scheduler/ipp.c:1389
#, c-format
msgid "Too many job-sheets values (%d > 2)."
msgstr ""
-#: scheduler/ipp.c:2644
+#: scheduler/ipp.c:2524
#, c-format
msgid "Too many printer-state-reasons values (%d > %d)."
msgstr ""
-#: ppdc/sample.c:289
+#: ppdc/sample.c:284
msgid "Transparency"
msgstr ""
-#: ppdc/sample.c:284
+#: ppdc/sample.c:279
msgid "Tray"
msgstr ""
-#: ppdc/sample.c:264
+#: ppdc/sample.c:256
msgid "Tray 1"
msgstr ""
-#: ppdc/sample.c:265
+#: ppdc/sample.c:257
msgid "Tray 2"
msgstr ""
-#: ppdc/sample.c:266
+#: ppdc/sample.c:258
msgid "Tray 3"
msgstr ""
-#: ppdc/sample.c:267
+#: ppdc/sample.c:259
msgid "Tray 4"
msgstr ""
-#: cups/http-support.c:1376
+#: cups/http-support.c:1378
msgid "URI Too Long"
msgstr ""
+#: cups/http-support.c:1453
+msgid "URI too large"
+msgstr ""
+
#: ppdc/sample.c:138
msgid "US Ledger"
msgstr ""
@@ -5051,7 +5618,7 @@ msgstr ""
msgid "US Letter Small"
msgstr ""
-#: cgi-bin/admin.c:1959 cgi-bin/admin.c:1972 cgi-bin/admin.c:1996
+#: cgi-bin/admin.c:1945 cgi-bin/admin.c:1958 cgi-bin/admin.c:1982
msgid "Unable to access cupsd.conf file"
msgstr ""
@@ -5059,221 +5626,231 @@ msgstr ""
msgid "Unable to access help file."
msgstr ""
-#: cgi-bin/admin.c:526
+#: cgi-bin/admin.c:502
msgid "Unable to add RSS subscription"
msgstr ""
-#: cgi-bin/admin.c:814
+#: cgi-bin/admin.c:790
msgid "Unable to add class"
msgstr ""
-#: backend/ipp.c:1677
+#: backend/ipp.c:1808
msgid "Unable to add document to print job."
msgstr ""
-#: scheduler/ipp.c:1646
+#: scheduler/ipp.c:1553
#, c-format
msgid "Unable to add job for destination \"%s\"."
msgstr ""
-#: cgi-bin/admin.c:1059 cgi-bin/admin.c:1419
+#: cgi-bin/admin.c:1036 cgi-bin/admin.c:1405
msgid "Unable to add printer"
msgstr ""
-#: scheduler/ipp.c:1246
+#: scheduler/ipp.c:1173
msgid "Unable to allocate memory for file types."
msgstr ""
-#: filter/pstops.c:451
+#: filter/pstops.c:423
msgid "Unable to allocate memory for page info"
msgstr ""
-#: filter/pstops.c:445
+#: filter/pstops.c:417
msgid "Unable to allocate memory for pages array"
msgstr ""
-#: cgi-bin/admin.c:1525
+#: cgi-bin/admin.c:1511
msgid "Unable to cancel RSS subscription"
msgstr ""
-#: backend/ipp.c:2048
+#: backend/ipp.c:2085 backend/ipp.c:2533
msgid "Unable to cancel print job."
msgstr ""
-#: cgi-bin/admin.c:2990
+#: cgi-bin/admin.c:2976
msgid "Unable to change printer"
msgstr ""
-#: cgi-bin/admin.c:3906
+#: cgi-bin/admin.c:3892
msgid "Unable to change printer-is-shared attribute"
msgstr ""
-#: cgi-bin/admin.c:1657 cgi-bin/admin.c:1799
+#: cgi-bin/admin.c:1643 cgi-bin/admin.c:1785
msgid "Unable to change server settings"
msgstr ""
-#: filter/commandtops.c:420
+#: cups/ipp.c:5389
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr ""
+
+#: cups/ipp.c:5335
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
+#: filter/commandtops.c:407
msgid "Unable to configure printer options."
msgstr ""
-#: cups/adminutil.c:911 cups/request.c:1041
+#: cups/adminutil.c:900 cups/request.c:1066
msgid "Unable to connect to host."
msgstr ""
-#: backend/ipp.c:729 backend/ipp.c:1166 backend/lpd.c:804 backend/socket.c:347
-#: backend/usb-unix.c:117
+#: backend/ipp.c:785 backend/ipp.c:1258 backend/lpd.c:795 backend/socket.c:338
+#: backend/usb-unix.c:110
msgid "Unable to contact printer, queuing on next printer in class."
msgstr ""
-#: cups/adminutil.c:726
+#: cups/adminutil.c:715
#, c-format
msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:691
+#: cups/adminutil.c:680
#, c-format
msgid "Unable to copy 64-bit Windows printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:522
+#: cups/adminutil.c:511
#, c-format
msgid "Unable to copy CUPS printer driver files (%d)."
msgstr ""
-#: scheduler/ipp.c:2764
+#: scheduler/ipp.c:2644
#, c-format
msgid "Unable to copy PPD file - %s"
msgstr ""
-#: scheduler/ipp.c:2819
+#: scheduler/ipp.c:2699
msgid "Unable to copy PPD file."
msgstr ""
-#: cups/adminutil.c:487
+#: cups/adminutil.c:476
#, c-format
msgid "Unable to copy Windows 2000 printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:610
+#: cups/adminutil.c:599
#, c-format
msgid "Unable to copy Windows 9x printer driver files (%d)."
msgstr ""
-#: scheduler/ipp.c:2741
+#: scheduler/ipp.c:2621
#, c-format
msgid "Unable to copy interface script - %s"
msgstr ""
-#: backend/ipp.c:2137
-msgid "Unable to create compressed print file"
+#: cups/util.c:496 cups/util.c:1479
+msgid "Unable to create printer-uri"
msgstr ""
-#: cups/util.c:602 cups/util.c:1663
-msgid "Unable to create printer-uri"
+#: cups/tls-darwin.c:1291 cups/tls-gnutls.c:1181
+msgid "Unable to create server credentials."
msgstr ""
-#: cgi-bin/admin.c:1850 cgi-bin/admin.c:1862 scheduler/cupsfilter.c:1239
+#: cgi-bin/admin.c:1836 cgi-bin/admin.c:1848 scheduler/cupsfilter.c:1290
msgid "Unable to create temporary file"
msgstr ""
-#: cgi-bin/admin.c:2153
+#: cgi-bin/admin.c:2139
msgid "Unable to delete class"
msgstr ""
-#: cgi-bin/admin.c:2238
+#: cgi-bin/admin.c:2224
msgid "Unable to delete printer"
msgstr ""
-#: cgi-bin/classes.c:260 cgi-bin/printers.c:269
+#: cgi-bin/classes.c:252 cgi-bin/printers.c:261
msgid "Unable to do maintenance command"
msgstr ""
-#: cgi-bin/admin.c:1974
+#: cgi-bin/admin.c:1960
msgid "Unable to edit cupsd.conf files larger than 1MB"
msgstr ""
-#: cups/http.c:4261
+#: cups/tls-darwin.c:1459
msgid "Unable to establish a secure connection to host (certificate chain invalid)."
msgstr ""
-#: cups/http.c:4251
+#: cups/tls-darwin.c:1449
msgid "Unable to establish a secure connection to host (certificate not yet valid)."
msgstr ""
-#: cups/http.c:4246
+#: cups/tls-darwin.c:1444
msgid "Unable to establish a secure connection to host (expired certificate)."
msgstr ""
-#: cups/http.c:4256
+#: cups/tls-darwin.c:1454
msgid "Unable to establish a secure connection to host (host name mismatch)."
msgstr ""
-#: cups/http.c:4266
+#: cups/tls-darwin.c:1464
msgid "Unable to establish a secure connection to host (peer dropped connection before responding)."
msgstr ""
-#: cups/http.c:4241
+#: cups/tls-darwin.c:1439
msgid "Unable to establish a secure connection to host (self-signed certificate)."
msgstr ""
-#: cups/http.c:4236
+#: cups/tls-darwin.c:1434
msgid "Unable to establish a secure connection to host (untrusted certificate)."
msgstr ""
-#: cups/http.c:3995 cups/http.c:4293 cups/http.c:4326 cups/http.c:4343
+#: cups/tls-darwin.c:1491 cups/tls-sspi.c:1279 cups/tls-sspi.c:1296
msgid "Unable to establish a secure connection to host."
msgstr ""
-#: cgi-bin/ipp-var.c:365
+#: cgi-bin/ipp-var.c:353
msgid "Unable to find destination for job"
msgstr ""
-#: cups/http-support.c:1810
+#: cups/http-support.c:1949
msgid "Unable to find printer."
msgstr ""
-#: backend/ipp.c:2159
-msgid "Unable to generate compressed print file"
+#: cups/tls-darwin.c:1305
+msgid "Unable to find server credentials."
msgstr ""
-#: backend/ipp.c:3122
+#: backend/ipp.c:3221
msgid "Unable to get backend exit status."
msgstr ""
-#: cgi-bin/classes.c:450
+#: cgi-bin/classes.c:442
msgid "Unable to get class list"
msgstr ""
-#: cgi-bin/classes.c:549
+#: cgi-bin/classes.c:541
msgid "Unable to get class status"
msgstr ""
-#: cgi-bin/admin.c:1320
+#: cgi-bin/admin.c:1299
msgid "Unable to get list of printer drivers"
msgstr ""
-#: cgi-bin/admin.c:2840
+#: cgi-bin/admin.c:2826
msgid "Unable to get printer attributes"
msgstr ""
-#: cgi-bin/printers.c:467
+#: cgi-bin/printers.c:459
msgid "Unable to get printer list"
msgstr ""
-#: cgi-bin/printers.c:569
+#: cgi-bin/printers.c:561
msgid "Unable to get printer status"
msgstr ""
-#: backend/ipp.c:949
+#: backend/ipp.c:1009
msgid "Unable to get printer status."
msgstr ""
-#: cups/adminutil.c:565 cups/adminutil.c:769
+#: cups/adminutil.c:554 cups/adminutil.c:758
#, c-format
msgid "Unable to install Windows 2000 printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:639
+#: cups/adminutil.c:628
#, c-format
msgid "Unable to install Windows 9x printer driver files (%d)."
msgstr ""
@@ -5282,49 +5859,45 @@ msgstr ""
msgid "Unable to load help index."
msgstr ""
-#: backend/ipp.c:655 backend/lpd.c:435 backend/socket.c:286
+#: backend/ipp.c:672 backend/lpd.c:426 backend/socket.c:277
#, c-format
msgid "Unable to locate printer \"%s\"."
msgstr ""
-#: backend/dnssd.c:781 backend/ipp.c:327 backend/lpd.c:205
-#: backend/socket.c:172
+#: backend/dnssd.c:787 backend/ipp.c:340 backend/lpd.c:196
+#: backend/socket.c:163
msgid "Unable to locate printer."
msgstr ""
-#: cgi-bin/admin.c:813
+#: cgi-bin/admin.c:789
msgid "Unable to modify class"
msgstr ""
-#: cgi-bin/admin.c:1058 cgi-bin/admin.c:1418
+#: cgi-bin/admin.c:1035 cgi-bin/admin.c:1404
msgid "Unable to modify printer"
msgstr ""
-#: cgi-bin/ipp-var.c:432 cgi-bin/ipp-var.c:521
+#: cgi-bin/ipp-var.c:420 cgi-bin/ipp-var.c:509
msgid "Unable to move job"
msgstr ""
-#: cgi-bin/ipp-var.c:434 cgi-bin/ipp-var.c:523
+#: cgi-bin/ipp-var.c:422 cgi-bin/ipp-var.c:511
msgid "Unable to move jobs"
msgstr ""
-#: cgi-bin/admin.c:3186 cups/ppd.c:339
+#: cgi-bin/admin.c:3172 cups/ppd.c:297
msgid "Unable to open PPD file"
msgstr ""
-#: backend/ipp.c:2143
-msgid "Unable to open compressed print file"
-msgstr ""
-
-#: cgi-bin/admin.c:2608
+#: cgi-bin/admin.c:2594
msgid "Unable to open cupsd.conf file:"
msgstr ""
-#: backend/usb-unix.c:141
+#: backend/usb-unix.c:134
msgid "Unable to open device file"
msgstr ""
-#: scheduler/ipp.c:6255
+#: scheduler/ipp.c:5999
#, c-format
msgid "Unable to open document #%d in job #%d."
msgstr ""
@@ -5333,226 +5906,242 @@ msgstr ""
msgid "Unable to open help file."
msgstr ""
-#: backend/ipp.c:368 backend/ipp.c:1437 backend/ipp.c:1636 backend/ipp.c:2149
-#: backend/lpd.c:505 backend/socket.c:159 backend/usb.c:237
-#: filter/gziptoany.c:71 filter/pstops.c:300
+#: backend/ipp.c:382 backend/ipp.c:1554 backend/ipp.c:1763 backend/lpd.c:496
+#: backend/socket.c:150 backend/usb.c:237 filter/gziptoany.c:73
+#: filter/pstops.c:270
msgid "Unable to open print file"
msgstr ""
-#: filter/rastertoepson.c:998 filter/rastertohp.c:724
-#: filter/rastertolabel.c:1147
+#: filter/rastertoepson.c:995 filter/rastertohp.c:713
+#: filter/rastertolabel.c:1133
msgid "Unable to open raster file"
msgstr ""
-#: cgi-bin/ipp-var.c:795
+#: cgi-bin/ipp-var.c:783
msgid "Unable to print test page"
msgstr ""
-#: backend/runloop.c:96 backend/runloop.c:325 backend/usb-darwin.c:613
-#: backend/usb-darwin.c:657 backend/usb-libusb.c:529 backend/usb-libusb.c:564
+#: backend/runloop.c:85 backend/runloop.c:314 backend/usb-darwin.c:634
+#: backend/usb-darwin.c:678 backend/usb-libusb.c:416 backend/usb-libusb.c:451
msgid "Unable to read print data."
msgstr ""
-#: cups/dest.c:3389
-msgid "Unable to resolve printer URI."
+#: scheduler/ipp.c:8279 scheduler/ipp.c:9520
+msgid "Unable to rename job document file."
+msgstr ""
+
+#: cups/dest.c:3446
+msgid "Unable to resolve printer-uri."
msgstr ""
-#: cups/adminutil.c:2088
+#: cups/adminutil.c:2077
#, c-format
msgid "Unable to run \"%s\": %s"
msgstr ""
-#: filter/pstops.c:563
+#: filter/pstops.c:535
msgid "Unable to see in file"
msgstr ""
-#: cgi-bin/ipp-var.c:598 cgi-bin/ipp-var.c:618
+#: cgi-bin/ipp-var.c:586 cgi-bin/ipp-var.c:606
msgid "Unable to send command to printer driver"
msgstr ""
-#: backend/usb-darwin.c:735 backend/usb-libusb.c:640
+#: backend/usb-darwin.c:756 backend/usb-libusb.c:527
msgid "Unable to send data to printer."
msgstr ""
-#: cups/adminutil.c:821
+#: cups/adminutil.c:810
#, c-format
msgid "Unable to set Windows printer driver (%d)."
msgstr ""
-#: cgi-bin/admin.c:3807
+#: cgi-bin/admin.c:3793
msgid "Unable to set options"
msgstr ""
-#: cgi-bin/admin.c:3077
+#: cgi-bin/admin.c:3063
msgid "Unable to set server default"
msgstr ""
-#: backend/ipp.c:2981 backend/ipp.c:3058 backend/ipp.c:3066
+#: backend/ipp.c:3080 backend/ipp.c:3157 backend/ipp.c:3165
msgid "Unable to start backend process."
msgstr ""
-#: cgi-bin/admin.c:1912
+#: cgi-bin/admin.c:1898
msgid "Unable to upload cupsd.conf file"
msgstr ""
-#: backend/usb-darwin.c:1985 backend/usb-darwin.c:2009
+#: backend/usb-darwin.c:2166 backend/usb-darwin.c:2190
msgid "Unable to use legacy USB class driver."
msgstr ""
-#: backend/runloop.c:125 backend/runloop.c:380
+#: backend/runloop.c:114 backend/runloop.c:369
msgid "Unable to write print data"
msgstr ""
-#: filter/gziptoany.c:90
+#: filter/gziptoany.c:92
#, c-format
msgid "Unable to write uncompressed print data: %s"
msgstr ""
-#: cups/http-support.c:1364
+#: cups/http-support.c:1366
msgid "Unauthorized"
msgstr ""
-#: cgi-bin/admin.c:3503
+#: cgi-bin/admin.c:3489
msgid "Units"
msgstr ""
-#: cups/http-support.c:1404 cups/ppd.c:366
+#: cups/http-support.c:1406 cups/http-support.c:1490 cups/ppd.c:324
msgid "Unknown"
msgstr ""
-#: filter/pstops.c:2213
+#: filter/pstops.c:2190
#, c-format
msgid "Unknown choice \"%s\" for option \"%s\"."
msgstr ""
-#: backend/ipp.c:510
+#: backend/ipp.c:524
#, c-format
msgid "Unknown encryption option value: \"%s\"."
msgstr ""
-#: backend/lpd.c:351
+#: backend/lpd.c:342
#, c-format
msgid "Unknown file order: \"%s\"."
msgstr ""
-#: backend/lpd.c:322
+#: backend/lpd.c:313
#, c-format
msgid "Unknown format character: \"%c\"."
msgstr ""
-#: cups/dest-options.c:769
+#: cups/dest-options.c:964
msgid "Unknown media size name."
msgstr ""
-#: backend/ipp.c:567
+#: backend/ipp.c:588
#, c-format
msgid "Unknown option \"%s\" with value \"%s\"."
msgstr ""
-#: filter/pstops.c:2196
+#: filter/pstops.c:2173
#, c-format
msgid "Unknown option \"%s\"."
msgstr ""
-#: backend/lpd.c:337
+#: backend/lpd.c:328
#, c-format
msgid "Unknown print mode: \"%s\"."
msgstr ""
-#: scheduler/ipp.c:10617
+#: scheduler/ipp.c:10455
#, c-format
msgid "Unknown printer-error-policy \"%s\"."
msgstr ""
-#: scheduler/ipp.c:10600
+#: scheduler/ipp.c:10438
#, c-format
msgid "Unknown printer-op-policy \"%s\"."
msgstr ""
-#: cups/http-addrlist.c:710
+#: cups/http.c:2309
+msgid "Unknown request method."
+msgstr ""
+
+#: cups/http.c:2329
+msgid "Unknown request version."
+msgstr ""
+
+#: cups/http-support.c:1483
+msgid "Unknown scheme in URI"
+msgstr ""
+
+#: cups/http-addrlist.c:737
msgid "Unknown service name."
msgstr ""
-#: backend/ipp.c:539
+#: backend/ipp.c:553
#, c-format
msgid "Unknown version option value: \"%s\"."
msgstr ""
-#: scheduler/ipp.c:11072
+#: scheduler/ipp.c:10912
#, c-format
msgid "Unsupported 'compression' value \"%s\"."
msgstr ""
-#: scheduler/ipp.c:11102
+#: scheduler/ipp.c:10942
#, c-format
msgid "Unsupported 'document-format' value \"%s\"."
msgstr ""
-#: scheduler/ipp.c:11177
+#: scheduler/ipp.c:11017
msgid "Unsupported 'job-name' value."
msgstr ""
-#: scheduler/ipp.c:402
+#: scheduler/ipp.c:329
#, c-format
msgid "Unsupported character set \"%s\"."
msgstr ""
-#: scheduler/ipp.c:8286 scheduler/ipp.c:9522
+#: scheduler/ipp.c:8086 scheduler/ipp.c:9332
#, c-format
msgid "Unsupported compression \"%s\"."
msgstr ""
-#: scheduler/ipp.c:8420 scheduler/ipp.c:9672
+#: scheduler/ipp.c:8222 scheduler/ipp.c:9485
#, c-format
msgid "Unsupported document-format \"%s\"."
msgstr ""
-#: scheduler/ipp.c:9655
+#: scheduler/ipp.c:9468
#, c-format
msgid "Unsupported document-format \"%s/%s\"."
msgstr ""
-#: scheduler/ipp.c:1403
+#: scheduler/ipp.c:1355
#, c-format
msgid "Unsupported format \"%s\"."
msgstr ""
-#: scheduler/ipp.c:1501
+#: scheduler/ipp.c:1453
msgid "Unsupported margins."
msgstr ""
-#: cups/pwg-media.c:529
+#: cups/pwg-media.c:549
msgid "Unsupported media value."
msgstr ""
-#: filter/pstops.c:2478
+#: filter/pstops.c:2455
#, c-format
msgid "Unsupported number-up value %d, using number-up=1."
msgstr ""
-#: filter/pstops.c:2512
+#: filter/pstops.c:2489
#, c-format
msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
msgstr ""
-#: filter/pstops.c:2563
+#: filter/pstops.c:2540
#, c-format
msgid "Unsupported page-border value %s, using page-border=none."
msgstr ""
-#: filter/rastertopwg.c:147 filter/rastertopwg.c:155 filter/rastertopwg.c:164
+#: filter/rastertopwg.c:139 filter/rastertopwg.c:147 filter/rastertopwg.c:156
msgid "Unsupported raster data."
msgstr ""
-#: cups/snmp.c:1112
+#: cups/snmp.c:1064
msgid "Unsupported value type"
msgstr ""
-#: cups/http-support.c:1379
+#: cups/http-support.c:1381
msgid "Upgrade Required"
msgstr ""
-#: systemv/lpadmin.c:668
+#: systemv/lpadmin.c:666
msgid ""
"Usage:\n"
"\n"
@@ -5564,10 +6153,10 @@ msgid ""
" [-u allow:user,user] [-u deny:user,user]"
msgstr ""
-#: backend/dnssd.c:241 backend/ipp.c:316 backend/lpd.c:192
-#: backend/socket.c:136 backend/usb.c:183 filter/commandtops.c:74
-#: filter/gziptoany.c:50 filter/pstops.c:264 monitor/bcp.c:62
-#: monitor/tbcp.c:61
+#: backend/dnssd.c:227 backend/ipp.c:329 backend/lpd.c:183
+#: backend/socket.c:127 backend/usb.c:183 filter/commandtops.c:63
+#: filter/gziptoany.c:46 filter/pstops.c:231 monitor/bcp.c:56
+#: monitor/tbcp.c:55
#, c-format
msgid "Usage: %s job-id user title copies options [file]"
msgstr ""
@@ -5580,23 +6169,39 @@ msgstr ""
msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
msgstr ""
-#: scheduler/main.c:2053
+#: scheduler/main.c:2176
msgid "Usage: cupsd [options]"
msgstr ""
-#: scheduler/cupsfilter.c:1432
-msgid "Usage: cupsfilter [ options ] filename"
+#: scheduler/cupsfilter.c:1481
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
msgstr ""
#: systemv/cupstestdsc.c:425
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
msgstr ""
-#: systemv/cupstestppd.c:3793
+#: systemv/cupstestppd.c:3857
msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
msgstr ""
-#: test/ipptool.c:4482
+#: test/ippdiscover.c:814
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+#: test/ippfind.c:2746
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+
+#: test/ipptool.c:4855
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr ""
@@ -5604,7 +6209,7 @@ msgstr ""
msgid "Usage: lpmove job/src dest"
msgstr ""
-#: systemv/lpoptions.c:553
+#: systemv/lpoptions.c:539
msgid ""
"Usage: lpoptions [-h server] [-E] -d printer\n"
" lpoptions [-h server] [-E] [-p printer] -l\n"
@@ -5612,26 +6217,15 @@ msgid ""
" lpoptions [-h server] [-E] -x printer"
msgstr ""
-#: systemv/lppasswd.c:476
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-#: systemv/lppasswd.c:479
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
-msgstr ""
-
-#: berkeley/lpq.c:675
+#: berkeley/lpq.c:637
msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
msgstr ""
-#: ppdc/ppdc.cxx:435
+#: ppdc/ppdc.cxx:430
msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
msgstr ""
-#: ppdc/ppdhtml.cxx:172
+#: ppdc/ppdhtml.cxx:177
msgid "Usage: ppdhtml [options] filename.drv >filename.html"
msgstr ""
@@ -5639,68 +6233,64 @@ msgstr ""
msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"
msgstr ""
-#: ppdc/ppdmerge.cxx:367
+#: ppdc/ppdmerge.cxx:361
msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"
msgstr ""
-#: ppdc/ppdpo.cxx:252
+#: ppdc/ppdpo.cxx:247
msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
msgstr ""
-#: backend/snmp.c:218
+#: backend/snmp.c:192
msgid "Usage: snmp [host-or-ip-address]"
msgstr ""
-#: cups/snmp.c:1064
+#: cups/snmp.c:1016
msgid "Value uses indefinite length"
msgstr ""
-#: cups/snmp.c:1049
+#: cups/snmp.c:1001
msgid "VarBind uses indefinite length"
msgstr ""
-#: cups/snmp.c:999
+#: cups/snmp.c:951
msgid "Version uses indefinite length"
msgstr ""
-#: backend/ipp.c:1774
+#: backend/ipp.c:1925
msgid "Waiting for job to complete."
msgstr ""
-#: backend/usb-darwin.c:457 backend/usb-libusb.c:336
+#: backend/usb-darwin.c:481 backend/usb-libusb.c:223
msgid "Waiting for printer to become available."
msgstr ""
-#: backend/socket.c:458
+#: backend/socket.c:440
msgid "Waiting for printer to finish."
msgstr ""
-#: cups/adminutil.c:793
+#: cups/adminutil.c:782
msgid "Warning, no Windows 2000 printer drivers are installed."
msgstr ""
-#: cups/http-support.c:1400
+#: cups/http-support.c:1402
msgid "Web Interface is Disabled"
msgstr ""
-#: cups/ppd.c:1947
+#: cups/ppd.c:1902
msgid "Yes"
msgstr ""
-#: scheduler/client.c:2445
+#: scheduler/client.c:2236
#, c-format
msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
msgstr ""
-#: systemv/lppasswd.c:254
-msgid "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number."
-msgstr ""
-
-#: ppdc/sample.c:439
+#: ppdc/sample.c:434
msgid "ZPL Label Printer"
msgstr ""
-#: ppdc/sample.c:362
+#: ppdc/sample.c:357
msgid "Zebra"
msgstr ""
@@ -5716,11 +6306,11 @@ msgstr ""
msgid "completed"
msgstr ""
-#: scheduler/ipp.c:6127
+#: scheduler/ipp.c:5871
msgid "cups-deviced failed to execute."
msgstr ""
-#: scheduler/ipp.c:6957 scheduler/ipp.c:7206
+#: scheduler/ipp.c:6750 scheduler/ipp.c:6999
msgid "cups-driverd failed to execute."
msgstr ""
@@ -5748,82 +6338,82 @@ msgstr ""
msgid "cupsctl: Unknown option \"-%c\""
msgstr ""
-#: scheduler/main.c:194
+#: scheduler/main.c:182
msgid "cupsd: Expected config filename after \"-c\" option."
msgstr ""
-#: scheduler/main.c:282
+#: scheduler/main.c:278
msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
msgstr ""
-#: scheduler/main.c:293
+#: scheduler/main.c:252
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
+#: scheduler/main.c:289
msgid "cupsd: Relative cups-files.conf filename not allowed."
msgstr ""
-#: scheduler/main.c:225 scheduler/main.c:232
+#: scheduler/main.c:213 scheduler/main.c:220
msgid "cupsd: Unable to get current directory."
msgstr ""
-#: scheduler/main.c:343 scheduler/main.c:352
+#: scheduler/main.c:338 scheduler/main.c:347
msgid "cupsd: Unable to get path to cups-files.conf file."
msgstr ""
-#: scheduler/main.c:322
+#: scheduler/main.c:320
#, c-format
msgid "cupsd: Unknown argument \"%s\" - aborting."
msgstr ""
-#: scheduler/main.c:315
+#: scheduler/main.c:313
#, c-format
msgid "cupsd: Unknown option \"%c\" - aborting."
msgstr ""
-#: scheduler/main.c:259
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-
-#: scheduler/cupsfilter.c:1212
+#: scheduler/cupsfilter.c:1263
#, c-format
msgid "cupsfilter: Invalid document number %d."
msgstr ""
-#: scheduler/cupsfilter.c:1206
+#: scheduler/cupsfilter.c:1257
#, c-format
msgid "cupsfilter: Invalid job ID %d."
msgstr ""
-#: scheduler/cupsfilter.c:358
+#: scheduler/cupsfilter.c:348
msgid "cupsfilter: Only one filename can be specified."
msgstr ""
-#: scheduler/cupsfilter.c:1254
+#: scheduler/cupsfilter.c:1305
#, c-format
msgid "cupsfilter: Unable to get job file - %s"
msgstr ""
-#: systemv/cupstestppd.c:261
+#: systemv/cupstestppd.c:241
msgid "cupstestppd: The -q option is incompatible with the -v option."
msgstr ""
-#: systemv/cupstestppd.c:277
+#: systemv/cupstestppd.c:257
msgid "cupstestppd: The -v option is incompatible with the -q option."
msgstr ""
-#: systemv/lpstat.c:1335 systemv/lpstat.c:1338 systemv/lpstat.c:1341
+#: systemv/lpstat.c:1232 systemv/lpstat.c:1235 systemv/lpstat.c:1238
#, c-format
msgid "device for %s/%s: %s"
msgstr ""
-#: systemv/lpstat.c:1322 systemv/lpstat.c:1325 systemv/lpstat.c:1328
+#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224
#, c-format
msgid "device for %s: %s"
msgstr ""
-#: cups/snmp.c:1036
+#: cups/snmp.c:988
msgid "error-index uses indefinite length"
msgstr ""
-#: cups/snmp.c:1028
+#: cups/snmp.c:980
msgid "error-status uses indefinite length"
msgstr ""
@@ -5831,7 +6421,7 @@ msgstr ""
msgid "held"
msgstr ""
-#: berkeley/lpc.c:209
+#: berkeley/lpc.c:201
msgid "help\t\tGet help on commands."
msgstr ""
@@ -5839,211 +6429,302 @@ msgstr ""
msgid "idle"
msgstr ""
-#: test/ipptool.c:376 test/ipptool.c:518 test/ipptool.c:542
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#: test/ippfind.c:2465
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+#: test/ippfind.c:328
+msgid "ippfind: Cannot use --and after --or."
msgstr ""
-#: test/ipptool.c:600
+#: test/ippfind.c:601
#, c-format
-msgid "ipptool: Bad URI - %s."
+msgid "ippfind: Expected key name after %s."
+msgstr ""
+
+#: test/ippfind.c:551 test/ippfind.c:734
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr ""
+
+#: test/ippfind.c:361
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr ""
+
+#: test/ippfind.c:378
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr ""
+
+#: test/ippfind.c:1965
+msgid "ippfind: Missing close brace in substitution."
+msgstr ""
+
+#: test/ippfind.c:1053
+msgid "ippfind: Missing close parenthesis."
+msgstr ""
+
+#: test/ippfind.c:335
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr ""
+
+#: test/ippfind.c:448
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr ""
+
+#: test/ippfind.c:871
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr ""
+
+#: test/ippfind.c:1024
+msgid "ippfind: Missing open parenthesis."
+msgstr ""
+
+#: test/ippfind.c:901
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr ""
+
+#: test/ippfind.c:347 test/ippfind.c:401 test/ippfind.c:430 test/ippfind.c:536
+#: test/ippfind.c:618 test/ippfind.c:633 test/ippfind.c:788 test/ippfind.c:803
+#: test/ippfind.c:826 test/ippfind.c:886
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr ""
+
+#: test/ippfind.c:919
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr ""
+
+#: test/ippfind.c:1912 test/ippfind.c:1937
+msgid "ippfind: Out of memory."
msgstr ""
-#: test/ipptool.c:365
+#: test/ippfind.c:997
+msgid "ippfind: Too many parenthesis."
+msgstr ""
+
+#: test/ippfind.c:1266 test/ippfind.c:1402 test/ippfind.c:2557
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr ""
+
+#: test/ippfind.c:2035 test/ippfind.c:2062
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr ""
+
+#: test/ippfind.c:1143 test/ippfind.c:1151 test/ippfind.c:1162
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
+msgid "ippfind: Unable to use Bonjour: %s"
msgstr ""
-#: test/ipptool.c:511
+#: test/ippfind.c:1994
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr ""
+
+#: test/ipptool.c:329 test/ipptool.c:392 test/ipptool.c:547 test/ipptool.c:570
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+
+#: test/ipptool.c:626
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr ""
+
+#: test/ipptool.c:540
msgid "ipptool: Invalid seconds for \"-i\"."
msgstr ""
-#: test/ipptool.c:581
+#: test/ipptool.c:607
msgid "ipptool: May only specify a single URI."
msgstr ""
-#: test/ipptool.c:534
+#: test/ipptool.c:562
msgid "ipptool: Missing count for \"-n\"."
msgstr ""
-#: test/ipptool.c:411
+#: test/ipptool.c:426
msgid "ipptool: Missing filename for \"-f\"."
msgstr ""
-#: test/ipptool.c:392
+#: test/ipptool.c:407
msgid "ipptool: Missing name=value for \"-d\"."
msgstr ""
-#: test/ipptool.c:501
+#: test/ipptool.c:530
msgid "ipptool: Missing seconds for \"-i\"."
msgstr ""
-#: test/ipptool.c:335
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-#: test/ipptool.c:348
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
-
-#: test/ipptool.c:627
+#: test/ipptool.c:652
msgid "ipptool: URI required before test file."
msgstr ""
-#: test/ipptool.c:561
+#: test/ipptool.c:588
#, c-format
msgid "ipptool: Unknown option \"-%c\"."
msgstr ""
-#: scheduler/ipp.c:7953
+#: scheduler/ipp.c:7752
msgid "job-printer-uri attribute missing."
msgstr ""
-#: systemv/lpadmin.c:131 systemv/lpadmin.c:375
+#: systemv/lpadmin.c:123 systemv/lpadmin.c:364
msgid "lpadmin: Class name can only contain printable characters."
msgstr ""
-#: systemv/lpadmin.c:614
+#: systemv/lpadmin.c:601
msgid "lpadmin: Expected PPD after \"-P\" option."
msgstr ""
-#: systemv/lpadmin.c:457
+#: systemv/lpadmin.c:445
msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
msgstr ""
-#: systemv/lpadmin.c:364
+#: systemv/lpadmin.c:353
msgid "lpadmin: Expected class after \"-r\" option."
msgstr ""
-#: systemv/lpadmin.c:120
+#: systemv/lpadmin.c:112
msgid "lpadmin: Expected class name after \"-c\" option."
msgstr ""
-#: systemv/lpadmin.c:558
+#: systemv/lpadmin.c:545
msgid "lpadmin: Expected description after \"-D\" option."
msgstr ""
-#: systemv/lpadmin.c:491
+#: systemv/lpadmin.c:479
msgid "lpadmin: Expected device URI after \"-v\" option."
msgstr ""
-#: systemv/lpadmin.c:574
+#: systemv/lpadmin.c:561
msgid "lpadmin: Expected file type(s) after \"-I\" option."
msgstr ""
-#: systemv/lpadmin.c:202
+#: systemv/lpadmin.c:193
msgid "lpadmin: Expected hostname after \"-h\" option."
msgstr ""
-#: systemv/lpadmin.c:221
+#: systemv/lpadmin.c:212
msgid "lpadmin: Expected interface after \"-i\" option."
msgstr ""
-#: systemv/lpadmin.c:594
+#: systemv/lpadmin.c:581
msgid "lpadmin: Expected location after \"-L\" option."
msgstr ""
-#: systemv/lpadmin.c:274
+#: systemv/lpadmin.c:264
msgid "lpadmin: Expected model after \"-m\" option."
msgstr ""
-#: systemv/lpadmin.c:417
+#: systemv/lpadmin.c:405
msgid "lpadmin: Expected name after \"-R\" option."
msgstr ""
-#: systemv/lpadmin.c:294
+#: systemv/lpadmin.c:284
msgid "lpadmin: Expected name=value after \"-o\" option."
msgstr ""
-#: systemv/lpadmin.c:313
+#: systemv/lpadmin.c:303
msgid "lpadmin: Expected printer after \"-p\" option."
msgstr ""
-#: systemv/lpadmin.c:164
+#: systemv/lpadmin.c:155
msgid "lpadmin: Expected printer name after \"-d\" option."
msgstr ""
-#: systemv/lpadmin.c:525
+#: systemv/lpadmin.c:512
msgid "lpadmin: Expected printer or class after \"-x\" option."
msgstr ""
-#: systemv/lpadmin.c:975
+#: systemv/lpadmin.c:973
msgid "lpadmin: No member names were seen."
msgstr ""
-#: systemv/lpadmin.c:762
+#: systemv/lpadmin.c:760
#, c-format
msgid "lpadmin: Printer %s is already a member of class %s."
msgstr ""
-#: systemv/lpadmin.c:989
+#: systemv/lpadmin.c:987
#, c-format
msgid "lpadmin: Printer %s is not a member of class %s."
msgstr ""
-#: systemv/lpadmin.c:175 systemv/lpadmin.c:324 systemv/lpadmin.c:536
+#: systemv/lpadmin.c:166 systemv/lpadmin.c:314 systemv/lpadmin.c:523
msgid "lpadmin: Printer name can only contain printable characters."
msgstr ""
-#: systemv/lpadmin.c:105
+#: systemv/lpadmin.c:97
msgid ""
"lpadmin: Unable to add a printer to the class:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:96 systemv/lpadmin.c:149 systemv/lpadmin.c:253
-#: systemv/lpadmin.c:339 systemv/lpadmin.c:393 systemv/lpadmin.c:510
-#: systemv/lpadmin.c:647
+#: systemv/lpadmin.c:88 systemv/lpadmin.c:140 systemv/lpadmin.c:243
+#: systemv/lpadmin.c:328 systemv/lpadmin.c:381 systemv/lpadmin.c:497
+#: systemv/lpadmin.c:642
#, c-format
msgid "lpadmin: Unable to connect to server: %s"
msgstr ""
-#: systemv/lpadmin.c:1329
+#: systemv/lpadmin.c:1427
msgid "lpadmin: Unable to create temporary file"
msgstr ""
-#: systemv/lpadmin.c:402
+#: systemv/lpadmin.c:390
msgid ""
"lpadmin: Unable to delete option:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:1339
+#: systemv/lpadmin.c:1419
+#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#: systemv/lpadmin.c:1439
#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
msgstr ""
-#: systemv/lpadmin.c:348
+#: systemv/lpadmin.c:337
msgid ""
"lpadmin: Unable to remove a printer from the class:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:656
+#: systemv/lpadmin.c:651
msgid ""
"lpadmin: Unable to set the printer options:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:474
+#: systemv/lpadmin.c:462
#, c-format
msgid "lpadmin: Unknown allow/deny option \"%s\"."
msgstr ""
-#: systemv/lpadmin.c:629
+#: systemv/lpadmin.c:616
#, c-format
msgid "lpadmin: Unknown argument \"%s\"."
msgstr ""
-#: systemv/lpadmin.c:624
+#: systemv/lpadmin.c:611
#, c-format
msgid "lpadmin: Unknown option \"%c\"."
msgstr ""
-#: systemv/lpadmin.c:580
+#: systemv/lpadmin.c:567
msgid "lpadmin: Warning - content type list ignored."
msgstr ""
-#: berkeley/lpc.c:76 berkeley/lpc.c:104 berkeley/lpc.c:140
+#: berkeley/lpc.c:68 berkeley/lpc.c:96 berkeley/lpc.c:132
msgid "lpc> "
msgstr ""
@@ -6105,111 +6786,57 @@ msgstr ""
msgid "lpmove: Unknown option \"%c\"."
msgstr ""
-#: systemv/lpoptions.c:150 systemv/lpoptions.c:168 systemv/lpoptions.c:244
+#: systemv/lpoptions.c:143 systemv/lpoptions.c:161 systemv/lpoptions.c:237
msgid "lpoptions: No printers."
msgstr ""
-#: systemv/lpoptions.c:219
+#: systemv/lpoptions.c:212
#, c-format
msgid "lpoptions: Unable to add printer or instance: %s"
msgstr ""
-#: systemv/lpoptions.c:521
+#: systemv/lpoptions.c:507
#, c-format
msgid "lpoptions: Unable to get PPD file for %s: %s"
msgstr ""
-#: systemv/lpoptions.c:529
+#: systemv/lpoptions.c:515
#, c-format
msgid "lpoptions: Unable to open PPD file for %s."
msgstr ""
-#: systemv/lpoptions.c:99
+#: systemv/lpoptions.c:92
msgid "lpoptions: Unknown printer or class."
msgstr ""
-#: systemv/lppasswd.c:173
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-#: systemv/lppasswd.c:302
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-#: systemv/lppasswd.c:431
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-#: systemv/lppasswd.c:398
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-#: systemv/lppasswd.c:253
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-#: systemv/lppasswd.c:230
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#: systemv/lppasswd.c:199 systemv/lppasswd.c:218
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:304 systemv/lppasswd.c:312 systemv/lppasswd.c:329
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:364 systemv/lppasswd.c:377 systemv/lppasswd.c:408
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:446
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:458
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:389
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
-
-#: systemv/lpstat.c:1132
+#: systemv/lpstat.c:1074
#, c-format
msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"."
msgstr ""
-#: systemv/lpstat.c:1068
+#: systemv/lpstat.c:1010
#, c-format
msgid "members of class %s:"
msgstr ""
-#: berkeley/lpq.c:587
+#: berkeley/lpq.c:549
msgid "no entries"
msgstr ""
-#: systemv/lpstat.c:1136
+#: systemv/lpstat.c:1078
msgid "no system default destination"
msgstr ""
-#: scheduler/ipp.c:5817
+#: scheduler/ipp.c:5555
msgid "notify-events not specified."
msgstr ""
-#: scheduler/ipp.c:2132 scheduler/ipp.c:5722
+#: scheduler/ipp.c:2003 scheduler/ipp.c:5460
#, c-format
msgid "notify-recipient-uri URI \"%s\" is already used."
msgstr ""
-#: scheduler/ipp.c:2122 scheduler/ipp.c:5712
+#: scheduler/ipp.c:1993 scheduler/ipp.c:5450
#, c-format
msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
msgstr ""
@@ -6218,17 +6845,17 @@ msgstr ""
msgid "pending"
msgstr ""
-#: ppdc/ppdc.cxx:113 ppdc/ppdpo.cxx:93
+#: ppdc/ppdc.cxx:108 ppdc/ppdpo.cxx:87
#, c-format
msgid "ppdc: Adding include directory \"%s\"."
msgstr ""
-#: ppdc/ppdpo.cxx:134
+#: ppdc/ppdpo.cxx:130
#, c-format
msgid "ppdc: Adding/updating UI text from %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:410
+#: ppdc/ppdc-source.cxx:367
#, c-format
msgid "ppdc: Bad boolean value (%s) on line %d of %s."
msgstr ""
@@ -6238,375 +6865,375 @@ msgstr ""
msgid "ppdc: Bad font attribute: %s"
msgstr ""
-#: ppdc/ppdc-source.cxx:1796
+#: ppdc/ppdc-source.cxx:1753
#, c-format
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1113
+#: ppdc/ppdc-source.cxx:1070
#, c-format
msgid "ppdc: Bad status keyword %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2033
+#: ppdc/ppdc-source.cxx:1990
#, c-format
msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2719
+#: ppdc/ppdc-source.cxx:2675
#, c-format
msgid "ppdc: Choice found on line %d of %s with no Option."
msgstr ""
-#: ppdc/ppdc-source.cxx:1698
+#: ppdc/ppdc-source.cxx:1655
#, c-format
msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:932
+#: ppdc/ppdc-source.cxx:889
#, c-format
msgid "ppdc: Expected a filter definition on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:955
+#: ppdc/ppdc-source.cxx:912
#, c-format
msgid "ppdc: Expected a program name on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:394
+#: ppdc/ppdc-source.cxx:351
#, c-format
msgid "ppdc: Expected boolean value on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1093
+#: ppdc/ppdc-source.cxx:1050
#, c-format
msgid "ppdc: Expected charset after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:447
+#: ppdc/ppdc-source.cxx:404
#, c-format
msgid "ppdc: Expected choice code on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:435
+#: ppdc/ppdc-source.cxx:392
#, c-format
msgid "ppdc: Expected choice name/text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:503
+#: ppdc/ppdc-source.cxx:460
#, c-format
msgid "ppdc: Expected color order for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:492
+#: ppdc/ppdc-source.cxx:449
#, c-format
msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:514
+#: ppdc/ppdc-source.cxx:471
#, c-format
msgid "ppdc: Expected compression for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:695
+#: ppdc/ppdc-source.cxx:652
#, c-format
msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2905
+#: ppdc/ppdc-source.cxx:2861
#, c-format
msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:826
+#: ppdc/ppdc-source.cxx:783
#, c-format
msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1077
+#: ppdc/ppdc-source.cxx:1034
#, c-format
msgid "ppdc: Expected encoding after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1689
+#: ppdc/ppdc-source.cxx:1646
#, c-format
msgid "ppdc: Expected filename after #po %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1205
+#: ppdc/ppdc-source.cxx:1162
#, c-format
msgid "ppdc: Expected group name/text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2619
+#: ppdc/ppdc-source.cxx:2575
#, c-format
msgid "ppdc: Expected include filename on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1502
+#: ppdc/ppdc-source.cxx:1459
#, c-format
msgid "ppdc: Expected integer on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1681
+#: ppdc/ppdc-source.cxx:1638
#, c-format
msgid "ppdc: Expected locale after #po on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:353
+#: ppdc/ppdc-source.cxx:310
#, c-format
msgid "ppdc: Expected name after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3277
+#: ppdc/ppdc-source.cxx:3233
#, c-format
msgid "ppdc: Expected name after FileName on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1058
+#: ppdc/ppdc-source.cxx:1015
#, c-format
msgid "ppdc: Expected name after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3108
+#: ppdc/ppdc-source.cxx:3064
#, c-format
msgid "ppdc: Expected name after Manufacturer on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3141
+#: ppdc/ppdc-source.cxx:3097
#, c-format
msgid "ppdc: Expected name after MediaSize on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3231
+#: ppdc/ppdc-source.cxx:3187
#, c-format
msgid "ppdc: Expected name after ModelName on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3294
+#: ppdc/ppdc-source.cxx:3250
#, c-format
msgid "ppdc: Expected name after PCFileName on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1156
+#: ppdc/ppdc-source.cxx:1113
#, c-format
msgid "ppdc: Expected name/text after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1245
+#: ppdc/ppdc-source.cxx:1202
#, c-format
msgid "ppdc: Expected name/text after Installable on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1782
+#: ppdc/ppdc-source.cxx:1739
#, c-format
msgid "ppdc: Expected name/text after Resolution on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:479
+#: ppdc/ppdc-source.cxx:436
#, c-format
msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1574
+#: ppdc/ppdc-source.cxx:1531
#, c-format
msgid "ppdc: Expected option name/text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1608
+#: ppdc/ppdc-source.cxx:1565
#, c-format
msgid "ppdc: Expected option section on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1586
+#: ppdc/ppdc-source.cxx:1543
#, c-format
msgid "ppdc: Expected option type on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1765
+#: ppdc/ppdc-source.cxx:1722
#, c-format
msgid "ppdc: Expected override field after Resolution on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:341 ppdc/ppdc-catalog.cxx:353
+#: ppdc/ppdc-catalog.cxx:389 ppdc/ppdc-catalog.cxx:401
#, c-format
msgid "ppdc: Expected quoted string on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1004
+#: ppdc/ppdc-source.cxx:961
#, c-format
msgid "ppdc: Expected real number on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:572
+#: ppdc/ppdc-source.cxx:529
#, c-format
msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1863
+#: ppdc/ppdc-source.cxx:1820
#, c-format
msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:361
+#: ppdc/ppdc-source.cxx:318
#, c-format
msgid "ppdc: Expected selector after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1101
+#: ppdc/ppdc-source.cxx:1058
#, c-format
msgid "ppdc: Expected status after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2794
+#: ppdc/ppdc-source.cxx:2750
#, c-format
msgid "ppdc: Expected string after Copyright on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3397
+#: ppdc/ppdc-source.cxx:3353
#, c-format
msgid "ppdc: Expected string after Version on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:728
+#: ppdc/ppdc-source.cxx:685
#, c-format
msgid "ppdc: Expected two option names on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:372
+#: ppdc/ppdc-source.cxx:329
#, c-format
msgid "ppdc: Expected value after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1085
+#: ppdc/ppdc-source.cxx:1042
#, c-format
msgid "ppdc: Expected version after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:227
+#: ppdc/ppdc-source.cxx:184
#, c-format
msgid "ppdc: Invalid #include/#po filename \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:972
+#: ppdc/ppdc-source.cxx:929
#, c-format
msgid "ppdc: Invalid cost for filter on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:964
+#: ppdc/ppdc-source.cxx:921
#, c-format
msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:980
+#: ppdc/ppdc-source.cxx:937
#, c-format
msgid "ppdc: Invalid empty program name for filter on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1628
+#: ppdc/ppdc-source.cxx:1585
#, c-format
msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1600
+#: ppdc/ppdc-source.cxx:1557
#, c-format
msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:251 ppdc/ppdpo.cxx:123
+#: ppdc/ppdc.cxx:246 ppdc/ppdpo.cxx:117
#, c-format
msgid "ppdc: Loading driver information file \"%s\"."
msgstr ""
-#: ppdc/ppdc.cxx:187
+#: ppdc/ppdc.cxx:182
#, c-format
msgid "ppdc: Loading messages for locale \"%s\"."
msgstr ""
-#: ppdc/ppdc.cxx:126
+#: ppdc/ppdc.cxx:121
#, c-format
msgid "ppdc: Loading messages from \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:2412 ppdc/ppdc-source.cxx:2644
+#: ppdc/ppdc-source.cxx:2368 ppdc/ppdc-source.cxx:2600
#, c-format
msgid "ppdc: Missing #endif at end of \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:2513 ppdc/ppdc-source.cxx:2548
-#: ppdc/ppdc-source.cxx:2578
+#: ppdc/ppdc-source.cxx:2469 ppdc/ppdc-source.cxx:2504
+#: ppdc/ppdc-source.cxx:2534
#, c-format
msgid "ppdc: Missing #if on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:418
+#: ppdc/ppdc-catalog.cxx:466
#, c-format
msgid "ppdc: Need a msgid line before any translation strings on line %d of %s."
msgstr ""
-#: ppdc/ppdc-driver.cxx:730
+#: ppdc/ppdc-driver.cxx:712
#, c-format
msgid "ppdc: No message catalog provided for locale %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1651 ppdc/ppdc-source.cxx:2882
-#: ppdc/ppdc-source.cxx:2968 ppdc/ppdc-source.cxx:3061
-#: ppdc/ppdc-source.cxx:3194 ppdc/ppdc-source.cxx:3327
+#: ppdc/ppdc-source.cxx:1608 ppdc/ppdc-source.cxx:2838
+#: ppdc/ppdc-source.cxx:2924 ppdc/ppdc-source.cxx:3017
+#: ppdc/ppdc-source.cxx:3150 ppdc/ppdc-source.cxx:3283
#, c-format
msgid "ppdc: Option %s defined in two different groups on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1644
+#: ppdc/ppdc-source.cxx:1601
#, c-format
msgid "ppdc: Option %s redefined with a different type on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:705
+#: ppdc/ppdc-source.cxx:662
#, c-format
msgid "ppdc: Option constraint must *name on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2495
+#: ppdc/ppdc-source.cxx:2451
#, c-format
msgid "ppdc: Too many nested #if's on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:374
+#: ppdc/ppdc.cxx:369
#, c-format
msgid "ppdc: Unable to create PPD file \"%s\" - %s."
msgstr ""
-#: ppdc/ppdc.cxx:266
+#: ppdc/ppdc.cxx:261
#, c-format
msgid "ppdc: Unable to create output directory %s: %s"
msgstr ""
-#: ppdc/ppdc.cxx:287
+#: ppdc/ppdc.cxx:282
#, c-format
msgid "ppdc: Unable to create output pipes: %s"
msgstr ""
-#: ppdc/ppdc.cxx:303 ppdc/ppdc.cxx:309
+#: ppdc/ppdc.cxx:298 ppdc/ppdc.cxx:304
#, c-format
msgid "ppdc: Unable to execute cupstestppd: %s"
msgstr ""
-#: ppdc/ppdc-source.cxx:1730
+#: ppdc/ppdc-source.cxx:1687
#, c-format
msgid "ppdc: Unable to find #po file %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2651
+#: ppdc/ppdc-source.cxx:2607
#, c-format
msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:198
+#: ppdc/ppdc.cxx:193
#, c-format
msgid "ppdc: Unable to find localization for \"%s\" - %s"
msgstr ""
-#: ppdc/ppdc.cxx:135
+#: ppdc/ppdc.cxx:130
#, c-format
msgid "ppdc: Unable to load localization file \"%s\" - %s"
msgstr ""
@@ -6616,107 +7243,107 @@ msgstr ""
msgid "ppdc: Unable to open %s: %s"
msgstr ""
-#: ppdc/ppdc-source.cxx:2054
+#: ppdc/ppdc-source.cxx:2011
#, c-format
msgid "ppdc: Undefined variable (%s) on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:435
+#: ppdc/ppdc-catalog.cxx:483
#, c-format
msgid "ppdc: Unexpected text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2924
+#: ppdc/ppdc-source.cxx:2880
#, c-format
msgid "ppdc: Unknown driver type %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:906
+#: ppdc/ppdc-source.cxx:863
#, c-format
msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3154
+#: ppdc/ppdc-source.cxx:3110
#, c-format
msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:463
+#: ppdc/ppdc-catalog.cxx:511
#, c-format
msgid "ppdc: Unknown message catalog format for \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:3408
+#: ppdc/ppdc-source.cxx:3364
#, c-format
msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1014
+#: ppdc/ppdc-source.cxx:971
#, c-format
msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2164
+#: ppdc/ppdc-source.cxx:2121
#, c-format
msgid "ppdc: Unterminated string starting with %c on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:365
+#: ppdc/ppdc.cxx:360
#, c-format
msgid "ppdc: Warning - overlapping filename \"%s\"."
msgstr ""
-#: ppdc/ppdc.cxx:380
+#: ppdc/ppdc.cxx:375
#, c-format
msgid "ppdc: Writing %s."
msgstr ""
-#: ppdc/ppdc.cxx:148
+#: ppdc/ppdc.cxx:143
#, c-format
msgid "ppdc: Writing PPD files to directory \"%s\"."
msgstr ""
-#: ppdc/ppdmerge.cxx:136
+#: ppdc/ppdmerge.cxx:130
#, c-format
msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
msgstr ""
-#: ppdc/ppdmerge.cxx:176
+#: ppdc/ppdmerge.cxx:170
#, c-format
msgid "ppdmerge: Ignoring PPD file %s."
msgstr ""
-#: ppdc/ppdmerge.cxx:160
+#: ppdc/ppdmerge.cxx:154
#, c-format
msgid "ppdmerge: Unable to backup %s to %s - %s"
msgstr ""
-#: systemv/lpstat.c:1900
+#: systemv/lpstat.c:1777
#, c-format
msgid "printer %s disabled since %s -"
msgstr ""
-#: systemv/lpstat.c:1889
+#: systemv/lpstat.c:1766
#, c-format
msgid "printer %s is idle. enabled since %s"
msgstr ""
-#: systemv/lpstat.c:1894
+#: systemv/lpstat.c:1771
#, c-format
msgid "printer %s now printing %s-%d. enabled since %s"
msgstr ""
-#: systemv/lpstat.c:2025
+#: systemv/lpstat.c:1900
#, c-format
msgid "printer %s/%s disabled since %s -"
msgstr ""
-#: systemv/lpstat.c:2011
+#: systemv/lpstat.c:1886
#, c-format
msgid "printer %s/%s is idle. enabled since %s"
msgstr ""
-#: systemv/lpstat.c:2018
+#: systemv/lpstat.c:1893
#, c-format
msgid "printer %s/%s now printing %s-%d. enabled since %s"
msgstr ""
@@ -6725,29 +7352,29 @@ msgstr ""
msgid "processing"
msgstr ""
-#: systemv/lp.c:668
+#: systemv/lp.c:662
#, c-format
msgid "request id is %s-%d (%d file(s))"
msgstr ""
-#: cups/snmp.c:1020
+#: cups/snmp.c:972
msgid "request-id uses indefinite length"
msgstr ""
-#: systemv/lpstat.c:2159
+#: systemv/lpstat.c:2032
msgid "scheduler is not running"
msgstr ""
-#: systemv/lpstat.c:2155
+#: systemv/lpstat.c:2028
msgid "scheduler is running"
msgstr ""
-#: cups/adminutil.c:2159
+#: cups/adminutil.c:2148
#, c-format
msgid "stat of %s failed: %s"
msgstr ""
-#: berkeley/lpc.c:211
+#: berkeley/lpc.c:203
msgid "status\t\tShow status of daemon and queue."
msgstr ""
@@ -6755,12 +7382,12 @@ msgstr ""
msgid "stopped"
msgstr ""
-#: systemv/lpstat.c:1110
+#: systemv/lpstat.c:1052
#, c-format
msgid "system default destination: %s"
msgstr ""
-#: systemv/lpstat.c:1107
+#: systemv/lpstat.c:1049
#, c-format
msgid "system default destination: %s/%s"
msgstr ""
@@ -6773,7 +7400,7 @@ msgstr ""
msgid "untitled"
msgstr ""
-#: cups/snmp.c:1045
+#: cups/snmp.c:997
msgid "variable-bindings uses indefinite length"
msgstr ""
diff --git a/locale/cups.strings b/locale/cups.strings
index c0ad8a5..efe899f 100644
--- a/locale/cups.strings
+++ b/locale/cups.strings
@@ -81,39 +81,39 @@
" cupsaddsmb [options] -a" = " cupsaddsmb [options] -a";
" cupstestdsc [options] -" = " cupstestdsc [options] -";
" program | cupstestppd [options] -" = " program | cupstestppd [options] -";
-" %s \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")." = " %s \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\").";
+" %s \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")." = " %s “%s %s†conflicts with “%s %sâ€\n (constraint=“%s %s %s %sâ€).";
" %s %s %s does not exist." = " %s %s %s does not exist.";
-" %s %s file \"%s\" has the wrong capitalization." = " %s %s file \"%s\" has the wrong capitalization.";
+" %s %s file \"%s\" has the wrong capitalization." = " %s %s file “%s†has the wrong capitalization.";
" %s Bad %s choice %s.\n REF: Page 122, section 5.17" = " %s Bad %s choice %s.\n REF: Page 122, section 5.17";
-" %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." = " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s.";
-" %s Bad UTF-8 \"%s\" translation string for option %s." = " %s Bad UTF-8 \"%s\" translation string for option %s.";
-" %s Bad cupsFilter value \"%s\"." = " %s Bad cupsFilter value \"%s\".";
-" %s Bad cupsFilter2 value \"%s\"." = " %s Bad cupsFilter2 value \"%s\".";
+" %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." = " %s Bad UTF-8 “%s†translation string for option %s, choice %s.";
+" %s Bad UTF-8 \"%s\" translation string for option %s." = " %s Bad UTF-8 “%s†translation string for option %s.";
+" %s Bad cupsFilter value \"%s\"." = " %s Bad cupsFilter value “%sâ€.";
+" %s Bad cupsFilter2 value \"%s\"." = " %s Bad cupsFilter2 value “%sâ€.";
" %s Bad cupsICCProfile %s." = " %s Bad cupsICCProfile %s.";
-" %s Bad cupsPreFilter value \"%s\"." = " %s Bad cupsPreFilter value \"%s\".";
-" %s Bad cupsUIConstraints %s: \"%s\"" = " %s Bad cupsUIConstraints %s: \"%s\"";
-" %s Bad language \"%s\"." = " %s Bad language \"%s\".";
-" %s Bad permissions on %s file \"%s\"." = " %s Bad permissions on %s file \"%s\".";
+" %s Bad cupsPreFilter value \"%s\"." = " %s Bad cupsPreFilter value “%sâ€.";
+" %s Bad cupsUIConstraints %s: \"%s\"" = " %s Bad cupsUIConstraints %s: “%sâ€";
+" %s Bad language \"%s\"." = " %s Bad language “%sâ€.";
+" %s Bad permissions on %s file \"%s\"." = " %s Bad permissions on %s file “%sâ€.";
" %s Bad spelling of %s - should be %s." = " %s Bad spelling of %s - should be %s.";
" %s Cannot provide both APScanAppPath and APScanAppBundleID." = " %s Cannot provide both APScanAppPath and APScanAppBundleID.";
" %s Default choices conflicting." = " %s Default choices conflicting.";
" %s Empty cupsUIConstraints %s" = " %s Empty cupsUIConstraints %s";
-" %s Missing \"%s\" translation string for option %s, choice %s." = " %s Missing \"%s\" translation string for option %s, choice %s.";
-" %s Missing \"%s\" translation string for option %s." = " %s Missing \"%s\" translation string for option %s.";
-" %s Missing %s file \"%s\"." = " %s Missing %s file \"%s\".";
+" %s Missing \"%s\" translation string for option %s, choice %s." = " %s Missing “%s†translation string for option %s, choice %s.";
+" %s Missing \"%s\" translation string for option %s." = " %s Missing “%s†translation string for option %s.";
+" %s Missing %s file \"%s\"." = " %s Missing %s file “%sâ€.";
" %s Missing REQUIRED PageRegion option.\n REF: Page 100, section 5.14." = " %s Missing REQUIRED PageRegion option.\n REF: Page 100, section 5.14.";
" %s Missing REQUIRED PageSize option.\n REF: Page 99, section 5.14." = " %s Missing REQUIRED PageSize option.\n REF: Page 99, section 5.14.";
-" %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\".";
-" %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" = " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"";
+" %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing choice *%s %s in UIConstraints “*%s %s *%s %sâ€.";
+" %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" = " %s Missing choice *%s %s in cupsUIConstraints %s: “%sâ€";
" %s Missing cupsUIResolver %s" = " %s Missing cupsUIResolver %s";
-" %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing option %s in UIConstraints \"*%s %s *%s %s\".";
-" %s Missing option %s in cupsUIConstraints %s: \"%s\"" = " %s Missing option %s in cupsUIConstraints %s: \"%s\"";
-" %s No base translation \"%s\" is included in file." = " %s No base translation \"%s\" is included in file.";
+" %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing option %s in UIConstraints “*%s %s *%s %sâ€.";
+" %s Missing option %s in cupsUIConstraints %s: \"%s\"" = " %s Missing option %s in cupsUIConstraints %s: “%sâ€";
+" %s No base translation \"%s\" is included in file." = " %s No base translation “%s†is included in file.";
" %s REQUIRED %s does not define choice None.\n REF: Page 122, section 5.17" = " %s REQUIRED %s does not define choice None.\n REF: Page 122, section 5.17";
-" %s Size \"%s\" defined for %s but not for %s." = " %s Size \"%s\" defined for %s but not for %s.";
-" %s Size \"%s\" has unexpected dimensions (%gx%g)." = " %s Size \"%s\" has unexpected dimensions (%gx%g).";
-" %s Size \"%s\" should be \"%s\"." = " %s Size \"%s\" should be \"%s\".";
-" %s Size \"%s\" should be the Adobe standard name \"%s\"." = " %s Size \"%s\" should be the Adobe standard name \"%s\".";
+" %s Size \"%s\" defined for %s but not for %s." = " %s Size “%s†defined for %s but not for %s.";
+" %s Size \"%s\" has unexpected dimensions (%gx%g)." = " %s Size “%s†has unexpected dimensions (%gx%g).";
+" %s Size \"%s\" should be \"%s\"." = " %s Size “%s†should be “%sâ€.";
+" %s Size \"%s\" should be the Adobe standard name \"%s\"." = " %s Size “%s†should be the Adobe standard name “%sâ€.";
" %s cupsICCProfile %s hash value collides with %s." = " %s cupsICCProfile %s hash value collides with %s.";
" %s cupsUIResolver %s causes a loop." = " %s cupsUIResolver %s causes a loop.";
" %s cupsUIResolver %s does not list at least two different options." = " %s cupsUIResolver %s does not list at least two different options.";
@@ -121,15 +121,15 @@
" **FAIL** Bad Default%s %s\n REF: Page 40, section 4.5." = " **FAIL** Bad Default%s %s\n REF: Page 40, section 4.5.";
" **FAIL** Bad DefaultImageableArea %s\n REF: Page 102, section 5.15." = " **FAIL** Bad DefaultImageableArea %s\n REF: Page 102, section 5.15.";
" **FAIL** Bad DefaultPaperDimension %s\n REF: Page 103, section 5.15." = " **FAIL** Bad DefaultPaperDimension %s\n REF: Page 103, section 5.15.";
-" **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3.";
-" **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3.";
+" **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FileVersion “%sâ€\n REF: Page 56, section 5.3.";
+" **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FormatVersion “%sâ€\n REF: Page 56, section 5.3.";
" **FAIL** Bad JobPatchFile attribute in file\n REF: Page 24, section 3.4." = " **FAIL** Bad JobPatchFile attribute in file\n REF: Page 24, section 3.4.";
" **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." = " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1.";
" **FAIL** Bad LanguageVersion %s - must be English." = " **FAIL** Bad LanguageVersion %s - must be English.";
-" **FAIL** Bad Manufacturer (should be \"%s\")\n REF: Page 211, table D.1." = " **FAIL** Bad Manufacturer (should be \"%s\")\n REF: Page 211, table D.1.";
-" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3." = " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3.";
-" **FAIL** Bad PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3." = " **FAIL** Bad PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3.";
-" **FAIL** Bad Product - not \"(string)\".\n REF: Page 62, section 5.3." = " **FAIL** Bad Product - not \"(string)\".\n REF: Page 62, section 5.3.";
+" **FAIL** Bad Manufacturer (should be \"%s\")\n REF: Page 211, table D.1." = " **FAIL** Bad Manufacturer (should be “%sâ€)\n REF: Page 211, table D.1.";
+" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3." = " **FAIL** Bad ModelName - “%c†not allowed in string.\n REF: Pages 59-60, section 5.3.";
+" **FAIL** Bad PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3." = " **FAIL** Bad PSVersion - not “(string) intâ€.\n REF: Pages 62-64, section 5.3.";
+" **FAIL** Bad Product - not \"(string)\".\n REF: Page 62, section 5.3." = " **FAIL** Bad Product - not “(string)â€.\n REF: Page 62, section 5.3.";
" **FAIL** Bad ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3." = " **FAIL** Bad ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3.";
" **FAIL** Bad option %s choice %s\n REF: Page 84, section 5.9" = " **FAIL** Bad option %s choice %s\n REF: Page 84, section 5.9";
" **FAIL** Default option code cannot be interpreted: %s" = " **FAIL** Default option code cannot be interpreted: %s";
@@ -177,6 +177,8 @@
" Warning: file contains binary data." = " Warning: file contains binary data.";
" Warning: no %%EndComments comment in file." = " Warning: no %%EndComments comment in file.";
" Warning: obsolete DSC version %.1f in file." = " Warning: obsolete DSC version %.1f in file.";
+" ! expression Unary NOT of expression." = " ! expression Unary NOT of expression.";
+" ( expressions ) Group expressions." = " ( expressions ) Group expressions.";
" --[no-]debug-logging Turn debug logging on/off." = " --[no-]debug-logging Turn debug logging on/off.";
" --[no-]remote-admin Turn remote administration on/off." = " --[no-]remote-admin Turn remote administration on/off.";
" --[no-]remote-any Allow/prevent access from the Internet." = " --[no-]remote-any Allow/prevent access from the Internet.";
@@ -184,7 +186,31 @@
" --[no-]user-cancel-any Allow/prevent users to cancel any job." = " --[no-]user-cancel-any Allow/prevent users to cancel any job.";
" --cr End lines with CR (Mac OS 9)." = " --cr End lines with CR (Mac OS 9).";
" --crlf End lines with CR + LF (Windows)." = " --crlf End lines with CR + LF (Windows).";
+" --domain regex Match domain to regular expression." = " --domain regex Match domain to regular expression.";
+" --exec utility [argument ...] ;\n Execute program if true." = " --exec utility [argument …] ;\n Execute program if true.";
+" --false Always false." = " --false Always false.";
+" --help Show help." = " --help Show help.";
+" --help Show this help." = " --help Show this help.";
+" --host regex Match hostname to regular expression." = " --host regex Match hostname to regular expression.";
" --lf End lines with LF (UNIX/Linux/OS X)." = " --lf End lines with LF (UNIX/Linux/OS X).";
+" --list-filters List filters that will be used." = " --list-filters List filters that will be used.";
+" --local True if service is local." = " --local True if service is local.";
+" --ls List attributes." = " --ls List attributes.";
+" --name regex Match service name to regular expression." = " --name regex Match service name to regular expression.";
+" --not expression Unary NOT of expression." = " --not expression Unary NOT of expression.";
+" --path regex Match resource path to regular expression." = " --path regex Match resource path to regular expression.";
+" --port number[-number] Match port to number or range." = " --port number[-number] Match port to number or range.";
+" --print Print URI if true." = " --print Print URI if true.";
+" --print-name Print service name if true." = " --print-name Print service name if true.";
+" --quiet Quietly report match via exit code." = " --quiet Quietly report match via exit code.";
+" --remote True if service is remote." = " --remote True if service is remote.";
+" --stop-after-include-error\n Stop tests after a failed INCLUDE." = " --stop-after-include-error\n Stop tests after a failed INCLUDE.";
+" --true Always true." = " --true Always true.";
+" --txt key True if the TXT record contains the key." = " --txt key True if the TXT record contains the key.";
+" --txt-* regex Match TXT record key to regular expression." = " --txt-* regex Match TXT record key to regular expression.";
+" --uri regex Match URI to regular expression." = " --uri regex Match URI to regular expression.";
+" --version Show program version." = " --version Show program version.";
+" --version Show version." = " --version Show version.";
" -4 Connect using IPv4." = " -4 Connect using IPv4.";
" -6 Connect using IPv6." = " -6 Connect using IPv6.";
" -C Send requests using chunking (default)." = " -C Send requests using chunking (default).";
@@ -198,52 +224,133 @@
" -I include-dir Add include directory to search path." = " -I include-dir Add include directory to search path.";
" -I {filename,filters,none,profiles}" = " -I {filename,filters,none,profiles}";
" -L Send requests using content-length." = " -L Send requests using content-length.";
+" -P filename.plist Produce XML plist to a file and test report to standard output." = " -P filename.plist Produce XML plist to a file and test report to standard output.";
" -P filename.ppd Set PPD file." = " -P filename.ppd Set PPD file.";
+" -P number[-number] Match port to number or range." = " -P number[-number] Match port to number or range.";
" -R root-directory Set alternate root." = " -R root-directory Set alternate root.";
" -S Test with SSL encryption." = " -S Test with SSL encryption.";
+" -T seconds Set the browse timeout in seconds." = " -T seconds Set the browse timeout in seconds.";
" -T seconds Set the receive/send timeout in seconds." = " -T seconds Set the receive/send timeout in seconds.";
" -U username Specify username." = " -U username Specify username.";
" -V version Set default IPP version." = " -V version Set default IPP version.";
" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}" = " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}";
" -X Produce XML plist instead of plain text." = " -X Produce XML plist instead of plain text.";
+" -a Browse for all services." = " -a Browse for all services.";
" -a Export all printers." = " -a Export all printers.";
+" -c Produce CSV output." = " -c Produce CSV output.";
" -c catalog.po Load the specified message catalog." = " -c catalog.po Load the specified message catalog.";
+" -c cups-files.conf Set cups-files.conf file to use." = " -c cups-files.conf Set cups-files.conf file to use.";
" -c cupsd.conf Set cupsd.conf file to use." = " -c cupsd.conf Set cupsd.conf file to use.";
+" -d domain Browse/resolve in specified domain." = " -d domain Browse/resolve in specified domain.";
" -d name=value Set named variable to value." = " -d name=value Set named variable to value.";
" -d output-dir Specify the output directory." = " -d output-dir Specify the output directory.";
" -d printer Use the named printer." = " -d printer Use the named printer.";
+" -d regex Match domain to regular expression." = " -d regex Match domain to regular expression.";
" -e Use every filter from the PPD file." = " -e Use every filter from the PPD file.";
" -f Run in the foreground." = " -f Run in the foreground.";
" -f filename Set default request filename." = " -f filename Set default request filename.";
" -h Show this usage message." = " -h Show this usage message.";
+" -h regex Match hostname to regular expression." = " -h regex Match hostname to regular expression.";
" -h server[:port] Specify server address." = " -h server[:port] Specify server address.";
" -i mime/type Set input MIME type (otherwise auto-typed)." = " -i mime/type Set input MIME type (otherwise auto-typed).";
" -i seconds Repeat the last file with the given time interval." = " -i seconds Repeat the last file with the given time interval.";
" -j job-id[,N] Filter file N from the specified job (default is file 1)." = " -j job-id[,N] Filter file N from the specified job (default is file 1).";
-" -l Run cupsd from launchd(8)." = " -l Run cupsd from launchd(8).";
-" -l lang[,lang,...] Specify the output language(s) (locale)." = " -l lang[,lang,...] Specify the output language(s) (locale).";
+" -l List attributes." = " -l List attributes.";
+" -l Produce plain text output." = " -l Produce plain text output.";
+" -l Run cupsd on demand." = " -l Run cupsd on demand.";
+" -l lang[,lang,...] Specify the output language(s) (locale)." = " -l lang[,lang,…] Specify the output language(s) (locale).";
" -m Use the ModelName value as the filename." = " -m Use the ModelName value as the filename.";
" -m mime/type Set output MIME type (otherwise application/pdf)." = " -m mime/type Set output MIME type (otherwise application/pdf).";
" -n copies Set number of copies." = " -n copies Set number of copies.";
" -n count Repeat the last file the given number of times." = " -n count Repeat the last file the given number of times.";
+" -n regex Match service name to regular expression." = " -n regex Match service name to regular expression.";
" -o filename.drv Set driver information file (otherwise ppdi.drv)." = " -o filename.drv Set driver information file (otherwise ppdi.drv).";
" -o filename.ppd[.gz] Set output file (otherwise stdout)." = " -o filename.ppd[.gz] Set output file (otherwise stdout).";
" -o name=value Set option(s)." = " -o name=value Set option(s).";
+" -p Print URI if true." = " -p Print URI if true.";
" -p filename.ppd Set PPD file." = " -p filename.ppd Set PPD file.";
+" -p program Run specified program for each service." = " -p program Run specified program for each service.";
+" -q Quietly report match via exit code." = " -q Quietly report match via exit code.";
" -q Run silently." = " -q Run silently.";
+" -r True if service is remote." = " -r True if service is remote.";
" -r Use 'relaxed' open mode." = " -r Use 'relaxed' open mode.";
+" -s Print service name if true." = " -s Print service name if true.";
" -t Produce a test report." = " -t Produce a test report.";
" -t Test PPDs instead of generating them." = " -t Test PPDs instead of generating them.";
" -t Test the configuration file." = " -t Test the configuration file.";
+" -t key True if the TXT record contains the key." = " -t key True if the TXT record contains the key.";
" -t title Set title." = " -t title Set title.";
+" -t type Browse/resolve with specified type." = " -t type Browse/resolve with specified type.";
" -u Remove the PPD file when finished." = " -u Remove the PPD file when finished.";
+" -u regex Match URI to regular expression." = " -u regex Match URI to regular expression.";
" -v Be verbose." = " -v Be verbose.";
" -vv Be very verbose." = " -vv Be very verbose.";
+" -x utility [argument ...] ;\n Execute program if true." = " -x utility [argument …] ;\n Execute program if true.";
" -z Compress PPD files using GNU zip." = " -z Compress PPD files using GNU zip.";
+" IPPFIND_SERVICE_DOMAIN Domain name" = " IPPFIND_SERVICE_DOMAIN Domain name";
+" IPPFIND_SERVICE_HOSTNAME\n Fully-qualified domain name" = " IPPFIND_SERVICE_HOSTNAME\n Fully-qualified domain name";
+" IPPFIND_SERVICE_NAME Service instance name" = " IPPFIND_SERVICE_NAME Service instance name";
+" IPPFIND_SERVICE_PORT Port number" = " IPPFIND_SERVICE_PORT Port number";
+" IPPFIND_SERVICE_REGTYPE DNS-SD registration type" = " IPPFIND_SERVICE_REGTYPE DNS-SD registration type";
+" IPPFIND_SERVICE_SCHEME URI scheme" = " IPPFIND_SERVICE_SCHEME URI scheme";
+" IPPFIND_SERVICE_URI URI" = " IPPFIND_SERVICE_URI URI";
+" IPPFIND_TXT_* Value of TXT record key" = " IPPFIND_TXT_* Value of TXT record key";
+" expression --and expression\n Logical AND." = " expression --and expression\n Logical AND.";
+" expression --or expression\n Logical OR." = " expression --or expression\n Logical OR.";
+" expression expression Logical AND." = " expression expression Logical AND.";
+" {service_domain} Domain name" = " {service_domain} Domain name";
+" {service_hostname} Fully-qualified domain name" = " {service_hostname} Fully-qualified domain name";
+" {service_name} Service instance name" = " {service_name} Service instance name";
+" {service_port} Port number" = " {service_port} Port number";
+" {service_regtype} DNS-SD registration type" = " {service_regtype} DNS-SD registration type";
+" {service_scheme} URI scheme" = " {service_scheme} URI scheme";
+" {service_uri} URI" = " {service_uri} URI";
+" {txt_*} Value of TXT record key" = " {txt_*} Value of TXT record key";
+" {} URI" = " {} URI";
" FAIL" = " FAIL";
" PASS" = " PASS";
-"%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" = "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes";
+"\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)." = "“%sâ€: Bad URI value “%s†- %s (RFC 2911 section 4.1.5).";
+"\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)." = "“%sâ€: Bad URI value “%s†- bad length %d (RFC 2911 section 4.1.5).";
+"\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)." = "“%sâ€: Bad attribute name - bad length %d (RFC 2911 section 4.1.3).";
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)." = "“%sâ€: Bad attribute name - invalid character (RFC 2911 section 4.1.3).";
+"\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)." = "“%sâ€: Bad boolen value %d (RFC 2911 section 4.1.11).";
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)." = "“%sâ€: Bad charset value “%s†- bad characters (RFC 2911 section 4.1.7).";
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)." = "“%sâ€: Bad charset value “%s†- bad length %d (RFC 2911 section 4.1.7).";
+"\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime UTC hours %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime day %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime deciseconds %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime hours %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime minutes %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime month %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)." = "“%sâ€: Bad dateTime seconds %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)." = "“%sâ€: Bad enum value %d - out of range (RFC 2911 section 4.1.4).";
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)." = "“%sâ€: Bad keyword value “%s†- bad length %d (RFC 2911 section 4.1.3).";
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section 4.1.3)." = "“%sâ€: Bad keyword value “%s†- invalid character (RFC 2911 section 4.1.3).";
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section 4.1.9)." = "“%sâ€: Bad mimeMediaType value “%s†- bad characters (RFC 2911 section 4.1.9).";
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section 4.1.9)." = "“%sâ€: Bad mimeMediaType value “%s†- bad length %d (RFC 2911 section 4.1.9).";
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)." = "“%sâ€: Bad name value “%s†- bad UTF-8 sequence (RFC 2911 section 4.1.2).";
+"\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)." = "“%sâ€: Bad name value “%s†- bad length %d (RFC 2911 section 4.1.2).";
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section 4.1.8)." = "“%sâ€: Bad naturalLanguage value “%s†- bad characters (RFC 2911 section 4.1.8).";
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section 4.1.8)." = "“%sâ€: Bad naturalLanguage value “%s†- bad length %d (RFC 2911 section 4.1.8).";
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)." = "“%sâ€: Bad octetString value - bad length %d (RFC 2911 section 4.1.10).";
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 section 4.1.13)." = "“%sâ€: Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 section 4.1.13).";
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section 4.1.15)." = "“%sâ€: Bad resolution value %dx%d%s - bad units value (RFC 2911 section 4.1.15).";
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 2911 section 4.1.15)." = "“%sâ€: Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 2911 section 4.1.15).";
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 2911 section 4.1.15)." = "“%sâ€: Bad resolution value %dx%d%s - feed resolution must be positive (RFC 2911 section 4.1.15).";
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)." = "“%sâ€: Bad text value “%s†- bad UTF-8 sequence (RFC 2911 section 4.1.1).";
+"\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)." = "“%sâ€: Bad text value “%s†- bad length %d (RFC 2911 section 4.1.1).";
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)." = "“%sâ€: Bad uriScheme value “%s†- bad characters (RFC 2911 section 4.1.6).";
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)." = "“%sâ€: Bad uriScheme value “%s†- bad length %d (RFC 2911 section 4.1.6).";
"%-7s %-7.7s %-7d %-31.31s %.0f bytes" = "%-7s %-7.7s %-7d %-31.31s %.0f bytes";
+"%d x %d mm" = "%d x %d mm";
+"%g x %g" = "%g x %g";
+"%s (%s)" = "%s (%s)";
+"%s (%s, %s)" = "%s (%s, %s)";
+"%s (Borderless)" = "%s (Borderless)";
+"%s (Borderless, %s)" = "%s (Borderless, %s)";
+"%s (Borderless, %s, %s)" = "%s (Borderless, %s, %s)";
"%s accepting requests since %s" = "%s accepting requests since %s";
"%s cannot be changed." = "%s cannot be changed.";
"%s is not implemented by the CUPS version of lpc." = "%s is not implemented by the CUPS version of lpc.";
@@ -259,62 +366,72 @@
// TRANSLATORS: Message is "subject: error"
"%s: %s" = "%s: %s";
"%s: %s failed: %s" = "%s: %s failed: %s";
+"%s: Bad printer URI \"%s\"." = "%s: Bad printer URI “%sâ€.";
+"%s: Bad version %s for \"-V\"." = "%s: Bad version %s for “-Vâ€.";
"%s: Don't know what to do." = "%s: Don't know what to do.";
-"%s: Error - %s environment variable names non-existent destination \"%s\"." = "%s: Error - %s environment variable names non-existent destination \"%s\".";
+"%s: Error - %s environment variable names non-existent destination \"%s\"." = "%s: Error - %s environment variable names non-existent destination “%sâ€.";
"%s: Error - add '/version=1.1' to server name." = "%s: Error - add '/version=1.1' to server name.";
"%s: Error - bad job ID." = "%s: Error - bad job ID.";
"%s: Error - cannot print files and alter jobs simultaneously." = "%s: Error - cannot print files and alter jobs simultaneously.";
"%s: Error - cannot print from stdin if files or a job ID are provided." = "%s: Error - cannot print from stdin if files or a job ID are provided.";
-"%s: Error - expected character set after \"-S\" option." = "%s: Error - expected character set after \"-S\" option.";
-"%s: Error - expected content type after \"-T\" option." = "%s: Error - expected content type after \"-T\" option.";
-"%s: Error - expected copies after \"-#\" option." = "%s: Error - expected copies after \"-#\" option.";
-"%s: Error - expected copies after \"-n\" option." = "%s: Error - expected copies after \"-n\" option.";
-"%s: Error - expected destination after \"-P\" option." = "%s: Error - expected destination after \"-P\" option.";
-"%s: Error - expected destination after \"-b\" option." = "%s: Error - expected destination after \"-b\" option.";
-"%s: Error - expected destination after \"-d\" option." = "%s: Error - expected destination after \"-d\" option.";
-"%s: Error - expected form after \"-f\" option." = "%s: Error - expected form after \"-f\" option.";
-"%s: Error - expected hold name after \"-H\" option." = "%s: Error - expected hold name after \"-H\" option.";
-"%s: Error - expected hostname after \"-H\" option." = "%s: Error - expected hostname after \"-H\" option.";
-"%s: Error - expected hostname after \"-h\" option." = "%s: Error - expected hostname after \"-h\" option.";
-"%s: Error - expected mode list after \"-y\" option." = "%s: Error - expected mode list after \"-y\" option.";
-"%s: Error - expected name after \"-%c\" option." = "%s: Error - expected name after \"-%c\" option.";
-"%s: Error - expected option=value after \"-o\" option." = "%s: Error - expected option=value after \"-o\" option.";
-"%s: Error - expected page list after \"-P\" option." = "%s: Error - expected page list after \"-P\" option.";
-"%s: Error - expected priority after \"-%c\" option." = "%s: Error - expected priority after \"-%c\" option.";
-"%s: Error - expected reason text after \"-r\" option." = "%s: Error - expected reason text after \"-r\" option.";
-"%s: Error - expected title after \"-t\" option." = "%s: Error - expected title after \"-t\" option.";
-"%s: Error - expected username after \"-U\" option." = "%s: Error - expected username after \"-U\" option.";
-"%s: Error - expected username after \"-u\" option." = "%s: Error - expected username after \"-u\" option.";
-"%s: Error - expected value after \"-%c\" option." = "%s: Error - expected value after \"-%c\" option.";
-"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." = "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option.";
+"%s: Error - expected character set after \"-S\" option." = "%s: Error - expected character set after “-S†option.";
+"%s: Error - expected content type after \"-T\" option." = "%s: Error - expected content type after “-T†option.";
+"%s: Error - expected copies after \"-#\" option." = "%s: Error - expected copies after “-#†option.";
+"%s: Error - expected copies after \"-n\" option." = "%s: Error - expected copies after “-n†option.";
+"%s: Error - expected destination after \"-P\" option." = "%s: Error - expected destination after “-P†option.";
+"%s: Error - expected destination after \"-d\" option." = "%s: Error - expected destination after “-d†option.";
+"%s: Error - expected form after \"-f\" option." = "%s: Error - expected form after “-f†option.";
+"%s: Error - expected hold name after \"-H\" option." = "%s: Error - expected hold name after “-H†option.";
+"%s: Error - expected hostname after \"-H\" option." = "%s: Error - expected hostname after “-H†option.";
+"%s: Error - expected hostname after \"-h\" option." = "%s: Error - expected hostname after “-h†option.";
+"%s: Error - expected mode list after \"-y\" option." = "%s: Error - expected mode list after “-y†option.";
+"%s: Error - expected name after \"-%c\" option." = "%s: Error - expected name after “-%c†option.";
+"%s: Error - expected option=value after \"-o\" option." = "%s: Error - expected option=value after “-o†option.";
+"%s: Error - expected page list after \"-P\" option." = "%s: Error - expected page list after “-P†option.";
+"%s: Error - expected priority after \"-%c\" option." = "%s: Error - expected priority after “-%c†option.";
+"%s: Error - expected reason text after \"-r\" option." = "%s: Error - expected reason text after “-r†option.";
+"%s: Error - expected title after \"-t\" option." = "%s: Error - expected title after “-t†option.";
+"%s: Error - expected username after \"-U\" option." = "%s: Error - expected username after “-U†option.";
+"%s: Error - expected username after \"-u\" option." = "%s: Error - expected username after “-u†option.";
+"%s: Error - expected value after \"-%c\" option." = "%s: Error - expected value after “-%c†option.";
+"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." = "%s: Error - need “completedâ€, “not-completedâ€, or “all†after “-W†option.";
"%s: Error - no default destination available." = "%s: Error - no default destination available.";
"%s: Error - priority must be between 1 and 100." = "%s: Error - priority must be between 1 and 100.";
"%s: Error - scheduler not responding." = "%s: Error - scheduler not responding.";
-"%s: Error - too many files - \"%s\"." = "%s: Error - too many files - \"%s\".";
-"%s: Error - unable to access \"%s\" - %s" = "%s: Error - unable to access \"%s\" - %s";
+"%s: Error - too many files - \"%s\"." = "%s: Error - too many files - “%sâ€.";
+"%s: Error - unable to access \"%s\" - %s" = "%s: Error - unable to access “%s†- %s";
"%s: Error - unable to queue from stdin - %s." = "%s: Error - unable to queue from stdin - %s.";
-"%s: Error - unknown destination \"%s\"." = "%s: Error - unknown destination \"%s\".";
-"%s: Error - unknown destination \"%s/%s\"." = "%s: Error - unknown destination \"%s/%s\".";
-"%s: Error - unknown option \"%c\"." = "%s: Error - unknown option \"%c\".";
-"%s: Error - unknown option \"%s\"." = "%s: Error - unknown option \"%s\".";
-"%s: Expected job ID after \"-i\" option." = "%s: Expected job ID after \"-i\" option.";
-"%s: Invalid destination name in list \"%s\"." = "%s: Invalid destination name in list \"%s\".";
-"%s: Invalid filter string \"%s\"." = "%s: Invalid filter string \"%s\".";
-"%s: Need job ID (\"-i jobid\") before \"-H restart\"." = "%s: Need job ID (\"-i jobid\") before \"-H restart\".";
+"%s: Error - unknown destination \"%s\"." = "%s: Error - unknown destination “%sâ€.";
+"%s: Error - unknown destination \"%s/%s\"." = "%s: Error - unknown destination “%s/%sâ€.";
+"%s: Error - unknown option \"%c\"." = "%s: Error - unknown option “%câ€.";
+"%s: Error - unknown option \"%s\"." = "%s: Error - unknown option “%sâ€.";
+"%s: Expected job ID after \"-i\" option." = "%s: Expected job ID after “-i†option.";
+"%s: Invalid destination name in list \"%s\"." = "%s: Invalid destination name in list “%sâ€.";
+"%s: Invalid filter string \"%s\"." = "%s: Invalid filter string “%sâ€.";
+"%s: Missing filename for \"-P\"." = "%s: Missing filename for “-Pâ€.";
+"%s: Missing timeout for \"-T\"." = "%s: Missing timeout for “-Tâ€.";
+"%s: Missing version for \"-V\"." = "%s: Missing version for “-Vâ€.";
+"%s: Need job ID (\"-i jobid\") before \"-H restart\"." = "%s: Need job ID (“-i jobidâ€) before “-H restartâ€.";
"%s: No filter to convert from %s/%s to %s/%s." = "%s: No filter to convert from %s/%s to %s/%s.";
"%s: Operation failed: %s" = "%s: Operation failed: %s";
"%s: Sorry, no encryption support." = "%s: Sorry, no encryption support.";
+"%s: Unable to connect to \"%s:%d\": %s" = "%s: Unable to connect to “%s:%dâ€: %s";
"%s: Unable to connect to server." = "%s: Unable to connect to server.";
"%s: Unable to contact server." = "%s: Unable to contact server.";
-"%s: Unable to determine MIME type of \"%s\"." = "%s: Unable to determine MIME type of \"%s\".";
+"%s: Unable to create PPD file: %s" = "%s: Unable to create PPD file: %s";
+"%s: Unable to determine MIME type of \"%s\"." = "%s: Unable to determine MIME type of “%sâ€.";
+"%s: Unable to open \"%s\": %s" = "%s: Unable to open “%sâ€: %s";
"%s: Unable to open %s: %s" = "%s: Unable to open %s: %s";
"%s: Unable to open PPD file: %s on line %d." = "%s: Unable to open PPD file: %s on line %d.";
-"%s: Unable to read MIME database from \"%s\" or \"%s\"." = "%s: Unable to read MIME database from \"%s\" or \"%s\".";
-"%s: Unknown destination \"%s\"." = "%s: Unknown destination \"%s\".";
+"%s: Unable to read MIME database from \"%s\" or \"%s\"." = "%s: Unable to read MIME database from “%s†or “%sâ€.";
+"%s: Unable to resolve \"%s\"." = "%s: Unable to resolve “%sâ€.";
+"%s: Unknown destination \"%s\"." = "%s: Unknown destination “%sâ€.";
"%s: Unknown destination MIME type %s/%s." = "%s: Unknown destination MIME type %s/%s.";
-"%s: Unknown option \"%c\"." = "%s: Unknown option \"%c\".";
+"%s: Unknown option \"%c\"." = "%s: Unknown option “%câ€.";
+"%s: Unknown option \"%s\"." = "%s: Unknown option “%sâ€.";
+"%s: Unknown option \"-%c\"." = "%s: Unknown option “-%câ€.";
"%s: Unknown source MIME type %s/%s." = "%s: Unknown source MIME type %s/%s.";
-"%s: Warning - \"%c\" format modifier not supported - output may not be correct." = "%s: Warning - \"%c\" format modifier not supported - output may not be correct.";
+"%s: Warning - \"%c\" format modifier not supported - output may not be correct." = "%s: Warning - “%c†format modifier not supported - output may not be correct.";
"%s: Warning - character set option ignored." = "%s: Warning - character set option ignored.";
"%s: Warning - content type option ignored." = "%s: Warning - content type option ignored.";
"%s: Warning - form option ignored." = "%s: Warning - form option ignored.";
@@ -495,7 +612,6 @@
"7 inches/sec." = "7 inches/sec.";
"7 x 9" = "7 x 9";
"70" = "70";
-"720dpi" = "720dpi";
"75" = "75";
"8" = "8";
"8 inches/sec." = "8 inches/sec.";
@@ -520,8 +636,8 @@
"?Invalid help command unknown." = "?Invalid help command unknown.";
"A Samba password is required to export printer drivers" = "A Samba password is required to export printer drivers";
"A Samba username is required to export printer drivers" = "A Samba username is required to export printer drivers";
-"A class named \"%s\" already exists." = "A class named \"%s\" already exists.";
-"A printer named \"%s\" already exists." = "A printer named \"%s\" already exists.";
+"A class named \"%s\" already exists." = "A class named “%s†already exists.";
+"A printer named \"%s\" already exists." = "A printer named “%s†already exists.";
"A0" = "A0";
"A0 Long Edge" = "A0 Long Edge";
"A1" = "A1";
@@ -580,7 +696,7 @@
"B7" = "B7";
"B8" = "B8";
"B9" = "B9";
-"Bad 'document-format' value \"%s\"." = "Bad 'document-format' value \"%s\".";
+"Bad 'document-format' value \"%s\"." = "Bad 'document-format' value “%sâ€.";
"Bad NULL dests pointer" = "Bad NULL dests pointer";
"Bad OpenGroup" = "Bad OpenGroup";
"Bad OpenUI/JCLOpenUI" = "Bad OpenUI/JCLOpenUI";
@@ -589,45 +705,52 @@
"Bad Request" = "Bad Request";
"Bad SNMP version number" = "Bad SNMP version number";
"Bad UIConstraints" = "Bad UIConstraints";
+"Bad arguments to function" = "Bad arguments to function";
"Bad copies value %d." = "Bad copies value %d.";
"Bad custom parameter" = "Bad custom parameter";
-"Bad device-uri \"%s\"." = "Bad device-uri \"%s\".";
-"Bad device-uri scheme \"%s\"." = "Bad device-uri scheme \"%s\".";
-"Bad document-format \"%s\"." = "Bad document-format \"%s\".";
-"Bad document-format-default \"%s\"." = "Bad document-format-default \"%s\".";
+"Bad device-uri \"%s\"." = "Bad device-uri “%sâ€.";
+"Bad device-uri scheme \"%s\"." = "Bad device-uri scheme “%sâ€.";
+"Bad document-format \"%s\"." = "Bad document-format “%sâ€.";
+"Bad document-format-default \"%s\"." = "Bad document-format-default “%sâ€.";
"Bad filename buffer" = "Bad filename buffer";
-"Bad job-name value: Bad UTF-8 sequence." = "Bad job-name value: Bad UTF-8 sequence.";
-"Bad job-name value: Name too long." = "Bad job-name value: Name too long.";
+"Bad hostname/address in URI" = "Bad hostname/address in URI";
+"Bad job-name value: %s" = "Bad job-name value: %s";
"Bad job-name value: Wrong type or count." = "Bad job-name value: Wrong type or count.";
"Bad job-priority value." = "Bad job-priority value.";
-"Bad job-sheets value \"%s\"." = "Bad job-sheets value \"%s\".";
+"Bad job-sheets value \"%s\"." = "Bad job-sheets value “%sâ€.";
"Bad job-sheets value type." = "Bad job-sheets value type.";
"Bad job-state value." = "Bad job-state value.";
-"Bad job-uri \"%s\"." = "Bad job-uri \"%s\".";
-"Bad notify-pull-method \"%s\"." = "Bad notify-pull-method \"%s\".";
-"Bad notify-recipient-uri \"%s\"." = "Bad notify-recipient-uri \"%s\".";
+"Bad job-uri \"%s\"." = "Bad job-uri “%sâ€.";
+"Bad notify-pull-method \"%s\"." = "Bad notify-pull-method “%sâ€.";
+"Bad notify-recipient-uri \"%s\"." = "Bad notify-recipient-uri “%sâ€.";
"Bad number-up value %d." = "Bad number-up value %d.";
"Bad option + choice on line %d." = "Bad option + choice on line %d.";
"Bad page-ranges values %d-%d." = "Bad page-ranges values %d-%d.";
-"Bad port-monitor \"%s\"." = "Bad port-monitor \"%s\".";
-"Bad printer URI." = "Bad printer URI.";
+"Bad port number in URI" = "Bad port number in URI";
+"Bad port-monitor \"%s\"." = "Bad port-monitor “%sâ€.";
"Bad printer-state value %d." = "Bad printer-state value %d.";
+"Bad printer-uri." = "Bad printer-uri.";
"Bad request ID %d." = "Bad request ID %d.";
"Bad request version number %d.%d." = "Bad request version number %d.%d.";
+"Bad resource in URI" = "Bad resource in URI";
+"Bad scheme in URI" = "Bad scheme in URI";
"Bad subscription ID" = "Bad subscription ID";
+"Bad username in URI" = "Bad username in URI";
"Bad value string" = "Bad value string";
+"Bad/empty URI" = "Bad/empty URI";
"Banners" = "Banners";
"Bond Paper" = "Bond Paper";
-"Boolean expected for waiteof option \"%s\"." = "Boolean expected for waiteof option \"%s\".";
+"Boolean expected for waiteof option \"%s\"." = "Boolean expected for waiteof option “%sâ€.";
"Buffer overflow detected, aborting." = "Buffer overflow detected, aborting.";
"CMYK" = "CMYK";
"CPCL Label Printer" = "CPCL Label Printer";
+"Cancel Jobs" = "Cancel Jobs";
"Cancel RSS Subscription" = "Cancel RSS Subscription";
"Canceling print job." = "Canceling print job.";
"Cannot share a remote Kerberized printer." = "Cannot share a remote Kerberized printer.";
"Cassette" = "Cassette";
"Change Settings" = "Change Settings";
-"Character set \"%s\" not supported." = "Character set \"%s\" not supported.";
+"Character set \"%s\" not supported." = "Character set “%s†not supported.";
"Classes" = "Classes";
"Clean Print Heads" = "Clean Print Heads";
"Close-Job doesn't support the job-uri attribute." = "Close-Job doesn't support the job-uri attribute.";
@@ -653,14 +776,14 @@
"Delete Class" = "Delete Class";
"Delete Printer" = "Delete Printer";
"DeskJet Series" = "DeskJet Series";
-"Destination \"%s\" is not accepting jobs." = "Destination \"%s\" is not accepting jobs.";
+"Destination \"%s\" is not accepting jobs." = "Destination “%s†is not accepting jobs.";
"Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s" = "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s";
"Direct Thermal Media" = "Direct Thermal Media";
-"Directory \"%s\" contains a relative path." = "Directory \"%s\" contains a relative path.";
-"Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d).";
-"Directory \"%s\" is a file." = "Directory \"%s\" is a file.";
-"Directory \"%s\" not available: %s" = "Directory \"%s\" not available: %s";
-"Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d).";
+"Directory \"%s\" contains a relative path." = "Directory “%s†contains a relative path.";
+"Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "Directory “%s†has insecure permissions (0%o/uid=%d/gid=%d).";
+"Directory \"%s\" is a file." = "Directory “%s†is a file.";
+"Directory \"%s\" not available: %s" = "Directory “%s†not available: %s";
+"Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "Directory “%s†permissions OK (0%o/uid=%d/gid=%d).";
"Disabled" = "Disabled";
"Document #%d does not exist in job #%d." = "Document #%d does not exist in job #%d.";
"Duplexer" = "Duplexer";
@@ -669,12 +792,10 @@
"EPL2 Label Printer" = "EPL2 Label Printer";
"Edit Configuration File" = "Edit Configuration File";
"Empty PPD file." = "Empty PPD file.";
+"Encryption is not supported." = "Encryption is not supported.";
// TRANSLATORS: Banner/cover sheet after the print job.
"Ending Banner" = "Ending Banner";
"English" = "English";
-"Enter old password:" = "Enter old password:";
-"Enter password again:" = "Enter password again:";
-"Enter password:" = "Enter password:";
"Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket." = "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket.";
"Envelope #10 " = "Envelope #10 ";
"Envelope #11" = "Envelope #11";
@@ -729,10 +850,12 @@
"Envelope Personal" = "Envelope Personal";
"Envelope You4" = "Envelope You4";
"Envelope You4 Long Edge" = "Envelope You4 Long Edge";
+"Environment Variables:" = "Environment Variables:";
"Epson" = "Epson";
"Error Policy" = "Error Policy";
+"Error reading raster data." = "Error reading raster data.";
"Error sending raster data." = "Error sending raster data.";
-"Error: need hostname after \"-h\" option." = "Error: need hostname after \"-h\" option.";
+"Error: need hostname after \"-h\" option." = "Error: need hostname after “-h†option.";
"Every 10 Labels" = "Every 10 Labels";
"Every 2 Labels" = "Every 2 Labels";
"Every 3 Labels" = "Every 3 Labels";
@@ -746,17 +869,18 @@
"Executive" = "Executive";
"Expectation Failed" = "Expectation Failed";
"Export Printers to Samba" = "Export Printers to Samba";
+"Expressions:" = "Expressions:";
"FAIL" = "FAIL";
"FanFold German" = "FanFold German";
"FanFold Legal German" = "FanFold Legal German";
"Fanfold US" = "Fanfold US";
-"File \"%s\" contains a relative path." = "File \"%s\" contains a relative path.";
-"File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d).";
-"File \"%s\" is a directory." = "File \"%s\" is a directory.";
-"File \"%s\" not available: %s" = "File \"%s\" not available: %s";
-"File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "File \"%s\" permissions OK (0%o/uid=%d/gid=%d).";
+"File \"%s\" contains a relative path." = "File “%s†contains a relative path.";
+"File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "File “%s†has insecure permissions (0%o/uid=%d/gid=%d).";
+"File \"%s\" is a directory." = "File “%s†is a directory.";
+"File \"%s\" not available: %s" = "File “%s†not available: %s";
+"File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "File “%s†permissions OK (0%o/uid=%d/gid=%d).";
"File Folder " = "File Folder ";
-"File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"." = "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\".";
+"File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"." = "File device URIs have been disabled. To enable, see the FileDevice directive in “%s/cups-files.confâ€.";
"Finished page %d." = "Finished page %d.";
"Folio" = "Folio";
"Forbidden" = "Forbidden";
@@ -780,11 +904,13 @@
"IPP extension tag larger than 0x7FFFFFFF." = "IPP extension tag larger than 0x7FFFFFFF.";
"IPP integer value not 4 bytes." = "IPP integer value not 4 bytes.";
"IPP language length overflows value." = "IPP language length overflows value.";
+"IPP language length too large." = "IPP language length too large.";
"IPP member name is not empty." = "IPP member name is not empty.";
"IPP memberName value is empty." = "IPP memberName value is empty.";
"IPP memberName with no attribute." = "IPP memberName with no attribute.";
"IPP name larger than 32767 bytes." = "IPP name larger than 32767 bytes.";
"IPP nameWithLanguage value less than minimum 4 bytes." = "IPP nameWithLanguage value less than minimum 4 bytes.";
+"IPP octetString length too large." = "IPP octetString length too large.";
"IPP rangeOfInteger value not 8 bytes." = "IPP rangeOfInteger value not 8 bytes.";
"IPP resolution value not 9 bytes." = "IPP resolution value not 9 bytes.";
"IPP string length overflows value." = "IPP string length overflows value.";
@@ -805,8 +931,9 @@
"Internet Postage 2-Part" = "Internet Postage 2-Part";
"Internet Postage 3-Part" = "Internet Postage 3-Part";
"Internet Printing Protocol" = "Internet Printing Protocol";
+"Invalid media name arguments." = "Invalid media name arguments.";
"Invalid media size." = "Invalid media size.";
-"Invalid printer command \"%s\"." = "Invalid printer command \"%s\".";
+"Invalid printer command \"%s\"." = "Invalid printer command “%sâ€.";
"JCL" = "JCL";
"JIS B0" = "JIS B0";
"JIS B1" = "JIS B1";
@@ -843,7 +970,7 @@
"LPD/LPR Host or Printer" = "LPD/LPR Host or Printer";
"Label Printer" = "Label Printer";
"Label Top" = "Label Top";
-"Language \"%s\" not supported." = "Language \"%s\" not supported.";
+"Language \"%s\" not supported." = "Language “%s†not supported.";
"Large Address" = "Large Address";
"LaserJet Series PCL 4/5" = "LaserJet Series PCL 4/5";
"Letter Oversize" = "Letter Oversize";
@@ -851,8 +978,9 @@
"Light" = "Light";
"Line longer than the maximum allowed (255 characters)" = "Line longer than the maximum allowed (255 characters)";
"List Available Printers" = "List Available Printers";
+"Load paper." = "Load paper.";
"Long-Edge (Portrait)" = "Long-Edge (Portrait)";
-"Looking for printer." = "Looking for printer.";
+"Looking for printer..." = "Looking for printer…";
"Manual Feed" = "Manual Feed";
"Media Size" = "Media Size";
"Media Source" = "Media Source";
@@ -873,11 +1001,14 @@
"Missing option keyword" = "Missing option keyword";
"Missing requesting-user-name attribute." = "Missing requesting-user-name attribute.";
"Missing required attributes." = "Missing required attributes.";
+"Missing resource in URI" = "Missing resource in URI";
+"Missing scheme in URI" = "Missing scheme in URI";
"Missing value on line %d." = "Missing value on line %d.";
"Missing value string" = "Missing value string";
"Missing x-dimension in media-size." = "Missing x-dimension in media-size.";
"Missing y-dimension in media-size." = "Missing y-dimension in media-size.";
"Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s" = "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s";
+"Modifiers:" = "Modifiers:";
"Modify Class" = "Modify Class";
"Modify Printer" = "Modify Printer";
"Move All Jobs" = "Move All Jobs";
@@ -887,14 +1018,13 @@
"Name OID uses indefinite length" = "Name OID uses indefinite length";
"Nested classes are not allowed." = "Nested classes are not allowed.";
"Never" = "Never";
-"New Stylus Color Series" = "New Stylus Color Series";
-"New Stylus Photo Series" = "New Stylus Photo Series";
"No" = "No";
"No Content" = "No Content";
"No PPD name" = "No PPD name";
"No VarBind SEQUENCE" = "No VarBind SEQUENCE";
"No Windows printer drivers are installed." = "No Windows printer drivers are installed.";
"No active connection" = "No active connection";
+"No active connection." = "No active connection.";
"No active jobs on %s." = "No active jobs on %s.";
"No attributes in request." = "No attributes in request.";
"No authentication information provided." = "No authentication information provided.";
@@ -912,6 +1042,9 @@
"No printer-uri found" = "No printer-uri found";
"No printer-uri found for class" = "No printer-uri found for class";
"No printer-uri in request." = "No printer-uri in request.";
+"No request URI." = "No request URI.";
+"No request protocol version." = "No request protocol version.";
+"No request sent." = "No request sent.";
"No request-id" = "No request-id";
"No subscription attributes in request." = "No subscription attributes in request.";
"No subscriptions found." = "No subscriptions found.";
@@ -936,16 +1069,15 @@
"OpenGroup without a CloseGroup first" = "OpenGroup without a CloseGroup first";
"OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" = "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first";
"Operation Policy" = "Operation Policy";
-"Option \"%s\" cannot be included via %%%%IncludeFeature." = "Option \"%s\" cannot be included via %%%%IncludeFeature.";
+"Option \"%s\" cannot be included via %%%%IncludeFeature." = "Option “%s†cannot be included via %%%%IncludeFeature.";
"Options Installed" = "Options Installed";
"Options:" = "Options:";
"Out of date PPD cache file." = "Out of date PPD cache file.";
"Out of memory." = "Out of memory.";
"Output Mode" = "Output Mode";
-"Output for printer %s is sent to %s" = "Output for printer %s is sent to %s";
-"Output for printer %s is sent to remote printer %s on %s" = "Output for printer %s is sent to remote printer %s on %s";
-"Output for printer %s/%s is sent to %s" = "Output for printer %s/%s is sent to %s";
-"Output for printer %s/%s is sent to remote printer %s on %s" = "Output for printer %s/%s is sent to remote printer %s on %s";
+"Output bin is almost full." = "Output bin is almost full.";
+"Output bin is full." = "Output bin is full.";
+"Output bin is missing." = "Output bin is missing.";
"PASS" = "PASS";
"PCL Laser Printer" = "PCL Laser Printer";
"PRC16K" = "PRC16K";
@@ -956,6 +1088,10 @@
"PRC32K Oversize Long Edge" = "PRC32K Oversize Long Edge";
"Packet does not contain a Get-Response-PDU" = "Packet does not contain a Get-Response-PDU";
"Packet does not start with SEQUENCE" = "Packet does not start with SEQUENCE";
+"Paper jam." = "Paper jam.";
+"Paper tray is almost empty." = "Paper tray is almost empty.";
+"Paper tray is empty." = "Paper tray is empty.";
+"Paper tray is missing." = "Paper tray is missing.";
"ParamCustominCutInterval" = "ParamCustominCutInterval";
"ParamCustominTearInterval" = "ParamCustominTearInterval";
"Password for %s on %s? " = "Password for %s on %s? ";
@@ -973,6 +1109,7 @@
"Postcard Double " = "Postcard Double ";
"Postcard Double Long Edge" = "Postcard Double Long Edge";
"Postcard Long Edge" = "Postcard Long Edge";
+"Preparing to print." = "Preparing to print.";
"Print Density" = "Print Density";
"Print Job:" = "Print Job:";
"Print Mode" = "Print Mode";
@@ -982,12 +1119,10 @@
"Print Test Page" = "Print Test Page";
"Print and Cut" = "Print and Cut";
"Print and Tear" = "Print and Tear";
-"Print file accepted - job ID %d." = "Print file accepted - job ID %d.";
-"Print file accepted - job ID unknown." = "Print file accepted - job ID unknown.";
"Print file sent." = "Print file sent.";
-"Print file was not accepted." = "Print file was not accepted.";
"Print job canceled at printer." = "Print job canceled at printer.";
"Print job too large." = "Print job too large.";
+"Print job was not accepted." = "Print job was not accepted.";
"Printer Added" = "Printer Added";
"Printer Default" = "Printer Default";
"Printer Deleted" = "Printer Deleted";
@@ -995,15 +1130,13 @@
"Printer Paused" = "Printer Paused";
"Printer Settings" = "Printer Settings";
"Printer cannot print supplied content." = "Printer cannot print supplied content.";
+"Printer cannot print with supplied options." = "Printer cannot print with supplied options.";
"Printer:" = "Printer:";
"Printers" = "Printers";
-"Printing page %d, %d%% complete." = "Printing page %d, %d%% complete.";
-"Purge Jobs" = "Purge Jobs";
+"Printing page %d, %u%% complete." = "Printing page %d, %u%% complete.";
"Quarto" = "Quarto";
"Quota limit reached." = "Quota limit reached.";
"Rank Owner Job File(s) Total Size" = "Rank Owner Job File(s) Total Size";
-// TRANSLATORS: Pri is job priority.
-"Rank Owner Pri Job Files Total Size" = "Rank Owner Pri Job Files Total Size";
"Reject Jobs" = "Reject Jobs";
"Remote host did not accept control file (%d)." = "Remote host did not accept control file (%d).";
"Remote host did not accept data file (%d)." = "Remote host did not accept data file (%d).";
@@ -1023,6 +1156,7 @@
"Server Security Auditing" = "Server Security Auditing";
"Server Started" = "Server Started";
"Server Stopped" = "Server Stopped";
+"Server credentials not set." = "Server credentials not set.";
"Service Unavailable" = "Service Unavailable";
"Set Allowed Users" = "Set Allowed Users";
"Set As Server Default" = "Set As Server Default";
@@ -1038,9 +1172,8 @@
"Starting Banner" = "Starting Banner";
"Starting page %d." = "Starting page %d.";
"Statement" = "Statement";
-"Stylus Color Series" = "Stylus Color Series";
-"Stylus Photo Series" = "Stylus Photo Series";
"Subscription #%d does not exist." = "Subscription #%d does not exist.";
+"Substitutions:" = "Substitutions:";
"Super A" = "Super A";
"Super B" = "Super B";
"Super B/A3" = "Super B/A3";
@@ -1051,11 +1184,12 @@
"Tear" = "Tear";
"Tear-Off" = "Tear-Off";
"Tear-Off Adjust Position" = "Tear-Off Adjust Position";
+"The \"%s\" attribute is required for print jobs." = "The “%s†attribute is required for print jobs.";
"The %s attribute cannot be provided with job-ids." = "The %s attribute cannot be provided with job-ids.";
-"The '%s' Job Description attribute cannot be supplied in a job creation request." = "The '%s' Job Description attribute cannot be supplied in a job creation request.";
+"The '%s' Job Status attribute cannot be supplied in a job creation request." = "The '%s' Job Status attribute cannot be supplied in a job creation request.";
"The '%s' operation attribute cannot be supplied in a Create-Job request." = "The '%s' operation attribute cannot be supplied in a Create-Job request.";
-"The PPD file \"%s\" could not be found." = "The PPD file \"%s\" could not be found.";
-"The PPD file \"%s\" could not be opened: %s" = "The PPD file \"%s\" could not be opened: %s";
+"The PPD file \"%s\" could not be found." = "The PPD file “%s†could not be found.";
+"The PPD file \"%s\" could not be opened: %s" = "The PPD file “%s†could not be opened: %s";
"The PPD file could not be opened." = "The PPD file could not be opened.";
"The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." = "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#).";
"The developer unit needs to be replaced." = "The developer unit needs to be replaced.";
@@ -1066,24 +1200,16 @@
"The notify-user-data value is too large (%d > 63 octets)." = "The notify-user-data value is too large (%d > 63 octets).";
"The optical photoconductor needs to be replaced." = "The optical photoconductor needs to be replaced.";
"The optical photoconductor will need to be replaced soon." = "The optical photoconductor will need to be replaced soon.";
-"The output bin is almost full." = "The output bin is almost full.";
-"The output bin is full." = "The output bin is full.";
-"The output bin is missing." = "The output bin is missing.";
-"The paper tray is almost empty." = "The paper tray is almost empty.";
-"The paper tray is empty." = "The paper tray is empty.";
-"The paper tray is missing." = "The paper tray is missing.";
-"The paper tray needs to be filled." = "The paper tray needs to be filled.";
-"The printer URI is incorrect or no longer exists." = "The printer URI is incorrect or no longer exists.";
+"The printer configuration is incorrect or the printer no longer exists." = "The printer configuration is incorrect or the printer no longer exists.";
"The printer did not respond." = "The printer did not respond.";
-"The printer does not support IPP/%d.%d, trying IPP/%s." = "The printer does not support IPP/%d.%d, trying IPP/%s.";
"The printer is in use." = "The printer is in use.";
+"The printer is low on ink." = "The printer is low on ink.";
+"The printer is low on toner." = "The printer is low on toner.";
"The printer is not connected." = "The printer is not connected.";
"The printer is not responding." = "The printer is not responding.";
"The printer is now connected." = "The printer is now connected.";
"The printer is now online." = "The printer is now online.";
"The printer is offline." = "The printer is offline.";
-"The printer is running low on ink." = "The printer is running low on ink.";
-"The printer is running low on toner." = "The printer is running low on toner.";
"The printer is unreachable at this time." = "The printer is unreachable at this time.";
"The printer may be out of ink." = "The printer may be out of ink.";
"The printer may be out of toner." = "The printer may be out of toner.";
@@ -1096,15 +1222,14 @@
"The printer's interlock is open." = "The printer's interlock is open.";
"The printer's waste bin is almost full." = "The printer's waste bin is almost full.";
"The printer's waste bin is full." = "The printer's waste bin is full.";
-"The printer-uri \"%s\" contains invalid characters." = "The printer-uri \"%s\" contains invalid characters.";
+"The printer-uri \"%s\" contains invalid characters." = "The printer-uri “%s†contains invalid characters.";
"The printer-uri attribute is required." = "The printer-uri attribute is required.";
-"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." = "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\".";
-"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." = "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\".";
+"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." = "The printer-uri must be of the form “ipp://HOSTNAME/classes/CLASSNAMEâ€.";
+"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." = "The printer-uri must be of the form “ipp://HOSTNAME/printers/PRINTERNAMEâ€.";
"The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." = "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#).";
-"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." = "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it.";
-"The which-jobs value \"%s\" is not supported." = "The which-jobs value \"%s\" is not supported.";
+"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." = "The web interface is currently disabled. Run “cupsctl WebInterface=yes†to enable it.";
+"The which-jobs value \"%s\" is not supported." = "The which-jobs value “%s†is not supported.";
"There are too many subscriptions." = "There are too many subscriptions.";
-"There is a paper jam." = "There is a paper jam.";
"There was an unrecoverable USB error." = "There was an unrecoverable USB error.";
"Thermal Transfer Media" = "Thermal Transfer Media";
"Too many active jobs." = "Too many active jobs.";
@@ -1117,6 +1242,7 @@
"Tray 3" = "Tray 3";
"Tray 4" = "Tray 4";
"URI Too Long" = "URI Too Long";
+"URI too large" = "URI too large";
"US Ledger" = "US Ledger";
"US Legal" = "US Legal";
"US Legal Oversize" = "US Legal Oversize";
@@ -1130,7 +1256,7 @@
"Unable to add RSS subscription" = "Unable to add RSS subscription";
"Unable to add class" = "Unable to add class";
"Unable to add document to print job." = "Unable to add document to print job.";
-"Unable to add job for destination \"%s\"." = "Unable to add job for destination \"%s\".";
+"Unable to add job for destination \"%s\"." = "Unable to add job for destination “%sâ€.";
"Unable to add printer" = "Unable to add printer";
"Unable to allocate memory for file types." = "Unable to allocate memory for file types.";
"Unable to allocate memory for page info" = "Unable to allocate memory for page info";
@@ -1140,6 +1266,8 @@
"Unable to change printer" = "Unable to change printer";
"Unable to change printer-is-shared attribute" = "Unable to change printer-is-shared attribute";
"Unable to change server settings" = "Unable to change server settings";
+"Unable to compile mimeMediaType regular expression: %s." = "Unable to compile mimeMediaType regular expression: %s.";
+"Unable to compile naturalLanguage regular expression: %s." = "Unable to compile naturalLanguage regular expression: %s.";
"Unable to configure printer options." = "Unable to configure printer options.";
"Unable to connect to host." = "Unable to connect to host.";
"Unable to contact printer, queuing on next printer in class." = "Unable to contact printer, queuing on next printer in class.";
@@ -1151,8 +1279,8 @@
"Unable to copy Windows 2000 printer driver files (%d)." = "Unable to copy Windows 2000 printer driver files (%d).";
"Unable to copy Windows 9x printer driver files (%d)." = "Unable to copy Windows 9x printer driver files (%d).";
"Unable to copy interface script - %s" = "Unable to copy interface script - %s";
-"Unable to create compressed print file" = "Unable to create compressed print file";
"Unable to create printer-uri" = "Unable to create printer-uri";
+"Unable to create server credentials." = "Unable to create server credentials.";
"Unable to create temporary file" = "Unable to create temporary file";
"Unable to delete class" = "Unable to delete class";
"Unable to delete printer" = "Unable to delete printer";
@@ -1168,7 +1296,7 @@
"Unable to establish a secure connection to host." = "Unable to establish a secure connection to host.";
"Unable to find destination for job" = "Unable to find destination for job";
"Unable to find printer." = "Unable to find printer.";
-"Unable to generate compressed print file" = "Unable to generate compressed print file";
+"Unable to find server credentials." = "Unable to find server credentials.";
"Unable to get backend exit status." = "Unable to get backend exit status.";
"Unable to get class list" = "Unable to get class list";
"Unable to get class status" = "Unable to get class status";
@@ -1180,14 +1308,13 @@
"Unable to install Windows 2000 printer driver files (%d)." = "Unable to install Windows 2000 printer driver files (%d).";
"Unable to install Windows 9x printer driver files (%d)." = "Unable to install Windows 9x printer driver files (%d).";
"Unable to load help index." = "Unable to load help index.";
-"Unable to locate printer \"%s\"." = "Unable to locate printer \"%s\".";
+"Unable to locate printer \"%s\"." = "Unable to locate printer “%sâ€.";
"Unable to locate printer." = "Unable to locate printer.";
"Unable to modify class" = "Unable to modify class";
"Unable to modify printer" = "Unable to modify printer";
"Unable to move job" = "Unable to move job";
"Unable to move jobs" = "Unable to move jobs";
"Unable to open PPD file" = "Unable to open PPD file";
-"Unable to open compressed print file" = "Unable to open compressed print file";
"Unable to open cupsd.conf file:" = "Unable to open cupsd.conf file:";
"Unable to open device file" = "Unable to open device file";
"Unable to open document #%d in job #%d." = "Unable to open document #%d in job #%d.";
@@ -1196,8 +1323,9 @@
"Unable to open raster file" = "Unable to open raster file";
"Unable to print test page" = "Unable to print test page";
"Unable to read print data." = "Unable to read print data.";
-"Unable to resolve printer URI." = "Unable to resolve printer URI.";
-"Unable to run \"%s\": %s" = "Unable to run \"%s\": %s";
+"Unable to rename job document file." = "Unable to rename job document file.";
+"Unable to resolve printer-uri." = "Unable to resolve printer-uri.";
+"Unable to run \"%s\": %s" = "Unable to run “%sâ€: %s";
"Unable to see in file" = "Unable to see in file";
"Unable to send command to printer driver" = "Unable to send command to printer driver";
"Unable to send data to printer." = "Unable to send data to printer.";
@@ -1212,26 +1340,29 @@
"Unauthorized" = "Unauthorized";
"Units" = "Units";
"Unknown" = "Unknown";
-"Unknown choice \"%s\" for option \"%s\"." = "Unknown choice \"%s\" for option \"%s\".";
-"Unknown encryption option value: \"%s\"." = "Unknown encryption option value: \"%s\".";
-"Unknown file order: \"%s\"." = "Unknown file order: \"%s\".";
-"Unknown format character: \"%c\"." = "Unknown format character: \"%c\".";
+"Unknown choice \"%s\" for option \"%s\"." = "Unknown choice “%s†for option “%sâ€.";
+"Unknown encryption option value: \"%s\"." = "Unknown encryption option value: “%sâ€.";
+"Unknown file order: \"%s\"." = "Unknown file order: “%sâ€.";
+"Unknown format character: \"%c\"." = "Unknown format character: “%câ€.";
"Unknown media size name." = "Unknown media size name.";
-"Unknown option \"%s\" with value \"%s\"." = "Unknown option \"%s\" with value \"%s\".";
-"Unknown option \"%s\"." = "Unknown option \"%s\".";
-"Unknown print mode: \"%s\"." = "Unknown print mode: \"%s\".";
-"Unknown printer-error-policy \"%s\"." = "Unknown printer-error-policy \"%s\".";
-"Unknown printer-op-policy \"%s\"." = "Unknown printer-op-policy \"%s\".";
+"Unknown option \"%s\" with value \"%s\"." = "Unknown option “%s†with value “%sâ€.";
+"Unknown option \"%s\"." = "Unknown option “%sâ€.";
+"Unknown print mode: \"%s\"." = "Unknown print mode: “%sâ€.";
+"Unknown printer-error-policy \"%s\"." = "Unknown printer-error-policy “%sâ€.";
+"Unknown printer-op-policy \"%s\"." = "Unknown printer-op-policy “%sâ€.";
+"Unknown request method." = "Unknown request method.";
+"Unknown request version." = "Unknown request version.";
+"Unknown scheme in URI" = "Unknown scheme in URI";
"Unknown service name." = "Unknown service name.";
-"Unknown version option value: \"%s\"." = "Unknown version option value: \"%s\".";
-"Unsupported 'compression' value \"%s\"." = "Unsupported 'compression' value \"%s\".";
-"Unsupported 'document-format' value \"%s\"." = "Unsupported 'document-format' value \"%s\".";
+"Unknown version option value: \"%s\"." = "Unknown version option value: “%sâ€.";
+"Unsupported 'compression' value \"%s\"." = "Unsupported 'compression' value “%sâ€.";
+"Unsupported 'document-format' value \"%s\"." = "Unsupported 'document-format' value “%sâ€.";
"Unsupported 'job-name' value." = "Unsupported 'job-name' value.";
-"Unsupported character set \"%s\"." = "Unsupported character set \"%s\".";
-"Unsupported compression \"%s\"." = "Unsupported compression \"%s\".";
-"Unsupported document-format \"%s\"." = "Unsupported document-format \"%s\".";
-"Unsupported document-format \"%s/%s\"." = "Unsupported document-format \"%s/%s\".";
-"Unsupported format \"%s\"." = "Unsupported format \"%s\".";
+"Unsupported character set \"%s\"." = "Unsupported character set “%sâ€.";
+"Unsupported compression \"%s\"." = "Unsupported compression “%sâ€.";
+"Unsupported document-format \"%s\"." = "Unsupported document-format “%sâ€.";
+"Unsupported document-format \"%s/%s\"." = "Unsupported document-format “%s/%sâ€.";
+"Unsupported format \"%s\"." = "Unsupported format “%sâ€.";
"Unsupported margins." = "Unsupported margins.";
"Unsupported media value." = "Unsupported media value.";
"Unsupported number-up value %d, using number-up=1." = "Unsupported number-up value %d, using number-up=1.";
@@ -1242,23 +1373,23 @@
"Upgrade Required" = "Upgrade Required";
"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]" = "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]";
"Usage: %s job-id user title copies options [file]" = "Usage: %s job-id user title copies options [file]";
-"Usage: cupsaddsmb [options] printer1 ... printerN" = "Usage: cupsaddsmb [options] printer1 ... printerN";
-"Usage: cupsctl [options] [param=value ... paramN=valueN]" = "Usage: cupsctl [options] [param=value ... paramN=valueN]";
+"Usage: cupsaddsmb [options] printer1 ... printerN" = "Usage: cupsaddsmb [options] printer1 … printerN";
+"Usage: cupsctl [options] [param=value ... paramN=valueN]" = "Usage: cupsctl [options] [param=value … paramN=valueN]";
"Usage: cupsd [options]" = "Usage: cupsd [options]";
-"Usage: cupsfilter [ options ] filename" = "Usage: cupsfilter [ options ] filename";
-"Usage: cupstestdsc [options] filename.ps [... filename.ps]" = "Usage: cupstestdsc [options] filename.ps [... filename.ps]";
-"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" = "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]";
-"Usage: ipptool [options] URI filename [ ... filenameN ]" = "Usage: ipptool [options] URI filename [ ... filenameN ]";
+"Usage: cupsfilter [ options ] [ -- ] filename" = "Usage: cupsfilter [ options ] [ -- ] filename";
+"Usage: cupstestdsc [options] filename.ps [... filename.ps]" = "Usage: cupstestdsc [options] filename.ps [… filename.ps]";
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" = "Usage: cupstestppd [options] filename1.ppd[.gz] [… filenameN.ppd[.gz]]";
+"Usage: ippdiscover [options] -a\n ippdiscover [options] \"service name\"\n\nOptions:" = "Usage: ippdiscover [options] -a\n ippdiscover [options] “service nameâ€\n\nOptions:";
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n ippfind [options] name[.regtype[.domain.]] ... [expression]\n ippfind --help\n ippfind --version" = "Usage: ippfind [options] regtype[,subtype][.domain.] … [expression]\n ippfind [options] name[.regtype[.domain.]] … [expression]\n ippfind --help\n ippfind --version";
+"Usage: ipptool [options] URI filename [ ... filenameN ]" = "Usage: ipptool [options] URI filename [ … filenameN ]";
"Usage: lpmove job/src dest" = "Usage: lpmove job/src dest";
-"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" = "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";
-"Usage: lppasswd [-g groupname]" = "Usage: lppasswd [-g groupname]";
-"Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]" = "Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]";
+"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" = "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";
"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" = "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]";
-"Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" = "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]";
+"Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" = "Usage: ppdc [options] filename.drv [ … filenameN.drv ]";
"Usage: ppdhtml [options] filename.drv >filename.html" = "Usage: ppdhtml [options] filename.drv >filename.html";
-"Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]";
-"Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]";
-"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" = "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]";
+"Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdi [options] filename.ppd [ … filenameN.ppd ]";
+"Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdmerge [options] filename.ppd [ … filenameN.ppd ]";
+"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" = "Usage: ppdpo [options] -o filename.po filename.drv [ … filenameN.drv ]";
"Usage: snmp [host-or-ip-address]" = "Usage: snmp [host-or-ip-address]";
"Value uses indefinite length" = "Value uses indefinite length";
"VarBind uses indefinite length" = "VarBind uses indefinite length";
@@ -1270,7 +1401,6 @@
"Web Interface is Disabled" = "Web Interface is Disabled";
"Yes" = "Yes";
"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>." = "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>.";
-"Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number." = "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number.";
"ZPL Label Printer" = "ZPL Label Printer";
"Zebra" = "Zebra";
"aborted" = "aborted";
@@ -1278,19 +1408,19 @@
"completed" = "completed";
"cups-deviced failed to execute." = "cups-deviced failed to execute.";
"cups-driverd failed to execute." = "cups-driverd failed to execute.";
-"cupsaddsmb: No PPD file for printer \"%s\" - %s" = "cupsaddsmb: No PPD file for printer \"%s\" - %s";
+"cupsaddsmb: No PPD file for printer \"%s\" - %s" = "cupsaddsmb: No PPD file for printer “%s†- %s";
"cupsctl: Cannot set Listen or Port directly." = "cupsctl: Cannot set Listen or Port directly.";
"cupsctl: Unable to connect to server: %s" = "cupsctl: Unable to connect to server: %s";
-"cupsctl: Unknown option \"%s\"" = "cupsctl: Unknown option \"%s\"";
-"cupsctl: Unknown option \"-%c\"" = "cupsctl: Unknown option \"-%c\"";
-"cupsd: Expected config filename after \"-c\" option." = "cupsd: Expected config filename after \"-c\" option.";
-"cupsd: Expected cups-files.conf filename after \"-s\" option." = "cupsd: Expected cups-files.conf filename after \"-s\" option.";
+"cupsctl: Unknown option \"%s\"" = "cupsctl: Unknown option “%sâ€";
+"cupsctl: Unknown option \"-%c\"" = "cupsctl: Unknown option “-%câ€";
+"cupsd: Expected config filename after \"-c\" option." = "cupsd: Expected config filename after “-c†option.";
+"cupsd: Expected cups-files.conf filename after \"-s\" option." = "cupsd: Expected cups-files.conf filename after “-s†option.";
+"cupsd: On-demand support not compiled in, running in normal mode." = "cupsd: On-demand support not compiled in, running in normal mode.";
"cupsd: Relative cups-files.conf filename not allowed." = "cupsd: Relative cups-files.conf filename not allowed.";
"cupsd: Unable to get current directory." = "cupsd: Unable to get current directory.";
"cupsd: Unable to get path to cups-files.conf file." = "cupsd: Unable to get path to cups-files.conf file.";
-"cupsd: Unknown argument \"%s\" - aborting." = "cupsd: Unknown argument \"%s\" - aborting.";
-"cupsd: Unknown option \"%c\" - aborting." = "cupsd: Unknown option \"%c\" - aborting.";
-"cupsd: launchd(8) support not compiled in, running in normal mode." = "cupsd: launchd(8) support not compiled in, running in normal mode.";
+"cupsd: Unknown argument \"%s\" - aborting." = "cupsd: Unknown argument “%s†- aborting.";
+"cupsd: Unknown option \"%c\" - aborting." = "cupsd: Unknown option “%c†- aborting.";
"cupsfilter: Invalid document number %d." = "cupsfilter: Invalid document number %d.";
"cupsfilter: Invalid job ID %d." = "cupsfilter: Invalid job ID %d.";
"cupsfilter: Only one filename can be specified." = "cupsfilter: Only one filename can be specified.";
@@ -1304,37 +1434,55 @@
"held" = "held";
"help\t\tGet help on commands." = "help\t\tGet help on commands.";
"idle" = "idle";
-"ipptool: \"-i\" and \"-n\" are incompatible with -X\"." = "ipptool: \"-i\" and \"-n\" are incompatible with -X\".";
+"ippfind: Bad regular expression: %s" = "ippfind: Bad regular expression: %s";
+"ippfind: Cannot use --and after --or." = "ippfind: Cannot use --and after --or.";
+"ippfind: Expected key name after %s." = "ippfind: Expected key name after %s.";
+"ippfind: Expected port range after %s." = "ippfind: Expected port range after %s.";
+"ippfind: Expected program after %s." = "ippfind: Expected program after %s.";
+"ippfind: Expected semi-colon after %s." = "ippfind: Expected semi-colon after %s.";
+"ippfind: Missing close brace in substitution." = "ippfind: Missing close brace in substitution.";
+"ippfind: Missing close parenthesis." = "ippfind: Missing close parenthesis.";
+"ippfind: Missing expression before \"--and\"." = "ippfind: Missing expression before “--andâ€.";
+"ippfind: Missing expression before \"--or\"." = "ippfind: Missing expression before “--orâ€.";
+"ippfind: Missing key name after %s." = "ippfind: Missing key name after %s.";
+"ippfind: Missing open parenthesis." = "ippfind: Missing open parenthesis.";
+"ippfind: Missing program after %s." = "ippfind: Missing program after %s.";
+"ippfind: Missing regular expression after %s." = "ippfind: Missing regular expression after %s.";
+"ippfind: Missing semi-colon after %s." = "ippfind: Missing semi-colon after %s.";
+"ippfind: Out of memory." = "ippfind: Out of memory.";
+"ippfind: Too many parenthesis." = "ippfind: Too many parenthesis.";
+"ippfind: Unable to browse or resolve: %s" = "ippfind: Unable to browse or resolve: %s";
+"ippfind: Unable to execute \"%s\": %s" = "ippfind: Unable to execute “%sâ€: %s";
+"ippfind: Unable to use Bonjour: %s" = "ippfind: Unable to use Bonjour: %s";
+"ippfind: Unknown variable \"{%s}\"." = "ippfind: Unknown variable “{%s}â€.";
+"ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." = "ipptool: “-i†and “-n†are incompatible with “-P†and “-Xâ€.";
"ipptool: Bad URI - %s." = "ipptool: Bad URI - %s.";
-"ipptool: Bad version %s for \"-V\"." = "ipptool: Bad version %s for \"-V\".";
-"ipptool: Invalid seconds for \"-i\"." = "ipptool: Invalid seconds for \"-i\".";
+"ipptool: Invalid seconds for \"-i\"." = "ipptool: Invalid seconds for “-iâ€.";
"ipptool: May only specify a single URI." = "ipptool: May only specify a single URI.";
-"ipptool: Missing count for \"-n\"." = "ipptool: Missing count for \"-n\".";
-"ipptool: Missing filename for \"-f\"." = "ipptool: Missing filename for \"-f\".";
-"ipptool: Missing name=value for \"-d\"." = "ipptool: Missing name=value for \"-d\".";
-"ipptool: Missing seconds for \"-i\"." = "ipptool: Missing seconds for \"-i\".";
-"ipptool: Missing timeout for \"-T\"." = "ipptool: Missing timeout for \"-T\".";
-"ipptool: Missing version for \"-V\"." = "ipptool: Missing version for \"-V\".";
+"ipptool: Missing count for \"-n\"." = "ipptool: Missing count for “-nâ€.";
+"ipptool: Missing filename for \"-f\"." = "ipptool: Missing filename for “-fâ€.";
+"ipptool: Missing name=value for \"-d\"." = "ipptool: Missing name=value for “-dâ€.";
+"ipptool: Missing seconds for \"-i\"." = "ipptool: Missing seconds for “-iâ€.";
"ipptool: URI required before test file." = "ipptool: URI required before test file.";
-"ipptool: Unknown option \"-%c\"." = "ipptool: Unknown option \"-%c\".";
+"ipptool: Unknown option \"-%c\"." = "ipptool: Unknown option “-%câ€.";
"job-printer-uri attribute missing." = "job-printer-uri attribute missing.";
"lpadmin: Class name can only contain printable characters." = "lpadmin: Class name can only contain printable characters.";
-"lpadmin: Expected PPD after \"-P\" option." = "lpadmin: Expected PPD after \"-P\" option.";
-"lpadmin: Expected allow/deny:userlist after \"-u\" option." = "lpadmin: Expected allow/deny:userlist after \"-u\" option.";
-"lpadmin: Expected class after \"-r\" option." = "lpadmin: Expected class after \"-r\" option.";
-"lpadmin: Expected class name after \"-c\" option." = "lpadmin: Expected class name after \"-c\" option.";
-"lpadmin: Expected description after \"-D\" option." = "lpadmin: Expected description after \"-D\" option.";
-"lpadmin: Expected device URI after \"-v\" option." = "lpadmin: Expected device URI after \"-v\" option.";
-"lpadmin: Expected file type(s) after \"-I\" option." = "lpadmin: Expected file type(s) after \"-I\" option.";
-"lpadmin: Expected hostname after \"-h\" option." = "lpadmin: Expected hostname after \"-h\" option.";
-"lpadmin: Expected interface after \"-i\" option." = "lpadmin: Expected interface after \"-i\" option.";
-"lpadmin: Expected location after \"-L\" option." = "lpadmin: Expected location after \"-L\" option.";
-"lpadmin: Expected model after \"-m\" option." = "lpadmin: Expected model after \"-m\" option.";
-"lpadmin: Expected name after \"-R\" option." = "lpadmin: Expected name after \"-R\" option.";
-"lpadmin: Expected name=value after \"-o\" option." = "lpadmin: Expected name=value after \"-o\" option.";
-"lpadmin: Expected printer after \"-p\" option." = "lpadmin: Expected printer after \"-p\" option.";
-"lpadmin: Expected printer name after \"-d\" option." = "lpadmin: Expected printer name after \"-d\" option.";
-"lpadmin: Expected printer or class after \"-x\" option." = "lpadmin: Expected printer or class after \"-x\" option.";
+"lpadmin: Expected PPD after \"-P\" option." = "lpadmin: Expected PPD after “-P†option.";
+"lpadmin: Expected allow/deny:userlist after \"-u\" option." = "lpadmin: Expected allow/deny:userlist after “-u†option.";
+"lpadmin: Expected class after \"-r\" option." = "lpadmin: Expected class after “-r†option.";
+"lpadmin: Expected class name after \"-c\" option." = "lpadmin: Expected class name after “-c†option.";
+"lpadmin: Expected description after \"-D\" option." = "lpadmin: Expected description after “-D†option.";
+"lpadmin: Expected device URI after \"-v\" option." = "lpadmin: Expected device URI after “-v†option.";
+"lpadmin: Expected file type(s) after \"-I\" option." = "lpadmin: Expected file type(s) after “-I†option.";
+"lpadmin: Expected hostname after \"-h\" option." = "lpadmin: Expected hostname after “-h†option.";
+"lpadmin: Expected interface after \"-i\" option." = "lpadmin: Expected interface after “-i†option.";
+"lpadmin: Expected location after \"-L\" option." = "lpadmin: Expected location after “-L†option.";
+"lpadmin: Expected model after \"-m\" option." = "lpadmin: Expected model after “-m†option.";
+"lpadmin: Expected name after \"-R\" option." = "lpadmin: Expected name after “-R†option.";
+"lpadmin: Expected name=value after \"-o\" option." = "lpadmin: Expected name=value after “-o†option.";
+"lpadmin: Expected printer after \"-p\" option." = "lpadmin: Expected printer after “-p†option.";
+"lpadmin: Expected printer name after \"-d\" option." = "lpadmin: Expected printer name after “-d†option.";
+"lpadmin: Expected printer or class after \"-x\" option." = "lpadmin: Expected printer or class after “-x†option.";
"lpadmin: No member names were seen." = "lpadmin: No member names were seen.";
"lpadmin: Printer %s is already a member of class %s." = "lpadmin: Printer %s is already a member of class %s.";
"lpadmin: Printer %s is not a member of class %s." = "lpadmin: Printer %s is not a member of class %s.";
@@ -1343,57 +1491,46 @@
"lpadmin: Unable to connect to server: %s" = "lpadmin: Unable to connect to server: %s";
"lpadmin: Unable to create temporary file" = "lpadmin: Unable to create temporary file";
"lpadmin: Unable to delete option:\n You must specify a printer name first." = "lpadmin: Unable to delete option:\n You must specify a printer name first.";
-"lpadmin: Unable to open PPD file \"%s\" - %s" = "lpadmin: Unable to open PPD file \"%s\" - %s";
+"lpadmin: Unable to open PPD \"%s\": %s on line %d." = "lpadmin: Unable to open PPD “%sâ€: %s on line %d.";
+"lpadmin: Unable to open PPD file \"%s\" - %s" = "lpadmin: Unable to open PPD file “%s†- %s";
"lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first." = "lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first.";
"lpadmin: Unable to set the printer options:\n You must specify a printer name first." = "lpadmin: Unable to set the printer options:\n You must specify a printer name first.";
-"lpadmin: Unknown allow/deny option \"%s\"." = "lpadmin: Unknown allow/deny option \"%s\".";
-"lpadmin: Unknown argument \"%s\"." = "lpadmin: Unknown argument \"%s\".";
-"lpadmin: Unknown option \"%c\"." = "lpadmin: Unknown option \"%c\".";
+"lpadmin: Unknown allow/deny option \"%s\"." = "lpadmin: Unknown allow/deny option “%sâ€.";
+"lpadmin: Unknown argument \"%s\"." = "lpadmin: Unknown argument “%sâ€.";
+"lpadmin: Unknown option \"%c\"." = "lpadmin: Unknown option “%câ€.";
"lpadmin: Warning - content type list ignored." = "lpadmin: Warning - content type list ignored.";
"lpc> " = "lpc> ";
-"lpinfo: Expected 1284 device ID string after \"--device-id\"." = "lpinfo: Expected 1284 device ID string after \"--device-id\".";
-"lpinfo: Expected language after \"--language\"." = "lpinfo: Expected language after \"--language\".";
-"lpinfo: Expected make and model after \"--make-and-model\"." = "lpinfo: Expected make and model after \"--make-and-model\".";
-"lpinfo: Expected product string after \"--product\"." = "lpinfo: Expected product string after \"--product\".";
-"lpinfo: Expected scheme list after \"--exclude-schemes\"." = "lpinfo: Expected scheme list after \"--exclude-schemes\".";
-"lpinfo: Expected scheme list after \"--include-schemes\"." = "lpinfo: Expected scheme list after \"--include-schemes\".";
-"lpinfo: Expected timeout after \"--timeout\"." = "lpinfo: Expected timeout after \"--timeout\".";
-"lpinfo: Unknown argument \"%s\"." = "lpinfo: Unknown argument \"%s\".";
-"lpinfo: Unknown option \"%c\"." = "lpinfo: Unknown option \"%c\".";
-"lpinfo: Unknown option \"%s\"." = "lpinfo: Unknown option \"%s\".";
+"lpinfo: Expected 1284 device ID string after \"--device-id\"." = "lpinfo: Expected 1284 device ID string after “--device-idâ€.";
+"lpinfo: Expected language after \"--language\"." = "lpinfo: Expected language after “--languageâ€.";
+"lpinfo: Expected make and model after \"--make-and-model\"." = "lpinfo: Expected make and model after “--make-and-modelâ€.";
+"lpinfo: Expected product string after \"--product\"." = "lpinfo: Expected product string after “--productâ€.";
+"lpinfo: Expected scheme list after \"--exclude-schemes\"." = "lpinfo: Expected scheme list after “--exclude-schemesâ€.";
+"lpinfo: Expected scheme list after \"--include-schemes\"." = "lpinfo: Expected scheme list after “--include-schemesâ€.";
+"lpinfo: Expected timeout after \"--timeout\"." = "lpinfo: Expected timeout after “--timeoutâ€.";
+"lpinfo: Unknown argument \"%s\"." = "lpinfo: Unknown argument “%sâ€.";
+"lpinfo: Unknown option \"%c\"." = "lpinfo: Unknown option “%câ€.";
+"lpinfo: Unknown option \"%s\"." = "lpinfo: Unknown option “%sâ€.";
"lpmove: Unable to connect to server: %s" = "lpmove: Unable to connect to server: %s";
-"lpmove: Unknown argument \"%s\"." = "lpmove: Unknown argument \"%s\".";
-"lpmove: Unknown option \"%c\"." = "lpmove: Unknown option \"%c\".";
+"lpmove: Unknown argument \"%s\"." = "lpmove: Unknown argument “%sâ€.";
+"lpmove: Unknown option \"%c\"." = "lpmove: Unknown option “%câ€.";
"lpoptions: No printers." = "lpoptions: No printers.";
"lpoptions: Unable to add printer or instance: %s" = "lpoptions: Unable to add printer or instance: %s";
"lpoptions: Unable to get PPD file for %s: %s" = "lpoptions: Unable to get PPD file for %s: %s";
"lpoptions: Unable to open PPD file for %s." = "lpoptions: Unable to open PPD file for %s.";
"lpoptions: Unknown printer or class." = "lpoptions: Unknown printer or class.";
-"lppasswd: Only root can add or delete passwords." = "lppasswd: Only root can add or delete passwords.";
-"lppasswd: Password file busy." = "lppasswd: Password file busy.";
-"lppasswd: Password file not updated." = "lppasswd: Password file not updated.";
-"lppasswd: Sorry, password doesn't match." = "lppasswd: Sorry, password doesn't match.";
-"lppasswd: Sorry, password rejected." = "lppasswd: Sorry, password rejected.";
-"lppasswd: Sorry, passwords don't match." = "lppasswd: Sorry, passwords don't match.";
-"lppasswd: Unable to copy password string: %s" = "lppasswd: Unable to copy password string: %s";
-"lppasswd: Unable to open password file: %s" = "lppasswd: Unable to open password file: %s";
-"lppasswd: Unable to write to password file: %s" = "lppasswd: Unable to write to password file: %s";
-"lppasswd: failed to backup old password file: %s" = "lppasswd: failed to backup old password file: %s";
-"lppasswd: failed to rename password file: %s" = "lppasswd: failed to rename password file: %s";
-"lppasswd: user \"%s\" and group \"%s\" do not exist." = "lppasswd: user \"%s\" and group \"%s\" do not exist.";
-"lpstat: error - %s environment variable names non-existent destination \"%s\"." = "lpstat: error - %s environment variable names non-existent destination \"%s\".";
+"lpstat: error - %s environment variable names non-existent destination \"%s\"." = "lpstat: error - %s environment variable names non-existent destination “%sâ€.";
"members of class %s:" = "members of class %s:";
"no entries" = "no entries";
"no system default destination" = "no system default destination";
"notify-events not specified." = "notify-events not specified.";
-"notify-recipient-uri URI \"%s\" is already used." = "notify-recipient-uri URI \"%s\" is already used.";
-"notify-recipient-uri URI \"%s\" uses unknown scheme." = "notify-recipient-uri URI \"%s\" uses unknown scheme.";
+"notify-recipient-uri URI \"%s\" is already used." = "notify-recipient-uri URI “%s†is already used.";
+"notify-recipient-uri URI \"%s\" uses unknown scheme." = "notify-recipient-uri URI “%s†uses unknown scheme.";
"pending" = "pending";
-"ppdc: Adding include directory \"%s\"." = "ppdc: Adding include directory \"%s\".";
+"ppdc: Adding include directory \"%s\"." = "ppdc: Adding include directory “%sâ€.";
"ppdc: Adding/updating UI text from %s." = "ppdc: Adding/updating UI text from %s.";
"ppdc: Bad boolean value (%s) on line %d of %s." = "ppdc: Bad boolean value (%s) on line %d of %s.";
"ppdc: Bad font attribute: %s" = "ppdc: Bad font attribute: %s";
-"ppdc: Bad resolution name \"%s\" on line %d of %s." = "ppdc: Bad resolution name \"%s\" on line %d of %s.";
+"ppdc: Bad resolution name \"%s\" on line %d of %s." = "ppdc: Bad resolution name “%s†on line %d of %s.";
"ppdc: Bad status keyword %s on line %d of %s." = "ppdc: Bad status keyword %s on line %d of %s.";
"ppdc: Bad variable substitution ($%c) on line %d of %s." = "ppdc: Bad variable substitution ($%c) on line %d of %s.";
"ppdc: Choice found on line %d of %s with no Option." = "ppdc: Choice found on line %d of %s with no Option.";
@@ -1442,16 +1579,16 @@
"ppdc: Expected two option names on line %d of %s." = "ppdc: Expected two option names on line %d of %s.";
"ppdc: Expected value after %s on line %d of %s." = "ppdc: Expected value after %s on line %d of %s.";
"ppdc: Expected version after Font on line %d of %s." = "ppdc: Expected version after Font on line %d of %s.";
-"ppdc: Invalid #include/#po filename \"%s\"." = "ppdc: Invalid #include/#po filename \"%s\".";
+"ppdc: Invalid #include/#po filename \"%s\"." = "ppdc: Invalid #include/#po filename “%sâ€.";
"ppdc: Invalid cost for filter on line %d of %s." = "ppdc: Invalid cost for filter on line %d of %s.";
"ppdc: Invalid empty MIME type for filter on line %d of %s." = "ppdc: Invalid empty MIME type for filter on line %d of %s.";
"ppdc: Invalid empty program name for filter on line %d of %s." = "ppdc: Invalid empty program name for filter on line %d of %s.";
-"ppdc: Invalid option section \"%s\" on line %d of %s." = "ppdc: Invalid option section \"%s\" on line %d of %s.";
-"ppdc: Invalid option type \"%s\" on line %d of %s." = "ppdc: Invalid option type \"%s\" on line %d of %s.";
-"ppdc: Loading driver information file \"%s\"." = "ppdc: Loading driver information file \"%s\".";
-"ppdc: Loading messages for locale \"%s\"." = "ppdc: Loading messages for locale \"%s\".";
-"ppdc: Loading messages from \"%s\"." = "ppdc: Loading messages from \"%s\".";
-"ppdc: Missing #endif at end of \"%s\"." = "ppdc: Missing #endif at end of \"%s\".";
+"ppdc: Invalid option section \"%s\" on line %d of %s." = "ppdc: Invalid option section “%s†on line %d of %s.";
+"ppdc: Invalid option type \"%s\" on line %d of %s." = "ppdc: Invalid option type “%s†on line %d of %s.";
+"ppdc: Loading driver information file \"%s\"." = "ppdc: Loading driver information file “%sâ€.";
+"ppdc: Loading messages for locale \"%s\"." = "ppdc: Loading messages for locale “%sâ€.";
+"ppdc: Loading messages from \"%s\"." = "ppdc: Loading messages from “%sâ€.";
+"ppdc: Missing #endif at end of \"%s\"." = "ppdc: Missing #endif at end of “%sâ€.";
"ppdc: Missing #if on line %d of %s." = "ppdc: Missing #if on line %d of %s.";
"ppdc: Need a msgid line before any translation strings on line %d of %s." = "ppdc: Need a msgid line before any translation strings on line %d of %s.";
"ppdc: No message catalog provided for locale %s." = "ppdc: No message catalog provided for locale %s.";
@@ -1459,28 +1596,28 @@
"ppdc: Option %s redefined with a different type on line %d of %s." = "ppdc: Option %s redefined with a different type on line %d of %s.";
"ppdc: Option constraint must *name on line %d of %s." = "ppdc: Option constraint must *name on line %d of %s.";
"ppdc: Too many nested #if's on line %d of %s." = "ppdc: Too many nested #if's on line %d of %s.";
-"ppdc: Unable to create PPD file \"%s\" - %s." = "ppdc: Unable to create PPD file \"%s\" - %s.";
+"ppdc: Unable to create PPD file \"%s\" - %s." = "ppdc: Unable to create PPD file “%s†- %s.";
"ppdc: Unable to create output directory %s: %s" = "ppdc: Unable to create output directory %s: %s";
"ppdc: Unable to create output pipes: %s" = "ppdc: Unable to create output pipes: %s";
"ppdc: Unable to execute cupstestppd: %s" = "ppdc: Unable to execute cupstestppd: %s";
"ppdc: Unable to find #po file %s on line %d of %s." = "ppdc: Unable to find #po file %s on line %d of %s.";
-"ppdc: Unable to find include file \"%s\" on line %d of %s." = "ppdc: Unable to find include file \"%s\" on line %d of %s.";
-"ppdc: Unable to find localization for \"%s\" - %s" = "ppdc: Unable to find localization for \"%s\" - %s";
-"ppdc: Unable to load localization file \"%s\" - %s" = "ppdc: Unable to load localization file \"%s\" - %s";
+"ppdc: Unable to find include file \"%s\" on line %d of %s." = "ppdc: Unable to find include file “%s†on line %d of %s.";
+"ppdc: Unable to find localization for \"%s\" - %s" = "ppdc: Unable to find localization for “%s†- %s";
+"ppdc: Unable to load localization file \"%s\" - %s" = "ppdc: Unable to load localization file “%s†- %s";
"ppdc: Unable to open %s: %s" = "ppdc: Unable to open %s: %s";
"ppdc: Undefined variable (%s) on line %d of %s." = "ppdc: Undefined variable (%s) on line %d of %s.";
"ppdc: Unexpected text on line %d of %s." = "ppdc: Unexpected text on line %d of %s.";
"ppdc: Unknown driver type %s on line %d of %s." = "ppdc: Unknown driver type %s on line %d of %s.";
-"ppdc: Unknown duplex type \"%s\" on line %d of %s." = "ppdc: Unknown duplex type \"%s\" on line %d of %s.";
-"ppdc: Unknown media size \"%s\" on line %d of %s." = "ppdc: Unknown media size \"%s\" on line %d of %s.";
-"ppdc: Unknown message catalog format for \"%s\"." = "ppdc: Unknown message catalog format for \"%s\".";
-"ppdc: Unknown token \"%s\" seen on line %d of %s." = "ppdc: Unknown token \"%s\" seen on line %d of %s.";
-"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." = "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s.";
+"ppdc: Unknown duplex type \"%s\" on line %d of %s." = "ppdc: Unknown duplex type “%s†on line %d of %s.";
+"ppdc: Unknown media size \"%s\" on line %d of %s." = "ppdc: Unknown media size “%s†on line %d of %s.";
+"ppdc: Unknown message catalog format for \"%s\"." = "ppdc: Unknown message catalog format for “%sâ€.";
+"ppdc: Unknown token \"%s\" seen on line %d of %s." = "ppdc: Unknown token “%s†seen on line %d of %s.";
+"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." = "ppdc: Unknown trailing characters in real number “%s†on line %d of %s.";
"ppdc: Unterminated string starting with %c on line %d of %s." = "ppdc: Unterminated string starting with %c on line %d of %s.";
-"ppdc: Warning - overlapping filename \"%s\"." = "ppdc: Warning - overlapping filename \"%s\".";
+"ppdc: Warning - overlapping filename \"%s\"." = "ppdc: Warning - overlapping filename “%sâ€.";
"ppdc: Writing %s." = "ppdc: Writing %s.";
-"ppdc: Writing PPD files to directory \"%s\"." = "ppdc: Writing PPD files to directory \"%s\".";
-"ppdmerge: Bad LanguageVersion \"%s\" in %s." = "ppdmerge: Bad LanguageVersion \"%s\" in %s.";
+"ppdc: Writing PPD files to directory \"%s\"." = "ppdc: Writing PPD files to directory “%sâ€.";
+"ppdmerge: Bad LanguageVersion \"%s\" in %s." = "ppdmerge: Bad LanguageVersion “%s†in %s.";
"ppdmerge: Ignoring PPD file %s." = "ppdmerge: Ignoring PPD file %s.";
"ppdmerge: Unable to backup %s to %s - %s" = "ppdmerge: Unable to backup %s to %s - %s";
"printer %s disabled since %s -" = "printer %s disabled since %s -";
diff --git a/locale/cups_ca.po b/locale/cups_ca.po
index 5d99bd2..369e7fd 100644
--- a/locale/cups_ca.po
+++ b/locale/cups_ca.po
@@ -3,7 +3,7 @@
#
# Message catalog template for the Common UNIX Printing System (CUPS).
#
-# Copyright 2007-2009 by Apple Inc.
+# Copyright 2007-2015 by Apple Inc.
# Copyright 2005-2007 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
@@ -32,7 +32,7 @@ msgid ""
msgstr ""
"Project-Id-Version: CUPS 1.4.6\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
"PO-Revision-Date: 2012-09-29 11:21+0200\n"
"Last-Translator: Àngel Mompó <mecatxis@gmail.com>\n"
"Language-Team: Catalan <ca@dodds.net>\n"
@@ -932,6 +932,12 @@ msgstr " Avís: no hi ha cap %%EndComments al fitxer."
msgid " Warning: obsolete DSC version %.1f in file."
msgstr " Avís: versió del DSC %.1f obsoleta al fitxer."
+msgid " ! expression Unary NOT of expression."
+msgstr ""
+
+msgid " ( expressions ) Group expressions."
+msgstr ""
+
msgid " --[no-]debug-logging Turn debug logging on/off."
msgstr " --[no-]debug-logging Activa o desactiva el registre de depuració."
@@ -956,9 +962,85 @@ msgstr " --cr Final de línia amb CR (Mac OS 9)."
msgid " --crlf End lines with CR + LF (Windows)."
msgstr " --crlf Final de línia amb CR + LF (Windows)."
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+msgid " --false Always false."
+msgstr ""
+
+msgid " --help Show help."
+msgstr ""
+
+msgid " --help Show this help."
+msgstr ""
+
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr " --lf Final de línia amb LF (UNIX/Linux/OS X)."
+msgid " --list-filters List filters that will be used."
+msgstr ""
+
+msgid " --local True if service is local."
+msgstr ""
+
+msgid " --ls List attributes."
+msgstr ""
+
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+
+msgid " --not expression Unary NOT of expression."
+msgstr ""
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+
+msgid " --print Print URI if true."
+msgstr ""
+
+msgid " --print-name Print service name if true."
+msgstr ""
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+
+msgid " --remote True if service is remote."
+msgstr ""
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+
+msgid " --true Always true."
+msgstr ""
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr ""
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+
+msgid " --version Show program version."
+msgstr ""
+
+msgid " --version Show version."
+msgstr ""
+
msgid " -4 Connect using IPv4."
msgstr " -4 Connecta fent servir IPv4."
@@ -1004,15 +1086,26 @@ msgid " -L Send requests using content-length."
msgstr ""
" -L Envia les peticions fent servir content-length."
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
msgid " -P filename.ppd Set PPD file."
msgstr " -P nomfitxer.ppd Estableix el fitxer PPD."
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+
msgid " -R root-directory Set alternate root."
msgstr " -R directori-arrel Estableix una arrel alternativa."
msgid " -S Test with SSL encryption."
msgstr " -S Fa una prova amb xifrat SSL."
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr ""
+
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr ""
" -T segons Estableix el temps d'espera màxim per enviar i "
@@ -1035,16 +1128,28 @@ msgid " -X Produce XML plist instead of plain text."
msgstr ""
" -X Retorna els plist en XML en comptes de text pla."
+msgid " -a Browse for all services."
+msgstr ""
+
msgid " -a Export all printers."
msgstr " -a Exporta totes les impressores."
+msgid " -c Produce CSV output."
+msgstr ""
+
msgid " -c catalog.po Load the specified message catalog."
msgstr " -c catàleg.po Carrega el catàleg de missatges indicat."
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr ""
+
msgid " -c cupsd.conf Set cupsd.conf file to use."
msgstr ""
" -c cupsd.conf Estableix el fitxer cupsd.conf que cal fer servir."
+msgid " -d domain Browse/resolve in specified domain."
+msgstr ""
+
msgid " -d name=value Set named variable to value."
msgstr " -d nom=valor Estableix la variable indicada al valor."
@@ -1054,6 +1159,9 @@ msgstr " -d dir-sortida Especifica el directori de sortida."
msgid " -d printer Use the named printer."
msgstr " -d impressora Fa servir la impressora indicada."
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+
msgid " -e Use every filter from the PPD file."
msgstr " -e Fa servir tots els filtres del fitxer PPD."
@@ -1068,6 +1176,9 @@ msgstr ""
msgid " -h Show this usage message."
msgstr " -h Mostra aquest missatge de sintaxi."
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+
msgid " -h server[:port] Specify server address."
msgstr " -h servidor[:port] Especifica l'adreça del servidor."
@@ -1088,8 +1199,14 @@ msgstr ""
" -j id-feina[,N] Filtra el fitxer N a la feina especificada (el "
"fitxer per defecte és 1)."
-msgid " -l Run cupsd from launchd(8)."
-msgstr " -l Executa cupsd des de launchd(8)."
+msgid " -l List attributes."
+msgstr ""
+
+msgid " -l Produce plain text output."
+msgstr ""
+
+msgid " -l Run cupsd on demand."
+msgstr ""
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
msgstr ""
@@ -1115,6 +1232,9 @@ msgstr ""
" -n comptador Repeteix l'últim fitxer el nombre indicat de "
"vegades."
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+
msgid ""
" -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
@@ -1129,15 +1249,30 @@ msgstr ""
msgid " -o name=value Set option(s)."
msgstr " -o nom=valor Estableix les opcions."
+msgid " -p Print URI if true."
+msgstr ""
+
msgid " -p filename.ppd Set PPD file."
msgstr " -p nomfitxer.ppd Estableix el fitxer PPD."
+msgid " -p program Run specified program for each service."
+msgstr ""
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+
msgid " -q Run silently."
msgstr " -q S'executa en mode silenciós."
+msgid " -r True if service is remote."
+msgstr ""
+
msgid " -r Use 'relaxed' open mode."
msgstr " -r Fa servir el mode obert «relaxat»."
+msgid " -s Print service name if true."
+msgstr ""
+
msgid " -t Produce a test report."
msgstr " -t Genera un informe de prova."
@@ -1147,23 +1282,103 @@ msgstr " -t Prova els PPDs en comptes de generar-los."
msgid " -t Test the configuration file."
msgstr " -t Prova el fitxer de configuració."
+msgid " -t key True if the TXT record contains the key."
+msgstr ""
+
msgid " -t title Set title."
msgstr " -t títol Estableix el títol."
+msgid " -t type Browse/resolve with specified type."
+msgstr ""
+
msgid " -u Remove the PPD file when finished."
msgstr " -u Elimina el fitxer PPD quan ha acabat."
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+
msgid " -v Be verbose."
msgstr " -v Mode detallat."
msgid " -vv Be very verbose."
msgstr " -vv Mode molt detallat."
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
msgid " -z Compress PPD files using GNU zip."
msgstr ""
" -z Comprimeix els fitxers PPD fent servir el zip de "
"GNU."
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr ""
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr ""
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr ""
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+
+msgid " expression expression Logical AND."
+msgstr ""
+
+msgid " {service_domain} Domain name"
+msgstr ""
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr ""
+
+msgid " {service_name} Service instance name"
+msgstr ""
+
+msgid " {service_port} Port number"
+msgstr ""
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr ""
+
+msgid " {service_scheme} URI scheme"
+msgstr ""
+
+msgid " {service_uri} URI"
+msgstr ""
+
+msgid " {txt_*} Value of TXT record key"
+msgstr ""
+
+msgid " {} URI"
+msgstr ""
+
msgid " FAIL"
msgstr " ERROR"
@@ -1171,14 +1386,201 @@ msgid " PASS"
msgstr " VÀLID"
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
#, c-format
msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
#, c-format
+msgid "%d x %d mm"
+msgstr ""
+
+#, c-format
+msgid "%g x %g"
+msgstr ""
+
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr ""
+
+#, c-format
msgid "%s accepting requests since %s"
msgstr "%s accepta peticions des de %s"
@@ -1236,6 +1638,14 @@ msgid "%s: %s failed: %s"
msgstr "%s: %s ha fallat: %s"
#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr ""
+
+#, c-format
msgid "%s: Don't know what to do."
msgstr "%s: no sé que fer."
@@ -1287,10 +1697,6 @@ msgid "%s: Error - expected destination after \"-P\" option."
msgstr "%s: error - s'esperava un destí després de l'opció «-P»."
#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr "%s: error - s'esperava un destí després de l'opció «-b»."
-
-#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
msgstr "%s: error - s'esperava un destí després de l'opció «-d»."
@@ -1411,6 +1817,18 @@ msgid "%s: Invalid filter string \"%s\"."
msgstr "%s: la cadena del filtre «%s» no és vàlida."
#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr ""
+
+#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
msgstr "%s: es necessita l'ID de la feina («-i jobid») abans de «-H restart»."
@@ -1427,6 +1845,10 @@ msgid "%s: Sorry, no encryption support."
msgstr "%s: ho sento, no està compilada la compatibilitat pel xifrat."
#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to connect to server."
msgstr "%s: no es pot connectar al servidor."
@@ -1435,10 +1857,18 @@ msgid "%s: Unable to contact server."
msgstr "%s: no es pot contactar amb el servidor."
#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
msgstr "%s: no es pot determinar el tips de MIME de «%s»."
#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to open %s: %s"
msgstr "%s: no es pot obrir %s: %s"
@@ -1451,6 +1881,10 @@ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
msgstr "%s: no es pot llegir la base de dades MIME de «%s» o «%s»."
#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
msgid "%s: Unknown destination \"%s\"."
msgstr "%s: el destí «%s» és desconegut."
@@ -1463,6 +1897,14 @@ msgid "%s: Unknown option \"%c\"."
msgstr "%s: l'opció «%c» és desconeguda."
#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr ""
+
+#, c-format
msgid "%s: Unknown source MIME type %s/%s."
msgstr "%s: la font del tipus de MIME %s/%s és desconeguda."
@@ -2018,9 +2460,6 @@ msgstr "7 x 9"
msgid "70"
msgstr "70"
-msgid "720dpi"
-msgstr "720ppp"
-
msgid "75"
msgstr "75"
@@ -2310,6 +2749,9 @@ msgstr "El número de versió del SNMP és incorrecte"
msgid "Bad UIConstraints"
msgstr "La UIConstraints és incorrecta"
+msgid "Bad arguments to function"
+msgstr ""
+
#, c-format
msgid "Bad copies value %d."
msgstr "El valor de copies %d és incorrecte"
@@ -2336,10 +2778,11 @@ msgstr "La document-format-default «%s» és incorrecta."
msgid "Bad filename buffer"
msgstr "El nom del fitxer de la memòria cau és incorrecte"
-msgid "Bad job-name value: Bad UTF-8 sequence."
+msgid "Bad hostname/address in URI"
msgstr ""
-msgid "Bad job-name value: Name too long."
+#, c-format
+msgid "Bad job-name value: %s"
msgstr ""
msgid "Bad job-name value: Wrong type or count."
@@ -2382,17 +2825,20 @@ msgstr "L'opció + elecció de la línia %d és incorrecta."
msgid "Bad page-ranges values %d-%d."
msgstr "Els valors de page-ranges %d-%d són incorrectes."
+msgid "Bad port number in URI"
+msgstr ""
+
#, c-format
msgid "Bad port-monitor \"%s\"."
msgstr "La port-monitor «%s» és incorrecta."
-msgid "Bad printer URI."
-msgstr "L'URI de la impressora és incorrecte."
-
#, c-format
msgid "Bad printer-state value %d."
msgstr "El valor %d de printer-state és incorrecte."
+msgid "Bad printer-uri."
+msgstr ""
+
#, c-format
msgid "Bad request ID %d."
msgstr "L'identificador %d de la sol·licitud és incorrecte."
@@ -2401,12 +2847,24 @@ msgstr "L'identificador %d de la sol·licitud és incorrecte."
msgid "Bad request version number %d.%d."
msgstr "El número de versió %d.%d de la sol·licitud és incorrecte."
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
+msgstr ""
+
msgid "Bad subscription ID"
msgstr "L'identificador de la subscripció és incorrecte."
+msgid "Bad username in URI"
+msgstr ""
+
msgid "Bad value string"
msgstr "El valor de la cadena és incorrecte"
+msgid "Bad/empty URI"
+msgstr ""
+
msgid "Banners"
msgstr "Bàners"
@@ -2426,6 +2884,9 @@ msgstr "CMYK"
msgid "CPCL Label Printer"
msgstr "Impressora d'etiquetes CPCL"
+msgid "Cancel Jobs"
+msgstr ""
+
msgid "Cancel RSS Subscription"
msgstr "Cancel·la la subscripció RSS"
@@ -2594,6 +3055,9 @@ msgstr "Edita el fitxer de configuració"
msgid "Empty PPD file."
msgstr "El fitxer PPD és buit."
+msgid "Encryption is not supported."
+msgstr ""
+
#. TRANSLATORS: Banner/cover sheet after the print job.
msgid "Ending Banner"
msgstr "S'està acabant el bàner"
@@ -2601,15 +3065,6 @@ msgstr "S'està acabant el bàner"
msgid "English"
msgstr "Anglès"
-msgid "Enter old password:"
-msgstr "Introduïu la contrasenya antiga:"
-
-msgid "Enter password again:"
-msgstr "Introduïu la contrasenya un altre cop:"
-
-msgid "Enter password:"
-msgstr "Introduïu la contrasenya:"
-
msgid ""
"Enter your username and password or the root username and password to access "
"this page. If you are using Kerberos authentication, make sure you have a "
@@ -2779,12 +3234,18 @@ msgstr "Sobre You4"
msgid "Envelope You4 Long Edge"
msgstr "Sobre You4 costat llarg"
+msgid "Environment Variables:"
+msgstr ""
+
msgid "Epson"
msgstr "Epson"
msgid "Error Policy"
msgstr "Normes d'error"
+msgid "Error reading raster data."
+msgstr ""
+
msgid "Error sending raster data."
msgstr "S'ha produït un error quan s'enviaven les dades de la trama."
@@ -2830,6 +3291,9 @@ msgstr "Ha fallat la condició del valor que s'esperava"
msgid "Export Printers to Samba"
msgstr "Exportar les impressores al Samba"
+msgid "Expressions:"
+msgstr ""
+
msgid "FAIL"
msgstr "ERROR"
@@ -2942,6 +3406,9 @@ msgstr "El valor enter de IPP no té 4 bytes."
msgid "IPP language length overflows value."
msgstr "El valor de la longitud del llenguatge del IPP desborda."
+msgid "IPP language length too large."
+msgstr ""
+
msgid "IPP member name is not empty."
msgstr "El nom del membre del IPP no està buit."
@@ -2958,6 +3425,9 @@ msgid "IPP nameWithLanguage value less than minimum 4 bytes."
msgstr ""
"El valor de nameWithLanguage del IPP és més petit que el mínim, 4 bytes."
+msgid "IPP octetString length too large."
+msgstr ""
+
msgid "IPP rangeOfInteger value not 8 bytes."
msgstr "El valor de rangeOfInteger del IPP no té 8 bytes."
@@ -3019,6 +3489,9 @@ msgstr "Franqueig per Internet en 3 parts"
msgid "Internet Printing Protocol"
msgstr "Protocol d'impressió per Internet"
+msgid "Invalid media name arguments."
+msgstr ""
+
msgid "Invalid media size."
msgstr "Mida del suport no vàlida."
@@ -3168,11 +3641,14 @@ msgstr "La línia la longitud màxima permesa (255 caràcters)"
msgid "List Available Printers"
msgstr "Llista les impressores disponibles"
+msgid "Load paper."
+msgstr ""
+
msgid "Long-Edge (Portrait)"
msgstr "Costat-llarg (vertical)"
-msgid "Looking for printer."
-msgstr "S'està buscant la impressora."
+msgid "Looking for printer..."
+msgstr ""
msgid "Manual Feed"
msgstr "Alimentació manual"
@@ -3235,6 +3711,12 @@ msgstr "Falta l'atribut requesting-user-name."
msgid "Missing required attributes."
msgstr "Falten alguns atributs necessaris."
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
#, c-format
msgid "Missing value on line %d."
msgstr "Falta un valor a la línia %d."
@@ -3260,6 +3742,9 @@ msgstr ""
" fabricant i model = %s\n"
" id del dispositiu = %s"
+msgid "Modifiers:"
+msgstr ""
+
msgid "Modify Class"
msgstr "Modifica la classe"
@@ -3287,12 +3772,6 @@ msgstr "No es permeten les classes imbricades."
msgid "Never"
msgstr "Mai"
-msgid "New Stylus Color Series"
-msgstr "Sèrie New Stylus Color"
-
-msgid "New Stylus Photo Series"
-msgstr "Sèrie New Stylus Photo"
-
msgid "No"
msgstr "No"
@@ -3311,6 +3790,9 @@ msgstr "No hi ha cap controlador d'impressores de Windows instal·lat."
msgid "No active connection"
msgstr "No hi ha cap connexió activa"
+msgid "No active connection."
+msgstr ""
+
#, c-format
msgid "No active jobs on %s."
msgstr "No hi ha cap feina activa a %s."
@@ -3365,6 +3847,15 @@ msgstr "No s'ha trobat cap printer-uri per la classe"
msgid "No printer-uri in request."
msgstr "No hi ha cap printer-uri a la sol·licitud."
+msgid "No request URI."
+msgstr ""
+
+msgid "No request protocol version."
+msgstr ""
+
+msgid "No request sent."
+msgstr ""
+
msgid "No request-id"
msgstr "No hi ha cap request-id"
@@ -3460,22 +3951,14 @@ msgstr "Sense memòria."
msgid "Output Mode"
msgstr "Mode de sortida"
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr "La sortida de la impressora %s s'envia a %s"
-
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr "La sortida de la impressora %s s'envia a la impressora remota %s a %s"
+msgid "Output bin is almost full."
+msgstr ""
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr "La sortida per la impressora %s/%s s'envia a la impressora %s"
+msgid "Output bin is full."
+msgstr ""
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+msgid "Output bin is missing."
msgstr ""
-"La sortida per la impressora %s/%s s'envia a la impressora remota %s a %s"
msgid "PASS"
msgstr "VÀLID"
@@ -3507,6 +3990,18 @@ msgstr "El paquet no conté cap Get-Response-PDU"
msgid "Packet does not start with SEQUENCE"
msgstr "El paquet no comença amb SEQUENCE"
+msgid "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
@@ -3560,6 +4055,9 @@ msgstr "Postal doble costat llarg"
msgid "Postcard Long Edge"
msgstr "Postal costat llarg"
+msgid "Preparing to print."
+msgstr ""
+
msgid "Print Density"
msgstr "Densitat de la impressió"
@@ -3587,25 +4085,18 @@ msgstr "Imprimeix i talla"
msgid "Print and Tear"
msgstr "Imprimeix i estripa"
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr "S'ha acceptat el fitxer d'impressió - ID de la feina %d."
-
-msgid "Print file accepted - job ID unknown."
-msgstr "S'ha acceptat el fitxer d'impressió - l'ID de la feina és desconegut."
-
msgid "Print file sent."
msgstr "S'ha enviat el fitxer d'impressió."
-msgid "Print file was not accepted."
-msgstr "No s'ha acceptat el fitxer d'impressió."
-
msgid "Print job canceled at printer."
msgstr "S'ha cancel·lat la feina a la impressora."
msgid "Print job too large."
msgstr "La feina d'impressió és massa llarga."
+msgid "Print job was not accepted."
+msgstr ""
+
msgid "Printer Added"
msgstr "S'ha afegit una impressora"
@@ -3627,6 +4118,9 @@ msgstr "Configuració de la impressora"
msgid "Printer cannot print supplied content."
msgstr "La impressora no pot imprimir el contingut subministrat."
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
msgid "Printer:"
msgstr "Impressora:"
@@ -3634,11 +4128,8 @@ msgid "Printers"
msgstr "Impressores"
#, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr "S'està imprimint la pàgina %d. S'ha completat el %d%%."
-
-msgid "Purge Jobs"
-msgstr "Purga les feines"
+msgid "Printing page %d, %u%% complete."
+msgstr ""
msgid "Quarto"
msgstr "Quart"
@@ -3650,13 +4141,6 @@ msgid "Rank Owner Job File(s) Total Size"
msgstr ""
"Rang Propietari Feina Fitxer(s) Mida total"
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank Owner Pri Job Files Total Size"
-msgstr ""
-"Rang Propietari Pri Feina Fitxers Mida "
-"total"
-
msgid "Reject Jobs"
msgstr "Rebutja feines"
@@ -3717,6 +4201,9 @@ msgstr "S'ha iniciat el servidor"
msgid "Server Stopped"
msgstr "S'ha aturat el servidor"
+msgid "Server credentials not set."
+msgstr ""
+
msgid "Service Unavailable"
msgstr "El servei no està disponible"
@@ -3762,16 +4249,13 @@ msgstr "S'està començant la pàgina %d."
msgid "Statement"
msgstr "Declaració"
-msgid "Stylus Color Series"
-msgstr "Sèrie Stylus Color"
-
-msgid "Stylus Photo Series"
-msgstr "Sèrie Stylus Photo"
-
#, c-format
msgid "Subscription #%d does not exist."
msgstr "La subscripció #%d no existeix."
+msgid "Substitutions:"
+msgstr ""
+
msgid "Super A"
msgstr "Super A"
@@ -3803,13 +4287,16 @@ msgid "Tear-Off Adjust Position"
msgstr "Posició d'ajust d'estripat"
#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr ""
+
+#, c-format
msgid "The %s attribute cannot be provided with job-ids."
msgstr "No es pot fer servir l'atribut %s amb les job-ids."
#, c-format
msgid ""
-"The '%s' Job Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
msgstr ""
#, c-format
@@ -3865,46 +4352,26 @@ msgstr "S'ha de canviar el fotoconductor òptic."
msgid "The optical photoconductor will need to be replaced soon."
msgstr "El fotoconductor òptic s'haurà de canviar aviat."
-msgid "The output bin is almost full."
-msgstr "La safata de sortida és gairebé plena."
-
-msgid "The output bin is full."
-msgstr "La safata de sortida és plena."
-
-msgid "The output bin is missing."
-msgstr "Falta la safata de sortida."
-
-msgid "The paper tray is almost empty."
-msgstr "La safata de paper és gairebé buida."
-
-msgid "The paper tray is empty."
-msgstr "La safata de paper és buida."
-
-msgid "The paper tray is missing."
-msgstr "Falta la safata de paper."
-
-msgid "The paper tray needs to be filled."
-msgstr "S'ha d'omplir la safata de paper."
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr "L'URI de la impressora no és correcte o ja no existeix."
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr ""
msgid "The printer did not respond."
msgstr "La impressora no ha respost."
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr ""
-"La impressora no és compatible amb el IPP/%d.%d, s'està intentant el IPP/%s."
-
msgid "The printer is in use."
msgstr "La impressora està ocupada."
+msgid "The printer is low on ink."
+msgstr ""
+
+msgid "The printer is low on toner."
+msgstr "S'està acabant el tòner de la impressora."
+
msgid "The printer is not connected."
msgstr "La impressora no està connectada."
msgid "The printer is not responding."
-msgstr "La impressora no respòn."
+msgstr "La impressora no respon."
msgid "The printer is now connected."
msgstr "Ara la impressora està connectada."
@@ -3915,12 +4382,6 @@ msgstr "Ara la impressora està en línia."
msgid "The printer is offline."
msgstr "La impressora està fora de línia."
-msgid "The printer is running low on ink."
-msgstr "S'està acabant la tinta de la impressora."
-
-msgid "The printer is running low on toner."
-msgstr "S'està acabant el tòner de la impressora."
-
msgid "The printer is unreachable at this time."
msgstr "Ara mateix no es pot accedir a la impressora."
@@ -4002,9 +4463,6 @@ msgstr "El valor «%s» de which-jobs no està implementat."
msgid "There are too many subscriptions."
msgstr "Hi ha massa subscripcions."
-msgid "There is a paper jam."
-msgstr "S'ha encallat el paper."
-
msgid "There was an unrecoverable USB error."
msgstr "Hi ha un error de l'USB irrecuperable."
@@ -4043,6 +4501,9 @@ msgstr "Safata 4"
msgid "URI Too Long"
msgstr "L'URI és massa llarg"
+msgid "URI too large"
+msgstr ""
+
msgid "US Ledger"
msgstr "Llibre major americà"
@@ -4113,6 +4574,14 @@ msgstr "No es pot canviar l'atribut printer-is-shared"
msgid "Unable to change server settings"
msgstr "No es pot canviar la configuració del servidor"
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr ""
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
msgid "Unable to configure printer options."
msgstr "No es poden configurar les opcions de la impressora."
@@ -4162,12 +4631,12 @@ msgstr ""
msgid "Unable to copy interface script - %s"
msgstr "No es pot copiar l'script de la interfície - %s"
-msgid "Unable to create compressed print file"
-msgstr "No es pot crear el fitxer d'impressió comprimit"
-
msgid "Unable to create printer-uri"
msgstr "No es pot crear el printer-uri"
+msgid "Unable to create server credentials."
+msgstr ""
+
msgid "Unable to create temporary file"
msgstr "No es pot crear el fitxer temporal"
@@ -4233,8 +4702,8 @@ msgstr "No es pot trobar el destí de la feina"
msgid "Unable to find printer."
msgstr "No es pot trobar la impressora."
-msgid "Unable to generate compressed print file"
-msgstr "No es pot generar el fitxer d'impressió comprimit"
+msgid "Unable to find server credentials."
+msgstr ""
msgid "Unable to get backend exit status."
msgstr "No es pot obtenir el motiu de la sortida de l'execució en segon pla"
@@ -4297,9 +4766,6 @@ msgstr "No es poden moure les tasques"
msgid "Unable to open PPD file"
msgstr "No es pot obrir el fitxer PPD"
-msgid "Unable to open compressed print file"
-msgstr "No es pot obrir el fitxer d'impressió comprimit"
-
msgid "Unable to open cupsd.conf file:"
msgstr "No es pot obrir el fitxer cups.conf"
@@ -4325,8 +4791,11 @@ msgstr "No es pot imprimir la pàgina de prova"
msgid "Unable to read print data."
msgstr "No es poden llegir les dades d'impressió."
-msgid "Unable to resolve printer URI."
-msgstr "No es pot resoldre l'URI de la impressora."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr ""
#, c-format
msgid "Unable to run \"%s\": %s"
@@ -4415,6 +4884,15 @@ msgstr "El paràmetre printer-error-policy «%s» és desconegut."
msgid "Unknown printer-op-policy \"%s\"."
msgstr "El paràmetre printer-op-policy «%s» és desconegut."
+msgid "Unknown request method."
+msgstr ""
+
+msgid "Unknown request version."
+msgstr ""
+
+msgid "Unknown scheme in URI"
+msgstr ""
+
msgid "Unknown service name."
msgstr "El nom del servei és desconegut."
@@ -4515,8 +4993,8 @@ msgstr "Sintaxi: cupsctl [opcions] [param=valor ... paramN=valorN]"
msgid "Usage: cupsd [options]"
msgstr "Sintaxi: cupsd [opcions]"
-msgid "Usage: cupsfilter [ options ] filename"
-msgstr "Sintaxi: cupsfilter [ opcions ] nomfitxer"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr ""
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
msgstr "Sintaxi: cupstestdsc [opcions] nomfitxer.ps [...nomfitxer.ps]"
@@ -4526,6 +5004,20 @@ msgid ""
msgstr ""
"Sintaxi: cupstestppd [opcions] nomfitxer1.ppd[.gz] [... nomfitxerN.ppd[.gz]]"
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr "Sintaxi: ipptool [opcions] URI nomfitxer[ ... nomfitxerN]"
@@ -4543,18 +5035,6 @@ msgstr ""
" lpoptions [-h servidor] [-E] -p impressora -o opció[=valor] ...\n"
" lpoptions [-h servidor] [-E] -x impressora"
-msgid "Usage: lppasswd [-g groupname]"
-msgstr "Sintaxi: lppasswd [-g nomgrup]"
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
-msgstr ""
-"Sintaxi: lppasswd [-g nomgrup] [nomusuari]\n"
-" lppasswd [-g nomgrup] -a [nomusuari]\n"
-" lppasswd [-g nomgrup] -x [nomusuari]"
-
msgid ""
"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
msgstr ""
@@ -4616,13 +5096,6 @@ msgstr ""
"Heu d'accedir a aquesta pagina a través de la URL <A HREF=\"https://%s:%d%s"
"\">https://%s:%d%s</A>."
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-"La contrasenya ha de tenir com a mínim 6 caràcters, no pot contenir el nom "
-"d'usuari, i ha de tenir com a mínim una lletra i un número."
-
msgid "ZPL Label Printer"
msgstr "Impressora d'etiquetes ZPL"
@@ -4670,6 +5143,9 @@ msgstr ""
msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
msgstr ""
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
msgid "cupsd: Relative cups-files.conf filename not allowed."
msgstr ""
@@ -4687,11 +5163,6 @@ msgstr "cupsd: l'argument «%s» és desconegut - s'interromp."
msgid "cupsd: Unknown option \"%c\" - aborting."
msgstr "cupsd: l'opció «%c» és desconeguda - s'interromp."
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-"cupsd: no s'ha compilat amb compatibilitat per launchd(8). S'executa en mode "
-"normal."
-
#, c-format
msgid "cupsfilter: Invalid document number %d."
msgstr "cupsfilter: el document número %d no és vàlid."
@@ -4736,16 +5207,88 @@ msgstr "help\t\tproporciona ajuda sobre les comandes."
msgid "idle"
msgstr "inactiva"
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr "ipptool: «-i» i «-n» no són compatibles amb «-X»."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr ""
#, c-format
-msgid "ipptool: Bad URI - %s."
-msgstr "ipptool: l'URI no es correcte - %s."
+msgid "ippfind: Expected key name after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr ""
+
+msgid "ippfind: Missing close parenthesis."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr ""
+
+msgid "ippfind: Missing open parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr ""
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr "ipptool: la versió %s de «-V» no és correcta."
+msgid "ippfind: Missing regular expression after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Out of memory."
+msgstr ""
+
+msgid "ippfind: Too many parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr ""
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: l'URI no es correcte - %s."
msgid "ipptool: Invalid seconds for \"-i\"."
msgstr "ipptool: els segons de «-i» no són correctes."
@@ -4765,12 +5308,6 @@ msgstr "ipptool: falta nom=valor a «-d»."
msgid "ipptool: Missing seconds for \"-i\"."
msgstr "ipptool: falten els segons a «-i»."
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr "ipptool: falta el temps màxim d'espera a «-T»."
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr "ipptool: falta la versió a «-V»."
-
msgid "ipptool: URI required before test file."
msgstr "ipptool: falta l'URI abans del fitxer de prova."
@@ -4869,6 +5406,10 @@ msgstr ""
" Heu d'especificar primer un nom d'impressora."
#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
msgstr "lpadmin: no s'ha pogut obrir el fitxer PPD «%s» - %s"
@@ -4973,51 +5514,6 @@ msgstr "lpoptions: no s'ha pogut obrir el fitxer PPD per %s."
msgid "lpoptions: Unknown printer or class."
msgstr "lpoptions: la impressora o la classe són desconegudes."
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-"lppasswd: només l'usuari primari (root) pot afegir o esborrar contrasenyes."
-
-msgid "lppasswd: Password file busy."
-msgstr "lppaswd: el fitxer de contrasenyes està ocupat."
-
-msgid "lppasswd: Password file not updated."
-msgstr "lppaswd: el fitxer de contrasenyes no està actualitzat."
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr "lppaswwd: la contrasenya no coincideix."
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr "lppaswwd: s'ha refusat la contrasenya."
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr "lppaswwd: les contrasenyes no coincideixen."
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr "lppasswd: no s'ha pogut copiar la cadena de contrasenya: %s"
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr "lppasswd: no s'ha pogut obrir el fitxer de contrasenyes: %s"
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr "lppasswd: no s'ha pogut escriure al fitxer de contrasenyes: %s"
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-"lppasswd: no s'ha pogut fer la còpia de seguretat del fitxer de contrasenyes "
-"antic: %s"
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr "lppasswd: no s'ha pogut canviar el nom del fitxer de contrasenyes: %s"
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr "lppaswd: l'usuari «%s» i el grup «%s» no existeixen."
-
#, c-format
msgid ""
"lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5582,6 +6078,9 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
#~ " -j tipus/mime Estableix el tipus MIME de sortida "
#~ "(application/pdf si no s'especifica)."
+#~ msgid " -l Run cupsd from launchd(8)."
+#~ msgstr " -l Executa cupsd des de launchd(8)."
+
#~ msgid ""
#~ " -o filename Set file to be generated (otherwise stdout)."
#~ msgstr ""
@@ -5604,12 +6103,33 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
#~ msgstr ""
#~ " -v Mostra tots els atributs enviats i rebuts."
+#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+
+#~ msgid "%s: Error - expected destination after \"-b\" option."
+#~ msgstr "%s: error - s'esperava un destí després de l'opció «-b»."
+
#~ msgid "3.5\" Disk - 2 1/8 x 2 3/4\""
#~ msgstr "Disc de 3.5 - 2 1/8 x 2 3/4\""
+#~ msgid "720dpi"
+#~ msgstr "720ppp"
+
#~ msgid "Address - 1 1/8 x 3 1/2\""
#~ msgstr "Adreça - 1 1/8 x 3 1/2\""
+#~ msgid "Bad printer URI."
+#~ msgstr "L'URI de la impressora és incorrecte."
+
+#~ msgid "Enter old password:"
+#~ msgstr "Introduïu la contrasenya antiga:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Introduïu la contrasenya un altre cop:"
+
+#~ msgid "Enter password:"
+#~ msgstr "Introduïu la contrasenya:"
+
#~ msgid "File Folder - 9/16 x 3 7/16\""
#~ msgstr "Carpeta d'arxivador: 9/16 x 3 7/16\""
@@ -5632,6 +6152,39 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
#~ msgid "Large Address - 1 4/10 x 3 1/2\""
#~ msgstr "Adreça gran - 1 4/10 x 3 1/2\""
+#~ msgid "Looking for printer."
+#~ msgstr "S'està buscant la impressora."
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Sèrie New Stylus Color"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Sèrie New Stylus Photo"
+
+#~ msgid "Output for printer %s is sent to %s"
+#~ msgstr "La sortida de la impressora %s s'envia a %s"
+
+#~ msgid "Output for printer %s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "La sortida de la impressora %s s'envia a la impressora remota %s a %s"
+
+#~ msgid "Output for printer %s/%s is sent to %s"
+#~ msgstr "La sortida per la impressora %s/%s s'envia a la impressora %s"
+
+#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "La sortida per la impressora %s/%s s'envia a la impressora remota %s a %s"
+
+#~ msgid "Print file accepted - job ID %d."
+#~ msgstr "S'ha acceptat el fitxer d'impressió - ID de la feina %d."
+
+#~ msgid "Print file accepted - job ID unknown."
+#~ msgstr ""
+#~ "S'ha acceptat el fitxer d'impressió - l'ID de la feina és desconegut."
+
+#~ msgid "Print file was not accepted."
+#~ msgstr "No s'ha acceptat el fitxer d'impressió."
+
#~ msgid "Printer busy, will retry in 10 seconds."
#~ msgstr ""
#~ "La impressora està ocupada. Es tornarà a intentar d'aquí a 10 segons."
@@ -5651,6 +6204,18 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
#~ "La impressora està desconnectada. Es tornarà a intentar d'aquí a 30 "
#~ "segons."
+#~ msgid "Printing page %d, %d%% complete."
+#~ msgstr "S'està imprimint la pàgina %d. S'ha completat el %d%%."
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Purga les feines"
+
+#~ msgid ""
+#~ "Rank Owner Pri Job Files Total Size"
+#~ msgstr ""
+#~ "Rang Propietari Pri Feina Fitxers "
+#~ "Mida total"
+
#~ msgid "Ready to print."
#~ msgstr "Preparada per imprimir."
@@ -5660,37 +6225,170 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
#~ msgid "Shipping Address - 2 5/16 x 4\""
#~ msgstr "Adreça de lliurament - 2 5/16 x 4\""
-#~ msgid "The printer is low on toner."
-#~ msgstr "S'està acabant el tòner de la impressora."
+#~ msgid "Stylus Color Series"
+#~ msgstr "Sèrie Stylus Color"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Sèrie Stylus Photo"
+
+#~ msgid "The output bin is almost full."
+#~ msgstr "La safata de sortida és gairebé plena."
+
+#~ msgid "The output bin is full."
+#~ msgstr "La safata de sortida és plena."
+
+#~ msgid "The output bin is missing."
+#~ msgstr "Falta la safata de sortida."
+
+#~ msgid "The paper tray is almost empty."
+#~ msgstr "La safata de paper és gairebé buida."
+
+#~ msgid "The paper tray is empty."
+#~ msgstr "La safata de paper és buida."
+
+#~ msgid "The paper tray is missing."
+#~ msgstr "Falta la safata de paper."
+
+#~ msgid "The paper tray needs to be filled."
+#~ msgstr "S'ha d'omplir la safata de paper."
+
+#~ msgid "The printer URI is incorrect or no longer exists."
+#~ msgstr "L'URI de la impressora no és correcte o ja no existeix."
+
+#~ msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+#~ msgstr ""
+#~ "La impressora no és compatible amb el IPP/%d.%d, s'està intentant el IPP/"
+#~ "%s."
#~ msgid "The printer is out of toner."
#~ msgstr "S'ha acabat el tòner de la impressora"
+#~ msgid "The printer is running low on ink."
+#~ msgstr "S'està acabant la tinta de la impressora."
+
+#~ msgid "The printer is running low on toner."
+#~ msgstr "S'està acabant el tòner de la impressora."
+
+#~ msgid "There is a paper jam."
+#~ msgstr "S'ha encallat el paper."
+
+#~ msgid "Unable to create compressed print file"
+#~ msgstr "No es pot crear el fitxer d'impressió comprimit"
+
#~ msgid "Unable to create temporary file:"
#~ msgstr "No es pot crear el fitxer temporal:"
+#~ msgid "Unable to generate compressed print file"
+#~ msgstr "No es pot generar el fitxer d'impressió comprimit"
+
#~ msgid "Unable to get printer status:"
#~ msgstr "No es pot obtenir l'estat de la impressora:"
#~ msgid "Unable to open PPD file:"
#~ msgstr "No es pot obrir el fitxer PPD:"
+#~ msgid "Unable to open compressed print file"
+#~ msgstr "No es pot obrir el fitxer d'impressió comprimit"
+
#~ msgid "Unable to read print data"
#~ msgstr "No es poden llegir les dades d'impressió"
+#~ msgid "Unable to resolve printer URI."
+#~ msgstr "No es pot resoldre l'URI de la impressora."
+
#~ msgid "Usage: %s job-id user title copies options file"
#~ msgstr "Sintaxi: %s id-tasca usuari títol còpies opcions fitxer"
#~ msgid "Usage: convert [ options ]"
#~ msgstr "Sintaxi: convert [ opcions ]"
+#~ msgid "Usage: cupsfilter [ options ] filename"
+#~ msgstr "Sintaxi: cupsfilter [ opcions ] nomfitxer"
+
+#~ msgid "Usage: lppasswd [-g groupname]"
+#~ msgstr "Sintaxi: lppasswd [-g nomgrup]"
+
+#~ msgid ""
+#~ "Usage: lppasswd [-g groupname] [username]\n"
+#~ " lppasswd [-g groupname] -a [username]\n"
+#~ " lppasswd [-g groupname] -x [username]"
+#~ msgstr ""
+#~ "Sintaxi: lppasswd [-g nomgrup] [nomusuari]\n"
+#~ " lppasswd [-g nomgrup] -a [nomusuari]\n"
+#~ " lppasswd [-g nomgrup] -x [nomusuari]"
+
+#~ msgid ""
+#~ "Your password must be at least 6 characters long, cannot contain your "
+#~ "username, and must contain at least one letter and number."
+#~ msgstr ""
+#~ "La contrasenya ha de tenir com a mínim 6 caràcters, no pot contenir el "
+#~ "nom d'usuari, i ha de tenir com a mínim una lletra i un número."
+
#~ msgid "convert: Use the -f option to specify a file to convert."
#~ msgstr ""
#~ "convert: feu servir l'opció -f per especificar el fitxer que voleu "
#~ "convertir."
+#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
+#~ msgstr ""
+#~ "cupsd: no s'ha compilat amb compatibilitat per launchd(8). S'executa en "
+#~ "mode normal."
+
+#~ msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#~ msgstr "ipptool: «-i» i «-n» no són compatibles amb «-X»."
+
#~ msgid "ipptool: \"-i\" is incompatible with \"-X\"."
#~ msgstr "ipptool: «-i» no és compatible amb «-X»."
#~ msgid "ipptool: \"-n\" is incompatible with \"-X\"."
#~ msgstr "ipptool: «-n» no és compatible amb «-X»."
+
+#~ msgid "ipptool: Bad version %s for \"-V\"."
+#~ msgstr "ipptool: la versió %s de «-V» no és correcta."
+
+#~ msgid "ipptool: Missing timeout for \"-T\"."
+#~ msgstr "ipptool: falta el temps màxim d'espera a «-T»."
+
+#~ msgid "ipptool: Missing version for \"-V\"."
+#~ msgstr "ipptool: falta la versió a «-V»."
+
+#~ msgid "lppasswd: Only root can add or delete passwords."
+#~ msgstr ""
+#~ "lppasswd: només l'usuari primari (root) pot afegir o esborrar "
+#~ "contrasenyes."
+
+#~ msgid "lppasswd: Password file busy."
+#~ msgstr "lppaswd: el fitxer de contrasenyes està ocupat."
+
+#~ msgid "lppasswd: Password file not updated."
+#~ msgstr "lppaswd: el fitxer de contrasenyes no està actualitzat."
+
+#~ msgid "lppasswd: Sorry, password doesn't match."
+#~ msgstr "lppaswwd: la contrasenya no coincideix."
+
+#~ msgid "lppasswd: Sorry, password rejected."
+#~ msgstr "lppaswwd: s'ha refusat la contrasenya."
+
+#~ msgid "lppasswd: Sorry, passwords don't match."
+#~ msgstr "lppaswwd: les contrasenyes no coincideixen."
+
+#~ msgid "lppasswd: Unable to copy password string: %s"
+#~ msgstr "lppasswd: no s'ha pogut copiar la cadena de contrasenya: %s"
+
+#~ msgid "lppasswd: Unable to open password file: %s"
+#~ msgstr "lppasswd: no s'ha pogut obrir el fitxer de contrasenyes: %s"
+
+#~ msgid "lppasswd: Unable to write to password file: %s"
+#~ msgstr "lppasswd: no s'ha pogut escriure al fitxer de contrasenyes: %s"
+
+#~ msgid "lppasswd: failed to backup old password file: %s"
+#~ msgstr ""
+#~ "lppasswd: no s'ha pogut fer la còpia de seguretat del fitxer de "
+#~ "contrasenyes antic: %s"
+
+#~ msgid "lppasswd: failed to rename password file: %s"
+#~ msgstr ""
+#~ "lppasswd: no s'ha pogut canviar el nom del fitxer de contrasenyes: %s"
+
+#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
+#~ msgstr "lppaswd: l'usuari «%s» i el grup «%s» no existeixen."
diff --git a/locale/cups_cs.po b/locale/cups_cs.po
index d689543..8e03517 100644
--- a/locale/cups_cs.po
+++ b/locale/cups_cs.po
@@ -12,7 +12,6 @@
# which should have been included with this file. If this file is
# file is missing or damaged, see the license at "http://www.cups.org/".
#
-
#
# Notes for Translators:
#
@@ -30,7 +29,7 @@ msgid ""
msgstr ""
"Project-Id-Version: CUPS 1.6\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2012-05-23 16:24-0700\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
"PO-Revision-Date: 2012-09-14 10:26+0100\n"
"Last-Translator: Jan Bartos <jan.bartos@madeta.cz>\n"
"Language-Team: Czech\n"
@@ -39,746 +38,593 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: systemv/lpstat.c:1876 systemv/lpstat.c:2001
msgid "\t\t(all)"
msgstr ""
-#: systemv/lpstat.c:1879 systemv/lpstat.c:1882 systemv/lpstat.c:2004
-#: systemv/lpstat.c:2007
msgid "\t\t(none)"
msgstr ""
-#: berkeley/lpc.c:434
#, c-format
msgid "\t%d entries"
msgstr ""
-#: systemv/lpstat.c:756 systemv/lpstat.c:772
#, c-format
msgid "\t%s"
msgstr ""
-#: systemv/lpstat.c:1857 systemv/lpstat.c:1982
msgid "\tAfter fault: continue"
msgstr ""
-#: systemv/lpstat.c:1481 systemv/lpstat.c:1826 systemv/lpstat.c:1952
#, c-format
msgid "\tAlerts: %s"
msgstr ""
-#: systemv/lpstat.c:1880 systemv/lpstat.c:2005
msgid "\tBanner required"
msgstr ""
-#: systemv/lpstat.c:1881 systemv/lpstat.c:2006
msgid "\tCharset sets:"
msgstr ""
-#: systemv/lpstat.c:1845 systemv/lpstat.c:1970
msgid "\tConnection: direct"
msgstr ""
-#: systemv/lpstat.c:1836 systemv/lpstat.c:1962
msgid "\tConnection: remote"
msgstr ""
-#: systemv/lpstat.c:1800 systemv/lpstat.c:1926
msgid "\tContent types: any"
msgstr ""
-#: systemv/lpstat.c:1884 systemv/lpstat.c:2009
msgid "\tDefault page size:"
msgstr ""
-#: systemv/lpstat.c:1883 systemv/lpstat.c:2008
msgid "\tDefault pitch:"
msgstr ""
-#: systemv/lpstat.c:1885 systemv/lpstat.c:2010
msgid "\tDefault port settings:"
msgstr ""
-#: systemv/lpstat.c:1806 systemv/lpstat.c:1932
#, c-format
msgid "\tDescription: %s"
msgstr ""
-#: systemv/lpstat.c:1799 systemv/lpstat.c:1925
msgid "\tForm mounted:"
msgstr ""
-#: systemv/lpstat.c:1878 systemv/lpstat.c:2003
msgid "\tForms allowed:"
msgstr ""
-#: systemv/lpstat.c:1840 systemv/lpstat.c:1966
#, c-format
msgid "\tInterface: %s.ppd"
msgstr ""
-#: systemv/lpstat.c:1849 systemv/lpstat.c:1974
#, c-format
msgid "\tInterface: %s/interfaces/%s"
msgstr ""
-#: systemv/lpstat.c:1853 systemv/lpstat.c:1978
#, c-format
msgid "\tInterface: %s/ppd/%s.ppd"
msgstr ""
-#: systemv/lpstat.c:1831 systemv/lpstat.c:1957
#, c-format
msgid "\tLocation: %s"
msgstr ""
-#: systemv/lpstat.c:1856 systemv/lpstat.c:1981
msgid "\tOn fault: no alert"
msgstr ""
-#: systemv/lpstat.c:1801 systemv/lpstat.c:1927
msgid "\tPrinter types: unknown"
msgstr ""
-#: systemv/lpstat.c:1462
#, c-format
msgid "\tStatus: %s"
msgstr ""
-#: systemv/lpstat.c:1861 systemv/lpstat.c:1875 systemv/lpstat.c:1986
-#: systemv/lpstat.c:2000
msgid "\tUsers allowed:"
msgstr ""
-#: systemv/lpstat.c:1868 systemv/lpstat.c:1993
msgid "\tUsers denied:"
msgstr ""
-#: berkeley/lpc.c:436
msgid "\tdaemon present"
msgstr ""
-#: berkeley/lpc.c:432
msgid "\tno entries"
msgstr ""
-#: berkeley/lpc.c:404 berkeley/lpc.c:416
#, c-format
msgid "\tprinter is on device '%s' speed -1"
msgstr ""
-#: berkeley/lpc.c:429
msgid "\tprinting is disabled"
msgstr ""
-#: berkeley/lpc.c:427
msgid "\tprinting is enabled"
msgstr ""
-#: systemv/lpstat.c:1484
#, c-format
msgid "\tqueued for %s"
msgstr ""
-#: berkeley/lpc.c:424
msgid "\tqueuing is disabled"
msgstr ""
-#: berkeley/lpc.c:422
msgid "\tqueuing is enabled"
msgstr ""
-#: systemv/lpstat.c:1792 systemv/lpstat.c:1918
msgid "\treason unknown"
msgstr ""
-#: systemv/cupstestppd.c:454
msgid ""
"\n"
" DETAILED CONFORMANCE TEST RESULTS"
msgstr ""
-#: systemv/cupstestppd.c:3800
msgid " Ignore specific warnings."
msgstr ""
-#: systemv/cupstestppd.c:3804
msgid " Issue warnings instead of errors."
msgstr ""
-#: systemv/cupstestppd.c:410 systemv/cupstestppd.c:415
msgid " REF: Page 15, section 3.1."
msgstr ""
-#: systemv/cupstestppd.c:405
msgid " REF: Page 15, section 3.2."
msgstr ""
-#: systemv/cupstestppd.c:425
msgid " REF: Page 19, section 3.3."
msgstr ""
-#: systemv/cupstestppd.c:378
msgid " REF: Page 20, section 3.4."
msgstr ""
-#: systemv/cupstestppd.c:430
msgid " REF: Page 27, section 3.5."
msgstr ""
-#: systemv/cupstestppd.c:373
msgid " REF: Page 42, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:420
msgid " REF: Pages 16-17, section 3.2."
msgstr ""
-#: systemv/cupstestppd.c:390
msgid " REF: Pages 42-45, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:384
msgid " REF: Pages 45-46, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:395
msgid " REF: Pages 48-49, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:400
msgid " REF: Pages 52-54, section 5.2."
msgstr ""
-#: berkeley/lpq.c:554
#, c-format
msgid " %-39.39s %.0f bytes"
msgstr ""
-#: systemv/cupstestppd.c:589
#, c-format
msgid " PASS Default%s"
msgstr ""
-#: systemv/cupstestppd.c:524
msgid " PASS DefaultImageableArea"
msgstr ""
-#: systemv/cupstestppd.c:558
msgid " PASS DefaultPaperDimension"
msgstr ""
-#: systemv/cupstestppd.c:631
msgid " PASS FileVersion"
msgstr ""
-#: systemv/cupstestppd.c:675
msgid " PASS FormatVersion"
msgstr ""
-#: systemv/cupstestppd.c:695
msgid " PASS LanguageEncoding"
msgstr ""
-#: systemv/cupstestppd.c:715
msgid " PASS LanguageVersion"
msgstr ""
-#: systemv/cupstestppd.c:769
msgid " PASS Manufacturer"
msgstr ""
-#: systemv/cupstestppd.c:809
msgid " PASS ModelName"
msgstr ""
-#: systemv/cupstestppd.c:829
msgid " PASS NickName"
msgstr ""
-#: systemv/cupstestppd.c:889
msgid " PASS PCFileName"
msgstr ""
-#: systemv/cupstestppd.c:964
msgid " PASS PSVersion"
msgstr ""
-#: systemv/cupstestppd.c:869
msgid " PASS PageRegion"
msgstr ""
-#: systemv/cupstestppd.c:849
msgid " PASS PageSize"
msgstr ""
-#: systemv/cupstestppd.c:924
msgid " PASS Product"
msgstr ""
-#: systemv/cupstestppd.c:999
msgid " PASS ShortNickName"
msgstr ""
-#: systemv/cupstestppd.c:1374
#, c-format
msgid " WARN %s has no corresponding options."
msgstr ""
-#: systemv/cupstestppd.c:1486
#, c-format
msgid ""
" WARN %s shares a common prefix with %s\n"
" REF: Page 15, section 3.2."
msgstr ""
-#: systemv/cupstestppd.c:1345
#, c-format
msgid ""
-" WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n"
+" WARN Duplex option keyword %s may not work as expected and should "
+"be named Duplex.\n"
" REF: Page 122, section 5.17"
msgstr ""
-#: systemv/cupstestppd.c:1744
msgid " WARN File contains a mix of CR, LF, and CR LF line endings."
msgstr ""
-#: systemv/cupstestppd.c:1390
msgid ""
" WARN LanguageEncoding required by PPD 4.3 spec.\n"
" REF: Pages 56-57, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1726
#, c-format
msgid " WARN Line %d only contains whitespace."
msgstr ""
-#: systemv/cupstestppd.c:1398
msgid ""
" WARN Manufacturer required by PPD 4.3 spec.\n"
" REF: Pages 58-59, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1749
-msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF."
+msgid ""
+" WARN Non-Windows PPD files should use lines ending with only LF, "
+"not CR LF."
msgstr ""
-#: systemv/cupstestppd.c:1382
#, c-format
msgid ""
" WARN Obsolete PPD version %.1f.\n"
" REF: Page 42, section 5.2."
msgstr ""
-#: systemv/cupstestppd.c:1413
msgid ""
" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1421
msgid ""
" WARN PCFileName should contain a unique filename.\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1456
msgid ""
" WARN Protocols contains PJL but JCL attributes are not set.\n"
" REF: Pages 78-79, section 5.7."
msgstr ""
-#: systemv/cupstestppd.c:1447
msgid ""
" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
" REF: Pages 78-79, section 5.7."
msgstr ""
-#: systemv/cupstestppd.c:1430
msgid ""
" WARN ShortNickName required by PPD 4.3 spec.\n"
" REF: Pages 64-65, section 5.3."
msgstr ""
-#: systemv/cupsaddsmb.c:282
msgid " cupsaddsmb [options] -a"
msgstr ""
-#: systemv/cupstestdsc.c:427
msgid " cupstestdsc [options] -"
msgstr ""
-#: systemv/cupstestppd.c:3795
msgid " program | cupstestppd [options] -"
msgstr ""
-#: systemv/cupstestppd.c:3727
#, c-format
msgid ""
" %s \"%s %s\" conflicts with \"%s %s\"\n"
" (constraint=\"%s %s %s %s\")."
msgstr ""
-#: systemv/cupstestppd.c:2248
#, c-format
msgid " %s %s %s does not exist."
msgstr ""
-#: systemv/cupstestppd.c:3884
#, c-format
msgid " %s %s file \"%s\" has the wrong capitalization."
msgstr ""
-#: systemv/cupstestppd.c:2318
#, c-format
msgid ""
" %s Bad %s choice %s.\n"
" REF: Page 122, section 5.17"
msgstr ""
-#: systemv/cupstestppd.c:3487 systemv/cupstestppd.c:3536
-#: systemv/cupstestppd.c:3575
#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s."
msgstr ""
-#: systemv/cupstestppd.c:3441
#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s."
msgstr ""
-#: systemv/cupstestppd.c:2389
#, c-format
msgid " %s Bad cupsFilter value \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2475
#, c-format
msgid " %s Bad cupsFilter2 value \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2964
#, c-format
msgid " %s Bad cupsICCProfile %s."
msgstr ""
-#: systemv/cupstestppd.c:2571
#, c-format
msgid " %s Bad cupsPreFilter value \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:1822
#, c-format
msgid " %s Bad cupsUIConstraints %s: \"%s\""
msgstr ""
-#: systemv/cupstestppd.c:3391
#, c-format
msgid " %s Bad language \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2433 systemv/cupstestppd.c:2529
-#: systemv/cupstestppd.c:2615 systemv/cupstestppd.c:2673
-#: systemv/cupstestppd.c:2728 systemv/cupstestppd.c:2783
-#: systemv/cupstestppd.c:2838 systemv/cupstestppd.c:2891
-#: systemv/cupstestppd.c:3013
#, c-format
msgid " %s Bad permissions on %s file \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:2373 systemv/cupstestppd.c:2459
-#: systemv/cupstestppd.c:2555 systemv/cupstestppd.c:2642
-#: systemv/cupstestppd.c:2697 systemv/cupstestppd.c:2752
-#: systemv/cupstestppd.c:2807 systemv/cupstestppd.c:2862
#, c-format
msgid " %s Bad spelling of %s - should be %s."
msgstr ""
-#: systemv/cupstestppd.c:2907
#, c-format
msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID."
msgstr ""
-#: systemv/cupstestppd.c:2205
#, c-format
msgid " %s Default choices conflicting."
msgstr ""
-#: systemv/cupstestppd.c:1803
#, c-format
msgid " %s Empty cupsUIConstraints %s"
msgstr ""
-#: systemv/cupstestppd.c:3519 systemv/cupstestppd.c:3559
#, c-format
msgid " %s Missing \"%s\" translation string for option %s, choice %s."
msgstr ""
-#: systemv/cupstestppd.c:3427
#, c-format
msgid " %s Missing \"%s\" translation string for option %s."
msgstr ""
-#: systemv/cupstestppd.c:2418 systemv/cupstestppd.c:2514
-#: systemv/cupstestppd.c:2600 systemv/cupstestppd.c:2658
-#: systemv/cupstestppd.c:2713 systemv/cupstestppd.c:2768
-#: systemv/cupstestppd.c:2823 systemv/cupstestppd.c:2875
-#: systemv/cupstestppd.c:2998
#, c-format
msgid " %s Missing %s file \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:3121
#, c-format
msgid ""
" %s Missing REQUIRED PageRegion option.\n"
" REF: Page 100, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:3106
#, c-format
msgid ""
" %s Missing REQUIRED PageSize option.\n"
" REF: Page 99, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:2013 systemv/cupstestppd.c:2054
#, c-format
msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
msgstr ""
-#: systemv/cupstestppd.c:1908
#, c-format
msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
msgstr ""
-#: systemv/cupstestppd.c:1840
#, c-format
msgid " %s Missing cupsUIResolver %s"
msgstr ""
-#: systemv/cupstestppd.c:1999 systemv/cupstestppd.c:2040
#, c-format
msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"."
msgstr ""
-#: systemv/cupstestppd.c:1892
#, c-format
msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\""
msgstr ""
-#: systemv/cupstestppd.c:3613
#, c-format
msgid " %s No base translation \"%s\" is included in file."
msgstr ""
-#: systemv/cupstestppd.c:2294
#, c-format
msgid ""
" %s REQUIRED %s does not define choice None.\n"
" REF: Page 122, section 5.17"
msgstr ""
-#: systemv/cupstestppd.c:3180 systemv/cupstestppd.c:3194
#, c-format
msgid " %s Size \"%s\" defined for %s but not for %s."
msgstr ""
-#: systemv/cupstestppd.c:3160
#, c-format
msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)."
msgstr ""
-#: systemv/cupstestppd.c:3332
#, c-format
msgid " %s Size \"%s\" should be \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:3292
#, c-format
msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"."
msgstr ""
-#: systemv/cupstestppd.c:3041
#, c-format
msgid " %s cupsICCProfile %s hash value collides with %s."
msgstr ""
-#: systemv/cupstestppd.c:1963
#, c-format
msgid " %s cupsUIResolver %s causes a loop."
msgstr ""
-#: systemv/cupstestppd.c:1945
#, c-format
-msgid " %s cupsUIResolver %s does not list at least two different options."
+msgid ""
+" %s cupsUIResolver %s does not list at least two different options."
msgstr ""
-#: systemv/cupstestppd.c:1168
#, c-format
msgid ""
" **FAIL** %s must be 1284DeviceID\n"
" REF: Page 72, section 5.5"
msgstr ""
-#: systemv/cupstestppd.c:580
#, c-format
msgid ""
" **FAIL** Bad Default%s %s\n"
" REF: Page 40, section 4.5."
msgstr ""
-#: systemv/cupstestppd.c:514
#, c-format
msgid ""
" **FAIL** Bad DefaultImageableArea %s\n"
" REF: Page 102, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:550
#, c-format
msgid ""
" **FAIL** Bad DefaultPaperDimension %s\n"
" REF: Page 103, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:623
#, c-format
msgid ""
" **FAIL** Bad FileVersion \"%s\"\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:667
#, c-format
msgid ""
" **FAIL** Bad FormatVersion \"%s\"\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1025
msgid ""
" **FAIL** Bad JobPatchFile attribute in file\n"
" REF: Page 24, section 3.4."
msgstr ""
-#: systemv/cupstestppd.c:1213
#, c-format
msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."
msgstr ""
-#: systemv/cupstestppd.c:1227
#, c-format
msgid " **FAIL** Bad LanguageVersion %s - must be English."
msgstr ""
-#: systemv/cupstestppd.c:743 systemv/cupstestppd.c:760
#, c-format
msgid ""
" **FAIL** Bad Manufacturer (should be \"%s\")\n"
" REF: Page 211, table D.1."
msgstr ""
-#: systemv/cupstestppd.c:800
#, c-format
msgid ""
" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n"
" REF: Pages 59-60, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:956
msgid ""
" **FAIL** Bad PSVersion - not \"(string) int\".\n"
" REF: Pages 62-64, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:917
msgid ""
" **FAIL** Bad Product - not \"(string)\".\n"
" REF: Page 62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:991
msgid ""
" **FAIL** Bad ShortNickName - longer than 31 chars.\n"
" REF: Pages 64-65, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1149
#, c-format
msgid ""
" **FAIL** Bad option %s choice %s\n"
" REF: Page 84, section 5.9"
msgstr ""
-#: systemv/cupstestppd.c:3754 systemv/cupstestppd.c:3776
#, c-format
msgid " **FAIL** Default option code cannot be interpreted: %s"
msgstr ""
-#: systemv/cupstestppd.c:1286
#, c-format
-msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters."
+msgid ""
+" **FAIL** Default translation string for option %s choice %s contains "
+"8-bit characters."
msgstr ""
-#: systemv/cupstestppd.c:1259
#, c-format
-msgid " **FAIL** Default translation string for option %s contains 8-bit characters."
+msgid ""
+" **FAIL** Default translation string for option %s contains 8-bit "
+"characters."
msgstr ""
-#: systemv/cupstestppd.c:2101
#, c-format
msgid " **FAIL** Group names %s and %s differ only by case."
msgstr ""
-#: systemv/cupstestppd.c:2146
#, c-format
msgid " **FAIL** Multiple occurrences of option %s choice name %s."
msgstr ""
-#: systemv/cupstestppd.c:2163
#, c-format
msgid " **FAIL** Option %s choice names %s and %s differ only by case."
msgstr ""
-#: systemv/cupstestppd.c:2123
#, c-format
msgid " **FAIL** Option names %s and %s differ only by case."
msgstr ""
-#: systemv/cupstestppd.c:600
#, c-format
msgid ""
" **FAIL** REQUIRED Default%s\n"
" REF: Page 40, section 4.5."
msgstr ""
-#: systemv/cupstestppd.c:499
msgid ""
" **FAIL** REQUIRED DefaultImageableArea\n"
" REF: Page 102, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:535
msgid ""
" **FAIL** REQUIRED DefaultPaperDimension\n"
" REF: Page 103, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:641
msgid ""
" **FAIL** REQUIRED FileVersion\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:685
msgid ""
" **FAIL** REQUIRED FormatVersion\n"
" REF: Page 56, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1076
#, c-format
msgid ""
" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
@@ -786,68 +632,57 @@ msgid ""
" REF: Page 102, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:705
msgid ""
" **FAIL** REQUIRED LanguageEncoding\n"
" REF: Pages 56-57, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:725
msgid ""
" **FAIL** REQUIRED LanguageVersion\n"
" REF: Pages 57-58, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:779
msgid ""
" **FAIL** REQUIRED Manufacturer\n"
" REF: Pages 58-59, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:819
msgid ""
" **FAIL** REQUIRED ModelName\n"
" REF: Pages 59-60, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:839
msgid ""
" **FAIL** REQUIRED NickName\n"
" REF: Page 60, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:899
msgid ""
" **FAIL** REQUIRED PCFileName\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:974
msgid ""
" **FAIL** REQUIRED PSVersion\n"
" REF: Pages 62-64, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:879
msgid ""
" **FAIL** REQUIRED PageRegion\n"
" REF: Page 100, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:1045
msgid ""
" **FAIL** REQUIRED PageSize\n"
" REF: Page 41, section 5.\n"
" REF: Page 99, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:859
msgid ""
" **FAIL** REQUIRED PageSize\n"
" REF: Pages 99-100, section 5.14."
msgstr ""
-#: systemv/cupstestppd.c:1098
#, c-format
msgid ""
" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
@@ -855,2194 +690,2111 @@ msgid ""
" REF: Page 103, section 5.15."
msgstr ""
-#: systemv/cupstestppd.c:934
msgid ""
" **FAIL** REQUIRED Product\n"
" REF: Page 62, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:1009
msgid ""
" **FAIL** REQUIRED ShortNickName\n"
" REF: Page 64-65, section 5.3."
msgstr ""
-#: systemv/cupstestppd.c:334 systemv/cupstestppd.c:353
-#: systemv/cupstestppd.c:365
#, c-format
msgid " **FAIL** Unable to open PPD file - %s on line %d."
msgstr ""
-#: systemv/cupstestppd.c:1498
#, c-format
msgid " %d ERRORS FOUND"
msgstr ""
-#: systemv/cupstestdsc.c:431
msgid " -h Show program usage"
msgstr ""
-#: systemv/cupstestdsc.c:234 systemv/cupstestdsc.c:276
#, c-format
msgid ""
" Bad %%%%BoundingBox: on line %d.\n"
" REF: Page 39, %%%%BoundingBox:"
msgstr ""
-#: systemv/cupstestdsc.c:305
#, c-format
msgid ""
" Bad %%%%Page: on line %d.\n"
" REF: Page 53, %%%%Page:"
msgstr ""
-#: systemv/cupstestdsc.c:218 systemv/cupstestdsc.c:258
#, c-format
msgid ""
" Bad %%%%Pages: on line %d.\n"
" REF: Page 43, %%%%Pages:"
msgstr ""
-#: systemv/cupstestdsc.c:176
#, c-format
msgid ""
" Line %d is longer than 255 characters (%d).\n"
" REF: Page 25, Line Length"
msgstr ""
-#: systemv/cupstestdsc.c:192
msgid ""
" Missing %!PS-Adobe-3.0 on first line.\n"
" REF: Page 17, 3.1 Conforming Documents"
msgstr ""
-#: systemv/cupstestdsc.c:362
#, c-format
msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments"
msgstr ""
-#: systemv/cupstestdsc.c:342
#, c-format
msgid ""
" Missing or bad %%BoundingBox: comment.\n"
" REF: Page 39, %%BoundingBox:"
msgstr ""
-#: systemv/cupstestdsc.c:372
#, c-format
msgid ""
" Missing or bad %%Page: comments.\n"
" REF: Page 53, %%Page:"
msgstr ""
-#: systemv/cupstestdsc.c:352
#, c-format
msgid ""
" Missing or bad %%Pages: comment.\n"
" REF: Page 43, %%Pages:"
msgstr ""
-#: systemv/cupstestppd.c:1500
msgid " NO ERRORS FOUND"
msgstr ""
-#: systemv/cupstestdsc.c:395
#, c-format
msgid " Saw %d lines that exceeded 255 characters."
msgstr ""
-#: systemv/cupstestdsc.c:390
#, c-format
msgid " Too many %%BeginDocument comments."
msgstr ""
-#: systemv/cupstestdsc.c:382
#, c-format
msgid " Too many %%EndDocument comments."
msgstr ""
-#: systemv/cupstestdsc.c:402
msgid " Warning: file contains binary data."
msgstr ""
-#: systemv/cupstestdsc.c:410
#, c-format
msgid " Warning: no %%EndComments comment in file."
msgstr ""
-#: systemv/cupstestdsc.c:406
#, c-format
msgid " Warning: obsolete DSC version %.1f in file."
msgstr ""
-#: systemv/cupsctl.c:210
+msgid " ! expression Unary NOT of expression."
+msgstr ""
+
+msgid " ( expressions ) Group expressions."
+msgstr ""
+
msgid " --[no-]debug-logging Turn debug logging on/off."
msgstr ""
-#: systemv/cupsctl.c:212
msgid " --[no-]remote-admin Turn remote administration on/off."
msgstr ""
-#: systemv/cupsctl.c:214
msgid " --[no-]remote-any Allow/prevent access from the Internet."
msgstr ""
-#: systemv/cupsctl.c:216
msgid " --[no-]share-printers Turn printer sharing on/off."
msgstr ""
-#: systemv/cupsctl.c:218
msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job."
msgstr ""
-#: ppdc/ppdc.cxx:455
msgid " --cr End lines with CR (Mac OS 9)."
msgstr ""
-#: ppdc/ppdc.cxx:457
msgid " --crlf End lines with CR + LF (Windows)."
msgstr ""
-#: ppdc/ppdc.cxx:459
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+msgid " --false Always false."
+msgstr ""
+
+msgid " --help Show help."
+msgstr ""
+
+msgid " --help Show this help."
+msgstr ""
+
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr ""
-#: test/ipptool.c:4404
+msgid " --list-filters List filters that will be used."
+msgstr ""
+
+msgid " --local True if service is local."
+msgstr ""
+
+msgid " --ls List attributes."
+msgstr ""
+
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+
+msgid " --not expression Unary NOT of expression."
+msgstr ""
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+
+msgid " --print Print URI if true."
+msgstr ""
+
+msgid " --print-name Print service name if true."
+msgstr ""
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+
+msgid " --remote True if service is remote."
+msgstr ""
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+
+msgid " --true Always true."
+msgstr ""
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr ""
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+
+msgid " --version Show program version."
+msgstr ""
+
+msgid " --version Show version."
+msgstr ""
+
msgid " -4 Connect using IPv4."
msgstr ""
-#: test/ipptool.c:4405
msgid " -6 Connect using IPv6."
msgstr ""
-#: test/ipptool.c:4406
msgid " -C Send requests using chunking (default)."
msgstr ""
-#: scheduler/cupsfilter.c:1431
msgid " -D Remove the input file when finished."
msgstr ""
-#: ppdc/ppdc.cxx:438 ppdc/ppdhtml.cxx:175 ppdc/ppdpo.cxx:255
msgid " -D name=value Set named variable to value."
msgstr ""
-#: systemv/cupsaddsmb.c:285 systemv/cupsctl.c:205
msgid " -E Encrypt the connection."
msgstr ""
-#: test/ipptool.c:4408
msgid " -E Test with HTTP Upgrade to TLS."
msgstr ""
-#: scheduler/main.c:2021
-msgid " -F Run in the foreground but detach from console."
+msgid ""
+" -F Run in the foreground but detach from console."
msgstr ""
-#: systemv/cupsaddsmb.c:286
msgid " -H samba-server Use the named SAMBA server."
msgstr ""
-#: test/ipptool.c:4410
msgid " -I Ignore errors."
msgstr ""
-#: ppdc/ppdc.cxx:440 ppdc/ppdhtml.cxx:177 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:257
msgid " -I include-dir Add include directory to search path."
msgstr ""
-#: systemv/cupstestppd.c:3799
msgid " -I {filename,filters,none,profiles}"
msgstr ""
-#: test/ipptool.c:4411
msgid " -L Send requests using content-length."
msgstr ""
-#: scheduler/cupsfilter.c:1433
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
msgid " -P filename.ppd Set PPD file."
msgstr ""
-#: systemv/cupstestppd.c:3801
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+
msgid " -R root-directory Set alternate root."
msgstr ""
-#: test/ipptool.c:4413
msgid " -S Test with SSL encryption."
msgstr ""
-#: test/ipptool.c:4415
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr ""
+
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr ""
-#: scheduler/cupsfilter.c:1434 systemv/cupsaddsmb.c:288 systemv/cupsctl.c:206
msgid " -U username Specify username."
msgstr ""
-#: test/ipptool.c:4417
msgid " -V version Set default IPP version."
msgstr ""
-#: systemv/cupstestppd.c:3802
-msgid " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}"
+msgid ""
+" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
msgstr ""
-#: test/ipptool.c:4419
msgid " -X Produce XML plist instead of plain text."
msgstr ""
-#: systemv/cupsaddsmb.c:289
+msgid " -a Browse for all services."
+msgstr ""
+
msgid " -a Export all printers."
msgstr ""
-#: ppdc/ppdc.cxx:442
+msgid " -c Produce CSV output."
+msgstr ""
+
msgid " -c catalog.po Load the specified message catalog."
msgstr ""
-#: scheduler/cupsfilter.c:1435 scheduler/main.c:2019
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr ""
+
msgid " -c cupsd.conf Set cupsd.conf file to use."
msgstr ""
-#: test/ipptool.c:4421
+msgid " -d domain Browse/resolve in specified domain."
+msgstr ""
+
msgid " -d name=value Set named variable to value."
msgstr ""
-#: ppdc/ppdc.cxx:444
msgid " -d output-dir Specify the output directory."
msgstr ""
-#: scheduler/cupsfilter.c:1437
msgid " -d printer Use the named printer."
msgstr ""
-#: scheduler/cupsfilter.c:1439
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+
msgid " -e Use every filter from the PPD file."
msgstr ""
-#: scheduler/main.c:2020
msgid " -f Run in the foreground."
msgstr ""
-#: test/ipptool.c:4423
msgid " -f filename Set default request filename."
msgstr ""
-#: scheduler/main.c:2023
msgid " -h Show this usage message."
msgstr ""
-#: systemv/cupsaddsmb.c:290 systemv/cupsctl.c:207
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+
msgid " -h server[:port] Specify server address."
msgstr ""
-#: scheduler/cupsfilter.c:1441
msgid " -i mime/type Set input MIME type (otherwise auto-typed)."
msgstr ""
-#: test/ipptool.c:4425
-msgid " -i seconds Repeat the last file with the given time interval."
+msgid ""
+" -i seconds Repeat the last file with the given time interval."
+msgstr ""
+
+msgid ""
+" -j job-id[,N] Filter file N from the specified job (default is "
+"file 1)."
+msgstr ""
+
+msgid " -l List attributes."
msgstr ""
-#: scheduler/cupsfilter.c:1443
-msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)."
+msgid " -l Produce plain text output."
msgstr ""
-#: scheduler/main.c:2024
-msgid " -l Run cupsd from launchd(8)."
+msgid " -l Run cupsd on demand."
msgstr ""
-#: ppdc/ppdc.cxx:446
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
msgstr ""
-#: ppdc/ppdc.cxx:448
msgid " -m Use the ModelName value as the filename."
msgstr ""
-#: scheduler/cupsfilter.c:1445
-msgid " -m mime/type Set output MIME type (otherwise application/pdf)."
+msgid ""
+" -m mime/type Set output MIME type (otherwise application/pdf)."
msgstr ""
-#: scheduler/cupsfilter.c:1447
msgid " -n copies Set number of copies."
msgstr ""
-#: test/ipptool.c:4427
-msgid " -n count Repeat the last file the given number of times."
+msgid ""
+" -n count Repeat the last file the given number of times."
msgstr ""
-#: ppdc/ppdi.cxx:133
-msgid " -o filename.drv Set driver information file (otherwise ppdi.drv)."
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+
+msgid ""
+" -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
-#: ppdc/ppdmerge.cxx:370
msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)."
msgstr ""
-#: scheduler/cupsfilter.c:1448
msgid " -o name=value Set option(s)."
msgstr ""
-#: scheduler/cupsfilter.c:1449
+msgid " -p Print URI if true."
+msgstr ""
+
msgid " -p filename.ppd Set PPD file."
msgstr ""
-#: systemv/cupstestppd.c:3806 test/ipptool.c:4429
+msgid " -p program Run specified program for each service."
+msgstr ""
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+
msgid " -q Run silently."
msgstr ""
-#: systemv/cupstestppd.c:3807
+msgid " -r True if service is remote."
+msgstr ""
+
msgid " -r Use 'relaxed' open mode."
msgstr ""
-#: test/ipptool.c:4430
+msgid " -s Print service name if true."
+msgstr ""
+
msgid " -t Produce a test report."
msgstr ""
-#: ppdc/ppdc.cxx:450
msgid " -t Test PPDs instead of generating them."
msgstr ""
-#: scheduler/main.c:2025
msgid " -t Test the configuration file."
msgstr ""
-#: scheduler/cupsfilter.c:1450
+msgid " -t key True if the TXT record contains the key."
+msgstr ""
+
msgid " -t title Set title."
msgstr ""
-#: scheduler/cupsfilter.c:1451
+msgid " -t type Browse/resolve with specified type."
+msgstr ""
+
msgid " -u Remove the PPD file when finished."
msgstr ""
-#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3808 test/ipptool.c:4431
-#: ppdc/ppdc.cxx:452 ppdc/ppdpo.cxx:259
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+
msgid " -v Be verbose."
msgstr ""
-#: systemv/cupstestppd.c:3809
msgid " -vv Be very verbose."
msgstr ""
-#: ppdc/ppdc.cxx:453
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
msgid " -z Compress PPD files using GNU zip."
msgstr ""
-#: systemv/cupstestppd.c:332 systemv/cupstestppd.c:351
-#: systemv/cupstestppd.c:363 systemv/cupstestppd.c:496
-#: systemv/cupstestppd.c:511 systemv/cupstestppd.c:532
-#: systemv/cupstestppd.c:547 systemv/cupstestppd.c:577
-#: systemv/cupstestppd.c:597 systemv/cupstestppd.c:620
-#: systemv/cupstestppd.c:638 systemv/cupstestppd.c:664
-#: systemv/cupstestppd.c:682 systemv/cupstestppd.c:702
-#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:740
-#: systemv/cupstestppd.c:757 systemv/cupstestppd.c:776
-#: systemv/cupstestppd.c:797 systemv/cupstestppd.c:816
-#: systemv/cupstestppd.c:836 systemv/cupstestppd.c:856
-#: systemv/cupstestppd.c:876 systemv/cupstestppd.c:896
-#: systemv/cupstestppd.c:914 systemv/cupstestppd.c:931
-#: systemv/cupstestppd.c:953 systemv/cupstestppd.c:971
-#: systemv/cupstestppd.c:988 systemv/cupstestppd.c:1006
-#: systemv/cupstestppd.c:1022 systemv/cupstestppd.c:1042
-#: systemv/cupstestppd.c:1073 systemv/cupstestppd.c:1095
-#: systemv/cupstestppd.c:1146 systemv/cupstestppd.c:1165
-#: systemv/cupstestppd.c:1209 systemv/cupstestppd.c:1223
-#: systemv/cupstestppd.c:1255 systemv/cupstestppd.c:1282
-#: systemv/cupstestppd.c:1800 systemv/cupstestppd.c:1819
-#: systemv/cupstestppd.c:1837 systemv/cupstestppd.c:1889
-#: systemv/cupstestppd.c:1905 systemv/cupstestppd.c:1942
-#: systemv/cupstestppd.c:1960 systemv/cupstestppd.c:1996
-#: systemv/cupstestppd.c:2010 systemv/cupstestppd.c:2037
-#: systemv/cupstestppd.c:2051 systemv/cupstestppd.c:2097
-#: systemv/cupstestppd.c:2119 systemv/cupstestppd.c:2142
-#: systemv/cupstestppd.c:2159 systemv/cupstestppd.c:2201
-#: systemv/cupstestppd.c:2244 systemv/cupstestppd.c:2291
-#: systemv/cupstestppd.c:2315 systemv/cupstestppd.c:2369
-#: systemv/cupstestppd.c:2385 systemv/cupstestppd.c:2415
-#: systemv/cupstestppd.c:2429 systemv/cupstestppd.c:2455
-#: systemv/cupstestppd.c:2471 systemv/cupstestppd.c:2511
-#: systemv/cupstestppd.c:2525 systemv/cupstestppd.c:2551
-#: systemv/cupstestppd.c:2567 systemv/cupstestppd.c:2597
-#: systemv/cupstestppd.c:2611 systemv/cupstestppd.c:2638
-#: systemv/cupstestppd.c:2655 systemv/cupstestppd.c:2669
-#: systemv/cupstestppd.c:2693 systemv/cupstestppd.c:2710
-#: systemv/cupstestppd.c:2724 systemv/cupstestppd.c:2748
-#: systemv/cupstestppd.c:2765 systemv/cupstestppd.c:2779
-#: systemv/cupstestppd.c:2803 systemv/cupstestppd.c:2820
-#: systemv/cupstestppd.c:2834 systemv/cupstestppd.c:2858
-#: systemv/cupstestppd.c:2872 systemv/cupstestppd.c:2887
-#: systemv/cupstestppd.c:2904 systemv/cupstestppd.c:2960
-#: systemv/cupstestppd.c:2995 systemv/cupstestppd.c:3009
-#: systemv/cupstestppd.c:3037 systemv/cupstestppd.c:3102
-#: systemv/cupstestppd.c:3117 systemv/cupstestppd.c:3156
-#: systemv/cupstestppd.c:3176 systemv/cupstestppd.c:3190
-#: systemv/cupstestppd.c:3387 systemv/cupstestppd.c:3423
-#: systemv/cupstestppd.c:3437 systemv/cupstestppd.c:3483
-#: systemv/cupstestppd.c:3515 systemv/cupstestppd.c:3532
-#: systemv/cupstestppd.c:3555 systemv/cupstestppd.c:3571
-#: systemv/cupstestppd.c:3609 systemv/cupstestppd.c:3750
-#: systemv/cupstestppd.c:3772 systemv/cupstestppd.c:3880
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr ""
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr ""
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr ""
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+
+msgid " expression expression Logical AND."
+msgstr ""
+
+msgid " {service_domain} Domain name"
+msgstr ""
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr ""
+
+msgid " {service_name} Service instance name"
+msgstr ""
+
+msgid " {service_port} Port number"
+msgstr ""
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr ""
+
+msgid " {service_scheme} URI scheme"
+msgstr ""
+
+msgid " {service_uri} URI"
+msgstr ""
+
+msgid " {txt_*} Value of TXT record key"
+msgstr ""
+
+msgid " {} URI"
+msgstr ""
+
msgid " FAIL"
msgstr ""
-#: systemv/cupstestppd.c:1306
msgid " PASS"
msgstr ""
-#: berkeley/lpq.c:560
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
msgstr ""
-#: berkeley/lpq.c:565
#, c-format
msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
msgstr ""
-#: systemv/lpstat.c:750
+#, c-format
+msgid "%d x %d mm"
+msgstr ""
+
+#, c-format
+msgid "%g x %g"
+msgstr ""
+
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr ""
+
#, c-format
msgid "%s accepting requests since %s"
msgstr ""
-#: scheduler/ipp.c:10045
#, c-format
msgid "%s cannot be changed."
msgstr "%s nelze změnit."
-#: berkeley/lpc.c:189
#, c-format
msgid "%s is not implemented by the CUPS version of lpc."
msgstr ""
-#: berkeley/lpq.c:651
#, c-format
msgid "%s is not ready"
msgstr ""
-#: berkeley/lpq.c:644
#, c-format
msgid "%s is ready"
msgstr ""
-#: berkeley/lpq.c:647
#, c-format
msgid "%s is ready and printing"
msgstr ""
-#: filter/rastertoepson.c:985 filter/rastertohp.c:711
-#: filter/rastertolabel.c:1134
#, c-format
msgid "%s job-id user title copies options [file]"
msgstr ""
-#: systemv/lpstat.c:754
#, c-format
msgid "%s not accepting requests since %s -"
msgstr ""
-#: scheduler/ipp.c:691
#, c-format
msgid "%s not supported."
msgstr ""
-#: systemv/lpstat.c:765
#, c-format
msgid "%s/%s accepting requests since %s"
msgstr ""
-#: systemv/lpstat.c:770
#, c-format
msgid "%s/%s not accepting requests since %s -"
msgstr ""
-#: berkeley/lpq.c:552
#, c-format
msgid "%s: %-33.33s [job %d localhost]"
msgstr ""
#. TRANSLATORS: Message is "subject: error"
-#: cups/langprintf.c:86 scheduler/cupsfilter.c:714 systemv/lpadmin.c:805
-#: systemv/lpadmin.c:856 systemv/lpadmin.c:906 systemv/lpadmin.c:962
-#: systemv/lpadmin.c:1060 systemv/lpadmin.c:1112 systemv/lpadmin.c:1168
-#: systemv/lpadmin.c:1478
#, c-format
msgid "%s: %s"
msgstr ""
-#: systemv/cancel.c:294 systemv/cancel.c:357
#, c-format
msgid "%s: %s failed: %s"
msgstr ""
-#: systemv/cupsaccept.c:68
+#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr ""
+
#, c-format
msgid "%s: Don't know what to do."
msgstr ""
-#: berkeley/lpq.c:236 berkeley/lpr.c:344 systemv/lp.c:584
#, c-format
-msgid "%s: Error - %s environment variable names non-existent destination \"%s\"."
+msgid ""
+"%s: Error - %s environment variable names non-existent destination \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - add '/version=1.1' to server name."
msgstr ""
-#: systemv/lp.c:231
#, c-format
msgid "%s: Error - bad job ID."
msgstr ""
-#: systemv/lp.c:219
#, c-format
msgid "%s: Error - cannot print files and alter jobs simultaneously."
msgstr ""
-#: systemv/lp.c:505
#, c-format
msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
msgstr ""
-#: systemv/lp.c:461
#, c-format
msgid "%s: Error - expected character set after \"-S\" option."
msgstr ""
-#: systemv/lp.c:480
#, c-format
msgid "%s: Error - expected content type after \"-T\" option."
msgstr ""
-#: berkeley/lpr.c:240
#, c-format
msgid "%s: Error - expected copies after \"-#\" option."
msgstr ""
-#: systemv/lp.c:264
#, c-format
msgid "%s: Error - expected copies after \"-n\" option."
msgstr ""
-#: berkeley/lpr.c:209
#, c-format
msgid "%s: Error - expected destination after \"-P\" option."
msgstr ""
-#: systemv/lpstat.c:231
-#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
-
-#: systemv/lp.c:138
#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
msgstr ""
-#: systemv/lp.c:168
#, c-format
msgid "%s: Error - expected form after \"-f\" option."
msgstr ""
-#: systemv/lp.c:391
#, c-format
msgid "%s: Error - expected hold name after \"-H\" option."
msgstr ""
-#: berkeley/lpr.c:103
#, c-format
msgid "%s: Error - expected hostname after \"-H\" option."
msgstr ""
-#: berkeley/lpq.c:180 berkeley/lprm.c:123 systemv/cancel.c:124
-#: systemv/cupsaccept.c:123 systemv/lp.c:189 systemv/lpstat.c:291
#, c-format
msgid "%s: Error - expected hostname after \"-h\" option."
msgstr ""
-#: systemv/lp.c:371
#, c-format
msgid "%s: Error - expected mode list after \"-y\" option."
msgstr ""
-#: berkeley/lpr.c:263
#, c-format
msgid "%s: Error - expected name after \"-%c\" option."
msgstr ""
-#: berkeley/lpr.c:153 systemv/lp.c:288
#, c-format
msgid "%s: Error - expected option=value after \"-o\" option."
msgstr ""
-#: systemv/lp.c:441
#, c-format
msgid "%s: Error - expected page list after \"-P\" option."
msgstr ""
-#: systemv/lp.c:308
#, c-format
msgid "%s: Error - expected priority after \"-%c\" option."
msgstr ""
-#: systemv/cupsaccept.c:141
#, c-format
msgid "%s: Error - expected reason text after \"-r\" option."
msgstr ""
-#: systemv/lp.c:354
#, c-format
msgid "%s: Error - expected title after \"-t\" option."
msgstr ""
-#: berkeley/lpq.c:111 berkeley/lpr.c:84 berkeley/lprm.c:104
-#: systemv/cancel.c:94 systemv/cupsaccept.c:101 systemv/lp.c:116
-#: systemv/lpadmin.c:438 systemv/lpstat.c:137
#, c-format
msgid "%s: Error - expected username after \"-U\" option."
msgstr ""
-#: systemv/cancel.c:145
#, c-format
msgid "%s: Error - expected username after \"-u\" option."
msgstr ""
-#: berkeley/lpr.c:125
#, c-format
msgid "%s: Error - expected value after \"-%c\" option."
msgstr ""
-#: systemv/lpstat.c:157 systemv/lpstat.c:171
#, c-format
-msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."
+msgid ""
+"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" "
+"option."
msgstr ""
-#: berkeley/lpq.c:241 berkeley/lpr.c:349 systemv/lp.c:589
#, c-format
msgid "%s: Error - no default destination available."
msgstr ""
-#: systemv/lp.c:330
#, c-format
msgid "%s: Error - priority must be between 1 and 100."
msgstr ""
-#: berkeley/lpr.c:352 systemv/lp.c:592
#, c-format
msgid "%s: Error - scheduler not responding."
msgstr ""
-#: berkeley/lpr.c:305 systemv/lp.c:537
#, c-format
msgid "%s: Error - too many files - \"%s\"."
msgstr ""
-#: berkeley/lpr.c:287 systemv/lp.c:520
#, c-format
msgid "%s: Error - unable to access \"%s\" - %s"
msgstr ""
-#: berkeley/lpr.c:395 systemv/lp.c:623
#, c-format
msgid "%s: Error - unable to queue from stdin - %s."
msgstr ""
-#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:214
#, c-format
msgid "%s: Error - unknown destination \"%s\"."
msgstr ""
-#: berkeley/lpq.c:150
#, c-format
msgid "%s: Error - unknown destination \"%s/%s\"."
msgstr ""
-#: berkeley/lpr.c:274 berkeley/lprm.c:139 systemv/cancel.c:156
-#: systemv/cupsaccept.c:164 systemv/lp.c:496 systemv/lpstat.c:452
#, c-format
msgid "%s: Error - unknown option \"%c\"."
msgstr ""
-#: systemv/cupsaccept.c:157
#, c-format
msgid "%s: Error - unknown option \"%s\"."
msgstr ""
-#: systemv/lp.c:208
#, c-format
msgid "%s: Expected job ID after \"-i\" option."
msgstr ""
-#: systemv/lpstat.c:504 systemv/lpstat.c:543
#, c-format
msgid "%s: Invalid destination name in list \"%s\"."
msgstr ""
-#: scheduler/cupsfilter.c:567
#, c-format
msgid "%s: Invalid filter string \"%s\"."
msgstr ""
-#: systemv/lp.c:418
+#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr ""
+
#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
msgstr ""
-#: scheduler/cupsfilter.c:458
#, c-format
msgid "%s: No filter to convert from %s/%s to %s/%s."
msgstr ""
-#: systemv/cupsaccept.c:198
#, c-format
msgid "%s: Operation failed: %s"
msgstr ""
-#: berkeley/lpq.c:97 berkeley/lpr.c:70 berkeley/lprm.c:67 systemv/cancel.c:81
-#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:102
-#: systemv/lpadmin.c:239 systemv/lpinfo.c:88 systemv/lpmove.c:73
-#: systemv/lpstat.c:102 test/ipptool.c:304 test/ipptool.c:321
#, c-format
msgid "%s: Sorry, no encryption support."
msgstr ""
-#: berkeley/lpq.c:295 scheduler/cupsfilter.c:1221 systemv/cancel.c:237
-#: systemv/cupsaddsmb.c:144 systemv/cupsaddsmb.c:171
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
#, c-format
msgid "%s: Unable to connect to server."
msgstr ""
-#: systemv/cancel.c:317
#, c-format
msgid "%s: Unable to contact server."
msgstr ""
-#: scheduler/cupsfilter.c:424
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
msgstr ""
-#: ppdc/ppdmerge.cxx:96
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
#, c-format
msgid "%s: Unable to open %s: %s"
msgstr ""
-#: scheduler/cupsfilter.c:662 ppdc/ppdmerge.cxx:112
#, c-format
msgid "%s: Unable to open PPD file: %s on line %d."
msgstr ""
-#: scheduler/cupsfilter.c:392
#, c-format
msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
msgstr ""
-#: berkeley/lpq.c:153 systemv/lpstat.c:558
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
#, c-format
msgid "%s: Unknown destination \"%s\"."
msgstr ""
-#: scheduler/cupsfilter.c:435
#, c-format
msgid "%s: Unknown destination MIME type %s/%s."
msgstr ""
-#: scheduler/cupsfilter.c:1426
#, c-format
msgid "%s: Unknown option \"%c\"."
msgstr ""
-#: scheduler/cupsfilter.c:416
+#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr ""
+
#, c-format
msgid "%s: Unknown source MIME type %s/%s."
msgstr ""
-#: berkeley/lpr.c:139
#, c-format
-msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct."
+msgid ""
+"%s: Warning - \"%c\" format modifier not supported - output may not be "
+"correct."
msgstr ""
-#: systemv/lp.c:468
#, c-format
msgid "%s: Warning - character set option ignored."
msgstr ""
-#: systemv/lp.c:487
#, c-format
msgid "%s: Warning - content type option ignored."
msgstr ""
-#: systemv/lp.c:175
#, c-format
msgid "%s: Warning - form option ignored."
msgstr ""
-#: systemv/lp.c:378
#, c-format
msgid "%s: Warning - mode option ignored."
msgstr ""
-#: ppdc/sample.c:310
msgid "-1"
msgstr "-1"
-#: ppdc/sample.c:301
msgid "-10"
msgstr "-10"
-#: ppdc/sample.c:393
msgid "-100"
msgstr "-100"
-#: ppdc/sample.c:392
msgid "-105"
msgstr "-105"
-#: ppdc/sample.c:300
msgid "-11"
msgstr "-11"
-#: ppdc/sample.c:391
msgid "-110"
msgstr "-110"
-#: ppdc/sample.c:390
msgid "-115"
msgstr "-115"
-#: ppdc/sample.c:299
msgid "-12"
msgstr "-12"
-#: ppdc/sample.c:389
msgid "-120"
msgstr "-120"
-#: ppdc/sample.c:298
msgid "-13"
msgstr "-13"
-#: ppdc/sample.c:297
msgid "-14"
msgstr "-14"
-#: ppdc/sample.c:296
msgid "-15"
msgstr "-15"
-#: ppdc/sample.c:309
msgid "-2"
msgstr "-2"
-#: ppdc/sample.c:409
msgid "-20"
msgstr "-20"
-#: ppdc/sample.c:408
msgid "-25"
msgstr "-25"
-#: ppdc/sample.c:308
msgid "-3"
msgstr "-3"
-#: ppdc/sample.c:407
msgid "-30"
msgstr "-30"
-#: ppdc/sample.c:406
msgid "-35"
msgstr "-35"
-#: ppdc/sample.c:307
msgid "-4"
msgstr "-4"
-#: ppdc/sample.c:405
msgid "-40"
msgstr "-40"
-#: ppdc/sample.c:404
msgid "-45"
msgstr "-45"
-#: ppdc/sample.c:306
msgid "-5"
msgstr "-5"
-#: ppdc/sample.c:403
msgid "-50"
msgstr "-50"
-#: ppdc/sample.c:402
msgid "-55"
msgstr "-55"
-#: ppdc/sample.c:305
msgid "-6"
msgstr "-6"
-#: ppdc/sample.c:401
msgid "-60"
msgstr "-60"
-#: ppdc/sample.c:400
msgid "-65"
msgstr "-65"
-#: ppdc/sample.c:304
msgid "-7"
msgstr "-7"
-#: ppdc/sample.c:399
msgid "-70"
msgstr "-70"
-#: ppdc/sample.c:398
msgid "-75"
msgstr "-75"
-#: ppdc/sample.c:303
msgid "-8"
msgstr "-8"
-#: ppdc/sample.c:397
msgid "-80"
msgstr "-80"
-#: ppdc/sample.c:396
msgid "-85"
msgstr "-85"
-#: ppdc/sample.c:302
msgid "-9"
msgstr "-9"
-#: ppdc/sample.c:395
msgid "-90"
msgstr "-90"
-#: ppdc/sample.c:394
msgid "-95"
msgstr "-95"
-#: ppdc/sample.c:311
msgid "0"
msgstr "0"
-#: ppdc/sample.c:312
msgid "1"
msgstr "1"
-#: ppdc/sample.c:384
msgid "1 inch/sec."
msgstr "1 palec/sek."
-#: ppdc/sample.c:172
msgid "1.25x0.25\""
msgstr "1.25x0.25\""
-#: ppdc/sample.c:173
msgid "1.25x2.25\""
msgstr "1.25x2.25\""
-#: ppdc/sample.c:432
msgid "1.5 inch/sec."
msgstr "1.5 palce/sek."
-#: ppdc/sample.c:174
msgid "1.50x0.25\""
msgstr "1.50x0.25\""
-#: ppdc/sample.c:175
msgid "1.50x0.50\""
msgstr "1.50x0.50\""
-#: ppdc/sample.c:176
msgid "1.50x1.00\""
msgstr "1.50x1.00\""
-#: ppdc/sample.c:177
msgid "1.50x2.00\""
msgstr "1.50x2.00\""
-#: ppdc/sample.c:321
msgid "10"
msgstr "10"
-#: ppdc/sample.c:443
msgid "10 inches/sec."
msgstr "10 palců/sek."
-#: ppdc/sample.c:6
msgid "10 x 11"
msgstr ""
-#: ppdc/sample.c:7
msgid "10 x 13"
msgstr ""
-#: ppdc/sample.c:8
msgid "10 x 14"
msgstr ""
-#: ppdc/sample.c:423
msgid "100"
msgstr "100"
-#: ppdc/sample.c:334
msgid "100 mm/sec."
msgstr "100 mm/sek."
-#: ppdc/sample.c:424
msgid "105"
msgstr "105"
-#: ppdc/sample.c:322
msgid "11"
msgstr "11"
-#: ppdc/sample.c:444
msgid "11 inches/sec."
msgstr "11 palců/sek."
-#: ppdc/sample.c:425
msgid "110"
msgstr "110"
-#: ppdc/sample.c:426
msgid "115"
msgstr "115"
-#: ppdc/sample.c:323
msgid "12"
msgstr "12"
-#: ppdc/sample.c:445
msgid "12 inches/sec."
msgstr "12 palců/sek."
-#: ppdc/sample.c:9
msgid "12 x 11"
msgstr ""
-#: ppdc/sample.c:427
msgid "120"
msgstr "120"
-#: ppdc/sample.c:335
msgid "120 mm/sec."
msgstr "120 mm/sek."
-#: ppdc/sample.c:243
msgid "120x60dpi"
msgstr "120x60 dpi"
-#: ppdc/sample.c:249
msgid "120x72dpi"
msgstr "120x72 dpi"
-#: ppdc/sample.c:324
msgid "13"
msgstr "13"
-#: ppdc/sample.c:232
msgid "136dpi"
msgstr "136 dpi"
-#: ppdc/sample.c:325
msgid "14"
msgstr "14"
-#: ppdc/sample.c:326
msgid "15"
msgstr "15"
-#: ppdc/sample.c:328
msgid "15 mm/sec."
msgstr "15 mm/sek."
-#: ppdc/sample.c:10
msgid "15 x 11"
msgstr ""
-#: ppdc/sample.c:336
msgid "150 mm/sec."
msgstr "150 mm/sek."
-#: ppdc/sample.c:283
msgid "150dpi"
msgstr "150 dpi"
-#: ppdc/sample.c:368
msgid "16"
msgstr "16"
-#: ppdc/sample.c:369
msgid "17"
msgstr "17"
-#: ppdc/sample.c:370
msgid "18"
msgstr "18"
-#: ppdc/sample.c:244
msgid "180dpi"
msgstr "180 dpi"
-#: ppdc/sample.c:371
msgid "19"
msgstr "19"
-#: ppdc/sample.c:313
msgid "2"
msgstr "2"
-#: ppdc/sample.c:385
msgid "2 inches/sec."
msgstr "2 palce/sek."
-#: ppdc/sample.c:270
msgid "2-Sided Printing"
msgstr "oboustranný tisk"
-#: ppdc/sample.c:178
msgid "2.00x0.37\""
msgstr "2.00x0.37\""
-#: ppdc/sample.c:179
msgid "2.00x0.50\""
msgstr "2.00x0.50\""
-#: ppdc/sample.c:180
msgid "2.00x1.00\""
msgstr "2.00x1.00\""
-#: ppdc/sample.c:181
msgid "2.00x1.25\""
msgstr "2.00x1.25\""
-#: ppdc/sample.c:182
msgid "2.00x2.00\""
msgstr "2.00x2.00\""
-#: ppdc/sample.c:183
msgid "2.00x3.00\""
msgstr "2.00x3.00\""
-#: ppdc/sample.c:184
msgid "2.00x4.00\""
msgstr "2.00x4.00\""
-#: ppdc/sample.c:185
msgid "2.00x5.50\""
msgstr "2.00x5.50\""
-#: ppdc/sample.c:186
msgid "2.25x0.50\""
msgstr "2.25x0.50\""
-#: ppdc/sample.c:187
msgid "2.25x1.25\""
msgstr "2.25x1.25\""
-#: ppdc/sample.c:188
msgid "2.25x4.00\""
msgstr "2.25x4.00\""
-#: ppdc/sample.c:189
msgid "2.25x5.50\""
msgstr "2.25x5.50\""
-#: ppdc/sample.c:190
msgid "2.38x5.50\""
msgstr "2.38x5.50\""
-#: ppdc/sample.c:433
msgid "2.5 inches/sec."
msgstr "2.5 palce/sek."
-#: ppdc/sample.c:191
msgid "2.50x1.00\""
msgstr "2.50x1.00\""
-#: ppdc/sample.c:192
msgid "2.50x2.00\""
msgstr "2.50x2.00\""
-#: ppdc/sample.c:193
msgid "2.75x1.25\""
msgstr "2.75x1.25\""
-#: ppdc/sample.c:194
msgid "2.9 x 1\""
msgstr "2.9 x 1\""
-#: ppdc/sample.c:372
msgid "20"
msgstr "20"
-#: ppdc/sample.c:329
msgid "20 mm/sec."
msgstr "20 mm/sek."
-#: ppdc/sample.c:337
msgid "200 mm/sec."
msgstr "200 mm/sek."
-#: ppdc/sample.c:233
msgid "203dpi"
msgstr "203 dpi"
-#: ppdc/sample.c:373
msgid "21"
msgstr "21"
-#: ppdc/sample.c:374
msgid "22"
msgstr "22"
-#: ppdc/sample.c:375
msgid "23"
msgstr "23"
-#: ppdc/sample.c:376
msgid "24"
msgstr "24"
-#: ppdc/sample.c:241
msgid "24-Pin Series"
msgstr "24 jehliÄková"
-#: ppdc/sample.c:250
msgid "240x72dpi"
msgstr "240x72 dpi"
-#: ppdc/sample.c:377
msgid "25"
msgstr "25"
-#: ppdc/sample.c:338
msgid "250 mm/sec."
msgstr "250 mm/sek."
-#: ppdc/sample.c:378
msgid "26"
msgstr "26"
-#: ppdc/sample.c:379
msgid "27"
msgstr "27"
-#: ppdc/sample.c:380
msgid "28"
msgstr "28"
-#: ppdc/sample.c:381
msgid "29"
msgstr "29"
-#: ppdc/sample.c:314
msgid "3"
msgstr "3"
-#: ppdc/sample.c:386
msgid "3 inches/sec."
msgstr "3 palce/sek."
-#: ppdc/sample.c:3
msgid "3 x 5"
msgstr ""
-#: ppdc/sample.c:195
msgid "3.00x1.00\""
msgstr "3.00x1.00\""
-#: ppdc/sample.c:196
msgid "3.00x1.25\""
msgstr "3.00x1.25\""
-#: ppdc/sample.c:197
msgid "3.00x2.00\""
msgstr "3.00x2.00\""
-#: ppdc/sample.c:198
msgid "3.00x3.00\""
msgstr "3.00x3.00\""
-#: ppdc/sample.c:199
msgid "3.00x5.00\""
msgstr "3.00x5.00\""
-#: ppdc/sample.c:200
msgid "3.25x2.00\""
msgstr "3.25x2.00\""
-#: ppdc/sample.c:201
msgid "3.25x5.00\""
msgstr "3.25x5.00\""
-#: ppdc/sample.c:202
msgid "3.25x5.50\""
msgstr "3.25x5.50\""
-#: ppdc/sample.c:203
msgid "3.25x5.83\""
msgstr "3.25x5.83\""
-#: ppdc/sample.c:204
msgid "3.25x7.83\""
msgstr "3.25x7.83\""
-#: ppdc/sample.c:4
msgid "3.5 x 5"
msgstr ""
-#: ppdc/sample.c:171
msgid "3.5\" Disk"
msgstr "3.5\" Disk"
-#: ppdc/sample.c:205
msgid "3.50x1.00\""
msgstr "3.50x1.00\""
-#: ppdc/sample.c:382
msgid "30"
msgstr "30"
-#: ppdc/sample.c:330
msgid "30 mm/sec."
msgstr "30 mm/sek."
-#: ppdc/sample.c:339
msgid "300 mm/sec."
msgstr "300 mm/sek."
-#: ppdc/sample.c:234
msgid "300dpi"
msgstr "300 dpi"
-#: ppdc/sample.c:410
msgid "35"
msgstr "35"
-#: ppdc/sample.c:246
msgid "360dpi"
msgstr "360 dpi"
-#: ppdc/sample.c:245
msgid "360x180dpi"
msgstr "360x180 dpi"
-#: ppdc/sample.c:315
msgid "4"
msgstr "4"
-#: ppdc/sample.c:387
msgid "4 inches/sec."
msgstr "4 palce/sek."
-#: ppdc/sample.c:206
msgid "4.00x1.00\""
msgstr "4.00x1.00\""
-#: ppdc/sample.c:214
msgid "4.00x13.00\""
msgstr "4.00x13.00\""
-#: ppdc/sample.c:207
msgid "4.00x2.00\""
msgstr "4.00x2.00\""
-#: ppdc/sample.c:208
msgid "4.00x2.50\""
msgstr "4.00x2.50\""
-#: ppdc/sample.c:209
msgid "4.00x3.00\""
msgstr "4.00x3.00\""
-#: ppdc/sample.c:210
msgid "4.00x4.00\""
msgstr "4.00x4.00\""
-#: ppdc/sample.c:211
msgid "4.00x5.00\""
msgstr "4.00x5.00\""
-#: ppdc/sample.c:212
msgid "4.00x6.00\""
msgstr "4.00x6.00\""
-#: ppdc/sample.c:213
msgid "4.00x6.50\""
msgstr "4.00x6.50\""
-#: ppdc/sample.c:411
msgid "40"
msgstr "40"
-#: ppdc/sample.c:331
msgid "40 mm/sec."
msgstr "40 mm/sek."
-#: ppdc/sample.c:412
msgid "45"
msgstr "45"
-#: ppdc/sample.c:316
msgid "5"
msgstr "5"
-#: ppdc/sample.c:437
msgid "5 inches/sec."
msgstr "5 palců/sek."
-#: ppdc/sample.c:5
msgid "5 x 7"
msgstr ""
-#: ppdc/sample.c:413
msgid "50"
msgstr "50"
-#: ppdc/sample.c:414
msgid "55"
msgstr "55"
-#: ppdc/sample.c:317
msgid "6"
msgstr "6"
-#: ppdc/sample.c:438
msgid "6 inches/sec."
msgstr "6 palců/sek."
-#: ppdc/sample.c:215
msgid "6.00x1.00\""
msgstr "6.00x1.00\""
-#: ppdc/sample.c:216
msgid "6.00x2.00\""
msgstr "6.00x2.00\""
-#: ppdc/sample.c:217
msgid "6.00x3.00\""
msgstr "6.00x3.00\""
-#: ppdc/sample.c:218
msgid "6.00x4.00\""
msgstr "6.00x4.00\""
-#: ppdc/sample.c:219
msgid "6.00x5.00\""
msgstr "6.00x5.00\""
-#: ppdc/sample.c:220
msgid "6.00x6.00\""
msgstr "6.00x6.00\""
-#: ppdc/sample.c:221
msgid "6.00x6.50\""
msgstr "6.00x6.50\""
-#: ppdc/sample.c:415
msgid "60"
msgstr "60"
-#: ppdc/sample.c:332
msgid "60 mm/sec."
msgstr "60 mm/sek."
-#: ppdc/sample.c:261
msgid "600dpi"
msgstr "600 dpi"
-#: ppdc/sample.c:242
msgid "60dpi"
msgstr "60 dpi"
-#: ppdc/sample.c:248
msgid "60x72dpi"
msgstr ""
-#: ppdc/sample.c:416
msgid "65"
msgstr "65"
-#: ppdc/sample.c:318
msgid "7"
msgstr "7"
-#: ppdc/sample.c:440
msgid "7 inches/sec."
msgstr "7 palců/sek."
-#: ppdc/sample.c:11
msgid "7 x 9"
msgstr ""
-#: ppdc/sample.c:417
msgid "70"
msgstr "70"
-#: ppdc/sample.c:252
-msgid "720dpi"
-msgstr "720 dpi"
-
-#: ppdc/sample.c:418
msgid "75"
msgstr "75"
-#: ppdc/sample.c:319
msgid "8"
msgstr "8"
-#: ppdc/sample.c:441
msgid "8 inches/sec."
msgstr "8 palců/sek."
-#: ppdc/sample.c:12
msgid "8 x 10"
msgstr ""
-#: ppdc/sample.c:222
msgid "8.00x1.00\""
msgstr "8.00x1.00\""
-#: ppdc/sample.c:223
msgid "8.00x2.00\""
msgstr "8.00x2.00\""
-#: ppdc/sample.c:224
msgid "8.00x3.00\""
msgstr "8.00x3.00\""
-#: ppdc/sample.c:225
msgid "8.00x4.00\""
msgstr "8.00x4.00\""
-#: ppdc/sample.c:226
msgid "8.00x5.00\""
msgstr "8.00x5.00\""
-#: ppdc/sample.c:227
msgid "8.00x6.00\""
msgstr "8.00x6.00\""
-#: ppdc/sample.c:228
msgid "8.00x6.50\""
msgstr "8.00x6.50\""
-#: ppdc/sample.c:419
msgid "80"
msgstr "80"
-#: ppdc/sample.c:333
msgid "80 mm/sec."
msgstr "80 mm/sek."
-#: ppdc/sample.c:420
msgid "85"
msgstr "85"
-#: ppdc/sample.c:320
msgid "9"
msgstr "9"
-#: ppdc/sample.c:442
msgid "9 inches/sec."
msgstr "9 palců/sek."
-#: ppdc/sample.c:13
msgid "9 x 11"
msgstr ""
-#: ppdc/sample.c:14
msgid "9 x 12"
msgstr ""
-#: ppdc/sample.c:247
msgid "9-Pin Series"
msgstr "9 jehliÄková"
-#: ppdc/sample.c:421
msgid "90"
msgstr "90"
-#: ppdc/sample.c:422
msgid "95"
msgstr "95"
-#: berkeley/lpc.c:213
msgid "?Invalid help command unknown."
msgstr ""
-#: cgi-bin/admin.c:2368
msgid "A Samba password is required to export printer drivers"
msgstr ""
-#: cgi-bin/admin.c:2364
msgid "A Samba username is required to export printer drivers"
msgstr ""
-#: scheduler/ipp.c:2283
#, c-format
msgid "A class named \"%s\" already exists."
msgstr ""
-#: scheduler/ipp.c:1004
#, c-format
msgid "A printer named \"%s\" already exists."
msgstr ""
-#: ppdc/sample.c:15
msgid "A0"
msgstr "A0"
-#: ppdc/sample.c:16
msgid "A0 Long Edge"
msgstr ""
-#: ppdc/sample.c:17
msgid "A1"
msgstr "A1"
-#: ppdc/sample.c:18
msgid "A1 Long Edge"
msgstr ""
-#: ppdc/sample.c:37
msgid "A10"
msgstr "A10"
-#: ppdc/sample.c:19
msgid "A2"
msgstr "A2"
-#: ppdc/sample.c:20
msgid "A2 Long Edge"
msgstr ""
-#: ppdc/sample.c:21
msgid "A3"
msgstr "A3"
-#: ppdc/sample.c:22
msgid "A3 Long Edge"
msgstr ""
-#: ppdc/sample.c:23
msgid "A3 Oversize"
msgstr ""
-#: ppdc/sample.c:24
msgid "A3 Oversize Long Edge"
msgstr ""
-#: ppdc/sample.c:25
msgid "A4"
msgstr "A4"
-#: ppdc/sample.c:27
msgid "A4 Long Edge"
msgstr ""
-#: ppdc/sample.c:26
msgid "A4 Oversize"
msgstr ""
-#: ppdc/sample.c:28
msgid "A4 Small"
msgstr ""
-#: ppdc/sample.c:29
msgid "A5"
msgstr "A5"
-#: ppdc/sample.c:31
msgid "A5 Long Edge"
msgstr ""
-#: ppdc/sample.c:30
msgid "A5 Oversize"
msgstr ""
-#: ppdc/sample.c:32
msgid "A6"
msgstr "A6"
-#: ppdc/sample.c:33
msgid "A6 Long Edge"
msgstr ""
-#: ppdc/sample.c:34
msgid "A7"
msgstr "A7"
-#: ppdc/sample.c:35
msgid "A8"
msgstr "A8"
-#: ppdc/sample.c:36
msgid "A9"
msgstr "A9"
-#: ppdc/sample.c:38
msgid "ANSI A"
msgstr "ANSI A"
-#: ppdc/sample.c:39
msgid "ANSI B"
msgstr "ANSI B"
-#: ppdc/sample.c:40
msgid "ANSI C"
msgstr "ANSI C"
-#: ppdc/sample.c:41
msgid "ANSI D"
msgstr "ANSI D"
-#: ppdc/sample.c:42
msgid "ANSI E"
msgstr "ANSI E"
-#: ppdc/sample.c:47
msgid "ARCH C"
msgstr "ARCH C"
-#: ppdc/sample.c:48
msgid "ARCH C Long Edge"
msgstr ""
-#: ppdc/sample.c:49
msgid "ARCH D"
msgstr "ARCH D"
-#: ppdc/sample.c:50
msgid "ARCH D Long Edge"
msgstr ""
-#: ppdc/sample.c:51
msgid "ARCH E"
msgstr "ARCH E"
-#: ppdc/sample.c:52
msgid "ARCH E Long Edge"
msgstr ""
-#: cgi-bin/classes.c:169 cgi-bin/printers.c:172
msgid "Accept Jobs"
msgstr "Příjem úloh"
-#: cups/http-support.c:1284
msgid "Accepted"
msgstr "Přijatý"
-#: cgi-bin/admin.c:570
msgid "Add Class"
msgstr "Přidat třídu"
-#: cgi-bin/admin.c:882
msgid "Add Printer"
msgstr "Přidat tiskárnu"
-#: cgi-bin/admin.c:444 cgi-bin/admin.c:477 cgi-bin/admin.c:525
-#: cgi-bin/admin.c:535
msgid "Add RSS Subscription"
msgstr "Přidat RSS předplatné"
-#: ppdc/sample.c:163
msgid "Address"
msgstr "Adresa"
-#: cgi-bin/admin.c:210 cgi-bin/admin.c:284 cgi-bin/admin.c:2745
msgid "Administration"
msgstr "Administrace"
-#: ppdc/sample.c:429
msgid "Always"
msgstr "Vždy"
-#: backend/socket.c:129
msgid "AppSocket/HP JetDirect"
msgstr "AppSocket/HP JetDirect"
-#: ppdc/sample.c:450
msgid "Applicator"
msgstr "Aplikátor"
-#: scheduler/ipp.c:1079
#, c-format
msgid "Attempt to set %s printer-state to bad value %d."
msgstr ""
-#: scheduler/ipp.c:325
#, c-format
msgid "Attribute groups are out of order (%x < %x)."
msgstr ""
-#: ppdc/sample.c:126
msgid "B0"
msgstr "B0"
-#: ppdc/sample.c:127
msgid "B1"
msgstr "B1"
-#: ppdc/sample.c:137
msgid "B10"
msgstr "B10"
-#: ppdc/sample.c:128
msgid "B2"
msgstr "B2"
-#: ppdc/sample.c:129
msgid "B3"
msgstr "B3"
-#: ppdc/sample.c:130
msgid "B4"
msgstr "B4"
-#: ppdc/sample.c:131
msgid "B5"
msgstr "B5"
-#: ppdc/sample.c:132
msgid "B5 Oversize"
msgstr ""
-#: ppdc/sample.c:133
msgid "B6"
msgstr "B6"
-#: ppdc/sample.c:134
msgid "B7"
msgstr "B7"
-#: ppdc/sample.c:135
msgid "B8"
msgstr "B8"
-#: ppdc/sample.c:136
msgid "B9"
msgstr "B9"
-#: cups/dest.c:1680
+#, c-format
+msgid "Bad 'document-format' value \"%s\"."
+msgstr ""
+
msgid "Bad NULL dests pointer"
msgstr "Neplatný ukazatel NULL"
-#: cups/ppd.c:345
msgid "Bad OpenGroup"
msgstr "Chybný OpenGroup"
-#: cups/ppd.c:347
msgid "Bad OpenUI/JCLOpenUI"
msgstr "Chybný OpenUI/JCLOpenUI"
-#: cups/ppd.c:349
msgid "Bad OrderDependency"
msgstr "Chybný OrderDependency"
-#: cups/ppd-cache.c:148 cups/ppd-cache.c:195 cups/ppd-cache.c:233
-#: cups/ppd-cache.c:239 cups/ppd-cache.c:255 cups/ppd-cache.c:271
-#: cups/ppd-cache.c:280 cups/ppd-cache.c:288 cups/ppd-cache.c:305
-#: cups/ppd-cache.c:313 cups/ppd-cache.c:328 cups/ppd-cache.c:336
-#: cups/ppd-cache.c:354 cups/ppd-cache.c:366 cups/ppd-cache.c:381
-#: cups/ppd-cache.c:393 cups/ppd-cache.c:415 cups/ppd-cache.c:423
-#: cups/ppd-cache.c:441 cups/ppd-cache.c:449 cups/ppd-cache.c:464
-#: cups/ppd-cache.c:472 cups/ppd-cache.c:490 cups/ppd-cache.c:498
-#: cups/ppd-cache.c:525 cups/ppd-cache.c:571 cups/ppd-cache.c:579
-#: cups/ppd-cache.c:587
msgid "Bad PPD cache file."
msgstr ""
-#: cups/http-support.c:1299
msgid "Bad Request"
msgstr "Chybný požadavek"
-#: cups/snmp.c:1002
msgid "Bad SNMP version number"
msgstr "Chybná verze SNMP"
-#: cups/ppd.c:350
msgid "Bad UIConstraints"
msgstr "Chybný UIConstraints"
-#: scheduler/ipp.c:1380
+msgid "Bad arguments to function"
+msgstr ""
+
#, c-format
msgid "Bad copies value %d."
msgstr "Chybný poÄet kopií %d."
-#: cups/ppd.c:358
msgid "Bad custom parameter"
msgstr "Chybný uživatelský parametr"
-#: cups/http-support.c:1451 scheduler/ipp.c:2350
#, c-format
msgid "Bad device-uri \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2391
#, c-format
msgid "Bad device-uri scheme \"%s\"."
msgstr ""
-#: scheduler/ipp.c:8224 scheduler/ipp.c:8240 scheduler/ipp.c:9454
-#: scheduler/ipp.c:10968
#, c-format
msgid "Bad document-format \"%s\"."
msgstr ""
-#: scheduler/ipp.c:9470
#, c-format
msgid "Bad document-format-default \"%s\"."
msgstr ""
-#: cups/util.c:929
msgid "Bad filename buffer"
msgstr ""
-#: scheduler/ipp.c:10060
+msgid "Bad hostname/address in URI"
+msgstr ""
+
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr ""
+
+msgid "Bad job-name value: Wrong type or count."
+msgstr ""
+
msgid "Bad job-priority value."
msgstr ""
-#: scheduler/ipp.c:1410
#, c-format
msgid "Bad job-sheets value \"%s\"."
msgstr ""
-#: scheduler/ipp.c:1394
msgid "Bad job-sheets value type."
msgstr ""
-#: scheduler/ipp.c:10090
msgid "Bad job-state value."
msgstr ""
-#: scheduler/ipp.c:2974 scheduler/ipp.c:3426 scheduler/ipp.c:6078
-#: scheduler/ipp.c:6225 scheduler/ipp.c:7658 scheduler/ipp.c:7927
-#: scheduler/ipp.c:8775 scheduler/ipp.c:9001 scheduler/ipp.c:9350
-#: scheduler/ipp.c:9953
#, c-format
msgid "Bad job-uri \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2049 scheduler/ipp.c:5622
#, c-format
msgid "Bad notify-pull-method \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2013 scheduler/ipp.c:5586
#, c-format
msgid "Bad notify-recipient-uri \"%s\"."
msgstr ""
-#: scheduler/ipp.c:1426
#, c-format
msgid "Bad number-up value %d."
msgstr "Chybná hodnota %d."
-#: cups/adminutil.c:292
#, c-format
msgid "Bad option + choice on line %d."
msgstr ""
-#: scheduler/ipp.c:1443
#, c-format
msgid "Bad page-ranges values %d-%d."
msgstr "Chybný rozsah stránek %d-%d."
-#: scheduler/ipp.c:2434
-#, c-format
-msgid "Bad port-monitor \"%s\"."
+msgid "Bad port number in URI"
msgstr ""
-#: cups/dest.c:676 cups/dest.c:1333
-msgid "Bad printer URI."
+#, c-format
+msgid "Bad port-monitor \"%s\"."
msgstr ""
-#: scheduler/ipp.c:2495
#, c-format
msgid "Bad printer-state value %d."
msgstr ""
-#: scheduler/ipp.c:293
+msgid "Bad printer-uri."
+msgstr ""
+
#, c-format
msgid "Bad request ID %d."
msgstr ""
-#: scheduler/ipp.c:278
#, c-format
msgid "Bad request version number %d.%d."
msgstr ""
-#: cgi-bin/admin.c:1484
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
+msgstr ""
+
msgid "Bad subscription ID"
msgstr ""
-#: cups/ppd.c:360
+msgid "Bad username in URI"
+msgstr ""
+
msgid "Bad value string"
msgstr ""
-#: cgi-bin/admin.c:3290 cgi-bin/admin.c:3536
+msgid "Bad/empty URI"
+msgstr ""
+
msgid "Banners"
msgstr "Banery"
-#: ppdc/sample.c:287
msgid "Bond Paper"
msgstr "Kancelářský papír"
-#: backend/usb-darwin.c:1846
#, c-format
msgid "Boolean expected for waiteof option \"%s\"."
msgstr ""
-#: filter/pstops.c:2057
msgid "Buffer overflow detected, aborting."
msgstr ""
-#: ppdc/sample.c:254
msgid "CMYK"
msgstr "CMYK"
-#: ppdc/sample.c:363
msgid "CPCL Label Printer"
msgstr "Tiskárna štítků CPCL"
-#: cgi-bin/admin.c:1485 cgi-bin/admin.c:1524 cgi-bin/admin.c:1534
+msgid "Cancel Jobs"
+msgstr ""
+
msgid "Cancel RSS Subscription"
msgstr "Zrušit RSS předplatné"
-#: backend/ipp.c:1921
msgid "Canceling print job."
msgstr ""
-#: scheduler/ipp.c:2475
msgid "Cannot share a remote Kerberized printer."
msgstr ""
-#: ppdc/sample.c:279
msgid "Cassette"
msgstr ""
-#: cgi-bin/admin.c:1655 cgi-bin/admin.c:1797 cgi-bin/admin.c:1810
-#: cgi-bin/admin.c:1821
msgid "Change Settings"
msgstr "Změna nastavení"
-#: scheduler/ipp.c:2061 scheduler/ipp.c:5634
#, c-format
msgid "Character set \"%s\" not supported."
msgstr ""
-#: cgi-bin/classes.c:195 cgi-bin/classes.c:322
msgid "Classes"
msgstr "Třídy"
-#: cgi-bin/printers.c:182
msgid "Clean Print Heads"
msgstr "VyÄiÅ¡tÄ›ní tiskových hlav"
-#: scheduler/ipp.c:3878
msgid "Close-Job doesn't support the job-uri attribute."
msgstr ""
-#: ppdc/sample.c:282
msgid "Color"
msgstr "Barva"
-#: ppdc/sample.c:253
msgid "Color Mode"
msgstr "Barevný režim"
-#: berkeley/lpc.c:204
msgid ""
"Commands may be abbreviated. Commands are:\n"
"\n"
"exit help quit status ?"
msgstr ""
-#: cups/snmp.c:1006
msgid "Community name uses indefinite length"
msgstr "\"Community-Name\" má neomezenou délku"
-#: backend/ipp.c:786 backend/lpd.c:871 backend/socket.c:395
msgid "Connected to printer."
msgstr ""
-#: backend/ipp.c:691 backend/lpd.c:694 backend/socket.c:314
msgid "Connecting to printer."
msgstr ""
-#: cups/http-support.c:1272
msgid "Continue"
msgstr "PokraÄovat"
-#: ppdc/sample.c:365
msgid "Continuous"
msgstr "Souvislý"
-#: backend/lpd.c:1020 backend/lpd.c:1152
msgid "Control file sent successfully."
msgstr ""
-#: backend/ipp.c:1233 backend/lpd.c:464
msgid "Copying print data."
msgstr ""
-#: cups/http-support.c:1281
msgid "Created"
msgstr "Vytvořeno"
-#: cups/ppd.c:1113 cups/ppd.c:1153 cups/ppd.c:1398 cups/ppd.c:1501
msgid "Custom"
msgstr "Uživatelský"
-#: ppdc/sample.c:359
msgid "CustominCutInterval"
msgstr "CustominCutInterval"
-#: ppdc/sample.c:357
msgid "CustominTearInterval"
msgstr "CustominTearInterval"
-#: ppdc/sample.c:343
msgid "Cut"
msgstr "Snížit"
-#: ppdc/sample.c:451
msgid "Cutter"
msgstr "Výstřižek"
-#: ppdc/sample.c:239
msgid "Dark"
msgstr "Tmavý"
-#: ppdc/sample.c:235
msgid "Darkness"
msgstr "Tma"
-#: backend/lpd.c:1105
msgid "Data file sent successfully."
msgstr ""
-#: cgi-bin/admin.c:2094 cgi-bin/admin.c:2105 cgi-bin/admin.c:2150
msgid "Delete Class"
msgstr "Výmaz třídy"
-#: cgi-bin/admin.c:2179 cgi-bin/admin.c:2190 cgi-bin/admin.c:2235
msgid "Delete Printer"
msgstr "Výmaz tiskárny"
-#: ppdc/sample.c:281
msgid "DeskJet Series"
msgstr "Řada DeskJet"
-#: scheduler/ipp.c:1346
#, c-format
msgid "Destination \"%s\" is not accepting jobs."
msgstr "Zařízení \"%s\" nepřijímá úlohy."
-#: systemv/lpinfo.c:300
#, c-format
msgid ""
"Device: uri = %s\n"
@@ -3053,934 +2805,725 @@ msgid ""
" location = %s"
msgstr ""
-#: ppdc/sample.c:436
msgid "Direct Thermal Media"
msgstr "Termální médium"
-#: cups/file.c:296
#, c-format
msgid "Directory \"%s\" contains a relative path."
msgstr ""
-#: cups/file.c:268
#, c-format
msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
msgstr ""
-#: cups/file.c:285
#, c-format
msgid "Directory \"%s\" is a file."
msgstr ""
-#: cups/file.c:256
#, c-format
msgid "Directory \"%s\" not available: %s"
msgstr ""
-#: cups/file.c:241
#, c-format
msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
msgstr ""
-#: ppdc/sample.c:345
msgid "Disabled"
msgstr "Zakázaný"
-#: scheduler/ipp.c:6127
#, c-format
msgid "Document #%d does not exist in job #%d."
msgstr ""
-#: ppdc/sample.c:275
msgid "Duplexer"
msgstr "Duplexní jednotka"
-#: ppdc/sample.c:229
msgid "Dymo"
msgstr "Dymo"
-#: ppdc/sample.c:431
msgid "EPL1 Label Printer"
msgstr "Tiskárna štítků EPL1"
-#: ppdc/sample.c:434
msgid "EPL2 Label Printer"
msgstr "Tiskárna štítků EPL2"
-#: cgi-bin/admin.c:1849 cgi-bin/admin.c:1861 cgi-bin/admin.c:1915
-#: cgi-bin/admin.c:1922 cgi-bin/admin.c:1957 cgi-bin/admin.c:1970
-#: cgi-bin/admin.c:1994 cgi-bin/admin.c:2067
msgid "Edit Configuration File"
msgstr "Úprava konfiguraÄního souboru"
-#: cups/adminutil.c:337
msgid "Empty PPD file."
msgstr ""
+msgid "Encryption is not supported."
+msgstr ""
+
#. TRANSLATORS: Banner/cover sheet after the print job.
-#: cgi-bin/admin.c:3561
msgid "Ending Banner"
msgstr "UkonÄení baneru"
-#: ppdc/sample.c:2
msgid "English"
msgstr "Čeština"
-#: systemv/lppasswd.c:193
-msgid "Enter old password:"
-msgstr "Zadejte původní heslo:"
-
-#: systemv/lppasswd.c:224
-msgid "Enter password again:"
-msgstr "Opakujte heslo:"
-
-#: systemv/lppasswd.c:212
-msgid "Enter password:"
-msgstr "Zadejte heslo:"
-
-#: scheduler/client.c:2427
-msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
-msgstr "Zadejte své uživatelské jméno a heslo, nebo uživatelské jméno a heslo administrátora pro přístup na tuto stránku. Pokud používáte ověřování Kerberos, ujistěte se, že máte platný ticket Kerberosu."
+msgid ""
+"Enter your username and password or the root username and password to access "
+"this page. If you are using Kerberos authentication, make sure you have a "
+"valid Kerberos ticket."
+msgstr ""
+"Zadejte své uživatelské jméno a heslo, nebo uživatelské jméno a heslo "
+"administrátora pro přístup na tuto stránku. Pokud používáte ověřování "
+"Kerberos, ujistěte se, že máte platný ticket Kerberosu."
-#: ppdc/sample.c:73
msgid "Envelope #10 "
msgstr ""
-#: ppdc/sample.c:74
msgid "Envelope #11"
msgstr ""
-#: ppdc/sample.c:75
msgid "Envelope #12"
msgstr ""
-#: ppdc/sample.c:76
msgid "Envelope #14"
msgstr ""
-#: ppdc/sample.c:77
msgid "Envelope #9"
msgstr ""
-#: ppdc/sample.c:89
msgid "Envelope B4"
msgstr ""
-#: ppdc/sample.c:90
msgid "Envelope B5"
msgstr ""
-#: ppdc/sample.c:91
msgid "Envelope B6"
msgstr ""
-#: ppdc/sample.c:78
msgid "Envelope C0"
msgstr ""
-#: ppdc/sample.c:79
msgid "Envelope C1"
msgstr ""
-#: ppdc/sample.c:80
msgid "Envelope C2"
msgstr ""
-#: ppdc/sample.c:81
msgid "Envelope C3"
msgstr ""
-#: ppdc/sample.c:67
msgid "Envelope C4"
msgstr ""
-#: ppdc/sample.c:68
msgid "Envelope C5"
msgstr ""
-#: ppdc/sample.c:69
msgid "Envelope C6"
msgstr ""
-#: ppdc/sample.c:82
msgid "Envelope C65"
msgstr ""
-#: ppdc/sample.c:83
msgid "Envelope C7"
msgstr ""
-#: ppdc/sample.c:84
msgid "Envelope Choukei 3"
msgstr ""
-#: ppdc/sample.c:85
msgid "Envelope Choukei 3 Long Edge"
msgstr ""
-#: ppdc/sample.c:86
msgid "Envelope Choukei 4"
msgstr ""
-#: ppdc/sample.c:87
msgid "Envelope Choukei 4 Long Edge"
msgstr ""
-#: ppdc/sample.c:70
msgid "Envelope DL"
msgstr ""
-#: ppdc/sample.c:269
msgid "Envelope Feed"
msgstr "PodavaÄ obálek"
-#: ppdc/sample.c:88
msgid "Envelope Invite"
msgstr ""
-#: ppdc/sample.c:92
msgid "Envelope Italian"
msgstr ""
-#: ppdc/sample.c:93
msgid "Envelope Kaku2"
msgstr ""
-#: ppdc/sample.c:94
msgid "Envelope Kaku2 Long Edge"
msgstr ""
-#: ppdc/sample.c:95
msgid "Envelope Kaku3"
msgstr ""
-#: ppdc/sample.c:96
msgid "Envelope Kaku3 Long Edge"
msgstr ""
-#: ppdc/sample.c:97
msgid "Envelope Monarch"
msgstr ""
-#: ppdc/sample.c:99
msgid "Envelope PRC1 "
msgstr ""
-#: ppdc/sample.c:100
msgid "Envelope PRC1 Long Edge"
msgstr ""
-#: ppdc/sample.c:117
msgid "Envelope PRC10"
msgstr ""
-#: ppdc/sample.c:118
msgid "Envelope PRC10 Long Edge"
msgstr ""
-#: ppdc/sample.c:101
msgid "Envelope PRC2"
msgstr ""
-#: ppdc/sample.c:102
msgid "Envelope PRC2 Long Edge"
msgstr ""
-#: ppdc/sample.c:103
msgid "Envelope PRC3"
msgstr ""
-#: ppdc/sample.c:104
msgid "Envelope PRC3 Long Edge"
msgstr ""
-#: ppdc/sample.c:105
msgid "Envelope PRC4"
msgstr ""
-#: ppdc/sample.c:106
msgid "Envelope PRC4 Long Edge"
msgstr ""
-#: ppdc/sample.c:108
msgid "Envelope PRC5 Long Edge"
msgstr ""
-#: ppdc/sample.c:107
msgid "Envelope PRC5PRC5"
msgstr ""
-#: ppdc/sample.c:109
msgid "Envelope PRC6"
msgstr ""
-#: ppdc/sample.c:110
msgid "Envelope PRC6 Long Edge"
msgstr ""
-#: ppdc/sample.c:111
msgid "Envelope PRC7"
msgstr ""
-#: ppdc/sample.c:112
msgid "Envelope PRC7 Long Edge"
msgstr ""
-#: ppdc/sample.c:113
msgid "Envelope PRC8"
msgstr ""
-#: ppdc/sample.c:114
msgid "Envelope PRC8 Long Edge"
msgstr ""
-#: ppdc/sample.c:115
msgid "Envelope PRC9"
msgstr ""
-#: ppdc/sample.c:116
msgid "Envelope PRC9 Long Edge"
msgstr ""
-#: ppdc/sample.c:98
msgid "Envelope Personal"
msgstr ""
-#: ppdc/sample.c:119
msgid "Envelope You4"
msgstr ""
-#: ppdc/sample.c:120
msgid "Envelope You4 Long Edge"
msgstr ""
-#: ppdc/sample.c:240
+msgid "Environment Variables:"
+msgstr ""
+
msgid "Epson"
msgstr "Epson"
-#: cgi-bin/admin.c:3604
msgid "Error Policy"
msgstr "Chování při chybě"
-#: filter/rastertopwg.c:403 filter/rastertopwg.c:418 filter/rastertopwg.c:429
-#: filter/rastertopwg.c:440
+msgid "Error reading raster data."
+msgstr ""
+
msgid "Error sending raster data."
msgstr ""
-#: systemv/lpinfo.c:103 systemv/lpmove.c:88
msgid "Error: need hostname after \"-h\" option."
msgstr ""
-#: ppdc/sample.c:355
msgid "Every 10 Labels"
msgstr "Každých 10 štítků"
-#: ppdc/sample.c:347
msgid "Every 2 Labels"
msgstr "Každé 2 štítky"
-#: ppdc/sample.c:348
msgid "Every 3 Labels"
msgstr "Každé 3 štítky"
-#: ppdc/sample.c:349
msgid "Every 4 Labels"
msgstr "Každé 4 štítky"
-#: ppdc/sample.c:350
msgid "Every 5 Labels"
msgstr "Každých 5 štítků"
-#: ppdc/sample.c:351
msgid "Every 6 Labels"
msgstr "Každých 6 štítků"
-#: ppdc/sample.c:352
msgid "Every 7 Labels"
msgstr "Každých 7 štítků"
-#: ppdc/sample.c:353
msgid "Every 8 Labels"
msgstr "Každých 8 štítků"
-#: ppdc/sample.c:354
msgid "Every 9 Labels"
msgstr "Každých 9 štítků"
-#: ppdc/sample.c:346
msgid "Every Label"
msgstr "Každý štítek"
-#: ppdc/sample.c:121
msgid "Executive"
msgstr ""
-#: cups/http-support.c:1327
msgid "Expectation Failed"
msgstr "OÄekávané údaje jsou neplatné"
-#: cgi-bin/admin.c:2356 cgi-bin/admin.c:2375
msgid "Export Printers to Samba"
msgstr "Export tiskáren do Samby"
-#: systemv/cupstestdsc.c:172 systemv/cupstestdsc.c:189
-#: systemv/cupstestdsc.c:214 systemv/cupstestdsc.c:231
-#: systemv/cupstestdsc.c:255 systemv/cupstestdsc.c:273
-#: systemv/cupstestdsc.c:302 systemv/cupstestdsc.c:339
-#: systemv/cupstestdsc.c:349 systemv/cupstestdsc.c:359
-#: systemv/cupstestdsc.c:369 systemv/cupstestdsc.c:379
-#: systemv/cupstestdsc.c:387
+msgid "Expressions:"
+msgstr ""
+
msgid "FAIL"
msgstr ""
-#: ppdc/sample.c:122
msgid "FanFold German"
msgstr ""
-#: ppdc/sample.c:123
msgid "FanFold Legal German"
msgstr ""
-#: ppdc/sample.c:124
msgid "Fanfold US"
msgstr ""
-#: cups/file.c:300
#, c-format
msgid "File \"%s\" contains a relative path."
msgstr ""
-#: cups/file.c:275
#, c-format
msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
msgstr ""
-#: cups/file.c:289
#, c-format
msgid "File \"%s\" is a directory."
msgstr ""
-#: cups/file.c:261
#, c-format
msgid "File \"%s\" not available: %s"
msgstr ""
-#: cups/file.c:247
#, c-format
msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
msgstr ""
-#: ppdc/sample.c:169
msgid "File Folder "
msgstr "Složka souborů "
-#: scheduler/ipp.c:2370
#, c-format
-msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgid ""
+"File device URIs have been disabled. To enable, see the FileDevice directive "
+"in \"%s/cups-files.conf\"."
msgstr ""
-#: filter/rastertoepson.c:1117 filter/rastertohp.c:845
-#: filter/rastertolabel.c:1273
#, c-format
msgid "Finished page %d."
msgstr ""
-#: ppdc/sample.c:125
msgid "Folio"
msgstr "Fólie"
-#: cups/http-support.c:1306
msgid "Forbidden"
msgstr "Zakázaný"
-#: cups/ppd.c:742 cups/ppd.c:1302
msgid "General"
msgstr "Obecný"
-#: ppdc/sample.c:259
msgid "Generic"
msgstr "Obecný"
-#: cups/snmp.c:1016
msgid "Get-Response-PDU uses indefinite length"
msgstr "\"Get-Response-PDU\" má neomezenou délku"
-#: ppdc/sample.c:290
msgid "Glossy Paper"
msgstr "Lesklý papír"
-#: scheduler/ipp.c:2952 scheduler/ipp.c:3352 scheduler/ipp.c:3890
-#: scheduler/ipp.c:6056 scheduler/ipp.c:6203 scheduler/ipp.c:7635
-#: scheduler/ipp.c:8753 scheduler/ipp.c:8979 scheduler/ipp.c:9328
-#: scheduler/ipp.c:9931
msgid "Got a printer-uri attribute but no job-id."
msgstr ""
-#: ppdc/sample.c:255
msgid "Grayscale"
msgstr "StupnÄ› Å¡edi"
-#: ppdc/sample.c:280
msgid "HP"
msgstr "HP"
-#: ppdc/sample.c:170
msgid "Hanging Folder"
msgstr "Závěsná složka"
-#: cgi-bin/help.c:143
msgid "Help file not in index."
msgstr ""
-#: cups/ipp.c:2687 cups/ipp.c:2714 cups/ipp.c:2737
msgid "IPP 1setOf attribute with incompatible value tags."
msgstr ""
-#: cups/ipp.c:2650
msgid "IPP attribute has no name."
msgstr ""
-#: cups/ipp.c:5487
msgid "IPP attribute is not a member of the message."
msgstr ""
-#: cups/ipp.c:3083
msgid "IPP begCollection value not 0 bytes."
msgstr ""
-#: cups/ipp.c:2873
msgid "IPP boolean value not 1 byte."
msgstr ""
-#: cups/ipp.c:2934
msgid "IPP date value not 11 bytes."
msgstr ""
-#: cups/ipp.c:3104
msgid "IPP endCollection value not 0 bytes."
msgstr ""
-#: cups/ipp.c:2848
msgid "IPP enum value not 4 bytes."
msgstr ""
-#: cups/ipp.c:2579
msgid "IPP extension tag larger than 0x7FFFFFFF."
msgstr ""
-#: cups/ipp.c:2845
msgid "IPP integer value not 4 bytes."
msgstr ""
-#: cups/ipp.c:3045
msgid "IPP language length overflows value."
msgstr ""
-#: cups/ipp.c:2764
+msgid "IPP language length too large."
+msgstr ""
+
msgid "IPP member name is not empty."
msgstr ""
-#: cups/ipp.c:3122
msgid "IPP memberName value is empty."
msgstr ""
-#: cups/ipp.c:2633
+msgid "IPP memberName with no attribute."
+msgstr ""
+
msgid "IPP name larger than 32767 bytes."
msgstr ""
-#: cups/ipp.c:3011
msgid "IPP nameWithLanguage value less than minimum 4 bytes."
msgstr ""
-#: cups/ipp.c:2979
+msgid "IPP octetString length too large."
+msgstr ""
+
msgid "IPP rangeOfInteger value not 8 bytes."
msgstr ""
-#: cups/ipp.c:2952
msgid "IPP resolution value not 9 bytes."
msgstr ""
-#: cups/ipp.c:3063
msgid "IPP string length overflows value."
msgstr ""
-#: cups/ipp.c:3007
msgid "IPP textWithLanguage value less than minimum 4 bytes."
msgstr ""
-#: cups/ipp.c:2831
msgid "IPP value larger than 32767 bytes."
msgstr ""
-#: ppdc/sample.c:1
msgid "ISOLatin1"
msgstr "ISOLatin1"
-#: cups/ppd.c:353
msgid "Illegal control character"
msgstr "Neplatný řídící znak"
-#: cups/ppd.c:354
msgid "Illegal main keyword string"
msgstr "Neplatné hlavní klíÄové slovo Å™etÄ›zce"
-#: cups/ppd.c:355
msgid "Illegal option keyword string"
msgstr "Neplatná volba klíÄového slova Å™etÄ›zce"
-#: cups/ppd.c:356
msgid "Illegal translation string"
msgstr "Neplatný překlad řetězce"
-#: cups/ppd.c:357
msgid "Illegal whitespace character"
msgstr "Nedovolený prázdný znak"
-#: ppdc/sample.c:274
msgid "Installable Options"
msgstr "Možnosti instalace"
-#: ppdc/sample.c:277
msgid "Installed"
msgstr "Instalovaný"
-#: ppdc/sample.c:293
msgid "IntelliBar Label Printer"
msgstr "Tiskárna štítků \"IntelliBar\""
-#: ppdc/sample.c:292
msgid "Intellitech"
msgstr "Intellitech"
-#: cups/http-support.c:1333
msgid "Internal Server Error"
msgstr ""
-#: cups/ppd.c:344
msgid "Internal error"
msgstr "Vniřní chyba"
-#: ppdc/sample.c:167
msgid "Internet Postage 2-Part"
msgstr "Internet Postage 2-Part"
-#: ppdc/sample.c:168
msgid "Internet Postage 3-Part"
msgstr "Internet Postage 3-Part"
-#: backend/ipp.c:307
msgid "Internet Printing Protocol"
msgstr "Internetový tiskový protokol"
-#: cups/dest-options.c:839
+msgid "Invalid media name arguments."
+msgstr ""
+
msgid "Invalid media size."
msgstr ""
-#: filter/commandtops.c:125
#, c-format
msgid "Invalid printer command \"%s\"."
msgstr ""
-#: cups/ppd.c:1420
msgid "JCL"
msgstr "JCL"
-#: ppdc/sample.c:53
msgid "JIS B0"
msgstr ""
-#: ppdc/sample.c:55
msgid "JIS B1"
msgstr ""
-#: ppdc/sample.c:54
msgid "JIS B10"
msgstr ""
-#: ppdc/sample.c:56
msgid "JIS B2"
msgstr ""
-#: ppdc/sample.c:57
msgid "JIS B3"
msgstr ""
-#: ppdc/sample.c:58
msgid "JIS B4"
msgstr ""
-#: ppdc/sample.c:59
msgid "JIS B4 Long Edge"
msgstr ""
-#: ppdc/sample.c:60
msgid "JIS B5"
msgstr ""
-#: ppdc/sample.c:61
msgid "JIS B5 Long Edge"
msgstr ""
-#: ppdc/sample.c:62
msgid "JIS B6"
msgstr ""
-#: ppdc/sample.c:63
msgid "JIS B6 Long Edge"
msgstr ""
-#: ppdc/sample.c:64
msgid "JIS B7"
msgstr ""
-#: ppdc/sample.c:65
msgid "JIS B8"
msgstr ""
-#: ppdc/sample.c:66
msgid "JIS B9"
msgstr ""
-#: scheduler/ipp.c:9051
#, c-format
msgid "Job #%d cannot be restarted - no files."
msgstr ""
-#: scheduler/ipp.c:2992 scheduler/ipp.c:3222 scheduler/ipp.c:3277
-#: scheduler/ipp.c:3454 scheduler/ipp.c:3900 scheduler/ipp.c:5720
-#: scheduler/ipp.c:6096 scheduler/ipp.c:6243 scheduler/ipp.c:6543
-#: scheduler/ipp.c:7482 scheduler/ipp.c:7504 scheduler/ipp.c:7676
-#: scheduler/ipp.c:7901 scheduler/ipp.c:7944 scheduler/ipp.c:8793
-#: scheduler/ipp.c:9019 scheduler/ipp.c:9368 scheduler/ipp.c:9971
#, c-format
msgid "Job #%d does not exist."
msgstr ""
-#: scheduler/ipp.c:3486
#, c-format
msgid "Job #%d is already aborted - can't cancel."
msgstr "Úloha #%d je již zrušena - nelze zrušit."
-#: scheduler/ipp.c:3480
#, c-format
msgid "Job #%d is already canceled - can't cancel."
msgstr "Úloha #%d je již zrušena - nelze zrušit."
-#: scheduler/ipp.c:3492
#, c-format
msgid "Job #%d is already completed - can't cancel."
msgstr "Úloha #%d je již dokonÄena - nelze zruÅ¡it."
-#: scheduler/ipp.c:7702 scheduler/ipp.c:7986 scheduler/ipp.c:9986
#, c-format
msgid "Job #%d is finished and cannot be altered."
msgstr ""
-#: scheduler/ipp.c:9033
#, c-format
msgid "Job #%d is not complete."
msgstr ""
-#: scheduler/ipp.c:3007
#, c-format
msgid "Job #%d is not held for authentication."
msgstr ""
-#: scheduler/ipp.c:8807
#, c-format
msgid "Job #%d is not held."
msgstr ""
-#: cgi-bin/ipp-var.c:1055
msgid "Job Completed"
msgstr "Úloha dokonÄena"
-#: cgi-bin/ipp-var.c:1053
msgid "Job Created"
msgstr "Úloha vytvořena"
-#: cgi-bin/ipp-var.c:1059
msgid "Job Options Changed"
msgstr "Změna parametrů úlohy"
-#: cgi-bin/ipp-var.c:1057
msgid "Job Stopped"
msgstr "Úloha zastavena"
-#: scheduler/ipp.c:10068
msgid "Job is completed and cannot be changed."
msgstr "Úloha je dokonÄena a nelze ji zmÄ›nit."
-#: cgi-bin/jobs.c:198
msgid "Job operation failed"
msgstr "Úloha se nezdařila"
-#: scheduler/ipp.c:10104 scheduler/ipp.c:10123 scheduler/ipp.c:10134
msgid "Job state cannot be changed."
msgstr "Stav úlohy nelze změnit."
-#: scheduler/ipp.c:8899
msgid "Job subscriptions cannot be renewed."
msgstr ""
-#: cgi-bin/jobs.c:103 cgi-bin/jobs.c:114 cgi-bin/jobs.c:195
msgid "Jobs"
msgstr "Úlohy"
-#: backend/lpd.c:185
msgid "LPD/LPR Host or Printer"
msgstr "LPD/LPR hostitel nebo tiskárna"
-#: ppdc/sample.c:230
msgid "Label Printer"
msgstr "Tiskárna štítků"
-#: ppdc/sample.c:446
msgid "Label Top"
msgstr "Horní štítek"
-#: scheduler/ipp.c:2070 scheduler/ipp.c:5643
#, c-format
msgid "Language \"%s\" not supported."
msgstr ""
-#: ppdc/sample.c:164
msgid "Large Address"
msgstr "Plná adresa"
-#: ppdc/sample.c:291
msgid "LaserJet Series PCL 4/5"
msgstr "LaserJet Serie PCL 4/5"
-#: ppdc/sample.c:43
msgid "Letter Oversize"
msgstr ""
-#: ppdc/sample.c:44
msgid "Letter Oversize Long Edge"
msgstr ""
-#: ppdc/sample.c:236
msgid "Light"
msgstr "Světlý"
-#: cups/ppd.c:352
msgid "Line longer than the maximum allowed (255 characters)"
msgstr "Řádek je delší než maximální povolená velikost (255 znaků)"
-#: cgi-bin/admin.c:2393
msgid "List Available Printers"
msgstr "Seznam dostupných tiskáren"
-#: ppdc/sample.c:272
+msgid "Load paper."
+msgstr ""
+
msgid "Long-Edge (Portrait)"
msgstr "Delší okraj (na výšku)"
-#: cups/http-support.c:1558
-msgid "Looking for printer."
+msgid "Looking for printer..."
msgstr ""
-#: ppdc/sample.c:268
msgid "Manual Feed"
msgstr "RuÄní podávání"
-#: cups/ppd.c:789 cups/ppd.c:1357
msgid "Media Size"
msgstr "Velikost média"
-#: cups/ppd.c:793 cups/ppd.c:1361 ppdc/sample.c:262
msgid "Media Source"
msgstr "Zdroj média"
-#: ppdc/sample.c:364
msgid "Media Tracking"
msgstr "Sledování média"
-#: cups/ppd.c:791 cups/ppd.c:1359 ppdc/sample.c:285
msgid "Media Type"
msgstr "Typ média"
-#: ppdc/sample.c:237
msgid "Medium"
msgstr "Střední"
-#: cups/ppd.c:341
msgid "Memory allocation error"
msgstr "Chyba přidělení paměti"
-#: cups/ppd.c:361
msgid "Missing CloseGroup"
msgstr ""
-#: cups/ppd.c:342
msgid "Missing PPD-Adobe-4.x header"
msgstr "Chybějící záhlaví PPD-Adobe-4.x"
-#: cups/ppd.c:351
msgid "Missing asterisk in column 1"
msgstr "Chybí hvÄ›zdiÄka ve sloupci 1"
-#: scheduler/ipp.c:6119
msgid "Missing document-number attribute."
msgstr ""
-#: cups/adminutil.c:273
#, c-format
msgid "Missing double quote on line %d."
msgstr ""
-#: cgi-bin/admin.c:736 cgi-bin/admin.c:2106 cgi-bin/admin.c:2191
-#: cgi-bin/admin.c:2785 cgi-bin/admin.c:3039 cgi-bin/admin.c:3150
-#: cgi-bin/admin.c:3860
msgid "Missing form variable"
msgstr ""
-#: scheduler/ipp.c:9422
msgid "Missing last-document attribute in request."
msgstr ""
-#: cups/pwg-media.c:535
msgid "Missing media or media-col."
msgstr ""
-#: cups/pwg-media.c:454
msgid "Missing media-size in media-col."
msgstr ""
-#: scheduler/ipp.c:6673
msgid "Missing notify-subscription-ids attribute."
msgstr ""
-#: cups/ppd.c:359
msgid "Missing option keyword"
msgstr ""
-#: scheduler/ipp.c:3133 scheduler/ipp.c:3158
msgid "Missing requesting-user-name attribute."
msgstr ""
-#: scheduler/ipp.c:461
msgid "Missing required attributes."
msgstr ""
-#: cups/adminutil.c:254
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
#, c-format
msgid "Missing value on line %d."
msgstr ""
-#: cups/ppd.c:343
msgid "Missing value string"
msgstr "Chybí hodnota řetězce"
-#: cups/pwg-media.c:442
msgid "Missing x-dimension in media-size."
msgstr ""
-#: cups/pwg-media.c:448
msgid "Missing y-dimension in media-size."
msgstr ""
-#: systemv/lpinfo.c:470
#, c-format
msgid ""
"Model: name = %s\n"
@@ -3989,1520 +3532,1181 @@ msgid ""
" device-id = %s"
msgstr ""
-#: cgi-bin/admin.c:570
+msgid "Modifiers:"
+msgstr ""
+
msgid "Modify Class"
msgstr "Úprava třídy"
-#: cgi-bin/admin.c:882
msgid "Modify Printer"
msgstr "Úprava tiskárny"
-#: cgi-bin/ipp-var.c:425 cgi-bin/ipp-var.c:516
msgid "Move All Jobs"
msgstr "Přesun všech úloh"
-#: cgi-bin/ipp-var.c:364 cgi-bin/ipp-var.c:423 cgi-bin/ipp-var.c:514
msgid "Move Job"
msgstr "Přesun úlohy"
-#: cups/http-support.c:1290
msgid "Moved Permanently"
msgstr "Trvale přesunuto"
-#: cups/ppd.c:340
msgid "NULL PPD file pointer"
msgstr "Prázdný ukazatel PPD souboru"
-#: cups/snmp.c:1053
msgid "Name OID uses indefinite length"
msgstr "Název \"OID\" má neomezenou délku"
-#: scheduler/ipp.c:1142
msgid "Nested classes are not allowed."
msgstr ""
-#: ppdc/sample.c:430
msgid "Never"
msgstr "Nikdy"
-#: ppdc/sample.c:256
-msgid "New Stylus Color Series"
-msgstr "New Stylus Color Series"
-
-#: ppdc/sample.c:258
-msgid "New Stylus Photo Series"
-msgstr "New Stylus Photo Series"
-
-#: cups/ppd.c:1949
msgid "No"
msgstr "Ne"
-#: cups/http-support.c:1287
msgid "No Content"
msgstr "Žádný obsah"
-#: cups/util.c:1298
msgid "No PPD name"
msgstr ""
-#: cups/snmp.c:1047
msgid "No VarBind SEQUENCE"
msgstr "Žádná VarBind SEQUENCE"
-#: cups/adminutil.c:788
msgid "No Windows printer drivers are installed."
msgstr ""
-#: cups/request.c:566 cups/request.c:908
msgid "No active connection"
msgstr "Není aktivní spojení"
-#: scheduler/ipp.c:3403
+msgid "No active connection."
+msgstr ""
+
#, c-format
msgid "No active jobs on %s."
msgstr ""
-#: scheduler/ipp.c:302
msgid "No attributes in request."
msgstr ""
-#: scheduler/ipp.c:3034
msgid "No authentication information provided."
msgstr ""
-#: cups/snmp.c:1004
msgid "No community name"
msgstr "Žádný název komunity"
-#: scheduler/ipp.c:5919
msgid "No default printer."
msgstr ""
-#: cgi-bin/ipp-var.c:436 scheduler/ipp.c:7248
msgid "No destinations added."
msgstr "Zařízení nepřidáno."
-#: backend/usb.c:200
msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
msgstr ""
-#: cups/snmp.c:1034
msgid "No error-index"
msgstr "Žádný \"error-index\""
-#: cups/snmp.c:1026
msgid "No error-status"
msgstr "Žádný \"error-status\""
-#: scheduler/ipp.c:8190 scheduler/ipp.c:9436
msgid "No file in print request."
msgstr ""
-#: cups/util.c:923
msgid "No modification time"
msgstr ""
-#: cups/snmp.c:1051
msgid "No name OID"
msgstr "Žádný název OID"
-#: filter/rastertoepson.c:1147 filter/rastertohp.c:876
-#: filter/rastertolabel.c:1302
msgid "No pages were found."
msgstr ""
-#: cups/util.c:917
msgid "No printer name"
msgstr ""
-#: cups/util.c:1801
msgid "No printer-uri found"
msgstr ""
-#: cups/util.c:1786
msgid "No printer-uri found for class"
msgstr ""
-#: scheduler/ipp.c:6322
msgid "No printer-uri in request."
msgstr ""
-#: cups/snmp.c:1018
+msgid "No request URI."
+msgstr ""
+
+msgid "No request protocol version."
+msgstr ""
+
+msgid "No request sent."
+msgstr ""
+
msgid "No request-id"
msgstr "Žádný ID požadavek"
-#: scheduler/ipp.c:5528
msgid "No subscription attributes in request."
msgstr ""
-#: scheduler/ipp.c:7575
msgid "No subscriptions found."
msgstr "Nenalezeno předplatné."
-#: cups/snmp.c:1042
msgid "No variable-bindings SEQUENCE"
msgstr "Žádná \"variable-bindings\" SEQUENCE"
-#: cups/snmp.c:997
msgid "No version number"
msgstr "Není Äíslo verze"
-#: ppdc/sample.c:367
msgid "Non-continuous (Mark sensing)"
msgstr "Není souvislý (Mark Sensing)"
-#: ppdc/sample.c:366
msgid "Non-continuous (Web sensing)"
msgstr "Není souvislý (Web Sensing)"
-#: ppdc/sample.c:238
msgid "Normal"
msgstr "Normální"
-#: cups/http-support.c:1309
msgid "Not Found"
msgstr "Nebyl nalezen"
-#: cups/http-support.c:1321
msgid "Not Implemented"
msgstr "Nerealizováno"
-#: ppdc/sample.c:276
msgid "Not Installed"
msgstr "Nenainstalováno"
-#: cups/http-support.c:1296
msgid "Not Modified"
msgstr "Nezměněno"
-#: cups/http-support.c:1324
msgid "Not Supported"
msgstr "Nepodporováno"
-#: scheduler/ipp.c:1518 scheduler/ipp.c:10666
msgid "Not allowed to print."
msgstr "Není povoleno tisknout."
-#: ppdc/sample.c:146
msgid "Note"
msgstr "Poznámka"
-#: systemv/cupstestdsc.c:433
-msgid "Note: this program only validates the DSC comments, not the PostScript itself."
+msgid ""
+"Note: this program only validates the DSC comments, not the PostScript "
+"itself."
msgstr ""
-#: cups/http-support.c:1278 cups/ppd.c:338
msgid "OK"
msgstr "OK"
-#: ppdc/sample.c:271
msgid "Off (1-Sided)"
msgstr "Vypnuto (jednostranný)"
-#: ppdc/sample.c:361
msgid "Oki"
msgstr "Oki"
-#: cgi-bin/help.c:91 cgi-bin/help.c:132 cgi-bin/help.c:142 cgi-bin/help.c:172
msgid "Online Help"
msgstr "Nápověda"
-#: cups/adminutil.c:955
#, c-format
msgid "Open of %s failed: %s"
msgstr "Otevření %s selhalo: %s"
-#: cups/ppd.c:346
msgid "OpenGroup without a CloseGroup first"
msgstr "Opengroup nepředcházelo CloseGroup"
-#: cups/ppd.c:348
msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
msgstr "OpenUI/JCLOpenUI nepředcházelo CloseUI/JCLCloseUI"
-#: cgi-bin/admin.c:3631
msgid "Operation Policy"
msgstr "Způsob ověření"
-#: filter/pstops.c:2205
#, c-format
msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
msgstr ""
-#: cgi-bin/admin.c:3281 cgi-bin/admin.c:3365
msgid "Options Installed"
msgstr "Instalované možnosti"
-#: scheduler/cupsfilter.c:1430 scheduler/main.c:2018 systemv/cupsaddsmb.c:284
-#: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3797
-#: test/ipptool.c:4403 ppdc/ppdc.cxx:437 ppdc/ppdhtml.cxx:174
-#: ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:369 ppdc/ppdpo.cxx:254
msgid "Options:"
msgstr ""
-#: cups/ppd-cache.c:156
msgid "Out of date PPD cache file."
msgstr ""
-#: cups/ppd-cache.c:1381
msgid "Out of memory."
msgstr ""
-#: cups/ppd.c:795 cups/ppd.c:1363
msgid "Output Mode"
msgstr "Výstupní režim"
-#: systemv/lpstat.c:1191 systemv/lpstat.c:1195
-#, c-format
-msgid "Output for printer %s is sent to %s"
+msgid "Output bin is almost full."
msgstr ""
-#: systemv/lpstat.c:1185
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
+msgid "Output bin is full."
msgstr ""
-#: systemv/lpstat.c:1209 systemv/lpstat.c:1213
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr ""
-
-#: systemv/lpstat.c:1203
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+msgid "Output bin is missing."
msgstr ""
-#: systemv/cupstestdsc.c:399
msgid "PASS"
msgstr ""
-#: ppdc/sample.c:260
msgid "PCL Laser Printer"
msgstr "PCL laserová tiskárna"
-#: ppdc/sample.c:149
msgid "PRC16K"
msgstr "PRC16K"
-#: ppdc/sample.c:150
msgid "PRC16K Long Edge"
msgstr ""
-#: ppdc/sample.c:151
msgid "PRC32K"
msgstr "PRC32K"
-#: ppdc/sample.c:154
msgid "PRC32K Long Edge"
msgstr ""
-#: ppdc/sample.c:152
msgid "PRC32K Oversize"
msgstr ""
-#: ppdc/sample.c:153
msgid "PRC32K Oversize Long Edge"
msgstr ""
-#: cups/snmp.c:1014
msgid "Packet does not contain a Get-Response-PDU"
msgstr "Packet neobsahuje \"Get-Response-PDU\""
-#: cups/snmp.c:993
msgid "Packet does not start with SEQUENCE"
msgstr "Paket nezaÄíná SEQUENCÃ"
-#: ppdc/sample.c:360
+msgid "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
-#: ppdc/sample.c:358
msgid "ParamCustominTearInterval"
msgstr "ParamCustominTearInterval"
-#: cups/auth.c:199 cups/auth.c:367
#, c-format
msgid "Password for %s on %s? "
msgstr "Heslo pro %s na %s? "
-#: systemv/cupsaddsmb.c:252
#, c-format
msgid "Password for %s required to access %s via SAMBA: "
msgstr "Heslo pro %s je vyžadováno pro přístup k %s přes Sambu: "
-#: cgi-bin/classes.c:167
msgid "Pause Class"
msgstr "Pozastavení třídy"
-#: cgi-bin/printers.c:170
msgid "Pause Printer"
msgstr "Pozastavení tiskárny"
-#: ppdc/sample.c:448
msgid "Peel-Off"
msgstr "Peel-Off"
-#: ppdc/sample.c:160
msgid "Photo"
msgstr "Fotografie"
-#: ppdc/sample.c:161
msgid "Photo Labels"
msgstr "Foto-samolepky"
-#: ppdc/sample.c:286
msgid "Plain Paper"
msgstr "ObyÄejný papír"
-#: cgi-bin/admin.c:3299 cgi-bin/admin.c:3580
msgid "Policies"
msgstr "Pravidla"
-#: cgi-bin/admin.c:3306 cgi-bin/admin.c:3649 cgi-bin/admin.c:3662
msgid "Port Monitor"
msgstr "Monitorování portu"
-#: ppdc/sample.c:278
msgid "PostScript Printer"
msgstr "PostScriptová tiskárna"
-#: ppdc/sample.c:147
msgid "Postcard"
msgstr "Pohlednice"
-#: ppdc/sample.c:71
msgid "Postcard Double "
msgstr ""
-#: ppdc/sample.c:72
msgid "Postcard Double Long Edge"
msgstr ""
-#: ppdc/sample.c:148
msgid "Postcard Long Edge"
msgstr ""
-#: ppdc/sample.c:295
+msgid "Preparing to print."
+msgstr ""
+
msgid "Print Density"
msgstr "Hustota tisku"
-#: cups/notify.c:82
msgid "Print Job:"
msgstr "Tisk úlohy:"
-#: ppdc/sample.c:340
msgid "Print Mode"
msgstr "Režim tisku"
-#: ppdc/sample.c:383
msgid "Print Rate"
msgstr "Kvalita tisku"
-#: cgi-bin/printers.c:179
msgid "Print Self-Test Page"
msgstr "Tisk \"self-test\" stránky"
-#: ppdc/sample.c:327
msgid "Print Speed"
msgstr "Rychlost tisku"
-#: cgi-bin/ipp-var.c:792
msgid "Print Test Page"
msgstr "Tisk zkušební stránky"
-#: ppdc/sample.c:356
msgid "Print and Cut"
msgstr "Tisk a vyjmout"
-#: ppdc/sample.c:344
msgid "Print and Tear"
msgstr "Tisk a odtrhnout"
-#: backend/ipp.c:1537
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-#: backend/ipp.c:1527
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
-#: backend/socket.c:424 backend/usb-unix.c:191
msgid "Print file sent."
msgstr ""
-#: backend/ipp.c:1488
-msgid "Print file was not accepted."
-msgstr ""
-
-#: backend/ipp.c:1895
msgid "Print job canceled at printer."
msgstr ""
-#: backend/ipp.c:1890
msgid "Print job too large."
msgstr ""
-#: cgi-bin/ipp-var.c:1047
+msgid "Print job was not accepted."
+msgstr ""
+
msgid "Printer Added"
msgstr "Tiskárna přidána"
-#: ppdc/sample.c:263
msgid "Printer Default"
msgstr "Výchozí tiskárna"
-#: cgi-bin/ipp-var.c:1051
msgid "Printer Deleted"
msgstr "Tiskárna vymazána"
-#: cgi-bin/ipp-var.c:1049
msgid "Printer Modified"
msgstr "Tiskárna upravena"
-#: cgi-bin/ipp-var.c:1045
msgid "Printer Paused"
msgstr "Tiskárna zastavena"
-#: ppdc/sample.c:294
msgid "Printer Settings"
msgstr "Nastavení tiskárny"
-#: backend/ipp.c:1893
msgid "Printer cannot print supplied content."
msgstr ""
-#: cups/notify.c:126
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
msgid "Printer:"
msgstr "Tiskárna:"
-#: cgi-bin/printers.c:204 cgi-bin/printers.c:332
msgid "Printers"
msgstr "Tiskárny"
-#: filter/rastertoepson.c:1093 filter/rastertohp.c:817
-#: filter/rastertolabel.c:1249
#, c-format
-msgid "Printing page %d, %d%% complete."
+msgid "Printing page %d, %u%% complete."
msgstr ""
-#: cgi-bin/classes.c:173 cgi-bin/printers.c:176
-msgid "Purge Jobs"
-msgstr "Výmaz úloh"
-
-#: ppdc/sample.c:155
msgid "Quarto"
msgstr "Quarto"
-#: scheduler/ipp.c:1513 scheduler/ipp.c:10661
msgid "Quota limit reached."
msgstr "Kvóta byla pÅ™ekroÄena."
-#: berkeley/lpq.c:515
msgid "Rank Owner Job File(s) Total Size"
msgstr ""
-#. TRANSLATORS: Pri is job priority.
-#: berkeley/lpq.c:511
-msgid "Rank Owner Pri Job Files Total Size"
-msgstr ""
-
-#: cgi-bin/classes.c:171 cgi-bin/printers.c:174
msgid "Reject Jobs"
msgstr "Odmítnutí úloh"
-#: backend/lpd.c:1016 backend/lpd.c:1148
#, c-format
msgid "Remote host did not accept control file (%d)."
msgstr ""
-#: backend/lpd.c:1101
#, c-format
msgid "Remote host did not accept data file (%d)."
msgstr ""
-#: ppdc/sample.c:428
msgid "Reprint After Error"
msgstr "Opakovat tisk po chybÄ›"
-#: cups/http-support.c:1312
msgid "Request Entity Too Large"
msgstr "Dotaz Entity je příliš dlouhý"
-#: cups/ppd.c:797 cups/ppd.c:1365 ppdc/sample.c:231
msgid "Resolution"
msgstr "Rozlišení"
-#: cgi-bin/classes.c:165
msgid "Resume Class"
msgstr "Obnovení třídy"
-#: cgi-bin/printers.c:167
msgid "Resume Printer"
msgstr "Obnovení tiskárny"
-#: ppdc/sample.c:165
msgid "Return Address"
msgstr "Návrat adresy"
-#: ppdc/sample.c:449
msgid "Rewind"
msgstr "PÅ™etoÄit"
-#: cups/adminutil.c:2052
#, c-format
msgid "Running command: %s %s -N -A %s -c '%s'"
msgstr ""
-#: cups/snmp.c:995
msgid "SEQUENCE uses indefinite length"
msgstr "\"SEQUENCE\" má neomezenou délku"
-#: cups/http-support.c:1336
msgid "SSL/TLS Negotiation Error"
msgstr ""
-#: cups/http-support.c:1293
msgid "See Other"
msgstr "Viz další"
-#: backend/usb-darwin.c:543 backend/usb-libusb.c:273
msgid "Sending data to printer."
msgstr ""
-#: cgi-bin/ipp-var.c:1061
msgid "Server Restarted"
msgstr "Restart serveru"
-#: cgi-bin/ipp-var.c:1067
msgid "Server Security Auditing"
msgstr "Audit bezpeÄnosti serveru"
-#: cgi-bin/ipp-var.c:1063
msgid "Server Started"
msgstr "Start serveru"
-#: cgi-bin/ipp-var.c:1065
msgid "Server Stopped"
msgstr "Zastavení serveru"
-#: cups/http-support.c:1330
+msgid "Server credentials not set."
+msgstr ""
+
msgid "Service Unavailable"
msgstr "Služba je nedostupná"
-#: cgi-bin/admin.c:2786 cgi-bin/admin.c:2832 cgi-bin/admin.c:2989
-#: cgi-bin/admin.c:3008
msgid "Set Allowed Users"
msgstr "Nastavení přístupu uživatelů"
-#: cgi-bin/admin.c:3035
msgid "Set As Server Default"
msgstr "Nastavení jako výchozí na serveru"
-#: cgi-bin/admin.c:3135
msgid "Set Class Options"
msgstr "Nastavení parametrů třídy"
-#: cgi-bin/admin.c:3135 cgi-bin/admin.c:3309 cgi-bin/admin.c:3691
msgid "Set Printer Options"
msgstr "Nastavení parametrů tiskárny"
-#: cgi-bin/admin.c:3861 cgi-bin/admin.c:3905 cgi-bin/admin.c:3923
msgid "Set Publishing"
msgstr "Nastavení vydávání"
-#: ppdc/sample.c:166
msgid "Shipping Address"
msgstr "DoruÄovací adresa"
-#: ppdc/sample.c:273
msgid "Short-Edge (Landscape)"
msgstr "Kratší okraj (na šířku)"
-#: ppdc/sample.c:288
msgid "Special Paper"
msgstr "Speciální papír"
-#: backend/lpd.c:1057
#, c-format
msgid "Spooling job, %.0f%% complete."
msgstr ""
-#: ppdc/sample.c:341
msgid "Standard"
msgstr "Standardní"
#. TRANSLATORS: Banner/cover sheet before the print job.
-#: cgi-bin/admin.c:3552
msgid "Starting Banner"
msgstr "Spuštění baneru"
-#: filter/rastertoepson.c:1069 filter/rastertohp.c:793
-#: filter/rastertolabel.c:1225
#, c-format
msgid "Starting page %d."
msgstr ""
-#: ppdc/sample.c:156
msgid "Statement"
msgstr "Prohlášení"
-#: ppdc/sample.c:251
-msgid "Stylus Color Series"
-msgstr "Stylus Color Series"
-
-#: ppdc/sample.c:257
-msgid "Stylus Photo Series"
-msgstr "Stylus Photo Series"
-
-#: scheduler/ipp.c:3549 scheduler/ipp.c:6689 scheduler/ipp.c:7388
-#: scheduler/ipp.c:8887
#, c-format
msgid "Subscription #%d does not exist."
msgstr ""
-#: ppdc/sample.c:157
+msgid "Substitutions:"
+msgstr ""
+
msgid "Super A"
msgstr "Super A"
-#: ppdc/sample.c:158
msgid "Super B"
msgstr "Super B"
-#: ppdc/sample.c:162
msgid "Super B/A3"
msgstr "Super B/A3"
-#: cups/http-support.c:1275
msgid "Switching Protocols"
msgstr "Protokol výměny"
-#: ppdc/sample.c:159
msgid "Tabloid"
msgstr "Tabloid"
-#: ppdc/sample.c:45
msgid "Tabloid Oversize"
msgstr ""
-#: ppdc/sample.c:46
msgid "Tabloid Oversize Long Edge"
msgstr ""
-#: ppdc/sample.c:342
msgid "Tear"
msgstr "Odtrhnout"
-#: ppdc/sample.c:447
msgid "Tear-Off"
msgstr "Odtrhnout"
-#: ppdc/sample.c:388
msgid "Tear-Off Adjust Position"
msgstr "Nastavení pozice odtržení"
-#: scheduler/ipp.c:6393 scheduler/ipp.c:6471 scheduler/ipp.c:6487
-#: scheduler/ipp.c:6505
+#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr ""
+
#, c-format
msgid "The %s attribute cannot be provided with job-ids."
msgstr ""
-#: scheduler/ipp.c:5118
#, c-format
-msgid "The '%s' operation attribute cannot be supplied in a Create-Job request."
+msgid ""
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
+msgstr ""
+
+#, c-format
+msgid ""
+"The '%s' operation attribute cannot be supplied in a Create-Job request."
msgstr ""
-#: scheduler/ipp.c:6919
#, c-format
msgid "The PPD file \"%s\" could not be found."
msgstr "Soubor PPD \"%s\" nelze nalézt."
-#: scheduler/ipp.c:6906
#, c-format
msgid "The PPD file \"%s\" could not be opened: %s"
msgstr "Soubor PPD \"%s\" nelze otevřít: %s"
-#: filter/rastertoepson.c:1038 filter/rastertohp.c:764
-#: filter/rastertolabel.c:1189
msgid "The PPD file could not be opened."
msgstr ""
-#: cgi-bin/admin.c:749
-msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "Název třídy může obsahovat až 127 tisknutelných znaků a nesmí obsahovat mezery, lomítka (/), nebo křížek (#)."
+msgid ""
+"The class name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Název třídy může obsahovat až 127 tisknutelných znaků a nesmí obsahovat "
+"mezery, lomítka (/), nebo křížek (#)."
-#: cups/localize.c:353
msgid "The developer unit needs to be replaced."
msgstr ""
-#: cups/localize.c:351
msgid "The developer unit will need to be replaced soon."
msgstr ""
-#: cups/localize.c:343
msgid "The fuser's temperature is high."
msgstr ""
-#: cups/localize.c:345
msgid "The fuser's temperature is low."
msgstr ""
-#: scheduler/ipp.c:2097
-msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+msgid ""
+"The notify-lease-duration attribute cannot be used with job subscriptions."
msgstr "Atribut \"notify-lease-duration\" nelze použít s přihlášenou úlohou."
-#: scheduler/ipp.c:2080 scheduler/ipp.c:5653
#, c-format
msgid "The notify-user-data value is too large (%d > 63 octets)."
msgstr ""
-#: cups/localize.c:349
msgid "The optical photoconductor needs to be replaced."
msgstr ""
-#: cups/localize.c:347
msgid "The optical photoconductor will need to be replaced soon."
msgstr ""
-#: cups/localize.c:331
-msgid "The output bin is almost full."
-msgstr ""
-
-#: cups/localize.c:333
-msgid "The output bin is full."
-msgstr ""
-
-#: cups/localize.c:329
-msgid "The output bin is missing."
+msgid "The printer configuration is incorrect or the printer no longer exists."
msgstr ""
-#: cups/localize.c:325
-msgid "The paper tray is almost empty."
-msgstr ""
-
-#: cups/localize.c:327
-msgid "The paper tray is empty."
-msgstr ""
-
-#: cups/localize.c:323
-msgid "The paper tray is missing."
-msgstr ""
-
-#: cups/localize.c:306
-msgid "The paper tray needs to be filled."
-msgstr ""
-
-#: backend/ipp.c:909
-msgid "The printer URI is incorrect or no longer exists."
+msgid "The printer did not respond."
msgstr ""
-#: backend/lpd.c:619 backend/lpd.c:1009 backend/lpd.c:1091 backend/lpd.c:1141
-msgid "The printer did not respond."
+msgid "The printer is in use."
msgstr ""
-#: backend/ipp.c:892 backend/ipp.c:899
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+msgid "The printer is low on ink."
msgstr ""
-#: backend/ipp.c:757 backend/ipp.c:874 backend/ipp.c:980 backend/ipp.c:1313
-#: backend/ipp.c:1464 backend/lpd.c:828 backend/socket.c:374
-#: backend/usb-unix.c:131 backend/usb-unix.c:424 backend/usb-unix.c:507
-msgid "The printer is in use."
+msgid "The printer is low on toner."
msgstr ""
-#: backend/runloop.c:254 backend/runloop.c:374 cups/localize.c:311
msgid "The printer is not connected."
msgstr ""
-#: backend/ipp.c:735 backend/ipp.c:768 backend/ipp.c:870 backend/lpd.c:807
-#: backend/lpd.c:848 backend/socket.c:353 backend/socket.c:386
msgid "The printer is not responding."
msgstr ""
-#: backend/runloop.c:396
msgid "The printer is now connected."
msgstr ""
-#: backend/usb-darwin.c:1286
msgid "The printer is now online."
msgstr ""
-#: backend/usb-darwin.c:1307
msgid "The printer is offline."
msgstr ""
-#: cups/localize.c:335
-msgid "The printer is running low on ink."
-msgstr ""
-
-#: cups/localize.c:313
-msgid "The printer is running low on toner."
-msgstr ""
-
-#: backend/ipp.c:750 backend/lpd.c:821 backend/socket.c:367
msgid "The printer is unreachable at this time."
msgstr ""
-#: cups/localize.c:337
msgid "The printer may be out of ink."
msgstr ""
-#: cups/localize.c:315
msgid "The printer may be out of toner."
msgstr ""
-#: backend/ipp.c:744 backend/lpd.c:815 backend/socket.c:361
msgid "The printer may not exist or is unavailable at this time."
msgstr ""
-#: cgi-bin/admin.c:931
-msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "Název tiskárny může obsahovat až 127 tisknutelných znaků a nesmí obsahovat mezery, lomítka (/), nebo křížek (#)."
+msgid ""
+"The printer name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Název tiskárny může obsahovat až 127 tisknutelných znaků a nesmí obsahovat "
+"mezery, lomítka (/), nebo křížek (#)."
-#: scheduler/ipp.c:876 scheduler/ipp.c:1136 scheduler/ipp.c:3198
-#: scheduler/ipp.c:3369 scheduler/ipp.c:5101 scheduler/ipp.c:5487
-#: scheduler/ipp.c:5801 scheduler/ipp.c:6359 scheduler/ipp.c:7124
-#: scheduler/ipp.c:7180 scheduler/ipp.c:7494 scheduler/ipp.c:7760
-#: scheduler/ipp.c:7849 scheduler/ipp.c:7882 scheduler/ipp.c:8205
-#: scheduler/ipp.c:8598 scheduler/ipp.c:8679 scheduler/ipp.c:9840
-#: scheduler/ipp.c:10294 scheduler/ipp.c:10624 scheduler/ipp.c:10706
-#: scheduler/ipp.c:10998
msgid "The printer or class does not exist."
msgstr ""
-#: scheduler/ipp.c:1304
msgid "The printer or class is not shared."
msgstr ""
-#: cups/localize.c:317
msgid "The printer's cover is open."
msgstr ""
-#: cups/localize.c:321
msgid "The printer's door is open."
msgstr ""
-#: cups/localize.c:319
msgid "The printer's interlock is open."
msgstr ""
-#: cups/localize.c:339
msgid "The printer's waste bin is almost full."
msgstr ""
-#: cups/localize.c:341
msgid "The printer's waste bin is full."
msgstr ""
-#: scheduler/ipp.c:982 scheduler/ipp.c:2261
#, c-format
msgid "The printer-uri \"%s\" contains invalid characters."
msgstr "Tiskárna-URI \"%s\" obsahuje neplatné znaky."
-#: scheduler/ipp.c:3175
msgid "The printer-uri attribute is required."
msgstr ""
-#: scheduler/ipp.c:966
-msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgid ""
+"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
msgstr "Tiskárna-URI musí být ve tvaru \"ipp://HOSTNAME/classes/CLASSNAME\"."
-#: scheduler/ipp.c:2245
-msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
-msgstr "Tiskárna-URI musí být ve tvaru \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgid ""
+"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr ""
+"Tiskárna-URI musí být ve tvaru \"ipp://HOSTNAME/printers/PRINTERNAME\"."
-#: cgi-bin/admin.c:474
-msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
-msgstr "Název předplatného nesmí obsahovat mezery, lomítka (/), otazník (?), nebo křížek (#)."
+msgid ""
+"The subscription name may not contain spaces, slashes (/), question marks "
+"(?), or the pound sign (#)."
+msgstr ""
+"Název předplatného nesmí obsahovat mezery, lomítka (/), otazník (?), nebo "
+"křížek (#)."
-#: scheduler/client.c:2450
-msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it."
+msgid ""
+"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
+"enable it."
msgstr ""
-#: scheduler/ipp.c:6454
#, c-format
msgid "The which-jobs value \"%s\" is not supported."
msgstr ""
-#: scheduler/ipp.c:5731
msgid "There are too many subscriptions."
msgstr "Existuje příliš mnoho předplatných."
-#: cups/localize.c:308
-msgid "There is a paper jam."
-msgstr ""
-
-#: backend/usb-darwin.c:379 backend/usb-darwin.c:438 backend/usb-darwin.c:505
-#: backend/usb-darwin.c:526 backend/usb-libusb.c:235 backend/usb-libusb.c:256
msgid "There was an unrecoverable USB error."
msgstr ""
-#: ppdc/sample.c:435
msgid "Thermal Transfer Media"
msgstr "Termální tisková média"
-#: scheduler/ipp.c:1507
msgid "Too many active jobs."
msgstr "Příliš mnoho aktivních úloh."
-#: scheduler/ipp.c:1401
#, c-format
msgid "Too many job-sheets values (%d > 2)."
msgstr ""
-#: scheduler/ipp.c:2529
#, c-format
msgid "Too many printer-state-reasons values (%d > %d)."
msgstr ""
-#: ppdc/sample.c:289
msgid "Transparency"
msgstr "Průhlednost"
-#: ppdc/sample.c:284
msgid "Tray"
msgstr "PodavaÄ"
-#: ppdc/sample.c:264
msgid "Tray 1"
msgstr "PodavaÄ 1"
-#: ppdc/sample.c:265
msgid "Tray 2"
msgstr "PodavaÄ 2"
-#: ppdc/sample.c:266
msgid "Tray 3"
msgstr "PodavaÄ 3"
-#: ppdc/sample.c:267
msgid "Tray 4"
msgstr "PodavaÄ 4"
-#: cups/http-support.c:1315
msgid "URI Too Long"
msgstr "URI je příliš dlouhá"
-#: ppdc/sample.c:138
+msgid "URI too large"
+msgstr ""
+
msgid "US Ledger"
msgstr "US Ledger"
-#: ppdc/sample.c:139
msgid "US Legal"
msgstr "US Legal"
-#: ppdc/sample.c:140
msgid "US Legal Oversize"
msgstr ""
-#: ppdc/sample.c:141
msgid "US Letter"
msgstr "US Letter"
-#: ppdc/sample.c:142
msgid "US Letter Long Edge"
msgstr ""
-#: ppdc/sample.c:143
msgid "US Letter Oversize"
msgstr ""
-#: ppdc/sample.c:144
msgid "US Letter Oversize Long Edge"
msgstr ""
-#: ppdc/sample.c:145
msgid "US Letter Small"
msgstr ""
-#: cgi-bin/admin.c:1959 cgi-bin/admin.c:1972 cgi-bin/admin.c:1996
msgid "Unable to access cupsd.conf file"
msgstr "Nelze získat přístup k souboru \"cupsd.conf\""
-#: cgi-bin/help.c:133
msgid "Unable to access help file."
msgstr ""
-#: cgi-bin/admin.c:526
msgid "Unable to add RSS subscription"
msgstr "Nelze přidat RSS předplatné"
-#: cgi-bin/admin.c:814
msgid "Unable to add class"
msgstr "Nelze přidat třídu"
-#: backend/ipp.c:1635
msgid "Unable to add document to print job."
msgstr ""
-#: scheduler/ipp.c:1548
#, c-format
msgid "Unable to add job for destination \"%s\"."
msgstr ""
-#: cgi-bin/admin.c:1059 cgi-bin/admin.c:1419
msgid "Unable to add printer"
msgstr "Nelze přidat tiskárnu"
-#: scheduler/ipp.c:1246
msgid "Unable to allocate memory for file types."
msgstr ""
-#: filter/pstops.c:451
msgid "Unable to allocate memory for page info"
msgstr ""
-#: filter/pstops.c:445
msgid "Unable to allocate memory for pages array"
msgstr ""
-#: cgi-bin/admin.c:1525
msgid "Unable to cancel RSS subscription"
msgstr "Nelze zrušit RSS předplatné"
-#: backend/ipp.c:1942
msgid "Unable to cancel print job."
msgstr ""
-#: cgi-bin/admin.c:2990
msgid "Unable to change printer"
msgstr "Nelze změnit tiskárnu"
-#: cgi-bin/admin.c:3906
msgid "Unable to change printer-is-shared attribute"
msgstr "Nelze změnit atribut \"sdílení tiskárny\""
-#: cgi-bin/admin.c:1657 cgi-bin/admin.c:1799
msgid "Unable to change server settings"
msgstr "Nelze změnit nastavení serveru"
-#: filter/commandtops.c:420
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr ""
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
msgid "Unable to configure printer options."
msgstr ""
-#: cups/adminutil.c:911 cups/request.c:1016
msgid "Unable to connect to host."
msgstr "Nelze se připojit k hostiteli."
-#: backend/ipp.c:713 backend/ipp.c:1138 backend/lpd.c:787 backend/socket.c:333
-#: backend/usb-unix.c:117
msgid "Unable to contact printer, queuing on next printer in class."
msgstr ""
-#: cups/adminutil.c:726
#, c-format
msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:691
#, c-format
msgid "Unable to copy 64-bit Windows printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:522
#, c-format
msgid "Unable to copy CUPS printer driver files (%d)."
msgstr ""
-#: scheduler/ipp.c:2649
#, c-format
msgid "Unable to copy PPD file - %s"
msgstr ""
-#: scheduler/ipp.c:2704
msgid "Unable to copy PPD file."
msgstr ""
-#: cups/adminutil.c:487
#, c-format
msgid "Unable to copy Windows 2000 printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:610
#, c-format
msgid "Unable to copy Windows 9x printer driver files (%d)."
msgstr ""
-#: scheduler/ipp.c:2626
#, c-format
msgid "Unable to copy interface script - %s"
msgstr ""
-#: backend/ipp.c:2034
-msgid "Unable to create compressed print file"
+msgid "Unable to create printer-uri"
msgstr ""
-#: cups/util.c:602 cups/util.c:1656
-msgid "Unable to create printer-uri"
+msgid "Unable to create server credentials."
msgstr ""
-#: cgi-bin/admin.c:1850 cgi-bin/admin.c:1862 scheduler/cupsfilter.c:1236
msgid "Unable to create temporary file"
msgstr ""
-#: cgi-bin/admin.c:2153
msgid "Unable to delete class"
msgstr "Nelze vymazat třídu"
-#: cgi-bin/admin.c:2238
msgid "Unable to delete printer"
msgstr "Nelze vymazat tiskárnu"
-#: cgi-bin/classes.c:260 cgi-bin/printers.c:269
msgid "Unable to do maintenance command"
msgstr "Nelze provést příkaz údržby"
-#: cgi-bin/admin.c:1974
msgid "Unable to edit cupsd.conf files larger than 1MB"
msgstr ""
-#: cups/http.c:4272
-msgid "Unable to establish a secure connection to host (certificate chain invalid)."
+msgid ""
+"Unable to establish a secure connection to host (certificate chain invalid)."
msgstr ""
-#: cups/http.c:4262
-msgid "Unable to establish a secure connection to host (certificate not yet valid)."
+msgid ""
+"Unable to establish a secure connection to host (certificate not yet valid)."
msgstr ""
-#: cups/http.c:4257
msgid "Unable to establish a secure connection to host (expired certificate)."
msgstr ""
-#: cups/http.c:4267
msgid "Unable to establish a secure connection to host (host name mismatch)."
msgstr ""
-#: cups/http.c:4277
-msgid "Unable to establish a secure connection to host (peer dropped connection before responding)."
+msgid ""
+"Unable to establish a secure connection to host (peer dropped connection "
+"before responding)."
msgstr ""
-#: cups/http.c:4252
-msgid "Unable to establish a secure connection to host (self-signed certificate)."
+msgid ""
+"Unable to establish a secure connection to host (self-signed certificate)."
msgstr ""
-#: cups/http.c:4247
-msgid "Unable to establish a secure connection to host (untrusted certificate)."
+msgid ""
+"Unable to establish a secure connection to host (untrusted certificate)."
msgstr ""
-#: cups/http.c:4008 cups/http.c:4304 cups/http.c:4337 cups/http.c:4354
msgid "Unable to establish a secure connection to host."
msgstr ""
-#: cgi-bin/ipp-var.c:365
msgid "Unable to find destination for job"
msgstr ""
-#: cups/http-support.c:1748
msgid "Unable to find printer."
msgstr ""
-#: backend/ipp.c:2056
-msgid "Unable to generate compressed print file"
+msgid "Unable to find server credentials."
msgstr ""
-#: backend/ipp.c:3009
msgid "Unable to get backend exit status."
msgstr ""
-#: cgi-bin/classes.c:450
msgid "Unable to get class list"
msgstr "Nelze získat seznam tříd"
-#: cgi-bin/classes.c:549
msgid "Unable to get class status"
msgstr "Nelze získat stav třídy"
-#: cgi-bin/admin.c:1320
msgid "Unable to get list of printer drivers"
msgstr "Nelze získat seznam ovladaÄů tiskárny"
-#: cgi-bin/admin.c:2840
msgid "Unable to get printer attributes"
msgstr "Nelze získat atributy tiskárny"
-#: cgi-bin/printers.c:467
msgid "Unable to get printer list"
msgstr "Nelze získat seznam tiskáren"
-#: cgi-bin/printers.c:569
msgid "Unable to get printer status"
msgstr ""
-#: backend/ipp.c:933
msgid "Unable to get printer status."
msgstr "Nelze získat stav tiskárny."
-#: cups/adminutil.c:565 cups/adminutil.c:769
#, c-format
msgid "Unable to install Windows 2000 printer driver files (%d)."
msgstr ""
-#: cups/adminutil.c:639
#, c-format
msgid "Unable to install Windows 9x printer driver files (%d)."
msgstr ""
-#: cgi-bin/help.c:92
msgid "Unable to load help index."
msgstr ""
-#: backend/ipp.c:642 backend/lpd.c:421 backend/socket.c:275
#, c-format
msgid "Unable to locate printer \"%s\"."
msgstr ""
-#: backend/dnssd.c:781 backend/ipp.c:324 backend/lpd.c:204
-#: backend/socket.c:171
msgid "Unable to locate printer."
msgstr ""
-#: cgi-bin/admin.c:813
msgid "Unable to modify class"
msgstr "Nelze změnit třídu"
-#: cgi-bin/admin.c:1058 cgi-bin/admin.c:1418
msgid "Unable to modify printer"
msgstr "Nelze změnit tiskárnu"
-#: cgi-bin/ipp-var.c:432 cgi-bin/ipp-var.c:521
msgid "Unable to move job"
msgstr "Nelze přesunout úlohu"
-#: cgi-bin/ipp-var.c:434 cgi-bin/ipp-var.c:523
msgid "Unable to move jobs"
msgstr "Nelze přesunout úlohy"
-#: cgi-bin/admin.c:3186 cups/ppd.c:339
msgid "Unable to open PPD file"
msgstr "Nelze otevřít PPD soubor"
-#: backend/ipp.c:2040
-msgid "Unable to open compressed print file"
-msgstr ""
-
-#: cgi-bin/admin.c:2608
msgid "Unable to open cupsd.conf file:"
msgstr "Nelze otevřít soubor \"cupsd.conf\":"
-#: backend/usb-unix.c:141
msgid "Unable to open device file"
msgstr ""
-#: scheduler/ipp.c:6140
#, c-format
msgid "Unable to open document #%d in job #%d."
msgstr ""
-#: cgi-bin/help.c:364
msgid "Unable to open help file."
msgstr ""
-#: backend/ipp.c:365 backend/ipp.c:1398 backend/ipp.c:1594 backend/ipp.c:2046
-#: backend/lpd.c:488 backend/socket.c:158 backend/usb.c:237
-#: filter/gziptoany.c:71 filter/pstops.c:300
msgid "Unable to open print file"
msgstr ""
-#: filter/rastertoepson.c:998 filter/rastertohp.c:724
-#: filter/rastertolabel.c:1147
msgid "Unable to open raster file"
msgstr ""
-#: cgi-bin/ipp-var.c:795
msgid "Unable to print test page"
msgstr "Nelze vytisknout zkušební stránku"
-#: backend/runloop.c:96 backend/runloop.c:325 backend/usb-darwin.c:613
-#: backend/usb-darwin.c:657 backend/usb-libusb.c:343 backend/usb-libusb.c:378
msgid "Unable to read print data."
msgstr ""
-#: cups/dest.c:3402
-msgid "Unable to resolve printer URI."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
msgstr ""
-#: cups/adminutil.c:2088
#, c-format
msgid "Unable to run \"%s\": %s"
msgstr ""
-#: filter/pstops.c:563
msgid "Unable to see in file"
msgstr ""
-#: cgi-bin/ipp-var.c:598 cgi-bin/ipp-var.c:618
msgid "Unable to send command to printer driver"
msgstr ""
-#: backend/usb-darwin.c:735 backend/usb-libusb.c:454
msgid "Unable to send data to printer."
msgstr ""
-#: cups/adminutil.c:821
#, c-format
msgid "Unable to set Windows printer driver (%d)."
msgstr ""
-#: cgi-bin/admin.c:3807
msgid "Unable to set options"
msgstr "Nelze nastavit parametry"
-#: cgi-bin/admin.c:3077
msgid "Unable to set server default"
msgstr "Nelze nastavit výchozí server"
-#: backend/ipp.c:2868 backend/ipp.c:2945 backend/ipp.c:2953
msgid "Unable to start backend process."
msgstr ""
-#: cgi-bin/admin.c:1912
msgid "Unable to upload cupsd.conf file"
msgstr "Nelze nahrát soubor \"cupsd.conf\""
-#: backend/usb-darwin.c:1985 backend/usb-darwin.c:2009
msgid "Unable to use legacy USB class driver."
msgstr ""
-#: backend/runloop.c:125 backend/runloop.c:380
msgid "Unable to write print data"
msgstr ""
-#: filter/gziptoany.c:90
#, c-format
msgid "Unable to write uncompressed print data: %s"
msgstr ""
-#: cups/http-support.c:1303
msgid "Unauthorized"
msgstr "Nepovolený"
-#: cgi-bin/admin.c:3503
msgid "Units"
msgstr "Jednotky"
-#: cups/http-support.c:1343 cups/ppd.c:366
msgid "Unknown"
msgstr "Neznámý"
-#: filter/pstops.c:2213
#, c-format
msgid "Unknown choice \"%s\" for option \"%s\"."
msgstr ""
-#: backend/ipp.c:507
#, c-format
msgid "Unknown encryption option value: \"%s\"."
msgstr ""
-#: backend/lpd.c:350
#, c-format
msgid "Unknown file order: \"%s\"."
msgstr ""
-#: backend/lpd.c:321
#, c-format
msgid "Unknown format character: \"%c\"."
msgstr ""
-#: cups/dest-options.c:770
msgid "Unknown media size name."
msgstr ""
-#: backend/ipp.c:554
#, c-format
msgid "Unknown option \"%s\" with value \"%s\"."
msgstr ""
-#: filter/pstops.c:2196
#, c-format
msgid "Unknown option \"%s\"."
msgstr ""
-#: backend/lpd.c:336
#, c-format
msgid "Unknown print mode: \"%s\"."
msgstr ""
-#: scheduler/ipp.c:10496
#, c-format
msgid "Unknown printer-error-policy \"%s\"."
msgstr "Neznámá printer-error-policy „%s“."
-#: scheduler/ipp.c:10479
#, c-format
msgid "Unknown printer-op-policy \"%s\"."
msgstr "Neznámá printer-op-policy „%s“."
-#: cups/http-addrlist.c:710
+msgid "Unknown request method."
+msgstr ""
+
+msgid "Unknown request version."
+msgstr ""
+
+msgid "Unknown scheme in URI"
+msgstr ""
+
msgid "Unknown service name."
msgstr ""
-#: backend/ipp.c:526
#, c-format
msgid "Unknown version option value: \"%s\"."
msgstr ""
-#: scheduler/ipp.c:402
+#, c-format
+msgid "Unsupported 'compression' value \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unsupported 'document-format' value \"%s\"."
+msgstr ""
+
+msgid "Unsupported 'job-name' value."
+msgstr ""
+
#, c-format
msgid "Unsupported character set \"%s\"."
msgstr ""
-#: scheduler/ipp.c:8171 scheduler/ipp.c:9401 scheduler/ipp.c:10950
#, c-format
msgid "Unsupported compression \"%s\"."
msgstr ""
-#: scheduler/ipp.c:8305 scheduler/ipp.c:9551 scheduler/ipp.c:10979
#, c-format
msgid "Unsupported document-format \"%s\"."
msgstr ""
-#: scheduler/ipp.c:9534
#, c-format
msgid "Unsupported document-format \"%s/%s\"."
msgstr ""
-#: scheduler/ipp.c:1367
#, c-format
msgid "Unsupported format \"%s\"."
msgstr ""
-#: scheduler/ipp.c:1465
msgid "Unsupported margins."
msgstr ""
-#: cups/pwg-media.c:529
msgid "Unsupported media value."
msgstr ""
-#: filter/pstops.c:2478
#, c-format
msgid "Unsupported number-up value %d, using number-up=1."
msgstr ""
-#: filter/pstops.c:2512
#, c-format
msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
msgstr ""
-#: filter/pstops.c:2563
#, c-format
msgid "Unsupported page-border value %s, using page-border=none."
msgstr ""
-#: filter/rastertopwg.c:147 filter/rastertopwg.c:155 filter/rastertopwg.c:164
msgid "Unsupported raster data."
msgstr ""
-#: cups/snmp.c:1112
msgid "Unsupported value type"
msgstr "Nepodporovaný typ hodnoty"
-#: cups/http-support.c:1318
msgid "Upgrade Required"
msgstr "Povinné aktualizace"
-#: systemv/lpadmin.c:668
msgid ""
"Usage:\n"
"\n"
@@ -5514,47 +4718,49 @@ msgid ""
" [-u allow:user,user] [-u deny:user,user]"
msgstr ""
-#: backend/dnssd.c:241 backend/ipp.c:313 backend/lpd.c:191
-#: backend/socket.c:135 backend/usb.c:183 filter/commandtops.c:74
-#: filter/gziptoany.c:50 filter/pstops.c:264 monitor/bcp.c:62
-#: monitor/tbcp.c:61
#, c-format
msgid "Usage: %s job-id user title copies options [file]"
msgstr ""
-#: systemv/cupsaddsmb.c:281
msgid "Usage: cupsaddsmb [options] printer1 ... printerN"
msgstr ""
-#: systemv/cupsctl.c:200
msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
msgstr ""
-#: scheduler/main.c:2017
msgid "Usage: cupsd [options]"
msgstr ""
-#: scheduler/cupsfilter.c:1429
-msgid "Usage: cupsfilter [ options ] filename"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
msgstr ""
-#: systemv/cupstestdsc.c:425
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
msgstr ""
-#: systemv/cupstestppd.c:3793
-msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgstr ""
+
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
msgstr ""
-#: test/ipptool.c:4401
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr ""
-#: systemv/lpmove.c:125
msgid "Usage: lpmove job/src dest"
msgstr ""
-#: systemv/lpoptions.c:553
msgid ""
"Usage: lpoptions [-h server] [-E] -d printer\n"
" lpoptions [-h server] [-E] [-p printer] -l\n"
@@ -5562,1160 +4768,968 @@ msgid ""
" lpoptions [-h server] [-E] -x printer"
msgstr ""
-#: systemv/lppasswd.c:476
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-#: systemv/lppasswd.c:479
msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
+"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
msgstr ""
-#: berkeley/lpq.c:670
-msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
-msgstr ""
-
-#: ppdc/ppdc.cxx:435
msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
msgstr ""
-#: ppdc/ppdhtml.cxx:172
msgid "Usage: ppdhtml [options] filename.drv >filename.html"
msgstr ""
-#: ppdc/ppdi.cxx:128
msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"
msgstr ""
-#: ppdc/ppdmerge.cxx:367
msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"
msgstr ""
-#: ppdc/ppdpo.cxx:252
-msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
+msgid ""
+"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
msgstr ""
-#: backend/snmp.c:218
msgid "Usage: snmp [host-or-ip-address]"
msgstr ""
-#: cups/snmp.c:1064
msgid "Value uses indefinite length"
msgstr "Hodnota má neomezenou délku"
-#: cups/snmp.c:1049
msgid "VarBind uses indefinite length"
msgstr "VarBind má neomezenou délku"
-#: cups/snmp.c:999
msgid "Version uses indefinite length"
msgstr "Version má neomezenou délku"
-#: backend/ipp.c:1675
msgid "Waiting for job to complete."
msgstr ""
-#: backend/usb-darwin.c:457 backend/usb-libusb.c:193
msgid "Waiting for printer to become available."
msgstr ""
-#: backend/socket.c:444
msgid "Waiting for printer to finish."
msgstr ""
-#: cups/adminutil.c:793
msgid "Warning, no Windows 2000 printer drivers are installed."
msgstr ""
-#: cups/http-support.c:1339
msgid "Web Interface is Disabled"
msgstr ""
-#: cups/ppd.c:1947
msgid "Yes"
msgstr "Ano"
-#: scheduler/client.c:2437
#, c-format
-msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
-msgstr Pro přístup k této stránce, použijte adresu URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
-
-#: systemv/lppasswd.c:254
-msgid "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number."
+msgid ""
+"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
msgstr ""
+"Pro přístup k této stránce, použijte adresu URL <A HREF=\"https://%s:%d%s"
+"\">https://%s:%d%s</A>."
-#: ppdc/sample.c:439
msgid "ZPL Label Printer"
msgstr "Tiskárna štítků ZPL"
-#: ppdc/sample.c:362
msgid "Zebra"
msgstr "Zebra"
-#: cups/notify.c:102
msgid "aborted"
msgstr "zrušeno"
-#: cups/notify.c:99
msgid "canceled"
msgstr "zrušeno"
-#: cups/notify.c:105
msgid "completed"
msgstr "dokonÄeno"
-#: scheduler/ipp.c:6012
msgid "cups-deviced failed to execute."
msgstr "Nepodařilo se spustit \"cups-deviced\"."
-#: scheduler/ipp.c:6842 scheduler/ipp.c:7091
msgid "cups-driverd failed to execute."
msgstr "Nepodařilo se spustit \"cups-driverd\"."
-#: systemv/cupsaddsmb.c:233
#, c-format
msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s"
msgstr ""
-#: systemv/cupsctl.c:141
msgid "cupsctl: Cannot set Listen or Port directly."
msgstr ""
-#: systemv/cupsctl.c:152
#, c-format
msgid "cupsctl: Unable to connect to server: %s"
msgstr ""
-#: systemv/cupsctl.c:195
#, c-format
msgid "cupsctl: Unknown option \"%s\""
msgstr ""
-#: systemv/cupsctl.c:197
#, c-format
msgid "cupsctl: Unknown option \"-%c\""
msgstr ""
-#: scheduler/main.c:189
msgid "cupsd: Expected config filename after \"-c\" option."
msgstr ""
-#: scheduler/main.c:221 scheduler/main.c:228
+msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
+msgstr ""
+
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
+msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgstr ""
+
msgid "cupsd: Unable to get current directory."
msgstr ""
-#: scheduler/main.c:295
+msgid "cupsd: Unable to get path to cups-files.conf file."
+msgstr ""
+
#, c-format
msgid "cupsd: Unknown argument \"%s\" - aborting."
msgstr ""
-#: scheduler/main.c:288
#, c-format
msgid "cupsd: Unknown option \"%c\" - aborting."
msgstr ""
-#: scheduler/main.c:255
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-
-#: scheduler/cupsfilter.c:1209
#, c-format
msgid "cupsfilter: Invalid document number %d."
msgstr ""
-#: scheduler/cupsfilter.c:1203
#, c-format
msgid "cupsfilter: Invalid job ID %d."
msgstr ""
-#: scheduler/cupsfilter.c:358
msgid "cupsfilter: Only one filename can be specified."
msgstr ""
-#: scheduler/cupsfilter.c:1251
#, c-format
msgid "cupsfilter: Unable to get job file - %s"
msgstr ""
-#: systemv/cupstestppd.c:261
msgid "cupstestppd: The -q option is incompatible with the -v option."
msgstr ""
-#: systemv/cupstestppd.c:277
msgid "cupstestppd: The -v option is incompatible with the -q option."
msgstr ""
-#: systemv/lpstat.c:1231 systemv/lpstat.c:1234 systemv/lpstat.c:1237
#, c-format
msgid "device for %s/%s: %s"
msgstr ""
-#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224
#, c-format
msgid "device for %s: %s"
msgstr ""
-#: cups/snmp.c:1036
msgid "error-index uses indefinite length"
msgstr "\"error-index\" má neomezenou délku"
-#: cups/snmp.c:1028
msgid "error-status uses indefinite length"
msgstr "\"error-status\" má neomezenou délku"
-#: cups/notify.c:90
msgid "held"
msgstr "pozastaveno"
-#: berkeley/lpc.c:209
msgid "help\t\tGet help on commands."
msgstr ""
-#: cups/notify.c:131
msgid "idle"
msgstr "Äeká"
-#: test/ipptool.c:373 test/ipptool.c:515 test/ipptool.c:539
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
msgstr ""
-#: test/ipptool.c:597
#, c-format
-msgid "ipptool: Bad URI - %s."
+msgid "ippfind: Expected key name after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr ""
+
+msgid "ippfind: Missing close parenthesis."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr ""
+
+msgid "ippfind: Missing open parenthesis."
msgstr ""
-#: test/ipptool.c:362
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
+msgid "ippfind: Missing program after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Out of memory."
+msgstr ""
+
+msgid "ippfind: Too many parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr ""
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
msgstr ""
-#: test/ipptool.c:508
msgid "ipptool: Invalid seconds for \"-i\"."
msgstr ""
-#: test/ipptool.c:578
msgid "ipptool: May only specify a single URI."
msgstr ""
-#: test/ipptool.c:531
msgid "ipptool: Missing count for \"-n\"."
msgstr ""
-#: test/ipptool.c:408
msgid "ipptool: Missing filename for \"-f\"."
msgstr ""
-#: test/ipptool.c:389
msgid "ipptool: Missing name=value for \"-d\"."
msgstr ""
-#: test/ipptool.c:498
msgid "ipptool: Missing seconds for \"-i\"."
msgstr ""
-#: test/ipptool.c:332
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-#: test/ipptool.c:345
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
-
-#: test/ipptool.c:624
msgid "ipptool: URI required before test file."
msgstr ""
-#: test/ipptool.c:558
#, c-format
msgid "ipptool: Unknown option \"-%c\"."
msgstr ""
-#: scheduler/ipp.c:7838
msgid "job-printer-uri attribute missing."
msgstr ""
-#: systemv/lpadmin.c:131 systemv/lpadmin.c:375
msgid "lpadmin: Class name can only contain printable characters."
msgstr ""
-#: systemv/lpadmin.c:614
msgid "lpadmin: Expected PPD after \"-P\" option."
msgstr ""
-#: systemv/lpadmin.c:457
msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
msgstr ""
-#: systemv/lpadmin.c:364
msgid "lpadmin: Expected class after \"-r\" option."
msgstr ""
-#: systemv/lpadmin.c:120
msgid "lpadmin: Expected class name after \"-c\" option."
msgstr ""
-#: systemv/lpadmin.c:558
msgid "lpadmin: Expected description after \"-D\" option."
msgstr ""
-#: systemv/lpadmin.c:491
msgid "lpadmin: Expected device URI after \"-v\" option."
msgstr ""
-#: systemv/lpadmin.c:574
msgid "lpadmin: Expected file type(s) after \"-I\" option."
msgstr ""
-#: systemv/lpadmin.c:202
msgid "lpadmin: Expected hostname after \"-h\" option."
msgstr ""
-#: systemv/lpadmin.c:221
msgid "lpadmin: Expected interface after \"-i\" option."
msgstr ""
-#: systemv/lpadmin.c:594
msgid "lpadmin: Expected location after \"-L\" option."
msgstr ""
-#: systemv/lpadmin.c:274
msgid "lpadmin: Expected model after \"-m\" option."
msgstr ""
-#: systemv/lpadmin.c:417
msgid "lpadmin: Expected name after \"-R\" option."
msgstr ""
-#: systemv/lpadmin.c:294
msgid "lpadmin: Expected name=value after \"-o\" option."
msgstr ""
-#: systemv/lpadmin.c:313
msgid "lpadmin: Expected printer after \"-p\" option."
msgstr ""
-#: systemv/lpadmin.c:164
msgid "lpadmin: Expected printer name after \"-d\" option."
msgstr ""
-#: systemv/lpadmin.c:525
msgid "lpadmin: Expected printer or class after \"-x\" option."
msgstr ""
-#: systemv/lpadmin.c:975
msgid "lpadmin: No member names were seen."
msgstr ""
-#: systemv/lpadmin.c:762
#, c-format
msgid "lpadmin: Printer %s is already a member of class %s."
msgstr ""
-#: systemv/lpadmin.c:989
#, c-format
msgid "lpadmin: Printer %s is not a member of class %s."
msgstr ""
-#: systemv/lpadmin.c:175 systemv/lpadmin.c:324 systemv/lpadmin.c:536
msgid "lpadmin: Printer name can only contain printable characters."
msgstr ""
-#: systemv/lpadmin.c:105
msgid ""
"lpadmin: Unable to add a printer to the class:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:96 systemv/lpadmin.c:149 systemv/lpadmin.c:253
-#: systemv/lpadmin.c:339 systemv/lpadmin.c:393 systemv/lpadmin.c:510
-#: systemv/lpadmin.c:647
#, c-format
msgid "lpadmin: Unable to connect to server: %s"
msgstr ""
-#: systemv/lpadmin.c:1329
msgid "lpadmin: Unable to create temporary file"
msgstr ""
-#: systemv/lpadmin.c:402
msgid ""
"lpadmin: Unable to delete option:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:1339
+#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
msgstr ""
-#: systemv/lpadmin.c:348
msgid ""
"lpadmin: Unable to remove a printer from the class:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:656
msgid ""
"lpadmin: Unable to set the printer options:\n"
" You must specify a printer name first."
msgstr ""
-#: systemv/lpadmin.c:474
#, c-format
msgid "lpadmin: Unknown allow/deny option \"%s\"."
msgstr ""
-#: systemv/lpadmin.c:629
#, c-format
msgid "lpadmin: Unknown argument \"%s\"."
msgstr ""
-#: systemv/lpadmin.c:624
#, c-format
msgid "lpadmin: Unknown option \"%c\"."
msgstr ""
-#: systemv/lpadmin.c:580
msgid "lpadmin: Warning - content type list ignored."
msgstr ""
-#: berkeley/lpc.c:76 berkeley/lpc.c:104 berkeley/lpc.c:140
msgid "lpc> "
msgstr "lpc> "
-#: systemv/lpinfo.c:137
msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"."
msgstr ""
-#: systemv/lpinfo.c:190
msgid "lpinfo: Expected language after \"--language\"."
msgstr ""
-#: systemv/lpinfo.c:207
msgid "lpinfo: Expected make and model after \"--make-and-model\"."
msgstr ""
-#: systemv/lpinfo.c:224
msgid "lpinfo: Expected product string after \"--product\"."
msgstr ""
-#: systemv/lpinfo.c:155
msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"."
msgstr ""
-#: systemv/lpinfo.c:173
msgid "lpinfo: Expected scheme list after \"--include-schemes\"."
msgstr ""
-#: systemv/lpinfo.c:241
msgid "lpinfo: Expected timeout after \"--timeout\"."
msgstr ""
-#: systemv/lpinfo.c:265
#, c-format
msgid "lpinfo: Unknown argument \"%s\"."
msgstr ""
-#: systemv/lpinfo.c:259
#, c-format
msgid "lpinfo: Unknown option \"%c\"."
msgstr ""
-#: systemv/lpinfo.c:252
#, c-format
msgid "lpinfo: Unknown option \"%s\"."
msgstr ""
-#: systemv/lpmove.c:133
#, c-format
msgid "lpmove: Unable to connect to server: %s"
msgstr ""
-#: systemv/lpmove.c:119
#, c-format
msgid "lpmove: Unknown argument \"%s\"."
msgstr ""
-#: systemv/lpmove.c:97
#, c-format
msgid "lpmove: Unknown option \"%c\"."
msgstr ""
-#: systemv/lpoptions.c:150 systemv/lpoptions.c:168 systemv/lpoptions.c:244
msgid "lpoptions: No printers."
msgstr ""
-#: systemv/lpoptions.c:219
#, c-format
msgid "lpoptions: Unable to add printer or instance: %s"
msgstr ""
-#: systemv/lpoptions.c:521
#, c-format
msgid "lpoptions: Unable to get PPD file for %s: %s"
msgstr ""
-#: systemv/lpoptions.c:529
#, c-format
msgid "lpoptions: Unable to open PPD file for %s."
msgstr ""
-#: systemv/lpoptions.c:99
msgid "lpoptions: Unknown printer or class."
msgstr ""
-#: systemv/lppasswd.c:173
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-#: systemv/lppasswd.c:302
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-#: systemv/lppasswd.c:431
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-#: systemv/lppasswd.c:398
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-#: systemv/lppasswd.c:253
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-#: systemv/lppasswd.c:230
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#: systemv/lppasswd.c:199 systemv/lppasswd.c:218
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:304 systemv/lppasswd.c:312 systemv/lppasswd.c:329
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:364 systemv/lppasswd.c:377 systemv/lppasswd.c:408
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:446
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:458
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:389
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
-
-#: systemv/lpstat.c:1039
#, c-format
-msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"."
+msgid ""
+"lpstat: error - %s environment variable names non-existent destination \"%s"
+"\"."
msgstr ""
-#: systemv/lpstat.c:970
#, c-format
msgid "members of class %s:"
msgstr ""
-#: berkeley/lpq.c:582
msgid "no entries"
msgstr ""
-#: systemv/lpstat.c:1043
msgid "no system default destination"
msgstr ""
-#: scheduler/ipp.c:5702
msgid "notify-events not specified."
msgstr ""
-#: scheduler/ipp.c:2034 scheduler/ipp.c:5607
#, c-format
msgid "notify-recipient-uri URI \"%s\" is already used."
msgstr ""
-#: scheduler/ipp.c:2024 scheduler/ipp.c:5597
#, c-format
msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
msgstr ""
-#: cups/notify.c:87
msgid "pending"
msgstr "nevyřízený"
-#: ppdc/ppdc.cxx:113 ppdc/ppdpo.cxx:93
#, c-format
msgid "ppdc: Adding include directory \"%s\"."
msgstr ""
-#: ppdc/ppdpo.cxx:134
#, c-format
msgid "ppdc: Adding/updating UI text from %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:410
#, c-format
msgid "ppdc: Bad boolean value (%s) on line %d of %s."
msgstr ""
-#: ppdc/ppdc-import.cxx:264
#, c-format
msgid "ppdc: Bad font attribute: %s"
msgstr ""
-#: ppdc/ppdc-source.cxx:1796
#, c-format
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1113
#, c-format
msgid "ppdc: Bad status keyword %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2033
#, c-format
msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2719
#, c-format
msgid "ppdc: Choice found on line %d of %s with no Option."
msgstr ""
-#: ppdc/ppdc-source.cxx:1698
#, c-format
msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:932
#, c-format
msgid "ppdc: Expected a filter definition on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:955
#, c-format
msgid "ppdc: Expected a program name on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:394
#, c-format
msgid "ppdc: Expected boolean value on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1093
#, c-format
msgid "ppdc: Expected charset after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:447
#, c-format
msgid "ppdc: Expected choice code on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:435
#, c-format
msgid "ppdc: Expected choice name/text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:503
#, c-format
msgid "ppdc: Expected color order for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:492
#, c-format
msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:514
#, c-format
msgid "ppdc: Expected compression for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:695
#, c-format
msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2905
#, c-format
-msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s."
+msgid ""
+"ppdc: Expected driver type keyword following DriverType on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:826
#, c-format
msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1077
#, c-format
msgid "ppdc: Expected encoding after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1689
#, c-format
msgid "ppdc: Expected filename after #po %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1205
#, c-format
msgid "ppdc: Expected group name/text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2619
#, c-format
msgid "ppdc: Expected include filename on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1502
#, c-format
msgid "ppdc: Expected integer on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1681
#, c-format
msgid "ppdc: Expected locale after #po on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:353
#, c-format
msgid "ppdc: Expected name after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3277
#, c-format
msgid "ppdc: Expected name after FileName on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1058
#, c-format
msgid "ppdc: Expected name after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3108
#, c-format
msgid "ppdc: Expected name after Manufacturer on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3141
#, c-format
msgid "ppdc: Expected name after MediaSize on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3231
#, c-format
msgid "ppdc: Expected name after ModelName on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3294
#, c-format
msgid "ppdc: Expected name after PCFileName on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1156
#, c-format
msgid "ppdc: Expected name/text after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1245
#, c-format
msgid "ppdc: Expected name/text after Installable on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1782
#, c-format
msgid "ppdc: Expected name/text after Resolution on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:479
#, c-format
msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1574
#, c-format
msgid "ppdc: Expected option name/text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1608
#, c-format
msgid "ppdc: Expected option section on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1586
#, c-format
msgid "ppdc: Expected option type on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1765
#, c-format
msgid "ppdc: Expected override field after Resolution on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:341 ppdc/ppdc-catalog.cxx:353
#, c-format
msgid "ppdc: Expected quoted string on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1004
#, c-format
msgid "ppdc: Expected real number on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:572
#, c-format
-msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
+msgid ""
+"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1863
#, c-format
-msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s."
+msgid ""
+"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
+"of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:361
#, c-format
msgid "ppdc: Expected selector after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1101
#, c-format
msgid "ppdc: Expected status after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2794
#, c-format
msgid "ppdc: Expected string after Copyright on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3397
#, c-format
msgid "ppdc: Expected string after Version on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:728
#, c-format
msgid "ppdc: Expected two option names on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:372
#, c-format
msgid "ppdc: Expected value after %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1085
#, c-format
msgid "ppdc: Expected version after Font on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:227
#, c-format
msgid "ppdc: Invalid #include/#po filename \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:972
#, c-format
msgid "ppdc: Invalid cost for filter on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:964
#, c-format
msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:980
#, c-format
msgid "ppdc: Invalid empty program name for filter on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1628
#, c-format
msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1600
#, c-format
msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:251 ppdc/ppdpo.cxx:123
#, c-format
msgid "ppdc: Loading driver information file \"%s\"."
msgstr ""
-#: ppdc/ppdc.cxx:187
#, c-format
msgid "ppdc: Loading messages for locale \"%s\"."
msgstr ""
-#: ppdc/ppdc.cxx:126
#, c-format
msgid "ppdc: Loading messages from \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:2412 ppdc/ppdc-source.cxx:2644
#, c-format
msgid "ppdc: Missing #endif at end of \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:2513 ppdc/ppdc-source.cxx:2548
-#: ppdc/ppdc-source.cxx:2578
#, c-format
msgid "ppdc: Missing #if on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:418
#, c-format
-msgid "ppdc: Need a msgid line before any translation strings on line %d of %s."
+msgid ""
+"ppdc: Need a msgid line before any translation strings on line %d of %s."
msgstr ""
-#: ppdc/ppdc-driver.cxx:730
#, c-format
msgid "ppdc: No message catalog provided for locale %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1651 ppdc/ppdc-source.cxx:2882
-#: ppdc/ppdc-source.cxx:2968 ppdc/ppdc-source.cxx:3061
-#: ppdc/ppdc-source.cxx:3194 ppdc/ppdc-source.cxx:3327
#, c-format
msgid "ppdc: Option %s defined in two different groups on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1644
#, c-format
msgid "ppdc: Option %s redefined with a different type on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:705
#, c-format
msgid "ppdc: Option constraint must *name on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2495
#, c-format
msgid "ppdc: Too many nested #if's on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:374
#, c-format
msgid "ppdc: Unable to create PPD file \"%s\" - %s."
msgstr ""
-#: ppdc/ppdc.cxx:266
#, c-format
msgid "ppdc: Unable to create output directory %s: %s"
msgstr ""
-#: ppdc/ppdc.cxx:287
#, c-format
msgid "ppdc: Unable to create output pipes: %s"
msgstr ""
-#: ppdc/ppdc.cxx:303 ppdc/ppdc.cxx:309
#, c-format
msgid "ppdc: Unable to execute cupstestppd: %s"
msgstr ""
-#: ppdc/ppdc-source.cxx:1730
#, c-format
msgid "ppdc: Unable to find #po file %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2651
#, c-format
msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:198
#, c-format
msgid "ppdc: Unable to find localization for \"%s\" - %s"
msgstr ""
-#: ppdc/ppdc.cxx:135
#, c-format
msgid "ppdc: Unable to load localization file \"%s\" - %s"
msgstr ""
-#: ppdc/ppdc-file.cxx:50
#, c-format
msgid "ppdc: Unable to open %s: %s"
msgstr ""
-#: ppdc/ppdc-source.cxx:2054
#, c-format
msgid "ppdc: Undefined variable (%s) on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:435
#, c-format
msgid "ppdc: Unexpected text on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2924
#, c-format
msgid "ppdc: Unknown driver type %s on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:906
#, c-format
msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:3154
#, c-format
msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-catalog.cxx:463
#, c-format
msgid "ppdc: Unknown message catalog format for \"%s\"."
msgstr ""
-#: ppdc/ppdc-source.cxx:3408
#, c-format
msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:1014
#, c-format
-msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
+msgid ""
+"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
msgstr ""
-#: ppdc/ppdc-source.cxx:2164
#, c-format
msgid "ppdc: Unterminated string starting with %c on line %d of %s."
msgstr ""
-#: ppdc/ppdc.cxx:365
#, c-format
msgid "ppdc: Warning - overlapping filename \"%s\"."
msgstr ""
-#: ppdc/ppdc.cxx:380
#, c-format
msgid "ppdc: Writing %s."
msgstr ""
-#: ppdc/ppdc.cxx:148
#, c-format
msgid "ppdc: Writing PPD files to directory \"%s\"."
msgstr ""
-#: ppdc/ppdmerge.cxx:136
#, c-format
msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
msgstr ""
-#: ppdc/ppdmerge.cxx:176
#, c-format
msgid "ppdmerge: Ignoring PPD file %s."
msgstr ""
-#: ppdc/ppdmerge.cxx:160
#, c-format
msgid "ppdmerge: Unable to backup %s to %s - %s"
msgstr ""
-#: systemv/lpstat.c:1784
#, c-format
msgid "printer %s disabled since %s -"
msgstr ""
-#: systemv/lpstat.c:1773
#, c-format
msgid "printer %s is idle. enabled since %s"
msgstr ""
-#: systemv/lpstat.c:1778
#, c-format
msgid "printer %s now printing %s-%d. enabled since %s"
msgstr ""
-#: systemv/lpstat.c:1909
#, c-format
msgid "printer %s/%s disabled since %s -"
msgstr ""
-#: systemv/lpstat.c:1895
#, c-format
msgid "printer %s/%s is idle. enabled since %s"
msgstr ""
-#: systemv/lpstat.c:1902
#, c-format
msgid "printer %s/%s now printing %s-%d. enabled since %s"
msgstr ""
-#: cups/notify.c:93 cups/notify.c:134
msgid "processing"
msgstr "zpracování"
-#: systemv/lp.c:644
#, c-format
msgid "request id is %s-%d (%d file(s))"
msgstr ""
-#: cups/snmp.c:1020
msgid "request-id uses indefinite length"
msgstr "ID požadavku má neomezenou délku"
-#: systemv/lpstat.c:2048
msgid "scheduler is not running"
msgstr ""
-#: systemv/lpstat.c:2044
msgid "scheduler is running"
msgstr ""
-#: cups/adminutil.c:2159
#, c-format
msgid "stat of %s failed: %s"
msgstr "stav %s selhalo: %s"
-#: berkeley/lpc.c:211
msgid "status\t\tShow status of daemon and queue."
msgstr ""
-#: cups/notify.c:96 cups/notify.c:137
msgid "stopped"
msgstr "zastaveno"
-#: systemv/lpstat.c:1017
#, c-format
msgid "system default destination: %s"
msgstr ""
-#: systemv/lpstat.c:1014
#, c-format
msgid "system default destination: %s/%s"
msgstr ""
-#: cups/notify.c:108 cups/notify.c:140
msgid "unknown"
msgstr "neznámý"
-#: cups/notify.c:117
msgid "untitled"
msgstr "nepojmenovaný"
-#: cups/snmp.c:1045
msgid "variable-bindings uses indefinite length"
msgstr "\"variable-bindings\" má neomezenou délku"
+#~ msgid "720dpi"
+#~ msgstr "720 dpi"
-#
-# End of "$Id$".
-#
+#~ msgid "Enter old password:"
+#~ msgstr "Zadejte původní heslo:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Opakujte heslo:"
+
+#~ msgid "Enter password:"
+#~ msgstr "Zadejte heslo:"
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "New Stylus Color Series"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "New Stylus Photo Series"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Výmaz úloh"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color Series"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo Series"
diff --git a/locale/cups_de.po b/locale/cups_de.po
new file mode 100644
index 0000000..089ca04
--- /dev/null
+++ b/locale/cups_de.po
@@ -0,0 +1,5774 @@
+#
+# "$Id$"
+#
+# Message catalog template for CUPS.
+#
+# Copyright 2007-2012 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+#
+# Notes for Translators:
+#
+# The "checkpo" program located in the "locale" source directory can be used
+# to verify that your translations do not introduce formatting errors or other
+# problems. Run with:
+#
+# cd locale
+# ./checkpo cups_LL.po
+#
+# where "LL" is your locale.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CUPS 2.0\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2015-05-09 22:25+0100\n"
+"Last-Translator: Joachim Schwender <joachim.schwender@web.de>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: German\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "\t\t(all)"
+msgstr "\t\t(alle)"
+
+msgid "\t\t(none)"
+msgstr "\t\t(keine)"
+
+#, c-format
+msgid "\t%d entries"
+msgstr "\t%d Einträge"
+
+#, c-format
+msgid "\t%s"
+msgstr ""
+
+msgid "\tAfter fault: continue"
+msgstr "\tNach einem Fehler: fortfahren"
+
+#, c-format
+msgid "\tAlerts: %s"
+msgstr "\tAlarme: %s"
+
+msgid "\tBanner required"
+msgstr "\tBanner erforderlich"
+
+msgid "\tCharset sets:"
+msgstr "\tZeichensatz Set:"
+
+msgid "\tConnection: direct"
+msgstr "\tVerbindung: direkt"
+
+msgid "\tConnection: remote"
+msgstr "\tVerbindung: über Netz"
+
+msgid "\tContent types: any"
+msgstr "\tInhaltstypen: beliebig"
+
+msgid "\tDefault page size:"
+msgstr "\tVoreingestellte Seitengrösse:"
+
+msgid "\tDefault pitch:"
+msgstr "\tVoreingestellte Neigung:"
+
+msgid "\tDefault port settings:"
+msgstr "\tVoreingestellte Porteinstellungen:"
+
+#, c-format
+msgid "\tDescription: %s"
+msgstr "\tBeschreibung: %s"
+
+msgid "\tForm mounted:"
+msgstr "\tGeladenes Formblatt"
+
+msgid "\tForms allowed:"
+msgstr "\tErlaubte Formblätter:"
+
+#, c-format
+msgid "\tInterface: %s.ppd"
+msgstr "\tSchnittstelle: %s.ppd"
+
+#, c-format
+msgid "\tInterface: %s/interfaces/%s"
+msgstr "\tSchnittstelle: %s/interfaces/%s"
+
+#, c-format
+msgid "\tInterface: %s/ppd/%s.ppd"
+msgstr "\tSchnittstelle: %s/ppp/%s.ppd"
+
+#, c-format
+msgid "\tLocation: %s"
+msgstr "\tOrt: %s"
+
+msgid "\tOn fault: no alert"
+msgstr "\tBei Fehlern: kein Alarm"
+
+msgid "\tPrinter types: unknown"
+msgstr "\tDruckertypen: unbekannt"
+
+#, c-format
+msgid "\tStatus: %s"
+msgstr "\tStatus: %s"
+
+msgid "\tUsers allowed:"
+msgstr ""
+
+msgid "\tUsers denied:"
+msgstr "\tGesperrte Benutzer:"
+
+msgid "\tdaemon present"
+msgstr ""
+
+msgid "\tno entries"
+msgstr "\tKeine Einträge"
+
+#, c-format
+msgid "\tprinter is on device '%s' speed -1"
+msgstr "\tDrucker ist am Gerät '%s' Geschwindigkeit -1"
+
+msgid "\tprinting is disabled"
+msgstr "\tDrucken ist abgeschaltet"
+
+msgid "\tprinting is enabled"
+msgstr "\tDrucken ist eingeschaltet"
+
+#, c-format
+msgid "\tqueued for %s"
+msgstr "\tin Warteschlange eingereiht für %s"
+
+msgid "\tqueuing is disabled"
+msgstr "\tin Warteschlange einreihen gesperrt"
+
+msgid "\tqueuing is enabled"
+msgstr "\tin Warteschlange einreihen erlaubt"
+
+msgid "\treason unknown"
+msgstr "\tunbekannter Grund"
+
+msgid ""
+"\n"
+" DETAILED CONFORMANCE TEST RESULTS"
+msgstr ""
+
+msgid " Ignore specific warnings."
+msgstr ""
+
+msgid " Issue warnings instead of errors."
+msgstr ""
+
+msgid " REF: Page 15, section 3.1."
+msgstr ""
+
+msgid " REF: Page 15, section 3.2."
+msgstr ""
+
+msgid " REF: Page 19, section 3.3."
+msgstr ""
+
+msgid " REF: Page 20, section 3.4."
+msgstr ""
+
+msgid " REF: Page 27, section 3.5."
+msgstr ""
+
+msgid " REF: Page 42, section 5.2."
+msgstr ""
+
+msgid " REF: Pages 16-17, section 3.2."
+msgstr ""
+
+msgid " REF: Pages 42-45, section 5.2."
+msgstr ""
+
+msgid " REF: Pages 45-46, section 5.2."
+msgstr ""
+
+msgid " REF: Pages 48-49, section 5.2."
+msgstr ""
+
+msgid " REF: Pages 52-54, section 5.2."
+msgstr ""
+
+#, c-format
+msgid " %-39.39s %.0f bytes"
+msgstr ""
+
+#, c-format
+msgid " PASS Default%s"
+msgstr ""
+
+msgid " PASS DefaultImageableArea"
+msgstr ""
+
+msgid " PASS DefaultPaperDimension"
+msgstr ""
+
+msgid " PASS FileVersion"
+msgstr ""
+
+msgid " PASS FormatVersion"
+msgstr ""
+
+msgid " PASS LanguageEncoding"
+msgstr ""
+
+msgid " PASS LanguageVersion"
+msgstr ""
+
+msgid " PASS Manufacturer"
+msgstr ""
+
+msgid " PASS ModelName"
+msgstr ""
+
+msgid " PASS NickName"
+msgstr ""
+
+msgid " PASS PCFileName"
+msgstr ""
+
+msgid " PASS PSVersion"
+msgstr ""
+
+msgid " PASS PageRegion"
+msgstr ""
+
+msgid " PASS PageSize"
+msgstr ""
+
+msgid " PASS Product"
+msgstr ""
+
+msgid " PASS ShortNickName"
+msgstr ""
+
+#, c-format
+msgid " WARN %s has no corresponding options."
+msgstr ""
+
+#, c-format
+msgid ""
+" WARN %s shares a common prefix with %s\n"
+" REF: Page 15, section 3.2."
+msgstr ""
+
+#, c-format
+msgid ""
+" WARN Duplex option keyword %s may not work as expected and should "
+"be named Duplex.\n"
+" REF: Page 122, section 5.17"
+msgstr ""
+
+msgid " WARN File contains a mix of CR, LF, and CR LF line endings."
+msgstr ""
+
+msgid ""
+" WARN LanguageEncoding required by PPD 4.3 spec.\n"
+" REF: Pages 56-57, section 5.3."
+msgstr ""
+
+#, c-format
+msgid " WARN Line %d only contains whitespace."
+msgstr ""
+
+msgid ""
+" WARN Manufacturer required by PPD 4.3 spec.\n"
+" REF: Pages 58-59, section 5.3."
+msgstr ""
+
+msgid ""
+" WARN Non-Windows PPD files should use lines ending with only LF, "
+"not CR LF."
+msgstr ""
+
+#, c-format
+msgid ""
+" WARN Obsolete PPD version %.1f.\n"
+" REF: Page 42, section 5.2."
+msgstr ""
+
+msgid ""
+" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
+" REF: Pages 61-62, section 5.3."
+msgstr ""
+
+msgid ""
+" WARN PCFileName should contain a unique filename.\n"
+" REF: Pages 61-62, section 5.3."
+msgstr ""
+
+msgid ""
+" WARN Protocols contains PJL but JCL attributes are not set.\n"
+" REF: Pages 78-79, section 5.7."
+msgstr ""
+
+msgid ""
+" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
+" REF: Pages 78-79, section 5.7."
+msgstr ""
+
+msgid ""
+" WARN ShortNickName required by PPD 4.3 spec.\n"
+" REF: Pages 64-65, section 5.3."
+msgstr ""
+
+msgid " cupsaddsmb [options] -a"
+msgstr ""
+
+msgid " cupstestdsc [options] -"
+msgstr ""
+
+msgid " program | cupstestppd [options] -"
+msgstr ""
+
+#, c-format
+msgid ""
+" %s \"%s %s\" conflicts with \"%s %s\"\n"
+" (constraint=\"%s %s %s %s\")."
+msgstr ""
+
+#, c-format
+msgid " %s %s %s does not exist."
+msgstr ""
+
+#, c-format
+msgid " %s %s file \"%s\" has the wrong capitalization."
+msgstr ""
+
+#, c-format
+msgid ""
+" %s Bad %s choice %s.\n"
+" REF: Page 122, section 5.17"
+msgstr ""
+
+#, c-format
+msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s."
+msgstr ""
+
+#, c-format
+msgid " %s Bad UTF-8 \"%s\" translation string for option %s."
+msgstr ""
+
+#, c-format
+msgid " %s Bad cupsFilter value \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Bad cupsFilter2 value \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Bad cupsICCProfile %s."
+msgstr ""
+
+#, c-format
+msgid " %s Bad cupsPreFilter value \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Bad cupsUIConstraints %s: \"%s\""
+msgstr ""
+
+#, c-format
+msgid " %s Bad language \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Bad permissions on %s file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Bad spelling of %s - should be %s."
+msgstr ""
+
+#, c-format
+msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID."
+msgstr ""
+
+#, c-format
+msgid " %s Default choices conflicting."
+msgstr ""
+
+#, c-format
+msgid " %s Empty cupsUIConstraints %s"
+msgstr ""
+
+#, c-format
+msgid " %s Missing \"%s\" translation string for option %s, choice %s."
+msgstr ""
+
+#, c-format
+msgid " %s Missing \"%s\" translation string for option %s."
+msgstr ""
+
+#, c-format
+msgid " %s Missing %s file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid ""
+" %s Missing REQUIRED PageRegion option.\n"
+" REF: Page 100, section 5.14."
+msgstr ""
+
+#, c-format
+msgid ""
+" %s Missing REQUIRED PageSize option.\n"
+" REF: Page 99, section 5.14."
+msgstr ""
+
+#, c-format
+msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
+msgstr ""
+
+#, c-format
+msgid " %s Missing cupsUIResolver %s"
+msgstr ""
+
+#, c-format
+msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\""
+msgstr ""
+
+#, c-format
+msgid " %s No base translation \"%s\" is included in file."
+msgstr ""
+
+#, c-format
+msgid ""
+" %s REQUIRED %s does not define choice None.\n"
+" REF: Page 122, section 5.17"
+msgstr ""
+
+#, c-format
+msgid " %s Size \"%s\" defined for %s but not for %s."
+msgstr ""
+
+#, c-format
+msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)."
+msgstr ""
+
+#, c-format
+msgid " %s Size \"%s\" should be \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"."
+msgstr ""
+
+#, c-format
+msgid " %s cupsICCProfile %s hash value collides with %s."
+msgstr ""
+
+#, c-format
+msgid " %s cupsUIResolver %s causes a loop."
+msgstr ""
+
+#, c-format
+msgid ""
+" %s cupsUIResolver %s does not list at least two different options."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** %s must be 1284DeviceID\n"
+" REF: Page 72, section 5.5"
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad Default%s %s\n"
+" REF: Page 40, section 4.5."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad DefaultImageableArea %s\n"
+" REF: Page 102, section 5.15."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad DefaultPaperDimension %s\n"
+" REF: Page 103, section 5.15."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad FileVersion \"%s\"\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad FormatVersion \"%s\"\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** Bad JobPatchFile attribute in file\n"
+" REF: Page 24, section 3.4."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Bad LanguageVersion %s - must be English."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad Manufacturer (should be \"%s\")\n"
+" REF: Page 211, table D.1."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n"
+" REF: Pages 59-60, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** Bad PSVersion - not \"(string) int\".\n"
+" REF: Pages 62-64, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** Bad Product - not \"(string)\".\n"
+" REF: Page 62, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** Bad ShortNickName - longer than 31 chars.\n"
+" REF: Pages 64-65, section 5.3."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Bad option %s choice %s\n"
+" REF: Page 84, section 5.9"
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Default option code cannot be interpreted: %s"
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Default translation string for option %s choice %s contains "
+"8-bit characters."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** Default translation string for option %s contains 8-bit "
+"characters."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Group names %s and %s differ only by case."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Multiple occurrences of option %s choice name %s."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Option %s choice names %s and %s differ only by case."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Option names %s and %s differ only by case."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED Default%s\n"
+" REF: Page 40, section 4.5."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED DefaultImageableArea\n"
+" REF: Page 102, section 5.15."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED DefaultPaperDimension\n"
+" REF: Page 103, section 5.15."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED FileVersion\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED FormatVersion\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 102, section 5.15."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED LanguageEncoding\n"
+" REF: Pages 56-57, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED LanguageVersion\n"
+" REF: Pages 57-58, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED Manufacturer\n"
+" REF: Pages 58-59, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED ModelName\n"
+" REF: Pages 59-60, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED NickName\n"
+" REF: Page 60, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED PCFileName\n"
+" REF: Pages 61-62, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED PSVersion\n"
+" REF: Pages 62-64, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED PageRegion\n"
+" REF: Page 100, section 5.14."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 99, section 5.14."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Pages 99-100, section 5.14."
+msgstr ""
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 103, section 5.15."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED Product\n"
+" REF: Page 62, section 5.3."
+msgstr ""
+
+msgid ""
+" **FAIL** REQUIRED ShortNickName\n"
+" REF: Page 64-65, section 5.3."
+msgstr ""
+
+#, c-format
+msgid " **FAIL** Unable to open PPD file - %s on line %d."
+msgstr ""
+
+#, c-format
+msgid " %d ERRORS FOUND"
+msgstr ""
+
+msgid " -h Show program usage"
+msgstr ""
+
+#, c-format
+msgid ""
+" Bad %%%%BoundingBox: on line %d.\n"
+" REF: Page 39, %%%%BoundingBox:"
+msgstr ""
+
+#, c-format
+msgid ""
+" Bad %%%%Page: on line %d.\n"
+" REF: Page 53, %%%%Page:"
+msgstr ""
+
+#, c-format
+msgid ""
+" Bad %%%%Pages: on line %d.\n"
+" REF: Page 43, %%%%Pages:"
+msgstr ""
+
+#, c-format
+msgid ""
+" Line %d is longer than 255 characters (%d).\n"
+" REF: Page 25, Line Length"
+msgstr ""
+
+msgid ""
+" Missing %!PS-Adobe-3.0 on first line.\n"
+" REF: Page 17, 3.1 Conforming Documents"
+msgstr ""
+
+#, c-format
+msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments"
+msgstr ""
+
+#, c-format
+msgid ""
+" Missing or bad %%BoundingBox: comment.\n"
+" REF: Page 39, %%BoundingBox:"
+msgstr ""
+
+#, c-format
+msgid ""
+" Missing or bad %%Page: comments.\n"
+" REF: Page 53, %%Page:"
+msgstr ""
+
+#, c-format
+msgid ""
+" Missing or bad %%Pages: comment.\n"
+" REF: Page 43, %%Pages:"
+msgstr ""
+
+msgid " NO ERRORS FOUND"
+msgstr " KEINE FEHLER GEFUNDEN"
+
+#, c-format
+msgid " Saw %d lines that exceeded 255 characters."
+msgstr ""
+
+#, c-format
+msgid " Too many %%BeginDocument comments."
+msgstr ""
+
+#, c-format
+msgid " Too many %%EndDocument comments."
+msgstr ""
+
+msgid " Warning: file contains binary data."
+msgstr ""
+
+#, c-format
+msgid " Warning: no %%EndComments comment in file."
+msgstr ""
+
+#, c-format
+msgid " Warning: obsolete DSC version %.1f in file."
+msgstr ""
+
+msgid " ! expression Unary NOT of expression."
+msgstr ""
+
+msgid " ( expressions ) Group expressions."
+msgstr ""
+
+msgid " --[no-]debug-logging Turn debug logging on/off."
+msgstr ""
+
+msgid " --[no-]remote-admin Turn remote administration on/off."
+msgstr " --[no-]remote-admin Fernadministrierung ein/ausschalten."
+
+msgid " --[no-]remote-any Allow/prevent access from the Internet."
+msgstr " --[no-]remote-any Erlaube/sperre zugriff über das Internet."
+
+msgid " --[no-]share-printers Turn printer sharing on/off."
+msgstr " --[no-]share-printers Druckerfreigabe ein/aus."
+
+msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job."
+msgstr ""
+" --[no-]user-cancel-any Erlaube/sperre Benutzern das abbrechen eines "
+"Druckauftrags."
+
+msgid " --cr End lines with CR (Mac OS 9)."
+msgstr " --cr Zeilenenden mit CR (OS 9)"
+
+msgid " --crlf End lines with CR + LF (Windows)."
+msgstr " --crlf Zeilenenden mit CR+LF (Windows)"
+
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+" --domain regex Prüfe auf Übereinstimmung mit Regulärem Ausdruck"
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+msgid " --false Always false."
+msgstr ""
+
+msgid " --help Show help."
+msgstr " --help Zeige Hilfe."
+
+msgid " --help Show this help."
+msgstr " --help Zeige diese Hilfe."
+
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+" --host regex Prüfe den Hostnamen auf Übereinstimmung mit "
+"Regulärem Audruck"
+
+msgid " --lf End lines with LF (UNIX/Linux/OS X)."
+msgstr " --lf Zeilenenden mit LF (UNIX/Linux/OS X)"
+
+msgid " --list-filters List filters that will be used."
+msgstr " --list-filters Liste die Filter auf die benutzt werden."
+
+msgid " --local True if service is local."
+msgstr " --local Wahr wenn der Dienst lokal ist."
+
+msgid " --ls List attributes."
+msgstr " --ls Liste Attribute auf."
+
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+
+msgid " --not expression Unary NOT of expression."
+msgstr ""
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+
+msgid " --print Print URI if true."
+msgstr ""
+
+msgid " --print-name Print service name if true."
+msgstr ""
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+
+msgid " --remote True if service is remote."
+msgstr ""
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+
+msgid " --true Always true."
+msgstr ""
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr ""
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+
+msgid " --version Show program version."
+msgstr ""
+
+msgid " --version Show version."
+msgstr ""
+
+msgid " -4 Connect using IPv4."
+msgstr ""
+
+msgid " -6 Connect using IPv6."
+msgstr ""
+
+msgid " -C Send requests using chunking (default)."
+msgstr ""
+
+msgid " -D Remove the input file when finished."
+msgstr ""
+
+msgid " -D name=value Set named variable to value."
+msgstr ""
+
+msgid " -E Encrypt the connection."
+msgstr " -E Verschlüssele die Verbindung."
+
+msgid " -E Test with HTTP Upgrade to TLS."
+msgstr " -E Teste mit HTTP Upgrade auf TLS."
+
+msgid ""
+" -F Run in the foreground but detach from console."
+msgstr ""
+" -F Laufe im Vordergrund aber abgetrennt von der "
+"Konsole."
+
+msgid " -H samba-server Use the named SAMBA server."
+msgstr " -H samba-server Benutze den SAMBA Server."
+
+msgid " -I Ignore errors."
+msgstr " -I Ignoriere Fehler."
+
+msgid " -I include-dir Add include directory to search path."
+msgstr ""
+
+msgid " -I {filename,filters,none,profiles}"
+msgstr ""
+
+msgid " -L Send requests using content-length."
+msgstr ""
+
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
+msgid " -P filename.ppd Set PPD file."
+msgstr " -P filename.ppd Lege PPD Datei fest."
+
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+
+msgid " -R root-directory Set alternate root."
+msgstr ""
+
+msgid " -S Test with SSL encryption."
+msgstr " -S Teste mit SSL Verschlüsselung."
+
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr ""
+" -T seconds Setze die Zeitüberschreitung für das Browsen in "
+"Sekunden."
+
+msgid " -T seconds Set the receive/send timeout in seconds."
+msgstr ""
+" -T seconds Setze die Zeitüberschreitung für das Senden/"
+"Empfangen in Sekunden."
+
+msgid " -U username Specify username."
+msgstr " -U username Gebe den Benutzernamen an."
+
+msgid " -V version Set default IPP version."
+msgstr " -V version Setze die Voreingestellte IPP Version."
+
+msgid ""
+" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
+msgstr ""
+
+msgid " -X Produce XML plist instead of plain text."
+msgstr " -X Erzeuge XML-Ausgaben anstatt von Text."
+
+msgid " -a Browse for all services."
+msgstr " -a Browse für alle Dienste."
+
+msgid " -a Export all printers."
+msgstr " -a Exportiere alle Drucker."
+
+msgid " -c Produce CSV output."
+msgstr " -c Erzeuge CSV Ausgabe."
+
+msgid " -c catalog.po Load the specified message catalog."
+msgstr ""
+
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr ""
+" -c cups-files.conf Setze die zu benutzende Datei cups-files.conf"
+
+msgid " -c cupsd.conf Set cupsd.conf file to use."
+msgstr " -c cups.conf Setze die zu benutzende Datei cups.conf"
+
+msgid " -d domain Browse/resolve in specified domain."
+msgstr " -d domain Browse/löse auf in der angegebenen Domäne."
+
+msgid " -d name=value Set named variable to value."
+msgstr ""
+
+msgid " -d output-dir Specify the output directory."
+msgstr ""
+
+msgid " -d printer Use the named printer."
+msgstr " -d printer Benutze den genannten Drucker."
+
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+
+msgid " -e Use every filter from the PPD file."
+msgstr ""
+
+msgid " -f Run in the foreground."
+msgstr " -f Laufe im Vordergrund."
+
+msgid " -f filename Set default request filename."
+msgstr ""
+
+msgid " -h Show this usage message."
+msgstr ""
+
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+
+msgid " -h server[:port] Specify server address."
+msgstr " -h server[:port] Spezifiziere die Server-Adresse."
+
+msgid " -i mime/type Set input MIME type (otherwise auto-typed)."
+msgstr ""
+
+msgid ""
+" -i seconds Repeat the last file with the given time interval."
+msgstr ""
+
+msgid ""
+" -j job-id[,N] Filter file N from the specified job (default is "
+"file 1)."
+msgstr ""
+
+msgid " -l List attributes."
+msgstr ""
+
+msgid " -l Produce plain text output."
+msgstr ""
+
+msgid " -l Run cupsd on demand."
+msgstr ""
+
+msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
+msgstr ""
+
+msgid " -m Use the ModelName value as the filename."
+msgstr ""
+
+msgid ""
+" -m mime/type Set output MIME type (otherwise application/pdf)."
+msgstr ""
+
+msgid " -n copies Set number of copies."
+msgstr " -n copies Lege die Anzahl der Kopien fest."
+
+msgid ""
+" -n count Repeat the last file the given number of times."
+msgstr ""
+
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+
+msgid ""
+" -o filename.drv Set driver information file (otherwise ppdi.drv)."
+msgstr ""
+
+msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)."
+msgstr ""
+
+msgid " -o name=value Set option(s)."
+msgstr ""
+
+msgid " -p Print URI if true."
+msgstr ""
+
+msgid " -p filename.ppd Set PPD file."
+msgstr ""
+
+msgid " -p program Run specified program for each service."
+msgstr ""
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+
+msgid " -q Run silently."
+msgstr ""
+
+msgid " -r True if service is remote."
+msgstr ""
+
+msgid " -r Use 'relaxed' open mode."
+msgstr ""
+
+msgid " -s Print service name if true."
+msgstr ""
+
+msgid " -t Produce a test report."
+msgstr ""
+
+msgid " -t Test PPDs instead of generating them."
+msgstr ""
+
+msgid " -t Test the configuration file."
+msgstr ""
+
+msgid " -t key True if the TXT record contains the key."
+msgstr ""
+
+msgid " -t title Set title."
+msgstr ""
+
+msgid " -t type Browse/resolve with specified type."
+msgstr ""
+
+msgid " -u Remove the PPD file when finished."
+msgstr ""
+
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+
+msgid " -v Be verbose."
+msgstr " -v Sei ausführlich."
+
+msgid " -vv Be very verbose."
+msgstr " -vv Sei sehr ausführlich."
+
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+msgid " -z Compress PPD files using GNU zip."
+msgstr ""
+" -z Komprimiere PPD Datei unter Verwendung von GNU zip."
+
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr ""
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr ""
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr ""
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+
+msgid " expression expression Logical AND."
+msgstr ""
+
+msgid " {service_domain} Domain name"
+msgstr ""
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr ""
+
+msgid " {service_name} Service instance name"
+msgstr ""
+
+msgid " {service_port} Port number"
+msgstr ""
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr ""
+
+msgid " {service_scheme} URI scheme"
+msgstr ""
+
+msgid " {service_uri} URI"
+msgstr ""
+
+msgid " {txt_*} Value of TXT record key"
+msgstr ""
+
+msgid " {} URI"
+msgstr ""
+
+msgid " FAIL"
+msgstr ""
+
+msgid " PASS"
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
+msgstr ""
+
+#, c-format
+msgid "%d x %d mm"
+msgstr "%d×%d mm"
+
+#, c-format
+msgid "%g x %g"
+msgstr "%g×%g"
+
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr "%s (%s, %s)"
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr "%s (Randlos)"
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr "%s (Randlos, %s)"
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr "%s (Randlos, %s, %s)"
+
+#, c-format
+msgid "%s accepting requests since %s"
+msgstr "%s akzeptiert anfragen seit %s"
+
+#, c-format
+msgid "%s cannot be changed."
+msgstr "%s kann nicht geändert werden."
+
+#, c-format
+msgid "%s is not implemented by the CUPS version of lpc."
+msgstr ""
+
+#, c-format
+msgid "%s is not ready"
+msgstr "%s ist nicht bereit"
+
+#, c-format
+msgid "%s is ready"
+msgstr "%s ist bereit"
+
+#, c-format
+msgid "%s is ready and printing"
+msgstr "%s ist bereit und druckt"
+
+#, c-format
+msgid "%s job-id user title copies options [file]"
+msgstr ""
+
+#, c-format
+msgid "%s not accepting requests since %s -"
+msgstr ""
+
+#, c-format
+msgid "%s not supported."
+msgstr "%s nicht unterstützt."
+
+#, c-format
+msgid "%s/%s accepting requests since %s"
+msgstr ""
+
+#, c-format
+msgid "%s/%s not accepting requests since %s -"
+msgstr ""
+
+#, c-format
+msgid "%s: %-33.33s [job %d localhost]"
+msgstr ""
+
+#. TRANSLATORS: Message is "subject: error"
+#, c-format
+msgid "%s: %s"
+msgstr ""
+
+#, c-format
+msgid "%s: %s failed: %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Don't know what to do."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s: Error - %s environment variable names non-existent destination \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - add '/version=1.1' to server name."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - bad job ID."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - cannot print files and alter jobs simultaneously."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected character set after \"-S\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected content type after \"-T\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected copies after \"-#\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected copies after \"-n\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected destination after \"-P\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected destination after \"-d\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected form after \"-f\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected hold name after \"-H\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected hostname after \"-H\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected hostname after \"-h\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected mode list after \"-y\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected name after \"-%c\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected option=value after \"-o\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected page list after \"-P\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected priority after \"-%c\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected reason text after \"-r\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected title after \"-t\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected username after \"-U\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected username after \"-u\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - expected value after \"-%c\" option."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" "
+"option."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - no default destination available."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - priority must be between 1 and 100."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - scheduler not responding."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - too many files - \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - unable to access \"%s\" - %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Error - unable to queue from stdin - %s."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s/%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - unknown option \"%c\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Error - unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Expected job ID after \"-i\" option."
+msgstr ""
+
+#, c-format
+msgid "%s: Invalid destination name in list \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Invalid filter string \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
+msgstr ""
+
+#, c-format
+msgid "%s: No filter to convert from %s/%s to %s/%s."
+msgstr ""
+
+#, c-format
+msgid "%s: Operation failed: %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Sorry, no encryption support."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to connect to server."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to contact server."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to determine MIME type of \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to open %s: %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to open PPD file: %s on line %d."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown destination \"%s\"."
+msgstr "%s: Unbekanntes Druckziel \"%s\"."
+
+#, c-format
+msgid "%s: Unknown destination MIME type %s/%s."
+msgstr "%s: Unbekannte Ziel-MIME-Type %s/%s."
+
+#, c-format
+msgid "%s: Unknown option \"%c\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown source MIME type %s/%s."
+msgstr "%s: Unbekannte Quell-MIME-Type %s/%s."
+
+#, c-format
+msgid ""
+"%s: Warning - \"%c\" format modifier not supported - output may not be "
+"correct."
+msgstr ""
+
+#, c-format
+msgid "%s: Warning - character set option ignored."
+msgstr ""
+
+#, c-format
+msgid "%s: Warning - content type option ignored."
+msgstr ""
+
+#, c-format
+msgid "%s: Warning - form option ignored."
+msgstr ""
+
+#, c-format
+msgid "%s: Warning - mode option ignored."
+msgstr ""
+
+msgid "-1"
+msgstr "-1"
+
+msgid "-10"
+msgstr "-10"
+
+msgid "-100"
+msgstr "-100"
+
+msgid "-105"
+msgstr "-105"
+
+msgid "-11"
+msgstr "-11"
+
+msgid "-110"
+msgstr "-110"
+
+msgid "-115"
+msgstr "-115"
+
+msgid "-12"
+msgstr "-12"
+
+msgid "-120"
+msgstr "-120"
+
+msgid "-13"
+msgstr "-13"
+
+msgid "-14"
+msgstr "-14"
+
+msgid "-15"
+msgstr "-15"
+
+msgid "-2"
+msgstr "-2"
+
+msgid "-20"
+msgstr "-20"
+
+msgid "-25"
+msgstr "-25"
+
+msgid "-3"
+msgstr "-3"
+
+msgid "-30"
+msgstr "-30"
+
+msgid "-35"
+msgstr "-35"
+
+msgid "-4"
+msgstr "-4"
+
+msgid "-40"
+msgstr "-40"
+
+msgid "-45"
+msgstr "-45"
+
+msgid "-5"
+msgstr "-5"
+
+msgid "-50"
+msgstr "-50"
+
+msgid "-55"
+msgstr "-55"
+
+msgid "-6"
+msgstr "-6"
+
+msgid "-60"
+msgstr "-60"
+
+msgid "-65"
+msgstr "-65"
+
+msgid "-7"
+msgstr "-7"
+
+msgid "-70"
+msgstr "-70"
+
+msgid "-75"
+msgstr "-75"
+
+msgid "-8"
+msgstr "-8"
+
+msgid "-80"
+msgstr "-80"
+
+msgid "-85"
+msgstr "-85"
+
+msgid "-9"
+msgstr "-9"
+
+msgid "-90"
+msgstr "-90"
+
+msgid "-95"
+msgstr "-95"
+
+msgid "0"
+msgstr "0"
+
+msgid "1"
+msgstr "1"
+
+msgid "1 inch/sec."
+msgstr "1 inch/s"
+
+# Die Verwendung des x ist nur ersatzweise erlaubt, typografisch korrekt und in UTF-8 auch möglich ist ×
+# Keine Leerzeichen zwischen Zahl und ×!
+# Die Verwendung von " für die Einheit Inch ist nicht zulässig (ISO 80000).
+# Die Bezeichnung "Zoll" ist nicht korrekt.
+msgid "1.25x0.25\""
+msgstr "1,25×0,25 inch"
+
+msgid "1.25x2.25\""
+msgstr "1,25×2,25 inch"
+
+msgid "1.5 inch/sec."
+msgstr "1,5 inch/s"
+
+msgid "1.50x0.25\""
+msgstr "1,50×0,25 inch"
+
+msgid "1.50x0.50\""
+msgstr "1,50×0,50 inch"
+
+msgid "1.50x1.00\""
+msgstr "1,50×1,00 inch"
+
+msgid "1.50x2.00\""
+msgstr "1,50×2,00 inch"
+
+msgid "10"
+msgstr "10"
+
+# Die SI Einheit Sekunde wird korrekt nur mit s abgekürzt (ISO 31), (sek ist nicht zulässig)
+msgid "10 inches/sec."
+msgstr "10 inch/s"
+
+msgid "10 x 11"
+msgstr ""
+
+msgid "10 x 13"
+msgstr ""
+
+msgid "10 x 14"
+msgstr ""
+
+msgid "100"
+msgstr "100"
+
+msgid "100 mm/sec."
+msgstr "100 mm/s"
+
+msgid "105"
+msgstr "105"
+
+msgid "11"
+msgstr "11"
+
+msgid "11 inches/sec."
+msgstr "11 inch/s"
+
+msgid "110"
+msgstr "110"
+
+msgid "115"
+msgstr "115"
+
+msgid "12"
+msgstr "12"
+
+msgid "12 inches/sec."
+msgstr "12 inch/s"
+
+msgid "12 x 11"
+msgstr ""
+
+msgid "120"
+msgstr "120"
+
+msgid "120 mm/sec."
+msgstr "120 mm/s"
+
+msgid "120x60dpi"
+msgstr "120×60 dpi"
+
+msgid "120x72dpi"
+msgstr "120×72 dpi"
+
+msgid "13"
+msgstr "13"
+
+msgid "136dpi"
+msgstr "136 dpi"
+
+msgid "14"
+msgstr "14"
+
+msgid "15"
+msgstr "15"
+
+msgid "15 mm/sec."
+msgstr "15 mm/s"
+
+msgid "15 x 11"
+msgstr ""
+
+msgid "150 mm/sec."
+msgstr "150 mm/s"
+
+msgid "150dpi"
+msgstr "150 dpi"
+
+msgid "16"
+msgstr "16"
+
+msgid "17"
+msgstr "17"
+
+msgid "18"
+msgstr "18"
+
+msgid "180dpi"
+msgstr "180 dpi"
+
+msgid "19"
+msgstr "19"
+
+msgid "2"
+msgstr "2"
+
+msgid "2 inches/sec."
+msgstr "2 inch/s"
+
+msgid "2-Sided Printing"
+msgstr "Doppelseitig drucken"
+
+msgid "2.00x0.37\""
+msgstr "2,00×0,37 inch"
+
+msgid "2.00x0.50\""
+msgstr "2,00×0,50 inch"
+
+msgid "2.00x1.00\""
+msgstr "2,00×1,00 inch"
+
+msgid "2.00x1.25\""
+msgstr "2,00×1,25 inch"
+
+msgid "2.00x2.00\""
+msgstr "2,00×2,00 inch"
+
+msgid "2.00x3.00\""
+msgstr "2,00×3,00 inch"
+
+msgid "2.00x4.00\""
+msgstr "2,00×4,00 inch"
+
+msgid "2.00x5.50\""
+msgstr "2,00×5,50 inch"
+
+msgid "2.25x0.50\""
+msgstr "2,25×0,50 inch"
+
+msgid "2.25x1.25\""
+msgstr "2,25×1,25 inch"
+
+msgid "2.25x4.00\""
+msgstr "2,25×4,00 inch"
+
+msgid "2.25x5.50\""
+msgstr "2,25×5,50 inch"
+
+msgid "2.38x5.50\""
+msgstr "2,38×5,50 inch"
+
+msgid "2.5 inches/sec."
+msgstr "2,5 inch/s"
+
+msgid "2.50x1.00\""
+msgstr "2,50×1,00 inch"
+
+msgid "2.50x2.00\""
+msgstr "2,50×2,00 inch"
+
+msgid "2.75x1.25\""
+msgstr "2,75×1,25 inch"
+
+msgid "2.9 x 1\""
+msgstr "2.9×1 inch"
+
+msgid "20"
+msgstr "20"
+
+msgid "20 mm/sec."
+msgstr "20 mm/s"
+
+msgid "200 mm/sec."
+msgstr "200 mm/s"
+
+msgid "203dpi"
+msgstr "203 dpi"
+
+msgid "21"
+msgstr "21"
+
+msgid "22"
+msgstr "22"
+
+msgid "23"
+msgstr "23"
+
+msgid "24"
+msgstr "24"
+
+msgid "24-Pin Series"
+msgstr "24-Pin Serie"
+
+msgid "240x72dpi"
+msgstr "240×72 dpi"
+
+msgid "25"
+msgstr "25"
+
+msgid "250 mm/sec."
+msgstr "250 mm/s"
+
+msgid "26"
+msgstr "26"
+
+msgid "27"
+msgstr "27"
+
+msgid "28"
+msgstr "28"
+
+msgid "29"
+msgstr "29"
+
+msgid "3"
+msgstr "3"
+
+msgid "3 inches/sec."
+msgstr "3 inch/s"
+
+msgid "3 x 5"
+msgstr ""
+
+msgid "3.00x1.00\""
+msgstr "3,00×1,00inch"
+
+msgid "3.00x1.25\""
+msgstr "3,00×1,25 inch"
+
+msgid "3.00x2.00\""
+msgstr "3,00×2,00 inch"
+
+msgid "3.00x3.00\""
+msgstr "3,00×3,00 inch"
+
+msgid "3.00x5.00\""
+msgstr "3,00×5,00 inch"
+
+msgid "3.25x2.00\""
+msgstr "3,25×2,00 inch"
+
+msgid "3.25x5.00\""
+msgstr "3,25×5,00 inch"
+
+msgid "3.25x5.50\""
+msgstr "3,25×5,50 inch"
+
+msgid "3.25x5.83\""
+msgstr "3,25×5,83 inch"
+
+msgid "3.25x7.83\""
+msgstr "3,25×7,83 inch"
+
+msgid "3.5 x 5"
+msgstr ""
+
+msgid "3.5\" Disk"
+msgstr "3,5 inch Disk"
+
+msgid "3.50x1.00\""
+msgstr "3,50×1,00 inch"
+
+msgid "30"
+msgstr "30"
+
+msgid "30 mm/sec."
+msgstr "30 mm/s"
+
+msgid "300 mm/sec."
+msgstr "300 mm/s"
+
+msgid "300dpi"
+msgstr "300 dpi"
+
+msgid "35"
+msgstr "35"
+
+msgid "360dpi"
+msgstr "360 dpi"
+
+msgid "360x180dpi"
+msgstr "360×180 dpi"
+
+msgid "4"
+msgstr "4"
+
+msgid "4 inches/sec."
+msgstr "4 inch/s"
+
+msgid "4.00x1.00\""
+msgstr "4,00×1,00 inch"
+
+msgid "4.00x13.00\""
+msgstr "4,00×13,00 inch"
+
+msgid "4.00x2.00\""
+msgstr "4,00×2,00 inch"
+
+msgid "4.00x2.50\""
+msgstr "4,00×2,50 inch"
+
+msgid "4.00x3.00\""
+msgstr "4,00×3,00 inch"
+
+msgid "4.00x4.00\""
+msgstr "4,00×4,00 inch"
+
+msgid "4.00x5.00\""
+msgstr "4,00×5,00 inch"
+
+msgid "4.00x6.00\""
+msgstr "4,00×6,00 inch"
+
+msgid "4.00x6.50\""
+msgstr "4,00×6,50 inch"
+
+msgid "40"
+msgstr "40"
+
+msgid "40 mm/sec."
+msgstr "40 mm/s"
+
+msgid "45"
+msgstr "45"
+
+msgid "5"
+msgstr "5"
+
+msgid "5 inches/sec."
+msgstr "5 inch/s"
+
+msgid "5 x 7"
+msgstr ""
+
+msgid "50"
+msgstr "50"
+
+msgid "55"
+msgstr "55"
+
+msgid "6"
+msgstr "6"
+
+msgid "6 inches/sec."
+msgstr "6 inch/s"
+
+msgid "6.00x1.00\""
+msgstr "6,00×1,00 inch"
+
+msgid "6.00x2.00\""
+msgstr "6,00×2,00 inch"
+
+msgid "6.00x3.00\""
+msgstr "6,00×3,00 inch"
+
+msgid "6.00x4.00\""
+msgstr "6,00×4,00 inch"
+
+msgid "6.00x5.00\""
+msgstr "6,00×5,00 inch"
+
+msgid "6.00x6.00\""
+msgstr "6,00×6,00 inch"
+
+msgid "6.00x6.50\""
+msgstr "6,00×6,50 inch"
+
+msgid "60"
+msgstr "60"
+
+msgid "60 mm/sec."
+msgstr "60 mm/s"
+
+msgid "600dpi"
+msgstr "600 dpi"
+
+msgid "60dpi"
+msgstr "60 dpi"
+
+msgid "60x72dpi"
+msgstr ""
+
+msgid "65"
+msgstr "65"
+
+msgid "7"
+msgstr "7"
+
+msgid "7 inches/sec."
+msgstr "7 inch/s"
+
+msgid "7 x 9"
+msgstr ""
+
+msgid "70"
+msgstr "70"
+
+msgid "75"
+msgstr "75"
+
+msgid "8"
+msgstr "8"
+
+msgid "8 inches/sec."
+msgstr "8 inch/s"
+
+msgid "8 x 10"
+msgstr ""
+
+msgid "8.00x1.00\""
+msgstr "8,00×1,00 inch"
+
+msgid "8.00x2.00\""
+msgstr "8,00×2,00 inch"
+
+msgid "8.00x3.00\""
+msgstr "8,00×3,00 inch"
+
+msgid "8.00x4.00\""
+msgstr "8,00×4,00 inch"
+
+msgid "8.00x5.00\""
+msgstr "8,00×5,00 inch"
+
+msgid "8.00x6.00\""
+msgstr "8,00×6,00 inch"
+
+msgid "8.00x6.50\""
+msgstr "8,00×6,50 inch"
+
+msgid "80"
+msgstr "80"
+
+msgid "80 mm/sec."
+msgstr "80 mm/s"
+
+msgid "85"
+msgstr "85"
+
+msgid "9"
+msgstr "9"
+
+msgid "9 inches/sec."
+msgstr "9 inch/s"
+
+msgid "9 x 11"
+msgstr "9×12"
+
+msgid "9 x 12"
+msgstr "9×12"
+
+msgid "9-Pin Series"
+msgstr "9-Pin Serie"
+
+msgid "90"
+msgstr "90"
+
+msgid "95"
+msgstr "95"
+
+msgid "?Invalid help command unknown."
+msgstr ""
+
+msgid "A Samba password is required to export printer drivers"
+msgstr ""
+
+msgid "A Samba username is required to export printer drivers"
+msgstr ""
+
+#, c-format
+msgid "A class named \"%s\" already exists."
+msgstr "Eine Klasse mit dem Namen \"%s\" existiert bereits."
+
+#, c-format
+msgid "A printer named \"%s\" already exists."
+msgstr "Ein Drucker mit dem Namen \"%s\" existiert bereits."
+
+msgid "A0"
+msgstr "DIN A0"
+
+msgid "A0 Long Edge"
+msgstr "A0 lange Kante"
+
+msgid "A1"
+msgstr "DIN A1"
+
+msgid "A1 Long Edge"
+msgstr "A1 lange Kante"
+
+msgid "A10"
+msgstr "DIN A10"
+
+msgid "A2"
+msgstr "DIN A2"
+
+msgid "A2 Long Edge"
+msgstr "A2 lange Kante"
+
+msgid "A3"
+msgstr "DIN A3"
+
+msgid "A3 Long Edge"
+msgstr "A3 lange Kante"
+
+msgid "A3 Oversize"
+msgstr "A3 Übergrösse"
+
+msgid "A3 Oversize Long Edge"
+msgstr "A3 Übergrösse lange Kante"
+
+msgid "A4"
+msgstr "DIN A4"
+
+msgid "A4 Long Edge"
+msgstr "A4 lange Kante"
+
+msgid "A4 Oversize"
+msgstr "A4 Übergrösse"
+
+msgid "A4 Small"
+msgstr "A4 klein"
+
+msgid "A5"
+msgstr "DIN A5"
+
+msgid "A5 Long Edge"
+msgstr ""
+
+msgid "A5 Oversize"
+msgstr "A5 Übergrösse"
+
+msgid "A6"
+msgstr "DIN A6"
+
+msgid "A6 Long Edge"
+msgstr "A6 lange Kante"
+
+msgid "A7"
+msgstr "DIN A7"
+
+msgid "A8"
+msgstr "DIN A8"
+
+msgid "A9"
+msgstr "DIN A9"
+
+msgid "ANSI A"
+msgstr "ANSI A"
+
+msgid "ANSI B"
+msgstr "ANSI B"
+
+msgid "ANSI C"
+msgstr "ANSI C"
+
+msgid "ANSI D"
+msgstr "ANSI D"
+
+msgid "ANSI E"
+msgstr "ANSI E"
+
+msgid "ARCH C"
+msgstr "ARCH C"
+
+msgid "ARCH C Long Edge"
+msgstr ""
+
+msgid "ARCH D"
+msgstr "ARCH D"
+
+msgid "ARCH D Long Edge"
+msgstr ""
+
+msgid "ARCH E"
+msgstr "ARCH E"
+
+msgid "ARCH E Long Edge"
+msgstr ""
+
+msgid "Accept Jobs"
+msgstr "Druckaufträge akzeptieren"
+
+msgid "Accepted"
+msgstr "Akzeptiert"
+
+msgid "Add Class"
+msgstr "Klasse hinzufügen"
+
+msgid "Add Printer"
+msgstr "Drucker hinzufügen"
+
+msgid "Add RSS Subscription"
+msgstr "RSS-Abo hinzufügen"
+
+msgid "Address"
+msgstr "Adresse"
+
+msgid "Administration"
+msgstr "Verwaltung"
+
+msgid "Always"
+msgstr "Immer"
+
+msgid "AppSocket/HP JetDirect"
+msgstr "AppSocket/HP JetDirect"
+
+msgid "Applicator"
+msgstr "Applicator"
+
+#, c-format
+msgid "Attempt to set %s printer-state to bad value %d."
+msgstr "Versuch den %s Druckerstatus auf einen ungültigen %d Wert zu setzen."
+
+#, c-format
+msgid "Attribute groups are out of order (%x < %x)."
+msgstr "Attributgruppen sind nicht in der Reihenfolge (%x < %x)"
+
+msgid "B0"
+msgstr "DIN B0"
+
+msgid "B1"
+msgstr "DIN B1"
+
+msgid "B10"
+msgstr "DIN B10"
+
+msgid "B2"
+msgstr "DIN B2"
+
+msgid "B3"
+msgstr "DIN B3"
+
+msgid "B4"
+msgstr "DIN B4"
+
+msgid "B5"
+msgstr "DIN B5"
+
+msgid "B5 Oversize"
+msgstr ""
+
+msgid "B6"
+msgstr "DIN B6"
+
+msgid "B7"
+msgstr "DIN B7"
+
+msgid "B8"
+msgstr "DIN B8"
+
+msgid "B9"
+msgstr "DIN B9"
+
+#, c-format
+msgid "Bad 'document-format' value \"%s\"."
+msgstr ""
+
+msgid "Bad NULL dests pointer"
+msgstr "Ungültiger NULL-Dests-Pointer"
+
+msgid "Bad OpenGroup"
+msgstr "Ungültige OpenGroup"
+
+msgid "Bad OpenUI/JCLOpenUI"
+msgstr "Ungültig OpenUI/JCLOpenUI"
+
+msgid "Bad OrderDependency"
+msgstr "Ungültige Abhängigkeit"
+
+msgid "Bad PPD cache file."
+msgstr "Ungültige PPD Cache Datei."
+
+msgid "Bad Request"
+msgstr "Ungültige Anfrage"
+
+msgid "Bad SNMP version number"
+msgstr "Ungültige SNMP-Versiosnummer"
+
+msgid "Bad UIConstraints"
+msgstr "Ungültige UIConstraints"
+
+msgid "Bad arguments to function"
+msgstr "Ungültige Argumente für Funktion"
+
+#, c-format
+msgid "Bad copies value %d."
+msgstr "Ungültige Angabe der Anzahl der Kopien %d."
+
+msgid "Bad custom parameter"
+msgstr "Ungültiger angepasster Parameter"
+
+#, c-format
+msgid "Bad device-uri \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad device-uri scheme \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad document-format \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad document-format-default \"%s\"."
+msgstr ""
+
+msgid "Bad filename buffer"
+msgstr ""
+
+msgid "Bad hostname/address in URI"
+msgstr "Ungültiger Hostname/Adresse in URI"
+
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Ungültiger Auftragsname: %s"
+
+msgid "Bad job-name value: Wrong type or count."
+msgstr "Ungültiger Auftragsname: Falscher Typ oder Anzahl."
+
+msgid "Bad job-priority value."
+msgstr "Ungültiger Wert für Auftragspriorität."
+
+#, c-format
+msgid "Bad job-sheets value \"%s\"."
+msgstr ""
+
+msgid "Bad job-sheets value type."
+msgstr ""
+
+msgid "Bad job-state value."
+msgstr ""
+
+#, c-format
+msgid "Bad job-uri \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad notify-pull-method \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad notify-recipient-uri \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad number-up value %d."
+msgstr "Ungültiger Number-Up-Wert „%d“."
+
+#, c-format
+msgid "Bad option + choice on line %d."
+msgstr ""
+
+#, c-format
+msgid "Bad page-ranges values %d-%d."
+msgstr "Ungültige Seitenbereichswerte %d–%d."
+
+msgid "Bad port number in URI"
+msgstr "Ungültige Port-Nummer in URI"
+
+#, c-format
+msgid "Bad port-monitor \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Bad printer-state value %d."
+msgstr ""
+
+msgid "Bad printer-uri."
+msgstr "Ungültige Drucker-uri"
+
+#, c-format
+msgid "Bad request ID %d."
+msgstr ""
+
+#, c-format
+msgid "Bad request version number %d.%d."
+msgstr ""
+
+msgid "Bad resource in URI"
+msgstr "Ungültige Resource in URI"
+
+msgid "Bad scheme in URI"
+msgstr "Ungültiges Scheman in URI"
+
+msgid "Bad subscription ID"
+msgstr "Ungültige Subskriptions-ID"
+
+msgid "Bad username in URI"
+msgstr "Ungültiger Benutzername in URI"
+
+msgid "Bad value string"
+msgstr "Ungültiger Zeichenkette"
+
+msgid "Bad/empty URI"
+msgstr "Ungültige/leere URI"
+
+msgid "Banners"
+msgstr "Banner"
+
+msgid "Bond Paper"
+msgstr "Papier bündeln"
+
+#, c-format
+msgid "Boolean expected for waiteof option \"%s\"."
+msgstr ""
+
+msgid "Buffer overflow detected, aborting."
+msgstr "Pufferüberlauf festgestellt, Abbruch."
+
+msgid "CMYK"
+msgstr "CMYK"
+
+msgid "CPCL Label Printer"
+msgstr "CPCL Etikettendrucker"
+
+msgid "Cancel Jobs"
+msgstr "Druckaufträge abbrechen"
+
+msgid "Cancel RSS Subscription"
+msgstr "RSS-Abo widerrufen"
+
+msgid "Canceling print job."
+msgstr "Auftrag wird abgebrochen."
+
+msgid "Cannot share a remote Kerberized printer."
+msgstr ""
+
+msgid "Cassette"
+msgstr "Kasette"
+
+msgid "Change Settings"
+msgstr "Einstellungen ändern"
+
+#, c-format
+msgid "Character set \"%s\" not supported."
+msgstr "Zeichensatz \"%s\" nicht unterstützt."
+
+msgid "Classes"
+msgstr "Klassen"
+
+msgid "Clean Print Heads"
+msgstr "Saubere Druckköpfe"
+
+msgid "Close-Job doesn't support the job-uri attribute."
+msgstr ""
+
+msgid "Color"
+msgstr "Farbe"
+
+msgid "Color Mode"
+msgstr "Farbmodus"
+
+msgid ""
+"Commands may be abbreviated. Commands are:\n"
+"\n"
+"exit help quit status ?"
+msgstr ""
+"Befehle können abgekürzt werden. Befehle sind:\n"
+"\n"
+"exit help quit status ?"
+
+msgid "Community name uses indefinite length"
+msgstr "Community-Name hat unbestimmte Länge"
+
+msgid "Connected to printer."
+msgstr "Verbunden zum Drucker."
+
+msgid "Connecting to printer."
+msgstr "Verbinde zum Drucker."
+
+msgid "Continue"
+msgstr "Weiter"
+
+msgid "Continuous"
+msgstr "Kontinuierlich"
+
+msgid "Control file sent successfully."
+msgstr "Steuerdatei erfolgreich gesendet."
+
+msgid "Copying print data."
+msgstr "Kopiere Druckdaten."
+
+msgid "Created"
+msgstr "Erstellt"
+
+msgid "Custom"
+msgstr "Eigene"
+
+msgid "CustominCutInterval"
+msgstr "CustominCutInterval"
+
+msgid "CustominTearInterval"
+msgstr "CustominTearInterval"
+
+msgid "Cut"
+msgstr "Abschneiden"
+
+msgid "Cutter"
+msgstr "Abschneider"
+
+msgid "Dark"
+msgstr "Dunkel"
+
+msgid "Darkness"
+msgstr "Dunkelheit"
+
+msgid "Data file sent successfully."
+msgstr "Datendatei erfolgreich gesendet."
+
+msgid "Delete Class"
+msgstr "Klasse löschen"
+
+msgid "Delete Printer"
+msgstr "Drucker löschen"
+
+msgid "DeskJet Series"
+msgstr "DeskJet Serie"
+
+#, c-format
+msgid "Destination \"%s\" is not accepting jobs."
+msgstr "Ziel „%s“ akzeptiert keine Druckaufträge."
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+" location = %s"
+msgstr ""
+
+msgid "Direct Thermal Media"
+msgstr "Direct Thermotransfermedia"
+
+#, c-format
+msgid "Directory \"%s\" contains a relative path."
+msgstr ""
+
+#, c-format
+msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
+msgstr ""
+
+#, c-format
+msgid "Directory \"%s\" is a file."
+msgstr ""
+
+#, c-format
+msgid "Directory \"%s\" not available: %s"
+msgstr ""
+
+#, c-format
+msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
+msgstr ""
+
+msgid "Disabled"
+msgstr "Deaktiviert"
+
+#, c-format
+msgid "Document #%d does not exist in job #%d."
+msgstr ""
+
+msgid "Duplexer"
+msgstr "Duplexer"
+
+msgid "Dymo"
+msgstr "Dymo"
+
+msgid "EPL1 Label Printer"
+msgstr "EPL1 Etikettendrucker"
+
+msgid "EPL2 Label Printer"
+msgstr "EPL2 Etikettendrucker"
+
+msgid "Edit Configuration File"
+msgstr "Konfigurationsdatei bearbeiten"
+
+msgid "Empty PPD file."
+msgstr "Leere PPD Datei."
+
+msgid "Encryption is not supported."
+msgstr "Verschlüsselung ist nicht unterstüzt."
+
+#. TRANSLATORS: Banner/cover sheet after the print job.
+msgid "Ending Banner"
+msgstr "Banner beenden"
+
+msgid "English"
+msgstr "German"
+
+msgid ""
+"Enter your username and password or the root username and password to access "
+"this page. If you are using Kerberos authentication, make sure you have a "
+"valid Kerberos ticket."
+msgstr ""
+"Geben Sie Ihren Benutzernamen und das Kennwort oder den root-Benutzernamen "
+"und -Kennwort ein, um auf diese Seite zuzgreifen. Falls Sie die Kerberos-"
+"Authentifizierung verwenden, stellen Sie sicher, dass Sie ein gültiges "
+"Kerberos-Ticket haben."
+
+msgid "Envelope #10 "
+msgstr "US Umschlag 10"
+
+msgid "Envelope #11"
+msgstr "US Umschlag 11"
+
+msgid "Envelope #12"
+msgstr "US Umschlag 12"
+
+msgid "Envelope #14"
+msgstr "US Umschlag 14"
+
+msgid "Envelope #9"
+msgstr "US Umschlag 9"
+
+msgid "Envelope B4"
+msgstr "Umschlag B4"
+
+msgid "Envelope B5"
+msgstr "Umschlag B5"
+
+msgid "Envelope B6"
+msgstr "Umschlag B6"
+
+msgid "Envelope C0"
+msgstr "Umschlag C0"
+
+msgid "Envelope C1"
+msgstr "Umschlag C1"
+
+msgid "Envelope C2"
+msgstr "Umschlag C2"
+
+msgid "Envelope C3"
+msgstr "Umschlag C3"
+
+msgid "Envelope C4"
+msgstr "Umschlag C4"
+
+msgid "Envelope C5"
+msgstr "Umschlag C5"
+
+msgid "Envelope C6"
+msgstr "Umschlag C6"
+
+msgid "Envelope C65"
+msgstr "Umschlag C65"
+
+msgid "Envelope C7"
+msgstr "Umschlag C7"
+
+msgid "Envelope Choukei 3"
+msgstr ""
+
+msgid "Envelope Choukei 3 Long Edge"
+msgstr ""
+
+msgid "Envelope Choukei 4"
+msgstr ""
+
+msgid "Envelope Choukei 4 Long Edge"
+msgstr ""
+
+msgid "Envelope DL"
+msgstr ""
+
+msgid "Envelope Feed"
+msgstr "Umschlagzuführung"
+
+msgid "Envelope Invite"
+msgstr ""
+
+msgid "Envelope Italian"
+msgstr ""
+
+msgid "Envelope Kaku2"
+msgstr ""
+
+msgid "Envelope Kaku2 Long Edge"
+msgstr ""
+
+msgid "Envelope Kaku3"
+msgstr ""
+
+msgid "Envelope Kaku3 Long Edge"
+msgstr ""
+
+msgid "Envelope Monarch"
+msgstr ""
+
+msgid "Envelope PRC1 "
+msgstr ""
+
+msgid "Envelope PRC1 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC10"
+msgstr ""
+
+msgid "Envelope PRC10 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC2"
+msgstr ""
+
+msgid "Envelope PRC2 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC3"
+msgstr ""
+
+msgid "Envelope PRC3 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC4"
+msgstr ""
+
+msgid "Envelope PRC4 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC5 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC5PRC5"
+msgstr ""
+
+msgid "Envelope PRC6"
+msgstr ""
+
+msgid "Envelope PRC6 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC7"
+msgstr ""
+
+msgid "Envelope PRC7 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC8"
+msgstr ""
+
+msgid "Envelope PRC8 Long Edge"
+msgstr ""
+
+msgid "Envelope PRC9"
+msgstr ""
+
+msgid "Envelope PRC9 Long Edge"
+msgstr ""
+
+msgid "Envelope Personal"
+msgstr ""
+
+msgid "Envelope You4"
+msgstr ""
+
+msgid "Envelope You4 Long Edge"
+msgstr ""
+
+msgid "Environment Variables:"
+msgstr ""
+
+msgid "Epson"
+msgstr "Epson"
+
+msgid "Error Policy"
+msgstr "Fehlerbehandlung"
+
+msgid "Error reading raster data."
+msgstr ""
+
+msgid "Error sending raster data."
+msgstr "Fehler beim Senden von Rasterdaten."
+
+msgid "Error: need hostname after \"-h\" option."
+msgstr "Fehler: Hostname ist nach der \"-h\" Option erforderlich."
+
+msgid "Every 10 Labels"
+msgstr "Alle 10 Etiketten"
+
+msgid "Every 2 Labels"
+msgstr "Alle 2 Etiketten"
+
+msgid "Every 3 Labels"
+msgstr "Alle 3 Etiketten"
+
+msgid "Every 4 Labels"
+msgstr "Alle 4 Etiketten"
+
+msgid "Every 5 Labels"
+msgstr "Alle 5 Etiketten"
+
+msgid "Every 6 Labels"
+msgstr "Alle 6 Etiketten"
+
+msgid "Every 7 Labels"
+msgstr "Alle 7 Etiketten"
+
+msgid "Every 8 Labels"
+msgstr "Alle 8 Etiketten"
+
+msgid "Every 9 Labels"
+msgstr "Alle 9 Etiketten"
+
+msgid "Every Label"
+msgstr "Bei jedem Etikett"
+
+msgid "Executive"
+msgstr ""
+
+msgid "Expectation Failed"
+msgstr "Erwartete Daten nicht erhalten"
+
+msgid "Export Printers to Samba"
+msgstr "Drucker zu Samba exportieren"
+
+msgid "Expressions:"
+msgstr "Ausdrücke:"
+
+msgid "FAIL"
+msgstr ""
+
+msgid "FanFold German"
+msgstr ""
+
+msgid "FanFold Legal German"
+msgstr ""
+
+msgid "Fanfold US"
+msgstr ""
+
+#, c-format
+msgid "File \"%s\" contains a relative path."
+msgstr ""
+
+#, c-format
+msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
+msgstr ""
+
+#, c-format
+msgid "File \"%s\" is a directory."
+msgstr ""
+
+#, c-format
+msgid "File \"%s\" not available: %s"
+msgstr "Datei \"%s\" nicht verfügbar: %s"
+
+#, c-format
+msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
+msgstr ""
+
+msgid "File Folder "
+msgstr "Datei-Verzeichnis "
+
+#, c-format
+msgid ""
+"File device URIs have been disabled. To enable, see the FileDevice directive "
+"in \"%s/cups-files.conf\"."
+msgstr ""
+
+#, c-format
+msgid "Finished page %d."
+msgstr ""
+
+msgid "Folio"
+msgstr "Folio"
+
+msgid "Forbidden"
+msgstr "Verboten"
+
+msgid "General"
+msgstr "Allgemein"
+
+msgid "Generic"
+msgstr "Allgemein"
+
+msgid "Get-Response-PDU uses indefinite length"
+msgstr "Get-Response-PDU hat unbestimmte Länge"
+
+msgid "Glossy Paper"
+msgstr "Glanzpapier"
+
+msgid "Got a printer-uri attribute but no job-id."
+msgstr ""
+
+msgid "Grayscale"
+msgstr "Graustufen"
+
+msgid "HP"
+msgstr "HP"
+
+msgid "Hanging Folder"
+msgstr "Hängeordner"
+
+msgid "Help file not in index."
+msgstr "Hilfedatei nicht im Index."
+
+msgid "IPP 1setOf attribute with incompatible value tags."
+msgstr ""
+
+msgid "IPP attribute has no name."
+msgstr ""
+
+msgid "IPP attribute is not a member of the message."
+msgstr ""
+
+msgid "IPP begCollection value not 0 bytes."
+msgstr ""
+
+msgid "IPP boolean value not 1 byte."
+msgstr ""
+
+msgid "IPP date value not 11 bytes."
+msgstr ""
+
+msgid "IPP endCollection value not 0 bytes."
+msgstr ""
+
+msgid "IPP enum value not 4 bytes."
+msgstr ""
+
+msgid "IPP extension tag larger than 0x7FFFFFFF."
+msgstr ""
+
+msgid "IPP integer value not 4 bytes."
+msgstr ""
+
+msgid "IPP language length overflows value."
+msgstr ""
+
+msgid "IPP language length too large."
+msgstr ""
+
+msgid "IPP member name is not empty."
+msgstr ""
+
+msgid "IPP memberName value is empty."
+msgstr ""
+
+msgid "IPP memberName with no attribute."
+msgstr ""
+
+msgid "IPP name larger than 32767 bytes."
+msgstr ""
+
+msgid "IPP nameWithLanguage value less than minimum 4 bytes."
+msgstr ""
+
+msgid "IPP octetString length too large."
+msgstr ""
+
+msgid "IPP rangeOfInteger value not 8 bytes."
+msgstr ""
+
+msgid "IPP resolution value not 9 bytes."
+msgstr ""
+
+msgid "IPP string length overflows value."
+msgstr ""
+
+msgid "IPP textWithLanguage value less than minimum 4 bytes."
+msgstr ""
+
+msgid "IPP value larger than 32767 bytes."
+msgstr "IPP Wert länger als 32767 byte"
+
+msgid "ISOLatin1"
+msgstr "UTF-8"
+
+msgid "Illegal control character"
+msgstr "Ungültiges Steuerungszeichen"
+
+msgid "Illegal main keyword string"
+msgstr "Ungültiger Main-Keyword-String"
+
+msgid "Illegal option keyword string"
+msgstr "Ungültiger Option-Keyword-String"
+
+msgid "Illegal translation string"
+msgstr "Ungültiger Übersetzungsstring"
+
+msgid "Illegal whitespace character"
+msgstr "Ungültiges Leerzeichen"
+
+msgid "Installable Options"
+msgstr "Installationsoptionen"
+
+msgid "Installed"
+msgstr "Installiert"
+
+msgid "IntelliBar Label Printer"
+msgstr "IntelliBar Etikettendrucker"
+
+msgid "Intellitech"
+msgstr "Intellitech"
+
+msgid "Internal Server Error"
+msgstr "Interner Serverfehler"
+
+msgid "Internal error"
+msgstr "Interner Fehler"
+
+msgid "Internet Postage 2-Part"
+msgstr "Internet Postage 2-teilig"
+
+msgid "Internet Postage 3-Part"
+msgstr "Internet Postage 3-teilig"
+
+msgid "Internet Printing Protocol"
+msgstr "Internet Printing Protocol"
+
+msgid "Invalid media name arguments."
+msgstr "Ungültige Argumente des Mediennamens."
+
+msgid "Invalid media size."
+msgstr "Ungültige Mediengrösse."
+
+#, c-format
+msgid "Invalid printer command \"%s\"."
+msgstr "Ungültiges Druckkommando \"%s\"."
+
+msgid "JCL"
+msgstr "JCL"
+
+msgid "JIS B0"
+msgstr ""
+
+msgid "JIS B1"
+msgstr ""
+
+msgid "JIS B10"
+msgstr ""
+
+msgid "JIS B2"
+msgstr ""
+
+msgid "JIS B3"
+msgstr ""
+
+msgid "JIS B4"
+msgstr ""
+
+msgid "JIS B4 Long Edge"
+msgstr ""
+
+msgid "JIS B5"
+msgstr ""
+
+msgid "JIS B5 Long Edge"
+msgstr ""
+
+msgid "JIS B6"
+msgstr ""
+
+msgid "JIS B6 Long Edge"
+msgstr ""
+
+msgid "JIS B7"
+msgstr ""
+
+msgid "JIS B8"
+msgstr ""
+
+msgid "JIS B9"
+msgstr ""
+
+#, c-format
+msgid "Job #%d cannot be restarted - no files."
+msgstr "Auftrag #%d kann nicht wieder gestartet werden - keine Dateien."
+
+#, c-format
+msgid "Job #%d does not exist."
+msgstr "Auftrag #%d existiert nicht."
+
+#, c-format
+msgid "Job #%d is already aborted - can't cancel."
+msgstr "Druckauftrag Nr. %d wurde bereits abgebrochen – Abbruch nicht möglich."
+
+#, c-format
+msgid "Job #%d is already canceled - can't cancel."
+msgstr "Druckauftrag Nr. %d wurde bereits abgebrochen – Abbruch nicht möglich."
+
+#, c-format
+msgid "Job #%d is already completed - can't cancel."
+msgstr ""
+"Druckauftrag Nr. %d wurde bereits abgeschlossen – Abbruch nicht möglich."
+
+#, c-format
+msgid "Job #%d is finished and cannot be altered."
+msgstr "Auftrag #%d ist abgeschlossen und kann nicht mehr geändert werden."
+
+#, c-format
+msgid "Job #%d is not complete."
+msgstr "Auftrag #%d ist nicht abgeschlossen."
+
+#, c-format
+msgid "Job #%d is not held for authentication."
+msgstr "Auftrag #%d ist nicht zur Authentifizierung angehalten."
+
+#, c-format
+msgid "Job #%d is not held."
+msgstr "Auftrag #%d ist nicht angehalten."
+
+msgid "Job Completed"
+msgstr "Druckauftrag abgeschlossen"
+
+msgid "Job Created"
+msgstr "Druckauftrag erzeugt"
+
+msgid "Job Options Changed"
+msgstr "Druckauftragsoptionen wurden geändert"
+
+msgid "Job Stopped"
+msgstr "Druckauftrag gestoppt"
+
+msgid "Job is completed and cannot be changed."
+msgstr "Druckauftrag ist abgeschlossen und kann nicht geändert werden."
+
+msgid "Job operation failed"
+msgstr "Druckvorgang fehlgeschlagen:"
+
+msgid "Job state cannot be changed."
+msgstr "Druckauftragsstatus kann nicht geändert werden."
+
+msgid "Job subscriptions cannot be renewed."
+msgstr "Auftragssubskiptionen können nicht erneuert werden."
+
+msgid "Jobs"
+msgstr "Druckaufträge"
+
+msgid "LPD/LPR Host or Printer"
+msgstr "LPD/LPR-Host oder -Drucker"
+
+msgid "Label Printer"
+msgstr "Etikettendrucker"
+
+msgid "Label Top"
+msgstr "Etikett (oben)"
+
+#, c-format
+msgid "Language \"%s\" not supported."
+msgstr "Sprache \"%s\" nicht unterstützt."
+
+msgid "Large Address"
+msgstr "Adresse gross"
+
+msgid "LaserJet Series PCL 4/5"
+msgstr "LaserJet Serie PCL 4/5"
+
+msgid "Letter Oversize"
+msgstr ""
+
+msgid "Letter Oversize Long Edge"
+msgstr ""
+
+msgid "Light"
+msgstr "Leicht"
+
+msgid "Line longer than the maximum allowed (255 characters)"
+msgstr "Zeile ist länger als die zulässige Länge von 255 Zeichen"
+
+msgid "List Available Printers"
+msgstr "Verfügbare Drucker anzeigen"
+
+msgid "Load paper."
+msgstr "Lade Papier."
+
+msgid "Long-Edge (Portrait)"
+msgstr "Lange Kante (Hochformat)"
+
+msgid "Looking for printer..."
+msgstr ""
+
+msgid "Manual Feed"
+msgstr "Manuelle Papierzufuhr"
+
+msgid "Media Size"
+msgstr "Mediengrösse"
+
+msgid "Media Source"
+msgstr "Medienquelle"
+
+msgid "Media Tracking"
+msgstr "Medienführung"
+
+msgid "Media Type"
+msgstr "Medienart"
+
+msgid "Medium"
+msgstr "Medium"
+
+msgid "Memory allocation error"
+msgstr "Fehler bei der Speicherzuteilung"
+
+msgid "Missing CloseGroup"
+msgstr "Fehlendes CloseGroup"
+
+msgid "Missing PPD-Adobe-4.x header"
+msgstr "PPD-Adobe-4.x Header fehlt"
+
+msgid "Missing asterisk in column 1"
+msgstr "Sternchen in Spalte 1 fehlt"
+
+msgid "Missing document-number attribute."
+msgstr "Fehlendes Attribut zur Dokumentennummer."
+
+#, c-format
+msgid "Missing double quote on line %d."
+msgstr "Fehlende Doppelhochkommas in Zeile %d."
+
+msgid "Missing form variable"
+msgstr "Fehlende form Variable"
+
+msgid "Missing last-document attribute in request."
+msgstr ""
+
+msgid "Missing media or media-col."
+msgstr ""
+
+msgid "Missing media-size in media-col."
+msgstr ""
+
+msgid "Missing notify-subscription-ids attribute."
+msgstr ""
+
+msgid "Missing option keyword"
+msgstr ""
+
+msgid "Missing requesting-user-name attribute."
+msgstr ""
+
+msgid "Missing required attributes."
+msgstr ""
+
+msgid "Missing resource in URI"
+msgstr "Fehlende Resource in URI"
+
+msgid "Missing scheme in URI"
+msgstr "Fehlendes Schema in URI"
+
+#, c-format
+msgid "Missing value on line %d."
+msgstr ""
+
+msgid "Missing value string"
+msgstr "Wertestring fehlt"
+
+msgid "Missing x-dimension in media-size."
+msgstr ""
+
+msgid "Missing y-dimension in media-size."
+msgstr ""
+
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s"
+msgstr ""
+
+msgid "Modifiers:"
+msgstr "Modifikator:"
+
+msgid "Modify Class"
+msgstr "Klasse verändern"
+
+msgid "Modify Printer"
+msgstr "Drucker verändern"
+
+msgid "Move All Jobs"
+msgstr "Alle Druckaufträge verschieben"
+
+msgid "Move Job"
+msgstr "Druckauftrag verschieben"
+
+msgid "Moved Permanently"
+msgstr "Dauerhaft verschoben"
+
+msgid "NULL PPD file pointer"
+msgstr "NULL PPD File Pointer"
+
+msgid "Name OID uses indefinite length"
+msgstr "Name-OID hat unbestimmte Länge"
+
+msgid "Nested classes are not allowed."
+msgstr "Geschachtelte Klassen sind nicht erlaubt."
+
+msgid "Never"
+msgstr "Nie"
+
+msgid "No"
+msgstr "Nein"
+
+msgid "No Content"
+msgstr "Kein Inhalt"
+
+msgid "No PPD name"
+msgstr "Kein PPD Name"
+
+msgid "No VarBind SEQUENCE"
+msgstr "Keine VarBind SEQUENCE"
+
+msgid "No Windows printer drivers are installed."
+msgstr "Keine Windows-Druckertreiber installiert."
+
+msgid "No active connection"
+msgstr "Keine aktive Verbindung"
+
+msgid "No active connection."
+msgstr "Keine aktive Verbindung."
+
+#, c-format
+msgid "No active jobs on %s."
+msgstr "Keine aktiven Aufträge auf %s."
+
+msgid "No attributes in request."
+msgstr "Keine Attribute in der Anfrage."
+
+msgid "No authentication information provided."
+msgstr "Keine Authentifizierungsinformation bereitgestellt."
+
+msgid "No community name"
+msgstr "Kein Community-Name"
+
+msgid "No default printer."
+msgstr "Kein voreingestelltes Druckziel"
+
+msgid "No destinations added."
+msgstr "Keine Druckziele hinzugefügt."
+
+msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
+msgstr ""
+"Keine Geräte-URI in argv[0] oder der Umgebungsvariablen DEVICE_URI gefunden."
+
+msgid "No error-index"
+msgstr "Kein Fehlerindex"
+
+msgid "No error-status"
+msgstr "Kein Fehlerstatus"
+
+msgid "No file in print request."
+msgstr "Keine Druckdatei in der Anfrage."
+
+msgid "No modification time"
+msgstr "Keine Modifikationszeit"
+
+msgid "No name OID"
+msgstr "Kein Name-OID"
+
+msgid "No pages were found."
+msgstr "Keine Seiten gefunden."
+
+msgid "No printer name"
+msgstr "Kein Druckername"
+
+msgid "No printer-uri found"
+msgstr "Keine Drucker-uri gefunden"
+
+msgid "No printer-uri found for class"
+msgstr ""
+
+msgid "No printer-uri in request."
+msgstr ""
+
+msgid "No request URI."
+msgstr ""
+
+msgid "No request protocol version."
+msgstr ""
+
+msgid "No request sent."
+msgstr "Keine Anfrage gesendet."
+
+msgid "No request-id"
+msgstr "Keine Anfrage-ID"
+
+msgid "No subscription attributes in request."
+msgstr "Keine Subskriptions-Attribute in der Anfrage."
+
+msgid "No subscriptions found."
+msgstr "Keine Subskriptionen gefunden."
+
+msgid "No variable-bindings SEQUENCE"
+msgstr "Keine „variable-bindings SEQUENCE“"
+
+msgid "No version number"
+msgstr "Keine Versionsnummer"
+
+msgid "Non-continuous (Mark sensing)"
+msgstr "Nicht fortlaufend (Mark-Sensing)"
+
+msgid "Non-continuous (Web sensing)"
+msgstr "Nicht fortlaufend (Web-Sensing)"
+
+msgid "Normal"
+msgstr "Normal"
+
+msgid "Not Found"
+msgstr "Nicht gefunden"
+
+msgid "Not Implemented"
+msgstr "Nicht implementiert"
+
+msgid "Not Installed"
+msgstr "Nicht installiert"
+
+msgid "Not Modified"
+msgstr "Nicht verändert"
+
+msgid "Not Supported"
+msgstr "Nicht unterstützt"
+
+msgid "Not allowed to print."
+msgstr "Drucken nicht erlaubt."
+
+msgid "Note"
+msgstr "Hinweis"
+
+msgid ""
+"Note: this program only validates the DSC comments, not the PostScript "
+"itself."
+msgstr ""
+"Hinweis: dieses Programme validiert nur die DSC Kommentare, nicht PostScript "
+"selber"
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Off (1-Sided)"
+msgstr "Aus (Einseitig)"
+
+msgid "Oki"
+msgstr "Oki"
+
+msgid "Online Help"
+msgstr "Online-Hilfe"
+
+#, c-format
+msgid "Open of %s failed: %s"
+msgstr "%s öffnen fehlgeschlagen: %s"
+
+msgid "OpenGroup without a CloseGroup first"
+msgstr "OpenGroup ohne CloseGroup zuerst"
+
+msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
+msgstr "OpenUI/JCLOpenUI ohne CloseUI/JCLCloseUI zuerst"
+
+msgid "Operation Policy"
+msgstr "Nutzungsrichtlinien"
+
+#, c-format
+msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
+msgstr ""
+
+msgid "Options Installed"
+msgstr "Installierte Optionen"
+
+msgid "Options:"
+msgstr "Optionen:"
+
+msgid "Out of date PPD cache file."
+msgstr ""
+
+msgid "Out of memory."
+msgstr "Nicht genügend Hauptspeicher."
+
+msgid "Output Mode"
+msgstr "Ausgabemodus"
+
+msgid "Output bin is almost full."
+msgstr "Ausgabefach ist fast voll."
+
+msgid "Output bin is full."
+msgstr "Ausgabefach ist voll."
+
+msgid "Output bin is missing."
+msgstr "Ausgabefach fehlt."
+
+msgid "PASS"
+msgstr "Bestanden"
+
+msgid "PCL Laser Printer"
+msgstr "PCL Laserdrucker"
+
+msgid "PRC16K"
+msgstr "PRC16K"
+
+msgid "PRC16K Long Edge"
+msgstr ""
+
+msgid "PRC32K"
+msgstr "PRC32K"
+
+msgid "PRC32K Long Edge"
+msgstr ""
+
+msgid "PRC32K Oversize"
+msgstr ""
+
+msgid "PRC32K Oversize Long Edge"
+msgstr ""
+
+msgid "Packet does not contain a Get-Response-PDU"
+msgstr "Paket enthält kein Get-Response-PDU"
+
+msgid "Packet does not start with SEQUENCE"
+msgstr "Paket beginnt nicht mit SEQUENCE"
+
+msgid "Paper jam."
+msgstr "Papierstau."
+
+msgid "Paper tray is almost empty."
+msgstr "Papierfach ist fast leer."
+
+msgid "Paper tray is empty."
+msgstr "Papierfach ist leer."
+
+msgid "Paper tray is missing."
+msgstr "Papierfach ist nicht vorhanden."
+
+msgid "ParamCustominCutInterval"
+msgstr "ParamCustominCutInterval"
+
+msgid "ParamCustominTearInterval"
+msgstr "ParamCustominTearInterval"
+
+#, c-format
+msgid "Password for %s on %s? "
+msgstr "Kennwort für „%s“ auf „%s“? "
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "Kennwort für „%s“ wird benötigt für den Zugriff auf „%s“ über SAMBA: "
+
+msgid "Pause Class"
+msgstr "Klasse anhalten"
+
+msgid "Pause Printer"
+msgstr "Drucker anhalten"
+
+msgid "Peel-Off"
+msgstr "Aufkleber"
+
+msgid "Photo"
+msgstr "Foto"
+
+msgid "Photo Labels"
+msgstr "Foto-Etiketten"
+
+msgid "Plain Paper"
+msgstr "Standardpapier"
+
+msgid "Policies"
+msgstr "Richtlinien "
+
+msgid "Port Monitor"
+msgstr "Port-Monitor"
+
+msgid "PostScript Printer"
+msgstr "PostScript-Drucker"
+
+msgid "Postcard"
+msgstr "Postkarte"
+
+msgid "Postcard Double "
+msgstr ""
+
+msgid "Postcard Double Long Edge"
+msgstr ""
+
+msgid "Postcard Long Edge"
+msgstr ""
+
+msgid "Preparing to print."
+msgstr ""
+
+msgid "Print Density"
+msgstr "Druckdichte"
+
+msgid "Print Job:"
+msgstr "Druckauftrag:"
+
+msgid "Print Mode"
+msgstr "Druckmodus"
+
+msgid "Print Rate"
+msgstr "Druckrate"
+
+msgid "Print Self-Test Page"
+msgstr "Selbsttestseite drucken"
+
+msgid "Print Speed"
+msgstr "Druckgeschwindigkeit"
+
+msgid "Print Test Page"
+msgstr "Testseite drucken"
+
+msgid "Print and Cut"
+msgstr "Drucken und abschneiden"
+
+msgid "Print and Tear"
+msgstr "Drucken und abziehen"
+
+msgid "Print file sent."
+msgstr "Druckdatei gesendet."
+
+msgid "Print job canceled at printer."
+msgstr "Druckauftrag wurde am Drucker abgebrochen."
+
+msgid "Print job too large."
+msgstr "Der Druckauftrag ist zu gross."
+
+msgid "Print job was not accepted."
+msgstr "Der Druckauftrag wurde nicht angenommen."
+
+msgid "Printer Added"
+msgstr "Drucker hinzugefügt"
+
+msgid "Printer Default"
+msgstr "Standardeinstellung für Drucker"
+
+msgid "Printer Deleted"
+msgstr "Drucker gelöscht"
+
+msgid "Printer Modified"
+msgstr "Drucker geändert"
+
+msgid "Printer Paused"
+msgstr "Drucker angehalten"
+
+msgid "Printer Settings"
+msgstr "Druckereinstellungen"
+
+msgid "Printer cannot print supplied content."
+msgstr "Drucker kann den Inhalt nicht drucken."
+
+msgid "Printer cannot print with supplied options."
+msgstr "Drucker kann mit den angegebenen Optionen nicht drucken."
+
+msgid "Printer:"
+msgstr "Drucker:"
+
+msgid "Printers"
+msgstr "Drucker"
+
+#, c-format
+msgid "Printing page %d, %u%% complete."
+msgstr "Drucke Seite %d, %u%% fertig."
+
+msgid "Quarto"
+msgstr "US Quarto"
+
+msgid "Quota limit reached."
+msgstr "Kontingentgrenze erreicht."
+
+msgid "Rank Owner Job File(s) Total Size"
+msgstr "Rang Besitz. Auftrag Datei(en) Gesamtgrösse"
+
+msgid "Reject Jobs"
+msgstr "Druckaufträge ablehnen"
+
+#, c-format
+msgid "Remote host did not accept control file (%d)."
+msgstr "Entfernter Host hat die Steuerdatei (%d) nicht akzeptiert."
+
+#, c-format
+msgid "Remote host did not accept data file (%d)."
+msgstr "Entfernter Host hat die Datendatei (%d) nicht akzeptiert."
+
+msgid "Reprint After Error"
+msgstr "Druckvorgang nach dem Fehler fortsetzen"
+
+msgid "Request Entity Too Large"
+msgstr "Gesamte Anfrage zu gross"
+
+msgid "Resolution"
+msgstr "Auflösung"
+
+msgid "Resume Class"
+msgstr "Klasse fortsetzen"
+
+msgid "Resume Printer"
+msgstr "Drucken fortsetzen"
+
+msgid "Return Address"
+msgstr "Antwort-Adresse"
+
+msgid "Rewind"
+msgstr "Zurückdrehen"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'"
+msgstr ""
+
+msgid "SEQUENCE uses indefinite length"
+msgstr "SEQUENCE hat unbestimmte Länge"
+
+msgid "SSL/TLS Negotiation Error"
+msgstr "SSL/TLS Verhandlungsfehler"
+
+msgid "See Other"
+msgstr "Siehe auch"
+
+msgid "Sending data to printer."
+msgstr "Sende Daten zum Drucker."
+
+msgid "Server Restarted"
+msgstr "Server neu gestartet"
+
+msgid "Server Security Auditing"
+msgstr "Server Security Auditing"
+
+msgid "Server Started"
+msgstr "Server gestartet"
+
+msgid "Server Stopped"
+msgstr "Server ist angehalten"
+
+msgid "Server credentials not set."
+msgstr "Server-Zugangsdaten nicht gesetzt."
+
+msgid "Service Unavailable"
+msgstr "Dienst nicht verfügbar"
+
+msgid "Set Allowed Users"
+msgstr "Zugelassene Benutzer festlegen"
+
+msgid "Set As Server Default"
+msgstr "Als Voreinstellungen für Server festlegen"
+
+msgid "Set Class Options"
+msgstr "Klassenoptionen festlegen"
+
+msgid "Set Printer Options"
+msgstr "Druckeroptionen festlegen"
+
+msgid "Set Publishing"
+msgstr "Veröffentlichung festlegen"
+
+msgid "Shipping Address"
+msgstr "Lieferadresse"
+
+msgid "Short-Edge (Landscape)"
+msgstr "Kurze Kante (Querformat)"
+
+msgid "Special Paper"
+msgstr "Spezialpapier"
+
+#, c-format
+msgid "Spooling job, %.0f%% complete."
+msgstr "Auftragszwischenspeicherung %.0f%% abgeschlossen."
+
+msgid "Standard"
+msgstr "Standard"
+
+#. TRANSLATORS: Banner/cover sheet before the print job.
+msgid "Starting Banner"
+msgstr "Startbanner"
+
+#, c-format
+msgid "Starting page %d."
+msgstr "Beginne Seite %d."
+
+msgid "Statement"
+msgstr "US Statement"
+
+#, c-format
+msgid "Subscription #%d does not exist."
+msgstr ""
+
+msgid "Substitutions:"
+msgstr "Ersatz:"
+
+msgid "Super A"
+msgstr "Super A"
+
+msgid "Super B"
+msgstr "Super B"
+
+msgid "Super B/A3"
+msgstr "Super B/A3"
+
+msgid "Switching Protocols"
+msgstr "Protokoll wechseln"
+
+msgid "Tabloid"
+msgstr "US Tabloid"
+
+msgid "Tabloid Oversize"
+msgstr ""
+
+msgid "Tabloid Oversize Long Edge"
+msgstr ""
+
+msgid "Tear"
+msgstr "Abreissen"
+
+msgid "Tear-Off"
+msgstr "Abriss"
+
+msgid "Tear-Off Adjust Position"
+msgstr "Abriss-Justierposition"
+
+#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr "Das Attribut \"%s\" ist erforderlich für Druckaufträge."
+
+#, c-format
+msgid "The %s attribute cannot be provided with job-ids."
+msgstr ""
+
+#, c-format
+msgid ""
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
+msgstr ""
+
+#, c-format
+msgid ""
+"The '%s' operation attribute cannot be supplied in a Create-Job request."
+msgstr ""
+
+#, c-format
+msgid "The PPD file \"%s\" could not be found."
+msgstr "Die PPD-Datei „%s“ konnte nicht gefunden werden."
+
+#, c-format
+msgid "The PPD file \"%s\" could not be opened: %s"
+msgstr "Die PPD-Datei „%s“ konnte nicht geöffnet werden: %s"
+
+msgid "The PPD file could not be opened."
+msgstr "Die PPD Datei konnte nicht geöffnet werden."
+
+msgid ""
+"The class name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Der Klassenname darf maximal 127 druckbare Zeichen haben und darf keine "
+"Leerzeichen, Schrägstriche (/) oder Rautezeichen (#) enthalten."
+
+msgid "The developer unit needs to be replaced."
+msgstr "Die Entwicklereinheit muss gewechselt werden."
+
+msgid "The developer unit will need to be replaced soon."
+msgstr "Die entwicklereinheit muss demnächst gewechselt werden."
+
+msgid "The fuser's temperature is high."
+msgstr "Die Temperatur der Fixiereinheit ist hoch."
+
+msgid "The fuser's temperature is low."
+msgstr "Die Temperatur der Fixiereinheit ist niedrig."
+
+msgid ""
+"The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr ""
+"Das Attribut „notify-lease-duration“ kann nicht mit Druckauftrags-"
+"Subskriptionen verwendet werden."
+
+#, c-format
+msgid "The notify-user-data value is too large (%d > 63 octets)."
+msgstr ""
+
+msgid "The optical photoconductor needs to be replaced."
+msgstr ""
+
+msgid "The optical photoconductor will need to be replaced soon."
+msgstr ""
+
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr ""
+
+msgid "The printer did not respond."
+msgstr "Der Drucker hat nicht geantwortet"
+
+msgid "The printer is in use."
+msgstr "Der Drucker ist beschäftigt"
+
+msgid "The printer is low on ink."
+msgstr "Der Drucker hat niedrigen Tintenstand"
+
+msgid "The printer is low on toner."
+msgstr "Der Drucker hat niedrigen Tonerstand"
+
+msgid "The printer is not connected."
+msgstr "Der Drucker ist nicht verbunden"
+
+msgid "The printer is not responding."
+msgstr "Der Drucker antwortet nicht"
+
+msgid "The printer is now connected."
+msgstr "Der Drucker ist jetzt verbunden"
+
+msgid "The printer is now online."
+msgstr "Der Drucker ist jetzt online"
+
+msgid "The printer is offline."
+msgstr "Der Drucker ist offline"
+
+msgid "The printer is unreachable at this time."
+msgstr "Der Drucker ist derzeit nicht erreichbar"
+
+msgid "The printer may be out of ink."
+msgstr "Der Drucker hat mochlicherweise keine Tinte mehr"
+
+msgid "The printer may be out of toner."
+msgstr "Der Drucker könnte zu wenig Toner haben."
+
+msgid "The printer may not exist or is unavailable at this time."
+msgstr "Der Drucker existiert nicht oder ist zur Zeit nicht verfügbar."
+
+msgid ""
+"The printer name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Der Druckername darf maximal 127 druckbare Zeichen haben und darf keine "
+"Leerzeichen, Schrägstriche (/) oder Rautezeichen (#) enthalten."
+
+msgid "The printer or class does not exist."
+msgstr "Der Drucker oder die Klasse existiert nicht."
+
+msgid "The printer or class is not shared."
+msgstr "Der Drucker oder die Klasse ist nicht freigegeben."
+
+msgid "The printer's cover is open."
+msgstr "Die Druckerabdeckung ist offen."
+
+msgid "The printer's door is open."
+msgstr "Die Klappe des Druckers ist offen"
+
+msgid "The printer's interlock is open."
+msgstr "Die Sicherheitsverriegelung des Druckers ist offen."
+
+msgid "The printer's waste bin is almost full."
+msgstr "Der Resttonerbehälter des Druckers ist fast voll"
+
+msgid "The printer's waste bin is full."
+msgstr "Der Resttonerbehälter des Druckers ist voll"
+
+#, c-format
+msgid "The printer-uri \"%s\" contains invalid characters."
+msgstr "Die Drucker-URI „%s“ enthält ungültige Zeichen."
+
+msgid "The printer-uri attribute is required."
+msgstr ""
+
+msgid ""
+"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr ""
+"Die Drucker-URI muss in der folgenden Form vorliegen: ipp://HOSTNAME/classes/"
+"CLASSNAME"
+
+msgid ""
+"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr ""
+"Die Drucker-URI muss in der folgenden Form vorliegen: ipp://HOSTNAME/"
+"printers/PRINTERNAME"
+
+msgid ""
+"The subscription name may not contain spaces, slashes (/), question marks "
+"(?), or the pound sign (#)."
+msgstr ""
+"Der Subkriptionsname darf keine Leerzeichen, Schrägstriche (/), Fragezeichen "
+"(?) oder Rautezeichen (#) enthalten."
+
+msgid ""
+"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
+"enable it."
+msgstr ""
+"Die Web-Schnittstelle ist derzeit abgeschaltet. Das Einschalten kann mitdem "
+"Befehl \"cupsctl WebInterface=yes\" erfolgen."
+
+#, c-format
+msgid "The which-jobs value \"%s\" is not supported."
+msgstr ""
+
+msgid "There are too many subscriptions."
+msgstr "Es gibt zu viele Subskriptionen."
+
+msgid "There was an unrecoverable USB error."
+msgstr "Ein nicht zu behebenden USB Fehler ist aufgetreten."
+
+msgid "Thermal Transfer Media"
+msgstr "Thermotransferpapier"
+
+msgid "Too many active jobs."
+msgstr "Zu viele aktive Druckaufträge."
+
+#, c-format
+msgid "Too many job-sheets values (%d > 2)."
+msgstr ""
+
+#, c-format
+msgid "Too many printer-state-reasons values (%d > %d)."
+msgstr ""
+
+msgid "Transparency"
+msgstr "Transparenz"
+
+msgid "Tray"
+msgstr "Fach"
+
+msgid "Tray 1"
+msgstr "Fach 1"
+
+msgid "Tray 2"
+msgstr "Fach 2"
+
+msgid "Tray 3"
+msgstr "Fach 3"
+
+msgid "Tray 4"
+msgstr "Fach 4"
+
+msgid "URI Too Long"
+msgstr "URI zu lang"
+
+msgid "URI too large"
+msgstr "URI zu gross"
+
+msgid "US Ledger"
+msgstr "US Ledger"
+
+msgid "US Legal"
+msgstr "US Lang"
+
+msgid "US Legal Oversize"
+msgstr ""
+
+msgid "US Letter"
+msgstr "US Letter"
+
+msgid "US Letter Long Edge"
+msgstr ""
+
+msgid "US Letter Oversize"
+msgstr ""
+
+msgid "US Letter Oversize Long Edge"
+msgstr ""
+
+msgid "US Letter Small"
+msgstr ""
+
+msgid "Unable to access cupsd.conf file"
+msgstr "Kein Zugriff auf die Datei cupsd.conf"
+
+msgid "Unable to access help file."
+msgstr "Kein Zugriff auf die Hilfe-Datei."
+
+msgid "Unable to add RSS subscription"
+msgstr "RSS-Abo konnte nicht hinzugefügt werden:"
+
+msgid "Unable to add class"
+msgstr "Klasse konnte nicht hinzugefügt werden:"
+
+msgid "Unable to add document to print job."
+msgstr ""
+
+#, c-format
+msgid "Unable to add job for destination \"%s\"."
+msgstr ""
+
+msgid "Unable to add printer"
+msgstr "Drucker konnte nicht hinzugefügt werden:"
+
+msgid "Unable to allocate memory for file types."
+msgstr ""
+
+msgid "Unable to allocate memory for page info"
+msgstr ""
+
+msgid "Unable to allocate memory for pages array"
+msgstr ""
+
+msgid "Unable to cancel RSS subscription"
+msgstr "RSS-Abo konnte nicht widerrufen werden:"
+
+msgid "Unable to cancel print job."
+msgstr "Druckauftrag kann nicht abgebrochen werden."
+
+msgid "Unable to change printer"
+msgstr "Drucker konnte nicht geändert werden"
+
+msgid "Unable to change printer-is-shared attribute"
+msgstr "Attribut „printer-is-shared“ konnte nicht geändert werden"
+
+msgid "Unable to change server settings"
+msgstr "Servereinstellungen konnten nicht geändert werden :"
+
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr ""
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
+msgid "Unable to configure printer options."
+msgstr "Druckeroptionen können nicht konfiguriert werden."
+
+msgid "Unable to connect to host."
+msgstr "Verbindungsaufbau zum Host fehlgeschlagen."
+
+msgid "Unable to contact printer, queuing on next printer in class."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy 64-bit Windows printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy PPD file - %s"
+msgstr ""
+
+msgid "Unable to copy PPD file."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy interface script - %s"
+msgstr ""
+
+msgid "Unable to create printer-uri"
+msgstr ""
+
+msgid "Unable to create server credentials."
+msgstr ""
+
+msgid "Unable to create temporary file"
+msgstr "Temporäre Datei konntenicht erstellt werden :"
+
+msgid "Unable to delete class"
+msgstr "Die Klasse konnte nicht gelöscht werden :"
+
+msgid "Unable to delete printer"
+msgstr "Der Drucker konnte nicht gelöscht werden :"
+
+msgid "Unable to do maintenance command"
+msgstr "Wartungsbefehl konnte nicht ausgeführt werden :"
+
+msgid "Unable to edit cupsd.conf files larger than 1MB"
+msgstr ""
+
+msgid ""
+"Unable to establish a secure connection to host (certificate chain invalid)."
+msgstr ""
+
+msgid ""
+"Unable to establish a secure connection to host (certificate not yet valid)."
+msgstr ""
+
+msgid "Unable to establish a secure connection to host (expired certificate)."
+msgstr ""
+
+msgid "Unable to establish a secure connection to host (host name mismatch)."
+msgstr ""
+
+msgid ""
+"Unable to establish a secure connection to host (peer dropped connection "
+"before responding)."
+msgstr ""
+
+msgid ""
+"Unable to establish a secure connection to host (self-signed certificate)."
+msgstr ""
+
+msgid ""
+"Unable to establish a secure connection to host (untrusted certificate)."
+msgstr ""
+
+msgid "Unable to establish a secure connection to host."
+msgstr ""
+
+msgid "Unable to find destination for job"
+msgstr ""
+
+msgid "Unable to find printer."
+msgstr ""
+
+msgid "Unable to find server credentials."
+msgstr "Die Server-Zugangsdaten konnten nicht gefunden werden."
+
+msgid "Unable to get backend exit status."
+msgstr ""
+
+msgid "Unable to get class list"
+msgstr "Klassenliste konnte nicht ermittelt werden:"
+
+msgid "Unable to get class status"
+msgstr "Klassenstatus konnte nicht ermittelt werden:"
+
+msgid "Unable to get list of printer drivers"
+msgstr "Liste der Druckertreiber konnte nicht ermittel werden:"
+
+msgid "Unable to get printer attributes"
+msgstr "Druckerattribute konnten nicht ermittelt werden:"
+
+msgid "Unable to get printer list"
+msgstr "Druckerliste konnte nicht ermittelt werden:"
+
+msgid "Unable to get printer status"
+msgstr "Druckerstatus konnte nicht ermittelt werden"
+
+msgid "Unable to get printer status."
+msgstr "Druckerstatus konnte nicht ermittelt werden:"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)."
+msgstr ""
+
+msgid "Unable to load help index."
+msgstr ""
+
+#, c-format
+msgid "Unable to locate printer \"%s\"."
+msgstr ""
+
+msgid "Unable to locate printer."
+msgstr ""
+
+msgid "Unable to modify class"
+msgstr "Klasse konnte nicht verändert werden:"
+
+msgid "Unable to modify printer"
+msgstr "Drucker kann nicht verändert werden:"
+
+msgid "Unable to move job"
+msgstr "Druckauftrag kann nicht bewegt werden"
+
+msgid "Unable to move jobs"
+msgstr "Druckaufträge können nicht bewegt werden"
+
+msgid "Unable to open PPD file"
+msgstr "PPD Datei kann nicht geöffnet werden"
+
+msgid "Unable to open cupsd.conf file:"
+msgstr "Die Datei „cupsd.conf“ kann nicht geöffnet werden:"
+
+msgid "Unable to open device file"
+msgstr "Die Gerätedatei kann nicht geöffnet werden"
+
+#, c-format
+msgid "Unable to open document #%d in job #%d."
+msgstr ""
+
+msgid "Unable to open help file."
+msgstr "Die Hilfe-Datei kann nicht geöffnet werden"
+
+msgid "Unable to open print file"
+msgstr "Die Druckdatei kann nicht geöffnet werden"
+
+msgid "Unable to open raster file"
+msgstr "Die Rasterdatei kann nicht geöffnet werden"
+
+msgid "Unable to print test page"
+msgstr "Die Testseite kann nicht gedruckt werden"
+
+msgid "Unable to read print data."
+msgstr ""
+
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr ""
+
+#, c-format
+msgid "Unable to run \"%s\": %s"
+msgstr ""
+
+msgid "Unable to see in file"
+msgstr ""
+
+msgid "Unable to send command to printer driver"
+msgstr ""
+
+msgid "Unable to send data to printer."
+msgstr "Kann Daten nicht zum Drucker senden."
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)."
+msgstr "Kann Windows Druckertreiber (%d) nicht setzen."
+
+msgid "Unable to set options"
+msgstr "Optionen konnten nicht festgelegt werden:"
+
+msgid "Unable to set server default"
+msgstr "Standardeinstellungen für Server konnten nicht festgelegt werden:"
+
+msgid "Unable to start backend process."
+msgstr "Backend-Prozess kann nicht gestartet werden."
+
+msgid "Unable to upload cupsd.conf file"
+msgstr "Die Datei „cupsd.conf“ kann nicht hochgeladen werden:"
+
+msgid "Unable to use legacy USB class driver."
+msgstr "Der alte USB-KlassenTreiber kann nicht verwendet werden."
+
+msgid "Unable to write print data"
+msgstr "Kann Druckdaten nicht schreiben"
+
+#, c-format
+msgid "Unable to write uncompressed print data: %s"
+msgstr ""
+
+msgid "Unauthorized"
+msgstr "Nicht berechtigt"
+
+msgid "Units"
+msgstr "Einheiten"
+
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#, c-format
+msgid "Unknown choice \"%s\" for option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unknown encryption option value: \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unknown file order: \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unknown format character: \"%c\"."
+msgstr ""
+
+msgid "Unknown media size name."
+msgstr ""
+
+#, c-format
+msgid "Unknown option \"%s\" with value \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unknown option \"%s\"."
+msgstr "Unbekannte Option \"%s\""
+
+#, c-format
+msgid "Unknown print mode: \"%s\"."
+msgstr "Unbekannter Druckmodus: \"%s\"."
+
+#, c-format
+msgid "Unknown printer-error-policy \"%s\"."
+msgstr "Unbekannte printer-error-policy „%s“."
+
+#, c-format
+msgid "Unknown printer-op-policy \"%s\"."
+msgstr "Unbekannte printer-op-policy „%s“."
+
+msgid "Unknown request method."
+msgstr ""
+
+msgid "Unknown request version."
+msgstr ""
+
+msgid "Unknown scheme in URI"
+msgstr ""
+
+msgid "Unknown service name."
+msgstr ""
+
+#, c-format
+msgid "Unknown version option value: \"%s\"."
+msgstr "Unbekannter Versionsoption: \"%s\"."
+
+#, c-format
+msgid "Unsupported 'compression' value \"%s\"."
+msgstr "Nicht unterstützter Kompressionswert \"%s\"."
+
+#, c-format
+msgid "Unsupported 'document-format' value \"%s\"."
+msgstr ""
+
+msgid "Unsupported 'job-name' value."
+msgstr "Nicht unterstützter 'job-name' Wert."
+
+#, c-format
+msgid "Unsupported character set \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unsupported compression \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unsupported document-format \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unsupported document-format \"%s/%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unsupported format \"%s\"."
+msgstr ""
+
+msgid "Unsupported margins."
+msgstr "Nicht unterstützte Ränder."
+
+msgid "Unsupported media value."
+msgstr "Nicht unterstützter Medienwert."
+
+#, c-format
+msgid "Unsupported number-up value %d, using number-up=1."
+msgstr ""
+
+#, c-format
+msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
+msgstr ""
+
+#, c-format
+msgid "Unsupported page-border value %s, using page-border=none."
+msgstr ""
+
+msgid "Unsupported raster data."
+msgstr ""
+
+msgid "Unsupported value type"
+msgstr "Wertetyp nicht unterstützt"
+
+msgid "Upgrade Required"
+msgstr "Aktualisierung erforderlich"
+
+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]"
+msgstr ""
+
+#, c-format
+msgid "Usage: %s job-id user title copies options [file]"
+msgstr ""
+
+msgid "Usage: cupsaddsmb [options] printer1 ... printerN"
+msgstr ""
+
+msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
+msgstr ""
+
+msgid "Usage: cupsd [options]"
+msgstr ""
+
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr ""
+
+msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
+msgstr ""
+
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgstr ""
+
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+
+msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
+msgstr ""
+
+msgid "Usage: lpmove job/src dest"
+msgstr ""
+
+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"
+msgstr ""
+
+msgid ""
+"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
+msgstr ""
+
+msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
+msgstr ""
+
+msgid "Usage: ppdhtml [options] filename.drv >filename.html"
+msgstr ""
+
+msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"
+msgstr ""
+
+msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"
+msgstr ""
+
+msgid ""
+"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
+msgstr ""
+
+msgid "Usage: snmp [host-or-ip-address]"
+msgstr ""
+
+msgid "Value uses indefinite length"
+msgstr "Wert hat unbestimmte Länge"
+
+msgid "VarBind uses indefinite length"
+msgstr "VarBind hat unbestimmte Länge"
+
+msgid "Version uses indefinite length"
+msgstr "Version hat unbestimmte Länge"
+
+msgid "Waiting for job to complete."
+msgstr "Warte auf Auftragsabschluss."
+
+msgid "Waiting for printer to become available."
+msgstr "Warte darauf dass der Drucker verfügbar wird."
+
+msgid "Waiting for printer to finish."
+msgstr "Warte auf Abschluss."
+
+msgid "Warning, no Windows 2000 printer drivers are installed."
+msgstr "Warnung, keine Win2k Treiber installiert."
+
+msgid "Web Interface is Disabled"
+msgstr "Web-Schnittstelle ist abgeschaltet"
+
+msgid "Yes"
+msgstr "Ja"
+
+#, c-format
+msgid ""
+"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
+msgstr ""
+"Auf diese Seite greifen Sie zu über die URL <A HREF=\"https://%s:%d%s"
+"\">https://%s:%d%s</A>."
+
+msgid "ZPL Label Printer"
+msgstr "ZPL Etikettendrucker"
+
+msgid "Zebra"
+msgstr "Zebra"
+
+msgid "aborted"
+msgstr "abgebrochen"
+
+msgid "canceled"
+msgstr "abgebrochen"
+
+msgid "completed"
+msgstr "abgeschlossen"
+
+msgid "cups-deviced failed to execute."
+msgstr "„cups-deviced“ konnte nicht ausgeführt werden."
+
+msgid "cups-driverd failed to execute."
+msgstr "„cups-driverd“ konnte nicht ausgeführt werden."
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s"
+msgstr ""
+
+msgid "cupsctl: Cannot set Listen or Port directly."
+msgstr ""
+
+#, c-format
+msgid "cupsctl: Unable to connect to server: %s"
+msgstr ""
+
+#, c-format
+msgid "cupsctl: Unknown option \"%s\""
+msgstr ""
+
+#, c-format
+msgid "cupsctl: Unknown option \"-%c\""
+msgstr ""
+
+msgid "cupsd: Expected config filename after \"-c\" option."
+msgstr ""
+
+msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
+msgstr ""
+
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
+msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgstr ""
+
+msgid "cupsd: Unable to get current directory."
+msgstr ""
+
+msgid "cupsd: Unable to get path to cups-files.conf file."
+msgstr ""
+
+#, c-format
+msgid "cupsd: Unknown argument \"%s\" - aborting."
+msgstr ""
+
+#, c-format
+msgid "cupsd: Unknown option \"%c\" - aborting."
+msgstr ""
+
+#, c-format
+msgid "cupsfilter: Invalid document number %d."
+msgstr ""
+
+#, c-format
+msgid "cupsfilter: Invalid job ID %d."
+msgstr ""
+
+msgid "cupsfilter: Only one filename can be specified."
+msgstr ""
+
+#, c-format
+msgid "cupsfilter: Unable to get job file - %s"
+msgstr ""
+
+msgid "cupstestppd: The -q option is incompatible with the -v option."
+msgstr ""
+
+msgid "cupstestppd: The -v option is incompatible with the -q option."
+msgstr ""
+
+#, c-format
+msgid "device for %s/%s: %s"
+msgstr ""
+
+#, c-format
+msgid "device for %s: %s"
+msgstr ""
+
+msgid "error-index uses indefinite length"
+msgstr "Fehlerindex hat unbestimmte Länge"
+
+msgid "error-status uses indefinite length"
+msgstr "Fehlerstatus hat unbestimmte Länge"
+
+msgid "held"
+msgstr "gehalten"
+
+msgid "help\t\tGet help on commands."
+msgstr ""
+
+msgid "idle"
+msgstr "inaktiv"
+
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected key name after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr ""
+
+msgid "ippfind: Missing close parenthesis."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr ""
+
+msgid "ippfind: Missing open parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Out of memory."
+msgstr ""
+
+msgid "ippfind: Too many parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr ""
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr ""
+
+msgid "ipptool: Invalid seconds for \"-i\"."
+msgstr ""
+
+msgid "ipptool: May only specify a single URI."
+msgstr ""
+
+msgid "ipptool: Missing count for \"-n\"."
+msgstr ""
+
+msgid "ipptool: Missing filename for \"-f\"."
+msgstr ""
+
+msgid "ipptool: Missing name=value for \"-d\"."
+msgstr ""
+
+msgid "ipptool: Missing seconds for \"-i\"."
+msgstr ""
+
+msgid "ipptool: URI required before test file."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Unknown option \"-%c\"."
+msgstr ""
+
+msgid "job-printer-uri attribute missing."
+msgstr ""
+
+msgid "lpadmin: Class name can only contain printable characters."
+msgstr "lpadmin: Klassenname darf nur druckbare Zeichen enthalten."
+
+msgid "lpadmin: Expected PPD after \"-P\" option."
+msgstr "lpadmin: Nach der \"-P\" Option PPD erwartet."
+
+msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
+msgstr ""
+"lpadmin: Nach der \"-u\" Option wird eine allow/deny:userlist erwartet."
+
+msgid "lpadmin: Expected class after \"-r\" option."
+msgstr ""
+
+msgid "lpadmin: Expected class name after \"-c\" option."
+msgstr ""
+
+msgid "lpadmin: Expected description after \"-D\" option."
+msgstr ""
+
+msgid "lpadmin: Expected device URI after \"-v\" option."
+msgstr ""
+
+msgid "lpadmin: Expected file type(s) after \"-I\" option."
+msgstr ""
+
+msgid "lpadmin: Expected hostname after \"-h\" option."
+msgstr ""
+
+msgid "lpadmin: Expected interface after \"-i\" option."
+msgstr ""
+
+msgid "lpadmin: Expected location after \"-L\" option."
+msgstr ""
+
+msgid "lpadmin: Expected model after \"-m\" option."
+msgstr ""
+
+msgid "lpadmin: Expected name after \"-R\" option."
+msgstr ""
+
+msgid "lpadmin: Expected name=value after \"-o\" option."
+msgstr ""
+
+msgid "lpadmin: Expected printer after \"-p\" option."
+msgstr ""
+
+msgid "lpadmin: Expected printer name after \"-d\" option."
+msgstr ""
+
+msgid "lpadmin: Expected printer or class after \"-x\" option."
+msgstr ""
+
+msgid "lpadmin: No member names were seen."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Printer %s is already a member of class %s."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Printer %s is not a member of class %s."
+msgstr ""
+
+msgid "lpadmin: Printer name can only contain printable characters."
+msgstr "lpadmin: Druckername darf nur druckbare Zeichen enthalten."
+
+msgid ""
+"lpadmin: Unable to add a printer to the class:\n"
+" You must specify a printer name first."
+msgstr ""
+"lpadmin: Kann Drucker nicht zur Klasse hinzufügen:\n"
+" Der Druckername muss zuerst angegeben werden."
+
+#, c-format
+msgid "lpadmin: Unable to connect to server: %s"
+msgstr "lpadmin: Kann nicht mit dem Server %s verbinden."
+
+msgid "lpadmin: Unable to create temporary file"
+msgstr ""
+
+msgid ""
+"lpadmin: Unable to delete option:\n"
+" You must specify a printer name first."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgstr "lpadmin: Kann PPD Datei \"%s\" - %s nicht öffnen"
+
+msgid ""
+"lpadmin: Unable to remove a printer from the class:\n"
+" You must specify a printer name first."
+msgstr ""
+
+msgid ""
+"lpadmin: Unable to set the printer options:\n"
+" You must specify a printer name first."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unknown allow/deny option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unknown argument \"%s\"."
+msgstr "lpadmin: unbekanntes Argument \"%s\"."
+
+#, c-format
+msgid "lpadmin: Unknown option \"%c\"."
+msgstr ""
+
+msgid "lpadmin: Warning - content type list ignored."
+msgstr ""
+
+msgid "lpc> "
+msgstr "lpc> "
+
+msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"."
+msgstr ""
+
+msgid "lpinfo: Expected language after \"--language\"."
+msgstr ""
+
+msgid "lpinfo: Expected make and model after \"--make-and-model\"."
+msgstr ""
+
+msgid "lpinfo: Expected product string after \"--product\"."
+msgstr ""
+
+msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"."
+msgstr ""
+
+msgid "lpinfo: Expected scheme list after \"--include-schemes\"."
+msgstr ""
+
+msgid "lpinfo: Expected timeout after \"--timeout\"."
+msgstr ""
+
+#, c-format
+msgid "lpinfo: Unknown argument \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpinfo: Unknown option \"%c\"."
+msgstr ""
+
+#, c-format
+msgid "lpinfo: Unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpmove: Unable to connect to server: %s"
+msgstr ""
+
+#, c-format
+msgid "lpmove: Unknown argument \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpmove: Unknown option \"%c\"."
+msgstr ""
+
+msgid "lpoptions: No printers."
+msgstr ""
+
+#, c-format
+msgid "lpoptions: Unable to add printer or instance: %s"
+msgstr ""
+
+#, c-format
+msgid "lpoptions: Unable to get PPD file for %s: %s"
+msgstr ""
+
+#, c-format
+msgid "lpoptions: Unable to open PPD file for %s."
+msgstr ""
+
+msgid "lpoptions: Unknown printer or class."
+msgstr ""
+
+#, c-format
+msgid ""
+"lpstat: error - %s environment variable names non-existent destination \"%s"
+"\"."
+msgstr ""
+
+#, c-format
+msgid "members of class %s:"
+msgstr ""
+
+msgid "no entries"
+msgstr ""
+
+msgid "no system default destination"
+msgstr ""
+
+msgid "notify-events not specified."
+msgstr ""
+
+#, c-format
+msgid "notify-recipient-uri URI \"%s\" is already used."
+msgstr ""
+
+#, c-format
+msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
+msgstr ""
+
+msgid "pending"
+msgstr "in Verarbeitung"
+
+#, c-format
+msgid "ppdc: Adding include directory \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Adding/updating UI text from %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Bad boolean value (%s) on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Bad font attribute: %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Bad status keyword %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Choice found on line %d of %s with no Option."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected a filter definition on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected a program name on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected boolean value on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected charset after Font on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected choice code on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected choice name/text on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected color order for ColorModel on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected compression for ColorModel on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"ppdc: Expected driver type keyword following DriverType on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected encoding after Font on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected filename after #po %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected group name/text on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected include filename on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected integer on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected locale after #po on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after FileName on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after Font on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after Manufacturer on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after MediaSize on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after ModelName on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name after PCFileName on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name/text after %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name/text after Installable on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name/text after Resolution on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected option name/text on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected option section on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected option type on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected override field after Resolution on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected quoted string on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected real number on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
+"of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected selector after %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected status after Font on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected string after Copyright on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected string after Version on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected two option names on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected value after %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Expected version after Font on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Invalid #include/#po filename \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Invalid cost for filter on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Invalid empty program name for filter on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Loading driver information file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Loading messages for locale \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Loading messages from \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Missing #endif at end of \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Missing #if on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"ppdc: Need a msgid line before any translation strings on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: No message catalog provided for locale %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Option %s defined in two different groups on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Option %s redefined with a different type on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Option constraint must *name on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Too many nested #if's on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to create PPD file \"%s\" - %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to create output directory %s: %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to create output pipes: %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to execute cupstestppd: %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to find #po file %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to find localization for \"%s\" - %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to load localization file \"%s\" - %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unable to open %s: %s"
+msgstr ""
+
+#, c-format
+msgid "ppdc: Undefined variable (%s) on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unexpected text on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unknown driver type %s on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unknown message catalog format for \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Unterminated string starting with %c on line %d of %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Warning - overlapping filename \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Writing %s."
+msgstr ""
+
+#, c-format
+msgid "ppdc: Writing PPD files to directory \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
+msgstr ""
+
+#, c-format
+msgid "ppdmerge: Ignoring PPD file %s."
+msgstr ""
+
+#, c-format
+msgid "ppdmerge: Unable to backup %s to %s - %s"
+msgstr ""
+
+#, c-format
+msgid "printer %s disabled since %s -"
+msgstr ""
+
+#, c-format
+msgid "printer %s is idle. enabled since %s"
+msgstr ""
+
+#, c-format
+msgid "printer %s now printing %s-%d. enabled since %s"
+msgstr ""
+
+#, c-format
+msgid "printer %s/%s disabled since %s -"
+msgstr ""
+
+#, c-format
+msgid "printer %s/%s is idle. enabled since %s"
+msgstr ""
+
+#, c-format
+msgid "printer %s/%s now printing %s-%d. enabled since %s"
+msgstr ""
+
+msgid "processing"
+msgstr "in Verarbeitung"
+
+#, c-format
+msgid "request id is %s-%d (%d file(s))"
+msgstr ""
+
+msgid "request-id uses indefinite length"
+msgstr "Anfrage-ID hat unbestimmte Länge"
+
+msgid "scheduler is not running"
+msgstr ""
+
+msgid "scheduler is running"
+msgstr ""
+
+#, c-format
+msgid "stat of %s failed: %s"
+msgstr "Status von %s fehlgeschlagen: %s"
+
+msgid "status\t\tShow status of daemon and queue."
+msgstr ""
+
+msgid "stopped"
+msgstr "angehalten"
+
+#, c-format
+msgid "system default destination: %s"
+msgstr ""
+
+#, c-format
+msgid "system default destination: %s/%s"
+msgstr ""
+
+msgid "unknown"
+msgstr "Unbekannt"
+
+msgid "untitled"
+msgstr "Ohne Titel"
+
+msgid "variable-bindings uses indefinite length"
+msgstr "variable-bindings hat unbestimmte Länge"
+
+#~ msgid "720dpi"
+#~ msgstr "720 dpi"
+
+#~ msgid "Enter old password:"
+#~ msgstr "Altes Passwort eingeben :"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Neues Passwort wiederholen :"
+
+#~ msgid "Enter password:"
+#~ msgstr "Neues Passwort eingeben :"
+
+#~ msgid "Looking for printer."
+#~ msgstr "Suche nach Drucker."
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Neue Stylus Color Serie"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Neue Stylus Photo Serie"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Aufträge löschen"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color Serie"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo Serie"
diff --git a/locale/cups_es.po b/locale/cups_es.po
index b5e7b0a..fcef34c 100644
--- a/locale/cups_es.po
+++ b/locale/cups_es.po
@@ -16,11 +16,11 @@ msgid ""
msgstr ""
"Project-Id-Version: CUPS 1.6\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
-"PO-Revision-Date: 2012-07-01 20:21+0100\n"
-"Last-Translator: Juan Pablo González Riopedre <riopedre13@yahoo.es>\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2014-09-23 23:45+0100\n"
+"Last-Translator: Juan Pablo González Riopedre <jpgriopedre@yahoo.es>\n"
"Language-Team: Spanish\n"
-"Language: \n"
+"Language: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -50,7 +50,7 @@ msgid "\tBanner required"
msgstr "\tSe necesita un rótulo"
msgid "\tCharset sets:"
-msgstr "\tAjustes del juego de caracteres:"
+msgstr "\tJuegos de caracteres:"
msgid "\tConnection: direct"
msgstr "\tConexión: directa"
@@ -153,7 +153,7 @@ msgstr " Ignorar advertencias (warnings) específicas."
msgid " Issue warnings instead of errors."
msgstr ""
-" Emitor advertencias (warnings) en vez de errores."
+" Emitir advertencias (warnings) en vez de errores."
msgid " REF: Page 15, section 3.1."
msgstr " REF: Página 15, sección 3.1."
@@ -365,7 +365,7 @@ msgstr " %s %s %s no existe."
#, c-format
msgid " %s %s file \"%s\" has the wrong capitalization."
-msgstr " %s archivo %s \"%s\" tiene las mayúsculas equivocadas"
+msgstr " %s %s archivo \"%s\" tiene las mayúsculas equivocadas."
#, c-format
msgid ""
@@ -391,7 +391,7 @@ msgstr " %s Valor cupsFilter \"%s\" incorrecto."
#, c-format
msgid " %s Bad cupsFilter2 value \"%s\"."
-msgstr " %s Valor cupsFilter2 incorrecto \"%s\"."
+msgstr " %s Valor cupsFilter2 \"%s\" incorrecto."
#, c-format
msgid " %s Bad cupsICCProfile %s."
@@ -427,7 +427,7 @@ msgstr " %s Las preferencias predeterminadas están en conflicto."
#, c-format
msgid " %s Empty cupsUIConstraints %s"
-msgstr " %s cupsUIConstraints %s vacío."
+msgstr " %s cupsUIConstraints vacío %s"
#, c-format
msgid " %s Missing \"%s\" translation string for option %s, choice %s."
@@ -510,7 +510,7 @@ msgstr ""
#, c-format
msgid " %s cupsICCProfile %s hash value collides with %s."
-msgstr " %s valor hash de cupsICCProfile %s colisiona con %s."
+msgstr " %s Valor hash de cupsICCProfile %s colisiona con %s."
#, c-format
msgid " %s cupsUIResolver %s causes a loop."
@@ -924,6 +924,12 @@ msgstr " Advertencia: no hay comentario %%EndComments en el archivo."
msgid " Warning: obsolete DSC version %.1f in file."
msgstr " Advertencia: versión DSC %.1f obsoleta en el archivo."
+msgid " ! expression Unary NOT of expression."
+msgstr " ! expresión NOT unario de la expresión."
+
+msgid " ( expressions ) Group expressions."
+msgstr " ( expresiones ) Agrupar expresiones."
+
msgid " --[no-]debug-logging Turn debug logging on/off."
msgstr " --[no-]debug-logging Activar/desactivar registro de depuración."
@@ -948,9 +954,105 @@ msgstr " --cr Finalizar líneas con CR (Mac OS 9)."
msgid " --crlf End lines with CR + LF (Windows)."
msgstr " --crlf Finalizar líneas con CR + LF (Windows)."
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+" --domain regex Hacer coincidir el dominio con la expresión "
+"regular."
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+" --exec utilidad [argumento ...] ;\n"
+" Ejecutar programa si es cierto."
+
+msgid " --false Always false."
+msgstr " --false Siempre falso."
+
+msgid " --help Show help."
+msgstr " --help Muestra ayuda."
+
+msgid " --help Show this help."
+msgstr " --help Muestra esta ayuda."
+
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+" --host regex Hacer coincidir el nombre del equipo con la "
+"expresión regular."
+
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr " --lf Finalizar líneas con LF (UNIX/Linux/OS X)."
+msgid " --list-filters List filters that will be used."
+msgstr " --list-filters Listar los filtros a usar."
+
+msgid " --local True if service is local."
+msgstr " --local Cierto si el servicio es local."
+
+msgid " --ls List attributes."
+msgstr " --ls Lista atributos."
+
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+" --name regex Hacer coincidir el servicio con la expresión "
+"regular."
+
+msgid " --not expression Unary NOT of expression."
+msgstr " [parcial]expresión NOT unario de la expresión."
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+" --path regex Hacer coincidir la ruta del recurso con la "
+"expresión regular."
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+" --port número[-número] Hacer coincidir el puerto con un número o "
+"intervalo de números."
+
+msgid " --print Print URI if true."
+msgstr " --print Imprimir URI si es cierto."
+
+msgid " --print-name Print service name if true."
+msgstr " --print-name Imprimir nombre del servicio si es cierto."
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+" --quiet Silenciosamente informar de la coincidencia via "
+"código de salida."
+
+msgid " --remote True if service is remote."
+msgstr " --remote Cierto si el servicio es remoto."
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+" --stop-after-include-error\n"
+" Detiene las pruebas tras un INCLUDE fallido."
+
+msgid " --true Always true."
+msgstr " --true Siempre cierto."
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr ""
+" --txt clave Cierto si el registro TXT contiene la clave."
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+" --txt-* regex Hacer coincidir la clave del registro TXT a la "
+"expresión regular."
+
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+" --uri regex Hacer coincidir la URI a la expresión regular."
+
+msgid " --version Show program version."
+msgstr " --version Muestra la versión del programa."
+
+msgid " --version Show version."
+msgstr " --version Muestra la versión."
+
msgid " -4 Connect using IPv4."
msgstr " -4 Conectar usando IPv4."
@@ -996,15 +1098,32 @@ msgstr " -I {filename,filters,none,profiles}"
msgid " -L Send requests using content-length."
msgstr " -L Envía peticiones usando content-length."
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+" -P filename.plist Produce plist XML a un archivo y un informe de "
+"prueba a la salida estandar."
+
msgid " -P filename.ppd Set PPD file."
msgstr " -P nombre_archivo.ppd Establece archivo PPD."
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+" -P número[-número] Hacer coincidir el puerto con un número o intervalo "
+"de números."
+
msgid " -R root-directory Set alternate root."
msgstr " -R directorio-raíz Establece directorio raíz alternativo."
msgid " -S Test with SSL encryption."
msgstr " -S Prueba con cifrado SSL."
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr ""
+" -T segundos Establece el tiempo de espera de navegación en "
+"segundos."
+
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr ""
" -T segundos Establece el tiempo de espera de recepción/envío "
@@ -1027,15 +1146,28 @@ msgid " -X Produce XML plist instead of plain text."
msgstr ""
" -X Produce XML plist en vez de texto sin formato."
+msgid " -a Browse for all services."
+msgstr " -a Explorar todos los servicios."
+
msgid " -a Export all printers."
msgstr " -a Exporta todas las impresoras."
+msgid " -c Produce CSV output."
+msgstr " -c Produce salida CSV."
+
msgid " -c catalog.po Load the specified message catalog."
msgstr " -c catálogo.po Carga el catálogo de mensajes especificado."
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr " -c cups-files.conf Establece el archivo cups-files.conf a usar."
+
msgid " -c cupsd.conf Set cupsd.conf file to use."
msgstr " -c cupsd.conf Establece el archivo cupsd.conf a usar."
+msgid " -d domain Browse/resolve in specified domain."
+msgstr ""
+" -d dominio Explora/resuelve en el dominio especificado."
+
msgid " -d name=value Set named variable to value."
msgstr " -d nombre=valor Establece la variable al valor."
@@ -1045,6 +1177,10 @@ msgstr " -d dir-salida Especifica el directorio de salida."
msgid " -d printer Use the named printer."
msgstr " -d impresora Usa la impresora especificada."
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+" -d regex Hacer coincidir el dominio con la expresión regular."
+
msgid " -e Use every filter from the PPD file."
msgstr " -e Usa cada filtro desde el archivo PPD."
@@ -1058,6 +1194,11 @@ msgstr ""
msgid " -h Show this usage message."
msgstr " -h Muestra este mensaje de uso."
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+" -h regex Hacer coincidir el nombre del equipo con la "
+"expresión regular."
+
msgid " -h server[:port] Specify server address."
msgstr " -h servidor[:puerto] Especifica la dirección del servidor."
@@ -1079,8 +1220,14 @@ msgstr ""
" -j id-trabajo[,N] Filtra el archivo N desde el trabajo "
"especificado (predeterminado archivo 1)."
-msgid " -l Run cupsd from launchd(8)."
-msgstr " -l Ejecuta cupsd desde launchd(8)."
+msgid " -l List attributes."
+msgstr " -l Lista atributos."
+
+msgid " -l Produce plain text output."
+msgstr " -l Produce salida en texto plano."
+
+msgid " -l Run cupsd on demand."
+msgstr " -l Ejecuta cupsd según demanda."
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
msgstr ""
@@ -1106,6 +1253,11 @@ msgstr ""
" -n contador Repite el último archivo el número de veces "
"especificado."
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+" -n regex Hacer coincidir el nombre del servicio con la "
+"expresión regular."
+
msgid ""
" -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
@@ -1120,15 +1272,34 @@ msgstr ""
msgid " -o name=value Set option(s)."
msgstr " -o nombre=valor Establece opciones."
+msgid " -p Print URI if true."
+msgstr " -p Imprimir URI si es cierto."
+
msgid " -p filename.ppd Set PPD file."
msgstr " -p nombre_archivo.ppd Establece archivo PPD."
+msgid " -p program Run specified program for each service."
+msgstr ""
+" -p program Ejecuta el programa especificado para cada "
+"servicio."
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+" -q Silenciosamente informar de la coincidencia via "
+"código de salida."
+
msgid " -q Run silently."
msgstr " -q Ejecución silenciosa."
+msgid " -r True if service is remote."
+msgstr " -r Cierto si el servicio es remoto."
+
msgid " -r Use 'relaxed' open mode."
msgstr " -r Usa modo abierto 'relajado'."
+msgid " -s Print service name if true."
+msgstr " -s Imprimir nombre del servicio si es cierto."
+
msgid " -t Produce a test report."
msgstr " -t Produce un informe de la prueba."
@@ -1138,21 +1309,110 @@ msgstr " -t Prueba los PPDs en vez de generarlos."
msgid " -t Test the configuration file."
msgstr " -t Prueba el archivo de configuración."
+msgid " -t key True if the TXT record contains the key."
+msgstr " -t clave Cierto si el registro TXT contiene la clave."
+
msgid " -t title Set title."
-msgstr " -t título Establece título."
+msgstr " -t título Establece título."
+
+msgid " -t type Browse/resolve with specified type."
+msgstr " -t tipo Explora/resuelve con el tipo especificado."
msgid " -u Remove the PPD file when finished."
msgstr " -u Borra el archivo PPD tras terminar."
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+" -u regex Hacer coincidir la URI a la expresión regular."
+
msgid " -v Be verbose."
-msgstr " -v Ser detallado."
+msgstr " -v Ser detallado."
msgid " -vv Be very verbose."
msgstr " -vv Ser muy detallado."
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+" -x utilidad [argumento ...] ;\n"
+" Ejecutar programa si es cierto."
+
msgid " -z Compress PPD files using GNU zip."
msgstr " -z Comprimir archivos PPD usando GNU zip."
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr " IPPFIND_SERVICE_DOMAIN Nombre de dominio"
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Nombre de dominio completo"
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr " IPPFIND_SERVICE_NAME Nombre de la instancia del servicio"
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr " IPPFIND_SERVICE_PORT Número del puerto"
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr " IPPFIND_SERVICE_REGTYPE Tipo de registro DNS-SD"
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr " IPPFIND_SERVICE_SCHEME Esquema URI"
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr " IPPFIND_SERVICE_URI URI"
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr " IPPFIND_TXT_* Valor de la clave del registro TXT"
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+" expresión --and expresión\n"
+" AND lógico."
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+" expresión --or expresión\n"
+" OR lógico."
+
+msgid " expression expression Logical AND."
+msgstr " expresión expresión AND lógico."
+
+msgid " {service_domain} Domain name"
+msgstr " {service_domain} Nombre de dominio"
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr " {service_hostname} Nombre de dominio completo"
+
+msgid " {service_name} Service instance name"
+msgstr " {service_name} Nombre de la instancia del servicio"
+
+msgid " {service_port} Port number"
+msgstr " {service_port} Número de puerto"
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr " {service_regtype} Tipo de registro DNS-SD"
+
+msgid " {service_scheme} URI scheme"
+msgstr " {service_scheme} Esquema URI"
+
+msgid " {service_uri} URI"
+msgstr " {service_uri} URI"
+
+msgid " {txt_*} Value of TXT record key"
+msgstr " {txt_*} Valor de la clave del registro TXT"
+
+msgid " {} URI"
+msgstr " {} URI"
+
msgid " FAIL"
msgstr " FALLO"
@@ -1160,14 +1420,248 @@ msgid " PASS"
msgstr " PASA"
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr "\"%s\": Valor URI \"%s\" incorrecto - %s (RFC 2911 sección 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": Valor URI \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Nombre de atributo incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Nombre de atributo incorrecto - carácter inválido (RFC 2911 sección "
+"4.1.3)."
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": Valor lógico \"%d\" incorrecto (RFC 2911 sección 4.1.11)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": Valor del juego de caracteres \"%s\" incorrecto - caracteres "
+"incorrectos (RFC 2911 sección 4.1.7)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": Valor del juego de caracteres \"%s\" incorrecto - longitud %d "
+"incorrecta (RFC 2911 sección 4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Horas dateTime UTC %u incorrectas (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Minutos dateTime UTC %u incorrectos (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Signo dateTime UTC %c incorrecto (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Día dateTime %u incorrecto (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": Décimas de segundo dateTime %u incorrectas (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Horas dateTime %u incorrectas (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Minutos dateTime %u incorrectos (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Mes dateTime %u incorrecto (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Segundos dateTime %u incorrectos (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+"\"%s\": Valor enumerado %d incorrecto - fuera de intervalo (RFC 2911 sección "
+"4.1.4)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Valor clave \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": Valor clave \"%s\" incorrecto - carácter inválido (RFC 2911 sección "
+"4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": Valor mimeMediaType \"%s\" incorrecto - caracteres incorrectos (RFC "
+"2911 sección 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": Valor mimeMediaType \"%s\" incorrecto - longitud %d incorrecta (RFC "
+"2911 sección 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": Valor del nombre \"%s\" incorrecto - secuencia UTF-8 incorrecta (RFC "
+"2911 sección 4.1.2)."
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": Valor del nombre \"%s\" incorrecto - longitud %d incorrecta (RFC "
+"2911 sección 4.1.2)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Valor naturalLanguage \"%s\" incorrecto - caracteres incorrectos "
+"(RFC 2911 sección 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Valor naturalLanguage \"%s\" incorrecto - longitud %d incorrecta "
+"(RFC 2911 sección 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": Valor octetString incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.10)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": Valor rangeOfInteger %d-%d incorrecto - el más bajo es mayor que el "
+"más alto (RFC 2911 section 4.1.13)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": Valor de resolución %dx%d%s incorrecto - valores de unidades "
+"incorrectas (RFC 2911 section 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Valor de resolución %dx%d%s incorrecto - la resolución de la "
+"alimentación cruzada debe ser positiva (RFC 2911 sección 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Valor de resolución %dx%d%s incorrecto - la resolución de la "
+"alimentación debe ser positiva (RFC 2911 sección 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Valor del texto \"%s\" incorrecto - secuencia UTF-8 incorrecta (RFC "
+"2911 sección 4.1.1)."
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Valor del texto \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.1)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Valor uriScheme \"%s\" incorrecto - caracteres incorrectos (RFC 2911 "
+"sección 4.1.6)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Valor uriScheme \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.6)."
#, c-format
msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
#, c-format
+msgid "%d x %d mm"
+msgstr "%d x %d mm"
+
+#, c-format
+msgid "%g x %g"
+msgstr "%g x %g"
+
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr "%s (%s, %s)"
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr "%s (Sin bordes)"
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr "%s (Sin bordes, %s)"
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr "%s (Sin bordes, %s, %s)"
+
+#, c-format
msgid "%s accepting requests since %s"
msgstr "%s aceptando peticiones desde %s"
@@ -1201,7 +1695,7 @@ msgstr "%s no acepta peticiones desde %s -"
#, c-format
msgid "%s not supported."
-msgstr "No se admite el uso de %s."
+msgstr "%s no está implementado."
#, c-format
msgid "%s/%s accepting requests since %s"
@@ -1225,6 +1719,14 @@ msgid "%s: %s failed: %s"
msgstr "%s: %s ha fallado: %s"
#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr "%s: Versión %s incorrecta para \"-V\"."
+
+#, c-format
msgid "%s: Don't know what to do."
msgstr "%s: No sé que hay que hacer."
@@ -1236,7 +1738,7 @@ msgstr ""
#, c-format
msgid "%s: Error - add '/version=1.1' to server name."
-msgstr ""
+msgstr "%s: Error - añada '/version=1.1' al nombre del servidor."
#, c-format
msgid "%s: Error - bad job ID."
@@ -1264,23 +1766,19 @@ msgstr "%s: Error - se esperaba un tipo de contenido tras la opción \"-T\"."
#, c-format
msgid "%s: Error - expected copies after \"-#\" option."
-msgstr "%s: Error - se esperaba número de copias tras la opción \"-#\"."
+msgstr "%s: Error - se esperaba número de copias tras la opción \"-#\"."
#, c-format
msgid "%s: Error - expected copies after \"-n\" option."
-msgstr "%s: Error - se esperaba número de copias tras la opción \"-n\"."
+msgstr "%s: Error - se esperaba número de copias tras la opción \"-n\"."
#, c-format
msgid "%s: Error - expected destination after \"-P\" option."
msgstr "%s: Error - se esperaba un destino tras la opción \"-P\"."
#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr "%s: Error - se esperaba un destino tras la opción \"-b\"."
-
-#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
-msgstr "%s: Error - se esperaba un destino tras la opción \"-d\"."
+msgstr "%s: Error - se esperaba un destino tras la opción \"-d\"."
#, c-format
msgid "%s: Error - expected form after \"-f\" option."
@@ -1292,11 +1790,11 @@ msgstr "%s: Error - se esperaba un nombre de retención tras la opción \"-H\"."
#, c-format
msgid "%s: Error - expected hostname after \"-H\" option."
-msgstr "%s: Error - se esperaba un nombre de ordenador tras la opción \"-H\"."
+msgstr "%s: Error - se esperaba un nombre de equipo tras la opción \"-H\"."
#, c-format
msgid "%s: Error - expected hostname after \"-h\" option."
-msgstr "%s: Error - se esperaba un nombre de ordenador tras la opción \"-h\"."
+msgstr "%s: Error - se esperaba un nombre de equipo tras la opción \"-h\"."
#, c-format
msgid "%s: Error - expected mode list after \"-y\" option."
@@ -1304,7 +1802,7 @@ msgstr "%s: Error - se esperaba una lista de modos tras la opción \"-y\"."
#, c-format
msgid "%s: Error - expected name after \"-%c\" option."
-msgstr "%s: Error - se esperaba un nombre tras la opción \"%c\"."
+msgstr "%s: Error - se esperaba un nombre tras la opción \"-%c\"."
#, c-format
msgid "%s: Error - expected option=value after \"-o\" option."
@@ -1336,7 +1834,7 @@ msgstr "%s: Error - se esperaba un nombre de usuario tras la opción \"-u\"."
#, c-format
msgid "%s: Error - expected value after \"-%c\" option."
-msgstr "%s: Error - se esperaba un valor tras la opción \"%c\"."
+msgstr "%s: Error - se esperaba un valor tras la opción \"-%c\"."
#, c-format
msgid ""
@@ -1384,11 +1882,11 @@ msgstr "%s: Error - opción \"%c\" desconocida."
#, c-format
msgid "%s: Error - unknown option \"%s\"."
-msgstr "%s: Error: opción \"%s\" desconocida."
+msgstr "%s: Error - opción \"%s\" desconocida."
#, c-format
msgid "%s: Expected job ID after \"-i\" option."
-msgstr "%s : Se esperaba una ID de trabajo tras la opción \"-i\"."
+msgstr "%s: Se esperaba una ID de trabajo tras la opción \"-i\"."
#, c-format
msgid "%s: Invalid destination name in list \"%s\"."
@@ -1399,6 +1897,18 @@ msgid "%s: Invalid filter string \"%s\"."
msgstr "%s: Cadena de filtro \"%s\" no válida."
#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr "%s: Falta el nombre del archivo para \"-P\"."
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr "%s: Falta el tiempo de espera para \"-T\"."
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr "%s: Falta la versión para \"-V\"."
+
+#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
msgstr ""
"%s: Se necesita un ID de trabajo (\"-i id_trabajo\") antes de \"-H restart\"."
@@ -1413,7 +1923,11 @@ msgstr "%s: La operación ha fallado: %s"
#, c-format
msgid "%s: Sorry, no encryption support."
-msgstr "%s: Lo siento, no está compilado con la opción de cifrado."
+msgstr "%s: Lo siento, no está implementado el cifrado."
+
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
#, c-format
msgid "%s: Unable to connect to server."
@@ -1424,10 +1938,18 @@ msgid "%s: Unable to contact server."
msgstr "%s: No se ha podido contactar con el servidor."
#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
msgstr "%s: No se ha podido determinar el tipo MIME de \"%s\"."
#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr "%s: No se pudo abrir \"%s\": %s"
+
+#, c-format
msgid "%s: Unable to open %s: %s"
msgstr "%s: No se pudo abrir %s: %s"
@@ -1440,6 +1962,10 @@ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
msgstr "%s: No se pudo leer base de datos MIME desde \"%s\" o \"%s\"."
#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
msgid "%s: Unknown destination \"%s\"."
msgstr "%s: Destino \"%s\" desconocido."
@@ -1452,6 +1978,14 @@ msgid "%s: Unknown option \"%c\"."
msgstr "%s: Opción \"%c\" desconocida."
#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr "%s: Opción \"%s\" desconocida."
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr "%s: Opción \"-%c\" desconocida."
+
+#, c-format
msgid "%s: Unknown source MIME type %s/%s."
msgstr "%s: Tipo MIME de origen %s/%s desconocido."
@@ -2007,9 +2541,6 @@ msgstr "7 x 9"
msgid "70"
msgstr "70"
-msgid "720dpi"
-msgstr "720ppp"
-
msgid "75"
msgstr "75"
@@ -2273,7 +2804,7 @@ msgstr "B9"
#, c-format
msgid "Bad 'document-format' value \"%s\"."
-msgstr ""
+msgstr "Valor 'document-format' \"%s\" incorrecto."
msgid "Bad NULL dests pointer"
msgstr "Puntero destino NULLincorrecto"
@@ -2299,6 +2830,9 @@ msgstr "Número de versión SNMP incorrecto"
msgid "Bad UIConstraints"
msgstr "UIConstraints incorrecto"
+msgid "Bad arguments to function"
+msgstr "Argumentos de la función incorrectos"
+
#, c-format
msgid "Bad copies value %d."
msgstr "Valor de copias %d incorrecto."
@@ -2325,14 +2859,15 @@ msgstr "document-format-default \"%s\" incorrecto."
msgid "Bad filename buffer"
msgstr "Nombre de archivo del búfer incorrecto"
-msgid "Bad job-name value: Bad UTF-8 sequence."
-msgstr ""
+msgid "Bad hostname/address in URI"
+msgstr "Nombre de equipo/dirección incorrecto en la URI"
-msgid "Bad job-name value: Name too long."
-msgstr ""
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Valor job-name incorrecto: %s"
msgid "Bad job-name value: Wrong type or count."
-msgstr ""
+msgstr "Valor job-name incorrecto: tipo o contador equivocado."
msgid "Bad job-priority value."
msgstr "Valor job-priority incorrecto."
@@ -2371,17 +2906,20 @@ msgstr "Opción + preferencia incorrectas en línea %d."
msgid "Bad page-ranges values %d-%d."
msgstr "Valores de page-ranges %d-%d incorrectos."
+msgid "Bad port number in URI"
+msgstr "Número de puerto incorrecto en URI"
+
#, c-format
msgid "Bad port-monitor \"%s\"."
msgstr "port-monitor \"%s\" incorrecto."
-msgid "Bad printer URI."
-msgstr "URI de impresora incorrecto."
-
#, c-format
msgid "Bad printer-state value %d."
msgstr "Valor printer-state %d incorrecto."
+msgid "Bad printer-uri."
+msgstr "printer-uri incorrecto."
+
#, c-format
msgid "Bad request ID %d."
msgstr "Petición incorrecta de ID %d."
@@ -2390,12 +2928,24 @@ msgstr "Petición incorrecta de ID %d."
msgid "Bad request version number %d.%d."
msgstr "Petición incorrecta de número de versión %d.%d."
+msgid "Bad resource in URI"
+msgstr "Recurso incorrecto en URI"
+
+msgid "Bad scheme in URI"
+msgstr "Esquema incorrecto en URI"
+
msgid "Bad subscription ID"
msgstr "ID de subscripción incorrecto"
+msgid "Bad username in URI"
+msgstr "Nombre de usuario incorrecto en URI"
+
msgid "Bad value string"
msgstr "Cadena de valores incorrecta"
+msgid "Bad/empty URI"
+msgstr "URI incorrecta/vacía"
+
msgid "Banners"
msgstr "Rótulos"
@@ -2415,6 +2965,9 @@ msgstr "CMYK"
msgid "CPCL Label Printer"
msgstr "Impresora de etiquetas CPCL"
+msgid "Cancel Jobs"
+msgstr "Cancelar trabajos"
+
msgid "Cancel RSS Subscription"
msgstr "Cancelar subscripción RSS"
@@ -2583,6 +3136,9 @@ msgstr "Editar archivo de configuración"
msgid "Empty PPD file."
msgstr "Archivo PPD vacío."
+msgid "Encryption is not supported."
+msgstr "El cifrado no está implementado."
+
#. TRANSLATORS: Banner/cover sheet after the print job.
msgid "Ending Banner"
msgstr "Rótulo final"
@@ -2590,15 +3146,6 @@ msgstr "Rótulo final"
msgid "English"
msgstr "Spanish"
-msgid "Enter old password:"
-msgstr "Introduzca la contraseña antigua:"
-
-msgid "Enter password again:"
-msgstr "Introduzca nuevamente la contraseña:"
-
-msgid "Enter password:"
-msgstr "Introduzca la contraseña:"
-
msgid ""
"Enter your username and password or the root username and password to access "
"this page. If you are using Kerberos authentication, make sure you have a "
@@ -2609,7 +3156,7 @@ msgstr ""
"autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido."
msgid "Envelope #10 "
-msgstr "Sobre #10"
+msgstr "Sobre #10 "
msgid "Envelope #11"
msgstr "Sobre #11"
@@ -2699,7 +3246,7 @@ msgid "Envelope Monarch"
msgstr "Sobre Monarch"
msgid "Envelope PRC1 "
-msgstr "Sobre PRC1"
+msgstr "Sobre PRC1 "
msgid "Envelope PRC1 Long Edge"
msgstr "Sobre PRC1 lado largo"
@@ -2767,17 +3314,23 @@ msgstr "Sobre You4"
msgid "Envelope You4 Long Edge"
msgstr "Sobre You4 lado largo"
+msgid "Environment Variables:"
+msgstr "Variables de entorno:"
+
msgid "Epson"
msgstr "Epson"
msgid "Error Policy"
msgstr "Directiva de error"
+msgid "Error reading raster data."
+msgstr ""
+
msgid "Error sending raster data."
msgstr "Error enviando trama de datos (raster)."
msgid "Error: need hostname after \"-h\" option."
-msgstr "Error: se necesita un nombre de ordenador tras la opción \"-h\"."
+msgstr "Error: se necesita un nombre de equipo tras la opción \"-h\"."
msgid "Every 10 Labels"
msgstr "Cada 10 etiquetas"
@@ -2818,6 +3371,9 @@ msgstr "Lo que se esperaba, falló."
msgid "Export Printers to Samba"
msgstr "Exportar impresoras a Samba"
+msgid "Expressions:"
+msgstr "Expresiones:"
+
msgid "FAIL"
msgstr "FALLO"
@@ -2851,7 +3407,7 @@ msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
msgstr "Permisos del archivo \"%s\" OK (0%o/uid=%d/gid=%d)."
msgid "File Folder "
-msgstr "Carpeta de archivo"
+msgstr "Carpeta de archivo "
#, c-format
msgid ""
@@ -2896,13 +3452,13 @@ msgid "Hanging Folder"
msgstr "Carpeta colgante"
msgid "Help file not in index."
-msgstr "El archivo de ayuda no está en el índice"
+msgstr "El archivo de ayuda no está en el índice."
msgid "IPP 1setOf attribute with incompatible value tags."
-msgstr "IPP atributo 1setOf con etiquetas de valor incompatibles"
+msgstr "Atributo IPP 1setOf con etiquetas de valor incompatibles."
msgid "IPP attribute has no name."
-msgstr "IPP atributo sin nombre"
+msgstr "Atributo IPP sin nombre."
msgid "IPP attribute is not a member of the message."
msgstr "El atributo IPP no es un miembro del mensaje."
@@ -2931,6 +3487,9 @@ msgstr "IPP el valor entero no es de 4 bytes."
msgid "IPP language length overflows value."
msgstr "IPP la longitud del idioma sobrepasa el valor."
+msgid "IPP language length too large."
+msgstr "Longitud de idioma IPP demasiado larga."
+
msgid "IPP member name is not empty."
msgstr "IPP el nombre del miembro no está vacío."
@@ -2938,7 +3497,7 @@ msgid "IPP memberName value is empty."
msgstr "IPP el valor memberName está vacío."
msgid "IPP memberName with no attribute."
-msgstr ""
+msgstr "IPP memberName sin atributo."
msgid "IPP name larger than 32767 bytes."
msgstr "IPP nombre mayor de 32767 bytes."
@@ -2946,6 +3505,9 @@ msgstr "IPP nombre mayor de 32767 bytes."
msgid "IPP nameWithLanguage value less than minimum 4 bytes."
msgstr "IPP el valor nameWithLanguage menor del mínimo de 4 bytes."
+msgid "IPP octetString length too large."
+msgstr "Longitud de IPP octetString demasiado larga."
+
msgid "IPP rangeOfInteger value not 8 bytes."
msgstr "IPP el valor rangeOfInteger no es de 8 bytes."
@@ -3006,8 +3568,11 @@ msgstr "Correo por Internet Parte-3"
msgid "Internet Printing Protocol"
msgstr "Protocolo de Impresión de Internet IPP"
+msgid "Invalid media name arguments."
+msgstr "Argumentos del nombre del papel no válidos."
+
msgid "Invalid media size."
-msgstr "Tamaño del papel no válido"
+msgstr "Tamaño de papel no válido."
#, c-format
msgid "Invalid printer command \"%s\"."
@@ -3155,11 +3720,14 @@ msgstr "Línea más larga que el máximo permitido (255 caracteres)"
msgid "List Available Printers"
msgstr "Listar impresoras disponibles"
+msgid "Load paper."
+msgstr "Cargar papel."
+
msgid "Long-Edge (Portrait)"
msgstr "Lado largo (retrato)"
-msgid "Looking for printer."
-msgstr "Buscando impresora."
+msgid "Looking for printer..."
+msgstr ""
msgid "Manual Feed"
msgstr "Alimentación manual"
@@ -3222,6 +3790,12 @@ msgstr "Falta el atributo requesting-user-name."
msgid "Missing required attributes."
msgstr "Faltan atributos necesarios."
+msgid "Missing resource in URI"
+msgstr "Falta recurso en URI"
+
+msgid "Missing scheme in URI"
+msgstr "Falta esquema en URI"
+
#, c-format
msgid "Missing value on line %d."
msgstr "Falta un valor en la línea %d."
@@ -3247,6 +3821,9 @@ msgstr ""
" make-and-model = %s\n"
" device-id = %s"
+msgid "Modifiers:"
+msgstr "Modificadores:"
+
msgid "Modify Class"
msgstr "Modificar clase"
@@ -3274,12 +3851,6 @@ msgstr "No se permiten clases anidadas."
msgid "Never"
msgstr "Nunca"
-msgid "New Stylus Color Series"
-msgstr "Nueva Stylus Color Series"
-
-msgid "New Stylus Photo Series"
-msgstr "Nueva Stylus Photo Series"
-
msgid "No"
msgstr "No"
@@ -3298,6 +3869,9 @@ msgstr "No está instalado ningún controlador de impresora de Windows."
msgid "No active connection"
msgstr "No hay conexión activa"
+msgid "No active connection."
+msgstr "No hay conexión activa."
+
#, c-format
msgid "No active jobs on %s."
msgstr "No hay trabajos activos en %s."
@@ -3329,7 +3903,7 @@ msgid "No error-status"
msgstr "No hay error-status"
msgid "No file in print request."
-msgstr "No hay ningún archivo en la petición de impresión."
+msgstr "No hay ningún archivo en la solicitud de impresión."
msgid "No modification time"
msgstr "No hay tiempo de modificación"
@@ -3350,7 +3924,16 @@ msgid "No printer-uri found for class"
msgstr "No se encontró printer-uri para la clase"
msgid "No printer-uri in request."
-msgstr "No hay printer-uri en la petición."
+msgstr "No hay printer-uri en la solicitud."
+
+msgid "No request URI."
+msgstr "No se ha solicitado URI."
+
+msgid "No request protocol version."
+msgstr "No se ha solicitado versión del protocolo."
+
+msgid "No request sent."
+msgstr "No se ha enviado solicitud."
msgid "No request-id"
msgstr "No hay request-id"
@@ -3389,7 +3972,7 @@ msgid "Not Modified"
msgstr "No modificado"
msgid "Not Supported"
-msgstr "No permitido"
+msgstr "No implementado"
msgid "Not allowed to print."
msgstr "No se permite imprimir."
@@ -3436,7 +4019,7 @@ msgid "Options Installed"
msgstr "Opciones instaladas"
msgid "Options:"
-msgstr "Opciones: "
+msgstr "Opciones:"
msgid "Out of date PPD cache file."
msgstr "Archivo de caché PPD obsoleto."
@@ -3447,23 +4030,14 @@ msgstr "Sin memoria."
msgid "Output Mode"
msgstr "Modo de salida"
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr "La salida de la impresora %s se ha enviado a %s"
+msgid "Output bin is almost full."
+msgstr "El recipiente de salida está casi lleno."
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr ""
-"La salida de la impresora %s se ha enviado a la impresora remota %s en %s"
-
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr "La salida de la impresora %s/%s se ha enviado a %s"
+msgid "Output bin is full."
+msgstr "El recipiente de salida está lleno."
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
-msgstr ""
-"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s"
+msgid "Output bin is missing."
+msgstr "No se encuentra el recipiente de salida."
msgid "PASS"
msgstr "PASA"
@@ -3495,6 +4069,18 @@ msgstr "El paquete no contiene un Get-Response-PDU"
msgid "Packet does not start with SEQUENCE"
msgstr "El paquete no empieza por SEQUENCE"
+msgid "Paper jam."
+msgstr "Atasco de papel."
+
+msgid "Paper tray is almost empty."
+msgstr "La bandeja de papel está casi vacía."
+
+msgid "Paper tray is empty."
+msgstr "La bandeja de papel está vacía."
+
+msgid "Paper tray is missing."
+msgstr "No se encuentra la bandeja de papel."
+
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
@@ -3540,7 +4126,7 @@ msgid "Postcard"
msgstr "Postal"
msgid "Postcard Double "
-msgstr "Postal doble"
+msgstr "Postal doble "
msgid "Postcard Double Long Edge"
msgstr "Postal doble lado largo"
@@ -3548,6 +4134,9 @@ msgstr "Postal doble lado largo"
msgid "Postcard Long Edge"
msgstr "Postal lado largo"
+msgid "Preparing to print."
+msgstr "Preparando la impresión."
+
msgid "Print Density"
msgstr "Densidad de impresión"
@@ -3575,25 +4164,18 @@ msgstr "Imprimir y cortar"
msgid "Print and Tear"
msgstr "Imprimir y romper"
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr "Archivo de impresión aceptado: ID de trabajo %d."
-
-msgid "Print file accepted - job ID unknown."
-msgstr "Archivo de impresión aceptado: ID de trabajo desconocido."
-
msgid "Print file sent."
msgstr "Archivo de impresión enviado."
-msgid "Print file was not accepted."
-msgstr "No se ha aceptado el archivo de impresión."
-
msgid "Print job canceled at printer."
msgstr "Trabajo de impresión cancelado en la impresora."
msgid "Print job too large."
msgstr "Trabajo de impresión demasiado grande."
+msgid "Print job was not accepted."
+msgstr "No se acepta el trabajo de impresión."
+
msgid "Printer Added"
msgstr "Impresora añadida"
@@ -3615,6 +4197,9 @@ msgstr "Configuración de la impresora"
msgid "Printer cannot print supplied content."
msgstr "La impresora no puede imprimir el contenido suministrado."
+msgid "Printer cannot print with supplied options."
+msgstr "La impresora no puede imprimir con las opciones suministradas."
+
msgid "Printer:"
msgstr "Impresora:"
@@ -3622,11 +4207,8 @@ msgid "Printers"
msgstr "Impresoras"
#, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr "Imprimiendo página %d, %d%% completado."
-
-msgid "Purge Jobs"
-msgstr "Purgar trabajos"
+msgid "Printing page %d, %u%% complete."
+msgstr "Imprimiendo página %d, %u%% completado."
msgid "Quarto"
msgstr "Quarto"
@@ -3637,22 +4219,16 @@ msgstr "Se ha alcanzado el límite de cuota."
msgid "Rank Owner Job File(s) Total Size"
msgstr "Rango Propiet. Trabajo Archivo(s) Tamaño total"
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank Owner Pri Job Files Total Size"
-msgstr ""
-"Rango Propiet. Pri Trabajo Archivos Tamaño total"
-
msgid "Reject Jobs"
msgstr "Rechazar trabajos"
#, c-format
msgid "Remote host did not accept control file (%d)."
-msgstr "El ordenador remoto no ha aceptado el archivo de control (%d)."
+msgstr "El equipo remoto no ha aceptado el archivo de control (%d)."
#, c-format
msgid "Remote host did not accept data file (%d)."
-msgstr "El ordenador remoto no ha aceptado el archivo de datos (%d)."
+msgstr "El equipo remoto no ha aceptado el archivo de datos (%d)."
msgid "Reprint After Error"
msgstr "Volver a imprimir tras un error"
@@ -3703,6 +4279,9 @@ msgstr "Servidor iniciado"
msgid "Server Stopped"
msgstr "Servidor parado"
+msgid "Server credentials not set."
+msgstr "Credenciales del servidor no establecidas."
+
msgid "Service Unavailable"
msgstr "Servicio no disponible"
@@ -3748,16 +4327,13 @@ msgstr "Iniciando página %d."
msgid "Statement"
msgstr "Declaración"
-msgid "Stylus Color Series"
-msgstr "Stylus Color Series"
-
-msgid "Stylus Photo Series"
-msgstr "Stylus Photo Series"
-
#, c-format
msgid "Subscription #%d does not exist."
msgstr "Subscripción #%d no existe."
+msgid "Substitutions:"
+msgstr "Substituciones:"
+
msgid "Super A"
msgstr "Super A"
@@ -3789,13 +4365,16 @@ msgid "Tear-Off Adjust Position"
msgstr "Ajuste de posición de la pestaña desprendible"
#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr "Se necesita el atributo \"%s\" para los trabajos de impresión."
+
+#, c-format
msgid "The %s attribute cannot be provided with job-ids."
msgstr "El atributo %s no puede ser usado con jobs-ids."
#, c-format
msgid ""
-"The '%s' Job Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
msgstr ""
#, c-format
@@ -3824,16 +4403,16 @@ msgstr ""
"no puede contener espacios, barras (/), o la almohadilla (#)."
msgid "The developer unit needs to be replaced."
-msgstr "La unidad de revelado debe ser reemplazada"
+msgstr "La unidad de revelado debe ser reemplazada."
msgid "The developer unit will need to be replaced soon."
msgstr "La unidad de revelado necesitará ser cambiada pronto."
msgid "The fuser's temperature is high."
-msgstr "Temperatura del fusor alta"
+msgstr "Temperatura del fusor alta."
msgid "The fuser's temperature is low."
-msgstr "Temperatura del fusor baja"
+msgstr "Temperatura del fusor baja."
msgid ""
"The notify-lease-duration attribute cannot be used with job subscriptions."
@@ -3851,40 +4430,22 @@ msgstr "El fotoconductor óptico necesita ser cambiado."
msgid "The optical photoconductor will need to be replaced soon."
msgstr "El fotoconductor óptico necesitará ser cambiado pronto."
-msgid "The output bin is almost full."
-msgstr "Recipiente de salida casi lleno"
-
-msgid "The output bin is full."
-msgstr "Bandeja de salida llena."
-
-msgid "The output bin is missing."
-msgstr "Falta la bandeja de salida."
-
-msgid "The paper tray is almost empty."
-msgstr "Bandeja de papel casi vacía."
-
-msgid "The paper tray is empty."
-msgstr "Bandeja de papel vacía."
-
-msgid "The paper tray is missing."
-msgstr "Falta la bandeja de papel."
-
-msgid "The paper tray needs to be filled."
-msgstr "Hay que poner papel en la bandeja."
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr "El URI de la impresora es incorrecto o ya no existe."
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr ""
+"La configuración de la impresora es incorrecta o la impresora ya no existe."
msgid "The printer did not respond."
msgstr "La impresora no respondió."
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr "La impresora no es compatible con IPP/%d.%d, probando IPP/%s."
-
msgid "The printer is in use."
msgstr "La impresora está en uso."
+msgid "The printer is low on ink."
+msgstr "La impresora tiene poca tinta."
+
+msgid "The printer is low on toner."
+msgstr "La impresora tiene poco toner."
+
msgid "The printer is not connected."
msgstr "La impresora no está conectada."
@@ -3900,12 +4461,6 @@ msgstr "La impresora está ahora en línea."
msgid "The printer is offline."
msgstr "La impresora está fuera de línea."
-msgid "The printer is running low on ink."
-msgstr "La impresora está funcionando con poca tinta."
-
-msgid "The printer is running low on toner."
-msgstr "La impresora está funcionando con poco toner."
-
msgid "The printer is unreachable at this time."
msgstr "La impresora es inalcanzable en este momento."
@@ -3956,13 +4511,13 @@ msgstr "Se necesita el atributo printer-uri."
msgid ""
"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
msgstr ""
-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/"
+"El printer-uri debe ser de la forma \"ipp://NOMBRE_EQUIPO/classes/"
"NOMBRE_CLASE\"."
msgid ""
"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
msgstr ""
-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/"
+"El printer-uri debe ser de la forma \"ipp://NOMBRE_EQUIPO/printers/"
"NOMBRE_IMPRESORA\"."
msgid ""
@@ -3986,9 +4541,6 @@ msgstr "No se admite el uso del valor which-jobs \"%s\"."
msgid "There are too many subscriptions."
msgstr "Hay demasiadas subscripciones."
-msgid "There is a paper jam."
-msgstr "Hay un atasco de papel."
-
msgid "There was an unrecoverable USB error."
msgstr "Ha habido un error USB irrecuperable."
@@ -4027,6 +4579,9 @@ msgstr "Bandeja 4"
msgid "URI Too Long"
msgstr "URI demasiado largo"
+msgid "URI too large"
+msgstr "URI demasiado grande"
+
msgid "US Ledger"
msgstr "Libro Mayor, 17 x 11 pulg."
@@ -4097,11 +4652,19 @@ msgstr "No se ha podido cambiar el atributo printer-is-shared"
msgid "Unable to change server settings"
msgstr "No se ha podido cambiar la configuración del servidor"
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr "No se ha podido compilar la expresión regular mimeMediaType: %s."
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr "No se ha podido compilar la expresión regular naturalLanguage: %s."
+
msgid "Unable to configure printer options."
msgstr "No se han podido configurar las opciones de impresión."
msgid "Unable to connect to host."
-msgstr "No se ha podido conectar al servidor."
+msgstr "No se ha podido conectar al equipo."
msgid "Unable to contact printer, queuing on next printer in class."
msgstr ""
@@ -4149,12 +4712,12 @@ msgstr ""
msgid "Unable to copy interface script - %s"
msgstr "No se ha podido copiar el script de interfaz - %s"
-msgid "Unable to create compressed print file"
-msgstr "No se ha podido crear el archivo de impresión comprimido"
-
msgid "Unable to create printer-uri"
msgstr "No se ha podido crear printer-uri"
+msgid "Unable to create server credentials."
+msgstr "No se han podido crear las credenciales del servidor."
+
msgid "Unable to create temporary file"
msgstr "No se ha podido crear el archivo temporal"
@@ -4173,46 +4736,46 @@ msgstr "No se pueden editar archivos cupsd.conf mayores de 1MB"
msgid ""
"Unable to establish a secure connection to host (certificate chain invalid)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (cadena "
+"No se ha podido establecer una conexión segura con el equipo (cadena "
"certificado incorrecta)."
msgid ""
"Unable to establish a secure connection to host (certificate not yet valid)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (el "
-"certificado aún no es válido)."
+"No se ha podido establecer una conexión segura con el equipo (el certificado "
+"aún no es válido)."
msgid "Unable to establish a secure connection to host (expired certificate)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (certificado "
+"No se ha podido establecer una conexión segura con el equipo (certificado "
"caducado)."
msgid "Unable to establish a secure connection to host (host name mismatch)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (el nombre de "
-"ordenador no coincide)."
+"No se ha podido establecer una conexión segura con el equipo (el nombre de "
+"equipo no coincide)."
msgid ""
"Unable to establish a secure connection to host (peer dropped connection "
"before responding)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (el par cortó "
+"No se ha podido establecer una conexión segura con el equipo (el par cortó "
"la conexión antes de responder)."
msgid ""
"Unable to establish a secure connection to host (self-signed certificate)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (certificado "
+"No se ha podido establecer una conexión segura con el equipo (certificado "
"auto-firmado)."
msgid ""
"Unable to establish a secure connection to host (untrusted certificate)."
msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (certificado "
-"no seguro)."
+"No se ha podido establecer una conexión segura con el equipo (certificado no "
+"seguro)."
msgid "Unable to establish a secure connection to host."
-msgstr "No se ha podido establecer una conexión segura al servidor."
+msgstr "No se ha podido establecer una conexión segura al equipo."
msgid "Unable to find destination for job"
msgstr "No se ha podido encontrar destino para el trabajo"
@@ -4220,11 +4783,11 @@ msgstr "No se ha podido encontrar destino para el trabajo"
msgid "Unable to find printer."
msgstr "No se ha podido encontrar la impresora."
-msgid "Unable to generate compressed print file"
-msgstr "No se ha podido crear el archivo de impresión comprimido"
+msgid "Unable to find server credentials."
+msgstr "No se han podido encontrar las credenciales del servidor."
msgid "Unable to get backend exit status."
-msgstr "No se ha podido obtener el estado de salida del programa backend"
+msgstr "No se ha podido obtener el estado de salida del programa backend."
msgid "Unable to get class list"
msgstr "No se ha podido obtener la lista de clases"
@@ -4284,9 +4847,6 @@ msgstr "No se han podido mover los trabajos"
msgid "Unable to open PPD file"
msgstr "No se ha podido abrir el archivo PPD"
-msgid "Unable to open compressed print file"
-msgstr "No se ha podido abrir el archivo de impresión comprimido"
-
msgid "Unable to open cupsd.conf file:"
msgstr "No se ha podido abrir el archivo cupsd.conf:"
@@ -4312,8 +4872,11 @@ msgstr "No se ha podido imprimir la página de prueba"
msgid "Unable to read print data."
msgstr "No se han podido leer los datos de impresión."
-msgid "Unable to resolve printer URI."
-msgstr "No se ha podido resolver el URI de la impresora."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr "No se ha podido resolver printer-uri."
#, c-format
msgid "Unable to run \"%s\": %s"
@@ -4390,7 +4953,7 @@ msgstr "Opción \"%s\" con valor \"%s\" desconocida."
#, c-format
msgid "Unknown option \"%s\"."
-msgstr "Opción \"%s\" desconocida"
+msgstr "Opción \"%s\" desconocida."
#, c-format
msgid "Unknown print mode: \"%s\"."
@@ -4404,6 +4967,15 @@ msgstr "printer-error-policy \"%s\" incorrecto."
msgid "Unknown printer-op-policy \"%s\"."
msgstr "printer-op-policy \"%s\" incorrecto."
+msgid "Unknown request method."
+msgstr "Método de solicitud desconocido."
+
+msgid "Unknown request version."
+msgstr "Versión de solicitud desconocida."
+
+msgid "Unknown scheme in URI"
+msgstr "Esquema en URI desconocido"
+
msgid "Unknown service name."
msgstr "Nombre de servicio desconocido."
@@ -4413,63 +4985,63 @@ msgstr "Valor de opción de versión \"%s\" desconocida."
#, c-format
msgid "Unsupported 'compression' value \"%s\"."
-msgstr ""
+msgstr "Valor 'compression' \"%s\" no implementado."
#, c-format
msgid "Unsupported 'document-format' value \"%s\"."
-msgstr ""
+msgstr "Valor 'document-format' \"%s\" no implementado."
msgid "Unsupported 'job-name' value."
-msgstr ""
+msgstr "Valor 'job-name' no implementado."
#, c-format
msgid "Unsupported character set \"%s\"."
-msgstr "Juego de caracteres \"%s\" no permitido."
+msgstr "Juego de caracteres \"%s\" no implementado."
#, c-format
msgid "Unsupported compression \"%s\"."
-msgstr "Compresión \"%s\" no permitida."
+msgstr "Compresión \"%s\" no implementada."
#, c-format
msgid "Unsupported document-format \"%s\"."
-msgstr "document-format \"%s\" no permitido."
+msgstr "document-format \"%s\" no implementado."
#, c-format
msgid "Unsupported document-format \"%s/%s\"."
-msgstr "document-format \"%s/%s\" no permitido."
+msgstr "document-format \"%s/%s\" no implementado."
#, c-format
msgid "Unsupported format \"%s\"."
-msgstr "Formato \"%s\" no permitido."
+msgstr "Formato \"%s\" no implementado."
msgid "Unsupported margins."
-msgstr "Márgenes no permitidos."
+msgstr "Márgenes no implementados."
msgid "Unsupported media value."
-msgstr "Valor del medio no permitido."
+msgstr "Valor del medio no implementado."
#, c-format
msgid "Unsupported number-up value %d, using number-up=1."
msgstr ""
-"Valor de number-up (páginas por hoja) %d no permitido; usando number-up=1."
+"Valor de number-up (páginas por hoja) %d no implementado; usando number-up=1."
#, c-format
msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
msgstr ""
-"Valor de number-up-layout (disposición de páginas por hoja) %s no permitido; "
-"usando number-up-layout=lrtb."
+"Valor de number-up-layout (disposición de páginas por hoja) %s no "
+"implementado; usando number-up-layout=lrtb."
#, c-format
msgid "Unsupported page-border value %s, using page-border=none."
msgstr ""
-"Valor de page-border (borde de página) %s no permitido; usando page-"
+"Valor de page-border (borde de página) %s no implementado; usando page-"
"border=none (ninguno)."
msgid "Unsupported raster data."
-msgstr "Trama de datos no permitidos."
+msgstr "Trama de datos no implementados."
msgid "Unsupported value type"
-msgstr "Tipo de valor no permitido"
+msgstr "Tipo de valor no implementado"
msgid "Upgrade Required"
msgstr "Se requiere actualización"
@@ -4504,10 +5076,10 @@ msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
msgstr "Uso: cupsctl [opciones] [param=valor ... paramN=valorN]"
msgid "Usage: cupsd [options]"
-msgstr "Uso: cupsd [opciones)"
+msgstr "Uso: cupsd [opciones]"
-msgid "Usage: cupsfilter [ options ] filename"
-msgstr "Uso: cupsfilter ( opciones ) archivo"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr "Uso: cupsfilter [ opciones ] [ -- ] nombre_archivo"
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
msgstr "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]"
@@ -4518,6 +5090,28 @@ msgstr ""
"Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd"
"[.gz]]"
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"Uso: ippdiscover [opciones] -a\n"
+" ippdiscover [opciones] \"nombre servicio\"\n"
+"\n"
+"Opciones:"
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+"Uso: ippfind [opciones] regtipo[,subtipo][.dominio.] ... [expresión]\n"
+" ippfind [opciones] nombre[.regtipo[.dominio.]] ... [expresión]\n"
+" ippfind --help\n"
+" ippfind --version"
+
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr "Uso: ipptool [opciones] URI nombre_archivo [ ... nombre_archivoN ]"
@@ -4535,23 +5129,11 @@ msgstr ""
" lpoptions [-h servidor] [-E] -p impresora -o opción[=valor] ...\n"
" lpoptions [-h servidor] [-E] -x impresora"
-msgid "Usage: lppasswd [-g groupname]"
-msgstr "Uso: lppasswd [-g nombre_grupo]"
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
-msgstr ""
-"Uso: lppasswd [-g nombre_grupo] [nombre_usuario]\n"
-" lppasswd [-g nombre_grupo] -a [nombre_usuario]\n"
-" lppasswd [-g nombre_grupo] -x [nombre_usuario]"
-
msgid ""
"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
msgstr ""
-"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) "
-"(+intervalo)"
+"Uso: lpq [-P dest] [-U nombre_usuario] [-h nombre_equipo[:puerto]] [-l] "
+"[+intervalo]"
msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
msgstr "Uso: ppdc [opciones] nombre_archivo.drv [ ... nombre_archivoN.drv ]"
@@ -4573,7 +5155,7 @@ msgstr ""
"nombre_archivoN.drv ]"
msgid "Usage: snmp [host-or-ip-address]"
-msgstr "Uso: snmp [ordenador-o-dirección-ip]"
+msgstr "Uso: snmp [equipo-o-dirección-ip]"
msgid "Value uses indefinite length"
msgstr "Valor usa una longitud indefinida"
@@ -4612,13 +5194,6 @@ msgstr ""
"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
"%s:%d%s</A>."
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-"Su contraseña debe tener al menos 6 caracteres, no puede contener su nombre "
-"de usuario, y debe tener al menos una letra y un número."
-
msgid "ZPL Label Printer"
msgstr "Impresora de etiquetas ZPL"
@@ -4666,15 +5241,21 @@ msgstr ""
msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
msgstr ""
+"cupsd: Se esperaba el nombre de archivo cups-files.conf tras la opción \"-s"
+"\"."
-msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
msgstr ""
+"cupsd: El uso bajo-demanda no está compilado. Funcionando en modo normal."
+
+msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgstr "cupsd: No se permite nombre de archivo cups-files.conf relativo."
msgid "cupsd: Unable to get current directory."
msgstr "cupsd: No se ha podido obtener el directorio actual."
msgid "cupsd: Unable to get path to cups-files.conf file."
-msgstr ""
+msgstr "cupsd: No se ha podido obtener la ruta al archivo cups-files.conf."
#, c-format
msgid "cupsd: Unknown argument \"%s\" - aborting."
@@ -4684,11 +5265,6 @@ msgstr "cupsd: Argumento \"%s\" desconocido - cancelando."
msgid "cupsd: Unknown option \"%c\" - aborting."
msgstr "cupsd: Opción \"%c\" desconocida - cancelando."
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo "
-"normal."
-
#, c-format
msgid "cupsfilter: Invalid document number %d."
msgstr "cupsfilter: Número de documento %d no válido."
@@ -4733,16 +5309,88 @@ msgstr "help\t\tProporciona ayuda sobre los comandos."
msgid "idle"
msgstr "inactiva"
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr "ipptool: \"-i\" y \"-n\" son incompatibles with -X\"."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr "ippfind: Expresión regular incorrecta: %s"
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr "ippfind: No se puede usar --and tras --or."
#, c-format
-msgid "ipptool: Bad URI - %s."
-msgstr "ipptool: URI - %s incorrecto."
+msgid "ippfind: Expected key name after %s."
+msgstr "ippfind: Se esperaba un nombre de clave tras %s."
+
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr "ippfind: Se esperaba un intervalo de puertos tras %s."
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr "ippfind: Se esperaba un programa tras %s."
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr "ipptool: Versión %s para \"-V\" incorrecta."
+msgid "ippfind: Expected semi-colon after %s."
+msgstr "ippfind: Se esperaba un punto y coma tras %s."
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr "ippfind: Falta la llave de cierre en la substitución."
+
+msgid "ippfind: Missing close parenthesis."
+msgstr "ippfind: Falta el paréntesis de cierre."
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr "ippfind: Falta una expresión antes de \"--and\"."
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr "ippfind: Falta una expresión antes de \"--or\"."
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr "ippfind: Falta un nombre de clave tras %s."
+
+msgid "ippfind: Missing open parenthesis."
+msgstr "ippfind: Falta el paréntesis de apertura."
+
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr "ippfind: Falta un programa tras %s."
+
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr "ippfind: Falta una expresión regular tras %s."
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr "ippfind: Falta un punto y coma tras %s."
+
+msgid "ippfind: Out of memory."
+msgstr "ippfind: Sin memoria."
+
+msgid "ippfind: Too many parenthesis."
+msgstr "ippfind: Demasiados paréntesis."
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr "ippfind: No se ha podido examinar o resolver: %s"
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr "ippfind: No se ha podido ejecutar \"%s\": %s"
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr "ippfind: No se ha podido usar Bonjour: %s"
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr "ippfind: Variable desconocida \"{%s}\"."
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr "ipptool: \"-i\" y \"-n\" no son compatibles con \"-P\" y \"-X\"."
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: URI - %s incorrecto."
msgid "ipptool: Invalid seconds for \"-i\"."
msgstr "ipptool: Número de segundos no válido para \"-i\"."
@@ -4762,12 +5410,6 @@ msgstr "ipptool: Falta un nombre=valor para \"-d\"."
msgid "ipptool: Missing seconds for \"-i\"."
msgstr "ipptool: Falta el número de segundos para \"-i\"."
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr "ipptool: Falta un tiempo de espera para \"-T\"."
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr "ipptool: Falta la versión para \"-V\"."
-
msgid "ipptool: URI required before test file."
msgstr "ipptool: Se requiere un URI antes del archivo de prueba."
@@ -4804,7 +5446,7 @@ msgid "lpadmin: Expected file type(s) after \"-I\" option."
msgstr "lpadmin: Se esperaba(n) tipo(s) de archivo(s) tras la opción \"-l\"."
msgid "lpadmin: Expected hostname after \"-h\" option."
-msgstr "lpadmin: Se esperaba un nombre de ordenador tras la opción \"-h\"."
+msgstr "lpadmin: Se esperaba un nombre de equipo tras la opción \"-h\"."
msgid "lpadmin: Expected interface after \"-i\" option."
msgstr "lpadmin: Se esperaba una interfaz tras la opción \"-i\"."
@@ -4831,7 +5473,7 @@ msgid "lpadmin: Expected printer or class after \"-x\" option."
msgstr "lpadmin: Se esperaba una impresora o clase tras la opción \"-x\"."
msgid "lpadmin: No member names were seen."
-msgstr "lpadmin: No se han visto nombres de miembros"
+msgstr "lpadmin: No se han visto nombres de miembros."
#, c-format
msgid "lpadmin: Printer %s is already a member of class %s."
@@ -4868,6 +5510,10 @@ msgstr ""
" Primero debe especificar un nombre de impresora."
#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
msgstr "lpadmin: No se ha podido abrir el archivo PPD \"%s\" - %s"
@@ -4967,50 +5613,6 @@ msgstr "lpoptions: No se ha podido abrir el archivo PPD para %s."
msgid "lpoptions: Unknown printer or class."
msgstr "lpoptions: Impresora o clase desconocida."
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr "lppasswd: Solo el usuario root puede añadir o borrar contraseñas."
-
-msgid "lppasswd: Password file busy."
-msgstr "lppasswd: Archivo de contraseñas ocupado."
-
-msgid "lppasswd: Password file not updated."
-msgstr "lppasswd: Archivo de contraseñas no actualizado."
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr "lppasswd: Lo siento, la contraseña no coincide."
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr "lppasswd: Lo siento, la contraseña ha sido rechazada."
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr "lppasswd: Lo siento, las contraseñas no coinciden."
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr "lppasswd: No se ha podido copiar la cadena de contraseña: %s"
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr "lppasswd: No se ha podido abrir el archivo de contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr "lppasswd: No se ha podido escribir en el archivo de contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de "
-"contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr "lppasswd: falló al cambiar de nombre al archivo de contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr "lppasswd: el usuario \"%s\" y el grupo \"%s\" no existen."
-
#, c-format
msgid ""
"lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5057,7 +5659,7 @@ msgstr "ppdc: Valor lógico (%s) incorrecto en línea %d de %s."
#, c-format
msgid "ppdc: Bad font attribute: %s"
-msgstr "ppdc: Atributo de fuente: %s incorrecto"
+msgstr "ppdc: Atributo de fuente incorrecto: %s"
#, c-format
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
@@ -5449,7 +6051,7 @@ msgstr "ppdmerge: Ignorando archivo PPD %s."
#, c-format
msgid "ppdmerge: Unable to backup %s to %s - %s"
-msgstr "ppdmerge: No se ha podido hacer copia de seguridad de %s a %s- %s"
+msgstr "ppdmerge: No se ha podido hacer copia de respaldo de %s a %s - %s"
#, c-format
msgid "printer %s disabled since %s -"
@@ -5517,3 +6119,13 @@ msgstr "sin título"
msgid "variable-bindings uses indefinite length"
msgstr "variable-bindings usa una longitud indefinida"
+
+#~ msgid "Looking for printer."
+#~ msgstr "Buscando impresora."
+
+#~ msgid ""
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
+#~ msgstr ""
+#~ "El atributo de descripción de trabajo '%s' no puede ser suministrado en "
+#~ "una solicitud de creación de trabajo."
diff --git a/locale/cups_fr.po b/locale/cups_fr.po
index 7241284..385fe0e 100644
--- a/locale/cups_fr.po
+++ b/locale/cups_fr.po
@@ -29,7 +29,7 @@ msgid ""
msgstr ""
"Project-Id-Version: CUPS 1.6\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
"PO-Revision-Date: 2012-12-12 11:12+0100\n"
"Last-Translator: denis meramdjougoma <dcmeram@libertysurf.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -788,6 +788,12 @@ msgstr ""
msgid " Warning: obsolete DSC version %.1f in file."
msgstr ""
+msgid " ! expression Unary NOT of expression."
+msgstr ""
+
+msgid " ( expressions ) Group expressions."
+msgstr ""
+
msgid " --[no-]debug-logging Turn debug logging on/off."
msgstr ""
@@ -809,9 +815,85 @@ msgstr ""
msgid " --crlf End lines with CR + LF (Windows)."
msgstr ""
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
+msgid " --false Always false."
+msgstr ""
+
+msgid " --help Show help."
+msgstr ""
+
+msgid " --help Show this help."
+msgstr ""
+
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr ""
+msgid " --list-filters List filters that will be used."
+msgstr ""
+
+msgid " --local True if service is local."
+msgstr ""
+
+msgid " --ls List attributes."
+msgstr ""
+
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+
+msgid " --not expression Unary NOT of expression."
+msgstr ""
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+
+msgid " --print Print URI if true."
+msgstr ""
+
+msgid " --print-name Print service name if true."
+msgstr ""
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+
+msgid " --remote True if service is remote."
+msgstr ""
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+
+msgid " --true Always true."
+msgstr ""
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr ""
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+
+msgid " --version Show program version."
+msgstr ""
+
+msgid " --version Show version."
+msgstr ""
+
msgid " -4 Connect using IPv4."
msgstr ""
@@ -852,15 +934,26 @@ msgstr ""
msgid " -L Send requests using content-length."
msgstr ""
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
msgid " -P filename.ppd Set PPD file."
msgstr ""
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+
msgid " -R root-directory Set alternate root."
msgstr ""
msgid " -S Test with SSL encryption."
msgstr ""
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr ""
+
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr ""
@@ -878,15 +971,27 @@ msgstr ""
msgid " -X Produce XML plist instead of plain text."
msgstr ""
+msgid " -a Browse for all services."
+msgstr ""
+
msgid " -a Export all printers."
msgstr ""
+msgid " -c Produce CSV output."
+msgstr ""
+
msgid " -c catalog.po Load the specified message catalog."
msgstr ""
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr ""
+
msgid " -c cupsd.conf Set cupsd.conf file to use."
msgstr ""
+msgid " -d domain Browse/resolve in specified domain."
+msgstr ""
+
msgid " -d name=value Set named variable to value."
msgstr ""
@@ -896,6 +1001,9 @@ msgstr ""
msgid " -d printer Use the named printer."
msgstr ""
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+
msgid " -e Use every filter from the PPD file."
msgstr ""
@@ -908,6 +1016,9 @@ msgstr ""
msgid " -h Show this usage message."
msgstr ""
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+
msgid " -h server[:port] Specify server address."
msgstr ""
@@ -923,7 +1034,13 @@ msgid ""
"file 1)."
msgstr ""
-msgid " -l Run cupsd from launchd(8)."
+msgid " -l List attributes."
+msgstr ""
+
+msgid " -l Produce plain text output."
+msgstr ""
+
+msgid " -l Run cupsd on demand."
msgstr ""
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
@@ -943,6 +1060,9 @@ msgid ""
" -n count Repeat the last file the given number of times."
msgstr ""
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+
msgid ""
" -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
@@ -953,15 +1073,30 @@ msgstr ""
msgid " -o name=value Set option(s)."
msgstr ""
+msgid " -p Print URI if true."
+msgstr ""
+
msgid " -p filename.ppd Set PPD file."
msgstr ""
+msgid " -p program Run specified program for each service."
+msgstr ""
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+
msgid " -q Run silently."
msgstr ""
+msgid " -r True if service is remote."
+msgstr ""
+
msgid " -r Use 'relaxed' open mode."
msgstr ""
+msgid " -s Print service name if true."
+msgstr ""
+
msgid " -t Produce a test report."
msgstr ""
@@ -971,21 +1106,101 @@ msgstr ""
msgid " -t Test the configuration file."
msgstr ""
+msgid " -t key True if the TXT record contains the key."
+msgstr ""
+
msgid " -t title Set title."
msgstr ""
+msgid " -t type Browse/resolve with specified type."
+msgstr ""
+
msgid " -u Remove the PPD file when finished."
msgstr ""
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+
msgid " -v Be verbose."
msgstr ""
msgid " -vv Be very verbose."
msgstr ""
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+
msgid " -z Compress PPD files using GNU zip."
msgstr ""
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr ""
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr ""
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr ""
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr ""
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+
+msgid " expression expression Logical AND."
+msgstr ""
+
+msgid " {service_domain} Domain name"
+msgstr ""
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr ""
+
+msgid " {service_name} Service instance name"
+msgstr ""
+
+msgid " {service_port} Port number"
+msgstr ""
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr ""
+
+msgid " {service_scheme} URI scheme"
+msgstr ""
+
+msgid " {service_uri} URI"
+msgstr ""
+
+msgid " {txt_*} Value of TXT record key"
+msgstr ""
+
+msgid " {} URI"
+msgstr ""
+
msgid " FAIL"
msgstr ""
@@ -993,7 +1208,166 @@ msgid " PASS"
msgstr ""
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
msgstr ""
#, c-format
@@ -1001,6 +1375,34 @@ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
msgstr ""
#, c-format
+msgid "%d x %d mm"
+msgstr ""
+
+#, c-format
+msgid "%g x %g"
+msgstr ""
+
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr ""
+
+#, c-format
msgid "%s accepting requests since %s"
msgstr ""
@@ -1058,6 +1460,14 @@ msgid "%s: %s failed: %s"
msgstr ""
#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr ""
+
+#, c-format
msgid "%s: Don't know what to do."
msgstr ""
@@ -1103,10 +1513,6 @@ msgid "%s: Error - expected destination after \"-P\" option."
msgstr ""
#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
-
-#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
msgstr ""
@@ -1225,6 +1631,18 @@ msgid "%s: Invalid filter string \"%s\"."
msgstr ""
#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr ""
+
+#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
msgstr ""
@@ -1241,6 +1659,10 @@ msgid "%s: Sorry, no encryption support."
msgstr ""
#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to connect to server."
msgstr ""
@@ -1249,10 +1671,18 @@ msgid "%s: Unable to contact server."
msgstr ""
#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
msgstr ""
#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to open %s: %s"
msgstr ""
@@ -1265,6 +1695,10 @@ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
msgstr ""
#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
msgid "%s: Unknown destination \"%s\"."
msgstr ""
@@ -1277,6 +1711,14 @@ msgid "%s: Unknown option \"%c\"."
msgstr ""
#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr ""
+
+#, c-format
msgid "%s: Unknown source MIME type %s/%s."
msgstr ""
@@ -1830,9 +2272,6 @@ msgstr ""
msgid "70"
msgstr "70"
-msgid "720dpi"
-msgstr "720 ppp"
-
msgid "75"
msgstr "75"
@@ -2117,6 +2556,9 @@ msgstr ""
msgid "Bad UIConstraints"
msgstr ""
+msgid "Bad arguments to function"
+msgstr ""
+
#, c-format
msgid "Bad copies value %d."
msgstr ""
@@ -2143,10 +2585,11 @@ msgstr ""
msgid "Bad filename buffer"
msgstr ""
-msgid "Bad job-name value: Bad UTF-8 sequence."
+msgid "Bad hostname/address in URI"
msgstr ""
-msgid "Bad job-name value: Name too long."
+#, c-format
+msgid "Bad job-name value: %s"
msgstr ""
msgid "Bad job-name value: Wrong type or count."
@@ -2189,17 +2632,20 @@ msgstr ""
msgid "Bad page-ranges values %d-%d."
msgstr "Intervalle de pages erroné : %d-%d."
-#, c-format
-msgid "Bad port-monitor \"%s\"."
+msgid "Bad port number in URI"
msgstr ""
-msgid "Bad printer URI."
+#, c-format
+msgid "Bad port-monitor \"%s\"."
msgstr ""
#, c-format
msgid "Bad printer-state value %d."
msgstr ""
+msgid "Bad printer-uri."
+msgstr ""
+
#, c-format
msgid "Bad request ID %d."
msgstr ""
@@ -2208,12 +2654,24 @@ msgstr ""
msgid "Bad request version number %d.%d."
msgstr ""
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
+msgstr ""
+
msgid "Bad subscription ID"
msgstr ""
+msgid "Bad username in URI"
+msgstr ""
+
msgid "Bad value string"
msgstr ""
+msgid "Bad/empty URI"
+msgstr ""
+
msgid "Banners"
msgstr "Bannières"
@@ -2233,6 +2691,9 @@ msgstr "CMJN"
msgid "CPCL Label Printer"
msgstr "Imprimante pour étiquettes CPCL"
+msgid "Cancel Jobs"
+msgstr ""
+
msgid "Cancel RSS Subscription"
msgstr "Annuler abonnement RSS"
@@ -2392,6 +2853,9 @@ msgstr "Modifier le fichier de configuration"
msgid "Empty PPD file."
msgstr ""
+msgid "Encryption is not supported."
+msgstr ""
+
#. TRANSLATORS: Banner/cover sheet after the print job.
msgid "Ending Banner"
msgstr "Fin de la bannière"
@@ -2399,15 +2863,6 @@ msgstr "Fin de la bannière"
msgid "English"
msgstr "French"
-msgid "Enter old password:"
-msgstr "Ancien mot de passe :"
-
-msgid "Enter password again:"
-msgstr "Confirmez le nouveau mot de passe :"
-
-msgid "Enter password:"
-msgstr "Entrez le nouveau mot de passe :"
-
msgid ""
"Enter your username and password or the root username and password to access "
"this page. If you are using Kerberos authentication, make sure you have a "
@@ -2573,12 +3028,18 @@ msgstr ""
msgid "Envelope You4 Long Edge"
msgstr ""
+msgid "Environment Variables:"
+msgstr ""
+
msgid "Epson"
msgstr "Epson"
msgid "Error Policy"
msgstr "Règles d’erreur"
+msgid "Error reading raster data."
+msgstr ""
+
msgid "Error sending raster data."
msgstr ""
@@ -2624,6 +3085,9 @@ msgstr "Échec de la condition de valeur attendue"
msgid "Export Printers to Samba"
msgstr "Exporter les imprimantes vers SAMBA"
+msgid "Expressions:"
+msgstr ""
+
msgid "FAIL"
msgstr ""
@@ -2735,6 +3199,9 @@ msgstr ""
msgid "IPP language length overflows value."
msgstr ""
+msgid "IPP language length too large."
+msgstr ""
+
msgid "IPP member name is not empty."
msgstr ""
@@ -2750,6 +3217,9 @@ msgstr ""
msgid "IPP nameWithLanguage value less than minimum 4 bytes."
msgstr ""
+msgid "IPP octetString length too large."
+msgstr ""
+
msgid "IPP rangeOfInteger value not 8 bytes."
msgstr ""
@@ -2810,6 +3280,9 @@ msgstr "Affranchissement Internet en 3 parties"
msgid "Internet Printing Protocol"
msgstr "Internet Printing Protocol"
+msgid "Invalid media name arguments."
+msgstr ""
+
msgid "Invalid media size."
msgstr ""
@@ -2959,10 +3432,13 @@ msgstr "Ligne dépassant la longueur maximale autorisée (255 caractères)"
msgid "List Available Printers"
msgstr ""
+msgid "Load paper."
+msgstr ""
+
msgid "Long-Edge (Portrait)"
msgstr "Bord le plus long (Portrait)"
-msgid "Looking for printer."
+msgid "Looking for printer..."
msgstr ""
msgid "Manual Feed"
@@ -3026,6 +3502,12 @@ msgstr ""
msgid "Missing required attributes."
msgstr ""
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
#, c-format
msgid "Missing value on line %d."
msgstr ""
@@ -3047,6 +3529,9 @@ msgid ""
" device-id = %s"
msgstr ""
+msgid "Modifiers:"
+msgstr ""
+
msgid "Modify Class"
msgstr "Modifier la classe"
@@ -3074,12 +3559,6 @@ msgstr ""
msgid "Never"
msgstr "Jamais"
-msgid "New Stylus Color Series"
-msgstr "Nouvelles série Stylus Color"
-
-msgid "New Stylus Photo Series"
-msgstr "Nouvelles série Stylus Photo"
-
msgid "No"
msgstr "Non"
@@ -3098,6 +3577,9 @@ msgstr ""
msgid "No active connection"
msgstr "Aucune connexion active"
+msgid "No active connection."
+msgstr ""
+
#, c-format
msgid "No active jobs on %s."
msgstr ""
@@ -3150,6 +3632,15 @@ msgstr ""
msgid "No printer-uri in request."
msgstr ""
+msgid "No request URI."
+msgstr ""
+
+msgid "No request protocol version."
+msgstr ""
+
+msgid "No request sent."
+msgstr ""
+
msgid "No request-id"
msgstr "Paramètre request-id absent"
@@ -3244,20 +3735,13 @@ msgstr ""
msgid "Output Mode"
msgstr "Mode de sortie"
-#, c-format
-msgid "Output for printer %s is sent to %s"
+msgid "Output bin is almost full."
msgstr ""
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
+msgid "Output bin is full."
msgstr ""
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr ""
-
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+msgid "Output bin is missing."
msgstr ""
msgid "PASS"
@@ -3290,6 +3774,18 @@ msgstr "Le paquet ne contient aucun paramètre Get-Response-PDU"
msgid "Packet does not start with SEQUENCE"
msgstr "Le paquet ne commence pas par SEQUENCE"
+msgid "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
@@ -3343,6 +3839,9 @@ msgstr ""
msgid "Postcard Long Edge"
msgstr ""
+msgid "Preparing to print."
+msgstr ""
+
msgid "Print Density"
msgstr "Densité d’impression"
@@ -3370,25 +3869,18 @@ msgstr "Impression à découper"
msgid "Print and Tear"
msgstr "Impression à détacher"
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
msgid "Print file sent."
msgstr ""
-msgid "Print file was not accepted."
-msgstr ""
-
msgid "Print job canceled at printer."
msgstr ""
msgid "Print job too large."
msgstr ""
+msgid "Print job was not accepted."
+msgstr ""
+
msgid "Printer Added"
msgstr "ajoutée"
@@ -3410,6 +3902,9 @@ msgstr "Réglages de l’imprimante"
msgid "Printer cannot print supplied content."
msgstr ""
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
msgid "Printer:"
msgstr "Imprimante :"
@@ -3417,12 +3912,9 @@ msgid "Printers"
msgstr ""
#, c-format
-msgid "Printing page %d, %d%% complete."
+msgid "Printing page %d, %u%% complete."
msgstr ""
-msgid "Purge Jobs"
-msgstr "Purger les tâches"
-
msgid "Quarto"
msgstr "Quarto"
@@ -3432,11 +3924,6 @@ msgstr ""
msgid "Rank Owner Job File(s) Total Size"
msgstr ""
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank Owner Pri Job Files Total Size"
-msgstr ""
-
msgid "Reject Jobs"
msgstr "Refuser les tâches"
@@ -3497,6 +3984,9 @@ msgstr "Le serveur a démarré"
msgid "Server Stopped"
msgstr "Le serveur s’est arrêté"
+msgid "Server credentials not set."
+msgstr ""
+
msgid "Service Unavailable"
msgstr "Service indisponible"
@@ -3542,16 +4032,13 @@ msgstr ""
msgid "Statement"
msgstr "Déclaration"
-msgid "Stylus Color Series"
-msgstr "Série Stylus Color"
-
-msgid "Stylus Photo Series"
-msgstr "Série Stylus Photo"
-
#, c-format
msgid "Subscription #%d does not exist."
msgstr ""
+msgid "Substitutions:"
+msgstr ""
+
msgid "Super A"
msgstr ""
@@ -3583,13 +4070,16 @@ msgid "Tear-Off Adjust Position"
msgstr "Position d’ajustement du détachement"
#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr ""
+
+#, c-format
msgid "The %s attribute cannot be provided with job-ids."
msgstr ""
#, c-format
msgid ""
-"The '%s' Job Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
msgstr ""
#, c-format
@@ -3643,38 +4133,19 @@ msgstr ""
msgid "The optical photoconductor will need to be replaced soon."
msgstr ""
-msgid "The output bin is almost full."
-msgstr ""
-
-msgid "The output bin is full."
+msgid "The printer configuration is incorrect or the printer no longer exists."
msgstr ""
-msgid "The output bin is missing."
-msgstr ""
-
-msgid "The paper tray is almost empty."
-msgstr ""
-
-msgid "The paper tray is empty."
-msgstr ""
-
-msgid "The paper tray is missing."
-msgstr ""
-
-msgid "The paper tray needs to be filled."
-msgstr ""
-
-msgid "The printer URI is incorrect or no longer exists."
+msgid "The printer did not respond."
msgstr ""
-msgid "The printer did not respond."
+msgid "The printer is in use."
msgstr ""
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+msgid "The printer is low on ink."
msgstr ""
-msgid "The printer is in use."
+msgid "The printer is low on toner."
msgstr ""
msgid "The printer is not connected."
@@ -3692,12 +4163,6 @@ msgstr ""
msgid "The printer is offline."
msgstr ""
-msgid "The printer is running low on ink."
-msgstr ""
-
-msgid "The printer is running low on toner."
-msgstr ""
-
msgid "The printer is unreachable at this time."
msgstr ""
@@ -3776,9 +4241,6 @@ msgstr ""
msgid "There are too many subscriptions."
msgstr "Les abonnements sont trop nombreux."
-msgid "There is a paper jam."
-msgstr ""
-
msgid "There was an unrecoverable USB error."
msgstr ""
@@ -3817,6 +4279,9 @@ msgstr "Bac 4"
msgid "URI Too Long"
msgstr "URI trop long"
+msgid "URI too large"
+msgstr ""
+
msgid "US Ledger"
msgstr "US Ledger"
@@ -3887,6 +4352,14 @@ msgstr "Impossible de modifier l’attribut « printer-is-shared » :"
msgid "Unable to change server settings"
msgstr "Impossible de modifier les réglages du serveur :"
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr ""
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
msgid "Unable to configure printer options."
msgstr ""
@@ -3927,10 +4400,10 @@ msgstr ""
msgid "Unable to copy interface script - %s"
msgstr ""
-msgid "Unable to create compressed print file"
+msgid "Unable to create printer-uri"
msgstr ""
-msgid "Unable to create printer-uri"
+msgid "Unable to create server credentials."
msgstr ""
msgid "Unable to create temporary file"
@@ -3984,7 +4457,7 @@ msgstr ""
msgid "Unable to find printer."
msgstr ""
-msgid "Unable to generate compressed print file"
+msgid "Unable to find server credentials."
msgstr ""
msgid "Unable to get backend exit status."
@@ -4044,9 +4517,6 @@ msgstr "Impossible de transférer les tâches."
msgid "Unable to open PPD file"
msgstr ""
-msgid "Unable to open compressed print file"
-msgstr ""
-
msgid "Unable to open cupsd.conf file:"
msgstr "Impossible d’ouvrir le fichier cupsd.conf :"
@@ -4072,7 +4542,10 @@ msgstr "Impossible d’imprimer la page de test :"
msgid "Unable to read print data."
msgstr ""
-msgid "Unable to resolve printer URI."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
msgstr ""
#, c-format
@@ -4162,6 +4635,15 @@ msgstr "Paramètre printer-error-policy « %s » inconnu."
msgid "Unknown printer-op-policy \"%s\"."
msgstr "Paramètre printer-op-policy « %s » inconnu."
+msgid "Unknown request method."
+msgstr ""
+
+msgid "Unknown request version."
+msgstr ""
+
+msgid "Unknown scheme in URI"
+msgstr ""
+
msgid "Unknown service name."
msgstr ""
@@ -4251,7 +4733,7 @@ msgstr ""
msgid "Usage: cupsd [options]"
msgstr ""
-msgid "Usage: cupsfilter [ options ] filename"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
msgstr ""
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
@@ -4261,6 +4743,20 @@ msgid ""
"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
msgstr ""
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr ""
@@ -4274,15 +4770,6 @@ msgid ""
" lpoptions [-h server] [-E] -x printer"
msgstr ""
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
-msgstr ""
-
msgid ""
"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
msgstr ""
@@ -4341,11 +4828,6 @@ msgstr ""
"Vous devez accéder à cette page par l’URL <A HREF=\"https://%s:%d%s"
"\">https://%s:%d%s</A>."
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-
msgid "ZPL Label Printer"
msgstr "Imprimante pour étiquettes ZPL"
@@ -4392,6 +4874,9 @@ msgstr ""
msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
msgstr ""
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
msgid "cupsd: Relative cups-files.conf filename not allowed."
msgstr ""
@@ -4409,9 +4894,6 @@ msgstr ""
msgid "cupsd: Unknown option \"%c\" - aborting."
msgstr ""
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-
#, c-format
msgid "cupsfilter: Invalid document number %d."
msgstr ""
@@ -4456,15 +4938,87 @@ msgstr ""
msgid "idle"
msgstr "inactive"
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
msgstr ""
#, c-format
-msgid "ipptool: Bad URI - %s."
+msgid "ippfind: Expected key name after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr ""
+
+msgid "ippfind: Missing close parenthesis."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr ""
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr ""
+
+msgid "ippfind: Missing open parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing program after %s."
msgstr ""
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
+msgid "ippfind: Missing regular expression after %s."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr ""
+
+msgid "ippfind: Out of memory."
+msgstr ""
+
+msgid "ippfind: Too many parenthesis."
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr ""
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr ""
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
msgstr ""
msgid "ipptool: Invalid seconds for \"-i\"."
@@ -4485,12 +5039,6 @@ msgstr ""
msgid "ipptool: Missing seconds for \"-i\"."
msgstr ""
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
-
msgid "ipptool: URI required before test file."
msgstr ""
@@ -4584,6 +5132,10 @@ msgid ""
msgstr ""
#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
msgstr ""
@@ -4678,48 +5230,6 @@ msgstr ""
msgid "lpoptions: Unknown printer or class."
msgstr ""
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
-
#, c-format
msgid ""
"lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5198,3 +5708,30 @@ msgstr "sans titre"
msgid "variable-bindings uses indefinite length"
msgstr ""
+
+#~ msgid "720dpi"
+#~ msgstr "720 ppp"
+
+#~ msgid "Enter old password:"
+#~ msgstr "Ancien mot de passe :"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Confirmez le nouveau mot de passe :"
+
+#~ msgid "Enter password:"
+#~ msgstr "Entrez le nouveau mot de passe :"
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Nouvelles série Stylus Color"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Nouvelles série Stylus Photo"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Purger les tâches"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Série Stylus Color"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Série Stylus Photo"
diff --git a/locale/cups_it.po b/locale/cups_it.po
new file mode 100644
index 0000000..1a2ae3f
--- /dev/null
+++ b/locale/cups_it.po
@@ -0,0 +1,6261 @@
+#
+# "$Id$"
+#
+# Message catalog template for CUPS.
+#
+# Copyright 2007-2012 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+#
+# Notes for Translators:
+#
+# The "checkpo" program located in the "locale" source directory can be used
+# to verify that your translations do not introduce formatting errors or other
+# problems. Run with:
+#
+# cd locale
+# ./checkpo cups_LL.po
+#
+# where "LL" is your locale.
+#
+# Giovanni Scafora <giovanni@archlinux.org>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: CUPS 1.6\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2013-07-14 12:00+0200\n"
+"Last-Translator: Giovanni Scafora <giovanni@archlinux.org>\n"
+"Language-Team: Arch Linux Italian Team <giovanni@archlinux.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "\t\t(all)"
+msgstr "\t\t(tutti)"
+
+msgid "\t\t(none)"
+msgstr "\t\t(nessuno)"
+
+#, c-format
+msgid "\t%d entries"
+msgstr "\t%d voci"
+
+#, c-format
+msgid "\t%s"
+msgstr "\t%s"
+
+msgid "\tAfter fault: continue"
+msgstr "\tDopo un errore: continua"
+
+#, c-format
+msgid "\tAlerts: %s"
+msgstr "\tAvvisi: %s"
+
+msgid "\tBanner required"
+msgstr "\tBanner richiesto"
+
+msgid "\tCharset sets:"
+msgstr "\tSet di caratteri:"
+
+msgid "\tConnection: direct"
+msgstr "\tConnessione: diretta"
+
+msgid "\tConnection: remote"
+msgstr "\tConnessione: remota"
+
+msgid "\tContent types: any"
+msgstr "\tTipi di contenuto: qualsiasi"
+
+msgid "\tDefault page size:"
+msgstr "\tDimensione predefinite della pagina:"
+
+msgid "\tDefault pitch:"
+msgstr "\tTono predefinito:"
+
+msgid "\tDefault port settings:"
+msgstr "\tImpostazioni predefinite della porta:"
+
+#, c-format
+msgid "\tDescription: %s"
+msgstr "\tDescrizione: %s"
+
+msgid "\tForm mounted:"
+msgstr "\tModulo installato:"
+
+msgid "\tForms allowed:"
+msgstr "\tModuli consentiti:"
+
+#, c-format
+msgid "\tInterface: %s.ppd"
+msgstr "\tInterfaccia: %s.ppd"
+
+#, c-format
+msgid "\tInterface: %s/interfaces/%s"
+msgstr "\tInterfaccia: %s/interfacce/%s"
+
+#, c-format
+msgid "\tInterface: %s/ppd/%s.ppd"
+msgstr "\tInterfaccia: %s/ppd/%s.ppd"
+
+#, c-format
+msgid "\tLocation: %s"
+msgstr "\tPosizione: %s"
+
+msgid "\tOn fault: no alert"
+msgstr "\tIn caso di errore: nessun avviso"
+
+msgid "\tPrinter types: unknown"
+msgstr "\tTipi di stampanti: sconosciuto"
+
+#, c-format
+msgid "\tStatus: %s"
+msgstr "\tStato: %s"
+
+msgid "\tUsers allowed:"
+msgstr "\tUtenti autorizzati:"
+
+msgid "\tUsers denied:"
+msgstr "\tUtenti non autorizzati:"
+
+msgid "\tdaemon present"
+msgstr "\tdemone presente"
+
+msgid "\tno entries"
+msgstr "\tnessuna voce"
+
+#, c-format
+msgid "\tprinter is on device '%s' speed -1"
+msgstr "\tla stampante è sul dispositivo '%s' velocità -1"
+
+msgid "\tprinting is disabled"
+msgstr "\tla stampa è disabilitata"
+
+msgid "\tprinting is enabled"
+msgstr "\tla stampa è abilitata"
+
+#, c-format
+msgid "\tqueued for %s"
+msgstr "\tin coda per %s"
+
+msgid "\tqueuing is disabled"
+msgstr "\tla coda è disabilitata"
+
+msgid "\tqueuing is enabled"
+msgstr "\tla coda è abilitata"
+
+msgid "\treason unknown"
+msgstr "\tmotivo sconosciuto"
+
+msgid ""
+"\n"
+" DETAILED CONFORMANCE TEST RESULTS"
+msgstr ""
+"\n"
+" RISULTATI DETTAGLIATI DEL TEST DI CONFORMITÀ"
+
+msgid " Ignore specific warnings."
+msgstr " Ignora avvisi specifici."
+
+msgid " Issue warnings instead of errors."
+msgstr ""
+" Avvisa in caso di problemi invece degli errori."
+
+msgid " REF: Page 15, section 3.1."
+msgstr " RIF: pagina 15, sezione 3.1."
+
+msgid " REF: Page 15, section 3.2."
+msgstr " RIF: pagina 15, sezione 3.2."
+
+msgid " REF: Page 19, section 3.3."
+msgstr " RIF: pagina 19, sezione 3.3."
+
+msgid " REF: Page 20, section 3.4."
+msgstr " RIF: pagina 20, sezione 3.4."
+
+msgid " REF: Page 27, section 3.5."
+msgstr " RIF: pagina 27, sezione 3.5."
+
+msgid " REF: Page 42, section 5.2."
+msgstr " RIF: pagina 42, sezione 5.2."
+
+msgid " REF: Pages 16-17, section 3.2."
+msgstr " RIF: pagine 16-17, sezione 3.2."
+
+msgid " REF: Pages 42-45, section 5.2."
+msgstr " RIF: pagine 42-45, sezione 5.2."
+
+msgid " REF: Pages 45-46, section 5.2."
+msgstr " RIF: pagine 45-46, sezione 5.2."
+
+msgid " REF: Pages 48-49, section 5.2."
+msgstr " RIF: pagine 48-49, sezione 5.2."
+
+msgid " REF: Pages 52-54, section 5.2."
+msgstr " RIF: pagine 52-54, sezione 5.2."
+
+#, c-format
+msgid " %-39.39s %.0f bytes"
+msgstr " %-39.39s %.0f byte"
+
+#, c-format
+msgid " PASS Default%s"
+msgstr " PASS Default%s"
+
+msgid " PASS DefaultImageableArea"
+msgstr " PASS DefaultImageableArea"
+
+msgid " PASS DefaultPaperDimension"
+msgstr " PASS DefaultPaperDimension"
+
+msgid " PASS FileVersion"
+msgstr " PASS FileVersion"
+
+msgid " PASS FormatVersion"
+msgstr " PASS FormatVersion"
+
+msgid " PASS LanguageEncoding"
+msgstr " PASS LanguageEncoding"
+
+msgid " PASS LanguageVersion"
+msgstr " PASS LanguageVersion"
+
+msgid " PASS Manufacturer"
+msgstr " PASS Manufacturer"
+
+msgid " PASS ModelName"
+msgstr " PASS ModelName"
+
+msgid " PASS NickName"
+msgstr " PASS NickName"
+
+msgid " PASS PCFileName"
+msgstr " PASS PCFileName"
+
+msgid " PASS PSVersion"
+msgstr " PASS PSVersion"
+
+msgid " PASS PageRegion"
+msgstr " PASS PageRegion"
+
+msgid " PASS PageSize"
+msgstr " PASS PageSize"
+
+msgid " PASS Product"
+msgstr " PASS Product"
+
+msgid " PASS ShortNickName"
+msgstr " PASS ShortNickName"
+
+#, c-format
+msgid " WARN %s has no corresponding options."
+msgstr " WARN %s non ha opzioni corrispondenti."
+
+#, c-format
+msgid ""
+" WARN %s shares a common prefix with %s\n"
+" REF: Page 15, section 3.2."
+msgstr ""
+" WARN %s condivide un prefisso comune con %s\n"
+" RIF: pagina 15, sezione 3.2."
+
+#, c-format
+msgid ""
+" WARN Duplex option keyword %s may not work as expected and should "
+"be named Duplex.\n"
+" REF: Page 122, section 5.17"
+msgstr ""
+" WARN La parola chiave dell'opzione duplex %s potrebbe non "
+"funzionare come previsto e dovrebbe essere chiamata Duplex.\n"
+" RIF: pagina 122, sezione 5.17"
+
+msgid " WARN File contains a mix of CR, LF, and CR LF line endings."
+msgstr ""
+" WARN Il file contiene un insieme di righe che terminano con CR, "
+"LF e CR LF."
+
+msgid ""
+" WARN LanguageEncoding required by PPD 4.3 spec.\n"
+" REF: Pages 56-57, section 5.3."
+msgstr ""
+" WARN LanguageEncoding è richiesto dalle specifiche PPD 4.3.\n"
+" RIF: pagine 56-57, sezione 5.3."
+
+#, c-format
+msgid " WARN Line %d only contains whitespace."
+msgstr " WARN La riga %d contiene solo spazi."
+
+msgid ""
+" WARN Manufacturer required by PPD 4.3 spec.\n"
+" REF: Pages 58-59, section 5.3."
+msgstr ""
+" WARN Manufacturer è richiesto dalle specifiche PPD 4.3.\n"
+" RIF: pagine 58-59, sezione 5.3."
+
+msgid ""
+" WARN Non-Windows PPD files should use lines ending with only LF, "
+"not CR LF."
+msgstr ""
+" WARN I file PPD per sistemi diversi da Windows dovrebbero "
+"utilizzare solo righe terminanti con LF e non con CR LF."
+
+#, c-format
+msgid ""
+" WARN Obsolete PPD version %.1f.\n"
+" REF: Page 42, section 5.2."
+msgstr ""
+" WARN Versione obsoleta di PPD %.1f.\n"
+" RIF: pagina 42, sezione 5.2."
+
+msgid ""
+" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
+" REF: Pages 61-62, section 5.3."
+msgstr ""
+" WARN PCFileName più lungo di 8.3 vìola le specifiche PPD.\n"
+" RIF: pagine 61-62, sezione 5.3."
+
+msgid ""
+" WARN PCFileName should contain a unique filename.\n"
+" REF: Pages 61-62, section 5.3."
+msgstr ""
+" WARN PCFileName dovrebbe contenere un nome del file unico.\n"
+" RIF: pagine 61-62, sezione 5.3."
+
+msgid ""
+" WARN Protocols contains PJL but JCL attributes are not set.\n"
+" REF: Pages 78-79, section 5.7."
+msgstr ""
+" WARN Il protocollo contiene PJL ma gli attributi di JCL non sono "
+"impostati.\n"
+" RIF: pagine 78-79, sezione 5.7."
+
+msgid ""
+" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
+" REF: Pages 78-79, section 5.7."
+msgstr ""
+" WARN Il protocollo contiene entrambi PJL e BCP; è previsto TBCP.\n"
+" RIF: pagine 78-79, sezione 5.7."
+
+msgid ""
+" WARN ShortNickName required by PPD 4.3 spec.\n"
+" REF: Pages 64-65, section 5.3."
+msgstr ""
+" WARN ShortNickName richiesto dalle specifiche di PPD 4.3.\n"
+" RIF: pagine 64-65, sezione 5.3."
+
+msgid " cupsaddsmb [options] -a"
+msgstr " cupsaddsmb [opzioni] -a"
+
+msgid " cupstestdsc [options] -"
+msgstr " cupstestdsc [opzioni] -"
+
+msgid " program | cupstestppd [options] -"
+msgstr " programma | cupstestppd [opzioni] -"
+
+#, c-format
+msgid ""
+" %s \"%s %s\" conflicts with \"%s %s\"\n"
+" (constraint=\"%s %s %s %s\")."
+msgstr ""
+" %s \"%s %s\" confligge con \"%s %s\"\n"
+" (vincolo=\"%s %s %s %s\")."
+
+#, c-format
+msgid " %s %s %s does not exist."
+msgstr " %s %s %s non esiste."
+
+#, c-format
+msgid " %s %s file \"%s\" has the wrong capitalization."
+msgstr " %s %s file \"%s\" ha la capitalizzazione sbagliata."
+
+#, c-format
+msgid ""
+" %s Bad %s choice %s.\n"
+" REF: Page 122, section 5.17"
+msgstr ""
+" %s errata %s scelta %s.\n"
+" RIF: pagina 122, sezione 5.17"
+
+#, c-format
+msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s."
+msgstr ""
+" %s UTF-8 non è valido \"%s\" la string di traduzione dell'opzione %s, "
+"scelta %s."
+
+#, c-format
+msgid " %s Bad UTF-8 \"%s\" translation string for option %s."
+msgstr ""
+" %s UTF-8 non è valido \"%s\" la stringa di traduzione dell'opzione %s."
+
+#, c-format
+msgid " %s Bad cupsFilter value \"%s\"."
+msgstr " %s valore di cupsFilter non è valido \"%s\"."
+
+#, c-format
+msgid " %s Bad cupsFilter2 value \"%s\"."
+msgstr " %s il valore di cupsFilter2 non è valido \"%s\"."
+
+#, c-format
+msgid " %s Bad cupsICCProfile %s."
+msgstr " %s il valore di cupsICCProfile non è valido %s."
+
+#, c-format
+msgid " %s Bad cupsPreFilter value \"%s\"."
+msgstr " %s il valore di cupsPreFilter non è valido \"%s\"."
+
+#, c-format
+msgid " %s Bad cupsUIConstraints %s: \"%s\""
+msgstr " %s il valore di cupsUIConstraints non è valido %s: \"%s\""
+
+#, c-format
+msgid " %s Bad language \"%s\"."
+msgstr " %s la lingua non è valida \"%s\"."
+
+#, c-format
+msgid " %s Bad permissions on %s file \"%s\"."
+msgstr " %s permessi errati sul file %s \"%s\"."
+
+#, c-format
+msgid " %s Bad spelling of %s - should be %s."
+msgstr " %s ortografia errata di %s - dovrebbe essere %s."
+
+#, c-format
+msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID."
+msgstr ""
+" %s non è possibile passare entrambi APScanAppPath e APScanAppBundleID."
+
+#, c-format
+msgid " %s Default choices conflicting."
+msgstr " %s le scelte predefinite confliggono."
+
+#, c-format
+msgid " %s Empty cupsUIConstraints %s"
+msgstr " %s cupsUIConstraints è vuota %s"
+
+#, c-format
+msgid " %s Missing \"%s\" translation string for option %s, choice %s."
+msgstr ""
+" %s manca \"%s\" la stringa di traduzione dell'opzione %s, scelta %s."
+
+#, c-format
+msgid " %s Missing \"%s\" translation string for option %s."
+msgstr " %s manca \"%s\" la stringa di traduzione dell'opzione %s."
+
+#, c-format
+msgid " %s Missing %s file \"%s\"."
+msgstr " %s manca il file %s \"%s\"."
+
+#, c-format
+msgid ""
+" %s Missing REQUIRED PageRegion option.\n"
+" REF: Page 100, section 5.14."
+msgstr ""
+" %s manca l'opzione RICHIESTA PageRegion.\n"
+" RIF: pagina 100, sezione 5.14."
+
+#, c-format
+msgid ""
+" %s Missing REQUIRED PageSize option.\n"
+" REF: Page 99, section 5.14."
+msgstr ""
+" %s manca l'opzione RICHIESTA PageSize.\n"
+" RIF: pagina 99, sezione 5.14."
+
+#, c-format
+msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
+msgstr " %s manca la scelta *%s %s in UIConstraints \"*%s %s *%s %s\"."
+
+#, c-format
+msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
+msgstr " %s manca la scelta *%s %s in cupsUIConstraints %s: \"%s\""
+
+#, c-format
+msgid " %s Missing cupsUIResolver %s"
+msgstr " %s manca cupsUIResolver %s"
+
+#, c-format
+msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"."
+msgstr " %s manca l'opzione %s in UIConstraints \"*%s %s *%s %s\"."
+
+#, c-format
+msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\""
+msgstr " %s manca l'opzione %s in cupsUIConstraints %s: \"%s\""
+
+#, c-format
+msgid " %s No base translation \"%s\" is included in file."
+msgstr " %s Nessuna traduzione base \"%s\" è inclusa nel file."
+
+#, c-format
+msgid ""
+" %s REQUIRED %s does not define choice None.\n"
+" REF: Page 122, section 5.17"
+msgstr ""
+" %s RICHIESTA %s non definisce la scelta None.\n"
+" RIF: pagina 122, sezione 5.17"
+
+#, c-format
+msgid " %s Size \"%s\" defined for %s but not for %s."
+msgstr " %s dimensione \"%s\" definita per %s ma non per %s."
+
+#, c-format
+msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)."
+msgstr ""
+" %s dimensione \"%s\" presenta delle dimensioni inaspettate (%gx%g)."
+
+#, c-format
+msgid " %s Size \"%s\" should be \"%s\"."
+msgstr " %s dimensione \"%s\" dovrebbe essere \"%s\"."
+
+#, c-format
+msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"."
+msgstr ""
+" %s dimensione \"%s\" dovrebbe essere il nome standard di Adobe \"%s\"."
+
+#, c-format
+msgid " %s cupsICCProfile %s hash value collides with %s."
+msgstr " %s cupsICCProfile %s il valore dell'hash collide con %s."
+
+#, c-format
+msgid " %s cupsUIResolver %s causes a loop."
+msgstr " %s cupsUIResolver %s causa un loop."
+
+#, c-format
+msgid ""
+" %s cupsUIResolver %s does not list at least two different options."
+msgstr " %s cupsUIResolver %s non elenca almeno due opzioni differenti."
+
+#, c-format
+msgid ""
+" **FAIL** %s must be 1284DeviceID\n"
+" REF: Page 72, section 5.5"
+msgstr ""
+" **FAIL** %s deve essere 1284DeviceID\n"
+" RIF: pagina 72, sezione 5.5"
+
+#, c-format
+msgid ""
+" **FAIL** Bad Default%s %s\n"
+" REF: Page 40, section 4.5."
+msgstr ""
+" **FAIL** Valore predefinito errato%s %s\n"
+" RIF: pagina 40, sezione 4.5."
+
+#, c-format
+msgid ""
+" **FAIL** Bad DefaultImageableArea %s\n"
+" REF: Page 102, section 5.15."
+msgstr ""
+" **FAIL** DefaultImageableArea non è valido %s\n"
+" RIF: pagina 102, sezione 5.15."
+
+#, c-format
+msgid ""
+" **FAIL** Bad DefaultPaperDimension %s\n"
+" REF: Page 103, section 5.15."
+msgstr ""
+" **FAIL** DefaultPaperDimension non è valido %s\n"
+" RIF: pagina 103, sezione 5.15."
+
+#, c-format
+msgid ""
+" **FAIL** Bad FileVersion \"%s\"\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+" **FAIL** FileVersion non è valido \"%s\"\n"
+" RIF: pagina 56, sezione 5.3."
+
+#, c-format
+msgid ""
+" **FAIL** Bad FormatVersion \"%s\"\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+" **FAIL** FormatVersion non è valido \"%s\"\n"
+" RIF: pagina 56, sezione 5.3."
+
+msgid ""
+" **FAIL** Bad JobPatchFile attribute in file\n"
+" REF: Page 24, section 3.4."
+msgstr ""
+" **FAIL** l'attributo di JobPatchFile nel file non è valido\n"
+" RIF: pagina 24, sezione 3.4."
+
+#, c-format
+msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."
+msgstr ""
+" **FAIL** LanguageEncoding non è valido %s - deve essere ISOLatin1."
+
+#, c-format
+msgid " **FAIL** Bad LanguageVersion %s - must be English."
+msgstr " **FAIL** LanguageVersion non è valido %s - deve essere Inglese."
+
+#, c-format
+msgid ""
+" **FAIL** Bad Manufacturer (should be \"%s\")\n"
+" REF: Page 211, table D.1."
+msgstr ""
+" **FAIL** Manufacturer non è valido (dovrebbe essere \"%s\")\n"
+" RIF: pagina 211, tabella D.1."
+
+#, c-format
+msgid ""
+" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n"
+" REF: Pages 59-60, section 5.3."
+msgstr ""
+" **FAIL** ModelName non è valido - \"%c\" non consentito nella "
+"stringa.\n"
+" RIF: pagine 59-60, sezione 5.3."
+
+msgid ""
+" **FAIL** Bad PSVersion - not \"(string) int\".\n"
+" REF: Pages 62-64, section 5.3."
+msgstr ""
+" **FAIL** PSVersion non è valido - non è una \"(stringa) intera\".\n"
+" RIF: pagine 62-64, sezione 5.3."
+
+msgid ""
+" **FAIL** Bad Product - not \"(string)\".\n"
+" REF: Page 62, section 5.3."
+msgstr ""
+" **FAIL** Product non è valido - non è una \"(stringa)\".\n"
+" RIF: pagina 62, sezione 5.3."
+
+msgid ""
+" **FAIL** Bad ShortNickName - longer than 31 chars.\n"
+" REF: Pages 64-65, section 5.3."
+msgstr ""
+" **FAIL** ShortNickName non è valido - più lungo di 31 caratteri.\n"
+" RIF: pagine 64-65, sezione 5.3."
+
+#, c-format
+msgid ""
+" **FAIL** Bad option %s choice %s\n"
+" REF: Page 84, section 5.9"
+msgstr ""
+" **FAIL** L'opzione %s non è valida scelta %s\n"
+" RIF: pagina 84, sezione 5.9"
+
+#, c-format
+msgid " **FAIL** Default option code cannot be interpreted: %s"
+msgstr ""
+" **FAIL** Il codice dell'opzione predefinita non può essere "
+"interpretato: %s"
+
+#, c-format
+msgid ""
+" **FAIL** Default translation string for option %s choice %s contains "
+"8-bit characters."
+msgstr ""
+" **FAIL** La stringa di traduzione predefinita dell'opzione %s scelta "
+"%s contiene caratteri a 8-bit."
+
+#, c-format
+msgid ""
+" **FAIL** Default translation string for option %s contains 8-bit "
+"characters."
+msgstr ""
+" **FAIL** La stringa di traduzione predefinita dell'opzione %s "
+"contiene caratteri a 8-bit."
+
+#, c-format
+msgid " **FAIL** Group names %s and %s differ only by case."
+msgstr " **FAIL** I nomi dei gruppi %s e %s differiscono solo per caso."
+
+#, c-format
+msgid " **FAIL** Multiple occurrences of option %s choice name %s."
+msgstr ""
+" **FAIL** Occorrenze multiple dell'opzione %s nome della scelta %s."
+
+#, c-format
+msgid " **FAIL** Option %s choice names %s and %s differ only by case."
+msgstr ""
+" **FAIL** I nomi delle scelte %s e %s dell'opzione %s differiscono "
+"solo per caso."
+
+#, c-format
+msgid " **FAIL** Option names %s and %s differ only by case."
+msgstr ""
+" **FAIL** I nomi delle opzioni %s e %s differiscono solo per caso."
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED Default%s\n"
+" REF: Page 40, section 4.5."
+msgstr ""
+" **FAIL** RICHIESTA predefinita%s\n"
+" RIF: pagina 40, sezione 4.5."
+
+msgid ""
+" **FAIL** REQUIRED DefaultImageableArea\n"
+" REF: Page 102, section 5.15."
+msgstr ""
+" **FAIL** RICHIESTA DefaultImageableArea\n"
+" RIF: pagina 102, sezione 5.15."
+
+msgid ""
+" **FAIL** REQUIRED DefaultPaperDimension\n"
+" REF: Page 103, section 5.15."
+msgstr ""
+" **FAIL** RICHIESTA DefaultPaperDimension\n"
+" RIF: pagina 103, sezione 5.15."
+
+msgid ""
+" **FAIL** REQUIRED FileVersion\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA FileVersion\n"
+" RIF: pagina 56, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED FormatVersion\n"
+" REF: Page 56, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA FormatVersion\n"
+" RIF: pagina 56, sezione 5.3."
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 102, section 5.15."
+msgstr ""
+" **FAIL** RICHIESTA ImageableArea per PageSize %s\n"
+" RIF: pagina 41, sezione 5.\n"
+" RIF: pagina 102, sezione 5.15."
+
+msgid ""
+" **FAIL** REQUIRED LanguageEncoding\n"
+" REF: Pages 56-57, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA LanguageEncoding\n"
+" RIF: pagina 56-57, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED LanguageVersion\n"
+" REF: Pages 57-58, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA LanguageVersion\n"
+" RIF: pagine 57-58, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED Manufacturer\n"
+" REF: Pages 58-59, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA Manufacturer\n"
+" RIF: pagine 58-59, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED ModelName\n"
+" REF: Pages 59-60, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA ModelName\n"
+" RIF: pagine 59-60, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED NickName\n"
+" REF: Page 60, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA NickName\n"
+" RIF: pagina 60, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED PCFileName\n"
+" REF: Pages 61-62, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA PCFileName\n"
+" RIF: pagine 61-62, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED PSVersion\n"
+" REF: Pages 62-64, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA PSVersion\n"
+" RIF: pagine 62-64, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED PageRegion\n"
+" REF: Page 100, section 5.14."
+msgstr ""
+" **FAIL** RICHIESTA PageRegion\n"
+" RIF: pagina 100, sezione 5.14."
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 99, section 5.14."
+msgstr ""
+" **FAIL** RICHIESTA PageSize\n"
+" RIF: pagina 41, sezione 5.\n"
+" RIF: pagina 99, sezione 5.14."
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Pages 99-100, section 5.14."
+msgstr ""
+" **FAIL** RICHIESTA PageSize\n"
+" RIF: pagine 99-100, sezione 5.14."
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 103, section 5.15."
+msgstr ""
+" **FAIL** RICHIESTA PaperDimension per PageSize %s\n"
+" RIF: pagina 41, sezione 5.\n"
+" RIF: pagina 103, sezione 5.15."
+
+msgid ""
+" **FAIL** REQUIRED Product\n"
+" REF: Page 62, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA Product\n"
+" RIF: pagina 62, sezione 5.3."
+
+msgid ""
+" **FAIL** REQUIRED ShortNickName\n"
+" REF: Page 64-65, section 5.3."
+msgstr ""
+" **FAIL** RICHIESTA ShortNickName\n"
+" RIF: pagina 64-65, sezione 5.3."
+
+#, c-format
+msgid " **FAIL** Unable to open PPD file - %s on line %d."
+msgstr " **FAIL** Non è possibile aprire il file PPD - %s alla riga %d."
+
+#, c-format
+msgid " %d ERRORS FOUND"
+msgstr " %d SONO STATI TROVATI DEGLI ERRORI"
+
+msgid " -h Show program usage"
+msgstr " -h Mostra l'uso del programma"
+
+#, c-format
+msgid ""
+" Bad %%%%BoundingBox: on line %d.\n"
+" REF: Page 39, %%%%BoundingBox:"
+msgstr ""
+" Non è valido %%%%BoundingBox: alla riga %d.\n"
+" RIF: pagina 39, %%%%BoundingBox:"
+
+#, c-format
+msgid ""
+" Bad %%%%Page: on line %d.\n"
+" REF: Page 53, %%%%Page:"
+msgstr ""
+" Non è valido %%%%Page: alla riga %d.\n"
+" RIF: pagina 53, %%%%Page:"
+
+#, c-format
+msgid ""
+" Bad %%%%Pages: on line %d.\n"
+" REF: Page 43, %%%%Pages:"
+msgstr ""
+" Non è valido %%%%Pages: alla riga %d.\n"
+" RIF: pagina 43, %%%%Pages:"
+
+#, c-format
+msgid ""
+" Line %d is longer than 255 characters (%d).\n"
+" REF: Page 25, Line Length"
+msgstr ""
+" La riga %d è più lunga di 255 caratteri (%d).\n"
+" RIF: pagina 25, Lunghezza della riga"
+
+msgid ""
+" Missing %!PS-Adobe-3.0 on first line.\n"
+" REF: Page 17, 3.1 Conforming Documents"
+msgstr ""
+" Manca %!PS-Adobe-3.0 nella prima riga.\n"
+" RIF: pagina 17, 3.1 Documenti conformi"
+
+#, c-format
+msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments"
+msgstr ""
+" Manca il commento %%EndComments. RIF: pagina 41, %%EndComments"
+
+#, c-format
+msgid ""
+" Missing or bad %%BoundingBox: comment.\n"
+" REF: Page 39, %%BoundingBox:"
+msgstr ""
+" Manca o non è valido %%BoundingBox: commento.\n"
+" RIF: pagina 39, %%BoundingBox:"
+
+#, c-format
+msgid ""
+" Missing or bad %%Page: comments.\n"
+" REF: Page 53, %%Page:"
+msgstr ""
+" Manca o non è valido %%Page: commenti.\n"
+" RIF: pagina 53, %%Page:"
+
+#, c-format
+msgid ""
+" Missing or bad %%Pages: comment.\n"
+" REF: Page 43, %%Pages:"
+msgstr ""
+" Manca o non è valido %%Pages: commento.\n"
+" RIF: pagina 43, %%Pages:"
+
+msgid " NO ERRORS FOUND"
+msgstr " NON SONO STATI TROVATI ERRORI"
+
+#, c-format
+msgid " Saw %d lines that exceeded 255 characters."
+msgstr " Tagliare %d righe che hanno superato i 255 caratteri."
+
+#, c-format
+msgid " Too many %%BeginDocument comments."
+msgstr " Troppi %%BeginDocument commenti."
+
+#, c-format
+msgid " Too many %%EndDocument comments."
+msgstr " Troppi %%EndDocument commenti."
+
+msgid " Warning: file contains binary data."
+msgstr " Attenzione: il file contiene dei dati binari."
+
+#, c-format
+msgid " Warning: no %%EndComments comment in file."
+msgstr " Attenzione: nessun %%EndComments commento nel file."
+
+#, c-format
+msgid " Warning: obsolete DSC version %.1f in file."
+msgstr " Attenzione: versione obsoleta di DSC %.1f nel file."
+
+msgid " ! expression Unary NOT of expression."
+msgstr " ! expression Unario NON di espressione."
+
+msgid " ( expressions ) Group expressions."
+msgstr " ( espressioni ) Gruppo di espressioni."
+
+msgid " --[no-]debug-logging Turn debug logging on/off."
+msgstr " --[no-]debug-logging Attiva/disattiva il logging del debug."
+
+msgid " --[no-]remote-admin Turn remote administration on/off."
+msgstr " --[no-]remote-admin Attiva/disattiva l'amministrazione remota."
+
+msgid " --[no-]remote-any Allow/prevent access from the Internet."
+msgstr " --[no-]remote-any Consente/previene l'accesso da Internet."
+
+msgid " --[no-]share-printers Turn printer sharing on/off."
+msgstr ""
+" --[no-]share-printers Attiva/disattiva la condivisione della stampante."
+
+msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job."
+msgstr ""
+" --[no-]user-cancel-any Consente/vieta che gli utenti eliminino le stampe."
+
+msgid " --cr End lines with CR (Mac OS 9)."
+msgstr " --cr Termina righe con CR (Mac OS 9)."
+
+msgid " --crlf End lines with CR + LF (Windows)."
+msgstr " --crlf Termina righe con CR + LF (Windows)."
+
+msgid " --domain regex Match domain to regular expression."
+msgstr ""
+" --domain regex Corrispondenza del dominio con l'espressione "
+"regolare."
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+" --exec utility [argument ...] ;\n"
+" Esegue il programma se vero."
+
+msgid " --false Always false."
+msgstr " --false Sempre falso."
+
+msgid " --help Show help."
+msgstr ""
+
+msgid " --help Show this help."
+msgstr " --help Mostra questo aiuto."
+
+msgid " --host regex Match hostname to regular expression."
+msgstr ""
+" --host regex Corrispondenza dell'hostname con l'espressione "
+"regolare."
+
+msgid " --lf End lines with LF (UNIX/Linux/OS X)."
+msgstr " --lf Termina le righe con LF (UNIX/Linux/OS X)."
+
+msgid " --list-filters List filters that will be used."
+msgstr ""
+
+msgid " --local True if service is local."
+msgstr " --local Vero se il servizio è locale."
+
+msgid " --ls List attributes."
+msgstr " --ls Elenco attributi."
+
+msgid " --name regex Match service name to regular expression."
+msgstr ""
+" --name regex Corrispondenza del nome del servizio con "
+"l'espressione regolare."
+
+msgid " --not expression Unary NOT of expression."
+msgstr " --not expression Unario NON di espressione."
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+" --path regex Corrispondenza del path della risorsa con "
+"l'espressione regolare."
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+" --port number[-numero] Corrispondenza della porta con il numero o con "
+"l'intervallo."
+
+msgid " --print Print URI if true."
+msgstr " --print Stampa URI se vero."
+
+msgid " --print-name Print service name if true."
+msgstr " --print-name Stampa il nome del servizio se vero."
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+" --quiet Riporta silenziosamente la corrispondenza tramite "
+"il codice d'uscita."
+
+msgid " --remote True if service is remote."
+msgstr " --remote Vero se il servizio è remoto."
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+
+msgid " --true Always true."
+msgstr " --true Sempre vero."
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr " --txt key Vero se il record TXT contiene la chiave."
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+" --txt-* regex Corrispondenza della chiave del record TXT con "
+"l'espressione regolare."
+
+msgid " --uri regex Match URI to regular expression."
+msgstr ""
+" --uri regex Corrispondenza dell'URI con l'espressione regolare."
+
+msgid " --version Show program version."
+msgstr " --version Mostra la versione del programma."
+
+msgid " --version Show version."
+msgstr ""
+
+msgid " -4 Connect using IPv4."
+msgstr " -4 Connetti utilizzando IPv4."
+
+msgid " -6 Connect using IPv6."
+msgstr " -6 Connetti utilizzando IPv6."
+
+msgid " -C Send requests using chunking (default)."
+msgstr ""
+" -C Invia richieste utilizzando la suddivisione in "
+"blocchi (predefinito)."
+
+msgid " -D Remove the input file when finished."
+msgstr ""
+" -D Rimuovi il file di input una volta terminato."
+
+msgid " -D name=value Set named variable to value."
+msgstr " -D name=value Imposta la variabile chiamata al valore."
+
+msgid " -E Encrypt the connection."
+msgstr " -E Crittografa la connessione."
+
+msgid " -E Test with HTTP Upgrade to TLS."
+msgstr " -E Prova con l'aggiornamento HTTP a TLS."
+
+msgid ""
+" -F Run in the foreground but detach from console."
+msgstr " -F Avvia in foreground ma esce dalla console."
+
+msgid " -H samba-server Use the named SAMBA server."
+msgstr " -H samba-server Utilizza il server SAMBA."
+
+msgid " -I Ignore errors."
+msgstr " -I Ignora gli errori."
+
+msgid " -I include-dir Add include directory to search path."
+msgstr ""
+" -I include-dir Aggiunge la directory include al percorso della "
+"ricerca."
+
+msgid " -I {filename,filters,none,profiles}"
+msgstr " -I {file,filtri,nessuno,profili}"
+
+msgid " -L Send requests using content-length."
+msgstr " -L Invia richieste utilizzando content-length."
+
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
+msgid " -P filename.ppd Set PPD file."
+msgstr " -P filename.ppd Imposta il file PPD."
+
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+" -P number[-number] Corrispondenza della porta con il numero o con "
+"l'intervallo."
+
+msgid " -R root-directory Set alternate root."
+msgstr " -R root-directory Imposta una root alternativa."
+
+msgid " -S Test with SSL encryption."
+msgstr " -S Prova con crittografia SSL."
+
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr " -T seconds Imposta il timeout in secondi."
+
+msgid " -T seconds Set the receive/send timeout in seconds."
+msgstr ""
+" -T seconds Imposta il timeout della ricezione/invio in "
+"secondi."
+
+msgid " -U username Specify username."
+msgstr " -U username Specifica l'username."
+
+msgid " -V version Set default IPP version."
+msgstr " -V version Imposta la versione predefinita di IPP."
+
+msgid ""
+" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
+msgstr ""
+" -W {tutto,nessuno,vincoli,predefiniti,duplex,filtri,profili,dimensioni,"
+"traduzioni}"
+
+msgid " -X Produce XML plist instead of plain text."
+msgstr ""
+" -X Produce una plist XML invece di un testo normale."
+
+msgid " -a Browse for all services."
+msgstr " -a Mostra tutti i servizi."
+
+msgid " -a Export all printers."
+msgstr " -a Esporta tutte le stampanti."
+
+msgid " -c Produce CSV output."
+msgstr ""
+
+msgid " -c catalog.po Load the specified message catalog."
+msgstr ""
+" -c catalog.po Carica il catalogo del messaggio specificato."
+
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr ""
+
+msgid " -c cupsd.conf Set cupsd.conf file to use."
+msgstr " -c cupsd.conf Imposta il file cupsd.conf da utilizzare."
+
+msgid " -d domain Browse/resolve in specified domain."
+msgstr " -d domain Mostra/risolve il dominio specificato."
+
+msgid " -d name=value Set named variable to value."
+msgstr " -d name=value Imposta la variabile specificata al valore."
+
+msgid " -d output-dir Specify the output directory."
+msgstr " -d output-dir Specifica la directory di output."
+
+msgid " -d printer Use the named printer."
+msgstr " -d printer Utilizza la stampante specificata."
+
+msgid " -d regex Match domain to regular expression."
+msgstr ""
+" -d regex Corrispondenza del dominio con l'espressione "
+"regolare."
+
+msgid " -e Use every filter from the PPD file."
+msgstr " -e Utilizza tutti i filtri dal file PPD."
+
+msgid " -f Run in the foreground."
+msgstr " -f Avvia in foreground."
+
+msgid " -f filename Set default request filename."
+msgstr " -f filename Imposta il file predefinito richiesto."
+
+msgid " -h Show this usage message."
+msgstr " -h Mostra questo messaggio di utilizzo."
+
+msgid " -h regex Match hostname to regular expression."
+msgstr ""
+" -h regex Corrispondenza dell'hostname con l'espressione "
+"regolare."
+
+msgid " -h server[:port] Specify server address."
+msgstr " -h server[:porta] Specifica l'indirizzo del server."
+
+msgid " -i mime/type Set input MIME type (otherwise auto-typed)."
+msgstr ""
+" -i mime/type Imposta il tipo di MIME di input (altrimenti auto-"
+"typed)."
+
+msgid ""
+" -i seconds Repeat the last file with the given time interval."
+msgstr ""
+" -i secondi Ripeti l'ultimo file con il dato intervallo di "
+"tempo."
+
+msgid ""
+" -j job-id[,N] Filter file N from the specified job (default is "
+"file 1)."
+msgstr ""
+" -j job-id[,N] File del filtro N dal processo specificato (quello "
+"predefinito è il file 1)."
+
+msgid " -l List attributes."
+msgstr " -l Elenca gli attributi."
+
+msgid " -l Produce plain text output."
+msgstr ""
+
+msgid " -l Run cupsd on demand."
+msgstr ""
+
+msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
+msgstr " -l lang[,lang,...] Specifica la lingua(e) (locale) di output."
+
+msgid " -m Use the ModelName value as the filename."
+msgstr " -m Utilizza il valore di ModelName come file."
+
+msgid ""
+" -m mime/type Set output MIME type (otherwise application/pdf)."
+msgstr ""
+" -m mime/type Imposta il tipo di MIME di output (altrimenti "
+"application/pdf)."
+
+msgid " -n copies Set number of copies."
+msgstr " -n copies Imposta il numero di copie."
+
+msgid ""
+" -n count Repeat the last file the given number of times."
+msgstr ""
+" -n count Ripete un numero di volte l'ultimo file dato."
+
+msgid " -n regex Match service name to regular expression."
+msgstr ""
+" -n regex Corrispondenza del nome del servizio con "
+"l'espressione regolare."
+
+msgid ""
+" -o filename.drv Set driver information file (otherwise ppdi.drv)."
+msgstr " -o filename.drv Imposta un driver (altrimenti ppdi.drv)."
+
+msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)."
+msgstr ""
+" -o filename.ppd[.gz] Imposta il file di output (altrimenti stdout)."
+
+msgid " -o name=value Set option(s)."
+msgstr " -o nome=valore Imposta opzione(i)."
+
+msgid " -p Print URI if true."
+msgstr " -p Stampa l'URI se vero."
+
+msgid " -p filename.ppd Set PPD file."
+msgstr " -p filename.ppd Imposta il file PPD."
+
+msgid " -p program Run specified program for each service."
+msgstr ""
+" -p program Avvia il programma specificato per ogni servizio."
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+" -q Riporta silenziosamente la corrispondenza tramite "
+"il codice d'uscita."
+
+msgid " -q Run silently."
+msgstr " -q Avvia silenziosamente."
+
+msgid " -r True if service is remote."
+msgstr " -r Vero se il servizio è remoto."
+
+msgid " -r Use 'relaxed' open mode."
+msgstr " -r Utilizza la modalità di apertura 'relaxed'."
+
+msgid " -s Print service name if true."
+msgstr " -s Stampa il nome del servizio se è vero."
+
+msgid " -t Produce a test report."
+msgstr " -t Produce un rapporto di prova."
+
+msgid " -t Test PPDs instead of generating them."
+msgstr " -t Prova i PPD invece di generarli."
+
+msgid " -t Test the configuration file."
+msgstr " -t Prova il file di configurazione."
+
+msgid " -t key True if the TXT record contains the key."
+msgstr " -t key Vero se il record di TXT contiene la chiave."
+
+msgid " -t title Set title."
+msgstr " -t title Imposta il titolo."
+
+msgid " -t type Browse/resolve with specified type."
+msgstr " -t type Mostra/risolve con il tipo specificato."
+
+msgid " -u Remove the PPD file when finished."
+msgstr " -u Rimuove il file PPD una volta terminato."
+
+msgid " -u regex Match URI to regular expression."
+msgstr ""
+" -u regex Corrispondenza dell'URI con l'espressione regolare."
+
+msgid " -v Be verbose."
+msgstr " -v Fornisce maggiori dettagli."
+
+msgid " -vv Be very verbose."
+msgstr " -vv Fornisce tantissimi dettagli."
+
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+" -x utility [argument ...] ;\n"
+" Esegue il programma se è vero."
+
+msgid " -z Compress PPD files using GNU zip."
+msgstr ""
+" -z Il file PPD compresso sta utilizzando GNU zip."
+
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr " IPPFIND_SERVICE_DOMAIN Nome del dominio"
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Nome del dominio completo"
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr " IPPFIND_SERVICE_NAME Nome istanza del servizio"
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr " IPPFIND_SERVICE_PORT Numero della porta"
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr " IPPFIND_SERVICE_REGTYPE DNS-SD tipo di registrazione"
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr " IPPFIND_SERVICE_SCHEME schema dell'URI"
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr " IPPFIND_SERVICE_URI URI"
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr " IPPFIND_TXT_* Value della chiave del record TXT"
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr ""
+" espressione --and espressione\n"
+" AND logico."
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+" espressione --or espressione\n"
+" OR logico."
+
+msgid " expression expression Logical AND."
+msgstr " espressione espressione AND logico."
+
+msgid " {service_domain} Domain name"
+msgstr " {service_domain} Nome del dominio"
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr " {service_hostname} Nome del dominio completo"
+
+msgid " {service_name} Service instance name"
+msgstr " {service_name} Nome istanza del servizio"
+
+msgid " {service_port} Port number"
+msgstr " {service_port} Numero della porta"
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr " {service_regtype} Tipo di registrazione DNS-SD"
+
+msgid " {service_scheme} URI scheme"
+msgstr " {service_scheme} Schema dell'URI"
+
+msgid " {service_uri} URI"
+msgstr " {service_uri} URI"
+
+msgid " {txt_*} Value of TXT record key"
+msgstr " {txt_*} Valore della chiave del record TXT"
+
+msgid " {} URI"
+msgstr " {} URI"
+
+msgid " FAIL"
+msgstr " OPERAZIONE NON RIUSCITA CORRETTAMENTE"
+
+msgid " PASS"
+msgstr " OPERAZIONE RIUSCITA CON SUCCESSO"
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": il valore dell'URI non è valido \"%s\" - %s (RFC 2911 sezione 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": il valore dell'URI non è valido \"%s\" - la lunghezza non è valida "
+"%d (RFC 2911 sezione 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": il nome dell'attributo non è valido - la lunghezza non è valida %d "
+"(RFC 2911 sezione 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": il nome dell'attributo non è valido - il carattere non è valido (RFC "
+"2911 sezione 4.1.3)."
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": il valore booleano non è valido %d (RFC 2911 sezione 4.1.11)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": il valore del set dei caratteri non è valido \"%s\" - i caratteri "
+"non sono validi (RFC 2911 sezione 4.1.7)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": il valore del set dei caratteri non è valido \"%s\" - la lunghezza "
+"non è valida %d (RFC 2911 sezione 4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime UTC non è valido ore %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime UTC non è valido minuti %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime UTC non è valido segno '%c' (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido giorno %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime non è valido decimi di secondi %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido ore %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido minuti %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido mese %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido secondi %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+"\"%s\": il valore enum non è valido %d - fuori intervallo (RFC 2911 sezione "
+"4.1.4)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": il valore della parola chiave non è valido \"%s\" - la lunghezza non "
+"è valida %d (RFC 2911 sezione 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": il valore della parola chiave non è valido \"%s\" - il carattere non "
+"è valido (RFC 2911 sezione 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": il valore di mimeMediaType non è valido \"%s\" - i caratteri non "
+"sono validi (RFC 2911 sezione 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": il valore di mimeMediaType non è valido \"%s\" - la lunghezza non è "
+"valida %d (RFC 2911 sezione 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": il valore del nome non è valido \"%s\" - la sequenza UTF-8 non è "
+"valida (RFC 2911 sezione 4.1.2)."
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": il valore del nome non è valido \"%s\" - la lunghezza non è valida "
+"%d (RFC 2911 sezione 4.1.2)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": il valore di naturalLanguage non è valido \"%s\" - i caratteri non "
+"sono validi (RFC 2911 sezione 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": il valore di naturalLanguage non è valido \"%s\" - la lunghezza non "
+"è valida %d (RFC 2911 sezione 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": il valore di octetString non è valido - la lunghezza non è valida %d "
+"(RFC 2911 sezione 4.1.10)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": il valore di rangeOfInteger non è valido %d-%d - il più piccolo è "
+"superiore al più grande (RFC 2911 sezione 4.1.13)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": il valore di resolution non è valido %dx%d%s - il valore dell'unità "
+"non è valida (RFC 2911 sezione 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": il valore della risoluzione non è valido %dx%d%s - la risoluzione "
+"del feed deve essere positiva (RFC 2911 sezione 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": il valore della risoluzione non è valido %dx%d%s - la risoluzione "
+"del feed deve essere positiva (RFC 2911 sezione 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": il valore del testo non è valido \"%s\" - la sequenza UTF-8 non è "
+"valida (RFC 2911 sezione 4.1.1)."
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": il valore del testo non è valido \"%s\" - la lunghezza non è valida "
+"%d (RFC 2911 sezione 4.1.1)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": il valore di uriScheme non è valido \"%s\" - i caratteri non sono "
+"validi (RFC 2911 sezione 4.1.6)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": il valore di uriScheme non è valido \"%s\" - la lunghezza non è "
+"valida %d (RFC 2911 sezione 4.1.6)."
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
+msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte"
+
+#, c-format
+msgid "%d x %d mm"
+msgstr ""
+
+#, c-format
+msgid "%g x %g"
+msgstr ""
+
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr ""
+
+#, c-format
+msgid "%s accepting requests since %s"
+msgstr "%s sta accettando richieste da %s"
+
+#, c-format
+msgid "%s cannot be changed."
+msgstr "%s non può essere modificato"
+
+#, c-format
+msgid "%s is not implemented by the CUPS version of lpc."
+msgstr "%s non è implementato dalla versione di CUPS di lpc."
+
+#, c-format
+msgid "%s is not ready"
+msgstr "%s non è pronta"
+
+#, c-format
+msgid "%s is ready"
+msgstr "%s è pronta"
+
+#, c-format
+msgid "%s is ready and printing"
+msgstr "%s è pronta e sta stampando"
+
+#, c-format
+msgid "%s job-id user title copies options [file]"
+msgstr "%s job-id titolo dell'utente opzioni delle copie [file]"
+
+#, c-format
+msgid "%s not accepting requests since %s -"
+msgstr "%s non sta accettando richieste da %s -"
+
+#, c-format
+msgid "%s not supported."
+msgstr "%s non è supportato."
+
+#, c-format
+msgid "%s/%s accepting requests since %s"
+msgstr "%s/%s sta accettando richieste da %s"
+
+#, c-format
+msgid "%s/%s not accepting requests since %s -"
+msgstr "%s/%s non sta accettando richieste da %s -"
+
+#, c-format
+msgid "%s: %-33.33s [job %d localhost]"
+msgstr "%s: %-33.33s [processo %d localhost]"
+
+#. TRANSLATORS: Message is "subject: error"
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#, c-format
+msgid "%s: %s failed: %s"
+msgstr "%s: %s non riuscito correttamente: %s"
+
+#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr "%s: la versione %s non è valida per \"-V\"."
+
+#, c-format
+msgid "%s: Don't know what to do."
+msgstr "%s: non so cosa fare."
+
+#, c-format
+msgid ""
+"%s: Error - %s environment variable names non-existent destination \"%s\"."
+msgstr ""
+"%s: errore - %s destinazione inesistente dei nomi delle variabili di "
+"ambiente \"%s\"."
+
+#, c-format
+msgid "%s: Error - add '/version=1.1' to server name."
+msgstr "%s: errore - aggiungere '/version=1.1' al nome del server."
+
+#, c-format
+msgid "%s: Error - bad job ID."
+msgstr "%s: errore - l'ID del processo non è valido."
+
+#, c-format
+msgid "%s: Error - cannot print files and alter jobs simultaneously."
+msgstr ""
+"%s: errore - non è possibile stampare file e alterare le stampe "
+"simultaneamente."
+
+#, c-format
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
+msgstr ""
+"%s: errore - non è possibile stampare da stdin se non si fornisce un file o "
+"un ID del processo."
+
+#, c-format
+msgid "%s: Error - expected character set after \"-S\" option."
+msgstr "%s: errore - è previsto un set di caratteri dopo l'opzione \"-S\"."
+
+#, c-format
+msgid "%s: Error - expected content type after \"-T\" option."
+msgstr "%s: errore - è previsto il tipo di contenuto dopo l'opzione \"-T\"."
+
+#, c-format
+msgid "%s: Error - expected copies after \"-#\" option."
+msgstr "%s: errore - sono previste delle copie dopo l'opzione \"-#\"."
+
+#, c-format
+msgid "%s: Error - expected copies after \"-n\" option."
+msgstr "%s: errore - sono previste delle copie dopo l'opzione \"-n\"."
+
+#, c-format
+msgid "%s: Error - expected destination after \"-P\" option."
+msgstr "%s: errore - è prevista una destinazione dopo l'opzione \"-P\"."
+
+#, c-format
+msgid "%s: Error - expected destination after \"-d\" option."
+msgstr "%s: errore - è prevista una destinazione dopo l'opzione \"-d\"."
+
+#, c-format
+msgid "%s: Error - expected form after \"-f\" option."
+msgstr "%s: errore - è previsto un modulo dopo l'opzione \"-f\"."
+
+#, c-format
+msgid "%s: Error - expected hold name after \"-H\" option."
+msgstr "%s: errore - è previsto un nome dopo l'opzione \"-H\"."
+
+#, c-format
+msgid "%s: Error - expected hostname after \"-H\" option."
+msgstr "%s: errore - è previsto un hostname dopo l'opzione \"-H\"."
+
+#, c-format
+msgid "%s: Error - expected hostname after \"-h\" option."
+msgstr "%s: errore - è previsto un hostname dopo l'opzione \"-h\"."
+
+#, c-format
+msgid "%s: Error - expected mode list after \"-y\" option."
+msgstr ""
+"%s: errore - è prevista una lista di modalità di attesa dopo l'opzione \"-y"
+"\"."
+
+#, c-format
+msgid "%s: Error - expected name after \"-%c\" option."
+msgstr "%s: errore - è previsto un nome dopo l'opzione \"-%c\"."
+
+#, c-format
+msgid "%s: Error - expected option=value after \"-o\" option."
+msgstr "%s: errore - è previsto un opzione=valore dopo l'opzione \"-o\"."
+
+#, c-format
+msgid "%s: Error - expected page list after \"-P\" option."
+msgstr "%s: errore - è previsto un elenco di pagine dopo l'opzione \"-P\"."
+
+#, c-format
+msgid "%s: Error - expected priority after \"-%c\" option."
+msgstr "%s: errore - è prevista una priorità dopo l'opzione \"-%c\"."
+
+#, c-format
+msgid "%s: Error - expected reason text after \"-r\" option."
+msgstr "%s: errore - è previsto un testo del motivo dopo l'opzione \"-r\"."
+
+#, c-format
+msgid "%s: Error - expected title after \"-t\" option."
+msgstr "%s: errore - è previsto un titolo dopo l'opzione \"-t\"."
+
+#, c-format
+msgid "%s: Error - expected username after \"-U\" option."
+msgstr "%s: errore - è previsto un username dopo l'opzione \"-U\"."
+
+#, c-format
+msgid "%s: Error - expected username after \"-u\" option."
+msgstr "%s: errore - è previsto un username dopo l'opzione \"-u\"."
+
+#, c-format
+msgid "%s: Error - expected value after \"-%c\" option."
+msgstr "%s: errore - è previsto un valore dopo l'opzione \"-%c\"."
+
+#, c-format
+msgid ""
+"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" "
+"option."
+msgstr ""
+"%s: errore - deve seguire \"completed\", \"non-completed\" oppure \"all\" "
+"dopo l'opzione \"-W\"."
+
+#, c-format
+msgid "%s: Error - no default destination available."
+msgstr "%s: errore - nessuna destinazione predefinita disponibile."
+
+#, c-format
+msgid "%s: Error - priority must be between 1 and 100."
+msgstr "%s: errore- la priorità deve essere compresa tra 1 e 100."
+
+#, c-format
+msgid "%s: Error - scheduler not responding."
+msgstr "%s: errore - lo scheduler non sta rispondendo."
+
+#, c-format
+msgid "%s: Error - too many files - \"%s\"."
+msgstr "%s: errore - troppi file - \"%s\"."
+
+#, c-format
+msgid "%s: Error - unable to access \"%s\" - %s"
+msgstr "%s: errore - non è possibile accedere a \"%s\" - %s"
+
+#, c-format
+msgid "%s: Error - unable to queue from stdin - %s."
+msgstr "%s: errore - non è possibile mettere in coda da stdin - %s."
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s\"."
+msgstr "%s: errore - destinazione sconosciuta \"%s\"."
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s/%s\"."
+msgstr "%s: errore - destinazione sconosciuta \"%s/%s\"."
+
+#, c-format
+msgid "%s: Error - unknown option \"%c\"."
+msgstr "%s: errore - opzione sconosciuta \"%c\"."
+
+#, c-format
+msgid "%s: Error - unknown option \"%s\"."
+msgstr "%s: errore - opzione sconosciuta \"%s\"."
+
+#, c-format
+msgid "%s: Expected job ID after \"-i\" option."
+msgstr "%s: è previsto un ID del processo dopo l'opzione \"-i\"."
+
+#, c-format
+msgid "%s: Invalid destination name in list \"%s\"."
+msgstr "%s: il nome della destinazione non è valido nella lista \"%s\"."
+
+#, c-format
+msgid "%s: Invalid filter string \"%s\"."
+msgstr "%s: la stringa del filtro non è valida \"%s\"."
+
+#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr "%s: manca il timeout di \"-T\"."
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr "%s: manca la versione di \"-V\"."
+
+#, c-format
+msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
+msgstr ""
+"%s: è necessario un ID del processo (\"-i jobid\") prima di \"-H restart\"."
+
+#, c-format
+msgid "%s: No filter to convert from %s/%s to %s/%s."
+msgstr "%s: nessun filtro per convertire da %s/%s a %s/%s."
+
+#, c-format
+msgid "%s: Operation failed: %s"
+msgstr "%s: operazione non riuscita correttamente: %s"
+
+#, c-format
+msgid "%s: Sorry, no encryption support."
+msgstr "%s: spiacenti, nessun supporto per la crittografia."
+
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to connect to server."
+msgstr "%s: non è possibile connettersi al server."
+
+#, c-format
+msgid "%s: Unable to contact server."
+msgstr "%s: non è possibile contattare il server."
+
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to determine MIME type of \"%s\"."
+msgstr "%s: non è possibile determinare il tipo di MIME di \"%s\"."
+
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to open %s: %s"
+msgstr "%s: non è possibile aprire %s: %s"
+
+#, c-format
+msgid "%s: Unable to open PPD file: %s on line %d."
+msgstr "%s: non è possibile aprire il file PPD: %s alla riga %d."
+
+#, c-format
+msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
+msgstr ""
+"%s: non è possibile leggere il database del MIME da \"%s\" oppure da \"%s\"."
+
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown destination \"%s\"."
+msgstr "%s: destinazione sconosciuta \"%s\"."
+
+#, c-format
+msgid "%s: Unknown destination MIME type %s/%s."
+msgstr "%s: destinazione sconosciuta del tipo di MIME %s/%s."
+
+#, c-format
+msgid "%s: Unknown option \"%c\"."
+msgstr "%s: opzione sconosciuta \"%c\"."
+
+#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr "%s: opzione sconosciuta \"%s\"."
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr "%s: opzione sconosciuta \"-%c\"."
+
+#, c-format
+msgid "%s: Unknown source MIME type %s/%s."
+msgstr "%s: sorgente sconosciuto del tipo di MIME %s/%s."
+
+#, c-format
+msgid ""
+"%s: Warning - \"%c\" format modifier not supported - output may not be "
+"correct."
+msgstr ""
+"%s: attenzione - \"%c\" il formato del modificatore non è supportato - "
+"l'output potrebbe non essere corretto."
+
+#, c-format
+msgid "%s: Warning - character set option ignored."
+msgstr "%s: attenzione - l'opzione del set dei caratteri è stata ignorata."
+
+#, c-format
+msgid "%s: Warning - content type option ignored."
+msgstr "%s: attenzione - l'opzione del tipo di contenuto è stata ignorata."
+
+#, c-format
+msgid "%s: Warning - form option ignored."
+msgstr "%s: attenzione - l'opzione del modulo è stata ignorata."
+
+#, c-format
+msgid "%s: Warning - mode option ignored."
+msgstr "%s: attenzione - l'opzione modalità è stata ignorata."
+
+msgid "-1"
+msgstr "-1"
+
+msgid "-10"
+msgstr "-10"
+
+msgid "-100"
+msgstr "-100"
+
+msgid "-105"
+msgstr "-105"
+
+msgid "-11"
+msgstr "-11"
+
+msgid "-110"
+msgstr "-110"
+
+msgid "-115"
+msgstr "-115"
+
+msgid "-12"
+msgstr "-12"
+
+msgid "-120"
+msgstr "-120"
+
+msgid "-13"
+msgstr "-13"
+
+msgid "-14"
+msgstr "-14"
+
+msgid "-15"
+msgstr "-15"
+
+msgid "-2"
+msgstr "-2"
+
+msgid "-20"
+msgstr "-20"
+
+msgid "-25"
+msgstr "-25"
+
+msgid "-3"
+msgstr "-3"
+
+msgid "-30"
+msgstr "-30"
+
+msgid "-35"
+msgstr "-35"
+
+msgid "-4"
+msgstr "-4"
+
+msgid "-40"
+msgstr "-40"
+
+msgid "-45"
+msgstr "-45"
+
+msgid "-5"
+msgstr "-5"
+
+msgid "-50"
+msgstr "-50"
+
+msgid "-55"
+msgstr "-55"
+
+msgid "-6"
+msgstr "-6"
+
+msgid "-60"
+msgstr "-60"
+
+msgid "-65"
+msgstr "-65"
+
+msgid "-7"
+msgstr "-7"
+
+msgid "-70"
+msgstr "-70"
+
+msgid "-75"
+msgstr "-75"
+
+msgid "-8"
+msgstr "-8"
+
+msgid "-80"
+msgstr "-80"
+
+msgid "-85"
+msgstr "-85"
+
+msgid "-9"
+msgstr "-9"
+
+msgid "-90"
+msgstr "-90"
+
+msgid "-95"
+msgstr "-95"
+
+msgid "0"
+msgstr "0"
+
+msgid "1"
+msgstr "1"
+
+msgid "1 inch/sec."
+msgstr "1 inch/sec."
+
+msgid "1.25x0.25\""
+msgstr "1.25x0.25\""
+
+msgid "1.25x2.25\""
+msgstr "1.25x2.25\""
+
+msgid "1.5 inch/sec."
+msgstr "1.5 inch/sec."
+
+msgid "1.50x0.25\""
+msgstr "1.50x0.25\""
+
+msgid "1.50x0.50\""
+msgstr "1.50x0.50\""
+
+msgid "1.50x1.00\""
+msgstr "1.50x1.00\""
+
+msgid "1.50x2.00\""
+msgstr "1.50x2.00\""
+
+msgid "10"
+msgstr "10"
+
+msgid "10 inches/sec."
+msgstr "10 inches/sec."
+
+msgid "10 x 11"
+msgstr "10 x 11"
+
+msgid "10 x 13"
+msgstr "10 x 13"
+
+msgid "10 x 14"
+msgstr "10 x 14"
+
+msgid "100"
+msgstr "100"
+
+msgid "100 mm/sec."
+msgstr "100 mm/sec."
+
+msgid "105"
+msgstr "105"
+
+msgid "11"
+msgstr "11"
+
+msgid "11 inches/sec."
+msgstr "11 inches/sec."
+
+msgid "110"
+msgstr "110"
+
+msgid "115"
+msgstr "115"
+
+msgid "12"
+msgstr "12"
+
+msgid "12 inches/sec."
+msgstr "12 inches/sec."
+
+msgid "12 x 11"
+msgstr "12 x 11"
+
+msgid "120"
+msgstr "120"
+
+msgid "120 mm/sec."
+msgstr "120 mm/sec."
+
+msgid "120x60dpi"
+msgstr "120x60dpi"
+
+msgid "120x72dpi"
+msgstr "120x72dpi"
+
+msgid "13"
+msgstr "13"
+
+msgid "136dpi"
+msgstr "136dpi"
+
+msgid "14"
+msgstr "14"
+
+msgid "15"
+msgstr "15"
+
+msgid "15 mm/sec."
+msgstr "15 mm/sec."
+
+msgid "15 x 11"
+msgstr "15 x 11"
+
+msgid "150 mm/sec."
+msgstr "150 mm/sec."
+
+msgid "150dpi"
+msgstr "150dpi"
+
+msgid "16"
+msgstr "16"
+
+msgid "17"
+msgstr "17"
+
+msgid "18"
+msgstr "18"
+
+msgid "180dpi"
+msgstr "180dpi"
+
+msgid "19"
+msgstr "19"
+
+msgid "2"
+msgstr "2"
+
+msgid "2 inches/sec."
+msgstr "2 inches/sec."
+
+msgid "2-Sided Printing"
+msgstr "2-Sided Printing"
+
+msgid "2.00x0.37\""
+msgstr "2.00x0.37\""
+
+msgid "2.00x0.50\""
+msgstr "2.00x0.50\""
+
+msgid "2.00x1.00\""
+msgstr "2.00x1.00\""
+
+msgid "2.00x1.25\""
+msgstr "2.00x1.25\""
+
+msgid "2.00x2.00\""
+msgstr "2.00x2.00\""
+
+msgid "2.00x3.00\""
+msgstr "2.00x3.00\""
+
+msgid "2.00x4.00\""
+msgstr "2.00x4.00\""
+
+msgid "2.00x5.50\""
+msgstr "2.00x5.50\""
+
+msgid "2.25x0.50\""
+msgstr "2.25x0.50\""
+
+msgid "2.25x1.25\""
+msgstr "2.25x1.25\""
+
+msgid "2.25x4.00\""
+msgstr "2.25x4.00\""
+
+msgid "2.25x5.50\""
+msgstr "2.25x5.50\""
+
+msgid "2.38x5.50\""
+msgstr "2.38x5.50\""
+
+msgid "2.5 inches/sec."
+msgstr "2.5 inches/sec."
+
+msgid "2.50x1.00\""
+msgstr "2.50x1.00\""
+
+msgid "2.50x2.00\""
+msgstr "2.50x2.00\""
+
+msgid "2.75x1.25\""
+msgstr "2.75x1.25\""
+
+msgid "2.9 x 1\""
+msgstr "2.9 x 1\""
+
+msgid "20"
+msgstr "20"
+
+msgid "20 mm/sec."
+msgstr "20 mm/sec."
+
+msgid "200 mm/sec."
+msgstr "200 mm/sec."
+
+msgid "203dpi"
+msgstr "203dpi"
+
+msgid "21"
+msgstr "21"
+
+msgid "22"
+msgstr "22"
+
+msgid "23"
+msgstr "23"
+
+msgid "24"
+msgstr "24"
+
+msgid "24-Pin Series"
+msgstr "24-Pin Series"
+
+msgid "240x72dpi"
+msgstr "240x72dpi"
+
+msgid "25"
+msgstr "25"
+
+msgid "250 mm/sec."
+msgstr "250 mm/sec."
+
+msgid "26"
+msgstr "26"
+
+msgid "27"
+msgstr "27"
+
+msgid "28"
+msgstr "28"
+
+msgid "29"
+msgstr "29"
+
+msgid "3"
+msgstr "3"
+
+msgid "3 inches/sec."
+msgstr "3 inches/sec."
+
+msgid "3 x 5"
+msgstr "3 x 5"
+
+msgid "3.00x1.00\""
+msgstr "3.00x1.00\""
+
+msgid "3.00x1.25\""
+msgstr "3.00x1.25\""
+
+msgid "3.00x2.00\""
+msgstr "3.00x2.00\""
+
+msgid "3.00x3.00\""
+msgstr "3.00x3.00\""
+
+msgid "3.00x5.00\""
+msgstr "3.00x5.00\""
+
+msgid "3.25x2.00\""
+msgstr "3.25x2.00\""
+
+msgid "3.25x5.00\""
+msgstr "3.25x5.00\""
+
+msgid "3.25x5.50\""
+msgstr "3.25x5.50\""
+
+msgid "3.25x5.83\""
+msgstr "3.25x5.83\""
+
+msgid "3.25x7.83\""
+msgstr "3.25x7.83\""
+
+msgid "3.5 x 5"
+msgstr "3.5 x 5"
+
+msgid "3.5\" Disk"
+msgstr "3.5\" Disk"
+
+msgid "3.50x1.00\""
+msgstr "3.50x1.00\""
+
+msgid "30"
+msgstr "30"
+
+msgid "30 mm/sec."
+msgstr "30 mm/sec."
+
+msgid "300 mm/sec."
+msgstr "300 mm/sec."
+
+msgid "300dpi"
+msgstr "300dpi"
+
+msgid "35"
+msgstr "35"
+
+msgid "360dpi"
+msgstr "360dpi"
+
+msgid "360x180dpi"
+msgstr "360x180dpi"
+
+msgid "4"
+msgstr "4"
+
+msgid "4 inches/sec."
+msgstr "4 inches/sec."
+
+msgid "4.00x1.00\""
+msgstr "4.00x1.00\""
+
+msgid "4.00x13.00\""
+msgstr "4.00x13.00\""
+
+msgid "4.00x2.00\""
+msgstr "4.00x2.00\""
+
+msgid "4.00x2.50\""
+msgstr "4.00x2.50\""
+
+msgid "4.00x3.00\""
+msgstr "4.00x3.00\""
+
+msgid "4.00x4.00\""
+msgstr "4.00x4.00\""
+
+msgid "4.00x5.00\""
+msgstr "4.00x5.00\""
+
+msgid "4.00x6.00\""
+msgstr "4.00x6.00\""
+
+msgid "4.00x6.50\""
+msgstr "4.00x6.50\""
+
+msgid "40"
+msgstr "40"
+
+msgid "40 mm/sec."
+msgstr "40 mm/sec."
+
+msgid "45"
+msgstr "45"
+
+msgid "5"
+msgstr "5"
+
+msgid "5 inches/sec."
+msgstr "5 inches/sec."
+
+msgid "5 x 7"
+msgstr "5 x 7"
+
+msgid "50"
+msgstr "50"
+
+msgid "55"
+msgstr "55"
+
+msgid "6"
+msgstr "6"
+
+msgid "6 inches/sec."
+msgstr "6 inches/sec."
+
+msgid "6.00x1.00\""
+msgstr "6.00x1.00\""
+
+msgid "6.00x2.00\""
+msgstr "6.00x2.00\""
+
+msgid "6.00x3.00\""
+msgstr "6.00x3.00\""
+
+msgid "6.00x4.00\""
+msgstr "6.00x4.00\""
+
+msgid "6.00x5.00\""
+msgstr "6.00x5.00\""
+
+msgid "6.00x6.00\""
+msgstr "6.00x6.00\""
+
+msgid "6.00x6.50\""
+msgstr "6.00x6.50\""
+
+msgid "60"
+msgstr "60"
+
+msgid "60 mm/sec."
+msgstr "60 mm/sec."
+
+msgid "600dpi"
+msgstr "600dpi"
+
+msgid "60dpi"
+msgstr "60dpi"
+
+msgid "60x72dpi"
+msgstr "60x72dpi"
+
+msgid "65"
+msgstr "65"
+
+msgid "7"
+msgstr "7"
+
+msgid "7 inches/sec."
+msgstr "7 inches/sec."
+
+msgid "7 x 9"
+msgstr "7 x 9"
+
+msgid "70"
+msgstr "70"
+
+msgid "75"
+msgstr "75"
+
+msgid "8"
+msgstr "8"
+
+msgid "8 inches/sec."
+msgstr "8 inches/sec."
+
+msgid "8 x 10"
+msgstr "8 x 10"
+
+msgid "8.00x1.00\""
+msgstr "8.00x1.00\""
+
+msgid "8.00x2.00\""
+msgstr "8.00x2.00\""
+
+msgid "8.00x3.00\""
+msgstr "8.00x3.00\""
+
+msgid "8.00x4.00\""
+msgstr "8.00x4.00\""
+
+msgid "8.00x5.00\""
+msgstr "8.00x5.00\""
+
+msgid "8.00x6.00\""
+msgstr "8.00x6.00\""
+
+msgid "8.00x6.50\""
+msgstr "8.00x6.50\""
+
+msgid "80"
+msgstr "80"
+
+msgid "80 mm/sec."
+msgstr "80 mm/sec."
+
+msgid "85"
+msgstr "85"
+
+msgid "9"
+msgstr "9"
+
+msgid "9 inches/sec."
+msgstr "9 inches/sec."
+
+msgid "9 x 11"
+msgstr "9 x 11"
+
+msgid "9 x 12"
+msgstr "9 x 12"
+
+msgid "9-Pin Series"
+msgstr "9-Pin Series"
+
+msgid "90"
+msgstr "90"
+
+msgid "95"
+msgstr "95"
+
+msgid "?Invalid help command unknown."
+msgstr "?Aiuto non valido comando sconosciuto."
+
+msgid "A Samba password is required to export printer drivers"
+msgstr ""
+"Per esportare i driver della stampante è richiesta una password di Samba."
+
+msgid "A Samba username is required to export printer drivers"
+msgstr ""
+"Per esportare i driver della stampante è richiesto un username di Samba"
+
+#, c-format
+msgid "A class named \"%s\" already exists."
+msgstr "Una classe denominata \"%s\" già esiste."
+
+#, c-format
+msgid "A printer named \"%s\" already exists."
+msgstr "Una stampante denominata \"%s\" già esiste."
+
+msgid "A0"
+msgstr "A0"
+
+msgid "A0 Long Edge"
+msgstr "A0 Long Edge"
+
+msgid "A1"
+msgstr "A1"
+
+msgid "A1 Long Edge"
+msgstr "A1 Long Edge"
+
+msgid "A10"
+msgstr "A10"
+
+msgid "A2"
+msgstr "A2"
+
+msgid "A2 Long Edge"
+msgstr "A2 Long Edge"
+
+msgid "A3"
+msgstr "A3"
+
+msgid "A3 Long Edge"
+msgstr "A3 Long Edge"
+
+msgid "A3 Oversize"
+msgstr "A3 Oversize"
+
+msgid "A3 Oversize Long Edge"
+msgstr "A3 Oversize Long Edge"
+
+msgid "A4"
+msgstr "A4"
+
+msgid "A4 Long Edge"
+msgstr "A4 Long Edge"
+
+msgid "A4 Oversize"
+msgstr "A4 Oversize"
+
+msgid "A4 Small"
+msgstr "A4 Small"
+
+msgid "A5"
+msgstr "A5"
+
+msgid "A5 Long Edge"
+msgstr "A5 Long Edge"
+
+msgid "A5 Oversize"
+msgstr "A5 Oversize"
+
+msgid "A6"
+msgstr "A6"
+
+msgid "A6 Long Edge"
+msgstr "A6 Long Edge"
+
+msgid "A7"
+msgstr "A7"
+
+msgid "A8"
+msgstr "A8"
+
+msgid "A9"
+msgstr "A9"
+
+msgid "ANSI A"
+msgstr "ANSI A"
+
+msgid "ANSI B"
+msgstr "ANSI B"
+
+msgid "ANSI C"
+msgstr "ANSI C"
+
+msgid "ANSI D"
+msgstr "ANSI D"
+
+msgid "ANSI E"
+msgstr "ANSI E"
+
+msgid "ARCH C"
+msgstr "ARCH C"
+
+msgid "ARCH C Long Edge"
+msgstr "ARCH C Long Edge"
+
+msgid "ARCH D"
+msgstr "ARCH D"
+
+msgid "ARCH D Long Edge"
+msgstr "ARCH D Long Edge"
+
+msgid "ARCH E"
+msgstr "ARCH E"
+
+msgid "ARCH E Long Edge"
+msgstr "ARCH E Long Edge"
+
+msgid "Accept Jobs"
+msgstr "Accetta le stampe"
+
+msgid "Accepted"
+msgstr "Accettato"
+
+msgid "Add Class"
+msgstr "Aggiungi una classe"
+
+msgid "Add Printer"
+msgstr "Aggiungi una stampante"
+
+msgid "Add RSS Subscription"
+msgstr "Aggiungere l'abbonamento RSS"
+
+msgid "Address"
+msgstr "Indirizzo"
+
+msgid "Administration"
+msgstr "Amministrazione"
+
+msgid "Always"
+msgstr "Sempre"
+
+msgid "AppSocket/HP JetDirect"
+msgstr "AppSocket/HP JetDirect"
+
+msgid "Applicator"
+msgstr "Applicatore"
+
+#, c-format
+msgid "Attempt to set %s printer-state to bad value %d."
+msgstr "Tentativo di impostare %s printer-state al valore non valido %d."
+
+#, c-format
+msgid "Attribute groups are out of order (%x < %x)."
+msgstr "I gruppi degli attributi sono fuori uso (%x < %x)."
+
+msgid "B0"
+msgstr "B0"
+
+msgid "B1"
+msgstr "B1"
+
+msgid "B10"
+msgstr "B10"
+
+msgid "B2"
+msgstr "B2"
+
+msgid "B3"
+msgstr "B3"
+
+msgid "B4"
+msgstr "B4"
+
+msgid "B5"
+msgstr "B5"
+
+msgid "B5 Oversize"
+msgstr "B5 Oversize"
+
+msgid "B6"
+msgstr "B6"
+
+msgid "B7"
+msgstr "B7"
+
+msgid "B8"
+msgstr "B8"
+
+msgid "B9"
+msgstr "B9"
+
+#, c-format
+msgid "Bad 'document-format' value \"%s\"."
+msgstr "Il valore di 'document-format' non è valido \"%s\"."
+
+msgid "Bad NULL dests pointer"
+msgstr "Le destinazioni del puntatore NULL non sono valide"
+
+msgid "Bad OpenGroup"
+msgstr "OpenGroup non è valido"
+
+msgid "Bad OpenUI/JCLOpenUI"
+msgstr "OpenUI/JCLOpenUI non è valido"
+
+msgid "Bad OrderDependency"
+msgstr "OrderDependency non è valido"
+
+msgid "Bad PPD cache file."
+msgstr "Il file della cache del PPD non è valido."
+
+msgid "Bad Request"
+msgstr "La richiesta non è valida"
+
+msgid "Bad SNMP version number"
+msgstr "Il numero di versione di SNMP non è valido"
+
+msgid "Bad UIConstraints"
+msgstr "UIConstraints non è valido"
+
+msgid "Bad arguments to function"
+msgstr ""
+
+#, c-format
+msgid "Bad copies value %d."
+msgstr "Il valore %d delle copie non è valido."
+
+msgid "Bad custom parameter"
+msgstr "Il parametro personalizzato non è valido"
+
+#, c-format
+msgid "Bad device-uri \"%s\"."
+msgstr "Il device-uri \"%s\" non è valido."
+
+#, c-format
+msgid "Bad device-uri scheme \"%s\"."
+msgstr "Lo schema del device-uri \"%s\" non è valido."
+
+#, c-format
+msgid "Bad document-format \"%s\"."
+msgstr "Il document-format \"%s\" non è valido."
+
+#, c-format
+msgid "Bad document-format-default \"%s\"."
+msgstr "Il document-format-default \"%s\" non è valido."
+
+msgid "Bad filename buffer"
+msgstr "Il buffer del file non è valido"
+
+msgid "Bad hostname/address in URI"
+msgstr ""
+
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Il valore di job-name non è valido: %s"
+
+msgid "Bad job-name value: Wrong type or count."
+msgstr "Il valore di job-name non è valido: tipo o conteggio errato."
+
+msgid "Bad job-priority value."
+msgstr "Il valore di job-priority non è valido."
+
+#, c-format
+msgid "Bad job-sheets value \"%s\"."
+msgstr "Il valore di job-sheets \"%s\" non è valido."
+
+msgid "Bad job-sheets value type."
+msgstr "Il tipo di valore di job-sheets non è valido."
+
+msgid "Bad job-state value."
+msgstr "Il valore di job-state non è valido."
+
+#, c-format
+msgid "Bad job-uri \"%s\"."
+msgstr "Il valore di job-uri \"%s\" non è valido."
+
+#, c-format
+msgid "Bad notify-pull-method \"%s\"."
+msgstr "Il valore di notify-pull-method \"%s\" non è valido."
+
+#, c-format
+msgid "Bad notify-recipient-uri \"%s\"."
+msgstr "Il valore di notify-recipient-uri \"%s\" non è valido."
+
+#, c-format
+msgid "Bad number-up value %d."
+msgstr "Il valore di number-up %d non è valido."
+
+#, c-format
+msgid "Bad option + choice on line %d."
+msgstr "L'opzione + scelta alla riga %d non è valida."
+
+#, c-format
+msgid "Bad page-ranges values %d-%d."
+msgstr "Il valore di page-ranges %d-%d non è valido."
+
+msgid "Bad port number in URI"
+msgstr ""
+
+#, c-format
+msgid "Bad port-monitor \"%s\"."
+msgstr "Il valore di port-monitor \"%s\" non è valido."
+
+#, c-format
+msgid "Bad printer-state value %d."
+msgstr "Il valore di printer-state %d non è valido."
+
+msgid "Bad printer-uri."
+msgstr ""
+
+#, c-format
+msgid "Bad request ID %d."
+msgstr "L'ID della richiesta %d non è valido."
+
+#, c-format
+msgid "Bad request version number %d.%d."
+msgstr "Il numero della versione richiesta %d.%d non è valido."
+
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
+msgstr ""
+
+msgid "Bad subscription ID"
+msgstr "L'ID della sottoscrizione non è valido"
+
+msgid "Bad username in URI"
+msgstr ""
+
+msgid "Bad value string"
+msgstr "La stringa ha un valore che non è valido"
+
+msgid "Bad/empty URI"
+msgstr ""
+
+msgid "Banners"
+msgstr "Banner"
+
+msgid "Bond Paper"
+msgstr "Carta per scrivere"
+
+#, c-format
+msgid "Boolean expected for waiteof option \"%s\"."
+msgstr "È previsto un valore booleano per l'opzione waiteof \"%s\"."
+
+msgid "Buffer overflow detected, aborting."
+msgstr "È stato individuato un buffer overflow, operazione annullata."
+
+msgid "CMYK"
+msgstr "CMYK"
+
+msgid "CPCL Label Printer"
+msgstr "CPCL Label Printer"
+
+msgid "Cancel Jobs"
+msgstr ""
+
+msgid "Cancel RSS Subscription"
+msgstr "Eliminare l'abbonamento RSS"
+
+msgid "Canceling print job."
+msgstr "Eliminazione del processo di stampa in corso."
+
+msgid "Cannot share a remote Kerberized printer."
+msgstr "Non è possibile condividere una stampante remota kerberizzata."
+
+msgid "Cassette"
+msgstr "Caricatore"
+
+msgid "Change Settings"
+msgstr "Modifica le impostazioni"
+
+#, c-format
+msgid "Character set \"%s\" not supported."
+msgstr "Il set di caratteri \"%s\" non è supportato."
+
+msgid "Classes"
+msgstr "Classi"
+
+msgid "Clean Print Heads"
+msgstr "Pulisci le testine della stampante"
+
+msgid "Close-Job doesn't support the job-uri attribute."
+msgstr "Close-Job non supporta l'attributo job-uri."
+
+msgid "Color"
+msgstr "Colore"
+
+msgid "Color Mode"
+msgstr "Modalità colore"
+
+msgid ""
+"Commands may be abbreviated. Commands are:\n"
+"\n"
+"exit help quit status ?"
+msgstr ""
+"I comandi possono essere abbreviati. I comandi sono:\n"
+"\n"
+"exit help quit status ?"
+
+msgid "Community name uses indefinite length"
+msgstr "Il nome della comunità utilizza una lunghezza indefinita"
+
+msgid "Connected to printer."
+msgstr "Connesso alla stampante."
+
+msgid "Connecting to printer."
+msgstr "Connessione alla stampante in corso."
+
+msgid "Continue"
+msgstr "Continua"
+
+msgid "Continuous"
+msgstr "Continuo"
+
+msgid "Control file sent successfully."
+msgstr "Il file del controllo è stato inviato con successo."
+
+msgid "Copying print data."
+msgstr "Copia dei dati di stampa in corso."
+
+msgid "Created"
+msgstr "Creato"
+
+msgid "Custom"
+msgstr "Personalizzato"
+
+msgid "CustominCutInterval"
+msgstr "CustominCutInterval"
+
+msgid "CustominTearInterval"
+msgstr "CustominTearInterval"
+
+msgid "Cut"
+msgstr "Taglia"
+
+msgid "Cutter"
+msgstr "Taglierino"
+
+msgid "Dark"
+msgstr "Scuro"
+
+msgid "Darkness"
+msgstr "Oscurità"
+
+msgid "Data file sent successfully."
+msgstr "I dati sono stati inviati con successo."
+
+msgid "Delete Class"
+msgstr "Elimina la classe"
+
+msgid "Delete Printer"
+msgstr "Elimina la stampante"
+
+msgid "DeskJet Series"
+msgstr "DeskJet Series"
+
+#, c-format
+msgid "Destination \"%s\" is not accepting jobs."
+msgstr "La destinazione \"%s\" non sta accettando le stampe."
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+" location = %s"
+msgstr ""
+"Dispositivo: uri = %s\n"
+" classe = %s\n"
+" info = %s\n"
+" marca-e-modello = %s\n"
+" device-id = %s\n"
+" posizione = %s"
+
+msgid "Direct Thermal Media"
+msgstr "Direct Thermal Media"
+
+#, c-format
+msgid "Directory \"%s\" contains a relative path."
+msgstr "La directory \"%s\" contiene un path relativo."
+
+#, c-format
+msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
+msgstr ""
+"La directory \"%s\" presenta dei permessi non sicuri (0%o/uid=%d/gid=%d)."
+
+#, c-format
+msgid "Directory \"%s\" is a file."
+msgstr "La directory \"%s\" è un file."
+
+#, c-format
+msgid "Directory \"%s\" not available: %s"
+msgstr "La directory \"%s\" non è disponibile: %s"
+
+#, c-format
+msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
+msgstr "Directory \"%s\" permessi OK (0%o/uid=%d/gid=%d)."
+
+msgid "Disabled"
+msgstr "Disabilitato"
+
+#, c-format
+msgid "Document #%d does not exist in job #%d."
+msgstr "Il documento #%d non esiste nel processo #%d."
+
+msgid "Duplexer"
+msgstr "Duplexer"
+
+msgid "Dymo"
+msgstr "Dymo"
+
+msgid "EPL1 Label Printer"
+msgstr "EPL1 Label Printer"
+
+msgid "EPL2 Label Printer"
+msgstr "EPL2 Label Printer"
+
+msgid "Edit Configuration File"
+msgstr "Edita il file di configurazione"
+
+msgid "Empty PPD file."
+msgstr "Il file PPD è vuoto."
+
+msgid "Encryption is not supported."
+msgstr ""
+
+#. TRANSLATORS: Banner/cover sheet after the print job.
+msgid "Ending Banner"
+msgstr "Termine del banner"
+
+msgid "English"
+msgstr "Inglese"
+
+msgid ""
+"Enter your username and password or the root username and password to access "
+"this page. If you are using Kerberos authentication, make sure you have a "
+"valid Kerberos ticket."
+msgstr ""
+"Digitare la username e la password oppure l'username di root e la password "
+"per accedere a questa pagina. Se si utilizza l'autenticazione Kerberos, "
+"assicurarsi di disporre di un ticket di Kerberos valido."
+
+msgid "Envelope #10 "
+msgstr "Envelope #10"
+
+msgid "Envelope #11"
+msgstr "Envelope #11"
+
+msgid "Envelope #12"
+msgstr "Envelope #12"
+
+msgid "Envelope #14"
+msgstr "Envelope #14"
+
+msgid "Envelope #9"
+msgstr "Envelope #9"
+
+msgid "Envelope B4"
+msgstr "Envelope B4"
+
+msgid "Envelope B5"
+msgstr "Envelope B5"
+
+msgid "Envelope B6"
+msgstr "Envelope B6"
+
+msgid "Envelope C0"
+msgstr "Envelope C0"
+
+msgid "Envelope C1"
+msgstr "Envelope C1"
+
+msgid "Envelope C2"
+msgstr "Envelope C2"
+
+msgid "Envelope C3"
+msgstr "Envelope C3"
+
+msgid "Envelope C4"
+msgstr "Envelope C4"
+
+msgid "Envelope C5"
+msgstr "Envelope C5"
+
+msgid "Envelope C6"
+msgstr "Envelope C6"
+
+msgid "Envelope C65"
+msgstr "Envelope C65"
+
+msgid "Envelope C7"
+msgstr "Envelope C7"
+
+msgid "Envelope Choukei 3"
+msgstr "Envelope Choukei 3"
+
+msgid "Envelope Choukei 3 Long Edge"
+msgstr "Envelope Choukei 3 Long Edge"
+
+msgid "Envelope Choukei 4"
+msgstr "Envelope Choukei 4"
+
+msgid "Envelope Choukei 4 Long Edge"
+msgstr "Envelope Choukei 4 Long Edge"
+
+msgid "Envelope DL"
+msgstr "Envelope DL"
+
+msgid "Envelope Feed"
+msgstr "Envelope Feed"
+
+msgid "Envelope Invite"
+msgstr "Envelope Invite"
+
+msgid "Envelope Italian"
+msgstr "Envelope Italian"
+
+msgid "Envelope Kaku2"
+msgstr "Envelope Kaku2"
+
+msgid "Envelope Kaku2 Long Edge"
+msgstr "Envelope Kaku2 Long Edge"
+
+msgid "Envelope Kaku3"
+msgstr "Envelope Kaku3"
+
+msgid "Envelope Kaku3 Long Edge"
+msgstr "Envelope Kaku3 Long Edge"
+
+msgid "Envelope Monarch"
+msgstr "Envelope Monarch"
+
+msgid "Envelope PRC1 "
+msgstr "Envelope PRC1 "
+
+msgid "Envelope PRC1 Long Edge"
+msgstr "Envelope PRC1 Long Edge"
+
+msgid "Envelope PRC10"
+msgstr "Envelope PRC10"
+
+msgid "Envelope PRC10 Long Edge"
+msgstr "Envelope PRC10 Long Edge"
+
+msgid "Envelope PRC2"
+msgstr "Envelope PRC2"
+
+msgid "Envelope PRC2 Long Edge"
+msgstr "Envelope PRC2 Long Edge"
+
+msgid "Envelope PRC3"
+msgstr "Envelope PRC3"
+
+msgid "Envelope PRC3 Long Edge"
+msgstr "Envelope PRC3 Long Edge"
+
+msgid "Envelope PRC4"
+msgstr "Envelope PRC4"
+
+msgid "Envelope PRC4 Long Edge"
+msgstr "Envelope PRC4 Long Edge"
+
+msgid "Envelope PRC5 Long Edge"
+msgstr "Envelope PRC5 Long Edge"
+
+msgid "Envelope PRC5PRC5"
+msgstr "Envelope PRC5PRC5"
+
+msgid "Envelope PRC6"
+msgstr "Envelope PRC6"
+
+msgid "Envelope PRC6 Long Edge"
+msgstr "Envelope PRC6 Long Edge"
+
+msgid "Envelope PRC7"
+msgstr "Envelope PRC7"
+
+msgid "Envelope PRC7 Long Edge"
+msgstr "Envelope PRC7 Long Edge"
+
+msgid "Envelope PRC8"
+msgstr "Envelope PRC8"
+
+msgid "Envelope PRC8 Long Edge"
+msgstr "Envelope PRC8 Long Edge"
+
+msgid "Envelope PRC9"
+msgstr "Envelope PRC9"
+
+msgid "Envelope PRC9 Long Edge"
+msgstr "Envelope PRC9 Long Edge"
+
+msgid "Envelope Personal"
+msgstr "Envelope Personal"
+
+msgid "Envelope You4"
+msgstr "Envelope You4"
+
+msgid "Envelope You4 Long Edge"
+msgstr "Envelope You4 Long Edge"
+
+msgid "Environment Variables:"
+msgstr "Variabili d'ambiente:"
+
+msgid "Epson"
+msgstr "Epson"
+
+msgid "Error Policy"
+msgstr "Policy dell'errore"
+
+msgid "Error reading raster data."
+msgstr ""
+
+msgid "Error sending raster data."
+msgstr "Si è verificato un errore durante l'invio dei dati raster."
+
+msgid "Error: need hostname after \"-h\" option."
+msgstr "Errore: è necessario l'hostname dopo l'opzione \"-h\"."
+
+msgid "Every 10 Labels"
+msgstr "Ogni 10 etichette"
+
+msgid "Every 2 Labels"
+msgstr "Ogni 2 etichette"
+
+msgid "Every 3 Labels"
+msgstr "Ogni 3 etichette"
+
+msgid "Every 4 Labels"
+msgstr "Ogni 4 etichette"
+
+msgid "Every 5 Labels"
+msgstr "Ogni 5 etichette"
+
+msgid "Every 6 Labels"
+msgstr "Ogni 6 etichette"
+
+msgid "Every 7 Labels"
+msgstr "Ogni 7 etichette"
+
+msgid "Every 8 Labels"
+msgstr "Ogni 8 etichette"
+
+msgid "Every 9 Labels"
+msgstr "Ogni 9 etichette"
+
+msgid "Every Label"
+msgstr "Ogni etichetta"
+
+msgid "Executive"
+msgstr "Esecutivo"
+
+msgid "Expectation Failed"
+msgstr "Aspettativa non riuscita"
+
+msgid "Export Printers to Samba"
+msgstr "Esporta le stampanti per Samba"
+
+msgid "Expressions:"
+msgstr "Espressioni:"
+
+msgid "FAIL"
+msgstr "OPERAZIONE NON RIUSCITA CORRETTAMENTE"
+
+msgid "FanFold German"
+msgstr "FanFold German"
+
+msgid "FanFold Legal German"
+msgstr "FanFold Legal German"
+
+msgid "Fanfold US"
+msgstr "FanFold US"
+
+#, c-format
+msgid "File \"%s\" contains a relative path."
+msgstr "Il file \"%s\" contiene un path relativo."
+
+#, c-format
+msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
+msgstr "il file \"%s\" presenta dei permessi non sicuri (0%o/uid=%d/gid=%d)."
+
+#, c-format
+msgid "File \"%s\" is a directory."
+msgstr "Il file \"%s\" è una directory."
+
+#, c-format
+msgid "File \"%s\" not available: %s"
+msgstr "Il file \"%s\" non è disponibile: %s"
+
+#, c-format
+msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
+msgstr "File \"%s\" permessi OK (0%o/uid=%d/gid=%d)."
+
+msgid "File Folder "
+msgstr "Directory del file"
+
+#, c-format
+msgid ""
+"File device URIs have been disabled. To enable, see the FileDevice directive "
+"in \"%s/cups-files.conf\"."
+msgstr ""
+"I file del dispositivo URI sono stati disabilitati. Per abilitare, vedere la "
+"direttiva FileDevice in \"%s/cups-files.conf\"."
+
+#, c-format
+msgid "Finished page %d."
+msgstr "Finito pagina %d."
+
+msgid "Folio"
+msgstr "Foglio"
+
+msgid "Forbidden"
+msgstr "Vietato"
+
+msgid "General"
+msgstr "Generale"
+
+msgid "Generic"
+msgstr "Generico"
+
+msgid "Get-Response-PDU uses indefinite length"
+msgstr "Get-Response-PDU utilizza una lunghezza indefinita"
+
+msgid "Glossy Paper"
+msgstr "Carta lucida"
+
+msgid "Got a printer-uri attribute but no job-id."
+msgstr "Esiste un attributo printer-uri ma nessun job-id."
+
+msgid "Grayscale"
+msgstr "Scala di grigi"
+
+msgid "HP"
+msgstr "HP"
+
+msgid "Hanging Folder"
+msgstr "Directory appesa"
+
+msgid "Help file not in index."
+msgstr "Il file di aiuto non è nell'indice."
+
+msgid "IPP 1setOf attribute with incompatible value tags."
+msgstr "L'attributo IPP 1setOf con tag di valore incompatibile."
+
+msgid "IPP attribute has no name."
+msgstr "L'attributo dell'IPP non ha nessun nome."
+
+msgid "IPP attribute is not a member of the message."
+msgstr "L'attributo IPP non è un membro del messaggio."
+
+msgid "IPP begCollection value not 0 bytes."
+msgstr "Il valore di IPP begCollection non è di 0 byte."
+
+msgid "IPP boolean value not 1 byte."
+msgstr "Il valore booleano di IPP non è di 1 byte."
+
+msgid "IPP date value not 11 bytes."
+msgstr "Il valore IPP date non è di 11 byte."
+
+msgid "IPP endCollection value not 0 bytes."
+msgstr "Il valore di IPP endCollection non è di 0 byte."
+
+msgid "IPP enum value not 4 bytes."
+msgstr "Il valore di IPP enum non è di 4 byte."
+
+msgid "IPP extension tag larger than 0x7FFFFFFF."
+msgstr "Il tag dell'estensione di IPP è maggiore di 0x7FFFFFFF."
+
+msgid "IPP integer value not 4 bytes."
+msgstr "Il valore intero di IPP non è di 4 byte."
+
+msgid "IPP language length overflows value."
+msgstr "Valore di overflow della lunghezza della lingua di IPP."
+
+msgid "IPP language length too large."
+msgstr "La lunghezza della lingua di IPP è troppo grande."
+
+msgid "IPP member name is not empty."
+msgstr "Il nome del membro IPP non è vuoto."
+
+msgid "IPP memberName value is empty."
+msgstr "Il valore di IPP memberName è vuoto."
+
+msgid "IPP memberName with no attribute."
+msgstr "IPP memberName con nessun attributo."
+
+msgid "IPP name larger than 32767 bytes."
+msgstr "Il nome dell'IPP è più grande di 32767 byte."
+
+msgid "IPP nameWithLanguage value less than minimum 4 bytes."
+msgstr "Il valore di IPP nameWithLanguage è inferiore al minimo di 4 byte."
+
+msgid "IPP octetString length too large."
+msgstr "La lunghezza di IPP octetString è troppo grande."
+
+msgid "IPP rangeOfInteger value not 8 bytes."
+msgstr "Il valore di IPP rangeOfInteger non è di 8 byte."
+
+msgid "IPP resolution value not 9 bytes."
+msgstr "Il valore di IPP resolution non è di 9 byte."
+
+msgid "IPP string length overflows value."
+msgstr "Valore di overflow della lunghezza della stringa di IPP."
+
+msgid "IPP textWithLanguage value less than minimum 4 bytes."
+msgstr "Il valore di textWithLanguage dell'IPP è inferiore a 4 byte."
+
+msgid "IPP value larger than 32767 bytes."
+msgstr "Il valore di IPP è più grande di 32767 byte."
+
+msgid "ISOLatin1"
+msgstr "ISOLatin1"
+
+msgid "Illegal control character"
+msgstr "Il carattere di controllo è illegale"
+
+msgid "Illegal main keyword string"
+msgstr "La stringa della parola chiave principale è illegale"
+
+msgid "Illegal option keyword string"
+msgstr "La stringa della parola chiave dell'opzione è illegale"
+
+msgid "Illegal translation string"
+msgstr "La stringa della traduzione è illegale"
+
+msgid "Illegal whitespace character"
+msgstr "Il carattere spazio è illegale"
+
+msgid "Installable Options"
+msgstr "Opzioni installabili"
+
+msgid "Installed"
+msgstr "Installato"
+
+msgid "IntelliBar Label Printer"
+msgstr "IntelliBar Label Printer"
+
+msgid "Intellitech"
+msgstr "Intellitech"
+
+msgid "Internal Server Error"
+msgstr "Errore interno del server"
+
+msgid "Internal error"
+msgstr "Errore interno"
+
+msgid "Internet Postage 2-Part"
+msgstr "Internet Postage 2-Part"
+
+msgid "Internet Postage 3-Part"
+msgstr "Internet Postage 3-Part"
+
+msgid "Internet Printing Protocol"
+msgstr "Internet Printing Protocol"
+
+msgid "Invalid media name arguments."
+msgstr "Gli argomenti del nome del supporto non sono validi."
+
+msgid "Invalid media size."
+msgstr "La dimensione del supporto non è valida."
+
+#, c-format
+msgid "Invalid printer command \"%s\"."
+msgstr "Il comando della stampante non è valido \"%s\"."
+
+msgid "JCL"
+msgstr "JCL"
+
+msgid "JIS B0"
+msgstr "JIS B0"
+
+msgid "JIS B1"
+msgstr "JIS B1"
+
+msgid "JIS B10"
+msgstr "JIS B10"
+
+msgid "JIS B2"
+msgstr "JIS B2"
+
+msgid "JIS B3"
+msgstr "JIS B3"
+
+msgid "JIS B4"
+msgstr "JIS B4"
+
+msgid "JIS B4 Long Edge"
+msgstr "JIS B4 Long Edge"
+
+msgid "JIS B5"
+msgstr "JIS B5"
+
+msgid "JIS B5 Long Edge"
+msgstr "JIS B5 Long Edge"
+
+msgid "JIS B6"
+msgstr "JIS B6"
+
+msgid "JIS B6 Long Edge"
+msgstr "JIS B6 Long Edge"
+
+msgid "JIS B7"
+msgstr "JIS B7"
+
+msgid "JIS B8"
+msgstr "JIS B8"
+
+msgid "JIS B9"
+msgstr "JIS B9"
+
+#, c-format
+msgid "Job #%d cannot be restarted - no files."
+msgstr "Il processo #%d non può essere riavviato, nessun file."
+
+#, c-format
+msgid "Job #%d does not exist."
+msgstr "Il processo #%d non esiste."
+
+#, c-format
+msgid "Job #%d is already aborted - can't cancel."
+msgstr "Il processo #%d è già stato interrotto - non è possibile eliminarlo."
+
+#, c-format
+msgid "Job #%d is already canceled - can't cancel."
+msgstr "Il processo #%d è già stato eliminato, impossibile eliminarlo."
+
+#, c-format
+msgid "Job #%d is already completed - can't cancel."
+msgstr "Il processo #%d è già completato, non è possibile eliminarlo."
+
+#, c-format
+msgid "Job #%d is finished and cannot be altered."
+msgstr "Il processo #%d è terminato e non può essere alterato."
+
+#, c-format
+msgid "Job #%d is not complete."
+msgstr "Il processo #%d non è stato completato."
+
+#, c-format
+msgid "Job #%d is not held for authentication."
+msgstr "Il processo #%d non è stato eseguito per l'autenticazione."
+
+#, c-format
+msgid "Job #%d is not held."
+msgstr "Il processo #%d non è stato eseguito."
+
+msgid "Job Completed"
+msgstr "Il processo è stato completato"
+
+msgid "Job Created"
+msgstr "Il processo è stato creato"
+
+msgid "Job Options Changed"
+msgstr "Le opzioni del processo sono state modificate"
+
+msgid "Job Stopped"
+msgstr "Il processo è stato fermato"
+
+msgid "Job is completed and cannot be changed."
+msgstr "Il processo è stato completato e non può essere modificato."
+
+msgid "Job operation failed"
+msgstr "L'operazione del processo non è andata a buon fine"
+
+msgid "Job state cannot be changed."
+msgstr "Lo stato del processo non può essere modificato."
+
+msgid "Job subscriptions cannot be renewed."
+msgstr "Le sottoscrizioni del processo non possono essere rinnovate."
+
+msgid "Jobs"
+msgstr "Stampe"
+
+msgid "LPD/LPR Host or Printer"
+msgstr "LPD/LPR Host o stampante"
+
+msgid "Label Printer"
+msgstr "Label Printer"
+
+msgid "Label Top"
+msgstr "Label Top"
+
+#, c-format
+msgid "Language \"%s\" not supported."
+msgstr "La lingua \"%s\" non è supportata."
+
+msgid "Large Address"
+msgstr "Large Address"
+
+msgid "LaserJet Series PCL 4/5"
+msgstr "LaserJet Series PCL 4/5"
+
+msgid "Letter Oversize"
+msgstr "Letter Oversize"
+
+msgid "Letter Oversize Long Edge"
+msgstr "Letter Oversize Long Edge"
+
+msgid "Light"
+msgstr "Luce"
+
+msgid "Line longer than the maximum allowed (255 characters)"
+msgstr "Linea più lunga di quella massima consentita (255 caratteri)"
+
+msgid "List Available Printers"
+msgstr "Elenco delle stampanti disponibili"
+
+msgid "Load paper."
+msgstr ""
+
+msgid "Long-Edge (Portrait)"
+msgstr "Long-Edge (Portrait)"
+
+msgid "Looking for printer..."
+msgstr ""
+
+msgid "Manual Feed"
+msgstr "Alimentazione manuale"
+
+msgid "Media Size"
+msgstr "Dimensione del supporto"
+
+msgid "Media Source"
+msgstr "Sorgente multimediale"
+
+msgid "Media Tracking"
+msgstr "Monitoraggio del supporto"
+
+msgid "Media Type"
+msgstr "Tipo di supporto"
+
+msgid "Medium"
+msgstr "Supporto"
+
+msgid "Memory allocation error"
+msgstr "Errore di allocazione della memoria"
+
+msgid "Missing CloseGroup"
+msgstr "Manca CloseGroup"
+
+msgid "Missing PPD-Adobe-4.x header"
+msgstr "Manca la libreria di PPD-Adobe-4.x"
+
+msgid "Missing asterisk in column 1"
+msgstr "Manca l'asterisco nella colonna 1"
+
+msgid "Missing document-number attribute."
+msgstr "Manca l'attributo di document-number."
+
+#, c-format
+msgid "Missing double quote on line %d."
+msgstr "Mancano le virgolette alla riga %d."
+
+msgid "Missing form variable"
+msgstr "Manca la variabile del modulo"
+
+msgid "Missing last-document attribute in request."
+msgstr "Manca l'attributo last-document nella richiesta."
+
+msgid "Missing media or media-col."
+msgstr "Manca media o media-col."
+
+msgid "Missing media-size in media-col."
+msgstr "Manca media-size in media-col."
+
+msgid "Missing notify-subscription-ids attribute."
+msgstr "Manca l'attributo notify-subscription-ids."
+
+msgid "Missing option keyword"
+msgstr "Manca la parola chiave dell'opzione"
+
+msgid "Missing requesting-user-name attribute."
+msgstr "Manca l'attributo di requesting-user-name."
+
+msgid "Missing required attributes."
+msgstr "Mancano gli attributi richiesti."
+
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
+#, c-format
+msgid "Missing value on line %d."
+msgstr "Manca il valore alla riga %d."
+
+msgid "Missing value string"
+msgstr "Manca la stringa del valore"
+
+msgid "Missing x-dimension in media-size."
+msgstr "Manca x-dimension in media-size."
+
+msgid "Missing y-dimension in media-size."
+msgstr "Manca y-dimension in media-size."
+
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s"
+msgstr ""
+"Modello: nome = %s\n"
+" lingua_naturale = %s\n"
+" marca-e-modello = %s\n"
+" device-id = %s"
+
+msgid "Modifiers:"
+msgstr "Modificatori:"
+
+msgid "Modify Class"
+msgstr "Modifica la classe"
+
+msgid "Modify Printer"
+msgstr "Modifica la stampante"
+
+msgid "Move All Jobs"
+msgstr "Sposta tutti le stampe"
+
+msgid "Move Job"
+msgstr "Sposta il processo"
+
+msgid "Moved Permanently"
+msgstr "Spostato in modo permanente"
+
+msgid "NULL PPD file pointer"
+msgstr "Puntatore del file PPD NULL"
+
+msgid "Name OID uses indefinite length"
+msgstr "Il nome OID utilizza una lunghezza indefinita"
+
+msgid "Nested classes are not allowed."
+msgstr "Le classi nidificate non sono consentite."
+
+msgid "Never"
+msgstr "Mai"
+
+msgid "No"
+msgstr "No"
+
+msgid "No Content"
+msgstr "Nessun contenuto"
+
+msgid "No PPD name"
+msgstr "Nessun nome del PPD"
+
+msgid "No VarBind SEQUENCE"
+msgstr "Nessuna SEQUENZA di VarBind"
+
+msgid "No Windows printer drivers are installed."
+msgstr "Non è stato installato nessun driver della stampante di Windows."
+
+msgid "No active connection"
+msgstr "Nessuna connessione attiva"
+
+msgid "No active connection."
+msgstr ""
+
+#, c-format
+msgid "No active jobs on %s."
+msgstr "Nessun processo attivo su %s."
+
+msgid "No attributes in request."
+msgstr "Nessun attributo nella richiesta."
+
+msgid "No authentication information provided."
+msgstr "Nessuna informazione di autenticazione fornita."
+
+msgid "No community name"
+msgstr "Nessun nome della comunità"
+
+msgid "No default printer."
+msgstr "Nessuna stampante predefinita."
+
+msgid "No destinations added."
+msgstr "Nessuna destinazione aggiunta."
+
+msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
+msgstr ""
+"Non è stato trovato nessun dispositivo URI in argv[0] o nella variabile di "
+"ambiente DEVICE_URI."
+
+msgid "No error-index"
+msgstr "Nessin error-index"
+
+msgid "No error-status"
+msgstr "Nessun error-status"
+
+msgid "No file in print request."
+msgstr "Nessun file nella richiesta di stampa."
+
+msgid "No modification time"
+msgstr "Nessun orario di modifica"
+
+msgid "No name OID"
+msgstr "Nessun nome OID"
+
+msgid "No pages were found."
+msgstr "Nessuna pagina è stata trovata."
+
+msgid "No printer name"
+msgstr "Nessun nome della stampante"
+
+msgid "No printer-uri found"
+msgstr "Non è stato trovato printer-uri"
+
+msgid "No printer-uri found for class"
+msgstr "Non è stato trovato printer-uri per la classe"
+
+msgid "No printer-uri in request."
+msgstr "Nessun printer-uri nella richiesta."
+
+msgid "No request URI."
+msgstr ""
+
+msgid "No request protocol version."
+msgstr ""
+
+msgid "No request sent."
+msgstr ""
+
+msgid "No request-id"
+msgstr "Nessun request-id"
+
+msgid "No subscription attributes in request."
+msgstr "Nessun attributo della sottoscrizione nella richiesta."
+
+msgid "No subscriptions found."
+msgstr "Non è stata trovata nessuna sottoscrizione."
+
+msgid "No variable-bindings SEQUENCE"
+msgstr "Nessuna SEQUENZA di variable-bindings"
+
+msgid "No version number"
+msgstr "Nessun numero di versione"
+
+msgid "Non-continuous (Mark sensing)"
+msgstr "Non-continuous (Mark sensing)"
+
+msgid "Non-continuous (Web sensing)"
+msgstr "Non-continuous (Web sensing)"
+
+msgid "Normal"
+msgstr "Normale"
+
+msgid "Not Found"
+msgstr "Non trovato"
+
+msgid "Not Implemented"
+msgstr "Non implementato"
+
+msgid "Not Installed"
+msgstr "Non installato"
+
+msgid "Not Modified"
+msgstr "Non modificato"
+
+msgid "Not Supported"
+msgstr "Non supportato"
+
+msgid "Not allowed to print."
+msgstr "Non autorizzato a stampare."
+
+msgid "Note"
+msgstr "Nota"
+
+msgid ""
+"Note: this program only validates the DSC comments, not the PostScript "
+"itself."
+msgstr ""
+"Nota: questo programma convalida solo i commenti DSC, non il PostScript "
+"stesso."
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Off (1-Sided)"
+msgstr "Off (1-Sided)"
+
+msgid "Oki"
+msgstr "Oki"
+
+msgid "Online Help"
+msgstr "Guida in linea"
+
+#, c-format
+msgid "Open of %s failed: %s"
+msgstr "L'apertura di %s non è andata a buon fine: %s"
+
+msgid "OpenGroup without a CloseGroup first"
+msgstr "OpenGroup senza prima un CloseGroup"
+
+msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
+msgstr "OpenUI/JCLOpenUI senza prima un CloseUI/JCLCloseUI"
+
+msgid "Operation Policy"
+msgstr "Policy dell'operazione"
+
+#, c-format
+msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
+msgstr "L'opzione \"%s\" non può essere inclusa tramite %%%%IncludeFeature."
+
+msgid "Options Installed"
+msgstr "Opzioni installate"
+
+msgid "Options:"
+msgstr "Opzioni:"
+
+msgid "Out of date PPD cache file."
+msgstr "Il file della cache del PPD non è aggiornato."
+
+msgid "Out of memory."
+msgstr "Memoria insufficiente."
+
+msgid "Output Mode"
+msgstr "Modalità di output"
+
+msgid "Output bin is almost full."
+msgstr ""
+
+msgid "Output bin is full."
+msgstr ""
+
+msgid "Output bin is missing."
+msgstr ""
+
+msgid "PASS"
+msgstr "OPERAZIONE RIUSCITA CON SUCCESSO"
+
+msgid "PCL Laser Printer"
+msgstr "Stampante laser PCL"
+
+msgid "PRC16K"
+msgstr "PRC16K"
+
+msgid "PRC16K Long Edge"
+msgstr "PRC16K Long Edge"
+
+msgid "PRC32K"
+msgstr "PRC32K"
+
+msgid "PRC32K Long Edge"
+msgstr "PRC32K Long Edge"
+
+msgid "PRC32K Oversize"
+msgstr "PRC32K Oversize"
+
+msgid "PRC32K Oversize Long Edge"
+msgstr "PRC32K Oversize Long Edge"
+
+msgid "Packet does not contain a Get-Response-PDU"
+msgstr "Il pacchetto non contiene un Get-Response-PDU"
+
+msgid "Packet does not start with SEQUENCE"
+msgstr "Il pacchetto non inizia con SEQUENZA"
+
+msgid "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
+msgid "ParamCustominCutInterval"
+msgstr "ParamCustominCutInterval"
+
+msgid "ParamCustominTearInterval"
+msgstr "ParamCustominTearInterval"
+
+#, c-format
+msgid "Password for %s on %s? "
+msgstr "Password di %s su %s? "
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "La password di %s richiesta per accedere a %s tramite SAMBA:"
+
+msgid "Pause Class"
+msgstr "Metti in pausa la classe"
+
+msgid "Pause Printer"
+msgstr "Metti in pausa la stampante"
+
+msgid "Peel-Off"
+msgstr "Peel-Off"
+
+msgid "Photo"
+msgstr "Foto"
+
+msgid "Photo Labels"
+msgstr "Etichette delle foto"
+
+msgid "Plain Paper"
+msgstr "Carta comune"
+
+msgid "Policies"
+msgstr "Policy"
+
+msgid "Port Monitor"
+msgstr "Controllo della porta"
+
+msgid "PostScript Printer"
+msgstr "Stampante PostScript"
+
+msgid "Postcard"
+msgstr "Postcard"
+
+msgid "Postcard Double "
+msgstr "Cartolina doppia "
+
+msgid "Postcard Double Long Edge"
+msgstr "Postcard Double Long Edge"
+
+msgid "Postcard Long Edge"
+msgstr "Postcard Long Edge"
+
+msgid "Preparing to print."
+msgstr "Preparazione per la stampa."
+
+msgid "Print Density"
+msgstr "Densità di stampa"
+
+msgid "Print Job:"
+msgstr "Processo di stampa:"
+
+msgid "Print Mode"
+msgstr "Modalità di stampa"
+
+msgid "Print Rate"
+msgstr "Velocità di stampa"
+
+msgid "Print Self-Test Page"
+msgstr "Stampa la pagina Self-Test"
+
+msgid "Print Speed"
+msgstr "Velocità di stampa"
+
+msgid "Print Test Page"
+msgstr "Stampa pagina di prova"
+
+msgid "Print and Cut"
+msgstr "Stampa e taglia"
+
+msgid "Print and Tear"
+msgstr "Stampa e strappa"
+
+msgid "Print file sent."
+msgstr "Il file di stampa è stato inviato."
+
+msgid "Print job canceled at printer."
+msgstr "Il processo di stampa è stato annullato."
+
+msgid "Print job too large."
+msgstr "Il processo di stampa è troppo grande."
+
+msgid "Print job was not accepted."
+msgstr "Il processo di stampa non è stato accettato."
+
+msgid "Printer Added"
+msgstr "La stampante è stata aggiunta"
+
+msgid "Printer Default"
+msgstr "Stampante predefinita"
+
+msgid "Printer Deleted"
+msgstr "La stampante è stata eliminata"
+
+msgid "Printer Modified"
+msgstr "La stampante è stata modificata"
+
+msgid "Printer Paused"
+msgstr "La stampante è stata messa in pausa"
+
+msgid "Printer Settings"
+msgstr "Impostazioni della stampante"
+
+msgid "Printer cannot print supplied content."
+msgstr "La stampante non può stampare il contenuto fornito."
+
+msgid "Printer cannot print with supplied options."
+msgstr "La stampante non può stampare con le opzioni fornite."
+
+msgid "Printer:"
+msgstr "Stampante:"
+
+msgid "Printers"
+msgstr "Stampanti"
+
+#, c-format
+msgid "Printing page %d, %u%% complete."
+msgstr ""
+
+msgid "Quarto"
+msgstr "Quarto"
+
+msgid "Quota limit reached."
+msgstr "Il limite della quota è stato raggiunto."
+
+msgid "Rank Owner Job File(s) Total Size"
+msgstr "Rank Owner Job File(s) Total Size"
+
+msgid "Reject Jobs"
+msgstr "Stampe rifiutate"
+
+#, c-format
+msgid "Remote host did not accept control file (%d)."
+msgstr "L'host remosto non ha accettato il controllo (%d)."
+
+#, c-format
+msgid "Remote host did not accept data file (%d)."
+msgstr "L'host remoto non ha accettato i dati (%d)."
+
+msgid "Reprint After Error"
+msgstr "Ristampa dopo un errore"
+
+msgid "Request Entity Too Large"
+msgstr "Entità della richiesta troppo grande"
+
+msgid "Resolution"
+msgstr "Risoluzione"
+
+msgid "Resume Class"
+msgstr "Riprendi la classe"
+
+msgid "Resume Printer"
+msgstr "Riprendi la stampante"
+
+msgid "Return Address"
+msgstr "Ritorna l'indirizzo"
+
+msgid "Rewind"
+msgstr "Ricarica"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'"
+msgstr "Avvio in corso del comando: %s %s -N -A %s -c '%s'"
+
+msgid "SEQUENCE uses indefinite length"
+msgstr "SEQUENZA utilizza una lunghezza indefinita"
+
+msgid "SSL/TLS Negotiation Error"
+msgstr "Errore di negoziazione SSL/TLS"
+
+msgid "See Other"
+msgstr "Vedi altro"
+
+msgid "Sending data to printer."
+msgstr "Invio dei dati alla stampante."
+
+msgid "Server Restarted"
+msgstr "Il server è stato riavviato"
+
+msgid "Server Security Auditing"
+msgstr "Revisione della sicurezza del server"
+
+msgid "Server Started"
+msgstr "Il server è stato avviato"
+
+msgid "Server Stopped"
+msgstr "Il server è stato fermato"
+
+msgid "Server credentials not set."
+msgstr ""
+
+msgid "Service Unavailable"
+msgstr "Servizio non disponibile"
+
+msgid "Set Allowed Users"
+msgstr "Imposta gli utenti autorizzati"
+
+msgid "Set As Server Default"
+msgstr "Imposta come server predefinito"
+
+msgid "Set Class Options"
+msgstr "Imposta le opzioni della classe"
+
+msgid "Set Printer Options"
+msgstr "Imposta le opzioni della stampante"
+
+msgid "Set Publishing"
+msgstr "Imposta la pubblicazione"
+
+msgid "Shipping Address"
+msgstr "Indirizzo di spedizione"
+
+msgid "Short-Edge (Landscape)"
+msgstr "Short-Edge (Landscape)"
+
+msgid "Special Paper"
+msgstr "Carta speciale"
+
+#, c-format
+msgid "Spooling job, %.0f%% complete."
+msgstr "Processo di spooling, %.0f%% completato."
+
+msgid "Standard"
+msgstr "Standard"
+
+#. TRANSLATORS: Banner/cover sheet before the print job.
+msgid "Starting Banner"
+msgstr "Inizio del banner"
+
+#, c-format
+msgid "Starting page %d."
+msgstr "Pagina iniziale %d."
+
+msgid "Statement"
+msgstr "Rapporto"
+
+#, c-format
+msgid "Subscription #%d does not exist."
+msgstr "La sottoscrizione #%d non esiste."
+
+msgid "Substitutions:"
+msgstr "Sottoscrizioni:"
+
+msgid "Super A"
+msgstr "Super A"
+
+msgid "Super B"
+msgstr "Super B"
+
+msgid "Super B/A3"
+msgstr "Super B/A3"
+
+msgid "Switching Protocols"
+msgstr "Protocolli di commutazione"
+
+msgid "Tabloid"
+msgstr "Tabloid"
+
+msgid "Tabloid Oversize"
+msgstr "Tabloid Oversize"
+
+msgid "Tabloid Oversize Long Edge"
+msgstr "Tabloid Oversize Long Edge"
+
+msgid "Tear"
+msgstr "Tear"
+
+msgid "Tear-Off"
+msgstr "Tear-Off"
+
+msgid "Tear-Off Adjust Position"
+msgstr "Tear-Off Adjust Position"
+
+#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr "L'attributo \"%s\" è richiesto per i processi di stampa."
+
+#, c-format
+msgid "The %s attribute cannot be provided with job-ids."
+msgstr "L'attributo %s non può essere fornito con job-ids."
+
+#, c-format
+msgid ""
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
+msgstr ""
+
+#, c-format
+msgid ""
+"The '%s' operation attribute cannot be supplied in a Create-Job request."
+msgstr ""
+"L'attributo dell'operazione '%s' non può essere fornito in una richiesta "
+"Create-Job."
+
+#, c-format
+msgid "The PPD file \"%s\" could not be found."
+msgstr "Il file PPD \"%s\" non è stato trovato."
+
+#, c-format
+msgid "The PPD file \"%s\" could not be opened: %s"
+msgstr "Non è possibile aprire il file PPD \"%s\": %s"
+
+msgid "The PPD file could not be opened."
+msgstr "Il file PPD non può essere aperto."
+
+msgid ""
+"The class name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Il nome della classe può contenere fino a 127 caratteri stampabili e non può "
+"contenere spazi, barre (/) o cancelletto (#)."
+
+msgid "The developer unit needs to be replaced."
+msgstr "L'unità di sviluppo deve essere sostituita."
+
+msgid "The developer unit will need to be replaced soon."
+msgstr "L'unità di sviluppo dovrà essere sostituita a breve."
+
+msgid "The fuser's temperature is high."
+msgstr "La temperatura di fusione è alta."
+
+msgid "The fuser's temperature is low."
+msgstr "La temperatura di fusione è bassa."
+
+msgid ""
+"The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr ""
+"L'attributo notify-lease-duration non può essere utilizzato con le "
+"sottoscrizioni del processo."
+
+#, c-format
+msgid "The notify-user-data value is too large (%d > 63 octets)."
+msgstr "Il valore di notify-user-data è troppo grande (%d > 63 ottetti)."
+
+msgid "The optical photoconductor needs to be replaced."
+msgstr "Il fotoconduttore ottico deve essere sostituito."
+
+msgid "The optical photoconductor will need to be replaced soon."
+msgstr "Il fotoconduttore ottico dovrà essere sostituito a breve."
+
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr ""
+"La configurazione della stampante è errata oppure la stampante non esiste "
+"più."
+
+msgid "The printer did not respond."
+msgstr "La stampante non ha risposto."
+
+msgid "The printer is in use."
+msgstr "La stampante è in uso."
+
+msgid "The printer is low on ink."
+msgstr ""
+
+msgid "The printer is low on toner."
+msgstr ""
+
+msgid "The printer is not connected."
+msgstr "La stampante non è connessa."
+
+msgid "The printer is not responding."
+msgstr "La stampante non risponde."
+
+msgid "The printer is now connected."
+msgstr "Adesso la stampante è connessa."
+
+msgid "The printer is now online."
+msgstr "Adesso la stampante è online."
+
+msgid "The printer is offline."
+msgstr "La stampante è offline."
+
+msgid "The printer is unreachable at this time."
+msgstr "In questo momento la stampante non è raggiungibile."
+
+msgid "The printer may be out of ink."
+msgstr "L'inchiostro della stampante potrebbe essere esaurito."
+
+msgid "The printer may be out of toner."
+msgstr "Il toner della stampante potrebbe essere esaurito."
+
+msgid "The printer may not exist or is unavailable at this time."
+msgstr ""
+"La stampante potrebbe non esistere oppure non è disponibile in questo "
+"momento."
+
+msgid ""
+"The printer name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Il nome della stampante può contenere solo un massimo di 127 caratteri "
+"stampabili e non può contenere spazi, barre (/) oppure il simbolo del "
+"cancelletto (#)."
+
+msgid "The printer or class does not exist."
+msgstr "Non esiste la stampante o la classe."
+
+msgid "The printer or class is not shared."
+msgstr "La stampante o la classe non è condivisa."
+
+msgid "The printer's cover is open."
+msgstr "Il coperchio della stampante è aperto."
+
+msgid "The printer's door is open."
+msgstr "La porta della stampante è aperta."
+
+msgid "The printer's interlock is open."
+msgstr "Il blocco della stampante è aperto."
+
+msgid "The printer's waste bin is almost full."
+msgstr "Il cestino della stampante è quasi pieno."
+
+msgid "The printer's waste bin is full."
+msgstr "Il cestino della stampante è pieno."
+
+#, c-format
+msgid "The printer-uri \"%s\" contains invalid characters."
+msgstr "Il printer-uri \"%s\" contiene caratteri non validi."
+
+msgid "The printer-uri attribute is required."
+msgstr "L'attributo printer-uri è richiesto."
+
+msgid ""
+"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr ""
+"Il printer-uri deve essere del formato \"ipp://HOSTNAME/classes/CLASSNAME\"."
+
+msgid ""
+"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr ""
+"Il printer-uri deve essere del formato \"ipp://HOSTNAME/printers/PRINTERNAME"
+"\"."
+
+msgid ""
+"The subscription name may not contain spaces, slashes (/), question marks "
+"(?), or the pound sign (#)."
+msgstr ""
+"Il nome della sottoscrizione non può contenere spazi, barre (/), punti "
+"interrogativi (?) o cancelletto (#)."
+
+msgid ""
+"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
+"enable it."
+msgstr ""
+"L'interfaccia web è attualmente disabilitata. Avviare \"cupsctl "
+"WebInterface=yes\" per abilitarla."
+
+#, c-format
+msgid "The which-jobs value \"%s\" is not supported."
+msgstr "Il valore which-jobs \"%s\" non è supportato."
+
+msgid "There are too many subscriptions."
+msgstr "Ci sono troppe sottoscrizioni."
+
+msgid "There was an unrecoverable USB error."
+msgstr "Si è verificato un errore irreversibile sulla porta USB."
+
+msgid "Thermal Transfer Media"
+msgstr "Trasferimento termico"
+
+msgid "Too many active jobs."
+msgstr "Troppe stampe attive."
+
+#, c-format
+msgid "Too many job-sheets values (%d > 2)."
+msgstr "Troppi valori di job-sheets (%d > 2)."
+
+#, c-format
+msgid "Too many printer-state-reasons values (%d > %d)."
+msgstr "Troppi valori di printer-state-reasons (%d > %d)."
+
+msgid "Transparency"
+msgstr "Trasparenza"
+
+msgid "Tray"
+msgstr "Vassoio"
+
+msgid "Tray 1"
+msgstr "Vassoio 1"
+
+msgid "Tray 2"
+msgstr "Vassoio 2"
+
+msgid "Tray 3"
+msgstr "Vassoio 3"
+
+msgid "Tray 4"
+msgstr "Vassoio 4"
+
+msgid "URI Too Long"
+msgstr "L'URI è troppo lungo"
+
+msgid "URI too large"
+msgstr ""
+
+msgid "US Ledger"
+msgstr "US Ledger"
+
+msgid "US Legal"
+msgstr "US Legal"
+
+msgid "US Legal Oversize"
+msgstr "US Legal Oversize"
+
+msgid "US Letter"
+msgstr "US Letter"
+
+msgid "US Letter Long Edge"
+msgstr "US Letter Long Edge"
+
+msgid "US Letter Oversize"
+msgstr "US Letter Oversize"
+
+msgid "US Letter Oversize Long Edge"
+msgstr "US Letter Oversize Long Edge"
+
+msgid "US Letter Small"
+msgstr "US Letter Small"
+
+msgid "Unable to access cupsd.conf file"
+msgstr "Non è possibile accedere al file cupsd.conf"
+
+msgid "Unable to access help file."
+msgstr "Non è possibile accedere al file help."
+
+msgid "Unable to add RSS subscription"
+msgstr "Non è possibile aggiungere l'abbonamento RSS"
+
+msgid "Unable to add class"
+msgstr "Non è possibile aggiungere la classe"
+
+msgid "Unable to add document to print job."
+msgstr "Non è possibile aggiungere il documento al processo di stampa."
+
+#, c-format
+msgid "Unable to add job for destination \"%s\"."
+msgstr "Non è possibile aggiungere il processo alla destinazione \"%s\"."
+
+msgid "Unable to add printer"
+msgstr "Non è possibile aggiungere la stampante"
+
+msgid "Unable to allocate memory for file types."
+msgstr "Non è possibile allocare la memoria per i tipi di file."
+
+msgid "Unable to allocate memory for page info"
+msgstr "Non è possibile allocare la memoria per le info della pagina"
+
+msgid "Unable to allocate memory for pages array"
+msgstr "Non è possibile allocare memoria per array di pagine"
+
+msgid "Unable to cancel RSS subscription"
+msgstr "Non è possibile eliminare l'abbonamento RSS"
+
+msgid "Unable to cancel print job."
+msgstr "Non è possibile eliminare il processo di stampa."
+
+msgid "Unable to change printer"
+msgstr "Non è possibile modificare la stampante"
+
+msgid "Unable to change printer-is-shared attribute"
+msgstr "Non è possibile modificare l'attributo printer-is-shared"
+
+msgid "Unable to change server settings"
+msgstr "Non è possibile modificare le impostazioni del server"
+
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr "Non è possibile compilare l'espressione regolare mimeMediaType: %s."
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr "Non è possibile compilare l'espressione regolare naturalLanguage: %s."
+
+msgid "Unable to configure printer options."
+msgstr "Non è possibile configurare le opzioni della stampante."
+
+msgid "Unable to connect to host."
+msgstr "Non è possibile connettersi all'host."
+
+msgid "Unable to contact printer, queuing on next printer in class."
+msgstr ""
+"Non è possibile contattare la stampante, in coda nella classe della "
+"stampante successiva."
+
+#, c-format
+msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
+msgstr ""
+"Non è possibile copiare i driver della stampante di CUPS a 64-bit (%d)."
+
+#, c-format
+msgid "Unable to copy 64-bit Windows printer driver files (%d)."
+msgstr ""
+"Non è possibile copiare i driver della stampante di Windows a 64-bit (%d)."
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)."
+msgstr "Non è possibile copiare i driver della stampante di CUPS (%d)."
+
+#, c-format
+msgid "Unable to copy PPD file - %s"
+msgstr "Non è possibile copiare il file PPD - %s"
+
+msgid "Unable to copy PPD file."
+msgstr "Non è possibile copiare il file PPD."
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)."
+msgstr "Non è possibile copiare i driver di Windows 2000 della stampante (%d)."
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)."
+msgstr "Non è possibile copiare i driver di Windows 9x della stampante (%d)."
+
+#, c-format
+msgid "Unable to copy interface script - %s"
+msgstr "Non è possibile copiare lo script dell'interfaccia - %s"
+
+msgid "Unable to create printer-uri"
+msgstr "Non è possibile creare il printer-uri"
+
+msgid "Unable to create server credentials."
+msgstr ""
+
+msgid "Unable to create temporary file"
+msgstr "Non è possibile creare un file temporaneo"
+
+msgid "Unable to delete class"
+msgstr "Non è possibile eliminare la classe"
+
+msgid "Unable to delete printer"
+msgstr "Non è possibile eliminare la stampante"
+
+msgid "Unable to do maintenance command"
+msgstr "Non è possibile avviare il comando della manutenzione"
+
+msgid "Unable to edit cupsd.conf files larger than 1MB"
+msgstr "Non è possibile editare i file cupsd.conf più grandi di 1MB"
+
+msgid ""
+"Unable to establish a secure connection to host (certificate chain invalid)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (catena di "
+"certificati non validi)."
+
+msgid ""
+"Unable to establish a secure connection to host (certificate not yet valid)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (il certificato "
+"non è ancora valido)."
+
+msgid "Unable to establish a secure connection to host (expired certificate)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (il certificato è "
+"scaduto)."
+
+msgid "Unable to establish a secure connection to host (host name mismatch)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (il nome dell'host "
+"non corrisponde)."
+
+msgid ""
+"Unable to establish a secure connection to host (peer dropped connection "
+"before responding)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (peer ha chiuso la "
+"connessione prima di rispondere)."
+
+msgid ""
+"Unable to establish a secure connection to host (self-signed certificate)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (certificato "
+"autofirmato)."
+
+msgid ""
+"Unable to establish a secure connection to host (untrusted certificate)."
+msgstr ""
+"Non è possibile stabilire una connessione sicura all'host (certificato non "
+"verificato)."
+
+msgid "Unable to establish a secure connection to host."
+msgstr "Non è possibile stabilire una connessione sicura all'host."
+
+msgid "Unable to find destination for job"
+msgstr "Non è possibile trovare la destinazione del processo"
+
+msgid "Unable to find printer."
+msgstr "Non è possibile trovare la stampante."
+
+msgid "Unable to find server credentials."
+msgstr ""
+
+msgid "Unable to get backend exit status."
+msgstr "Non è possibile ottenere lo stato del backend."
+
+msgid "Unable to get class list"
+msgstr "Non è possibile ottenere la lista della classe"
+
+msgid "Unable to get class status"
+msgstr "Non è possibile ottenere lo stato della classe"
+
+msgid "Unable to get list of printer drivers"
+msgstr "Non è possibile ottenere i driver della stampante"
+
+msgid "Unable to get printer attributes"
+msgstr "Non è possibile ottenere gli attributi della stampante"
+
+msgid "Unable to get printer list"
+msgstr "Non è possibile ottenere la lista della stampante"
+
+msgid "Unable to get printer status"
+msgstr "Non è possibile ottenere lo stato della stampante"
+
+msgid "Unable to get printer status."
+msgstr "Non è possibile ottenere lo stato della stampante"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)."
+msgstr ""
+"Non è possibile installare i driver di Windows 2000 della stampante (%d)."
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)."
+msgstr ""
+"Non è possibile installare i driver di Windows 9x della stampante (%d)."
+
+msgid "Unable to load help index."
+msgstr "Non è possibile caricare l'indice dell'aiuto."
+
+#, c-format
+msgid "Unable to locate printer \"%s\"."
+msgstr "Non è possibile localizzare la stampante \"%s\"."
+
+msgid "Unable to locate printer."
+msgstr "Non è possibile localizzare la stampante."
+
+msgid "Unable to modify class"
+msgstr "Non è possibile modificare la classe"
+
+msgid "Unable to modify printer"
+msgstr "Non è possibile modificare la stampante"
+
+msgid "Unable to move job"
+msgstr "Non è possibile spostare il processo"
+
+msgid "Unable to move jobs"
+msgstr "Non è possibile spostare le stampe"
+
+msgid "Unable to open PPD file"
+msgstr "Non è possibile aprire il file PPD"
+
+msgid "Unable to open cupsd.conf file:"
+msgstr "Non è possibile aprire il file cupsd.conf:"
+
+msgid "Unable to open device file"
+msgstr "Non è possibile aprire il file del dispositivo:"
+
+#, c-format
+msgid "Unable to open document #%d in job #%d."
+msgstr "Non è possibile aprire il documento #%d nel processo #%d."
+
+msgid "Unable to open help file."
+msgstr "Non è possibile aprire il file dell'aiuto."
+
+msgid "Unable to open print file"
+msgstr "Non è possibile aprire il file della stampa"
+
+msgid "Unable to open raster file"
+msgstr "non è possibile aprire il file del raster"
+
+msgid "Unable to print test page"
+msgstr "Non è possibile stampare la pagina di prova"
+
+msgid "Unable to read print data."
+msgstr "Non è possibile leggere i dati della stampa."
+
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr ""
+
+#, c-format
+msgid "Unable to run \"%s\": %s"
+msgstr "Non è possibile avviare \"%s\": %s"
+
+msgid "Unable to see in file"
+msgstr "Non è possibile vedere nel file"
+
+msgid "Unable to send command to printer driver"
+msgstr "Non è possibile inviare il comando al driver della stampante"
+
+msgid "Unable to send data to printer."
+msgstr "Non è possibile inviare i dati alla stampante."
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)."
+msgstr "Non è possibile impostare i driver di Windows della stampante (%d)."
+
+msgid "Unable to set options"
+msgstr "Non è possibile impostare le opzioni"
+
+msgid "Unable to set server default"
+msgstr "Non è possibile impostare il server predefinito"
+
+msgid "Unable to start backend process."
+msgstr "Non è possibile avviare il processo del backend."
+
+msgid "Unable to upload cupsd.conf file"
+msgstr "Non è possibile caricare il file cupsd.conf"
+
+msgid "Unable to use legacy USB class driver."
+msgstr "Non è possibile utilizzare il driver legacy della classe USB. "
+
+msgid "Unable to write print data"
+msgstr "Non è possibile scrivere i dati della stampa"
+
+#, c-format
+msgid "Unable to write uncompressed print data: %s"
+msgstr "Non è possibile scrivere i dati della stampa non compressi: %s"
+
+msgid "Unauthorized"
+msgstr "Non autorizzato"
+
+msgid "Units"
+msgstr "Unità"
+
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#, c-format
+msgid "Unknown choice \"%s\" for option \"%s\"."
+msgstr "Scelta sconosciuta \"%s\" dell'opzione \"%s\"."
+
+#, c-format
+msgid "Unknown encryption option value: \"%s\"."
+msgstr "Valore sconosciuto dell'opzione di crittografia: \"%s\"."
+
+#, c-format
+msgid "Unknown file order: \"%s\"."
+msgstr "ordine del file sconosciuto: \"%s\"."
+
+#, c-format
+msgid "Unknown format character: \"%c\"."
+msgstr "Formato del carattere sconosciuto: \"%c\"."
+
+msgid "Unknown media size name."
+msgstr "Nome del formato del supporto sconosciuto."
+
+#, c-format
+msgid "Unknown option \"%s\" with value \"%s\"."
+msgstr "Opzione sconosciuta \"%s\" con il valore \"%s\"."
+
+#, c-format
+msgid "Unknown option \"%s\"."
+msgstr "Opzione sconosciuta \"%s\"."
+
+#, c-format
+msgid "Unknown print mode: \"%s\"."
+msgstr "Modalità di stampa sconosciuta: \"%s\"."
+
+#, c-format
+msgid "Unknown printer-error-policy \"%s\"."
+msgstr "printer-error-policy sconosciuta \"%s\"."
+
+#, c-format
+msgid "Unknown printer-op-policy \"%s\"."
+msgstr "printer-op-policy sconosciuta \"%s\"."
+
+msgid "Unknown request method."
+msgstr ""
+
+msgid "Unknown request version."
+msgstr ""
+
+msgid "Unknown scheme in URI"
+msgstr ""
+
+msgid "Unknown service name."
+msgstr "Nome del servizio sconosciuto."
+
+#, c-format
+msgid "Unknown version option value: \"%s\"."
+msgstr "Valore sconosciuto dell'opzione versione: \"%s\"."
+
+#, c-format
+msgid "Unsupported 'compression' value \"%s\"."
+msgstr "Valore di 'compressione' non supportato \"%s\"."
+
+#, c-format
+msgid "Unsupported 'document-format' value \"%s\"."
+msgstr "Valore di 'document-format' non supportato \"%s\"."
+
+msgid "Unsupported 'job-name' value."
+msgstr "Valore di 'job-name' non supportato."
+
+#, c-format
+msgid "Unsupported character set \"%s\"."
+msgstr "Il set dei caratteri \"%s\" non è supportato."
+
+#, c-format
+msgid "Unsupported compression \"%s\"."
+msgstr "Compressione non supportata \"%s\"."
+
+#, c-format
+msgid "Unsupported document-format \"%s\"."
+msgstr "Il formato del documento \"%s\" non è supportato."
+
+#, c-format
+msgid "Unsupported document-format \"%s/%s\"."
+msgstr "Il formato del documento \"%s/%s\" non è supportato."
+
+#, c-format
+msgid "Unsupported format \"%s\"."
+msgstr "Il formato \"%s\" non è supportato."
+
+msgid "Unsupported margins."
+msgstr "Margini non supportati."
+
+msgid "Unsupported media value."
+msgstr "Il valore del supporto non è supportato."
+
+#, c-format
+msgid "Unsupported number-up value %d, using number-up=1."
+msgstr "Il valore %d di number-up non è supportato, usare number-up=1."
+
+#, c-format
+msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
+msgstr ""
+"Il valore %s di number-up-layout non è supportato, usare number-up-"
+"layout=1rtb."
+
+#, c-format
+msgid "Unsupported page-border value %s, using page-border=none."
+msgstr "Il valore %s di page-border non è supportato, usare page-border=none."
+
+msgid "Unsupported raster data."
+msgstr "I dati del raster non sono supportati."
+
+msgid "Unsupported value type"
+msgstr "Tipo di valore non supportato"
+
+msgid "Upgrade Required"
+msgstr "È richiesto l'aggiornamento"
+
+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]"
+msgstr ""
+"Uso:\n"
+"\n"
+" lpadmin [-h server] -d destinazione\n"
+" lpadmin [-h server] -x destinazione\n"
+" lpadmin [-h server] -p stampante [-c add-class] [-i interfaccia] [-m "
+"modello]\n"
+" [-r remove-class] [-v dispositivo] [-D descrizione]\n"
+" [-P ppd-file] [-o nome=valore]\n"
+" [-u allow:utente,utente] [-u deny:utente,utente]"
+
+#, c-format
+msgid "Usage: %s job-id user title copies options [file]"
+msgstr "Uso: %s job-id utente titolo copie opzioni [file]"
+
+msgid "Usage: cupsaddsmb [options] printer1 ... printerN"
+msgstr "Uso: cupsaddsmb [opzioni] stampante1 ... stampanteN"
+
+msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
+msgstr "Uso: cupsctl [opzioni] [param=valore ... paramN=valoreN]"
+
+msgid "Usage: cupsd [options]"
+msgstr "Uso: cupsd [opzioni]"
+
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr ""
+
+msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
+msgstr "Uso: cupstestdsc [opzioni] file.ps [... file.ps]"
+
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgstr "Uso: cupstestppd [opzioni] file1.ppd[.gz] [... fileN.ppd[.gz]]"
+
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"Uso: ippdiscover [opzioni] -a\n"
+" ippdiscover [opzioni] \"nome del servizio\"\n"
+"\n"
+"Opzioni:"
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+"Uso: ippfind [opzioni] regtype[,subtype][.dominio.] ... [espressione]\n"
+" ippfind [opzioni] nome[.regtype[.dominio.]] ... [espressione]\n"
+" ippfind --help\n"
+" ippfind --version"
+
+msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
+msgstr "Uso: ipptool [opzioni] URI file [ ... fileN ]"
+
+msgid "Usage: lpmove job/src dest"
+msgstr "Uso: lpmove job/src dest"
+
+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"
+msgstr ""
+"Uso: lpoptions [-h server] [-E] -d stampante\n"
+" lpoptions [-h server] [-E] [-p stampante] -l\n"
+" lpoptions [-h server] [-E] -p stampante -o opzione[=valore] ...\n"
+" lpoptions [-h server] [-E] -x stampante"
+
+msgid ""
+"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
+msgstr ""
+"Uso: lpq [-P dest] [-U username] [-h hostname[:porta]] [-l] [+intervallo]"
+
+msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
+msgstr "Uso: ppdc [opzioni] file.drv [ ... fileN.drv ]"
+
+msgid "Usage: ppdhtml [options] filename.drv >filename.html"
+msgstr "Uso: ppdhtml [opzioni] file.drv >file.html"
+
+msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"
+msgstr "Uso: ppdi [opzioni] file.ppd [ ... fileN.ppd ]"
+
+msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"
+msgstr "Uso: ppdmerge [opzioni] file.ppd [ ... fileN.ppd ]"
+
+msgid ""
+"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
+msgstr "Uso: ppdpo [opzioni] -o file.po file.drv [ ... fileN.drv ]"
+
+msgid "Usage: snmp [host-or-ip-address]"
+msgstr "Uso: snmp [host-o-indirizzo-ip]"
+
+msgid "Value uses indefinite length"
+msgstr "Il valore utilizza una lunghezza indefinita"
+
+msgid "VarBind uses indefinite length"
+msgstr "VarBind utilizza una lunghezza indefinita"
+
+msgid "Version uses indefinite length"
+msgstr "Version utilizza una lunghezza indefinita"
+
+msgid "Waiting for job to complete."
+msgstr "In attesa di lavoro da completare."
+
+msgid "Waiting for printer to become available."
+msgstr "In attesa che la stampante ritorni disponibile."
+
+msgid "Waiting for printer to finish."
+msgstr "In attesa che la stampante finisca."
+
+msgid "Warning, no Windows 2000 printer drivers are installed."
+msgstr ""
+"Attenzione, nessun driver di Windows 2000 della stampante è stato installato."
+
+msgid "Web Interface is Disabled"
+msgstr "L'interfaccia web è stata disabilitata"
+
+msgid "Yes"
+msgstr "Sì"
+
+#, c-format
+msgid ""
+"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
+msgstr ""
+"Bisogna accedere a questa pagina, usando l'URL <A HREF=\"https://%s:%d%s"
+"\">https://%s:%d%s</A>."
+
+msgid "ZPL Label Printer"
+msgstr "ZPL Label Printer"
+
+msgid "Zebra"
+msgstr "Zebra"
+
+msgid "aborted"
+msgstr "interrotto"
+
+msgid "canceled"
+msgstr "eliminato"
+
+msgid "completed"
+msgstr "completato"
+
+msgid "cups-deviced failed to execute."
+msgstr "cups-deviced ha smesso di funzionare."
+
+msgid "cups-driverd failed to execute."
+msgstr "cups-driverd ha smesso di funzionare."
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s"
+msgstr "cupsaddsmb: nessun file PPD per la stampante \"%s\" - %s"
+
+msgid "cupsctl: Cannot set Listen or Port directly."
+msgstr "cupsctl: non è possibile impostare direttamente Listen o Port."
+
+#, c-format
+msgid "cupsctl: Unable to connect to server: %s"
+msgstr "cupsctl: non è possibile connettersi al server: %s"
+
+#, c-format
+msgid "cupsctl: Unknown option \"%s\""
+msgstr "cupsctl: opzione sconosciuta \"%s\""
+
+#, c-format
+msgid "cupsctl: Unknown option \"-%c\""
+msgstr "cupsctl: opzione sconosciuta \"-%c\""
+
+msgid "cupsd: Expected config filename after \"-c\" option."
+msgstr "cupsd: dopo l'opzione \"-c\" è previsto il file di configurazione."
+
+msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
+msgstr "cupsd: dopo l'opzione \"-s\" è previsto il file cups-files.conf."
+
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
+msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgstr "cupsd: non è consentito il file relativo cups-files.conf."
+
+msgid "cupsd: Unable to get current directory."
+msgstr "cupsd: non è possibile ottenere la directory corrente."
+
+msgid "cupsd: Unable to get path to cups-files.conf file."
+msgstr "cupsd: non è possibile ottenere il path del file cups-files.conf."
+
+#, c-format
+msgid "cupsd: Unknown argument \"%s\" - aborting."
+msgstr "cupsd: argomento sconosciuto \"%s\" - operazione interrotta."
+
+#, c-format
+msgid "cupsd: Unknown option \"%c\" - aborting."
+msgstr "cupsd: opzione sconosciuta \"%c\" - operazione interrotta."
+
+#, c-format
+msgid "cupsfilter: Invalid document number %d."
+msgstr "cupsfilter: il numero del documento non è valido %d."
+
+#, c-format
+msgid "cupsfilter: Invalid job ID %d."
+msgstr "cupsfilter: l'ID del processo non è valido %d."
+
+msgid "cupsfilter: Only one filename can be specified."
+msgstr "cupsfilter: può essere specificato solo un nome del file."
+
+#, c-format
+msgid "cupsfilter: Unable to get job file - %s"
+msgstr "cupsfilter: non è possibile ottenere il file del processo - %s"
+
+msgid "cupstestppd: The -q option is incompatible with the -v option."
+msgstr "cupstestppd: l'opzione -q non è compatibile con l'opzione -v."
+
+msgid "cupstestppd: The -v option is incompatible with the -q option."
+msgstr "cupstestppd: l'opzione -v è incompatibile con l'opzione -q."
+
+#, c-format
+msgid "device for %s/%s: %s"
+msgstr "dispositivo per %s/%s: %s"
+
+#, c-format
+msgid "device for %s: %s"
+msgstr "dispositivo per %s: %s"
+
+msgid "error-index uses indefinite length"
+msgstr "error-index utilizza una lunghezza indefinita"
+
+msgid "error-status uses indefinite length"
+msgstr "error-status utilizza una lunghezza indefinita"
+
+msgid "held"
+msgstr "svolto"
+
+msgid "help\t\tGet help on commands."
+msgstr "help\t\tOttenere un aiuto per i comandi."
+
+msgid "idle"
+msgstr "inattiva"
+
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr "ippfind: l'espressione regolare non è valida: %s"
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr "ippfind: non è possibile usare --and dopo --or."
+
+#, c-format
+msgid "ippfind: Expected key name after %s."
+msgstr "ippfind: è previsto il nome della chiave dopo %s."
+
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr "ippfind: è previsto un intervallo di porte dopo %s."
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr "ippfind: è previsto un programma dopo %s."
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr "ippfind: è previsto un punto e virgola dopo %s. "
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr "ippfind: manca parentesi graffa di chiusura in sostituzione."
+
+msgid "ippfind: Missing close parenthesis."
+msgstr "ippfind: mancano le parentesi chiuse."
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr "ippfind: manca l'espressione prima di \"--and\"."
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr "ippfind: manca l'espressione prima di \"--or\"."
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr "ippfind: manca il nome della chiave dopo %s."
+
+msgid "ippfind: Missing open parenthesis."
+msgstr "ippfind: mancano le parentesi aperte."
+
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr "ippfind: manca il programma dopo %s."
+
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr "ippfind: manca l'espressione regolare dopo %s."
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr "ippfind: manca il punto e virgola dopo %s."
+
+msgid "ippfind: Out of memory."
+msgstr "ippfind: memoria insufficiente."
+
+msgid "ippfind: Too many parenthesis."
+msgstr "ippfind: troppe parentesi."
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr "ippfind: non è possibile visualizzare oppure risolvere: %s"
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr "ippfind: non è possibile eseguire \"%s\": %s"
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr "ippfind: non è possibile utilizzare Bonjour: %s"
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr "ippfind: variabile sconosciuta \"{%s}\"."
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: l'URI non è valido - %s."
+
+msgid "ipptool: Invalid seconds for \"-i\"."
+msgstr "ipptool: secondi non validi per \"-i\"."
+
+msgid "ipptool: May only specify a single URI."
+msgstr "ipptool: può specificare solo un singolo URI."
+
+msgid "ipptool: Missing count for \"-n\"."
+msgstr "ipptool: conteggio mancante per \"-n\"."
+
+msgid "ipptool: Missing filename for \"-f\"."
+msgstr "ipptool: manca il file per \"-f\"."
+
+msgid "ipptool: Missing name=value for \"-d\"."
+msgstr "ipptool: manca nome=valore per \"-d\"."
+
+msgid "ipptool: Missing seconds for \"-i\"."
+msgstr "ipptool: mancano i secondi per \"-i\"."
+
+msgid "ipptool: URI required before test file."
+msgstr "ipptool: l'URI è richiesto prima del file di testo."
+
+#, c-format
+msgid "ipptool: Unknown option \"-%c\"."
+msgstr "ipptool: opzione sconosciuta \"-%c\"."
+
+msgid "job-printer-uri attribute missing."
+msgstr "manca l'attributo di job-printer-uri."
+
+msgid "lpadmin: Class name can only contain printable characters."
+msgstr "lpadmin: il nome della classe può contenere solo caratteri stampabili."
+
+msgid "lpadmin: Expected PPD after \"-P\" option."
+msgstr "lpadmin: è previsto PPD dopo l'opzione \"-P\"."
+
+msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
+msgstr "lpadmin: è previsto allow/deny:listautente dopo l'opzione \"-u\"."
+
+msgid "lpadmin: Expected class after \"-r\" option."
+msgstr "lpadmin: è prevista la classe dopo l'opzione \"-r\"."
+
+msgid "lpadmin: Expected class name after \"-c\" option."
+msgstr "lpadmin: è previsto il nome della classe dopo l'opzione \"-c\"."
+
+msgid "lpadmin: Expected description after \"-D\" option."
+msgstr "lpadmin: è prevista la descrizione dopo l'opzione \"-D\"."
+
+msgid "lpadmin: Expected device URI after \"-v\" option."
+msgstr "lpadmin: è previsto l'URI del dispositivo dopo l'opzione \"-v\"."
+
+msgid "lpadmin: Expected file type(s) after \"-I\" option."
+msgstr "lpadmin: è previsto il tipo del(i) file dopo l'opzione \"-I\"."
+
+msgid "lpadmin: Expected hostname after \"-h\" option."
+msgstr "lpadmin: è previsto l'hostname dopo l'opzione \"-h\"."
+
+msgid "lpadmin: Expected interface after \"-i\" option."
+msgstr "lpadmin: è prevista l'interfaccia dopo l'opzione \"-i\"."
+
+msgid "lpadmin: Expected location after \"-L\" option."
+msgstr "lpadmin: è prevista la posizione dopo l'opzione \"-L\"."
+
+msgid "lpadmin: Expected model after \"-m\" option."
+msgstr "lpadmin: è previsto il modello dopo l'opzione \"-m\"."
+
+msgid "lpadmin: Expected name after \"-R\" option."
+msgstr "lpadmin: è previsto il nome dopo l'opzione \"-R\"."
+
+msgid "lpadmin: Expected name=value after \"-o\" option."
+msgstr "lpadmin: è previsto nome=valore dopo l'opzione \"-o\"."
+
+msgid "lpadmin: Expected printer after \"-p\" option."
+msgstr "lpadmin: è prevista la stampante dopo l'opzione \"-p\"."
+
+msgid "lpadmin: Expected printer name after \"-d\" option."
+msgstr "lpadmin: è previsto il nome della stampante dopo l'opzione \"-d\"."
+
+msgid "lpadmin: Expected printer or class after \"-x\" option."
+msgstr "lpadmin: è prevista la stampante o la classe dopo l'opzione \"-x\"."
+
+msgid "lpadmin: No member names were seen."
+msgstr "lpadmin: nessun nome dei membri è stato visto."
+
+#, c-format
+msgid "lpadmin: Printer %s is already a member of class %s."
+msgstr "lpadmin: la stampante %s è già un membro della classe %s."
+
+#, c-format
+msgid "lpadmin: Printer %s is not a member of class %s."
+msgstr "lpadmin: la stampante %s non è un membro della classe %s."
+
+msgid "lpadmin: Printer name can only contain printable characters."
+msgstr ""
+"lpadmin: il nome della stampante può contenere solo caratteri stampabili."
+
+msgid ""
+"lpadmin: Unable to add a printer to the class:\n"
+" You must specify a printer name first."
+msgstr ""
+"lpadmin: non è possibile aggiungere una stampante alla classe:\n"
+" Bisogna specificare prima un nome per la stampante."
+
+#, c-format
+msgid "lpadmin: Unable to connect to server: %s"
+msgstr "lpadmin: non è possibile connettersi al server: %s"
+
+msgid "lpadmin: Unable to create temporary file"
+msgstr "lpadmin: non è possibile creare il file temporaneo"
+
+msgid ""
+"lpadmin: Unable to delete option:\n"
+" You must specify a printer name first."
+msgstr ""
+"lpadmin: non è possibile eliminare l'opzione:\n"
+" Bisogna specificare prima un nome per la stampante."
+
+#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgstr "lpadmin: non è possibile aprile il file PPD \"%s\" - %s"
+
+msgid ""
+"lpadmin: Unable to remove a printer from the class:\n"
+" You must specify a printer name first."
+msgstr ""
+"lpadmin: non è possibile rimuovere una stampante dalla classe:\n"
+" Bisogna specificare prima un nome per la stampante."
+
+msgid ""
+"lpadmin: Unable to set the printer options:\n"
+" You must specify a printer name first."
+msgstr ""
+"lpadmin: non è possibile impostare le opzioni della stampante:\n"
+" Bisogna specificare prima un nome per la stampante."
+
+#, c-format
+msgid "lpadmin: Unknown allow/deny option \"%s\"."
+msgstr "lpadmin: opzione sconosciuta allow/deny \"%s\"."
+
+#, c-format
+msgid "lpadmin: Unknown argument \"%s\"."
+msgstr "lpadmin: argomento sconosciuto \"%s\"."
+
+#, c-format
+msgid "lpadmin: Unknown option \"%c\"."
+msgstr "lpadmin: opzione sconosciuta \"%c\"."
+
+msgid "lpadmin: Warning - content type list ignored."
+msgstr "lpadmin: attenzione - contenuto nell'elenco tipo ignorato."
+
+msgid "lpc> "
+msgstr "lpc> "
+
+msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"."
+msgstr ""
+"lpinfo: è prevista la stringa ID del dispositivo 1284 dopo \"--device-id\"."
+
+msgid "lpinfo: Expected language after \"--language\"."
+msgstr "lpinfo: è prevista la lingua dopo \"--language\"."
+
+msgid "lpinfo: Expected make and model after \"--make-and-model\"."
+msgstr "lpinfo: è prevista marca e modello dopo \"--make-and-model\"."
+
+msgid "lpinfo: Expected product string after \"--product\"."
+msgstr "lpinfo: è prevista la stringa del prodotto dopo \"--product\"."
+
+msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"."
+msgstr "lpinfo: è prevista la lista dello schema dopo \"--exclude-schemes\"."
+
+msgid "lpinfo: Expected scheme list after \"--include-schemes\"."
+msgstr "lpinfo: è prevista la lista dello schema dopo \"--include-schemes\"."
+
+msgid "lpinfo: Expected timeout after \"--timeout\"."
+msgstr "lpinfo: è previsto un timeout dopo \"--timeout\"."
+
+#, c-format
+msgid "lpinfo: Unknown argument \"%s\"."
+msgstr "lpinfo: argomento sconosciuto \"%s\"."
+
+#, c-format
+msgid "lpinfo: Unknown option \"%c\"."
+msgstr "lpinfo: opzione sconosciuta \"%c\"."
+
+#, c-format
+msgid "lpinfo: Unknown option \"%s\"."
+msgstr "lpinfo: opzione sconosciuta \"%s\"."
+
+#, c-format
+msgid "lpmove: Unable to connect to server: %s"
+msgstr "lpmove: non è possibile connettersi al server: %s"
+
+#, c-format
+msgid "lpmove: Unknown argument \"%s\"."
+msgstr "lpmove: argomento sconosciuto \"%s\"."
+
+#, c-format
+msgid "lpmove: Unknown option \"%c\"."
+msgstr "lpmove: opzione sconosciuta \"%c\"."
+
+msgid "lpoptions: No printers."
+msgstr "lpoptions: nessuna stampante."
+
+#, c-format
+msgid "lpoptions: Unable to add printer or instance: %s"
+msgstr "lpoptions: non è possibile aggiungere la stampante o l'istanza: %s"
+
+#, c-format
+msgid "lpoptions: Unable to get PPD file for %s: %s"
+msgstr "lpoptions: non è possibile ottenere il file PPD per %s: %s"
+
+#, c-format
+msgid "lpoptions: Unable to open PPD file for %s."
+msgstr "lpoptions: non è possibile aprire il file PPD per %s."
+
+msgid "lpoptions: Unknown printer or class."
+msgstr "lpoptions: stampante o classe sconosciuta."
+
+#, c-format
+msgid ""
+"lpstat: error - %s environment variable names non-existent destination \"%s"
+"\"."
+msgstr ""
+"lpstat: errore - destinazione inesistente \"%s\" dei nomi delle variabili di "
+"ambiente %s."
+
+#, c-format
+msgid "members of class %s:"
+msgstr "membri della classe %s:"
+
+msgid "no entries"
+msgstr "nessuna voce"
+
+msgid "no system default destination"
+msgstr "nessuna destinazione predefinita di sistema"
+
+msgid "notify-events not specified."
+msgstr "notify-events non è stato specificato."
+
+#, c-format
+msgid "notify-recipient-uri URI \"%s\" is already used."
+msgstr "notify-recipient-uri URI \"%s\" è già stato utilizzato."
+
+#, c-format
+msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
+msgstr "notify-recipient-uri URI \"%s\" utilizza uno schema sconosciuto."
+
+msgid "pending"
+msgstr "in attesa"
+
+#, c-format
+msgid "ppdc: Adding include directory \"%s\"."
+msgstr "ppdc: aggiunta della directory \"%s\"."
+
+#, c-format
+msgid "ppdc: Adding/updating UI text from %s."
+msgstr "ppdc: aggiunto/aggiornato il testo della UI da %s."
+
+#, c-format
+msgid "ppdc: Bad boolean value (%s) on line %d of %s."
+msgstr "ppdc: il valore booleano non è valido (%s) alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Bad font attribute: %s"
+msgstr "ppdc: l'attributo del carattere non è valido: %s"
+
+#, c-format
+msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
+msgstr ""
+"ppdc: il nome della risoluzione non è valido \"%s\" alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Bad status keyword %s on line %d of %s."
+msgstr "ppdc: lo stato della parola chiave non è valido %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
+msgstr ""
+"ppdc: la sostituzione della variabile ($%c) non è valida alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Choice found on line %d of %s with no Option."
+msgstr "ppdc: trovata scelta senza opzione alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
+msgstr "ppdc: #po duplicato per il locale %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected a filter definition on line %d of %s."
+msgstr "ppdc: è prevista una definizione del filtro alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected a program name on line %d of %s."
+msgstr "ppdc: è previsto il nome del programma alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected boolean value on line %d of %s."
+msgstr "ppdc: è previsto un valore booleano alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected charset after Font on line %d of %s."
+msgstr "ppdc: è previsto un set di caratteri dopo Font alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected choice code on line %d of %s."
+msgstr "ppdc: è previsto un codice di scelta alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected choice name/text on line %d of %s."
+msgstr "ppdc: è previsto un nome/testo di scelta alla riga %d di %s. "
+
+#, c-format
+msgid "ppdc: Expected color order for ColorModel on line %d of %s."
+msgstr "ppdc: è previsto un colore per ColorModel alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
+msgstr ""
+"ppdc: è previsto uno spazio di colore per ColorModel alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected compression for ColorModel on line %d of %s."
+msgstr "ppdc: è prevista una compressione per ColorModel alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
+msgstr ""
+"ppdc: è prevista una stringa di vincoli per UIConstraints alla riga %d di %s."
+
+#, c-format
+msgid ""
+"ppdc: Expected driver type keyword following DriverType on line %d of %s."
+msgstr ""
+"ppdc: è previsto un driver della parola chiave tipo che segue DriverType "
+"alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
+msgstr "ppdc: è previsto il tipo duplex dopo Duplex alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected encoding after Font on line %d of %s."
+msgstr "ppdc: è prevista una codifica dopo Font alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected filename after #po %s on line %d of %s."
+msgstr "ppdc: è previsto un file dopo #po %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected group name/text on line %d of %s."
+msgstr "ppdc: è previsto un nome/testo del gruppo alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected include filename on line %d of %s."
+msgstr "ppdc: è previsto un file da includere alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected integer on line %d of %s."
+msgstr "ppdc: è previsto un intero alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected locale after #po on line %d of %s."
+msgstr "ppdc: è previsto un locale dopo #po alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after %s on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after FileName on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo FileName alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after Font on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo Font alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after Manufacturer on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo Manufacturer alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after MediaSize on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo MediaSize alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after ModelName on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo ModelName alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name after PCFileName on line %d of %s."
+msgstr "ppdc: è previsto un nome dopo PCFileName alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name/text after %s on line %d of %s."
+msgstr "ppdc: è previsto un nome/testo dopo %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name/text after Installable on line %d of %s."
+msgstr "ppdc: è previsto un nome/testo dopo Installable alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name/text after Resolution on line %d of %s."
+msgstr "ppdc: è previsto un nome/testo dopo Resolution alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
+msgstr ""
+"ppdc: è prevista una combinazione nome/testo per ColorModel alla riga %d di "
+"%s."
+
+#, c-format
+msgid "ppdc: Expected option name/text on line %d of %s."
+msgstr "ppdc: è prevista l'opzione nome/testo alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected option section on line %d of %s."
+msgstr "ppdc: è prevista la sezione dell'opzione alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected option type on line %d of %s."
+msgstr "ppdc: è previsto il tipo di opzione alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected override field after Resolution on line %d of %s."
+msgstr ""
+"ppdc: è previsto sovrascrivere il campo dopo Resolution alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected quoted string on line %d of %s."
+msgstr "ppdc: è prevista una stringa tra virgolette alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected real number on line %d of %s."
+msgstr "ppdc: è previsto un numero reale alla riga %d di %s."
+
+#, c-format
+msgid ""
+"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
+msgstr ""
+"ppdc: è previsto risoluzione/mediatype dopo ColorProfile alla riga %d di %s."
+
+#, c-format
+msgid ""
+"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
+"of %s."
+msgstr ""
+"ppdc: è previsto risoluzione/mediatype dopo SimpleColorProfile alla riga %d "
+"di %s."
+
+#, c-format
+msgid "ppdc: Expected selector after %s on line %d of %s."
+msgstr "ppdc: è previsto un selettore %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected status after Font on line %d of %s."
+msgstr "ppdc: è previsto uno stato dopo Font alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected string after Copyright on line %d of %s."
+msgstr "ppdc: è prevista una stringa dopo Copyright alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected string after Version on line %d of %s."
+msgstr "ppdc: è prevista una stringa dopo Version alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected two option names on line %d of %s."
+msgstr "ppdc: sono previsti due nomi di opzioni alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected value after %s on line %d of %s."
+msgstr "ppdc: è previsto un valore dopo %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Expected version after Font on line %d of %s."
+msgstr "ppdc: è prevista una versione dopo Font alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Invalid #include/#po filename \"%s\"."
+msgstr "ppdc: il file #include/#po non è valido \"%s\"."
+
+#, c-format
+msgid "ppdc: Invalid cost for filter on line %d of %s."
+msgstr "ppdc: il costo non è valido per il filtro alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
+msgstr ""
+"ppdc: il tipo di MIME vuoto non è valido per il filtro alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Invalid empty program name for filter on line %d of %s."
+msgstr ""
+"ppdc: il nome del programma vuoto non è valido per il filtro alla riga %d di "
+"%s."
+
+#, c-format
+msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
+msgstr "ppdc: la sezione dell'opzione \"%s\" non è valida alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
+msgstr "ppdc: il tipo di opzione \"%s\" non è valido alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Loading driver information file \"%s\"."
+msgstr "ppdc: caricamento in corso delle informazioni del driver \"%s\"."
+
+#, c-format
+msgid "ppdc: Loading messages for locale \"%s\"."
+msgstr "ppdc: caricamento in corso dei messaggi per locale \"%s\"."
+
+#, c-format
+msgid "ppdc: Loading messages from \"%s\"."
+msgstr "ppdc: caricamento in corso da \"%s\"."
+
+#, c-format
+msgid "ppdc: Missing #endif at end of \"%s\"."
+msgstr "ppdc. manca #endif alla fine di \"%s\"."
+
+#, c-format
+msgid "ppdc: Missing #if on line %d of %s."
+msgstr "ppdc: manca #if alla riga %d di %s."
+
+#, c-format
+msgid ""
+"ppdc: Need a msgid line before any translation strings on line %d of %s."
+msgstr ""
+"ppdc: è necessaria la riga msgid prima di ogni stringa di traduzione alla "
+"riga %d di %s."
+
+#, c-format
+msgid "ppdc: No message catalog provided for locale %s."
+msgstr "ppdc: Nessun catalogo dei messaggi fornito per locale %s."
+
+#, c-format
+msgid "ppdc: Option %s defined in two different groups on line %d of %s."
+msgstr ""
+"ppdc: l'opzione %s è stata definita in due differenti gruppi alla riga %d di "
+"%s."
+
+#, c-format
+msgid "ppdc: Option %s redefined with a different type on line %d of %s."
+msgstr ""
+"ppdc: l'opzione %s è stata ridefinita con un tipo differente alla riga %d di "
+"%s."
+
+#, c-format
+msgid "ppdc: Option constraint must *name on line %d of %s."
+msgstr "ppdc: il vincolo dell'opzione deve *citare alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Too many nested #if's on line %d of %s."
+msgstr "ppdc: troppi #if sono nidificati alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unable to create PPD file \"%s\" - %s."
+msgstr "ppdc: non è possibile creare il file PPD \"%s\" - %s."
+
+#, c-format
+msgid "ppdc: Unable to create output directory %s: %s"
+msgstr "ppdc: non è possibile creare la directory di output %s: %s"
+
+#, c-format
+msgid "ppdc: Unable to create output pipes: %s"
+msgstr "ppdc: non è possibile creare la pipe di output: %s"
+
+#, c-format
+msgid "ppdc: Unable to execute cupstestppd: %s"
+msgstr "ppdc: non è possibile eseguire cupstestppd: %s"
+
+#, c-format
+msgid "ppdc: Unable to find #po file %s on line %d of %s."
+msgstr "ppdc: non è possibile trovare il file #po %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
+msgstr ""
+"ppdc: non è possibile trovare il file di include \"%s\" alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unable to find localization for \"%s\" - %s"
+msgstr "ppdc: non è possibile trovare la localizzazione di \"%s\" - %s"
+
+#, c-format
+msgid "ppdc: Unable to load localization file \"%s\" - %s"
+msgstr ""
+"ppdc: non è possibile caricare il file della localizzazione \"%s\" - %s"
+
+#, c-format
+msgid "ppdc: Unable to open %s: %s"
+msgstr "ppdc: non è possibile aprire %s: %s"
+
+#, c-format
+msgid "ppdc: Undefined variable (%s) on line %d of %s."
+msgstr "ppdc: variabile non definita (%s) alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unexpected text on line %d of %s."
+msgstr "ppdc: testo non previsto alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unknown driver type %s on line %d of %s."
+msgstr "ppdc: tipo di driver sconosciuto %s alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
+msgstr "ppdc: tipo duplex sconosciuto \"%s\" alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
+msgstr "ppdc: dimensione sconosciuta del supporto \"%s\" alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Unknown message catalog format for \"%s\"."
+msgstr "ppdc: formato dei cataloghi sconosciuto per \"%s\"."
+
+#, c-format
+msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
+msgstr "ppdc: c'è un token sconosciuto \"%s\" alla riga %d di %s."
+
+#, c-format
+msgid ""
+"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
+msgstr ""
+"ppdc: caratteri finali sconosciuti in un numero reale \"%s\" alla riga %d di "
+"%s."
+
+#, c-format
+msgid "ppdc: Unterminated string starting with %c on line %d of %s."
+msgstr "ppdc: stringa senza terminazione che inizia per %c alla riga %d di %s."
+
+#, c-format
+msgid "ppdc: Warning - overlapping filename \"%s\"."
+msgstr "ppdc: attenzione - sovrapposizione del file \"%s\"."
+
+#, c-format
+msgid "ppdc: Writing %s."
+msgstr "ppdc: scrittura in corso di %s."
+
+#, c-format
+msgid "ppdc: Writing PPD files to directory \"%s\"."
+msgstr "ppdc: scrittura in corso dei file PPD nella directory \"%s\"."
+
+#, c-format
+msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
+msgstr "ppdmerge: LanguageVersion non è valido \"%s\" in %s."
+
+#, c-format
+msgid "ppdmerge: Ignoring PPD file %s."
+msgstr "ppdmerge: il file PPD %s è stato ignorato."
+
+#, c-format
+msgid "ppdmerge: Unable to backup %s to %s - %s"
+msgstr "ppdmerge: non è possibile salvare %s in %s - %s"
+
+#, c-format
+msgid "printer %s disabled since %s -"
+msgstr "la stampante %s è stata disabilitata da %s"
+
+#, c-format
+msgid "printer %s is idle. enabled since %s"
+msgstr "la stampante %s è inattiva. è stata abilitata da %s"
+
+#, c-format
+msgid "printer %s now printing %s-%d. enabled since %s"
+msgstr "la stampante %s sta stampando %s-%d. è stata abilitata da %s"
+
+#, c-format
+msgid "printer %s/%s disabled since %s -"
+msgstr "la stampante %s/%s è stata disabilitata da %s -"
+
+#, c-format
+msgid "printer %s/%s is idle. enabled since %s"
+msgstr "la stampante %s/%s è inattiva. è stata abilitata da %s"
+
+#, c-format
+msgid "printer %s/%s now printing %s-%d. enabled since %s"
+msgstr "la stampante %s/%s sta stampando %s-%d. è stata abilitata da %s"
+
+msgid "processing"
+msgstr "elaborazione in corso"
+
+#, c-format
+msgid "request id is %s-%d (%d file(s))"
+msgstr "request id è %s-%d (%d file(s))"
+
+msgid "request-id uses indefinite length"
+msgstr "request-id utilizza una lunghezza indefinita"
+
+msgid "scheduler is not running"
+msgstr "lo scheduler non è in funzione"
+
+msgid "scheduler is running"
+msgstr "lo scheduler è in funzione"
+
+#, c-format
+msgid "stat of %s failed: %s"
+msgstr "stat di %s non riuscito: %s"
+
+msgid "status\t\tShow status of daemon and queue."
+msgstr "stato\t\tMostra lo stato del demone e della coda."
+
+msgid "stopped"
+msgstr "fermato"
+
+#, c-format
+msgid "system default destination: %s"
+msgstr "destinazione predefinita del sistema: %s"
+
+#, c-format
+msgid "system default destination: %s/%s"
+msgstr "destinazione predefinita del sistema: %s/%s"
+
+msgid "unknown"
+msgstr "sconosciuto"
+
+msgid "untitled"
+msgstr "senza titolo"
+
+msgid "variable-bindings uses indefinite length"
+msgstr "variable-bindings utilizza una lunghezza indefinita"
+
+#~ msgid " -l Run cupsd from launchd(8)."
+#~ msgstr " -l Avvia cupsd da launchd(8)."
+
+#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte"
+
+#~ msgid "720dpi"
+#~ msgstr "720dpi"
+
+#~ msgid "Bad printer URI."
+#~ msgstr "L'URI della stampante non è valido."
+
+#~ msgid "Enter old password:"
+#~ msgstr "Digitare la vecchia password:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Digitare di nuovo la password:"
+
+#~ msgid "Enter password:"
+#~ msgstr "Digitare la password:"
+
+#~ msgid "Looking for printer."
+#~ msgstr "Cerca una stampante."
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Nuova Stylus Color Series"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Nuova Stylus Photo Series"
+
+#~ msgid "Output for printer %s is sent to %s"
+#~ msgstr "L'output della stampante %s è stato inviato a %s"
+
+#~ msgid "Output for printer %s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "L'output della stampante %s è stato inviato alla stampante remota %s su %s"
+
+#~ msgid "Output for printer %s/%s is sent to %s"
+#~ msgstr "L'output della stampante %s/%s è stato inviato a %s"
+
+#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "L'output della stampante %s/%s è stato inviato alla stampante remota %s "
+#~ "su %s"
+
+#~ msgid "Printing page %d, %d%% complete."
+#~ msgstr "Stampa della pagina %d, %d%% completato."
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Elimina le stampe"
+
+#~ msgid ""
+#~ "Rank Owner Pri Job Files Total Size"
+#~ msgstr ""
+#~ "Rank Owner Pri Job Files Total Size"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color Series"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo Series"
+
+#~ msgid ""
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
+#~ msgstr ""
+#~ "L'attributo della descrizione del processo '%s' non può essere fornito "
+#~ "nella richiesta di creazione di un processo."
+
+#~ msgid "The output bin is almost full."
+#~ msgstr "Il raccoglitore di uscita è quasi pieno."
+
+#~ msgid "The output bin is full."
+#~ msgstr "Il raccoglitore di uscita è pieno."
+
+#~ msgid "The output bin is missing."
+#~ msgstr "Manca il raccoglitore di uscita."
+
+#~ msgid "The paper tray is almost empty."
+#~ msgstr "Il vassoio della carta è quasi vuoto."
+
+#~ msgid "The paper tray is empty."
+#~ msgstr "Il vassoio della carta è vuoto."
+
+#~ msgid "The paper tray is missing."
+#~ msgstr "Manca il vassoio della carta."
+
+#~ msgid "The paper tray needs to be filled."
+#~ msgstr "Il vassoio della carta deve essere riempito."
+
+#~ msgid "The printer is running low on ink."
+#~ msgstr "L'inchiostro della stampante sta per esaurirsi."
+
+#~ msgid "The printer is running low on toner."
+#~ msgstr "Il toner della stampante sta per esaurirsi."
+
+#~ msgid "There is a paper jam."
+#~ msgstr "Vi è un inceppamento della carta."
+
+#~ msgid "Unable to resolve printer URI."
+#~ msgstr "Non è possibile risolvere l'URI della stampante."
+
+#~ msgid "Usage: cupsfilter [ options ] filename"
+#~ msgstr "Uso: cupsfilter [ opzioni ] file"
+
+#~ msgid "Usage: lppasswd [-g groupname]"
+#~ msgstr "Uso: lppasswd [-g groupname]"
+
+#~ msgid ""
+#~ "Usage: lppasswd [-g groupname] [username]\n"
+#~ " lppasswd [-g groupname] -a [username]\n"
+#~ " lppasswd [-g groupname] -x [username]"
+#~ msgstr ""
+#~ "Uso: lppasswd [-g groupname] [username]\n"
+#~ " lppasswd [-g groupname] -a [username]\n"
+#~ " lppasswd [-g groupname] -x [username]"
+
+#~ msgid ""
+#~ "Your password must be at least 6 characters long, cannot contain your "
+#~ "username, and must contain at least one letter and number."
+#~ msgstr ""
+#~ "La password deve contenere almeno 6 caratteri, non può contenere "
+#~ "l'username e deve contenere almeno una lettera ed un numero."
+
+#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
+#~ msgstr ""
+#~ "cupsd: launchd(8) non supporta i compilati, quando è in modalità normale."
+
+#~ msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#~ msgstr "ipptool: \"-i\" e \"-n\" sono incompatibili con -X\"."
+
+#~ msgid "lppasswd: Only root can add or delete passwords."
+#~ msgstr "lppasswd: solo root può aggiungere o eliminare le password."
+
+#~ msgid "lppasswd: Password file busy."
+#~ msgstr "lppasswd: il file delle password è già in uso."
+
+#~ msgid "lppasswd: Password file not updated."
+#~ msgstr "lppasswd: il file delle password non è aggiornato."
+
+#~ msgid "lppasswd: Sorry, password doesn't match."
+#~ msgstr "lppasswd: spiacenti, la password non è esatta."
+
+#~ msgid "lppasswd: Sorry, password rejected."
+#~ msgstr "lppasswd: spiacenti, la password è stata rifiutata."
+
+#~ msgid "lppasswd: Sorry, passwords don't match."
+#~ msgstr "lppasswd: spiacenti, le password non sono esatte."
+
+#~ msgid "lppasswd: Unable to copy password string: %s"
+#~ msgstr "lppasswd: non è possibile copiare la stringa della password: %s"
+
+#~ msgid "lppasswd: Unable to open password file: %s"
+#~ msgstr "lppasswd: non è possibile aprire il file delle password: %s"
+
+#~ msgid "lppasswd: Unable to write to password file: %s"
+#~ msgstr ""
+#~ "lppasswd: non è possibile scrivere all'interno del file delle password: %s"
+
+#~ msgid "lppasswd: failed to backup old password file: %s"
+#~ msgstr ""
+#~ "lppasswd: non è possibile eseguire il backup del vecchio file delle "
+#~ "password: %s"
+
+#~ msgid "lppasswd: failed to rename password file: %s"
+#~ msgstr "lppasswd: non è possibile rinominare il file delle password: %s"
+
+#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
+#~ msgstr "lppasswd: l'utente \"%s\" ed il gruppo \"%s\" non esistono."
diff --git a/locale/cups_ja.po b/locale/cups_ja.po
index 9f6cef4..39bd735 100644
--- a/locale/cups_ja.po
+++ b/locale/cups_ja.po
@@ -26,10 +26,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: CUPS 1.6\n"
+"Project-Id-Version: CUPS 2.0\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
-"PO-Revision-Date: 2012-06-13 01:20+0900\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2014-11-15 19:27+0900\n"
"Last-Translator: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
"Language-Team: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
"Language: ja\n"
@@ -401,7 +401,7 @@ msgstr " %s ä¸æ­£ãªå€¤ãŒ cupsFilter2 ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \"%
#, c-format
msgid " %s Bad cupsICCProfile %s."
-msgstr " %s ä¸æ­£ãª cupsICCProfile %sã§ã™ã€‚"
+msgstr " %s ä¸æ­£ãª cupsICCProfile %s ã§ã™ã€‚"
#, c-format
msgid " %s Bad cupsPreFilter value \"%s\"."
@@ -409,11 +409,11 @@ msgstr " %s ä¸æ­£ãªå€¤ãŒ cupsPreFilter ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \
#, c-format
msgid " %s Bad cupsUIConstraints %s: \"%s\""
-msgstr " %s ä¸æ­£ãª cupsUIConstraints %s: \"%s\"ã§ã™ã€‚"
+msgstr " %s ä¸æ­£ãª cupsUIConstraints %s: \"%s\" ã§ã™ã€‚"
#, c-format
msgid " %s Bad language \"%s\"."
-msgstr " %s 無効ãªè¨€èªž \"%s\"ã§ã™ã€‚"
+msgstr " %s 無効ãªè¨€èªž \"%s\" ã§ã™ã€‚"
#, c-format
msgid " %s Bad permissions on %s file \"%s\"."
@@ -433,7 +433,7 @@ msgstr " %s デフォルトã®é¸æŠžè‚¢ãŒç«¶åˆã—ã¦ã„ã¾ã™ã€‚"
#, c-format
msgid " %s Empty cupsUIConstraints %s"
-msgstr " %s 空㮠cupsUIConstraints %sã§ã™ã€‚"
+msgstr " %s 空㮠cupsUIConstraints %s ã§ã™ã€‚"
#, c-format
msgid " %s Missing \"%s\" translation string for option %s, choice %s."
@@ -930,6 +930,12 @@ msgstr " 警告: ファイル㫠%%EndComments コメントãŒã‚ã‚Šã¾ã›ã‚“
msgid " Warning: obsolete DSC version %.1f in file."
msgstr " 警告: ファイルã¯æ™‚代é…れ㮠DSC ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %.1f ã§ã™ã€‚"
+msgid " ! expression Unary NOT of expression."
+msgstr "! <å¼> å¼ã‚’å¦å®šã™ã‚‹å˜é …演算å­ã€‚"
+
+msgid " ( expressions ) Group expressions."
+msgstr " ( <複数ã®å¼> ) グループ化ã•ã‚ŒãŸè¤‡æ•°ã®å¼ã€‚"
+
msgid " --[no-]debug-logging Turn debug logging on/off."
msgstr " --[no-]debug-logging デãƒãƒƒã‚°ãƒ­ã‚°ã®æœ‰åŠ¹/無効を切り替ãˆã‚‹ã€‚"
@@ -953,9 +959,92 @@ msgstr " --cr 行末を CR ã¨ã™ã‚‹ (Mac OS 9)。"
msgid " --crlf End lines with CR + LF (Windows)."
msgstr " --crlf 行末を CR + LF ã¨ã™ã‚‹ (Windows)。"
+msgid " --domain regex Match domain to regular expression."
+msgstr " --domain <æ­£è¦è¡¨ç¾> ドメインãŒæ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+" --exec <実行ファイルå> [引数 ...] ;\n"
+" æˆåŠŸã—ãŸå ´åˆã€<実行ファイルå>を実行ã™ã‚‹ã€‚"
+
+msgid " --false Always false."
+msgstr " --false 常ã«å¤±æ•—。"
+
+msgid " --help Show help."
+msgstr " --help ヘルプを表示ã™ã‚‹ã€‚"
+
+msgid " --help Show this help."
+msgstr " --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã™ã‚‹ã€‚"
+
+msgid " --host regex Match hostname to regular expression."
+msgstr " --host <æ­£è¦è¡¨ç¾> ホストåãŒæ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr " --lf 行末を LF ã¨ã™ã‚‹ (UNIX/Linux/OS X)。"
+msgid " --list-filters List filters that will be used."
+msgstr " --list-filters 使用ã•ã‚Œã‚‹ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹ã€‚"
+
+msgid " --local True if service is local."
+msgstr " --local サービスãŒãƒ­ãƒ¼ã‚«ãƒ«ãªã‚‰çœŸã€‚"
+
+msgid " --ls List attributes."
+msgstr " --ls 属性ã®ä¸€è¦§ã‚’表示ã™ã‚‹ã€‚"
+
+msgid " --name regex Match service name to regular expression."
+msgstr " --name <æ­£è¦è¡¨ç¾> サービスåãŒæ­£è¦è¡¨ç¾ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
+msgid " --not expression Unary NOT of expression."
+msgstr " --not <å¼> å¼ã‚’å¦å®šã™ã‚‹å˜é …演算å­ã€‚"
+
+msgid " --path regex Match resource path to regular expression."
+msgstr " --path <æ­£è¦è¡¨ç¾> リソースã®ãƒ‘スãŒæ­£è¦è¡¨ç¾ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+" --port 番å·[-番å·] ãƒãƒ¼ãƒˆãŒæŒ‡å®šã•ã‚ŒãŸç•ªå·ã¾ãŸã¯ç¯„囲ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
+msgid " --print Print URI if true."
+msgstr " --print çµæžœãŒçœŸãªã‚‰ URI を表示ã™ã‚‹ã€‚"
+
+msgid " --print-name Print service name if true."
+msgstr " --print-name çµæžœãŒçœŸãªã‚‰ã‚µãƒ¼ãƒ“スåを表示ã™ã‚‹ã€‚"
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+" --quiet マッãƒçµæžœã‚’終了コードã§å ±å‘Šã—ã€å‡ºåŠ›ã‚’ã—ãªã„。"
+
+msgid " --remote True if service is remote."
+msgstr " --remote サービスãŒãƒªãƒ¢ãƒ¼ãƒˆãªã‚‰çœŸã€‚"
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
+msgstr ""
+" --stop-after-include-error\n"
+" INCLUDE ãŒå¤±æ•—ã—ãŸã¨ãテストをåœæ­¢ã™ã‚‹ã€‚"
+
+msgid " --true Always true."
+msgstr " --true 常ã«çœŸã€‚"
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr " --txt <キーå> TXT レコードãŒã‚­ãƒ¼åã‚’å«ã‚“ã§ã„ãŸã‚‰çœŸã€‚"
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr ""
+" --txt-* <æ­£è¦è¡¨ç¾> TXT レコードã®ã‚­ãƒ¼ãŒæ­£è¦è¡¨ç¾ã¨ãƒžãƒƒãƒã—ãŸã‚‰çœŸã€‚"
+
+msgid " --uri regex Match URI to regular expression."
+msgstr " --uri <æ­£è¦è¡¨ç¾> URI ãŒæ­£è¦è¡¨ç¾ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
+msgid " --version Show program version."
+msgstr " --version プログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示。"
+
+msgid " --version Show version."
+msgstr " --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã™ã‚‹ã€‚"
+
msgid " -4 Connect using IPv4."
msgstr " -4 IPv4 ã§æŽ¥ç¶šã™ã‚‹ã€‚"
@@ -1002,15 +1091,29 @@ msgstr " -I {filename,filters,none,profiles}"
msgid " -L Send requests using content-length."
msgstr " -L content-length を用ã„ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ã‚‹ã€‚"
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+" -P filename.plist XML ã® plist å½¢å¼ã§æ›¸ã出ã—テストリãƒãƒ¼ãƒˆã‚’標準出力"
+"ã«ã™ã‚‹ã€‚"
+
msgid " -P filename.ppd Set PPD file."
msgstr " -P filename.ppd PPD ファイルを指定ã™ã‚‹ã€‚"
+msgid " -P number[-number] Match port to number or range."
+msgstr ""
+" -P 番å·[-番å·] ãƒãƒ¼ãƒˆãŒæŒ‡å®šã•ã‚ŒãŸç•ªå·ã¾ãŸã¯ç¯„囲ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
msgid " -R root-directory Set alternate root."
msgstr " -R root-directory 別ã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã‚’指定ã™ã‚‹ã€‚"
msgid " -S Test with SSL encryption."
msgstr " -S SSL æš—å·åŒ–ã§ãƒ†ã‚¹ãƒˆã™ã‚‹ã€‚"
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr " -T <秒> ブラウズã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’秒ã§æŒ‡å®šã™ã‚‹ã€‚"
+
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr " -T seconds å—ä¿¡ï¼é€ä¿¡ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’秒ã§æŒ‡å®šã™ã‚‹ã€‚"
@@ -1030,15 +1133,27 @@ msgstr ""
msgid " -X Produce XML plist instead of plain text."
msgstr " -X プレーンテキストã®ä»£ã‚ã‚Šã« XML を用ã„る。"
+msgid " -a Browse for all services."
+msgstr " -a ã™ã¹ã¦ã®ã‚µãƒ¼ãƒ“スをブラウズã™ã‚‹ã€‚"
+
msgid " -a Export all printers."
msgstr " -a ã™ã¹ã¦ã®ãƒ—リンターをエクスãƒãƒ¼ãƒˆã™ã‚‹ã€‚"
+msgid " -c Produce CSV output."
+msgstr " -c CSV 出力を行ã†ã€‚"
+
msgid " -c catalog.po Load the specified message catalog."
msgstr " -c catalog.po 指定ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚«ã‚¿ãƒ­ã‚°ã‚’ロードã™ã‚‹ã€‚"
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr " -c cups-files.conf cups-files.conf を利用ã™ã‚‹ã‚ˆã†è¨­å®šã™ã‚‹ã€‚"
+
msgid " -c cupsd.conf Set cupsd.conf file to use."
msgstr " -c cupsd.conf 使用ã™ã‚‹ cupsd.conf ファイルを指定ã™ã‚‹ã€‚"
+msgid " -d domain Browse/resolve in specified domain."
+msgstr " -d <ドメインå> 指定ã•ã‚ŒãŸãƒ‰ãƒ¡ã‚¤ãƒ³ã§ãƒ–ラウズ/åå‰è§£æ±ºã™ã‚‹ã€‚"
+
msgid " -d name=value Set named variable to value."
msgstr ""
" -d name=value name ã§æŒ‡å®šã•ã‚ŒãŸå¤‰æ•°ã«å€¤ value をセットã™ã‚‹ã€‚"
@@ -1049,6 +1164,9 @@ msgstr " -d output-dir 出力先ディレクトリーを指定ã™ã‚‹ã
msgid " -d printer Use the named printer."
msgstr " -d printer 指定ã•ã‚ŒãŸãƒ—リンターを利用ã™ã‚‹ã€‚"
+msgid " -d regex Match domain to regular expression."
+msgstr " -d <æ­£è¦è¡¨ç¾> ドメインãŒæ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
msgid " -e Use every filter from the PPD file."
msgstr ""
" -e PPD ファイルã‹ã‚‰ã™ã¹ã¦ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’使用ã™ã‚‹ã€‚"
@@ -1062,6 +1180,9 @@ msgstr " -f filename デフォルトã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«å
msgid " -h Show this usage message."
msgstr " -h ã“ã®ãƒ˜ãƒ«ãƒ—メッセージを表示ã™ã‚‹ã€‚"
+msgid " -h regex Match hostname to regular expression."
+msgstr " -h <æ­£è¦è¡¨ç¾> ホストåãŒæ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
msgid " -h server[:port] Specify server address."
msgstr " -h server[:port] サーãƒãƒ¼ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’指定ã™ã‚‹ã€‚"
@@ -1082,8 +1203,14 @@ msgstr ""
" -j job-id[,N] フィルターファイル N を指定ã•ã‚ŒãŸã‚¸ãƒ§ãƒ–ã‹ã‚‰ä½¿ç”¨ã™"
"る (デフォルト㯠ファイル 1)。"
-msgid " -l Run cupsd from launchd(8)."
-msgstr " -l launchd(8) ã‹ã‚‰ cupsd を実行ã™ã‚‹ã€‚"
+msgid " -l List attributes."
+msgstr " -l 属性ã®ä¸€è¦§ã‚’表示ã™ã‚‹ã€‚"
+
+msgid " -l Produce plain text output."
+msgstr " -l プレーンテキスト出力を行ã†ã€‚"
+
+msgid " -l Run cupsd on demand."
+msgstr " -l cupsd をオンデマンドã§å®Ÿè¡Œã™ã‚‹ã€‚"
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
msgstr " -l lang[,lang,...] 出力言語を指定ã™ã‚‹ã€‚(複数å¯èƒ½)"
@@ -1104,6 +1231,9 @@ msgid ""
" -n count Repeat the last file the given number of times."
msgstr " -n count 最後ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’与ãˆã‚‰ã‚ŒãŸå›žæ•°ã ã‘ç¹°ã‚Šè¿”ã™ã€‚"
+msgid " -n regex Match service name to regular expression."
+msgstr " -n <æ­£è¦è¡¨ç¾> サービスåãŒæ­£è¦è¡¨ç¾ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
msgid ""
" -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
@@ -1117,15 +1247,33 @@ msgstr ""
msgid " -o name=value Set option(s)."
msgstr " -o name=value オプションを指定ã™ã‚‹ã€‚"
+msgid " -p Print URI if true."
+msgstr " -p çµæžœãŒçœŸãªã‚‰ URI を表示ã™ã‚‹ã€‚"
+
msgid " -p filename.ppd Set PPD file."
msgstr " -p filename.ppd PPD ファイルを指定ã™ã‚‹ã€‚"
+msgid " -p program Run specified program for each service."
+msgstr ""
+" -p <プログラムå> 指定ã•ã‚ŒãŸãƒ—ログラムをãã‚Œãžã‚Œã®ã‚µãƒ¼ãƒ“スã«å¯¾ã—実行"
+"ã™ã‚‹ã€‚"
+
+msgid " -q Quietly report match via exit code."
+msgstr ""
+" -q マッãƒçµæžœã‚’終了コードã§å ±å‘Šã—ã€å‡ºåŠ›ã‚’ã—ãªã„。"
+
msgid " -q Run silently."
msgstr " -q 詳細ã¯è¡¨ç¤ºã—ãªã„。"
+msgid " -r True if service is remote."
+msgstr " -r サービスãŒãƒªãƒ¢ãƒ¼ãƒˆãªã‚‰çœŸã€‚"
+
msgid " -r Use 'relaxed' open mode."
msgstr " -r 寛容モードを用ã„る。"
+msgid " -s Print service name if true."
+msgstr " -s çµæžœãŒçœŸãªã‚‰ã‚µãƒ¼ãƒ“スåを表示ã™ã‚‹ã€‚"
+
msgid " -t Produce a test report."
msgstr " -t テストリãƒãƒ¼ãƒˆã‚’出力ã™ã‚‹ã€‚"
@@ -1135,21 +1283,105 @@ msgstr " -t PPD を出力ã—ãªã„ã§ãƒ†ã‚¹ãƒˆã™ã‚‹ã€‚"
msgid " -t Test the configuration file."
msgstr " -t 設定ファイルをテストã™ã‚‹ã€‚"
+msgid " -t key True if the TXT record contains the key."
+msgstr " -t <キーå> TXT レコードãŒã‚­ãƒ¼åã‚’å«ã‚“ã§ã„ãŸã‚‰çœŸã€‚"
+
msgid " -t title Set title."
msgstr " -t title タイトルを指定ã™ã‚‹ã€‚"
+msgid " -t type Browse/resolve with specified type."
+msgstr " -t タイプ 指定ã•ã‚ŒãŸã‚¿ã‚¤ãƒ—ã§ãƒ–ラウズ/åå‰è§£æ±ºã™ã‚‹ã€‚"
+
msgid " -u Remove the PPD file when finished."
msgstr " -u 終了ã—ãŸã¨ãã« PPD ファイルを削除ã™ã‚‹ã€‚"
+msgid " -u regex Match URI to regular expression."
+msgstr " -u <æ­£è¦è¡¨ç¾> URI ãŒæ­£è¦è¡¨ç¾ã¨ãƒžãƒƒãƒã™ã‚‹ã‹ã€‚"
+
msgid " -v Be verbose."
msgstr " -v 冗長出力を行ã†ã€‚"
msgid " -vv Be very verbose."
msgstr " -vv より冗長ãªå‡ºåŠ›ã‚’è¡Œã†ã€‚"
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
+msgstr ""
+" -x <実行ファイルå> [引数 ...] ;\n"
+" æˆåŠŸã—ãŸå ´åˆã€<実行ファイルå> を実行ã™ã‚‹ã€‚"
+
msgid " -z Compress PPD files using GNU zip."
msgstr " -z PPD ファイルを GNU zip を使ã£ã¦åœ§ç¸®ã™ã‚‹ã€‚"
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr " IPPFIND_SERVICE_DOMAIN ドメインå"
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
+msgstr ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" 完全修飾ドメインå (FQDN)"
+
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr " IPPFIND_SERVICE_NAME サービスインスタンスå"
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr " IPPFIND_SERVICE_PORT ãƒãƒ¼ãƒˆç•ªå·"
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr " IPPFIND_SERVICE_REGTYPE DNS-SD 登録タイプ"
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr " IPPFIND_SERVICE_SCHEME URI スキーム"
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr " IPPFIND_SERVICE_URI URI"
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr " IPPFIND_TXT_* TXT レコードキーã®å€¤"
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
+msgstr " <å¼> --and <å¼> è«–ç† AND。"
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr " <å¼> --or <å¼> è«–ç† OR。"
+
+msgid " expression expression Logical AND."
+msgstr " <å¼> <å¼> è«–ç† AND。"
+
+msgid " {service_domain} Domain name"
+msgstr " {service_domain} ドメインå"
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr " {service_hostname} 完全修飾ドメインå (FQDN)"
+
+msgid " {service_name} Service instance name"
+msgstr " {service_name} サービスインスタンスå"
+
+msgid " {service_port} Port number"
+msgstr " {service_port} ãƒãƒ¼ãƒˆç•ªå·"
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr " {service_regtype} DNS-SD 登録タイプ"
+
+msgid " {service_scheme} URI scheme"
+msgstr " {service_scheme} URI スキーム"
+
+msgid " {service_uri} URI"
+msgstr " {service_uri} URI"
+
+msgid " {txt_*} Value of TXT record key"
+msgstr " {txt_*} TXT レコードキーã®å€¤"
+
+msgid " {} URI"
+msgstr " {} URI"
+
msgid " FAIL"
msgstr " 失敗"
@@ -1157,14 +1389,238 @@ msgid " PASS"
msgstr " åˆæ ¼"
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f ãƒã‚¤ãƒˆ"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr "\"%s\": URI ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - %s (RFC 2911 4.1.5 節)。"
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": URI ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - é•·ã•ã®èª¤ã‚Š %d (RFC 2911 4.1.5 節)。"
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr "\"%s\": 属性åãŒèª¤ã£ã¦ã„ã¾ã™ - é•·ã•ã®èª¤ã‚Š %d (RFC 2911 4.1.3 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr "\"%s\": 属性åãŒèª¤ã£ã¦ã„ã¾ã™ - ä¸æ­£ãªæ–‡å­— (RFC 2911 4.1.3 節)。"
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": 真å½å€¤ %d ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.11 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": charset ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - ä¸æ­£ãªæ–‡å­— (RFC 2911 4.1.7 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": charset ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - ä¸æ­£ãªé•·ã• %d (RFC 2911 section "
+"4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime UTC ã®æ™‚間指定 %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime UTC ã®åˆ†æŒ‡å®š %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime UTC ã®ç¬¦å·æŒ‡å®š '%c' ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime ã®æ—¥ä»˜æŒ‡å®š %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime ã® 0.1 秒ã®æŒ‡å®š %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime ã®æ™‚間指定 %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime ã®åˆ†æŒ‡å®šãŒèª¤ã£ã¦ã„ã¾ã™ %u (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime ã®æœˆæŒ‡å®š %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": 日時ã®ç§’指定 %u ãŒèª¤ã£ã¦ã„ã¾ã™ (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr "\"%s\": enum ã®å€¤ %d ãŒèª¤ã£ã¦ã„ã¾ã™ - 範囲外ã®å€¤ (RFC 2911 4.1.4 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": keyword ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - %d (RFC 2911 section 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": keyword ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - ä¸æ­£ãªæ–‡å­— (RFC 2911 4.1.3 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": mimeMediaType ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸæ–‡å­— (RFC 2911 "
+"4.1.9 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": mimeMediaType ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - é•·ã•ã®èª¤ã‚Š %d (RFC 2911 "
+"4.1.9 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": name ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - UTF-8 ã¨ã—ã¦èª¤ã£ãŸä¸¦ã³ (RFC 2911 "
+"4.1.2 節)。"
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": name ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸé•·ã• %d (RFC 2911 section "
+"4.1.2)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": naturalLanguage ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸæ–‡å­— (RFC 2911 "
+"4.1.8 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": naturalLanguage ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸé•·ã• %d (RFC 2911 "
+"4.1.8 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": octetString 値ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸé•·ã• %d (RFC 2911 4.1.10 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": rangeOfInteger ã®å€¤ %d-%d ãŒèª¤ã£ã¦ã„ã¾ã™ - 下é™ãŒä¸Šé™ã‚ˆã‚Šã‚‚大ãã„ "
+"(RFC 2911 4.1.13 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": resolution ã®å€¤ %dx%d%s ãŒèª¤ã£ã¦ã„ã¾ã™ - å˜ä½å€¤ã®èª¤ã‚Š (RFC 2911 "
+"4.1.15 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": resolution ã®å€¤ %dx%d%s ãŒèª¤ã£ã¦ã„ã¾ã™ - 主走査解åƒåº¦ãŒè²  (RFC 2911 "
+"4.1.15 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": resolution ã®å€¤ %dx%d%s ãŒèª¤ã£ã¦ã„ã¾ã™ - 副走査解åƒåº¦ãŒè²  (RFC 2911 "
+"4.1.15 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": text ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - UTF-8 ã¨ã—ã¦èª¤ã£ãŸä¸¦ã³ (RFC 2911 "
+"4.1.1 節)。"
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": text ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - ä¸æ­£ãªé•·ã• %d (RFC 2911 4.1.1 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": uriScheme ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸæ–‡å­— (RFC 2911 4.1.6 "
+"節)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": uriScheme ã®å€¤ \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - ä¸æ­£ãªé•·ã• %d (RFC 2911 4.1.6 "
+"節)."
#, c-format
msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
msgstr "%-7s %-7.7s %-7d %-31.31s %.0f ãƒã‚¤ãƒˆ"
#, c-format
+msgid "%d x %d mm"
+msgstr "%d x %d mm"
+
+#, c-format
+msgid "%g x %g"
+msgstr "%g x %g"
+
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr "%s (%s, %s)"
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr "%s (ãµã¡ãªã—)"
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr "%s (ãµã¡ãªã—, %s)"
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr "%s (ãµã¡ãªã—, %s, %s)"
+
+#, c-format
msgid "%s accepting requests since %s"
msgstr "%s 㯠%s ã‹ã‚‰ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—ã‘付ã‘ã¦ã„ã¾ã™"
@@ -1222,6 +1678,14 @@ msgid "%s: %s failed: %s"
msgstr "%s: %s ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr "%s: -V オプションã«ãŠã„㦠%s ã¯ä¸æ­£ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚"
+
+#, c-format
msgid "%s: Don't know what to do."
msgstr "%s: 何ãŒèµ·ãã¦ã„ã‚‹ã‹ä¸æ˜Žã§ã™ã€‚"
@@ -1232,7 +1696,7 @@ msgstr "%s: エラー - 環境変数 %s ãŒå­˜åœ¨ã—ãªã„宛先 \"%s\" を指ã
#, c-format
msgid "%s: Error - add '/version=1.1' to server name."
-msgstr ""
+msgstr "%s: エラー - '/version=1.1' をサーãƒãƒ¼åã«ä»˜ä¸Žã—ã¦ãã ã•ã„。"
#, c-format
msgid "%s: Error - bad job ID."
@@ -1270,10 +1734,6 @@ msgid "%s: Error - expected destination after \"-P\" option."
msgstr "%s: エラー - \"-P\" オプションã®ã‚ã¨ã«ã¯å®›å…ˆãŒå¿…è¦ã§ã™ã€‚"
#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr "%s: エラー - \"-b\" オプションã®ã‚ã¨ã«å®›å…ˆãŒå¿…è¦ã§ã™ã€‚"
-
-#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
msgstr "%s: エラー - \"-d\" オプションã®ã‚ã¨ã«ã¯ãƒ—リンターåãŒå¿…è¦ã§ã™ã€‚"
@@ -1394,6 +1854,18 @@ msgid "%s: Invalid filter string \"%s\"."
msgstr "%s: 無効ãªãƒ•ã‚£ãƒ«ã‚¿ãƒ¼æ–‡å­—列ã§ã™ \"%s\""
#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr "%s: \"-P\" ã«ãƒ•ã‚¡ã‚¤ãƒ«åãŒã‚ã‚Šã¾ã›ã‚“。"
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr "%s: \"-T\" オプションã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr "%s: \"-V\" オプションã«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
+
+#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
msgstr "%s: '-H restart' ã®å‰ã«ã¯ã‚¸ãƒ§ãƒ– ID ('-i ジョブID') ãŒå¿…è¦ã§ã™ã€‚"
@@ -1410,6 +1882,10 @@ msgid "%s: Sorry, no encryption support."
msgstr "%s: 残念ãªãŒã‚‰ã€æš—å·åŒ–サãƒãƒ¼ãƒˆã¯ã‚³ãƒ³ãƒ‘イル時ã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ã¾ã›ã‚“。"
#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to connect to server."
msgstr "%s: サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“"
@@ -1418,10 +1894,18 @@ msgid "%s: Unable to contact server."
msgstr "%s: サーãƒãƒ¼ã«é€£çµ¡ã§ãã¾ã›ã‚“。"
#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
msgstr "%s: \"%s\" ã® MIME タイプを判別ã§ãã¾ã›ã‚“。"
#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr "%s: \"%s\" ã‚’é–‹ã‘ã¾ã›ã‚“: %s"
+
+#, c-format
msgid "%s: Unable to open %s: %s"
msgstr "%s: %s ã‚’é–‹ã‘ã¾ã›ã‚“: %s"
@@ -1435,6 +1919,10 @@ msgstr ""
"%s: \"%s\" ã¾ãŸã¯ \"%s\" ã‹ã‚‰ MIME データベースを読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。"
#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
msgid "%s: Unknown destination \"%s\"."
msgstr "%s: \"%s\" ã¯æœªçŸ¥ã®å®›å…ˆã§ã™ã€‚"
@@ -1447,6 +1935,14 @@ msgid "%s: Unknown option \"%c\"."
msgstr "%s: '%c' ã¯æœªçŸ¥ã®ã‚ªãƒ—ションã§ã™ã€‚"
#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr "%s: \"%s\" ã¯æœªçŸ¥ã®ã‚ªãƒ—ションã§ã™ã€‚"
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr "%s: \"-%c\" ã¯æœªçŸ¥ã®ã‚ªãƒ—ションã§ã™ã€‚"
+
+#, c-format
msgid "%s: Unknown source MIME type %s/%s."
msgstr "%s: %s/%s ã¯æœªçŸ¥ã®ã‚½ãƒ¼ã‚¹ MIME タイプã§ã™ã€‚"
@@ -2002,9 +2498,6 @@ msgstr "7 x 9 インãƒ"
msgid "70"
msgstr "70"
-msgid "720dpi"
-msgstr "720dpi"
-
msgid "75"
msgstr "75"
@@ -2265,7 +2758,7 @@ msgstr "B9"
#, c-format
msgid "Bad 'document-format' value \"%s\"."
-msgstr ""
+msgstr "誤ã£ãŸ 'document-format' ã®å€¤ã§ã™ \"%s\"。"
msgid "Bad NULL dests pointer"
msgstr "ä¸æ­£ãª NULL é€ä¿¡å…ˆãƒã‚¤ãƒ³ã‚¿ãƒ¼"
@@ -2291,6 +2784,9 @@ msgstr "ä¸æ­£ãª SNMP ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·"
msgid "Bad UIConstraints"
msgstr "ä¸æ­£ãª UIConstraints"
+msgid "Bad arguments to function"
+msgstr "関数ã®å¼•æ•°ãŒä¸æ­£"
+
#, c-format
msgid "Bad copies value %d."
msgstr "%d ã¯ä¸æ­£ãªã‚³ãƒ”ー値ã§ã™ã€‚"
@@ -2317,14 +2813,15 @@ msgstr "\"%s\" ã¯ä¸æ­£ãª document-format-default ã§ã™ã€‚"
msgid "Bad filename buffer"
msgstr "ä¸æ­£ãªãƒ•ã‚¡ã‚¤ãƒ«åãƒãƒƒãƒ•ã‚¡ãƒ¼ã§ã™ã€‚"
-msgid "Bad job-name value: Bad UTF-8 sequence."
-msgstr ""
+msgid "Bad hostname/address in URI"
+msgstr "URI ã®ãƒ›ã‚¹ãƒˆå/アドレスãŒä¸æ­£"
-msgid "Bad job-name value: Name too long."
-msgstr ""
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "誤ã£ãŸ job-name 値: %s"
msgid "Bad job-name value: Wrong type or count."
-msgstr ""
+msgstr "誤ã£ãŸ job-name 値: åž‹ã‹ã‚«ã‚¦ãƒ³ãƒˆãŒèª¤ã£ã¦ã„ã¾ã™ã€‚"
msgid "Bad job-priority value."
msgstr "ä¸æ­£ãª job-priority 値ã§ã™ã€‚"
@@ -2363,17 +2860,20 @@ msgstr "%d è¡Œã«ä¸æ­£ãªã‚ªãƒ—ションã¨é¸æŠžãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Bad page-ranges values %d-%d."
msgstr "%d-%d ã¯ä¸æ­£ãª page-ranges 値ã§ã™ã€‚"
+msgid "Bad port number in URI"
+msgstr "URI ã®ãƒãƒ¼ãƒˆç•ªå·ãŒä¸æ­£"
+
#, c-format
msgid "Bad port-monitor \"%s\"."
msgstr "\"%s\" ã¯ç„¡åŠ¹ãª port-monitor ã§ã™ã€‚"
-msgid "Bad printer URI."
-msgstr "ä¸æ­£ãªãƒ—リンター URI ã§ã™ã€‚"
-
#, c-format
msgid "Bad printer-state value %d."
msgstr "%d ã¯ç„¡åŠ¹ãª printer-state 値ã§ã™ã€‚"
+msgid "Bad printer-uri."
+msgstr "printer-uri ãŒä¸æ­£ã§ã™ã€‚"
+
#, c-format
msgid "Bad request ID %d."
msgstr "%d ã¯ç„¡åŠ¹ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆIDã§ã™ã€‚"
@@ -2382,12 +2882,24 @@ msgstr "%d ã¯ç„¡åŠ¹ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆIDã§ã™ã€‚"
msgid "Bad request version number %d.%d."
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå· %d.%d ã¯ç„¡åŠ¹ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã™ã€‚"
+msgid "Bad resource in URI"
+msgstr "URI ã®ãƒªã‚½ãƒ¼ã‚¹ãŒä¸æ­£"
+
+msgid "Bad scheme in URI"
+msgstr "URI ã®ã‚¹ã‚­ãƒ¼ãƒ ãŒä¸æ­£"
+
msgid "Bad subscription ID"
-msgstr "ä¸æ­£ãªã‚µãƒ–スクリプション ID ã§ã™ã€‚"
+msgstr "ä¸æ­£ãªã‚µãƒ–スクリプション ID"
+
+msgid "Bad username in URI"
+msgstr "URI ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒä¸æ­£"
msgid "Bad value string"
msgstr "値文字列ãŒã‚ã‚Šã¾ã›ã‚“"
+msgid "Bad/empty URI"
+msgstr "URI ãŒä¸æ­£ã‹ç©º"
+
msgid "Banners"
msgstr "ãƒãƒŠãƒ¼"
@@ -2407,6 +2919,9 @@ msgstr "CMYK"
msgid "CPCL Label Printer"
msgstr "CPCL ラベルプリンター"
+msgid "Cancel Jobs"
+msgstr "ジョブをキャンセル"
+
msgid "Cancel RSS Subscription"
msgstr "RSS 購読をキャンセル"
@@ -2496,7 +3011,7 @@ msgid "Darkness"
msgstr "濃ã•"
msgid "Data file sent successfully."
-msgstr "データファイルãŒæ­£å¸¸ã«é€ä¿¡ã•ã‚Œã¾ã—ãŸ"
+msgstr "データファイルãŒæ­£å¸¸ã«é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Delete Class"
msgstr "クラスã®å‰Šé™¤"
@@ -2578,6 +3093,9 @@ msgstr "設定ファイルã®ç·¨é›†"
msgid "Empty PPD file."
msgstr "PPD ファイルãŒç©ºã§ã™ã€‚"
+msgid "Encryption is not supported."
+msgstr "æš—å·åŒ–ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
#. TRANSLATORS: Banner/cover sheet after the print job.
msgid "Ending Banner"
msgstr "終了ãƒãƒŠãƒ¼"
@@ -2585,15 +3103,6 @@ msgstr "終了ãƒãƒŠãƒ¼"
msgid "English"
msgstr "English"
-msgid "Enter old password:"
-msgstr "å¤ã„パスワードを入力:"
-
-msgid "Enter password again:"
-msgstr "パスワードをå†åº¦å…¥åŠ›:"
-
-msgid "Enter password:"
-msgstr "パスワードを入力:"
-
msgid ""
"Enter your username and password or the root username and password to access "
"this page. If you are using Kerberos authentication, make sure you have a "
@@ -2762,12 +3271,18 @@ msgstr "å°ç­’ æ´‹å½¢4å·"
msgid "Envelope You4 Long Edge"
msgstr "å°ç­’ æ´‹å½¢4å· é•·è¾ºé€ã‚Š"
+msgid "Environment Variables:"
+msgstr "環境変数:"
+
msgid "Epson"
msgstr "Epson"
msgid "Error Policy"
msgstr "エラーãƒãƒªã‚·ãƒ¼"
+msgid "Error reading raster data."
+msgstr ""
+
msgid "Error sending raster data."
msgstr "ラスターデータã®é€ä¿¡ã§ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—ãŸã€‚"
@@ -2813,6 +3328,9 @@ msgstr "予測ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Export Printers to Samba"
msgstr "Samba ã¸ãƒ—リンターをエクスãƒãƒ¼ãƒˆ"
+msgid "Expressions:"
+msgstr "å¼:"
+
msgid "FAIL"
msgstr "失敗"
@@ -2928,6 +3446,9 @@ msgstr "IPP ã®æ•´æ•°å€¤ã¯æƒ³å®šã•ã‚ŒãŸ 4 ãƒã‚¤ãƒˆã«ãªã£ã¦ã„ã¾ã›ã‚“ã€
msgid "IPP language length overflows value."
msgstr "IPP ã® language length ã®å€¤ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ã—ã¦ã„ã¾ã™ã€‚"
+msgid "IPP language length too large."
+msgstr "IPP ã® language ã®é•·ã•ãŒé•·ã™ãŽã¾ã™ã€‚"
+
msgid "IPP member name is not empty."
msgstr "IPP ã®ãƒ¡ãƒ³ãƒãƒ¼åãŒç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -2935,7 +3456,7 @@ msgid "IPP memberName value is empty."
msgstr "IPP ã® memberName ã®å€¤ãŒç©ºã§ã™ã€‚"
msgid "IPP memberName with no attribute."
-msgstr ""
+msgstr "IPP ã® memberName ã«å±žæ€§ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "IPP name larger than 32767 bytes."
msgstr "IPP å㌠32767 ãƒã‚¤ãƒˆã‚ˆã‚Šå¤§ãã„ã§ã™ã€‚"
@@ -2943,6 +3464,9 @@ msgstr "IPP å㌠32767 ãƒã‚¤ãƒˆã‚ˆã‚Šå¤§ãã„ã§ã™ã€‚"
msgid "IPP nameWithLanguage value less than minimum 4 bytes."
msgstr "IPP ã® nameWithLanguage ãŒæœ€å°å€¤ 4 ãƒã‚¤ãƒˆæœªæº€ã§ã™ã€‚"
+msgid "IPP octetString length too large."
+msgstr "IPP ã® octetString ã®é•·ã•ãŒå¤§ãã™ãŽã¾ã™ã€‚"
+
msgid "IPP rangeOfInteger value not 8 bytes."
msgstr "IPP ã® rangeOfInteger ã¯æƒ³å®šã•ã‚ŒãŸ 8 ãƒã‚¤ãƒˆã«ãªã£ã¦ã„ã¾ã›ã‚“。"
@@ -3003,6 +3527,9 @@ msgstr "Internet Postage 3-Part"
msgid "Internet Printing Protocol"
msgstr "インターãƒãƒƒãƒˆå°åˆ·ãƒ—ロトコル"
+msgid "Invalid media name arguments."
+msgstr "無効ãªãƒ¡ãƒ‡ã‚£ã‚¢å引数ã§ã™ã€‚"
+
msgid "Invalid media size."
msgstr "無効ãªãƒ¡ãƒ‡ã‚£ã‚¢ã‚µã‚¤ã‚ºã§ã™ã€‚"
@@ -3150,13 +3677,16 @@ msgid "Line longer than the maximum allowed (255 characters)"
msgstr "1 è¡ŒãŒæœ€å¤§å€¤ (255 文字) を超ãˆã¦ã„ã¾ã™"
msgid "List Available Printers"
-msgstr "使用å¯èƒ½ãªãƒ—リンターをリスト化"
+msgstr "使用å¯èƒ½ãªãƒ—リンター一覧"
+
+msgid "Load paper."
+msgstr "用紙を補給ã—ã¦ãã ã•ã„。"
msgid "Long-Edge (Portrait)"
msgstr "長辺給紙 (縦å‘ã)"
-msgid "Looking for printer."
-msgstr "プリンターを探ã—ã¦ã„ã¾ã™ã€‚"
+msgid "Looking for printer..."
+msgstr ""
msgid "Manual Feed"
msgstr "手差ã—"
@@ -3219,6 +3749,12 @@ msgstr "requesting-user-name 属性ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Missing required attributes."
msgstr "å¿…é ˆã®å±žæ€§ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgid "Missing resource in URI"
+msgstr "URI ã®ãƒªã‚½ãƒ¼ã‚¹ãŒãªã„"
+
+msgid "Missing scheme in URI"
+msgstr "URI ã®ã‚¹ã‚­ãƒ¼ãƒ ãŒãªã„"
+
#, c-format
msgid "Missing value on line %d."
msgstr "%d è¡Œã«å€¤ãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -3244,6 +3780,9 @@ msgstr ""
" プリンタードライãƒãƒ¼ = %s\n"
" デãƒã‚¤ã‚¹ ID = %s"
+msgid "Modifiers:"
+msgstr "修飾å­:"
+
msgid "Modify Class"
msgstr "クラスã®å¤‰æ›´"
@@ -3271,12 +3810,6 @@ msgstr "入れå­ã«ãªã£ãŸã‚¯ãƒ©ã‚¹ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Never"
msgstr "Never"
-msgid "New Stylus Color Series"
-msgstr "New Stylus Color シリーズ"
-
-msgid "New Stylus Photo Series"
-msgstr "New Stylus Photo シリーズ"
-
msgid "No"
msgstr "ã„ã„ãˆ"
@@ -3295,6 +3828,9 @@ msgstr "Windows プリンタードライãƒãƒ¼ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã
msgid "No active connection"
msgstr "アクティブãªæŽ¥ç¶šã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "No active connection."
+msgstr "アクティブãªæŽ¥ç¶šã¯ã‚ã‚Šã¾ã›ã‚“。"
+
#, c-format
msgid "No active jobs on %s."
msgstr "%s ã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¸ãƒ§ãƒ–ã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -3309,14 +3845,13 @@ msgid "No community name"
msgstr "コミュニティåãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No default printer."
-msgstr "デフォルトã®ãƒ—リンターã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "デフォルトã®ãƒ—リンターã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "No destinations added."
-msgstr "追加ã•ã‚ŒãŸå®›å…ˆã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "追加ã•ã‚ŒãŸå®›å…ˆã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
-msgstr ""
-"ERROR: argv[0] ã¾ãŸã¯ 環境変数 DEVICE_URI ã«ãƒ‡ãƒã‚¤ã‚¹ URI ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+msgstr "argv[0] ã¾ãŸã¯ 環境変数 DEVICE_URI ã«ãƒ‡ãƒã‚¤ã‚¹ URI ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
msgid "No error-index"
msgstr "エラーインデックスãŒã‚ã‚Šã¾ã›ã‚“"
@@ -3328,26 +3863,35 @@ msgid "No file in print request."
msgstr "å°åˆ·ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "No modification time"
-msgstr "変更時刻ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgstr "変更時刻ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No name OID"
msgstr "OID åãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No pages were found."
-msgstr "ERROR: ページãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+msgstr " ページãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
msgid "No printer name"
-msgstr "プリンターåãŒã‚ã‚Šã¾ã›ã‚“。"
+msgstr "プリンターåãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No printer-uri found"
-msgstr "プリンター URI ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+msgstr "プリンター URI ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "No printer-uri found for class"
-msgstr "クラスã®ãƒ—リンター URI ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+msgstr "クラスã®ãƒ—リンター URI ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "No printer-uri in request."
msgstr "プリンター URI ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "No request URI."
+msgstr "リクエスト URI ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "No request protocol version."
+msgstr "リクエストプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "No request sent."
+msgstr "リクエストãŒé€ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "No request-id"
msgstr "リクエストID ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -3444,21 +3988,14 @@ msgstr "メモリーãŒè¶³ã‚Šã¾ã›ã‚“。"
msgid "Output Mode"
msgstr "出力モード"
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr "プリンター %s ã®å‡ºåŠ›ã¯ %s ã«é€ã‚‰ã‚Œã¾ã™"
+msgid "Output bin is almost full."
+msgstr "排紙ビンãŒã»ã¨ã‚“ã©æº€æ¯ã§ã™ã€‚"
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr "プリンター %s ã®å‡ºåŠ›ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ—リンター %s (%s 上) ã«é€ã‚‰ã‚Œã¾ã™"
+msgid "Output bin is full."
+msgstr "排紙ビンãŒæº€æ¯ã§ã™ã€‚"
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr "プリンター %s/%s ã®å‡ºåŠ›ã¯ %s ã«é€ã‚‰ã‚Œã¾ã™"
-
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
-msgstr "プリンター %s/%s ã®å‡ºåŠ›ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ—リンター %s (%s 上) ã«é€ã‚‰ã‚Œã¾ã™"
+msgid "Output bin is missing."
+msgstr "排紙ビンãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "PASS"
msgstr "åˆæ ¼"
@@ -3490,6 +4027,18 @@ msgstr "パケット㌠Get-Response-PDU ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“"
msgid "Packet does not start with SEQUENCE"
msgstr "パケット㌠SEQUENCE ã‹ã‚‰å§‹ã¾ã‚Šã¾ã›ã‚“"
+msgid "Paper jam."
+msgstr "用紙詰ã¾ã‚Šã§ã™ã€‚"
+
+msgid "Paper tray is almost empty."
+msgstr "給紙トレイãŒã»ã¨ã‚“ã©ç©ºã§ã™ã€‚"
+
+msgid "Paper tray is empty."
+msgstr "給紙トレイãŒç©ºã§ã™ã€‚"
+
+msgid "Paper tray is missing."
+msgstr "給紙トレイãŒã‚ã‚Šã¾ã›ã‚“。"
+
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
@@ -3543,6 +4092,9 @@ msgstr "往復ãƒã‚¬ã‚­ 長辺é€ã‚Š"
msgid "Postcard Long Edge"
msgstr "ãƒã‚¬ã‚­ 長辺é€ã‚Š"
+msgid "Preparing to print."
+msgstr "å°åˆ·æº–備中ã§ã™ã€‚"
+
msgid "Print Density"
msgstr "å°åˆ·å¯†åº¦"
@@ -3570,25 +4122,18 @@ msgstr "プリントã—ã¦ã‚«ãƒƒãƒˆ"
msgid "Print and Tear"
msgstr "プリントã—ã¦åˆ‡ã‚Šå–ã‚‹"
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr "プリントファイルをå—ã‘付ã‘ã¾ã—㟠- ジョブ ID %d。"
-
-msgid "Print file accepted - job ID unknown."
-msgstr "NOTICE: プリントファイルをå—ã‘付ã‘ã¾ã—㟠- ジョブ ID ä¸æ˜Žã€‚"
-
msgid "Print file sent."
msgstr "プリントファイルãŒé€ã‚‰ã‚Œã¾ã—ãŸã€‚"
-msgid "Print file was not accepted."
-msgstr "プリントファイルãŒå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚"
-
msgid "Print job canceled at printer."
msgstr "å°åˆ·ã‚¸ãƒ§ãƒ–ã¯ãƒ—リンターã§ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Print job too large."
msgstr "å°åˆ·ã‚¸ãƒ§ãƒ–ãŒå¤§ãã™ãŽã¾ã™ã€‚"
+msgid "Print job was not accepted."
+msgstr "å°åˆ·ã‚¸ãƒ§ãƒ–ãŒå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "Printer Added"
msgstr "追加ã•ã‚ŒãŸãƒ—リンター"
@@ -3610,6 +4155,9 @@ msgstr "プリンター設定"
msgid "Printer cannot print supplied content."
msgstr "プリンターã¯å—ä¿¡ã—ãŸå†…容をå°åˆ·ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "Printer cannot print with supplied options."
+msgstr "指定ã•ã‚ŒãŸã‚ªãƒ—ションã§ã¯ãƒ—リンターã¯å°åˆ·ã§ãã¾ã›ã‚“。"
+
msgid "Printer:"
msgstr "プリンター:"
@@ -3617,11 +4165,8 @@ msgid "Printers"
msgstr "プリンター"
#, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr "ページ %d ã‚’å°åˆ·ä¸­ã€%d%% 完了ã—ã¾ã—ãŸã€‚"
-
-msgid "Purge Jobs"
-msgstr "ジョブã®å‰Šé™¤"
+msgid "Printing page %d, %u%% complete."
+msgstr "ページ %d, %u%% ã®å°åˆ·ãŒå®Œäº†ã—ã¾ã—ãŸã€‚"
msgid "Quarto"
msgstr "Quarto"
@@ -3632,12 +4177,6 @@ msgstr "クォータã®åˆ¶é™ã«é”ã—ã¾ã—ãŸã€‚"
msgid "Rank Owner Job File(s) Total Size"
msgstr "ランク 所有者 ジョブ ファイル åˆè¨ˆã‚µã‚¤ã‚º"
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank Owner Pri Job Files Total Size"
-msgstr ""
-"ランク 所有者 優先 ジョブ ファイル åˆè¨ˆã‚µã‚¤ã‚º"
-
msgid "Reject Jobs"
msgstr "ジョブã®æ‹’å¦"
@@ -3698,6 +4237,9 @@ msgstr "開始ã•ã‚ŒãŸã‚µãƒ¼ãƒãƒ¼"
msgid "Server Stopped"
msgstr "åœæ­¢ã•ã‚ŒãŸã‚µãƒ¼ãƒãƒ¼"
+msgid "Server credentials not set."
+msgstr "サーãƒãƒ¼è¨¼æ˜Žæ›¸ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
msgid "Service Unavailable"
msgstr "利用ã§ããªã„サービス"
@@ -3743,16 +4285,13 @@ msgstr "ページ %d を開始ã—ã¦ã„ã¾ã™ã€‚"
msgid "Statement"
msgstr "記述"
-msgid "Stylus Color Series"
-msgstr "Stylus Color シリーズ"
-
-msgid "Stylus Photo Series"
-msgstr "Stylus Photo シリーズ"
-
#, c-format
msgid "Subscription #%d does not exist."
msgstr "ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ç•ªå· %d ã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
+msgid "Substitutions:"
+msgstr "ç½®æ›:"
+
msgid "Super A"
msgstr "スーパー A"
@@ -3784,13 +4323,16 @@ msgid "Tear-Off Adjust Position"
msgstr "Tear-Off ä½ç½®èª¿ç¯€"
#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr "å°åˆ·ã‚¸ãƒ§ãƒ–ã« \"%s\" 属性ãŒå¿…è¦ã§ã™ã€‚"
+
+#, c-format
msgid "The %s attribute cannot be provided with job-ids."
msgstr "%s 属性ã¯ã€ã‚¸ãƒ§ãƒ– ID ã¨ä¸€ç·’ã«ä½¿ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#, c-format
msgid ""
-"The '%s' Job Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
msgstr ""
#, c-format
@@ -3813,8 +4355,8 @@ msgid ""
"The class name may only contain up to 127 printable characters and may not "
"contain spaces, slashes (/), or the pound sign (#)."
msgstr ""
-"クラスå㯠127 文字以内ã®è¡¨ç¤ºå¯èƒ½æ–‡å­—ã‹ã‚‰ãªã‚Šã€ç©ºç™½ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (/)ã€ã‚·ãƒ£ãƒ¼"
-"プ (#) ã‚’å«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“。"
+"クラスå㯠127 文字以内ã®è¡¨ç¤ºå¯èƒ½æ–‡å­—ã‹ã‚‰ãªã‚Šã€ç©ºç™½ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (/)ã€ãƒãƒƒ"
+"シュ (#) ã‚’å«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“。"
msgid "The developer unit needs to be replaced."
msgstr "ç¾åƒãƒ¦ãƒ‹ãƒƒãƒˆã®äº¤æ›ãŒå¿…è¦ã§ã™ã€‚"
@@ -3844,40 +4386,21 @@ msgstr "感光体ã®äº¤æ›ãŒå¿…è¦ã§ã™ã€‚"
msgid "The optical photoconductor will need to be replaced soon."
msgstr "ã‚‚ã†ã™ã感光体ã®äº¤æ›æ™‚期ã§ã™ã€‚"
-msgid "The output bin is almost full."
-msgstr "排紙トレイãŒã»ã¨ã‚“ã©ä¸€æ¯ã§ã™ã€‚"
-
-msgid "The output bin is full."
-msgstr "排紙トレイãŒä¸€æ¯ã§ã™ã€‚"
-
-msgid "The output bin is missing."
-msgstr "排紙トレイãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
-
-msgid "The paper tray is almost empty."
-msgstr "用紙トレイãŒç©ºã«ãªã‚Šã‹ã‘ã¦ã„ã¾ã™ã€‚"
-
-msgid "The paper tray is empty."
-msgstr "用紙トレイãŒç©ºã§ã™ã€‚"
-
-msgid "The paper tray is missing."
-msgstr "用紙トレイãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
-
-msgid "The paper tray needs to be filled."
-msgstr "用紙トレイã«è£œå……ãŒå¿…è¦ã§ã™ã€‚"
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr "プリンター URI ãŒèª¤ã£ã¦ã„ã‚‹ã‹ã€ã‚‚ã†å­˜åœ¨ã—ã¾ã›ã‚“。"
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr "プリンターã®è¨­å®šãŒæ­£ã—ããªã„ã‹ãƒ—リンターã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã›ã‚“。"
msgid "The printer did not respond."
msgstr "プリンターãŒå¿œç­”ã—ã¾ã›ã‚“。"
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr "プリンター㌠IPP/%d.%d をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。IPP/%s を試ã—ã¾ã™ã€‚"
-
msgid "The printer is in use."
msgstr "プリンターã¯ä½¿ç”¨ä¸­ã§ã™ã€‚"
+msgid "The printer is low on ink."
+msgstr "インク残é‡ãŒæ®‹ã‚Šå°‘ãªããªã£ã¦ã„ã¾ã™ã€‚"
+
+msgid "The printer is low on toner."
+msgstr "トナー残é‡ãŒæ®‹ã‚Šå°‘ãªããªã£ã¦ã„ã¾ã™ã€‚"
+
msgid "The printer is not connected."
msgstr "プリンターã¯æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -3893,12 +4416,6 @@ msgstr "プリンターã¯ç¾åœ¨ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚"
msgid "The printer is offline."
msgstr "プリンターã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚"
-msgid "The printer is running low on ink."
-msgstr "プリンターã®ã‚¤ãƒ³ã‚¯ãŒã‚‚ã†ã™ããªããªã‚Šã¾ã™ã€‚"
-
-msgid "The printer is running low on toner."
-msgstr "プリンターã®ãƒˆãƒŠãƒ¼ãŒã‚‚ã†ã™ããªããªã‚Šã¾ã™ã€‚"
-
msgid "The printer is unreachable at this time."
msgstr "プリンターã«ã¯ç¾åœ¨åˆ°é”ã§ãã¾ã›ã‚“。"
@@ -3915,8 +4432,8 @@ msgid ""
"The printer name may only contain up to 127 printable characters and may not "
"contain spaces, slashes (/), or the pound sign (#)."
msgstr ""
-"プリンターå㯠127 文字以内ã®è¡¨ç¤ºå¯èƒ½æ–‡å­—ã‹ã‚‰æˆã‚Šã€ç©ºç™½ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (/)ã€ãƒãƒ³"
-"ãƒ‰è¨˜å· (#) ã‚’å«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“。"
+"プリンターå㯠127 文字以内ã®è¡¨ç¤ºå¯èƒ½æ–‡å­—ã‹ã‚‰æˆã‚Šã€ç©ºç™½ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (/)ã€ãƒãƒƒ"
+"シュ (#) ã‚’å«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“。"
msgid "The printer or class does not exist."
msgstr "プリンターã¾ãŸã¯ã‚¯ãƒ©ã‚¹ã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
@@ -3962,8 +4479,8 @@ msgid ""
"The subscription name may not contain spaces, slashes (/), question marks "
"(?), or the pound sign (#)."
msgstr ""
-"サブスクリプションåã«ã¯ã€ã‚¹ãƒšãƒ¼ã‚¹ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (/)ã€ç–‘å•åºœ (?)ã€ãƒãƒ³ãƒ‰è¨˜å· "
-"(#) を使用ã—ãªã„ã§ãã ã•ã„。"
+"サブスクリプションåã«ã¯ã€ã‚¹ãƒšãƒ¼ã‚¹ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (/)ã€ç–‘å•åºœ (?)ã€ãƒãƒƒã‚·ãƒ¥ (#) "
+"を使用ã—ãªã„ã§ãã ã•ã„。"
msgid ""
"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
@@ -3979,9 +4496,6 @@ msgstr "which-jobs ã®å€¤ \"%s\" ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "There are too many subscriptions."
msgstr "サブスクリプションãŒå¤šã™ãŽã¾ã™ã€‚"
-msgid "There is a paper jam."
-msgstr "用紙ã¥ã¾ã‚ŠãŒç™ºç”Ÿã—ã¦ã„ã¾ã™ã€‚"
-
msgid "There was an unrecoverable USB error."
msgstr "回復ä¸å¯èƒ½ãª USB ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¦ã„ã¾ã™ã€‚"
@@ -4020,6 +4534,9 @@ msgstr "トレイ 4"
msgid "URI Too Long"
msgstr "URI ãŒé•·ã™ãŽã¾ã™"
+msgid "URI too large"
+msgstr "URI ãŒé•·ã™ãŽã‚‹"
+
msgid "US Ledger"
msgstr "US レジャー"
@@ -4051,7 +4568,7 @@ msgid "Unable to access help file."
msgstr "ヘルプファイルã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。"
msgid "Unable to add RSS subscription"
-msgstr " RSS 購読を追加ã§ãã¾ã›ã‚“"
+msgstr "RSS 購読を追加ã§ãã¾ã›ã‚“"
msgid "Unable to add class"
msgstr "クラスを追加ã§ãã¾ã›ã‚“"
@@ -4090,6 +4607,14 @@ msgstr "printer-is-shared 属性を変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
msgid "Unable to change server settings"
msgstr "サーãƒãƒ¼ã®è¨­å®šã‚’変更ã§ãã¾ã›ã‚“"
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr "mimeMediaType ã®æ­£è¦è¡¨ç¾ã‚’解釈ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s。"
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr "naturalLanguage ã®æ­£è¦è¡¨ç¾ã‚’解釈ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s。"
+
msgid "Unable to configure printer options."
msgstr "プリンターオプションを設定ã§ãã¾ã›ã‚“。"
@@ -4132,11 +4657,11 @@ msgstr ""
msgid "Unable to copy interface script - %s"
msgstr "インターフェイススクリプトをコピーã§ãã¾ã›ã‚“ - %s"
-msgid "Unable to create compressed print file"
-msgstr "圧縮プリントファイルを作æˆã§ãã¾ã›ã‚“"
-
msgid "Unable to create printer-uri"
-msgstr "printer-uri を作æˆã§ãã¾ã›ã‚“。"
+msgstr "printer-uri を作æˆã§ãã¾ã›ã‚“"
+
+msgid "Unable to create server credentials."
+msgstr "サーãƒãƒ¼è¨¼æ˜Žæ›¸ã‚’作æˆã§ãã¾ã›ã‚“。"
msgid "Unable to create temporary file"
msgstr "テンãƒãƒ©ãƒªãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã§ãã¾ã›ã‚“"
@@ -4151,7 +4676,7 @@ msgid "Unable to do maintenance command"
msgstr "メンテナンスコマンドを実行ã§ãã¾ã›ã‚“"
msgid "Unable to edit cupsd.conf files larger than 1MB"
-msgstr "1MB 以上㮠cupsd.conf ファイルã¯ç·¨é›†ã§ãã¾ã›ã‚“。"
+msgstr "1MB 以上㮠cupsd.conf ファイルã¯ç·¨é›†ã§ãã¾ã›ã‚“"
msgid ""
"Unable to establish a secure connection to host (certificate chain invalid)."
@@ -4190,8 +4715,8 @@ msgstr "ジョブã®å®›å…ˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Unable to find printer."
msgstr "プリンターãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
-msgid "Unable to generate compressed print file"
-msgstr "圧縮プリントファイルを生æˆã§ãã¾ã›ã‚“"
+msgid "Unable to find server credentials."
+msgstr "サーãƒãƒ¼è¨¼æ˜Žæ›¸ã‚’見ã¤ã‘られã¾ã›ã‚“。"
msgid "Unable to get backend exit status."
msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®çµ‚了ステータスをå–å¾—ã§ãã¾ã›ã‚“。"
@@ -4253,9 +4778,6 @@ msgstr "複数ã®ã‚¸ãƒ§ãƒ–を移動ã§ãã¾ã›ã‚“"
msgid "Unable to open PPD file"
msgstr "PPD ファイルを読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“"
-msgid "Unable to open compressed print file"
-msgstr "圧縮プリントファイルを開ã‘ã¾ã›ã‚“"
-
msgid "Unable to open cupsd.conf file:"
msgstr "cupsd.conf ファイルを開ã‘ã¾ã›ã‚“:"
@@ -4281,8 +4803,11 @@ msgstr "テストページをå°åˆ·ã§ãã¾ã›ã‚“"
msgid "Unable to read print data."
msgstr "プリントデータを読ã¿è¾¼ã‚ã¾ã›ã‚“。"
-msgid "Unable to resolve printer URI."
-msgstr "プリンター URI を解決ã§ãã¾ã›ã‚“。"
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr "printer-uri を解決ã§ãã¾ã›ã‚“。"
#, c-format
msgid "Unable to run \"%s\": %s"
@@ -4371,6 +4896,15 @@ msgstr "\"%s\" ã¯æœªçŸ¥ã® printer-error-policy ã§ã™ã€‚"
msgid "Unknown printer-op-policy \"%s\"."
msgstr "\"%s\" ã¯æœªçŸ¥ã® printer-op-policy ã§ã™ã€‚"
+msgid "Unknown request method."
+msgstr "未知ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ–¹æ³•ã§ã™ã€‚"
+
+msgid "Unknown request version."
+msgstr "未知ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚"
+
+msgid "Unknown scheme in URI"
+msgstr "URI ã«æœªçŸ¥ã®ã‚¹ã‚­ãƒ¼ãƒžãŒã‚ã‚Šã¾ã™"
+
msgid "Unknown service name."
msgstr "未知ã®ã‚µãƒ¼ãƒ“スåã§ã™ã€‚"
@@ -4380,14 +4914,14 @@ msgstr "\"%s\" ã¯æœªçŸ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚ªãƒ—ション値ã§ã™ã€‚"
#, c-format
msgid "Unsupported 'compression' value \"%s\"."
-msgstr ""
+msgstr "\"%s\" ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ 'compression' ã®å€¤ã§ã™ã€‚"
#, c-format
msgid "Unsupported 'document-format' value \"%s\"."
-msgstr ""
+msgstr "\"%s\" ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ 'document-format' ã®å€¤ã§ã™ã€‚"
msgid "Unsupported 'job-name' value."
-msgstr ""
+msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ 'job-name' ã®å€¤ã§ã™ã€‚"
#, c-format
msgid "Unsupported character set \"%s\"."
@@ -4473,11 +5007,11 @@ msgstr "Usage: cupsctl [オプション] [パラメータ=値 ... パラメーã‚
msgid "Usage: cupsd [options]"
msgstr "使ã„æ–¹: cupsd [オプション]"
-msgid "Usage: cupsfilter [ options ] filename"
-msgstr "使ã„æ–¹: cupsfilter [オプション] ファイルå"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr "使ã„æ–¹: cupsfilter [ オプション ] [ -- ] ファイルå"
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
-msgstr "使ã„æ–¹: cupstestdsc [オプション] filename.ps [... filename.ps]"
+msgstr "使ã„æ–¹: cupstestdsc [オプション] ファイルå.ps [... ファイルå.ps]"
msgid ""
"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
@@ -4485,6 +5019,28 @@ msgstr ""
"使ã„æ–¹: cupstestppd [オプション] ファイルå1.ppd[.gz] [... ファイルåN.ppd[."
"gz]]"
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"使ã„æ–¹: ippdiscover [オプション] -a\n"
+" ippdiscover [オプション] \"サービスå\"\n"
+"\n"
+"オプション:"
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+"使ã„æ–¹: ippfind [オプション] 登録タイプ[,サブタイプ][.ドメイン.] ... [å¼]\n"
+" ippfind [オプション] åå‰[.登録タイプ[.ドメイン.]] ... [å¼]\n"
+" ippfind --help\n"
+" ippfind --version"
+
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr "使ã„æ–¹: ipptool [オプション] URI ファイルå [ ... ファイルåN ]"
@@ -4502,18 +5058,6 @@ msgstr ""
" lpoptions [-h サーãƒãƒ¼] [-E] -p プリンター -o オプション[=値] ...\n"
" lpoptions [-h サーãƒãƒ¼] [-E] -x プリンター"
-msgid "Usage: lppasswd [-g groupname]"
-msgstr "使ã„æ–¹: lppasswd [-g グループå]"
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
-msgstr ""
-"使ã„æ–¹: lppasswd [-g グループå] [ユーザーå]\n"
-" lppasswd [-g グループå] -a [ユーザーå]\n"
-" lppasswd [-g グループå] -x [ユーザーå]"
-
msgid ""
"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
msgstr ""
@@ -4538,7 +5082,7 @@ msgstr ""
"drv ]"
msgid "Usage: snmp [host-or-ip-address]"
-msgstr "使ã„æ–¹: snmp [ホストã¾ãŸã¯IPアドレス]"
+msgstr "使ã„æ–¹: snmp [ホストåã¾ãŸã¯IPアドレス]"
msgid "Value uses indefinite length"
msgstr "値ã¯ä¸å®šé•·ã§ã™"
@@ -4575,13 +5119,6 @@ msgstr ""
"ã“ã®ãƒšãƒ¼ã‚¸ã«ã¯ URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ã£ã¦ã‚¢"
"クセスã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-"パスワードã¯å°‘ãªãã¨ã‚‚ 6 文字以上ã§ã€ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’å«ã‚“ã§ã¯ãªã‚‰ãšã€å°‘ãª"
-"ãã¨ã‚‚ 1 ã¤ã®è‹±å­—ãŠã‚ˆã³æ•°å€¤ã‚’å«ã‚“ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-
msgid "ZPL Label Printer"
msgstr "ZPL ラベルプリンター"
@@ -4627,15 +5164,21 @@ msgstr "cupsd: \"-c\" オプションã®ã‚ã¨ã«ã¯è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«åãŒå¿…è
msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
msgstr ""
+"cupsd: cups-files.conf ファイルå㯠\"-s\" オプションã®å¾Œã‚ã«ã‚ã‚‹ã¹ãã§ã™ã€‚"
-msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
msgstr ""
+"cupsd: オンデマンドサãƒãƒ¼ãƒˆæœ‰åŠ¹ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã›ã‚“ã€æ¨™æº–モードã§å‹•ä½œã—"
+"ã¾ã™ã€‚"
+
+msgid "cupsd: Relative cups-files.conf filename not allowed."
+msgstr "cupsd: 相対パスã§ã® cups-files.conf ã®æŒ‡å®šã¯ã§ãã¾ã›ã‚“。"
msgid "cupsd: Unable to get current directory."
msgstr "cupsd: カレントディレクトリーをå–å¾—ã§ãã¾ã›ã‚“。"
msgid "cupsd: Unable to get path to cups-files.conf file."
-msgstr ""
+msgstr "cupsd: cups-files.conf ファイルã¸ã®ãƒ‘スãŒå–å¾—ã§ãã¾ã›ã‚“。"
#, c-format
msgid "cupsd: Unknown argument \"%s\" - aborting."
@@ -4645,11 +5188,6 @@ msgstr "cupsd: \"%s\" ã¯æœªçŸ¥ã®å¼•æ•°ã§ã™ - åœæ­¢ã—ã¾ã™ã€‚"
msgid "cupsd: Unknown option \"%c\" - aborting."
msgstr "cupsd: \"%c\" ã¯æœªçŸ¥ã®ã‚ªãƒ—ションã§ã™ - åœæ­¢ã—ã¾ã™ã€‚"
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-"cupsd: launchd(8) サãƒãƒ¼ãƒˆãŒã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„ã®ã§ã€é€šå¸¸ãƒ¢ãƒ¼ãƒ‰ã§å‹•ä½œã—ã¾"
-"ã™ã€‚"
-
#, c-format
msgid "cupsfilter: Invalid document number %d."
msgstr "cupsfilter: ä¸æ­£ãªæ–‡æ›¸ç•ªå· %d ã§ã™ã€‚"
@@ -4694,16 +5232,89 @@ msgstr "help\t\tコマンドã®ãƒ˜ãƒ«ãƒ—ã‚’å–得。"
msgid "idle"
msgstr "待機中"
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr "ipptool: \"-i\" 㨠\"-n\" 㯠\"-X\" ã¨çµ„ã¿åˆã‚ã›ã‚‰ã‚Œã¾ã›ã‚“。"
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr "ippfind: ä¸æ­£ãªæ­£è¦è¡¨ç¾ã§ã™: %s"
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr "ippfind: --and 㯠--or ã®ã‚ã¨ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#, c-format
-msgid "ipptool: Bad URI - %s."
-msgstr "ipptool: ä¸æ­£ãª URI ã§ã™ - %s。"
+msgid "ippfind: Expected key name after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ã‚­ãƒ¼åãŒå¿…è¦ã§ã™ã€‚"
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr "ipptool: \"-V\" オプションã«ä¸æ­£ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€‚"
+msgid "ippfind: Expected port range after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ãƒãƒ¼ãƒˆç¯„囲ãŒå¿…è¦ã§ã™ã€‚"
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ãƒ—ログラムåãŒå¿…è¦ã§ã™ã€‚"
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ã‚»ãƒŸã‚³ãƒ­ãƒ³ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr "ippfind: ç½®æ›æ–‡å­—列ã®é–‰ã˜ã‚«ãƒƒã‚³ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "ippfind: Missing close parenthesis."
+msgstr "ippfind: é–‰ã˜ã‚«ãƒƒã‚³ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr "ippfind: \"--and\" ã®å‰ã«ã¯å¼ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr "ippfind: \"--or\" ã®å‰ã«ã¯å¼ãŒå¿…è¦ã§ã™ã€‚"
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ã‚­ãƒ¼åãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "ippfind: Missing open parenthesis."
+msgstr "ippfind: é–‹ãカッコãŒè¶³ã‚Šã¾ã›ã‚“。"
+
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ãƒ—ログラムåãŒå¿…è¦ã§ã™ã€‚"
+
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯æ­£è¦è¡¨ç¾ãŒå¿…è¦ã§ã™ã€‚"
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr "ippfind: %s ã®ã‚ã¨ã«ã¯ã‚»ãƒŸã‚³ãƒ­ãƒ³ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "ippfind: Out of memory."
+msgstr "ippfind: メモリä¸è¶³ã§ã™ã€‚"
+
+msgid "ippfind: Too many parenthesis."
+msgstr "ippfind: カッコãŒå¤šã™ãŽã¾ã™ã€‚"
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr "ippfind: %s をブラウズã§ããªã„ã‹åå‰è§£æ±ºã§ãã¾ã›ã‚“。"
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr "ippfind: \"%s\" を実行ã§ãã¾ã›ã‚“: %s"
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr "ippfind: Bonjour を利用ã§ãã¾ã›ã‚“: %s"
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr "ippfind: \"{%s}\" ã¯ä¸æ˜Žãªå¤‰æ•°ã§ã™ã€‚"
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr ""
+"ipptool: \"-i\" ãŠã‚ˆã³ \"-n\" 㯠\"-P\"ã€\"-X\" ã¨ä¸€ç·’ã«æŒ‡å®šã§ãã¾ã›ã‚“。"
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: ä¸æ­£ãª URI ã§ã™ - %s。"
msgid "ipptool: Invalid seconds for \"-i\"."
msgstr "ipptool: \"-i\" ã«ä¸æ­£ãªç§’æ•°ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€‚"
@@ -4723,12 +5334,6 @@ msgstr "ipptool: \"-d\" ã« åå‰=値 ã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "ipptool: Missing seconds for \"-i\"."
msgstr "ipptool: \"-i\" ã«ç§’æ•°ã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr "ipptool: \"-T\" ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr "ipptool: \"-V\" ã«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
-
msgid "ipptool: URI required before test file."
msgstr "ipptool: テストファイルã®å‰ã« URI ã®æŒ‡å®šãŒå¿…è¦ã§ã™ã€‚"
@@ -4828,6 +5433,10 @@ msgstr ""
" å…ˆã«ãƒ—リンターåを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
msgstr "lpadmin: PPD ファイル \"%s\" ã‚’é–‹ã‘ã¾ã›ã‚“ - %s"
@@ -4873,8 +5482,8 @@ msgstr "lpinfo: \"--language\" ã®ã‚ã¨ã«ã¯ã€è¨€èªžã‚’指定ã™ã‚‹å¿…è¦ãŒã
msgid "lpinfo: Expected make and model after \"--make-and-model\"."
msgstr ""
-"lpinfo: \"--make-and-model\" ã®å¾Œã«ã¯ã€ãƒ¡ãƒ¼ã‚«ãƒ¼ã¨ãƒ¢ãƒ‡ãƒ«ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾"
-"ã™ã€‚"
+"lpinfo: \"--make-and-model\" ã®ã‚ã¨ã«ã¯ã€ãƒ¡ãƒ¼ã‚«ãƒ¼ã¨ãƒ¢ãƒ‡ãƒ«ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Š"
+"ã¾ã™ã€‚"
msgid "lpinfo: Expected product string after \"--product\"."
msgstr "lpinfo: \"--product\" ã®ã‚ã¨ã«ã¯ã€è£½å“åを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -4922,7 +5531,7 @@ msgstr "lpoptions: プリンターãŒã‚ã‚Šã¾ã›ã‚“。"
#, c-format
msgid "lpoptions: Unable to add printer or instance: %s"
-msgstr "lpoptions: プリンターã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’追加ã§ãã¾ã›ã‚“: %s。"
+msgstr "lpoptions: プリンターã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’追加ã§ãã¾ã›ã‚“: %s"
#, c-format
msgid "lpoptions: Unable to get PPD file for %s: %s"
@@ -4935,48 +5544,6 @@ msgstr "lpoptions: %s ã® PPD ファイルを開ã‘ã¾ã›ã‚“。"
msgid "lpoptions: Unknown printer or class."
msgstr "lpoptions: 未知ã®ãƒ—リンターã¾ãŸã¯ã‚¯ãƒ©ã‚¹ã§ã™ã€‚"
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr "lppasswd: root ã ã‘ãŒãƒ‘スワードã®è¿½åŠ ã¨å‰Šé™¤ã‚’è¡Œãˆã¾ã™ã€‚"
-
-msgid "lppasswd: Password file busy."
-msgstr "lppasswd: パスワードファイルãŒãƒ“ジー状態ã§ã™ã€‚"
-
-msgid "lppasswd: Password file not updated."
-msgstr "lppasswd: パスワードファイルã¯æ›´æ–°ã•ã‚Œã¾ã›ã‚“。"
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr "lppasswd: 残念ãªãŒã‚‰ã€ãƒ‘スワードãŒãƒžãƒƒãƒã—ã¾ã›ã‚“。"
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr "lppasswd: 残念ãªãŒã‚‰ã€ãƒ‘スワードã¯æ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚"
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr "lppasswd: 残念ãªãŒã‚‰ã€ãƒ‘スワードãŒãƒžãƒƒãƒã—ã¾ã›ã‚“。"
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr "lppasswd: パスワード文字列をコピーã§ãã¾ã›ã‚“: %s"
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr "lppasswd: パスワードファイルを開ã‘ã¾ã›ã‚“: %s"
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr "lppasswd: パスワードファイルã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“: %s"
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr "lppasswd: å¤ã„パスワードファイルã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr "lppasswd: パスワードファイルã®åå‰ã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr "lppasswd: ユーザー \"%s\" ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ— \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
-
#, c-format
msgid ""
"lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5006,7 +5573,7 @@ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
msgstr "notify-recipient-uri URI \"%s\" ã«ã¯æœªçŸ¥ã®ã‚¹ã‚­ãƒ¼ãƒ ãŒä½¿ã‚ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "pending"
-msgstr "ä¿ç•™"
+msgstr "プリンター待ã¡"
#, c-format
msgid "ppdc: Adding include directory \"%s\"."
@@ -5026,13 +5593,11 @@ msgstr "ä¸æ­£ãªãƒ•ã‚©ãƒ³ãƒˆå±žæ€§: %s"
#, c-format
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
-msgstr ""
-"ppdc: ä¸æ­£ãª resolution å \"%s\" ãŒã‚ã‚Šã¾ã™ã€‚%d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s 。"
+msgstr "ppdc: ä¸æ­£ãª resolution å \"%s\" ãŒã‚ã‚Šã¾ã™ã€‚%d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s。"
#, c-format
msgid "ppdc: Bad status keyword %s on line %d of %s."
-msgstr ""
-"ppdc: ä¸æ­£ãª status キーワード %s ãŒã‚ã‚Šã¾ã™ã€‚%d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s 。"
+msgstr "ppdc: ä¸æ­£ãª status キーワード %s ãŒã‚ã‚Šã¾ã™ã€‚%d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s。"
#, c-format
msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
@@ -5047,7 +5612,7 @@ msgstr ""
msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
msgstr ""
"ppdc: locale %s ã«å¯¾ã—㦠#po ãŒäºŒé‡ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚%d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å "
-"%s 。"
+"%s。"
#, c-format
msgid "ppdc: Expected a filter definition on line %d of %s."
@@ -5125,7 +5690,7 @@ msgstr "ppdc: %d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s ã«ãŠã„㦠group name/text ãŒå¿…
#, c-format
msgid "ppdc: Expected include filename on line %d of %s."
-msgstr "ppdc: %d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s ã«ãŠã„㦠include ファイルåãŒå¿…è¦ã§ã™ã€‚"
+msgstr "ppdc: %d 行目ã€ãƒ•ã‚¡ã‚¤ãƒ«å %s ã«ãŠã„㦠include ファイルå ãŒå¿…è¦ã§ã™ã€‚"
#, c-format
msgid "ppdc: Expected integer on line %d of %s."
@@ -5488,7 +6053,7 @@ msgid "stat of %s failed: %s"
msgstr "%s ã®çŠ¶æ…‹å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
msgid "status\t\tShow status of daemon and queue."
-msgstr "status\t\tデーモンã¨ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…‹ã‚’表示"
+msgstr "status\t\tデーモンã¨ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…‹ã‚’表示。"
msgid "stopped"
msgstr "åœæ­¢"
@@ -5509,3 +6074,209 @@ msgstr "タイトルãªã—"
msgid "variable-bindings uses indefinite length"
msgstr "variable-bindings ã®é•·ã•ãŒä¸å®š"
+
+#~ msgid " -l Run cupsd from launchd(8)."
+#~ msgstr " -l launchd(8) ã‹ã‚‰ cupsd を実行ã™ã‚‹ã€‚"
+
+#~ msgid ""
+#~ "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 4.1.6 節)."
+#~ msgstr ""
+#~ "\"%s\": uriScheme 値 \"%s\" ãŒèª¤ã£ã¦ã„ã¾ã™ - 誤ã£ãŸé•·ã• %d (RFC 2911 "
+#~ "4.1.6 節)."
+
+#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f ãƒã‚¤ãƒˆ"
+
+#~ msgid "%s: Error - expected destination after \"-b\" option."
+#~ msgstr "%s: エラー - \"-b\" オプションã®ã‚ã¨ã«å®›å…ˆãŒå¿…è¦ã§ã™ã€‚"
+
+#~ msgid "720dpi"
+#~ msgstr "720dpi"
+
+#~ msgid "Bad printer URI."
+#~ msgstr "ä¸æ­£ãªãƒ—リンター URI ã§ã™ã€‚"
+
+#~ msgid "Enter old password:"
+#~ msgstr "å¤ã„パスワードを入力:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "パスワードをå†åº¦å…¥åŠ›:"
+
+#~ msgid "Enter password:"
+#~ msgstr "パスワードを入力:"
+
+#~ msgid "Looking for printer."
+#~ msgstr "プリンターを探ã—ã¦ã„ã¾ã™ã€‚"
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "New Stylus Color シリーズ"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "New Stylus Photo シリーズ"
+
+#~ msgid "Output for printer %s is sent to %s"
+#~ msgstr "プリンター %s ã®å‡ºåŠ›ã¯ %s ã«é€ã‚‰ã‚Œã¾ã™"
+
+#~ msgid "Output for printer %s is sent to remote printer %s on %s"
+#~ msgstr "プリンター %s ã®å‡ºåŠ›ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ—リンター %s (%s 上) ã«é€ã‚‰ã‚Œã¾ã™"
+
+#~ msgid "Output for printer %s/%s is sent to %s"
+#~ msgstr "プリンター %s/%s ã®å‡ºåŠ›ã¯ %s ã«é€ã‚‰ã‚Œã¾ã™"
+
+#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "プリンター %s/%s ã®å‡ºåŠ›ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ—リンター %s (%s 上) ã«é€ã‚‰ã‚Œã¾ã™"
+
+#~ msgid "Print file accepted - job ID %d."
+#~ msgstr "プリントファイルをå—ã‘付ã‘ã¾ã—㟠- ジョブ ID %d。"
+
+#~ msgid "Print file accepted - job ID unknown."
+#~ msgstr "NOTICE: プリントファイルをå—ã‘付ã‘ã¾ã—㟠- ジョブ ID ä¸æ˜Žã€‚"
+
+#~ msgid "Print file was not accepted."
+#~ msgstr "プリントファイルãŒå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#~ msgid "Printing page %d, %d%% complete."
+#~ msgstr "ページ %d ã‚’å°åˆ·ä¸­ã€%d%% 完了ã—ã¾ã—ãŸã€‚"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "ジョブã®å‰Šé™¤"
+
+#~ msgid ""
+#~ "Rank Owner Pri Job Files Total Size"
+#~ msgstr ""
+#~ "ランク 所有者 優先 ジョブ ファイル åˆè¨ˆã‚µã‚¤ã‚º"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color シリーズ"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo シリーズ"
+
+#~ msgid ""
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
+#~ msgstr "'%s' Job Description 属性ã¯ã‚¸ãƒ§ãƒ–作æˆè¦æ±‚ã®ä¸­ã§æŒ‡å®šã§ãã¾ã›ã‚“。"
+
+#~ msgid "The output bin is almost full."
+#~ msgstr "排紙トレイãŒã»ã¨ã‚“ã©ä¸€æ¯ã§ã™ã€‚"
+
+#~ msgid "The output bin is full."
+#~ msgstr "排紙トレイãŒä¸€æ¯ã§ã™ã€‚"
+
+#~ msgid "The output bin is missing."
+#~ msgstr "排紙トレイãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "The paper tray is almost empty."
+#~ msgstr "用紙トレイãŒç©ºã«ãªã‚Šã‹ã‘ã¦ã„ã¾ã™ã€‚"
+
+#~ msgid "The paper tray is empty."
+#~ msgstr "用紙トレイãŒç©ºã§ã™ã€‚"
+
+#~ msgid "The paper tray is missing."
+#~ msgstr "用紙トレイãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "The paper tray needs to be filled."
+#~ msgstr "用紙トレイã«è£œå……ãŒå¿…è¦ã§ã™ã€‚"
+
+#~ msgid "The printer URI is incorrect or no longer exists."
+#~ msgstr "プリンター URI ãŒèª¤ã£ã¦ã„ã‚‹ã‹ã€ã‚‚ã†å­˜åœ¨ã—ã¾ã›ã‚“。"
+
+#~ msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+#~ msgstr "プリンター㌠IPP/%d.%d をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。IPP/%s を試ã—ã¾ã™ã€‚"
+
+#~ msgid "The printer is running low on ink."
+#~ msgstr "プリンターã®ã‚¤ãƒ³ã‚¯ãŒã‚‚ã†ã™ããªããªã‚Šã¾ã™ã€‚"
+
+#~ msgid "The printer is running low on toner."
+#~ msgstr "プリンターã®ãƒˆãƒŠãƒ¼ãŒã‚‚ã†ã™ããªããªã‚Šã¾ã™ã€‚"
+
+#~ msgid "There is a paper jam."
+#~ msgstr "用紙ã¥ã¾ã‚ŠãŒç™ºç”Ÿã—ã¦ã„ã¾ã™ã€‚"
+
+#~ msgid "Unable to create compressed print file"
+#~ msgstr "圧縮プリントファイルを作æˆã§ãã¾ã›ã‚“"
+
+#~ msgid "Unable to generate compressed print file"
+#~ msgstr "圧縮プリントファイルを生æˆã§ãã¾ã›ã‚“"
+
+#~ msgid "Unable to open compressed print file"
+#~ msgstr "圧縮プリントファイルを開ã‘ã¾ã›ã‚“"
+
+#~ msgid "Unable to resolve printer URI."
+#~ msgstr "プリンター URI を解決ã§ãã¾ã›ã‚“。"
+
+#~ msgid "Usage: cupsfilter [ options ] filename"
+#~ msgstr "使ã„æ–¹: cupsfilter [オプション] ファイルå"
+
+#~ msgid "Usage: lppasswd [-g groupname]"
+#~ msgstr "使ã„æ–¹: lppasswd [-g グループå]"
+
+#~ msgid ""
+#~ "Usage: lppasswd [-g groupname] [username]\n"
+#~ " lppasswd [-g groupname] -a [username]\n"
+#~ " lppasswd [-g groupname] -x [username]"
+#~ msgstr ""
+#~ "使ã„æ–¹: lppasswd [-g グループå] [ユーザーå]\n"
+#~ " lppasswd [-g グループå] -a [ユーザーå]\n"
+#~ " lppasswd [-g グループå] -x [ユーザーå]"
+
+#~ msgid ""
+#~ "Your password must be at least 6 characters long, cannot contain your "
+#~ "username, and must contain at least one letter and number."
+#~ msgstr ""
+#~ "パスワードã¯å°‘ãªãã¨ã‚‚ 6 文字以上ã§ã€ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’å«ã‚“ã§ã¯ãªã‚‰ãšã€"
+#~ "å°‘ãªãã¨ã‚‚ 1 ã¤ã®è‹±å­—ãŠã‚ˆã³æ•°å€¤ã‚’å«ã‚“ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
+#~ msgstr ""
+#~ "cupsd: launchd(8) サãƒãƒ¼ãƒˆãŒã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„ã®ã§ã€é€šå¸¸ãƒ¢ãƒ¼ãƒ‰ã§å‹•ä½œã—"
+#~ "ã¾ã™ã€‚"
+
+#~ msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#~ msgstr "ipptool: \"-i\" 㨠\"-n\" 㯠\"-X\" ã¨çµ„ã¿åˆã‚ã›ã‚‰ã‚Œã¾ã›ã‚“。"
+
+#~ msgid "ipptool: Bad version %s for \"-V\"."
+#~ msgstr "ipptool: \"-V\" オプションã«ä¸æ­£ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€‚"
+
+#~ msgid "ipptool: Missing timeout for \"-T\"."
+#~ msgstr "ipptool: \"-T\" ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "ipptool: Missing version for \"-V\"."
+#~ msgstr "ipptool: \"-V\" ã«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "lppasswd: Only root can add or delete passwords."
+#~ msgstr "lppasswd: root ã ã‘ãŒãƒ‘スワードã®è¿½åŠ ã¨å‰Šé™¤ã‚’è¡Œãˆã¾ã™ã€‚"
+
+#~ msgid "lppasswd: Password file busy."
+#~ msgstr "lppasswd: パスワードファイルãŒãƒ“ジー状態ã§ã™ã€‚"
+
+#~ msgid "lppasswd: Password file not updated."
+#~ msgstr "lppasswd: パスワードファイルã¯æ›´æ–°ã•ã‚Œã¾ã›ã‚“。"
+
+#~ msgid "lppasswd: Sorry, password doesn't match."
+#~ msgstr "lppasswd: 残念ãªãŒã‚‰ã€ãƒ‘スワードãŒãƒžãƒƒãƒã—ã¾ã›ã‚“。"
+
+#~ msgid "lppasswd: Sorry, password rejected."
+#~ msgstr "lppasswd: 残念ãªãŒã‚‰ã€ãƒ‘スワードã¯æ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚"
+
+#~ msgid "lppasswd: Sorry, passwords don't match."
+#~ msgstr "lppasswd: 残念ãªãŒã‚‰ã€ãƒ‘スワードãŒãƒžãƒƒãƒã—ã¾ã›ã‚“。"
+
+#~ msgid "lppasswd: Unable to copy password string: %s"
+#~ msgstr "lppasswd: パスワード文字列をコピーã§ãã¾ã›ã‚“: %s"
+
+#~ msgid "lppasswd: Unable to open password file: %s"
+#~ msgstr "lppasswd: パスワードファイルを開ã‘ã¾ã›ã‚“: %s"
+
+#~ msgid "lppasswd: Unable to write to password file: %s"
+#~ msgstr "lppasswd: パスワードファイルã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“: %s"
+
+#~ msgid "lppasswd: failed to backup old password file: %s"
+#~ msgstr "lppasswd: å¤ã„パスワードファイルã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#~ msgid "lppasswd: failed to rename password file: %s"
+#~ msgstr "lppasswd: パスワードファイルã®åå‰ã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
+#~ msgstr "lppasswd: ユーザー \"%s\" ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ— \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
diff --git a/locale/cups_ru.po b/locale/cups_ru.po
index 517c1a4..88a618c 100644
--- a/locale/cups_ru.po
+++ b/locale/cups_ru.po
@@ -1,238 +1,242 @@
msgid ""
msgstr ""
-"Project-Id-Version: CUPS 1.4\n"
+"Project-Id-Version: CUPS 2.0\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
-"PO-Revision-Date: 2009-02-16 12:00-0800\n"
-"Last-Translator: Apple Inc.\n"
-"Language-Team: Apple Inc.\n"
-"Language: \n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2015-01-28 12:00-0800\n"
+"Last-Translator: Aleksandr Proklov\n"
+"Language-Team: PuppyRus Linux Team\n"
+"Language: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "\t\t(all)"
-msgstr ""
+msgstr "\t\t(вÑе)"
msgid "\t\t(none)"
-msgstr ""
+msgstr "\t\t(нет)"
#, c-format
msgid "\t%d entries"
-msgstr ""
+msgstr "\tзапиÑей: %d"
#, c-format
msgid "\t%s"
-msgstr ""
+msgstr "\t%s"
msgid "\tAfter fault: continue"
-msgstr ""
+msgstr "\tПоÑле ошибки: продолжить"
#, c-format
msgid "\tAlerts: %s"
-msgstr ""
+msgstr "\tПредупреждениÑ: %s"
msgid "\tBanner required"
-msgstr ""
+msgstr "\tТребуетÑÑ Ð±Ð°Ð½Ð½ÐµÑ€"
msgid "\tCharset sets:"
-msgstr ""
+msgstr "\tÐабор Ñимволов уÑтанавливает:"
msgid "\tConnection: direct"
-msgstr ""
+msgstr "\tПодключение: прÑмое"
msgid "\tConnection: remote"
-msgstr ""
+msgstr "\tПодключение: удаленное"
msgid "\tContent types: any"
-msgstr ""
+msgstr "\tТип Ñодержимого: любой"
msgid "\tDefault page size:"
-msgstr ""
+msgstr "\tРазмер Ñтраницы по умолчанию:"
msgid "\tDefault pitch:"
-msgstr ""
+msgstr "\tÐ’Ñ‹Ñота по умолчанию:"
msgid "\tDefault port settings:"
-msgstr ""
+msgstr "\tÐаÑтройки порта по умолчанию:"
#, c-format
msgid "\tDescription: %s"
-msgstr ""
+msgstr "\tОпиÑание: %s"
msgid "\tForm mounted:"
-msgstr ""
+msgstr "\tФорма подключениÑ:"
msgid "\tForms allowed:"
-msgstr ""
+msgstr "\tРазрешенные формы:"
#, c-format
msgid "\tInterface: %s.ppd"
-msgstr ""
+msgstr "\tИнтерфейÑ: %s.ppd"
#, c-format
msgid "\tInterface: %s/interfaces/%s"
-msgstr ""
+msgstr "\tИнтерфейÑ: %s/интерфейÑÑ‹/%s"
#, c-format
msgid "\tInterface: %s/ppd/%s.ppd"
-msgstr ""
+msgstr "\tИнтерфейÑ: %s/ppd/%s.ppd"
#, c-format
msgid "\tLocation: %s"
-msgstr ""
+msgstr "\tРаÑположение: %s"
msgid "\tOn fault: no alert"
-msgstr ""
+msgstr "\tПри ошибке: не выводить предупреждение"
msgid "\tPrinter types: unknown"
-msgstr ""
+msgstr "\tТип принтера: неизвеÑтен"
#, c-format
msgid "\tStatus: %s"
-msgstr ""
+msgstr "\tСтатуÑ: %s"
msgid "\tUsers allowed:"
-msgstr ""
+msgstr "\tРазрешенные пользователи:"
msgid "\tUsers denied:"
-msgstr ""
+msgstr "\tЗапрещенные пользователи:"
msgid "\tdaemon present"
-msgstr ""
+msgstr "\tдемон приÑутÑтвует"
msgid "\tno entries"
-msgstr ""
+msgstr "\tнет запиÑей"
#, c-format
msgid "\tprinter is on device '%s' speed -1"
-msgstr ""
+msgstr "\tпринтер на ÑкороÑти -1 уÑтройÑтва «%s»"
msgid "\tprinting is disabled"
-msgstr ""
+msgstr "\tпечать отключена"
msgid "\tprinting is enabled"
-msgstr ""
+msgstr "\tпечать включена"
#, c-format
msgid "\tqueued for %s"
-msgstr ""
+msgstr "\tочередь Ð´Ð»Ñ %s"
msgid "\tqueuing is disabled"
-msgstr ""
+msgstr "\tочередь отключена"
msgid "\tqueuing is enabled"
-msgstr ""
+msgstr "\tочередь включена"
msgid "\treason unknown"
-msgstr ""
+msgstr "\tпричина неизвеÑтна"
msgid ""
"\n"
" DETAILED CONFORMANCE TEST RESULTS"
msgstr ""
+"\n"
+" ПОДРОБÐЫЕ РЕЗУЛЬТÐТЫ ТЕСТРСООТВЕТСТВИЯ"
msgid " Ignore specific warnings."
-msgstr ""
+msgstr " Игнорировать конкретные предупреждениÑ"
msgid " Issue warnings instead of errors."
-msgstr ""
+msgstr " Выдавать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑто ошибки"
msgid " REF: Page 15, section 3.1."
-msgstr ""
+msgstr " REF: Стр. 15, раздел 3.1."
msgid " REF: Page 15, section 3.2."
-msgstr ""
+msgstr " REF: Стр. 15, раздел 3.2."
msgid " REF: Page 19, section 3.3."
-msgstr ""
+msgstr " REF: Стр. 19, раздел 3.3."
msgid " REF: Page 20, section 3.4."
-msgstr ""
+msgstr " REF: Стр. 20, раздел 3.4."
msgid " REF: Page 27, section 3.5."
-msgstr ""
+msgstr " REF: Стр. 27, раздел 3.5."
msgid " REF: Page 42, section 5.2."
-msgstr ""
+msgstr " REF: Стр. 42, раздел 5.2."
msgid " REF: Pages 16-17, section 3.2."
-msgstr ""
+msgstr " REF: Стр. 16-17, раздел 3.2."
msgid " REF: Pages 42-45, section 5.2."
-msgstr ""
+msgstr " REF: Стр. 42-45, раздел 5.2."
msgid " REF: Pages 45-46, section 5.2."
-msgstr ""
+msgstr " REF: Стр. 45-46, раздел 5.2."
msgid " REF: Pages 48-49, section 5.2."
-msgstr ""
+msgstr " REF: Стр. 48-49, раздел 5.2."
msgid " REF: Pages 52-54, section 5.2."
-msgstr ""
+msgstr " REF: Стр. 52-54, раздел 5.2."
#, c-format
msgid " %-39.39s %.0f bytes"
-msgstr ""
+msgstr " %-39.39s %.0f байт"
#, c-format
msgid " PASS Default%s"
-msgstr ""
+msgstr " PASS Default%s"
msgid " PASS DefaultImageableArea"
-msgstr ""
+msgstr " PASS DefaultImageableArea"
msgid " PASS DefaultPaperDimension"
-msgstr ""
+msgstr " PASS DefaultPaperDimension"
msgid " PASS FileVersion"
-msgstr ""
+msgstr " PASS FileVersion"
msgid " PASS FormatVersion"
-msgstr ""
+msgstr " PASS FormatVersion"
msgid " PASS LanguageEncoding"
-msgstr ""
+msgstr " PASS LanguageEncoding"
msgid " PASS LanguageVersion"
-msgstr ""
+msgstr " PASS LanguageVersion"
msgid " PASS Manufacturer"
-msgstr ""
+msgstr " PASS Manufacturer"
msgid " PASS ModelName"
-msgstr ""
+msgstr " PASS ModelName"
msgid " PASS NickName"
-msgstr ""
+msgstr " PASS NickName"
msgid " PASS PCFileName"
-msgstr ""
+msgstr " PASS PCFileName"
msgid " PASS PSVersion"
-msgstr ""
+msgstr " PASS PSVersion"
msgid " PASS PageRegion"
-msgstr ""
+msgstr " PASS PageRegion"
msgid " PASS PageSize"
-msgstr ""
+msgstr " PASS PageSize"
msgid " PASS Product"
-msgstr ""
+msgstr " PASS Product"
msgid " PASS ShortNickName"
-msgstr ""
+msgstr " PASS ShortNickName"
#, c-format
msgid " WARN %s has no corresponding options."
-msgstr ""
+msgstr "\tWARN\t%s не Ñодержит ÑоответÑтвующих параметров."
#, c-format
msgid ""
" WARN %s shares a common prefix with %s\n"
" REF: Page 15, section 3.2."
msgstr ""
+"\tWARN\t%s иÑпользует общий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑовмеÑтно Ñ %s\n"
+" REF: Стр. 15, раздел 3.2."
#, c-format
msgid ""
@@ -240,144 +244,169 @@ msgid ""
"be named Duplex.\n"
" REF: Page 122, section 5.17"
msgstr ""
+"\tWARN\tКлючевое Ñлово параметра дуплекÑа %s может привеÑти к некорректным "
+"результатам. ИÑпользуйте Ð¸Ð¼Ñ 'Duplex'\n"
+" REF: Стр. 122, раздел 5.17"
msgid " WARN File contains a mix of CR, LF, and CR LF line endings."
-msgstr ""
+msgstr "\tWARN\tФайл Ñодержит комбинацию окончаний Ñтроки CR, LF, CR LF"
msgid ""
" WARN LanguageEncoding required by PPD 4.3 spec.\n"
" REF: Pages 56-57, section 5.3."
msgstr ""
+"\tWARN\tLanguageEncoding требуетÑÑ Ñпецификацией PPD 4.3.\n"
+" REF: Стр. 56-57, раздел 5.3."
#, c-format
msgid " WARN Line %d only contains whitespace."
-msgstr ""
+msgstr "\tWARN\tСтрока %d Ñодержит только пробелы."
msgid ""
" WARN Manufacturer required by PPD 4.3 spec.\n"
" REF: Pages 58-59, section 5.3."
msgstr ""
+"\tWARN\tManufacturer требуетÑÑ Ñпецификацией PPD 4.3.\n"
+" REF: Стр. 58-59, раздел 5.3."
msgid ""
" WARN Non-Windows PPD files should use lines ending with only LF, "
"not CR LF."
msgstr ""
+"\tWARN\tPPD-файлы не из Windows должны иÑпользовать Ñтроки только Ñ "
+"окончанием LF, а не Ñ CR LF"
#, c-format
msgid ""
" WARN Obsolete PPD version %.1f.\n"
" REF: Page 42, section 5.2."
msgstr ""
+"\tWARN\tУÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð²ÐµÑ€ÑÐ¸Ñ PPD %.1f.\n"
+" REF: Стр. 42, раздел 5.2."
msgid ""
" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
+"\tWARN\tPCFileName длиннее чем 8.3 нарушает Ñпецификацию PPD.\n"
+" REF: Стр. 61-62, раздел 5.3."
msgid ""
" WARN PCFileName should contain a unique filename.\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
+"\tWARN\tPCFilename должен Ñодержать уникальное название\n"
+" REF: Стр. 61-62, раздел 5.3."
msgid ""
" WARN Protocols contains PJL but JCL attributes are not set.\n"
" REF: Pages 78-79, section 5.7."
msgstr ""
+"\tWARN\tProtocols Ñодержит PJL, но атрибуты JCL не наÑтроены.\n"
+" REF: Стр. 78-79, раздел 5.7."
msgid ""
" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
" REF: Pages 78-79, section 5.7."
msgstr ""
+"\tWARN\tProtocols Ñодержит PJL и BCP; ожидаетÑÑ TBCP.\n"
+" REF: Стр. 78-79, раздел 5.7."
msgid ""
" WARN ShortNickName required by PPD 4.3 spec.\n"
" REF: Pages 64-65, section 5.3."
msgstr ""
+"\tWARN\tShortNickName требуетÑÑ Ñпецификацией PPD 4.3.\n"
+" REF: Стр. 64-65, раздел 5.3."
msgid " cupsaddsmb [options] -a"
-msgstr ""
+msgstr "\tcupsaddsmb [options] -a"
msgid " cupstestdsc [options] -"
-msgstr ""
+msgstr "\tcupstestdsc [options] -"
msgid " program | cupstestppd [options] -"
-msgstr ""
+msgstr "\tprogram | cupstestppd [options] -"
#, c-format
msgid ""
" %s \"%s %s\" conflicts with \"%s %s\"\n"
" (constraint=\"%s %s %s %s\")."
msgstr ""
+"\t%s \"%s %s\" конфликтует Ñ \"%s %s\"\n"
+" (constraint=\"%s %s %s %s\")."
#, c-format
msgid " %s %s %s does not exist."
-msgstr ""
+msgstr "\t%s %s %s не ÑущеÑтвует."
#, c-format
msgid " %s %s file \"%s\" has the wrong capitalization."
-msgstr ""
+msgstr "\t%s %s файл \"%s\" имеет неверный региÑÑ‚Ñ€."
#, c-format
msgid ""
" %s Bad %s choice %s.\n"
" REF: Page 122, section 5.17"
msgstr ""
+"\t%s Ðеверный %s выбор %s.\n"
+" REF: Стр. 122, раздел 5.17"
#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s."
-msgstr ""
+msgstr "\t%s Ðеверный перевод UTF-8 \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s, выбора %s"
#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s."
-msgstr ""
+msgstr "\t%s Ðеверный перевод UTF-8 \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
#, c-format
msgid " %s Bad cupsFilter value \"%s\"."
-msgstr ""
+msgstr "\t%s Ðеверное значение cupsFilter \"%s\"."
#, c-format
msgid " %s Bad cupsFilter2 value \"%s\"."
-msgstr ""
+msgstr "\t%s Ðеверное значение cupsFilter2 \"%s\"."
#, c-format
msgid " %s Bad cupsICCProfile %s."
-msgstr ""
+msgstr "\t%s Ðеверный cupsICCProfile %s."
#, c-format
msgid " %s Bad cupsPreFilter value \"%s\"."
-msgstr ""
+msgstr "\t%s Ðеверное значение cupsPreFilter \"%s\"."
#, c-format
msgid " %s Bad cupsUIConstraints %s: \"%s\""
-msgstr ""
+msgstr "\t%s Ðеверное значение cupsUIConstraints %s: \"%s\""
#, c-format
msgid " %s Bad language \"%s\"."
-msgstr ""
+msgstr "\t%s Ðеверный Ñзык \"%s\"."
#, c-format
msgid " %s Bad permissions on %s file \"%s\"."
-msgstr ""
+msgstr "\t%s Ðеверные права %s Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"."
#, c-format
msgid " %s Bad spelling of %s - should be %s."
-msgstr ""
+msgstr " %s Ошибки в %s - должно быть %s."
#, c-format
msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID."
-msgstr ""
+msgstr "\t%s Ðевозможно предоÑтавить APScanAppPath и APScanAppBundleID вмеÑте."
#, c-format
msgid " %s Default choices conflicting."
-msgstr ""
+msgstr "\t%s\tЗначениÑ, иÑпользуемые по умолчанию, конфликтуют."
#, c-format
msgid " %s Empty cupsUIConstraints %s"
-msgstr ""
+msgstr " %s ПуÑтой cupsUIConstraints %s"
#, c-format
msgid " %s Missing \"%s\" translation string for option %s, choice %s."
-msgstr ""
+msgstr "\t%s Перевод \"%s\" отÑутÑтвует Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s, выбора %s"
#, c-format
msgid " %s Missing \"%s\" translation string for option %s."
@@ -385,218 +414,266 @@ msgstr ""
#, c-format
msgid " %s Missing %s file \"%s\"."
-msgstr ""
+msgstr "\t%s отÑутÑтвует %s файл \"%s\"."
#, c-format
msgid ""
" %s Missing REQUIRED PageRegion option.\n"
" REF: Page 100, section 5.14."
msgstr ""
+"\t%s ОбÑзательный параметр PageRegion отÑутÑтвует.\n"
+"\t\t REF: Стр. 100, раздел 5.14."
#, c-format
msgid ""
" %s Missing REQUIRED PageSize option.\n"
" REF: Page 99, section 5.14."
msgstr ""
+"\t%s ОбÑзательный параметр PageSize отÑутÑтвует.\n"
+" REF: Стр. 99, раздел 5.14."
#, c-format
msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
-msgstr ""
+msgstr " %s Выбор *%s %s отÑутÑтвует в UIConstraints \"*%s %s *%s %s\"."
#, c-format
msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
-msgstr ""
+msgstr " %s Выбор *%s %s отÑутÑтвует в cupsUIConstraints %s: \"%s\""
#, c-format
msgid " %s Missing cupsUIResolver %s"
-msgstr ""
+msgstr "\t%s cupsUIResolver отÑутÑтвует %s"
#, c-format
msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"."
-msgstr ""
+msgstr "\t%s ОтÑутÑтвует параметр %s у UIConstraints \"*%s %s *%s %s\"."
#, c-format
msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\""
-msgstr ""
+msgstr "\t%s ОтÑутÑтвует параметр %s у cupsUIConstraints %s: \"%s\""
#, c-format
msgid " %s No base translation \"%s\" is included in file."
-msgstr ""
+msgstr "\t%s ОÑновной перевод \"%s\" не включен в файл."
#, c-format
msgid ""
" %s REQUIRED %s does not define choice None.\n"
" REF: Page 122, section 5.17"
msgstr ""
+"\t ТРЕБУЕТСЯ %s: %s не определÑет выбор \"Ðет\".\n"
+" REF: Стр. 122, раздел 5.17\n"
#, c-format
msgid " %s Size \"%s\" defined for %s but not for %s."
-msgstr ""
+msgstr "\t%s Размер \"%s\" определен Ð´Ð»Ñ %s, но не определен Ð´Ð»Ñ %s."
#, c-format
msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)."
-msgstr ""
+msgstr "\t%s Размер \"%s\" имеет неверное значение (%gx%g)."
#, c-format
msgid " %s Size \"%s\" should be \"%s\"."
-msgstr ""
+msgstr "\t%s Размер \"%s\" должен быть \"%s\"."
#, c-format
msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"."
-msgstr ""
+msgstr "\t%s Размер \"%s\" должен быть в формате Adobe standard name \"%s\"."
#, c-format
msgid " %s cupsICCProfile %s hash value collides with %s."
-msgstr ""
+msgstr "\tХеш-значение %s cupsICCProfile %s конфликтует Ñ %s."
#, c-format
msgid " %s cupsUIResolver %s causes a loop."
-msgstr ""
+msgstr "\t%s cupsUIResolver %s Ñоздает цикл."
#, c-format
msgid ""
" %s cupsUIResolver %s does not list at least two different options."
-msgstr ""
+msgstr "\t%s Ð’ cupsUIResolver %s не перечиÑлено как минимум два параметра."
#, c-format
msgid ""
" **FAIL** %s must be 1284DeviceID\n"
" REF: Page 72, section 5.5"
msgstr ""
+"\t**FAIL** %s должно ÑоответÑтвовать 1284DeviceID\n"
+" REF: Стр. 72, раздел 5.5"
#, c-format
msgid ""
" **FAIL** Bad Default%s %s\n"
" REF: Page 40, section 4.5."
msgstr ""
+"\t**FAIL** Ðеверный Default%s %s\n"
+" REF: Стр. 40, раздел 4.5."
#, c-format
msgid ""
" **FAIL** Bad DefaultImageableArea %s\n"
" REF: Page 102, section 5.15."
msgstr ""
+"\t**FAIL** Ðеверный DefaultImageableArea %s\n"
+" REF: Стр. 102, раздел 5.15."
#, c-format
msgid ""
" **FAIL** Bad DefaultPaperDimension %s\n"
" REF: Page 103, section 5.15."
msgstr ""
+"\t**FAIL** Ðеверный DefaultPaperDimension %s\n"
+" REF: Стр. 103, раздел 5.15."
#, c-format
msgid ""
" **FAIL** Bad FileVersion \"%s\"\n"
" REF: Page 56, section 5.3."
msgstr ""
+"\t**FAIL** Ðеверный FileVersion \"%s\"\n"
+" REF: Стр. 56, раздел 5.3."
#, c-format
msgid ""
" **FAIL** Bad FormatVersion \"%s\"\n"
" REF: Page 56, section 5.3."
msgstr ""
+"\t**FAIL** Ðеверный FormatVersion \"%s\"\n"
+" REF: Стр. 56, раздел 5.3."
msgid ""
" **FAIL** Bad JobPatchFile attribute in file\n"
" REF: Page 24, section 3.4."
msgstr ""
+"\t**FAIL** Ðеверный JobPatchFile атрибут в файле\n"
+" REF: Стр. 24, раздел 3.4."
#, c-format
msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."
-msgstr ""
+msgstr "\t**FAIL** Ðеверный LanguageEncoding %s - должен быть ISOLatin1."
#, c-format
msgid " **FAIL** Bad LanguageVersion %s - must be English."
-msgstr ""
+msgstr "\t**FAIL** Ðеверный LanguageVersion %s - должен быть английÑкий."
#, c-format
msgid ""
" **FAIL** Bad Manufacturer (should be \"%s\")\n"
" REF: Page 211, table D.1."
msgstr ""
+"\t**FAIL** Ðеверный Manufacturer (должен быть \"%s\")\n"
+" REF: Стр. 211, таблица D.1."
#, c-format
msgid ""
" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n"
" REF: Pages 59-60, section 5.3."
msgstr ""
+"\t**FAIL** Ðеверное ModelName – \"%c\" не разрешено в Ñтроке.\n"
+" REF: Стр. 59-60, раздел 5.3."
msgid ""
" **FAIL** Bad PSVersion - not \"(string) int\".\n"
" REF: Pages 62-64, section 5.3."
msgstr ""
+"\t**FAIL** ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ PSVersion – не «(string) int».\n"
+" REF: Стр. 62-64, раздел 5.3."
msgid ""
" **FAIL** Bad Product - not \"(string)\".\n"
" REF: Page 62, section 5.3."
msgstr ""
+"\t**FAIL** Ðеверный Product – не \"(string)\".\n"
+" REF: Стр. 62, раздел 5.3."
msgid ""
" **FAIL** Bad ShortNickName - longer than 31 chars.\n"
" REF: Pages 64-65, section 5.3."
msgstr ""
+"\t**FAIL** Ðеверный ShortNickName – длиннее чем 31 Ñимв.\n"
+" REF: Стр. 64-65, раздел 5.3."
#, c-format
msgid ""
" **FAIL** Bad option %s choice %s\n"
" REF: Page 84, section 5.9"
msgstr ""
+"\t**FAIL** Ðеверный параметр %s выбор %s\n"
+" REF: Стр. 84, раздел 5.9"
#, c-format
msgid " **FAIL** Default option code cannot be interpreted: %s"
-msgstr ""
+msgstr "\t**FAIL** Ðе удаетÑÑ Ð¾Ð¿Ð¾Ð·Ð½Ð°Ñ‚ÑŒ код параметра по умолчанию: %s"
#, c-format
msgid ""
" **FAIL** Default translation string for option %s choice %s contains "
"8-bit characters."
msgstr ""
+"\t**FAIL** Стандартный перевод Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s выбора %s Ñодержит 8-битовые "
+"Ñимволы."
#, c-format
msgid ""
" **FAIL** Default translation string for option %s contains 8-bit "
"characters."
msgstr ""
+"\t**FAIL** Стандартный перевод Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s Ñодержит 8-битовые Ñимволы."
#, c-format
msgid " **FAIL** Group names %s and %s differ only by case."
-msgstr ""
+msgstr "\t**FAIL** Имена групп %s и %s отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ региÑтром Ñимволов."
#, c-format
msgid " **FAIL** Multiple occurrences of option %s choice name %s."
-msgstr ""
+msgstr "\t**FAIL** Ð”Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° параметра %s Ð¸Ð¼Ñ %s вÑтречаетÑÑ Ð½ÐµÑколько раз."
#, c-format
msgid " **FAIL** Option %s choice names %s and %s differ only by case."
msgstr ""
+"\t**FAIL** Параметр %s Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ %s и %s отличаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ региÑтром "
+"Ñимволов."
#, c-format
msgid " **FAIL** Option names %s and %s differ only by case."
msgstr ""
+"\t**FAIL** ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² %s и %s отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ региÑтром Ñимволов."
#, c-format
msgid ""
" **FAIL** REQUIRED Default%s\n"
" REF: Page 40, section 4.5."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ Default%s\n"
+" REF: Стр. 40, раздел 4.5."
msgid ""
" **FAIL** REQUIRED DefaultImageableArea\n"
" REF: Page 102, section 5.15."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ DefaultImageableArea\n"
+" REF: Стр. 102, раздел 5.15."
msgid ""
" **FAIL** REQUIRED DefaultPaperDimension\n"
" REF: Page 103, section 5.15."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ DefaultPaperDimension\n"
+" REF: Стр. 103, раздел 5.15."
msgid ""
" **FAIL** REQUIRED FileVersion\n"
" REF: Page 56, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ FileVersion\n"
+" REF: Стр. 56, раздел 5.3."
msgid ""
" **FAIL** REQUIRED FormatVersion\n"
" REF: Page 56, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ FormatVersion\n"
+" REF: Стр. 56, раздел 5.3."
#, c-format
msgid ""
@@ -604,57 +681,81 @@ msgid ""
" REF: Page 41, section 5.\n"
" REF: Page 102, section 5.15."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ ImageableArea Ð´Ð»Ñ PageSize %s\n"
+" REF: Стр. 41, раздел 5.\n"
+" REF: Стр. 102, раздел 5.15."
msgid ""
" **FAIL** REQUIRED LanguageEncoding\n"
" REF: Pages 56-57, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ LanguageEncoding\n"
+" REF: Стр. 56-57, раздел 5.3."
msgid ""
" **FAIL** REQUIRED LanguageVersion\n"
" REF: Pages 57-58, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ LanguageVersion\n"
+" REF: Стр. 57-58, раздел 5.3."
msgid ""
" **FAIL** REQUIRED Manufacturer\n"
" REF: Pages 58-59, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ Manufacturer\n"
+" REF: Стр. 58-59, раздел 5.3."
msgid ""
" **FAIL** REQUIRED ModelName\n"
" REF: Pages 59-60, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ ModelName\n"
+" REF: Стр. 59-60, раздел 5.3."
msgid ""
" **FAIL** REQUIRED NickName\n"
" REF: Page 60, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ NickName\n"
+" REF: Стр. 60, раздел 5.3."
msgid ""
" **FAIL** REQUIRED PCFileName\n"
" REF: Pages 61-62, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ PCFileName\n"
+" REF: Стр. 61-62, раздел 5.3."
msgid ""
" **FAIL** REQUIRED PSVersion\n"
" REF: Pages 62-64, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ PSVersion\n"
+" REF: Стр. 62-64, раздел 5.3."
msgid ""
" **FAIL** REQUIRED PageRegion\n"
" REF: Page 100, section 5.14."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ PageRegion\n"
+" REF: Стр. 100, раздел 5.14."
msgid ""
" **FAIL** REQUIRED PageSize\n"
" REF: Page 41, section 5.\n"
" REF: Page 99, section 5.14."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ PageSize\n"
+" REF: Стр. 41, раздел 5.\n"
+" REF: Стр. 99, раздел 5.14."
msgid ""
" **FAIL** REQUIRED PageSize\n"
" REF: Pages 99-100, section 5.14."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ PageSize\n"
+" REF: Стр. 99-100, раздел 5.14."
#, c-format
msgid ""
@@ -662,56 +763,73 @@ msgid ""
" REF: Page 41, section 5.\n"
" REF: Page 103, section 5.15."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ PaperDimension Ð´Ð»Ñ PageSize %s\n"
+" REF: Стр. 41, раздел 5.\n"
+" REF: Стр. 103, раздел 5.15."
msgid ""
" **FAIL** REQUIRED Product\n"
" REF: Page 62, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ Product\n"
+" REF: Стр. 62, раздел 5.3."
msgid ""
" **FAIL** REQUIRED ShortNickName\n"
" REF: Page 64-65, section 5.3."
msgstr ""
+"\t**FAIL** ТРЕБУЕТСЯ ShortNickName\n"
+" REF: Стр. 64-65, раздел 5.3."
#, c-format
msgid " **FAIL** Unable to open PPD file - %s on line %d."
-msgstr ""
+msgstr "\t**FAIL** Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл – %s в Ñтроке %d."
#, c-format
msgid " %d ERRORS FOUND"
-msgstr ""
+msgstr " ОБÐÐРУЖЕÐО ОШИБОК: %d"
msgid " -h Show program usage"
-msgstr ""
+msgstr " -h Показать Ñправку по иÑпользованию программы"
#, c-format
msgid ""
" Bad %%%%BoundingBox: on line %d.\n"
" REF: Page 39, %%%%BoundingBox:"
msgstr ""
+" Ðеверный %%%%BoundingBox: в Ñтроке %d\n"
+" REF: Стр. 39, %%%%BoundingBox:"
#, c-format
msgid ""
" Bad %%%%Page: on line %d.\n"
" REF: Page 53, %%%%Page:"
msgstr ""
+" ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ %%%%Page: в Ñтроке %d\n"
+" REF: Стр. 53, %%%%Page:"
#, c-format
msgid ""
" Bad %%%%Pages: on line %d.\n"
" REF: Page 43, %%%%Pages:"
msgstr ""
+" ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ %%%%Pages: в Ñтроке %d\n"
+" REF: Стр. 43, %%%%Pages:"
#, c-format
msgid ""
" Line %d is longer than 255 characters (%d).\n"
" REF: Page 25, Line Length"
msgstr ""
+" Длина Ñтроки %d больше 255 Ñимволов (%d)\n"
+" REF: Стр. 25, Длина Ñтроки "
msgid ""
" Missing %!PS-Adobe-3.0 on first line.\n"
" REF: Page 17, 3.1 Conforming Documents"
msgstr ""
+" %!PS-Adobe-3.0 отÑутÑтвует в первой Ñтроке.\n"
+" REF: Стр. 17, 3.1 СоответÑтвующие документы"
#, c-format
msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments"
@@ -722,260 +840,755 @@ msgid ""
" Missing or bad %%BoundingBox: comment.\n"
" REF: Page 39, %%BoundingBox:"
msgstr ""
+" ОтÑутÑтвует или неверный %%BoundingBox: комментарий.\n"
+" REF: Стр. 39, %%BoundingBox:"
#, c-format
msgid ""
" Missing or bad %%Page: comments.\n"
" REF: Page 53, %%Page:"
msgstr ""
+" ОтÑутÑтвует или Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ %%Page: комментарий.\n"
+" REF: Стр. 53, %%Page:"
#, c-format
msgid ""
" Missing or bad %%Pages: comment.\n"
" REF: Page 43, %%Pages:"
msgstr ""
+" ОтÑутÑтвуют или неверные %%Pages: комментарий.\n"
+" REF: Стр. 43, %%Pages:"
msgid " NO ERRORS FOUND"
-msgstr ""
+msgstr " ОШИБОК ÐЕ ОБÐÐРУЖЕÐО"
#, c-format
msgid " Saw %d lines that exceeded 255 characters."
-msgstr ""
+msgstr "\tÐайдено %d Ñтрок, длина которых превышает 255 Ñимволов."
#, c-format
msgid " Too many %%BeginDocument comments."
-msgstr ""
+msgstr "\tСлишком много комментариев %%BeginDocument"
#, c-format
msgid " Too many %%EndDocument comments."
-msgstr ""
+msgstr "\tСлишком много комментариев %%EndDocument"
msgid " Warning: file contains binary data."
-msgstr ""
+msgstr "\tWARNING: файл Ñодержит бинарные данные."
#, c-format
msgid " Warning: no %%EndComments comment in file."
-msgstr ""
+msgstr " WARNING: нет ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ %%EndComments в файле."
#, c-format
msgid " Warning: obsolete DSC version %.1f in file."
-msgstr ""
+msgstr " WARNING: уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð²ÐµÑ€ÑÐ¸Ñ DSC %.1f в файле."
+
+msgid " ! expression Unary NOT of expression."
+msgstr " ! expression ЛогичеÑкое NOT Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ."
+
+msgid " ( expressions ) Group expressions."
+msgstr " ( expressions ) Группа выражений."
msgid " --[no-]debug-logging Turn debug logging on/off."
-msgstr ""
+msgstr " --[no-]debug-logging Вкл./откл. ведение журнала."
msgid " --[no-]remote-admin Turn remote administration on/off."
-msgstr ""
+msgstr " --[no-]remote-admin Вкл./откл. удаленное админиÑтрирование."
msgid " --[no-]remote-any Allow/prevent access from the Internet."
-msgstr ""
+msgstr " --[no-]remote-any РазрешаетÑÑ/запрещаетÑÑ Ð´Ð¾Ñтуп из Интернет."
msgid " --[no-]share-printers Turn printer sharing on/off."
msgstr ""
+" --[no-]share-printers Вкл./откл. ÑовмеÑтное иÑпользование принтеров."
msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job."
msgstr ""
+" --[no-]user-cancel-any ПользователÑм разрешаетÑÑ/запрещаетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½ÑÑ‚ÑŒ "
+"заданиÑ."
msgid " --cr End lines with CR (Mac OS 9)."
-msgstr ""
+msgstr " --cr Строки заканчиваютÑÑ Ð½Ð° CR (Mac OS 9)."
msgid " --crlf End lines with CR + LF (Windows)."
+msgstr " --crlf Строки заканчиваютÑÑ Ð½Ð° CR + LF (Windows)."
+
+msgid " --domain regex Match domain to regular expression."
+msgstr " --domain regex ИÑкать домен по регулÑрному выражению."
+
+msgid ""
+" --exec utility [argument ...] ;\n"
+" Execute program if true."
msgstr ""
+" --exec utility [argument ...] ;\n"
+" Выполнить программу."
+
+msgid " --false Always false."
+msgstr " --false Ð’Ñегда Ложь."
+
+msgid " --help Show help."
+msgstr " --help Показать Ñправку."
+
+msgid " --help Show this help."
+msgstr " --help Показать Ñту Ñправку."
+
+msgid " --host regex Match hostname to regular expression."
+msgstr " --host regex Ðайти hostname по регулÑрному выражению."
msgid " --lf End lines with LF (UNIX/Linux/OS X)."
msgstr ""
+" --lf Строки заканчиваютÑÑ Ð½Ð° LF (UNIX/Linux/Mac OS X)."
-msgid " -4 Connect using IPv4."
+msgid " --list-filters List filters that will be used."
msgstr ""
+" --list-filters СпиÑок фильтров которые должны иÑпользоватьÑÑ."
-msgid " -6 Connect using IPv6."
+msgid " --local True if service is local."
+msgstr " --local \"ИÑтина\" еÑли ÑÐµÑ€Ð²Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¹."
+
+msgid " --ls List attributes."
+msgstr " --ls СпиÑок атрибутов."
+
+msgid " --name regex Match service name to regular expression."
+msgstr " --name regex Ðайти Ð¸Ð¼Ñ Ð¿Ð¾ регулÑрному выражению."
+
+msgid " --not expression Unary NOT of expression."
+msgstr " --not expression ЛогичеÑкое NOT Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ."
+
+msgid " --path regex Match resource path to regular expression."
+msgstr ""
+" --path regex Ðайти путь к реÑурÑу по регулÑрному выражению."
+
+msgid " --port number[-number] Match port to number or range."
+msgstr ""
+" --port number[-number] Ðайти номер порта по номеру или диапазону портов."
+
+msgid " --print Print URI if true."
+msgstr " --print Печать URI при ÑоответÑтвии."
+
+msgid " --print-name Print service name if true."
+msgstr " --print-name Печать имени ÑервиÑа еÑли ÑоответÑтвует."
+
+msgid " --quiet Quietly report match via exit code."
+msgstr ""
+" --quiet Кратко уведомлÑÑ‚ÑŒ о Ñовпадении через код выхода."
+
+msgid " --remote True if service is remote."
+msgstr " --remote \"ИÑтина\" еÑли ÑÐµÑ€Ð²Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ð¹."
+
+msgid ""
+" --stop-after-include-error\n"
+" Stop tests after a failed INCLUDE."
msgstr ""
+" --stop-after-include-error\n"
+" ОÑтанавливать проверку поÑле ошибки INCLUDE."
+
+msgid " --true Always true."
+msgstr " --true Ð’Ñегда ИÑтина."
+
+msgid " --txt key True if the TXT record contains the key."
+msgstr " --txt key \"ИÑтина\" еÑли TXT запиÑÑŒ Ñодержит key."
+
+msgid " --txt-* regex Match TXT record key to regular expression."
+msgstr " --txt-* regex Ðайти запиÑÑŒ TXT по регулÑрному выражению."
+
+msgid " --uri regex Match URI to regular expression."
+msgstr " --uri regex Ðайти URI по регулÑрному выражению."
+
+msgid " --version Show program version."
+msgstr " --version Показать верÑию программы."
+
+msgid " --version Show version."
+msgstr " --version Показать верÑию."
+
+msgid " -4 Connect using IPv4."
+msgstr " -4 Соединение иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ IPv4."
+
+msgid " -6 Connect using IPv6."
+msgstr " -6 Соединение иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ IPv6."
msgid " -C Send requests using chunking (default)."
msgstr ""
+" -C Передача запроÑа Ñ Ð¸Ñпользованием chunking (по "
+"умолчанию)"
msgid " -D Remove the input file when finished."
-msgstr ""
+msgstr " -D Удалить входной файл поÑле завершениÑ."
msgid " -D name=value Set named variable to value."
-msgstr ""
+msgstr " -D name=value Определение переменной."
msgid " -E Encrypt the connection."
-msgstr ""
+msgstr " -E Подключение к Ñерверу шифруетÑÑ."
msgid " -E Test with HTTP Upgrade to TLS."
-msgstr ""
+msgstr " -E ПроверÑÑ‚ÑŒ что HTTP иÑпользует TLS."
msgid ""
" -F Run in the foreground but detach from console."
msgstr ""
+" -F ЗапуÑкать Ñ Ð²Ñ‹Ñоким приоритетом и отдельно от "
+"конÑоли."
msgid " -H samba-server Use the named SAMBA server."
-msgstr ""
+msgstr " -H samba-server ИÑпользовать заданный Ñервер SAMBA."
msgid " -I Ignore errors."
-msgstr ""
+msgstr " -I Игнорировать ошибки."
msgid " -I include-dir Add include directory to search path."
-msgstr ""
+msgstr " -I include-dir Добавить каталог include в путь поиÑка."
msgid " -I {filename,filters,none,profiles}"
-msgstr ""
+msgstr " -I {filename,filters,none,profiles}"
msgid " -L Send requests using content-length."
msgstr ""
+" -L Передача запроÑа Ñ Ð¸Ñпользованием content-length."
+
+msgid ""
+" -P filename.plist Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+" -P filename.plist ВывеÑти XML plist в файл и проверить результат на "
+"Ñтандартном выводе."
msgid " -P filename.ppd Set PPD file."
+msgstr " -P filename.ppd Задать PPD-файл."
+
+msgid " -P number[-number] Match port to number or range."
msgstr ""
+" -P number[-number] Ðайти номер порта по номеру или диапазону портов."
msgid " -R root-directory Set alternate root."
-msgstr ""
+msgstr " -R root-directory Задать корневой каталог."
msgid " -S Test with SSL encryption."
-msgstr ""
+msgstr " -S ПроверÑÑ‚ÑŒ шифрование SSL."
+
+msgid " -T seconds Set the browse timeout in seconds."
+msgstr " -T seconds Задать Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð² Ñекундах."
msgid " -T seconds Set the receive/send timeout in seconds."
msgstr ""
+" -T seconds Задать Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð°/передачи в Ñекундах."
msgid " -U username Specify username."
-msgstr ""
+msgstr " -U username Указание имени пользователÑ."
msgid " -V version Set default IPP version."
-msgstr ""
+msgstr " -V version Задать верÑию IPP по умолчанию."
msgid ""
" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
"translations}"
msgstr ""
+" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
msgid " -X Produce XML plist instead of plain text."
-msgstr ""
+msgstr " -X Выводить XML plist вмеÑто обычного текÑта."
+
+msgid " -a Browse for all services."
+msgstr " -a Обзор вÑех ÑервиÑов."
msgid " -a Export all printers."
-msgstr ""
+msgstr " -a ЭкÑпорт вÑех принтеров."
+
+msgid " -c Produce CSV output."
+msgstr " -c Вывод в формате CSV."
msgid " -c catalog.po Load the specified message catalog."
-msgstr ""
+msgstr " -c catalog.po ЗагружаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¹ каталог Ñообщений."
+
+msgid " -c cups-files.conf Set cups-files.conf file to use."
+msgstr " -c cups-files.conf ИÑпользовать заданный cups-files.conf"
msgid " -c cupsd.conf Set cupsd.conf file to use."
-msgstr ""
+msgstr " -c cupsd.conf ИÑпользовать заданный cupsd.conf"
+
+msgid " -d domain Browse/resolve in specified domain."
+msgstr " -d domain ПроÑмотр в заданном домене."
msgid " -d name=value Set named variable to value."
-msgstr ""
+msgstr " -d name=value Указанной переменной приÑваиваетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ."
msgid " -d output-dir Specify the output directory."
-msgstr ""
+msgstr " -d output-dir Задать выходной каталог."
msgid " -d printer Use the named printer."
-msgstr ""
+msgstr " -d printer ИÑпользовать заданный принтер."
+
+msgid " -d regex Match domain to regular expression."
+msgstr " -d regex ИÑкать домен по регулÑрному выражению."
msgid " -e Use every filter from the PPD file."
-msgstr ""
+msgstr " -e ИÑпользовать каждый фильтр из PPD-файла."
msgid " -f Run in the foreground."
-msgstr ""
+msgstr " -f ЗапуÑкать Ñ Ð²Ñ‹Ñоким приоритетом."
msgid " -f filename Set default request filename."
-msgstr ""
+msgstr " -f filename Задать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° по умолчанию."
msgid " -h Show this usage message."
-msgstr ""
+msgstr " -h Show this usage message."
+
+msgid " -h regex Match hostname to regular expression."
+msgstr " -h regex Ðайти hostname по регулÑрному выражению."
msgid " -h server[:port] Specify server address."
-msgstr ""
+msgstr " -h server[:port] Задать Ð°Ð´Ñ€ÐµÑ Ð¸ порт Ñервера."
msgid " -i mime/type Set input MIME type (otherwise auto-typed)."
msgstr ""
+" -i mime/type Указать MIME-тип данных на входе (иначе "
+"автоопред.)."
msgid ""
" -i seconds Repeat the last file with the given time interval."
msgstr ""
+" -i seconds Повтор поÑледнего файла через заданный интервал в "
+"Ñек."
msgid ""
" -j job-id[,N] Filter file N from the specified job (default is "
"file 1)."
msgstr ""
+" -j job-id[,N] Из указанного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±Ð¸Ñ€Ð°ÐµÑ‚ÑÑ Ñ„Ð°Ð¹Ð» N (по "
+"умолчанию файл 1)."
-msgid " -l Run cupsd from launchd(8)."
-msgstr ""
+msgid " -l List attributes."
+msgstr " -l СпиÑок атрибутов."
+
+msgid " -l Produce plain text output."
+msgstr " -l Вывод в формате проÑтого текÑта."
+
+msgid " -l Run cupsd on demand."
+msgstr " -l ЗапуÑкать cupsd по запроÑу."
msgid " -l lang[,lang,...] Specify the output language(s) (locale)."
-msgstr ""
+msgstr " -l lang[,lang,...] Задать выходной Ñзык(и) (locale)."
msgid " -m Use the ModelName value as the filename."
msgstr ""
+" -m Ð’ качеÑтве имени файла иÑпользуетÑÑ ModelName."
msgid ""
" -m mime/type Set output MIME type (otherwise application/pdf)."
msgstr ""
+" -m mime/type Указать MIME-тип данных на выходе (иначе "
+"application/pdf)."
msgid " -n copies Set number of copies."
-msgstr ""
+msgstr " -n copies Указать количеÑтво копий."
msgid ""
" -n count Repeat the last file the given number of times."
-msgstr ""
+msgstr " -n count Повтор поÑледнего файла заданное чиÑло раз."
+
+msgid " -n regex Match service name to regular expression."
+msgstr " -n regex Ðайти Ð¸Ð¼Ñ Ð¿Ð¾ регулÑрному выражению."
msgid ""
" -o filename.drv Set driver information file (otherwise ppdi.drv)."
msgstr ""
+" -o filename.drv Указать файл Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о драйвере (иначе ppdi."
+"drv)."
msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)."
-msgstr ""
+msgstr " -o filename.ppd[.gz] Задать выходной файл (иначе stdout)."
msgid " -o name=value Set option(s)."
-msgstr ""
+msgstr " -o name=value Задать параметры."
+
+msgid " -p Print URI if true."
+msgstr " -p Печать URI при ÑоответÑтвии."
msgid " -p filename.ppd Set PPD file."
+msgstr " -p filename.ppd Задать PPD-файл."
+
+msgid " -p program Run specified program for each service."
+msgstr " -p program ЗапуÑтить указанную программу."
+
+msgid " -q Quietly report match via exit code."
msgstr ""
+" -q Кратко уведомлÑÑ‚ÑŒ о Ñовпадении через код выхода."
msgid " -q Run silently."
-msgstr ""
+msgstr " -q Команда выполнÑетÑÑ Ð² «тихом» режиме."
+
+msgid " -r True if service is remote."
+msgstr " -r \"ИÑтина\" еÑли ÑÐµÑ€Ð²Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ð¹."
msgid " -r Use 'relaxed' open mode."
-msgstr ""
+msgstr " -r ИÑпользуетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¹ режим."
+
+msgid " -s Print service name if true."
+msgstr " -s Печать имени ÑервиÑа еÑли ÑоответÑтвует."
msgid " -t Produce a test report."
-msgstr ""
+msgstr " -t Создать теÑтовый отчет."
msgid " -t Test PPDs instead of generating them."
-msgstr ""
+msgstr " -t ТеÑÑ‚ PPDs вмеÑто его ÑозданиÑ."
msgid " -t Test the configuration file."
-msgstr ""
+msgstr " -t Проверка файла конфигурации."
+
+msgid " -t key True if the TXT record contains the key."
+msgstr " -t key \"ИÑтина\" еÑли TXT запиÑÑŒ Ñодержит key."
msgid " -t title Set title."
-msgstr ""
+msgstr " -t title Задать заголовок."
+
+msgid " -t type Browse/resolve with specified type."
+msgstr " -t type ПроÑмотр/определение по указанному типу."
msgid " -u Remove the PPD file when finished."
-msgstr ""
+msgstr " -u Удалить PPD-файл поÑле завершениÑ."
+
+msgid " -u regex Match URI to regular expression."
+msgstr " -u regex Ðайти URI по регулÑрному выражению."
msgid " -v Be verbose."
-msgstr ""
+msgstr " -v Подробный вывод лога."
msgid " -vv Be very verbose."
+msgstr " -vv Очень подробный вывод лога."
+
+msgid ""
+" -x utility [argument ...] ;\n"
+" Execute program if true."
msgstr ""
+" -x utility [argument ...] ;\n"
+" Выполнить программу."
msgid " -z Compress PPD files using GNU zip."
+msgstr " -z Сжимать PPD-файл иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ GNU zip."
+
+msgid " IPPFIND_SERVICE_DOMAIN Domain name"
+msgstr " IPPFIND_SERVICE_DOMAIN Ð˜Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°"
+
+msgid ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Fully-qualified domain name"
msgstr ""
+" IPPFIND_SERVICE_HOSTNAME\n"
+" Полный путь Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ домена"
-msgid " FAIL"
+msgid " IPPFIND_SERVICE_NAME Service instance name"
+msgstr " IPPFIND_SERVICE_NAME Ð˜Ð¼Ñ ÑервиÑа"
+
+msgid " IPPFIND_SERVICE_PORT Port number"
+msgstr " IPPFIND_SERVICE_PORT Ðомер порта"
+
+msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr " IPPFIND_SERVICE_REGTYPE Тип региÑтрации DNS-SD"
+
+msgid " IPPFIND_SERVICE_SCHEME URI scheme"
+msgstr " IPPFIND_SERVICE_SCHEME Схема URI"
+
+msgid " IPPFIND_SERVICE_URI URI"
+msgstr " IPPFIND_SERVICE_URI URI"
+
+msgid " IPPFIND_TXT_* Value of TXT record key"
+msgstr " IPPFIND_TXT_* Значение TXT запиÑи key"
+
+msgid ""
+" expression --and expression\n"
+" Logical AND."
msgstr ""
+" expression --and expression\n"
+" ЛогичеÑкое И."
+
+msgid ""
+" expression --or expression\n"
+" Logical OR."
+msgstr ""
+" expression --or expression\n"
+" ЛогичеÑкое ИЛИ."
+
+msgid " expression expression Logical AND."
+msgstr " expression expression ЛогичеÑкое И."
+
+msgid " {service_domain} Domain name"
+msgstr " {service_domain} Ð˜Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°"
+
+msgid " {service_hostname} Fully-qualified domain name"
+msgstr " {service_hostname} Полный путь Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ домена"
+
+msgid " {service_name} Service instance name"
+msgstr " {service_name} Ð˜Ð¼Ñ ÑервиÑа"
+
+msgid " {service_port} Port number"
+msgstr " {service_port} Ðомер порта"
+
+msgid " {service_regtype} DNS-SD registration type"
+msgstr " {service_regtype} Тип региÑтрации DNS-SD"
+
+msgid " {service_scheme} URI scheme"
+msgstr " {service_scheme} Схема URI"
+
+msgid " {service_uri} URI"
+msgstr " {service_uri} URI"
+
+msgid " {txt_*} Value of TXT record key"
+msgstr " {txt_*} Значение TXT запиÑи key"
+
+msgid " {} URI"
+msgstr " {} URI"
+
+msgid " FAIL"
+msgstr " FAIL"
msgid " PASS"
+msgstr " PASS"
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr "\"%s\": Ðеправильное значение URI \"%s\" - %s (RFC 2911 раздел 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
msgstr ""
+"\"%s\": Ðеправильное значение URI \"%s\" - ошибка длины %d (RFC 2911 раздел "
+"4.1.5)."
#, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
msgstr ""
+"\"%s\": Ðеправильный атрибут имени - ошибка длины %d (RFC 2911 раздел 4.1.3)."
#, c-format
-msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
msgstr ""
+"\"%s\": Ðеправильный атрибут имени - недопуÑтимый Ñимвол (RFC 2911 раздел "
+"4.1.3)."
#, c-format
-msgid "%s accepting requests since %s"
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": Ðеправильное двоичное значение %d (RFC 2911 раздел 4.1.11)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": Ðеправильное Ñимвольное значение \"%s\" - недопуÑтимые Ñимволы (RFC "
+"2911 раздел 4.1.7)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
msgstr ""
+"\"%s\": Ðеправильное Ñимвольное значение \"%s\" - ошибка длины %d (RFC 2911 "
+"раздел 4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime UTC чаÑов %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime UTC минут %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime UTC sign '%c' (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime дни %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime миллиÑекунды %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime чаÑÑ‹ %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime минуты %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime меÑÑц %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime Ñекунды %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+"\"%s\": Ошибка в значении %d - за пределами диапазона (RFC 2911 раздел "
+"4.1.4)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Ошибка в значении \"%s\" - Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° %d (RFC 2911 раздел "
+"4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": Ошибка в значении \"%s\" - недопуÑтимый Ñимвол (RFC 2911 раздел "
+"4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": Ошибка mimeMediaType значение \"%s\" - недопуÑтимые Ñимволы (RFC "
+"2911 раздел 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": Ошибка mimeMediaType значение \"%s\" - Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° %d (RFC "
+"2911 раздел 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": Ðеправильное Ð¸Ð¼Ñ \"%s\" - ошибка в UTF-8 (RFC 2911 раздел 4.1.2)."
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": Ðеправильное Ð¸Ð¼Ñ \"%s\" - Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° %d (RFC 2911 раздел "
+"4.1.2)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Ошибка naturalLanguage значение \"%s\" - недопуÑтимые Ñимволы (RFC "
+"2911 раздел 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Ошибка naturalLanguage значение \"%s\" - Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° %d (RFC "
+"2911 раздел 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": Ошибка Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ octetString - Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° %d (RFC 2911 раздел "
+"4.1.10)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": Ошибка rangeOfInteger значение %d-%d - первое больше чем второе (RFC "
+"2911 раздел 4.1.13)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": Ðеправильное значение Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ %dx%d%s - ошибка в значении units "
+"(RFC 2911 раздел 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Ðеправильное значение Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ %dx%d%s - значение cross feed "
+"должно быть положительным (RFC 2911 раздел 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Ðеправильное значение Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ %dx%d%s - значение feed должно быть "
+"положительным (RFC 2911 раздел 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Ðеправильное текÑтовое значение \"%s\" - ошибка в UTF-8 (RFC 2911 "
+"раздел 4.1.1)."
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Ðеправильное текÑтовое значение \"%s\" - ошибка длины %d (RFC 2911 "
+"раздел 4.1.1)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Ошибка uriScheme значение \"%s\" - недопуÑтимые Ñимволы (RFC 2911 "
+"раздел 4.1.6)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Ошибка uriScheme значение \"%s\" - ошибка длины %d (RFC 2911 раздел "
+"4.1.6)."
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
+msgstr "%-7s %-7.7s %-7d %-31.31s %.0f байт"
+
+#, c-format
+msgid "%d x %d mm"
+msgstr "%d x %d мм"
+
+#, c-format
+msgid "%g x %g"
+msgstr "%g x %g"
+
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#, c-format
+msgid "%s (%s, %s)"
+msgstr "%s (%s, %s)"
+
+#, c-format
+msgid "%s (Borderless)"
+msgstr "%s (без полей)"
+
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr "%s (без полей, %s)"
+
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr "%s (без полей, %s, %s)"
+
+#, c-format
+msgid "%s accepting requests since %s"
+msgstr "%s принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s"
#, c-format
msgid "%s cannot be changed."
@@ -983,297 +1596,354 @@ msgstr "%s не может быть изменен."
#, c-format
msgid "%s is not implemented by the CUPS version of lpc."
-msgstr ""
+msgstr "%s не выполнено верÑией CUPS Ð´Ð»Ñ lpc."
#, c-format
msgid "%s is not ready"
-msgstr ""
+msgstr "%s не готов"
#, c-format
msgid "%s is ready"
-msgstr ""
+msgstr "%s готов"
#, c-format
msgid "%s is ready and printing"
-msgstr ""
+msgstr "%s готов и печатает"
#, c-format
msgid "%s job-id user title copies options [file]"
-msgstr ""
+msgstr "%s задание пользователь название копий параметры [файл]"
#, c-format
msgid "%s not accepting requests since %s -"
-msgstr ""
+msgstr "%s не принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -"
#, c-format
msgid "%s not supported."
-msgstr ""
+msgstr "%s не поддерживаетÑÑ."
#, c-format
msgid "%s/%s accepting requests since %s"
-msgstr ""
+msgstr "%s/%s принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s"
#, c-format
msgid "%s/%s not accepting requests since %s -"
-msgstr ""
+msgstr "%s/%s не принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -"
#, c-format
msgid "%s: %-33.33s [job %d localhost]"
-msgstr ""
+msgstr "%s: %-33.33s [задание %d localhost]"
#. TRANSLATORS: Message is "subject: error"
#, c-format
msgid "%s: %s"
-msgstr ""
+msgstr "%s: %s"
#, c-format
msgid "%s: %s failed: %s"
+msgstr "%s: ошибка %s: %s"
+
+#, c-format
+msgid "%s: Bad printer URI \"%s\"."
msgstr ""
#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr "%s: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s Ð´Ð»Ñ \"-V\"."
+
+#, c-format
msgid "%s: Don't know what to do."
-msgstr ""
+msgstr "%s: Дальнейшие дейÑÑ‚Ð²Ð¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтны."
#, c-format
msgid ""
"%s: Error - %s environment variable names non-existent destination \"%s\"."
msgstr ""
+"%s: Ошибка - %s Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ на неÑущеÑтвующее назначение "
+"\"%s\"."
#, c-format
msgid "%s: Error - add '/version=1.1' to server name."
-msgstr ""
+msgstr "%s: Ошибка - добавьте '/version=1.1' к имени Ñервера."
#, c-format
msgid "%s: Error - bad job ID."
-msgstr ""
+msgstr "%s: Ошибка - неверный ID заданиÑ."
#, c-format
msgid "%s: Error - cannot print files and alter jobs simultaneously."
msgstr ""
+"%s: Ошибка - невозможно печатать файлы и редактировать Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾."
#, c-format
msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
msgstr ""
+"%s: Ошибка - не удаетÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ из stdin, еÑли предоÑтавлены файлы или ID "
+"заданиÑ."
#, c-format
msgid "%s: Error - expected character set after \"-S\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-S\" должен идти набор Ñимволов."
#, c-format
msgid "%s: Error - expected content type after \"-T\" option."
msgstr ""
+"%s: Ошибка - поÑле параметра \"-T\" должен быть указан тип Ñодержимого."
#, c-format
msgid "%s: Error - expected copies after \"-#\" option."
msgstr ""
+"%s: Ошибка - поÑле параметра \"-#\" должно быть указано количеÑтво копий."
#, c-format
msgid "%s: Error - expected copies after \"-n\" option."
msgstr ""
+"%s: Ошибка - поÑле параметра \"-n\" должно быть указано количеÑтво копий."
#, c-format
msgid "%s: Error - expected destination after \"-P\" option."
-msgstr ""
-
-#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-P\" должно быть указано назначение."
#, c-format
msgid "%s: Error - expected destination after \"-d\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-d\" должно быть указано назначение."
#, c-format
msgid "%s: Error - expected form after \"-f\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-f\" должна быть указана форма."
#, c-format
msgid "%s: Error - expected hold name after \"-H\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-H\" должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта."
#, c-format
msgid "%s: Error - expected hostname after \"-H\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-H\" должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта."
#, c-format
msgid "%s: Error - expected hostname after \"-h\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-h\" должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта."
#, c-format
msgid "%s: Error - expected mode list after \"-y\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-y\" должен быть указан ÑпиÑок режимов."
#, c-format
msgid "%s: Error - expected name after \"-%c\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-%c\" должно быть указано имÑ."
#, c-format
msgid "%s: Error - expected option=value after \"-o\" option."
msgstr ""
+"%s: Ошибка - поÑле параметра '-o' должна быть указана Ñтрока вида "
+"option=value"
#, c-format
msgid "%s: Error - expected page list after \"-P\" option."
-msgstr ""
+msgstr "%s: Ошибка – поÑле параметра \"-P\" должен идти ÑпиÑок Ñтраниц."
#, c-format
msgid "%s: Error - expected priority after \"-%c\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-%c\" должен быть указан приоритет."
#, c-format
msgid "%s: Error - expected reason text after \"-r\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-r\" должен идти текÑÑ‚ причины."
#, c-format
msgid "%s: Error - expected title after \"-t\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-t\" должен быть указан заголовок."
#, c-format
msgid "%s: Error - expected username after \"-U\" option."
msgstr ""
+"%s: Ошибка - поÑле параметра \"-U\" должно быть указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ."
#, c-format
msgid "%s: Error - expected username after \"-u\" option."
msgstr ""
+"%s: Ошибка - поÑле параметра \"-u\" должно быть указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ."
#, c-format
msgid "%s: Error - expected value after \"-%c\" option."
-msgstr ""
+msgstr "%s: Ошибка - поÑле параметра \"-%c\" должно быть указано значение."
#, c-format
msgid ""
"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" "
"option."
msgstr ""
+"%s: Ошибка - требуетÑÑ \"завершено\",\"не завершено\" или \"вÑе\" поÑле "
+"параметра \"-W\" "
#, c-format
msgid "%s: Error - no default destination available."
-msgstr ""
+msgstr "%s: Ошибка – нет доÑтупного Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
#, c-format
msgid "%s: Error - priority must be between 1 and 100."
-msgstr ""
+msgstr "%s: Ошибка – приоритет должен быть от 1 до 100."
#, c-format
msgid "%s: Error - scheduler not responding."
-msgstr ""
+msgstr "%s: Ошибка - планировщик не отвечает."
#, c-format
msgid "%s: Error - too many files - \"%s\"."
-msgstr ""
+msgstr "%s: Ошибка – Ñлишком много файлов – \"%s\"."
#, c-format
msgid "%s: Error - unable to access \"%s\" - %s"
-msgstr ""
+msgstr "%s: Ошибка – не удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к \"%s\" – %s"
#, c-format
msgid "%s: Error - unable to queue from stdin - %s."
-msgstr ""
+msgstr "%s: Ошибка – не удаетÑÑ Ð¿Ð¾Ñтавить в очередь из stdin - %s."
#, c-format
msgid "%s: Error - unknown destination \"%s\"."
-msgstr ""
+msgstr "%s: Ошибка - неизвеÑтное назначение \"%s\"."
#, c-format
msgid "%s: Error - unknown destination \"%s/%s\"."
-msgstr ""
+msgstr "%s: ошибка - неизвеÑтное назначение \"%s/%s\"."
#, c-format
msgid "%s: Error - unknown option \"%c\"."
-msgstr ""
+msgstr "%s: Ошибка - неизвеÑтный параметр \"%c\"."
#, c-format
msgid "%s: Error - unknown option \"%s\"."
-msgstr ""
+msgstr "%s: Ошибка - неизвеÑтный параметр \"%s\"."
#, c-format
msgid "%s: Expected job ID after \"-i\" option."
-msgstr ""
+msgstr "%s: ПоÑле параметра \"-i\" должен быть указан ID заданиÑ."
#, c-format
msgid "%s: Invalid destination name in list \"%s\"."
-msgstr ""
+msgstr "%s: ÐедопуÑтимое Ð¸Ð¼Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² ÑпиÑке \"%s\"."
#, c-format
msgid "%s: Invalid filter string \"%s\"."
-msgstr ""
+msgstr "%s: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока фильтра \"%s\"."
+
+#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr "%s: Пропущено Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ \"-P\"."
+
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr "%s: Пропущен таймаут Ð´Ð»Ñ \"-T\"."
+
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr "%s: Пропущена верÑÐ¸Ñ Ð´Ð»Ñ \"-V\"."
#, c-format
msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
-msgstr ""
+msgstr "%s: Ðеобходимо указать ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ (\"-i jobid\") перед \"-H restart\"."
#, c-format
msgid "%s: No filter to convert from %s/%s to %s/%s."
msgstr ""
+"%s: ОтÑутÑтвует фильтр, необходимый Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· %s/%s в %s/%s."
#, c-format
msgid "%s: Operation failed: %s"
-msgstr ""
+msgstr "%s: ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ: %s"
#, c-format
msgid "%s: Sorry, no encryption support."
+msgstr "%s: Ðет поддержки шифрованиÑ."
+
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
msgstr ""
#, c-format
msgid "%s: Unable to connect to server."
-msgstr ""
+msgstr "%s: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу."
#, c-format
msgid "%s: Unable to contact server."
+msgstr "%s: Ðе удаетÑÑ ÑƒÑтановить ÑвÑзь Ñ Ñервером."
+
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
msgstr ""
#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"."
-msgstr ""
+msgstr "%s: Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ тип MIME \"%s\"."
+
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr "%s: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ \"%s\": %s"
#, c-format
msgid "%s: Unable to open %s: %s"
-msgstr ""
+msgstr "%s: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ %s: %s"
#, c-format
msgid "%s: Unable to open PPD file: %s on line %d."
-msgstr ""
+msgstr "%s: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл: %s в Ñтроке %d."
#, c-format
msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
+msgstr "%s: Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ базу данных MIME из \"%s\" или \"%s\"."
+
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
msgstr ""
#, c-format
msgid "%s: Unknown destination \"%s\"."
-msgstr ""
+msgstr "%s: ÐеизвеÑтное назначение \"%s\"."
#, c-format
msgid "%s: Unknown destination MIME type %s/%s."
-msgstr ""
+msgstr "%s: ÐеизвеÑтный MIME-тип Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s/%s."
#, c-format
msgid "%s: Unknown option \"%c\"."
-msgstr ""
+msgstr "%s: ÐеизвеÑтный параметр \"%c\"."
+
+#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr "%s: ÐеизвеÑтный параметр \"%s\"."
+
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr "%s: ÐеизвеÑтный параметр \"-%c\"."
#, c-format
msgid "%s: Unknown source MIME type %s/%s."
-msgstr ""
+msgstr "%s: ÐеизвеÑтный MIME-тип иÑточника %s/%s."
#, c-format
msgid ""
"%s: Warning - \"%c\" format modifier not supported - output may not be "
"correct."
msgstr ""
+"%s: Внимание - модификатор формата \"%c\" не поддерживаетÑÑ - вывод может "
+"быть неправильным."
#, c-format
msgid "%s: Warning - character set option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр набора Ñимволов пропущен."
#, c-format
msgid "%s: Warning - content type option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр типа Ñодержимого пропущен."
#, c-format
msgid "%s: Warning - form option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр формы пропущен."
#, c-format
msgid "%s: Warning - mode option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр режима пропущен."
msgid "-1"
msgstr "-1"
@@ -1803,9 +2473,6 @@ msgstr ""
msgid "70"
msgstr "70"
-msgid "720dpi"
-msgstr "720dpi"
-
msgid "75"
msgstr "75"
@@ -1880,11 +2547,11 @@ msgstr "Ð”Ð»Ñ ÑкÑпорта драйверов принтера требуе
#, c-format
msgid "A class named \"%s\" already exists."
-msgstr ""
+msgstr "Группа Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\" уже ÑущеÑтвует."
#, c-format
msgid "A printer named \"%s\" already exists."
-msgstr ""
+msgstr "Принтер Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\" уже ÑущеÑтвует."
msgid "A0"
msgstr "A0"
@@ -1995,7 +2662,7 @@ msgid "Accepted"
msgstr "ПринÑто"
msgid "Add Class"
-msgstr "Добавить клаÑÑ"
+msgstr "Добавить группу"
msgid "Add Printer"
msgstr "Добавить принтер"
@@ -2007,7 +2674,7 @@ msgid "Address"
msgstr "ÐдреÑ"
msgid "Administration"
-msgstr "ÐдминиÑтрациÑ"
+msgstr "ÐдминиÑтрирование"
msgid "Always"
msgstr "Ð’Ñегда"
@@ -2020,11 +2687,11 @@ msgstr "ИÑполнительное уÑтройÑтво"
#, c-format
msgid "Attempt to set %s printer-state to bad value %d."
-msgstr ""
+msgstr "Попытка уÑтановить %s printer-state на неверное значение %d"
#, c-format
msgid "Attribute groups are out of order (%x < %x)."
-msgstr ""
+msgstr "Ðтрибут группы не в диапазоне (%x < %x)"
msgid "B0"
msgstr "B0"
@@ -2090,6 +2757,9 @@ msgstr "Ðеверный номер верÑии SNMP"
msgid "Bad UIConstraints"
msgstr "Ðеверное значение UIConstraints"
+msgid "Bad arguments to function"
+msgstr "Ðеверные аргументы Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸"
+
#, c-format
msgid "Bad copies value %d."
msgstr "Ðеверное значение количеÑтва копий %d."
@@ -2099,56 +2769,57 @@ msgstr "Ðеверный индивидуальный параметр"
#, c-format
msgid "Bad device-uri \"%s\"."
-msgstr ""
+msgstr "Ðеверное значение device-uri \"%s\"."
#, c-format
msgid "Bad device-uri scheme \"%s\"."
-msgstr ""
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñхема device-uri \"%s\"."
#, c-format
msgid "Bad document-format \"%s\"."
-msgstr ""
+msgstr "Ðеверное значение document-format \"%s\"."
#, c-format
msgid "Bad document-format-default \"%s\"."
-msgstr ""
+msgstr "Ðеверное значение document-format-default \"%s\"."
msgid "Bad filename buffer"
msgstr "Ошибка в буфере filename"
-msgid "Bad job-name value: Bad UTF-8 sequence."
-msgstr ""
+msgid "Bad hostname/address in URI"
+msgstr "Ðеверный hostname/address в URI"
-msgid "Bad job-name value: Name too long."
-msgstr ""
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Ðеверное значение job-name: %s"
msgid "Bad job-name value: Wrong type or count."
-msgstr ""
+msgstr "Ðеверное значение job-name: Wrong type or count."
msgid "Bad job-priority value."
-msgstr ""
+msgstr "Ðеверное значение job-priority."
#, c-format
msgid "Bad job-sheets value \"%s\"."
-msgstr ""
+msgstr "Ðеверное значение job-sheets \"%s\"."
msgid "Bad job-sheets value type."
-msgstr ""
+msgstr "Ðеверный тип Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ job-sheets."
msgid "Bad job-state value."
-msgstr ""
+msgstr "Ðеверное значение job-state."
#, c-format
msgid "Bad job-uri \"%s\"."
-msgstr ""
+msgstr "Ðеверный job-uri \"%s\"."
#, c-format
msgid "Bad notify-pull-method \"%s\"."
-msgstr ""
+msgstr "Ðеверное значение notify-pull-method \"%s\"."
#, c-format
msgid "Bad notify-recipient-uri \"%s\"."
-msgstr ""
+msgstr "Ðеверный notify-recipient-uri \"%s\"."
#, c-format
msgid "Bad number-up value %d."
@@ -2156,37 +2827,52 @@ msgstr "Ðеверное значение number-up %d."
#, c-format
msgid "Bad option + choice on line %d."
-msgstr ""
+msgstr "Ðеверный параметр + выбор в Ñтроке %d."
#, c-format
msgid "Bad page-ranges values %d-%d."
msgstr "Ðеверные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ page-ranges %d-%d."
+msgid "Bad port number in URI"
+msgstr "Ðеверный номер порта в URI"
+
#, c-format
msgid "Bad port-monitor \"%s\"."
-msgstr ""
-
-msgid "Bad printer URI."
-msgstr ""
+msgstr "Ðеверное значение port-monitor \"%s\"."
#, c-format
msgid "Bad printer-state value %d."
-msgstr ""
+msgstr "Ðеверное значение printer-state %d."
+
+msgid "Bad printer-uri."
+msgstr "Ðеверное значение printer-uri"
#, c-format
msgid "Bad request ID %d."
-msgstr ""
+msgstr "Ðеверный ID запроÑа %d."
#, c-format
msgid "Bad request version number %d.%d."
+msgstr "Ðеверный номер верÑии запроÑа %d.%d."
+
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
msgstr ""
msgid "Bad subscription ID"
msgstr "Ðеверный ID подпиÑки"
+msgid "Bad username in URI"
+msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² URI"
+
msgid "Bad value string"
msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока значений"
+msgid "Bad/empty URI"
+msgstr "Ðеверный или пуÑтой URI"
+
msgid "Banners"
msgstr "Баннеры"
@@ -2195,10 +2881,10 @@ msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð½Ð°Ñ Ð±ÑƒÐ¼Ð°Ð³Ð°"
#, c-format
msgid "Boolean expected for waiteof option \"%s\"."
-msgstr ""
+msgstr "Параметр waiteof \"%s\" должен иметь двоичное значение"
msgid "Buffer overflow detected, aborting."
-msgstr ""
+msgstr "Обнаружено переполнение буфера, прерывание."
msgid "CMYK"
msgstr "CMYK"
@@ -2206,33 +2892,36 @@ msgstr "CMYK"
msgid "CPCL Label Printer"
msgstr "Принтер Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ Ñтикеток CPCL"
+msgid "Cancel Jobs"
+msgstr "Отменить заданиÑ"
+
msgid "Cancel RSS Subscription"
msgstr "Отменить подпиÑку на RSS"
msgid "Canceling print job."
-msgstr ""
+msgstr "Отмена Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸."
msgid "Cannot share a remote Kerberized printer."
msgstr ""
msgid "Cassette"
-msgstr ""
+msgstr "Лоток"
msgid "Change Settings"
msgstr "Изменить наÑтройки"
#, c-format
msgid "Character set \"%s\" not supported."
-msgstr ""
+msgstr "Ðабор Ñимволов \"%s\" не поддерживаетÑÑ."
msgid "Classes"
-msgstr "КлаÑÑÑ‹"
+msgstr "Группы"
msgid "Clean Print Heads"
msgstr "ОчиÑтить головки принтера"
msgid "Close-Job doesn't support the job-uri attribute."
-msgstr ""
+msgstr "Close-Job не подерживает атрибут job-uri"
msgid "Color"
msgstr "Цвет"
@@ -2245,15 +2934,18 @@ msgid ""
"\n"
"exit help quit status ?"
msgstr ""
+"Команды могут быть Ñокращены. Команды:\n"
+"\n"
+"exit help quit status ?"
msgid "Community name uses indefinite length"
msgstr "Ð”Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑообщеÑтва длина не уÑтановлена"
msgid "Connected to printer."
-msgstr ""
+msgstr "Подключен к принтеру."
msgid "Connecting to printer."
-msgstr ""
+msgstr "Подключение к принтеру"
msgid "Continue"
msgstr "Продолжить"
@@ -2262,10 +2954,10 @@ msgid "Continuous"
msgstr "Ðепрерывно"
msgid "Control file sent successfully."
-msgstr ""
+msgstr "Контрольный файл уÑпешно отправлен."
msgid "Copying print data."
-msgstr ""
+msgstr "Копирование данных печати."
msgid "Created"
msgstr "Создано"
@@ -2292,10 +2984,10 @@ msgid "Darkness"
msgstr "ЗатемненноÑÑ‚ÑŒ"
msgid "Data file sent successfully."
-msgstr ""
+msgstr "Файл данных уÑпешно отправлен."
msgid "Delete Class"
-msgstr "Удалить клаÑÑ"
+msgstr "Удалить группу"
msgid "Delete Printer"
msgstr "Удалить принтер"
@@ -2318,34 +3010,34 @@ msgid ""
msgstr ""
msgid "Direct Thermal Media"
-msgstr "ÐоÑитель Ð´Ð»Ñ Ð¿Ñ€Ñмой термопечати"
+msgstr "ÐоÑитель Ð´Ð»Ñ Ñ‚ÐµÑ€Ð¼Ð¾Ð¿ÐµÑ‡Ð°Ñ‚Ð¸"
#, c-format
msgid "Directory \"%s\" contains a relative path."
-msgstr ""
+msgstr "Каталог \"%s\" Ñодержит отноÑительный путь."
#, c-format
msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Каталог \"%s\" имеет небезопаÑные права доÑтупа (0%o/uid=%d/gid=%d)."
#, c-format
msgid "Directory \"%s\" is a file."
-msgstr ""
+msgstr "Каталог \"%s\" Ñто файл."
#, c-format
msgid "Directory \"%s\" not available: %s"
-msgstr ""
+msgstr "Каталог \"%s\" недоÑтупен: %s"
#, c-format
msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Каталог \"%s\" доÑтуп OK (0%o/uid=%d/gid=%d)."
msgid "Disabled"
msgstr "Отключено"
#, c-format
msgid "Document #%d does not exist in job #%d."
-msgstr ""
+msgstr "Документ #%d не ÑущеÑтвует в задании #%d."
msgid "Duplexer"
msgstr "ДуплекÑер"
@@ -2363,7 +3055,10 @@ msgid "Edit Configuration File"
msgstr "Редактировать файл конфигурации"
msgid "Empty PPD file."
-msgstr ""
+msgstr "ПуÑтой PPD файл."
+
+msgid "Encryption is not supported."
+msgstr "Шифрование не поддерживаетÑÑ."
#. TRANSLATORS: Banner/cover sheet after the print job.
msgid "Ending Banner"
@@ -2372,15 +3067,6 @@ msgstr "Конечный баннер"
msgid "English"
msgstr "Russian"
-msgid "Enter old password:"
-msgstr "Введите Ñтарый пароль:"
-
-msgid "Enter password again:"
-msgstr "Введите пароль Ñнова:"
-
-msgid "Enter password:"
-msgstr "Введите пароль:"
-
msgid ""
"Enter your username and password or the root username and password to access "
"this page. If you are using Kerberos authentication, make sure you have a "
@@ -2549,17 +3235,23 @@ msgstr ""
msgid "Envelope You4 Long Edge"
msgstr ""
+msgid "Environment Variables:"
+msgstr ""
+
msgid "Epson"
msgstr "Epson"
msgid "Error Policy"
msgstr "Политика ошибок"
-msgid "Error sending raster data."
+msgid "Error reading raster data."
msgstr ""
+msgid "Error sending raster data."
+msgstr "Ошибка отправки данных раÑтра."
+
msgid "Error: need hostname after \"-h\" option."
-msgstr ""
+msgstr "ERROR: ТребуетÑÑ Ð¸Ð¼Ñ Ñ…Ð¾Ñта поÑле параметра \"-h\""
msgid "Every 10 Labels"
msgstr "Каждые 10 Ñтикеток"
@@ -2592,7 +3284,7 @@ msgid "Every Label"
msgstr "ÐšÐ°Ð¶Ð´Ð°Ñ Ñтикетка"
msgid "Executive"
-msgstr ""
+msgstr "Executive"
msgid "Expectation Failed"
msgstr "Сбой ожиданиÑ"
@@ -2600,8 +3292,11 @@ msgstr "Сбой ожиданиÑ"
msgid "Export Printers to Samba"
msgstr "ЭкÑпортировать принтеры в Samba"
+msgid "Expressions:"
+msgstr "Выражение:"
+
msgid "FAIL"
-msgstr ""
+msgstr "FAIL"
msgid "FanFold German"
msgstr ""
@@ -2614,36 +3309,38 @@ msgstr ""
#, c-format
msgid "File \"%s\" contains a relative path."
-msgstr ""
+msgstr "Файл \"%s\" Ñодержит отноÑительный путь."
#, c-format
msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Файл \"%s\" имеет небезопаÑные права доÑтупа (0%o/uid=%d/gid=%d)."
#, c-format
msgid "File \"%s\" is a directory."
-msgstr ""
+msgstr "Файл \"%s\" ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼."
#, c-format
msgid "File \"%s\" not available: %s"
-msgstr ""
+msgstr "Файл \"%s\" недоÑтупен: %s"
#, c-format
msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Файл \"%s\" права доÑтупа OK (0%o/uid=%d/gid=%d)."
msgid "File Folder "
-msgstr ""
+msgstr "Каталог файла "
#, c-format
msgid ""
"File device URIs have been disabled. To enable, see the FileDevice directive "
"in \"%s/cups-files.conf\"."
msgstr ""
+"URI-адреÑа файлового уÑтройÑтва отключены! Чтобы включить их, иÑпользуйте "
+"параметр FileDevice в \"%s/cups-files.conf\"."
#, c-format
msgid "Finished page %d."
-msgstr ""
+msgstr "ПоÑледнÑÑ Ñтраница %d."
msgid "Folio"
msgstr "Фолио"
@@ -2664,7 +3361,7 @@ msgid "Glossy Paper"
msgstr "ГлÑÐ½Ñ†ÐµÐ²Ð°Ñ Ð±ÑƒÐ¼Ð°Ð³Ð°"
msgid "Got a printer-uri attribute but no job-id."
-msgstr ""
+msgstr "Получен атрибут printer-uri, но не job-id"
msgid "Grayscale"
msgstr "Оттенки Ñерого"
@@ -2676,70 +3373,76 @@ msgid "Hanging Folder"
msgstr "Папка подвеÑного хранениÑ"
msgid "Help file not in index."
-msgstr ""
+msgstr "Файл Ñправки не проиндекÑирован."
msgid "IPP 1setOf attribute with incompatible value tags."
-msgstr ""
+msgstr "IPP атрибут 1setOf Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым значением."
msgid "IPP attribute has no name."
-msgstr ""
+msgstr "IPP атрибут не имеет имени."
msgid "IPP attribute is not a member of the message."
-msgstr ""
+msgstr "IPP атрибут не входит в ÑоÑтав ÑообщениÑ."
msgid "IPP begCollection value not 0 bytes."
-msgstr ""
+msgstr "IPP значение begCollection не 0 байт."
msgid "IPP boolean value not 1 byte."
-msgstr ""
+msgstr "IPP двоичное значение не 1 байт."
msgid "IPP date value not 11 bytes."
-msgstr ""
+msgstr "IPP длина даты не 11 байтов."
msgid "IPP endCollection value not 0 bytes."
-msgstr ""
+msgstr "IPP значение endCollection не 0 байт."
msgid "IPP enum value not 4 bytes."
-msgstr ""
+msgstr "IPP значение enum не 4 байта."
msgid "IPP extension tag larger than 0x7FFFFFFF."
-msgstr ""
+msgstr "IPP extension tag больше чем 0x7FFFFFFF."
msgid "IPP integer value not 4 bytes."
-msgstr ""
+msgstr "IPP тип integer не 4 байта"
msgid "IPP language length overflows value."
-msgstr ""
+msgstr "IPP переполнение Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ language length"
+
+msgid "IPP language length too large."
+msgstr "IPP language length Ñлишком длинное."
msgid "IPP member name is not empty."
-msgstr ""
+msgstr "IPP member name не пуÑтое."
msgid "IPP memberName value is empty."
-msgstr ""
+msgstr "IPP memberName пуÑтое значение."
msgid "IPP memberName with no attribute."
-msgstr ""
+msgstr "IPP memberName без атрибута."
msgid "IPP name larger than 32767 bytes."
-msgstr ""
+msgstr "IPP Ð¸Ð¼Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ чем 32767 байт."
msgid "IPP nameWithLanguage value less than minimum 4 bytes."
-msgstr ""
+msgstr "IPP значение nameWithLanguage меньше минимума 4 байт."
+
+msgid "IPP octetString length too large."
+msgstr "IPP octetString Ñлишком длинное."
msgid "IPP rangeOfInteger value not 8 bytes."
-msgstr ""
+msgstr "IPP rangeOfInteger значение не 8 байт."
msgid "IPP resolution value not 9 bytes."
-msgstr ""
+msgstr "IPP resolution значение не 9 байт."
msgid "IPP string length overflows value."
-msgstr ""
+msgstr "IPP переполнение Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ string length."
msgid "IPP textWithLanguage value less than minimum 4 bytes."
-msgstr ""
+msgstr "IPP textWithLanguage меньше минимума 4 байт."
msgid "IPP value larger than 32767 bytes."
-msgstr ""
+msgstr "IPP значение больше чем 32767 байт."
msgid "ISOLatin1"
msgstr "UTF-8"
@@ -2786,12 +3489,15 @@ msgstr "Ðаклейки Internet Postage 3-Part"
msgid "Internet Printing Protocol"
msgstr "Протокол интернет-печати"
+msgid "Invalid media name arguments."
+msgstr "Ðеверные аргументы имени бумаги."
+
msgid "Invalid media size."
-msgstr ""
+msgstr "Ðеверный размер бумаги."
#, c-format
msgid "Invalid printer command \"%s\"."
-msgstr ""
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° принтера \"%s\"."
msgid "JCL"
msgstr "JCL"
@@ -2840,11 +3546,11 @@ msgstr ""
#, c-format
msgid "Job #%d cannot be restarted - no files."
-msgstr ""
+msgstr "Задание #%d не может быть перезапущено - отÑутÑтвуют файлы."
#, c-format
msgid "Job #%d does not exist."
-msgstr ""
+msgstr "Задание #%d не ÑущеÑтвует."
#, c-format
msgid "Job #%d is already aborted - can't cancel."
@@ -2860,19 +3566,19 @@ msgstr "Задание #%d уже завершено – не удаетÑÑ Ð¾Ñ
#, c-format
msgid "Job #%d is finished and cannot be altered."
-msgstr ""
+msgstr "Задание #%d завершено и не может быть изменено."
#, c-format
msgid "Job #%d is not complete."
-msgstr ""
+msgstr "Задание #%d не завершено."
#, c-format
msgid "Job #%d is not held for authentication."
-msgstr ""
+msgstr "Задание #%d не задержано Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸."
#, c-format
msgid "Job #%d is not held."
-msgstr ""
+msgstr "Задание #%d не задержано."
msgid "Job Completed"
msgstr "Задание завершено"
@@ -2890,13 +3596,13 @@ msgid "Job is completed and cannot be changed."
msgstr "Задание завершено и не может быть изменено."
msgid "Job operation failed"
-msgstr ""
+msgstr "Сбой операции заданиÑ."
msgid "Job state cannot be changed."
msgstr "СоÑтоÑние Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ðµ может быть изменено."
msgid "Job subscriptions cannot be renewed."
-msgstr ""
+msgstr "ПодпиÑки на задание не могут быть обновлены."
msgid "Jobs"
msgstr "ЗаданиÑ"
@@ -2912,7 +3618,7 @@ msgstr "Верхний край Ñтикетки"
#, c-format
msgid "Language \"%s\" not supported."
-msgstr ""
+msgstr "Язык \"%s\" не поддерживаетÑÑ."
msgid "Large Address"
msgstr "Полный адреÑ"
@@ -2935,10 +3641,13 @@ msgstr "Строка длиннее разрешенного предела (255
msgid "List Available Printers"
msgstr "СпиÑок доÑтупных принтеров"
+msgid "Load paper."
+msgstr "Загрузка бумаги."
+
msgid "Long-Edge (Portrait)"
msgstr "По длинной Ñтороне (книжнаÑ)"
-msgid "Looking for printer."
+msgid "Looking for printer..."
msgstr ""
msgid "Manual Feed"
@@ -2960,10 +3669,10 @@ msgid "Medium"
msgstr "Средний"
msgid "Memory allocation error"
-msgstr "Ошибка раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти"
+msgstr "Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти"
msgid "Missing CloseGroup"
-msgstr ""
+msgstr "Пропущен CloseGroup"
msgid "Missing PPD-Adobe-4.x header"
msgstr "ОтÑутÑтвует заголовок PPD-Adobe-4.x"
@@ -2972,48 +3681,54 @@ msgid "Missing asterisk in column 1"
msgstr "ОтÑутÑтвует звездочка в колонке 1"
msgid "Missing document-number attribute."
-msgstr ""
+msgstr "ОтÑутÑтвует атрибут document-number"
#, c-format
msgid "Missing double quote on line %d."
-msgstr ""
+msgstr "ОтÑутÑтвует Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²Ñ‹Ñ‡ÐºÐ° в Ñтроке %d"
msgid "Missing form variable"
msgstr "ОтÑутÑтвует Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹"
msgid "Missing last-document attribute in request."
-msgstr ""
+msgstr "ОтÑутÑтвует атрибут last-document в запроÑе."
msgid "Missing media or media-col."
-msgstr ""
+msgstr "ОтÑутÑтвует media или media-col."
msgid "Missing media-size in media-col."
-msgstr ""
+msgstr "ОтÑутÑтвует media-size в media-col."
msgid "Missing notify-subscription-ids attribute."
-msgstr ""
+msgstr "ОтÑутÑтвует атрибут notify-subscription-ids"
msgid "Missing option keyword"
msgstr "ОтÑутÑтвует ключевое Ñлово параметра"
msgid "Missing requesting-user-name attribute."
-msgstr ""
+msgstr "ОтÑутÑтвует атрибут requesting-user-name."
msgid "Missing required attributes."
-msgstr ""
+msgstr "ОтÑутÑтвуют обÑзательные атрибуты."
+
+msgid "Missing resource in URI"
+msgstr "ОтÑутÑтвует resource в URI"
+
+msgid "Missing scheme in URI"
+msgstr "ОтÑутÑтвует scheme в URI"
#, c-format
msgid "Missing value on line %d."
-msgstr ""
+msgstr "ОтÑутÑтвует значение в Ñтроке %d."
msgid "Missing value string"
msgstr "ОтÑутÑтвует Ñтрока значениÑ"
msgid "Missing x-dimension in media-size."
-msgstr ""
+msgstr "ОтÑутÑтвует x-dimension в media-size."
msgid "Missing y-dimension in media-size."
-msgstr ""
+msgstr "ОтÑутÑтвует y-dimension в media-size."
#, c-format
msgid ""
@@ -3022,9 +3737,16 @@ msgid ""
" make-and-model = %s\n"
" device-id = %s"
msgstr ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s"
+
+msgid "Modifiers:"
+msgstr "Управление:"
msgid "Modify Class"
-msgstr "Изменить клаÑÑ"
+msgstr "Изменить группу"
msgid "Modify Printer"
msgstr "Изменить принтер"
@@ -3045,22 +3767,16 @@ msgid "Name OID uses indefinite length"
msgstr "Ð”Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ OID длина не уÑтановлена"
msgid "Nested classes are not allowed."
-msgstr ""
+msgstr "Вложенные группы не допуÑкаютÑÑ."
msgid "Never"
msgstr "Ðикогда"
-msgid "New Stylus Color Series"
-msgstr "Ð¡ÐµÑ€Ð¸Ñ Stylus Color нового поколениÑ"
-
-msgid "New Stylus Photo Series"
-msgstr "Ð¡ÐµÑ€Ð¸Ñ Stylus Photo нового поколениÑ"
-
msgid "No"
msgstr "Ðет"
msgid "No Content"
-msgstr "Ðет контента"
+msgstr "Ðет Ñодержимого"
msgid "No PPD name"
msgstr "Ðет имени PPD"
@@ -3069,32 +3785,36 @@ msgid "No VarBind SEQUENCE"
msgstr "Ðет поÑледовательноÑти VarBind"
msgid "No Windows printer drivers are installed."
-msgstr ""
+msgstr "Ðет уÑтановленных драйверов принтера Windows."
msgid "No active connection"
msgstr "Ðет рабочего подключениÑ"
+msgid "No active connection."
+msgstr "Ðет рабочего подключениÑ."
+
#, c-format
msgid "No active jobs on %s."
-msgstr ""
+msgstr "Ðет активных заданий на %s"
msgid "No attributes in request."
-msgstr ""
+msgstr "Ðет атрибутов в запроÑе."
msgid "No authentication information provided."
-msgstr ""
+msgstr "Ðет информации Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подлинноÑти."
msgid "No community name"
msgstr "Ðет имени ÑообщеÑтва"
msgid "No default printer."
-msgstr ""
+msgstr "Ðет принтера по умолчанию."
msgid "No destinations added."
msgstr "Ðет добавленных назначений."
msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
msgstr ""
+"Ðе обнаружено URI уÑтройÑтва в argv[0] или в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ DEVICE_URI"
msgid "No error-index"
msgstr "Ðет Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ error-index"
@@ -3103,7 +3823,7 @@ msgid "No error-status"
msgstr "Ðет Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ error-status"
msgid "No file in print request."
-msgstr ""
+msgstr "Ðет файла в запроÑе на печать."
msgid "No modification time"
msgstr "Ðе указано Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ"
@@ -3112,7 +3832,7 @@ msgid "No name OID"
msgstr "Ðет имени OID"
msgid "No pages were found."
-msgstr ""
+msgstr "Страницы не были найдены."
msgid "No printer name"
msgstr "Ðет имени принтера"
@@ -3121,16 +3841,25 @@ msgid "No printer-uri found"
msgstr "Ðе указан Ð°Ð´Ñ€ÐµÑ printer-uri"
msgid "No printer-uri found for class"
-msgstr "Ðе указан Ð°Ð´Ñ€ÐµÑ printer-uri Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа"
+msgstr "Ðе указан Ð°Ð´Ñ€ÐµÑ printer-uri Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
msgid "No printer-uri in request."
-msgstr ""
+msgstr "Ðет адреÑа printer-uri в запроÑе."
+
+msgid "No request URI."
+msgstr "Ðет запроÑа URI."
+
+msgid "No request protocol version."
+msgstr "Ðет запроÑа верÑии протокола."
+
+msgid "No request sent."
+msgstr "Ðе отправлен запроÑ."
msgid "No request-id"
msgstr "Ðет идентификатора request-id"
msgid "No subscription attributes in request."
-msgstr ""
+msgstr "Ðет атрибутов подпиÑки в запроÑе."
msgid "No subscriptions found."
msgstr "ПодпиÑки не найдены."
@@ -3142,16 +3871,16 @@ msgid "No version number"
msgstr "Ðет номера верÑии"
msgid "Non-continuous (Mark sensing)"
-msgstr "С прерыванием (опознавание маркеров)"
+msgstr "С прерыванием (Mark sensing)"
msgid "Non-continuous (Web sensing)"
-msgstr "С прерыванием (опознавание Ñети)"
+msgstr "С прерыванием (Web sensing)"
msgid "Normal"
msgstr "Ðормальный"
msgid "Not Found"
-msgstr "Ðе найдено"
+msgstr "Ðе найден"
msgid "Not Implemented"
msgstr "Ðе реализовано"
@@ -3175,18 +3904,20 @@ msgid ""
"Note: this program only validates the DSC comments, not the PostScript "
"itself."
msgstr ""
+"Примечание: Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° проверÑет только комментарии DSC, а не Ñам "
+"PostScript."
msgid "OK"
msgstr "ОК"
msgid "Off (1-Sided)"
-msgstr "Выкл. (одноÑтороннÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ)"
+msgstr "Выкл. (1-ÑтороннÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ)"
msgid "Oki"
msgstr "Oki"
msgid "Online Help"
-msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ñправка"
+msgstr "Интернет Ñправка"
#, c-format
msgid "Open of %s failed: %s"
@@ -3203,41 +3934,34 @@ msgstr "Политика операций"
#, c-format
msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
-msgstr ""
+msgstr "Параметр \"%s\" не может быть добавлен через %%%%IncludeFeature."
msgid "Options Installed"
-msgstr "Параметры уÑтановлены"
+msgstr "Доп.уÑтройÑтва"
msgid "Options:"
-msgstr ""
+msgstr "Параметры:"
msgid "Out of date PPD cache file."
-msgstr ""
+msgstr "УÑтаревший файл кеша PPD"
msgid "Out of memory."
-msgstr ""
+msgstr "ÐедоÑтаточно памÑти."
msgid "Output Mode"
msgstr "Режим вывода"
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr ""
-
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr ""
+msgid "Output bin is almost full."
+msgstr "Лоток вывода почти заполнен."
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr ""
+msgid "Output bin is full."
+msgstr "Лоток вывода заполнен."
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
-msgstr ""
+msgid "Output bin is missing."
+msgstr "ОтÑутÑтвует лоток вывода."
msgid "PASS"
-msgstr ""
+msgstr "PASS"
msgid "PCL Laser Printer"
msgstr "Лазерный принтер PCL"
@@ -3266,6 +3990,18 @@ msgstr "В пакете нет Get-Response-PDU"
msgid "Packet does not start with SEQUENCE"
msgstr "Ðет индикатора SEQUENCE в начале пакета"
+msgid "Paper jam."
+msgstr "ЗамÑтие бумаги."
+
+msgid "Paper tray is almost empty."
+msgstr "Лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹ почти пуÑÑ‚."
+
+msgid "Paper tray is empty."
+msgstr "Лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹ пуÑÑ‚."
+
+msgid "Paper tray is missing."
+msgstr "Лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹ отÑутÑтвует."
+
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
@@ -3281,7 +4017,7 @@ msgid "Password for %s required to access %s via SAMBA: "
msgstr "Ð”Ð»Ñ Ð´Ð¾Ñтупа к %s через SAMBA требуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ Ð´Ð»Ñ %s: "
msgid "Pause Class"
-msgstr "ПриоÑтановить клаÑÑ"
+msgstr "ПриоÑтановить группу"
msgid "Pause Printer"
msgstr "ПриоÑтановить принтер"
@@ -3311,13 +4047,16 @@ msgid "Postcard"
msgstr "Открытка"
msgid "Postcard Double "
-msgstr ""
+msgstr "Открытка двойнаÑ"
msgid "Postcard Double Long Edge"
-msgstr ""
+msgstr "Открытка Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ Long Edge"
msgid "Postcard Long Edge"
-msgstr ""
+msgstr "Открытка Long Edge"
+
+msgid "Preparing to print."
+msgstr "Подготовка к печати."
msgid "Print Density"
msgstr "ПлотноÑÑ‚ÑŒ печати"
@@ -3346,24 +4085,17 @@ msgstr "Ðапечатать и обрезать"
msgid "Print and Tear"
msgstr "Ðапечатать и оборвать"
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
msgid "Print file sent."
-msgstr ""
-
-msgid "Print file was not accepted."
-msgstr ""
+msgstr "Файл печати отправлен."
msgid "Print job canceled at printer."
-msgstr ""
+msgstr "Задание отменено на принтере."
msgid "Print job too large."
-msgstr ""
+msgstr "Задание Ñлишком большое."
+
+msgid "Print job was not accepted."
+msgstr "Задание не принÑто."
msgid "Printer Added"
msgstr "Принтер добавлен"
@@ -3384,7 +4116,10 @@ msgid "Printer Settings"
msgstr "Параметры принтера"
msgid "Printer cannot print supplied content."
-msgstr ""
+msgstr "Принтер не может раÑпечатать Ñодержимое."
+
+msgid "Printer cannot print with supplied options."
+msgstr "Принтер не может печатать Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ параметрами."
msgid "Printer:"
msgstr "Принтер:"
@@ -3393,11 +4128,8 @@ msgid "Printers"
msgstr "Принтеры"
#, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr ""
-
-msgid "Purge Jobs"
-msgstr "Удалить заданиÑ"
+msgid "Printing page %d, %u%% complete."
+msgstr "Печать Ñтраницы %d, %u%% завершена."
msgid "Quarto"
msgstr "Кватро"
@@ -3407,22 +4139,18 @@ msgstr "Предел квоты доÑтигнут."
msgid "Rank Owner Job File(s) Total Size"
msgstr ""
-
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank Owner Pri Job Files Total Size"
-msgstr ""
+"Ранг Владелец Задание Файл(ы) Общий размер"
msgid "Reject Jobs"
msgstr "Отклонить заданиÑ"
#, c-format
msgid "Remote host did not accept control file (%d)."
-msgstr ""
+msgstr "Удаленный хоÑÑ‚ не принÑл контрольный файл (%d)."
#, c-format
msgid "Remote host did not accept data file (%d)."
-msgstr ""
+msgstr "Удаленный хоÑÑ‚ не принÑл файл данных (%d)."
msgid "Reprint After Error"
msgstr "Повторить печать поÑле ошибки"
@@ -3434,7 +4162,7 @@ msgid "Resolution"
msgstr "Разрешение"
msgid "Resume Class"
-msgstr "Возобновить работу клаÑÑа"
+msgstr "Возобновить работу группы"
msgid "Resume Printer"
msgstr "Возобновить работу принтера"
@@ -3447,19 +4175,19 @@ msgstr "ВернутьÑÑ Ð² начало"
#, c-format
msgid "Running command: %s %s -N -A %s -c '%s'"
-msgstr ""
+msgstr "Ð—Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: %s %s -N -A %s -c '%s'"
msgid "SEQUENCE uses indefinite length"
msgstr "Ð”Ð»Ñ SEQUENCE длина не уÑтановлена"
msgid "SSL/TLS Negotiation Error"
-msgstr ""
+msgstr "SSL/TLS Negotiation Error"
msgid "See Other"
msgstr "ПоÑмотреть другие"
msgid "Sending data to printer."
-msgstr ""
+msgstr "Отправка данных на принтер."
msgid "Server Restarted"
msgstr "Сервер перезагружен"
@@ -3473,6 +4201,9 @@ msgstr "Сервер загружен"
msgid "Server Stopped"
msgstr "Сервер оÑтановлен"
+msgid "Server credentials not set."
+msgstr "Учетные данные Ñервера не заданы."
+
msgid "Service Unavailable"
msgstr "Служба недоÑтупна"
@@ -3483,7 +4214,7 @@ msgid "Set As Server Default"
msgstr "ИÑпользовать данный Ñервер по умолчанию"
msgid "Set Class Options"
-msgstr "ÐаÑтроить параметры клаÑÑа"
+msgstr "ÐаÑтроить параметры группы"
msgid "Set Printer Options"
msgstr "ÐаÑтроить параметры принтера"
@@ -3502,31 +4233,28 @@ msgstr "ОÑÐ¾Ð±Ð°Ñ Ð±ÑƒÐ¼Ð°Ð³Ð°"
#, c-format
msgid "Spooling job, %.0f%% complete."
-msgstr ""
+msgstr "ПоÑтановка в очередь, %.0f%% завершено."
msgid "Standard"
msgstr "Стандартный"
#. TRANSLATORS: Banner/cover sheet before the print job.
msgid "Starting Banner"
-msgstr "ЗапуÑк баннера"
+msgstr "Стартовый баннер"
#, c-format
msgid "Starting page %d."
-msgstr ""
+msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница %d."
msgid "Statement"
msgstr "Оператор"
-msgid "Stylus Color Series"
-msgstr "Ð¡ÐµÑ€Ð¸Ñ Stylus Color"
-
-msgid "Stylus Photo Series"
-msgstr "Ð¡ÐµÑ€Ð¸Ñ Stylus Photo"
-
#, c-format
msgid "Subscription #%d does not exist."
-msgstr ""
+msgstr "ПодпиÑка #%d не ÑущеÑтвует."
+
+msgid "Substitutions:"
+msgstr "ЗамещениÑ:"
msgid "Super A"
msgstr "Super A"
@@ -3559,49 +4287,52 @@ msgid "Tear-Off Adjust Position"
msgstr "Откорректировать положение меÑта отрыва"
#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr "Ðтрибут \"%s\" требуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ заданиÑ."
+
+#, c-format
msgid "The %s attribute cannot be provided with job-ids."
-msgstr ""
+msgstr "Ðтрибут %s не может быть иÑпользован Ñ job-ids."
#, c-format
msgid ""
-"The '%s' Job Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
msgstr ""
#, c-format
msgid ""
"The '%s' operation attribute cannot be supplied in a Create-Job request."
-msgstr ""
+msgstr "Ðтрибут '%s' не может быть подÑтавлен в Ð·Ð°Ð¿Ñ€Ð¾Ñ Create-Job"
#, c-format
msgid "The PPD file \"%s\" could not be found."
-msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ PPD-файл «%s»."
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ PPD-файл \"%s\"."
#, c-format
msgid "The PPD file \"%s\" could not be opened: %s"
-msgstr "Ðе удалоÑÑŒ открыть PPD-файл «%s»: %s"
+msgstr "Ðе удалоÑÑŒ открыть PPD-файл \"%s\": %s"
msgid "The PPD file could not be opened."
-msgstr ""
+msgstr "Ðе удалоÑÑŒ открыть PPD-файл."
msgid ""
"The class name may only contain up to 127 printable characters and may not "
"contain spaces, slashes (/), or the pound sign (#)."
msgstr ""
-"Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа может Ñодержать макÑимально 127 печатных Ñимволов и не может "
-"Ñодержать пробелы, дроби (/) или знак «решетки» (#)."
+"Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ может Ñодержать макÑимально 127 печатных Ñимволов и не может "
+"Ñодержать пробелы, дроби (/) или знак \"решетки\" (#)."
msgid "The developer unit needs to be replaced."
-msgstr "Блок разработки должен быть перемещен"
+msgstr "Developer unit нуждаетÑÑ Ð² замене."
msgid "The developer unit will need to be replaced soon."
-msgstr "Ðеобходимо перемеÑтить блок разработки"
+msgstr "Developer unit нуждаетÑÑ Ð² замене в ближайшее времÑ."
msgid "The fuser's temperature is high."
-msgstr "Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð° термофикÑатора!"
+msgstr "Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð° термофикÑатора."
msgid "The fuser's temperature is low."
-msgstr "ÐÐ¸Ð·ÐºÐ°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð° термофикÑатора!"
+msgstr "ÐÐ¸Ð·ÐºÐ°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð° термофикÑатора."
msgid ""
"The notify-lease-duration attribute cannot be used with job subscriptions."
@@ -3611,93 +4342,68 @@ msgstr ""
#, c-format
msgid "The notify-user-data value is too large (%d > 63 octets)."
-msgstr ""
+msgstr "Значение notify-user-data Ñлишком большое(%d > 63 октета)"
msgid "The optical photoconductor needs to be replaced."
-msgstr "ОптичеÑкий фоторегиÑтратор должен быть перемещен."
+msgstr "ОптичеÑкий фоторегиÑтратор нуждаетÑÑ Ð² замене."
msgid "The optical photoconductor will need to be replaced soon."
-msgstr "Ðеобходимо перемеÑтить оптичеÑкий фоторегиÑтратор."
-
-msgid "The output bin is almost full."
-msgstr "Лоток вывода почти заполнен."
-
-msgid "The output bin is full."
-msgstr "Лоток вывода заполнен."
+msgstr "ОптичеÑкий фоторегиÑтратор нуждаетÑÑ Ð² замене в ближайшее времÑ."
-msgid "The output bin is missing."
-msgstr "ОтÑутÑтвует лоток вывода."
-
-msgid "The paper tray is almost empty."
-msgstr "Лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹ почти пуÑÑ‚."
-
-msgid "The paper tray is empty."
-msgstr "Лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹ пуÑÑ‚."
-
-msgid "The paper tray is missing."
-msgstr "Лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹ отÑутÑтвует."
-
-msgid "The paper tray needs to be filled."
-msgstr "Ðеобходимо наполнить лоток Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¾Ð¹."
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr ""
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°, или принтер больше не доÑтупен."
msgid "The printer did not respond."
-msgstr ""
-
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr ""
+msgstr "Принтер не отвечает."
msgid "The printer is in use."
-msgstr ""
+msgstr "Принтер иÑпользуетÑÑ."
+
+msgid "The printer is low on ink."
+msgstr "ЗаканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°."
+
+msgid "The printer is low on toner."
+msgstr "ЗаканчиваетÑÑ Ñ‚Ð¾Ð½ÐµÑ€."
msgid "The printer is not connected."
-msgstr ""
+msgstr "Принтер не подключен."
msgid "The printer is not responding."
-msgstr ""
+msgstr "Принтер не отвечает."
msgid "The printer is now connected."
-msgstr ""
+msgstr "Принтер подключен."
msgid "The printer is now online."
-msgstr ""
+msgstr "Принтер подключен."
msgid "The printer is offline."
msgstr "Принтер выключен."
-msgid "The printer is running low on ink."
-msgstr ""
-
-msgid "The printer is running low on toner."
-msgstr ""
-
msgid "The printer is unreachable at this time."
-msgstr ""
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€ недоÑтупен."
msgid "The printer may be out of ink."
-msgstr ""
+msgstr "Возможно в принтере закончилиÑÑŒ чернила."
msgid "The printer may be out of toner."
-msgstr ""
+msgstr "Возможно в принтере закончилÑÑ Ñ‚Ð¾Ð½ÐµÑ€."
msgid "The printer may not exist or is unavailable at this time."
-msgstr ""
+msgstr "Возможно принтер недоÑтупен в наÑтоÑщее времÑ."
msgid ""
"The printer name may only contain up to 127 printable characters and may not "
"contain spaces, slashes (/), or the pound sign (#)."
msgstr ""
"Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° может Ñодержать макÑимально 127 печатных Ñимволов и не может "
-"Ñодержать пробелы, дроби (/) или знак «решетки» (#)."
+"Ñодержать пробелы, дроби (/) или знак \"решетки\" (#)."
msgid "The printer or class does not exist."
-msgstr ""
+msgstr "Принтер или группа не ÑущеÑтвует."
msgid "The printer or class is not shared."
-msgstr ""
+msgstr "Принтер или группа без ÑовмеÑтного доÑтупа."
msgid "The printer's cover is open."
msgstr "Крышка принтера открыта."
@@ -3716,10 +4422,10 @@ msgstr "ОтÑек Ð´Ð»Ñ Ð¼ÑƒÑора заполнен."
#, c-format
msgid "The printer-uri \"%s\" contains invalid characters."
-msgstr "printer-uri «%s» Ñодержит недопуÑтимые Ñимволы."
+msgstr "printer-uri \"%s\" Ñодержит недопуÑтимые Ñимволы."
msgid "The printer-uri attribute is required."
-msgstr ""
+msgstr "Ð”Ð»Ñ printer-uri требуетÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚."
msgid ""
"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
@@ -3734,25 +4440,24 @@ msgid ""
"(?), or the pound sign (#)."
msgstr ""
"Ð˜Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки не может Ñодержать пробелы, дроби (/), вопроÑительные знаки (?) "
-"или знак «решетки» (#)."
+"или знак \"решетки\" (#)."
msgid ""
"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
"enable it."
msgstr ""
+"Web Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½. Выполните \"cupsctl WebInterface=yes\" Ð´Ð»Ñ "
+"включениÑ."
#, c-format
msgid "The which-jobs value \"%s\" is not supported."
-msgstr ""
+msgstr "Значение \"%s\" Ð´Ð»Ñ which-jobs не поддерживаетÑÑ."
msgid "There are too many subscriptions."
msgstr "Слишком много подпиÑок."
-msgid "There is a paper jam."
-msgstr "Зажевало бумагу."
-
msgid "There was an unrecoverable USB error."
-msgstr ""
+msgstr "Обнаружена ошибка USB."
msgid "Thermal Transfer Media"
msgstr "ÐоÑитель Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ методом термопереноÑа"
@@ -3762,11 +4467,11 @@ msgstr "Слишком много активных заданий."
#, c-format
msgid "Too many job-sheets values (%d > 2)."
-msgstr ""
+msgstr "Слишком много значений job-sheets (%d>2)"
#, c-format
msgid "Too many printer-state-reasons values (%d > %d)."
-msgstr ""
+msgstr "Слишком много значений printer-state-reasons (%d > %d)"
msgid "Transparency"
msgstr "ПрозрачноÑÑ‚ÑŒ"
@@ -3789,6 +4494,9 @@ msgstr "Лоток 4"
msgid "URI Too Long"
msgstr "Слишком длинный Ð°Ð´Ñ€ÐµÑ URI"
+msgid "URI too large"
+msgstr "Слишком большой Ð°Ð´Ñ€ÐµÑ URI"
+
msgid "US Ledger"
msgstr "US Ledger"
@@ -3814,108 +4522,119 @@ msgid "US Letter Small"
msgstr ""
msgid "Unable to access cupsd.conf file"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к файлу \"cupsd.conf\""
msgid "Unable to access help file."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к файлу помощи."
msgid "Unable to add RSS subscription"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ подпиÑку RSS."
msgid "Unable to add class"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ группу"
msgid "Unable to add document to print job."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ документ в задание печати."
#, c-format
msgid "Unable to add job for destination \"%s\"."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ задание Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"%s\""
msgid "Unable to add printer"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ принтер"
msgid "Unable to allocate memory for file types."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ памÑÑ‚ÑŒ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² файлов."
msgid "Unable to allocate memory for page info"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ памÑÑ‚ÑŒ Ð´Ð»Ñ Ñтраницы информации"
msgid "Unable to allocate memory for pages array"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ памÑÑ‚ÑŒ Ð´Ð»Ñ Ñтраниц"
msgid "Unable to cancel RSS subscription"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ подпиÑку RSS"
msgid "Unable to cancel print job."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ задание печати."
msgid "Unable to change printer"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ принтер"
msgid "Unable to change printer-is-shared attribute"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ атрибут printer-is-shared"
msgid "Unable to change server settings"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ наÑтройки Ñервера"
+
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ mimeMediaType регулÑрное выражение: %s."
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ naturalLanguage регулÑрное выражение: %s."
msgid "Unable to configure printer options."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð½Ð°Ñтроить параметры принтера."
msgid "Unable to connect to host."
msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº хоÑту."
msgid "Unable to contact printer, queuing on next printer in class."
msgstr ""
+"Ðе удаетÑÑ ÑƒÑтановить ÑвÑзь Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼, поÑтановка в очередь на Ñледующем "
+"принтере в группе."
#, c-format
msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ 64-битовые файлы драйвера принтера CUPS (%d)."
#, c-format
msgid "Unable to copy 64-bit Windows printer driver files (%d)."
msgstr ""
+"Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ 64-битовые файлы драйвера принтера Ð´Ð»Ñ Windows (%d)."
#, c-format
msgid "Unable to copy CUPS printer driver files (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файлы драйвера принтера CUPS (%d)"
#, c-format
msgid "Unable to copy PPD file - %s"
msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ PPD-файл - %s"
msgid "Unable to copy PPD file."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ PPD-файл."
#, c-format
msgid "Unable to copy Windows 2000 printer driver files (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файлы драйвера принтера Windows 2000 (%d)"
#, c-format
msgid "Unable to copy Windows 9x printer driver files (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файлы драйвера принтера Windows 9x (%d)"
#, c-format
msgid "Unable to copy interface script - %s"
msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñкрипт интерфейÑа - %s"
-msgid "Unable to create compressed print file"
-msgstr ""
-
msgid "Unable to create printer-uri"
msgstr "Ðе удаетÑÑ Ñоздать printer-uri"
+msgid "Unable to create server credentials."
+msgstr "Ðе удаетÑÑ Ñоздать учетные данные Ñервера."
+
msgid "Unable to create temporary file"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ñоздать временный файл"
msgid "Unable to delete class"
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ группу"
msgid "Unable to delete printer"
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ принтер"
msgid "Unable to do maintenance command"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ команду обÑлуживаниÑ"
msgid "Unable to edit cupsd.conf files larger than 1MB"
msgstr "Ðевозможно редактировать файлы cupsd.conf больше 1 МБ"
@@ -3923,89 +4642,96 @@ msgstr "Ðевозможно редактировать файлы cupsd.conf б
msgid ""
"Unable to establish a secure connection to host (certificate chain invalid)."
msgstr ""
+"Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ¿Ð¾Ñ‡ÐºÐ° "
+"Ñертификатов)."
msgid ""
"Unable to establish a secure connection to host (certificate not yet valid)."
msgstr ""
+"Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (недейÑтвительный Ñертификат)."
msgid "Unable to establish a secure connection to host (expired certificate)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (Ñертификат проÑрочен)."
msgid "Unable to establish a secure connection to host (host name mismatch)."
msgstr ""
+"Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (неÑовпадение имени хоÑта)."
msgid ""
"Unable to establish a secure connection to host (peer dropped connection "
"before responding)."
msgstr ""
+"Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (Ñоединение разорвано удаленной "
+"Ñтороной.)"
msgid ""
"Unable to establish a secure connection to host (self-signed certificate)."
msgstr ""
+"Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (ÑамоподпиÑанный Ñертификат)."
msgid ""
"Unable to establish a secure connection to host (untrusted certificate)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение (ненадежный Ñертификат)."
msgid "Unable to establish a secure connection to host."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÑтановить защищенное Ñоединение."
msgid "Unable to find destination for job"
msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ назначение Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ"
msgid "Unable to find printer."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ принтер."
-msgid "Unable to generate compressed print file"
-msgstr ""
+msgid "Unable to find server credentials."
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ учетные данные Ñервера."
msgid "Unable to get backend exit status."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚ backend."
msgid "Unable to get class list"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок групп"
msgid "Unable to get class status"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð³Ñ€ÑƒÐ¿Ð¿"
msgid "Unable to get list of printer drivers"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок драйверов принтера"
msgid "Unable to get printer attributes"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ атрибуты принтера"
msgid "Unable to get printer list"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок принтеров"
msgid "Unable to get printer status"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"
msgid "Unable to get printer status."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
#, c-format
msgid "Unable to install Windows 2000 printer driver files (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÑтановить файлы драйвера принтера Windows 2000 (%d)"
#, c-format
msgid "Unable to install Windows 9x printer driver files (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÑтановить файлы драйвера принтера Windows 9x (%d)"
msgid "Unable to load help index."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ Ñодержание Ñправки."
#, c-format
msgid "Unable to locate printer \"%s\"."
-msgstr ""
+msgstr "Принтер \"%s\" не найден"
msgid "Unable to locate printer."
-msgstr ""
+msgstr "Принтер не найден"
msgid "Unable to modify class"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ группу"
msgid "Unable to modify printer"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ принтер"
msgid "Unable to move job"
msgstr "Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить задание"
@@ -4016,78 +4742,78 @@ msgstr "Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить заданиÑ"
msgid "Unable to open PPD file"
msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл"
-msgid "Unable to open compressed print file"
-msgstr ""
-
msgid "Unable to open cupsd.conf file:"
-msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл «cupsd.conf»:"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл cupsd.conf:"
msgid "Unable to open device file"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл уÑтройÑтва"
#, c-format
msgid "Unable to open document #%d in job #%d."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ документ #%d в задании #%d."
msgid "Unable to open help file."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ñправки."
msgid "Unable to open print file"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл печати"
msgid "Unable to open raster file"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ раÑтровый файл"
msgid "Unable to print test page"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¿ÐµÑ‡Ð°Ñ‚Ð°Ñ‚ÑŒ пробную Ñтраницу"
msgid "Unable to read print data."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ñчитать данные печати."
-msgid "Unable to resolve printer URI."
+msgid "Unable to rename job document file."
msgstr ""
+msgid "Unable to resolve printer-uri."
+msgstr "Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ printer-uri"
+
#, c-format
msgid "Unable to run \"%s\": %s"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить \"%s\": %s"
msgid "Unable to see in file"
-msgstr ""
+msgstr "Ðе удаетÑÑ ÑƒÐ²Ð¸Ð´ÐµÑ‚ÑŒ в файле"
msgid "Unable to send command to printer driver"
msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ команду драйверу принтера"
msgid "Unable to send data to printer."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ данные на принтер."
#, c-format
msgid "Unable to set Windows printer driver (%d)."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð½Ð°Ñтроить драйвер принтера Windows (%d)."
msgid "Unable to set options"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð½Ð°Ñтроить параметры"
msgid "Unable to set server default"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒ Ñервер иÑпользуемым по умолчанию"
msgid "Unable to start backend process."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить фоновый процеÑÑ"
msgid "Unable to upload cupsd.conf file"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ файл cupsd.conf"
msgid "Unable to use legacy USB class driver."
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð¸Ñпользовать уÑтаревший драйвер USB."
msgid "Unable to write print data"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать данные печати"
#, c-format
msgid "Unable to write uncompressed print data: %s"
-msgstr ""
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать неÑжатые данные печати: %s"
msgid "Unauthorized"
-msgstr "Ðе Ñанкционировано"
+msgstr "Ð’ доÑтупе отказано"
msgid "Units"
msgstr "Единицы"
@@ -4097,101 +4823,115 @@ msgstr "ÐеизвеÑтный"
#, c-format
msgid "Unknown choice \"%s\" for option \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтный выбор \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"."
#, c-format
msgid "Unknown encryption option value: \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтное значение \"%s\" параметра шифрованиÑ."
#, c-format
msgid "Unknown file order: \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтный порÑдок файлов \"%s\"."
#, c-format
msgid "Unknown format character: \"%c\"."
-msgstr ""
+msgstr "Символ неизвеÑтного формата \"%c\"."
msgid "Unknown media size name."
-msgstr ""
+msgstr "ÐеизвеÑтное Ð¸Ð¼Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° бумаги."
#, c-format
msgid "Unknown option \"%s\" with value \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтный параметр \"%s\" Ñо значением \"%s\"."
#, c-format
msgid "Unknown option \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтный параметр \"%s\"."
#, c-format
msgid "Unknown print mode: \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтный режим печати: \"%s\"."
#, c-format
msgid "Unknown printer-error-policy \"%s\"."
-msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ° printer-error-policy «%s»."
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ° printer-error-policy \"%s\"."
#, c-format
msgid "Unknown printer-op-policy \"%s\"."
-msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ° printer-op-policy «%s»."
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ° printer-op-policy \"%s\"."
+
+msgid "Unknown request method."
+msgstr "ÐеизвеÑтный метод запроÑа."
+
+msgid "Unknown request version."
+msgstr "ÐеизвеÑтный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ñии."
+
+msgid "Unknown scheme in URI"
+msgstr "ÐеизвеÑтный scheme в URI"
msgid "Unknown service name."
-msgstr ""
+msgstr "ÐеизвеÑтное Ð¸Ð¼Ñ ÑервиÑа."
#, c-format
msgid "Unknown version option value: \"%s\"."
-msgstr ""
+msgstr "ÐеизвеÑтное значение параметра верÑии \"%s\"."
#, c-format
msgid "Unsupported 'compression' value \"%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемое значение 'compression' \"%s\"."
#, c-format
msgid "Unsupported 'document-format' value \"%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемое значение'document-format' \"%s\"."
msgid "Unsupported 'job-name' value."
-msgstr ""
+msgstr "Ðеподдерживаемое значение 'job-name'."
#, c-format
msgid "Unsupported character set \"%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемый набор Ñимволов \"%s\"."
#, c-format
msgid "Unsupported compression \"%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемое Ñжатие \"%s\"."
#, c-format
msgid "Unsupported document-format \"%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемый document-format \"%s\"."
#, c-format
msgid "Unsupported document-format \"%s/%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемый document-format \"%s/%s\"."
#, c-format
msgid "Unsupported format \"%s\"."
-msgstr ""
+msgstr "Ðеподдерживаемый формат \"%s\"."
msgid "Unsupported margins."
-msgstr ""
+msgstr "Ðеподдерживаемые полÑ."
msgid "Unsupported media value."
-msgstr ""
+msgstr "Ðеподдерживаемое значение бумаги."
#, c-format
msgid "Unsupported number-up value %d, using number-up=1."
msgstr ""
+"Ðеподдерживаемое значение number-up %d, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ number-up=1."
#, c-format
msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
msgstr ""
+"Ðеподдерживаемое значение number-up-layout %s, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ number-"
+"up-layout=lrtb."
#, c-format
msgid "Unsupported page-border value %s, using page-border=none."
msgstr ""
+"Ðеподдерживаемое значение page-border %s, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ page-"
+"border=none."
msgid "Unsupported raster data."
-msgstr ""
+msgstr "Ðеподдерживаемые данные раÑтра."
msgid "Unsupported value type"
msgstr "Ðеподдерживаемый тип значениÑ"
@@ -4209,6 +4949,15 @@ msgid ""
" [-P ppd-file] [-o name=value]\n"
" [-u allow:user,user] [-u deny:user,user]"
msgstr ""
+"ИÑпользование:\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"
#, c-format
msgid "Usage: %s job-id user title copies options [file]"
@@ -4223,7 +4972,7 @@ msgstr ""
msgid "Usage: cupsd [options]"
msgstr ""
-msgid "Usage: cupsfilter [ options ] filename"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
msgstr ""
msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
@@ -4233,6 +4982,30 @@ msgid ""
"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
msgstr ""
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"ИÑпользование:\n"
+" ippdiscover [options] -a\n"
+" ippdiscover [options] \"service name\"\n"
+"\n"
+"Параметры:"
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+msgstr ""
+"ИÑпользование:\n"
+" ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+" ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+" ippfind --help\n"
+" ippfind --version"
+
msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
msgstr ""
@@ -4245,15 +5018,11 @@ msgid ""
" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
" lpoptions [-h server] [-E] -x printer"
msgstr ""
-
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-" lppasswd [-g groupname] -a [username]\n"
-" lppasswd [-g groupname] -x [username]"
-msgstr ""
+"ИÑпользование:\n"
+" 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"
msgid ""
"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
@@ -4288,19 +5057,19 @@ msgid "Version uses indefinite length"
msgstr "Ð”Ð»Ñ Version длина не уÑтановлена"
msgid "Waiting for job to complete."
-msgstr ""
+msgstr "Ожидание Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ."
msgid "Waiting for printer to become available."
-msgstr ""
+msgstr "Ожидание доÑтупа к принтеру."
msgid "Waiting for printer to finish."
-msgstr ""
+msgstr "Ожидание Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ принтера."
msgid "Warning, no Windows 2000 printer drivers are installed."
-msgstr ""
+msgstr "Внимание, драйверы принтера Windows 2000 не уÑтановлены"
msgid "Web Interface is Disabled"
-msgstr ""
+msgstr "Web Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½"
msgid "Yes"
msgstr "Да"
@@ -4313,11 +5082,6 @@ msgstr ""
"Ð’Ñ‹ должны получить доÑтуп к Ñтой Ñтранице Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ URL <A HREF=«https://%s:"
"%d%s»>https://%s:%d%s</A>."
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-
msgid "ZPL Label Printer"
msgstr "Принтер Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ Ñтикеток ZPL"
@@ -4325,7 +5089,7 @@ msgid "Zebra"
msgstr "Zebra"
msgid "aborted"
-msgstr "отменено"
+msgstr "прервано"
msgid "canceled"
msgstr "отменено"
@@ -4341,77 +5105,79 @@ msgstr "Ðе удалоÑÑŒ выполнить cups-driverd."
#, c-format
msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s"
-msgstr ""
+msgstr "cupsaddsmb: Ðет PPD-файла Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° \"%s\" - %s"
msgid "cupsctl: Cannot set Listen or Port directly."
-msgstr ""
+msgstr "cupsctl: Ðе удаетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ Listen или Port."
#, c-format
msgid "cupsctl: Unable to connect to server: %s"
-msgstr ""
+msgstr "cupsctl: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу: %s"
#, c-format
msgid "cupsctl: Unknown option \"%s\""
-msgstr ""
+msgstr "cupsctl: ÐеизвеÑтный параметр \"%s\""
#, c-format
msgid "cupsctl: Unknown option \"-%c\""
-msgstr ""
+msgstr "cupsctl: ÐеизвеÑтный параметр \"-%c\""
msgid "cupsd: Expected config filename after \"-c\" option."
-msgstr ""
+msgstr "cupsd: Пропущено Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации поÑле параметра \"-Ñ\""
msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
+msgstr "cupsd: Пропущено Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° cups-files.conf поÑле параметра \"-s\""
+
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
msgstr ""
+"cupsd: Поддержка запуÑка \"по запроÑу\" не включена, запуÑк в нормальном "
+"режиме."
msgid "cupsd: Relative cups-files.conf filename not allowed."
msgstr ""
msgid "cupsd: Unable to get current directory."
-msgstr ""
+msgstr "cupsd: Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ текущий каталог"
msgid "cupsd: Unable to get path to cups-files.conf file."
-msgstr ""
+msgstr "cupsd: Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ путь до cups-files.conf"
#, c-format
msgid "cupsd: Unknown argument \"%s\" - aborting."
-msgstr ""
+msgstr "cupsd: ÐеизвеÑтный аргумент \"%s\" - прерывание."
#, c-format
msgid "cupsd: Unknown option \"%c\" - aborting."
-msgstr ""
-
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
+msgstr "cupsd: ÐеизвеÑтный параметр \"%c\" - прерывание."
#, c-format
msgid "cupsfilter: Invalid document number %d."
-msgstr ""
+msgstr "cupsfilter: ÐедопуÑтимый номер документа %d."
#, c-format
msgid "cupsfilter: Invalid job ID %d."
-msgstr ""
+msgstr "cupsfilter: ÐедопуÑтимый ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ %d."
msgid "cupsfilter: Only one filename can be specified."
-msgstr ""
+msgstr "cupsfilter: Может быть указано только одно Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
#, c-format
msgid "cupsfilter: Unable to get job file - %s"
-msgstr ""
+msgstr "cupsfilter: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ - %s"
msgid "cupstestppd: The -q option is incompatible with the -v option."
-msgstr ""
+msgstr "cupstestppd: Параметр -q неÑовмеÑтим Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -v"
msgid "cupstestppd: The -v option is incompatible with the -q option."
-msgstr ""
+msgstr "cupstestppd: Параметр -v неÑовмеÑтим Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -q"
#, c-format
msgid "device for %s/%s: %s"
-msgstr ""
+msgstr "уÑтройÑтво Ð´Ð»Ñ %s/%s: %s"
#, c-format
msgid "device for %s: %s"
-msgstr ""
+msgstr "уÑтройÑтво Ð´Ð»Ñ %s: %s"
msgid "error-index uses indefinite length"
msgstr "Ð”Ð»Ñ error-index длина не уÑтановлена"
@@ -4423,744 +5189,799 @@ msgid "held"
msgstr "задержано"
msgid "help\t\tGet help on commands."
-msgstr ""
+msgstr "help\t\tПолучить Ñправку по командам."
msgid "idle"
msgstr "Ñвободен"
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr ""
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr "ippfind: неправильное регулÑрное выражение: %s"
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr "ippfind: не иÑпользуйте --and поÑле --or."
#, c-format
-msgid "ipptool: Bad URI - %s."
-msgstr ""
+msgid "ippfind: Expected key name after %s."
+msgstr "ippfind: ОжидаетÑÑ key name поÑле %s."
#, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr ""
+msgid "ippfind: Expected port range after %s."
+msgstr "ippfind: ОжидаетÑÑ port range поÑле %s."
+
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr "ippfind: ОжидаетÑÑ program поÑле %s."
+
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr "ippfind: ОжидаетÑÑ semi-colon поÑле %s."
+
+msgid "ippfind: Missing close brace in substitution."
+msgstr "ippfind: ОтÑутÑтвует Ð·Ð°ÐºÑ€Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð½Ð°Ñ Ñкобка в замене."
+
+msgid "ippfind: Missing close parenthesis."
+msgstr "ippfind: ОтÑутÑтвует Ð·Ð°ÐºÑ€Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ñкобка."
+
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr "ippfind: ОтÑутÑтвует выражение перед \"--and\"."
+
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr "ippfind: ОтÑутÑтвует выражение перед \"--or\"."
+
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr "ippfind: ОтÑутÑтвует key name поÑле %s."
+
+msgid "ippfind: Missing open parenthesis."
+msgstr "ippfind: ОтÑутÑтвует Ð¾Ñ‚ÐºÑ€Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ñкобка."
+
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr "ippfind: ОтÑутÑтвует program поÑле %s."
+
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr "ippfind: ОтÑутÑтвует регулÑрное выражение поÑле %s."
+
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr "ippfind: ОтÑутÑтвует semi-colon поÑле %s."
+
+msgid "ippfind: Out of memory."
+msgstr "ippfind: ÐедоÑтаточно памÑти."
+
+msgid "ippfind: Too many parenthesis."
+msgstr "ippfind: Слишком много Ñкобок."
+
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr "ippfind: Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñмотреть или определить: %s"
+
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr "ippfind: Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ \"%s\": %s"
+
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr "ippfind: Ðе удаетÑÑ Ð¸Ñпользовать Bonjour: %s"
+
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr "ippfind: ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"{%s}\"."
+
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
+msgstr "ipptool: Параметры \"-i\" и \"-n\" неÑовмеÑтимы Ñ \"-P\" и \"-X\"."
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: Ðеправильный URI - %s."
msgid "ipptool: Invalid seconds for \"-i\"."
-msgstr ""
+msgstr "ipptool: Ðеправильные Ñекунды Ð´Ð»Ñ \"-i\"."
msgid "ipptool: May only specify a single URI."
-msgstr ""
+msgstr "ipptool: Может быть определен лишь один URI."
msgid "ipptool: Missing count for \"-n\"."
-msgstr ""
+msgstr "ipptool: ОтÑутÑтвует count Ð´Ð»Ñ \"-n\"."
msgid "ipptool: Missing filename for \"-f\"."
-msgstr ""
+msgstr "ipptool: ОтÑутÑтвует Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ \"-f\"."
msgid "ipptool: Missing name=value for \"-d\"."
-msgstr ""
+msgstr "ipptool: ОтÑутÑтвует name=value Ð´Ð»Ñ \"-d\"."
msgid "ipptool: Missing seconds for \"-i\"."
-msgstr ""
-
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
+msgstr "ipptool: ОтÑутÑтвуют Ñекунды Ð´Ð»Ñ \"-i\"."
msgid "ipptool: URI required before test file."
-msgstr ""
+msgstr "ipptool: Ðеобходим URI перед указанием теÑÑ‚-файла."
#, c-format
msgid "ipptool: Unknown option \"-%c\"."
-msgstr ""
+msgstr "ipptool: ÐеизвеÑтный параметр \"-%c\"."
msgid "job-printer-uri attribute missing."
-msgstr ""
+msgstr "Ðтрибут job-printer-uri отÑутÑтвует."
msgid "lpadmin: Class name can only contain printable characters."
-msgstr ""
+msgstr "lpadmin: Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ может Ñодержать только печатаемые Ñимволы."
msgid "lpadmin: Expected PPD after \"-P\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра '-P' должен быть указан PPD"
msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра '-u' должен быть указан allow/deny:userlist."
msgid "lpadmin: Expected class after \"-r\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-r\" должно быть указано Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹."
msgid "lpadmin: Expected class name after \"-c\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-c\" должно быть указано Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹."
msgid "lpadmin: Expected description after \"-D\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-D\" должно быть указано опиÑание."
msgid "lpadmin: Expected device URI after \"-v\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-v\" должен быть указан URI"
msgid "lpadmin: Expected file type(s) after \"-I\" option."
-msgstr ""
+msgstr "ПоÑле параметра \"-I\" должен(-ны) быть указан(-Ñ‹) тип(-Ñ‹) файла(-ов)."
msgid "lpadmin: Expected hostname after \"-h\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-h\" должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта."
msgid "lpadmin: Expected interface after \"-i\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-i\" должен быть указан интерфейÑ."
msgid "lpadmin: Expected location after \"-L\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-L\" должно быть указано меÑтоположение."
msgid "lpadmin: Expected model after \"-m\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-m\" должна быть указана модель."
msgid "lpadmin: Expected name after \"-R\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-R\" должно быть указано имÑ."
msgid "lpadmin: Expected name=value after \"-o\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-o\" должно быть указано name=value"
msgid "lpadmin: Expected printer after \"-p\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-p\" должен быть указан принтер."
msgid "lpadmin: Expected printer name after \"-d\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-d\" должно быть указано Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
msgid "lpadmin: Expected printer or class after \"-x\" option."
-msgstr ""
+msgstr "lpadmin: ПоÑле параметра \"-x\" должен быть указан принтер или группа."
msgid "lpadmin: No member names were seen."
-msgstr ""
+msgstr "lpadmin: Имена пользователей не были найдены."
#, c-format
msgid "lpadmin: Printer %s is already a member of class %s."
-msgstr ""
+msgstr "lpadmin: Принтер %s уже находитÑÑ Ð² группе %s."
#, c-format
msgid "lpadmin: Printer %s is not a member of class %s."
-msgstr ""
+msgstr "lpadmin: Принтер %s не находитÑÑ Ð² группе %s."
msgid "lpadmin: Printer name can only contain printable characters."
-msgstr ""
+msgstr "lpadmin: Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° может Ñодержать только печатаемые Ñимволы."
msgid ""
"lpadmin: Unable to add a printer to the class:\n"
" You must specify a printer name first."
msgstr ""
+"lpadmin: Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ принтер в группу:\n"
+"\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
#, c-format
msgid "lpadmin: Unable to connect to server: %s"
-msgstr ""
+msgstr "lpadmin: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу: %s"
msgid "lpadmin: Unable to create temporary file"
-msgstr ""
+msgstr "lpadmin: Ðе удаетÑÑ Ñоздать временный файл"
msgid ""
"lpadmin: Unable to delete option:\n"
" You must specify a printer name first."
msgstr ""
+"lpadmin: Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ параметр:\n"
+"\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
#, c-format
-msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
msgstr ""
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgstr "lpadmin: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл \"%s\" - %s"
+
msgid ""
"lpadmin: Unable to remove a printer from the class:\n"
" You must specify a printer name first."
msgstr ""
+"lpadmin: Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ принтер из группы:\n"
+"\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
msgid ""
"lpadmin: Unable to set the printer options:\n"
" You must specify a printer name first."
msgstr ""
+"lpadmin: Ðе удаетÑÑ Ð½Ð°Ñтроить параметры принтера:\n"
+"\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
#, c-format
msgid "lpadmin: Unknown allow/deny option \"%s\"."
-msgstr ""
+msgstr "lpadmin: ÐеизвеÑтный параметр allow/deny \"%s\"."
#, c-format
msgid "lpadmin: Unknown argument \"%s\"."
-msgstr ""
+msgstr "lpadmin: ÐеизвеÑтный аргумент \"%s\"."
#, c-format
msgid "lpadmin: Unknown option \"%c\"."
-msgstr ""
+msgstr "lpadmin: ÐеизвеÑтный параметр \"%c\"."
msgid "lpadmin: Warning - content type list ignored."
-msgstr ""
+msgstr "lpadmin: Внимание - ÑпиÑок типов Ñодержимого пропущен."
msgid "lpc> "
msgstr "lpc> "
msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--device-id\" должна идти Ñтрока ID уÑтройÑтва 1284"
msgid "lpinfo: Expected language after \"--language\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--language\" необходимо указать Ñзык."
msgid "lpinfo: Expected make and model after \"--make-and-model\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--make-and-model\" должна быть указана марка и модель."
msgid "lpinfo: Expected product string after \"--product\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--product\" должна идти Ñтрока продукта."
msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--exclude-schemes\" должен идти ÑпиÑок Ñхем."
msgid "lpinfo: Expected scheme list after \"--include-schemes\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--include-schemes\" должен идти ÑпиÑок Ñхем."
msgid "lpinfo: Expected timeout after \"--timeout\"."
-msgstr ""
+msgstr "lpinfo: ПоÑле \"--timeout\" должно быть указано Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ"
#, c-format
msgid "lpinfo: Unknown argument \"%s\"."
-msgstr ""
+msgstr "lpinfo: ÐеизвеÑтный аргумент \"%s\"."
#, c-format
msgid "lpinfo: Unknown option \"%c\"."
-msgstr ""
+msgstr "lpinfo: ÐеизвеÑтный параметр \"%c\"."
#, c-format
msgid "lpinfo: Unknown option \"%s\"."
-msgstr ""
+msgstr "lpinfo: ÐеизвеÑтный параметр \"%s\"."
#, c-format
msgid "lpmove: Unable to connect to server: %s"
-msgstr ""
+msgstr "lpmove: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу: %s"
#, c-format
msgid "lpmove: Unknown argument \"%s\"."
-msgstr ""
+msgstr "lpmove: ÐеизвеÑтный аргумент \"%s\"."
#, c-format
msgid "lpmove: Unknown option \"%c\"."
-msgstr ""
+msgstr "lpmove: ÐеизвеÑтный параметр \"%c\"."
msgid "lpoptions: No printers."
-msgstr ""
+msgstr "lpoptions: Ðет принтеров."
#, c-format
msgid "lpoptions: Unable to add printer or instance: %s"
-msgstr ""
+msgstr "lpoptions: Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ принтер или предÑÑ‚Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ ÐºÐ»Ð°ÑÑа: %s"
#, c-format
msgid "lpoptions: Unable to get PPD file for %s: %s"
-msgstr ""
+msgstr "lpoptions: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ PPD-файл Ð´Ð»Ñ %s: %s"
#, c-format
msgid "lpoptions: Unable to open PPD file for %s."
-msgstr ""
+msgstr "lpoptions: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD файл Ð´Ð»Ñ %s"
msgid "lpoptions: Unknown printer or class."
-msgstr ""
-
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
+msgstr "lpoptions: ÐеизвеÑтный принтер или группа"
#, c-format
msgid ""
"lpstat: error - %s environment variable names non-existent destination \"%s"
"\"."
msgstr ""
+"lpstat: ошибка - %s Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ неÑущеÑтвующее "
+"назначение \"%s\"\n"
#, c-format
msgid "members of class %s:"
-msgstr ""
+msgstr "члены группы %s:"
msgid "no entries"
-msgstr ""
+msgstr "нет запиÑей"
msgid "no system default destination"
-msgstr ""
+msgstr "Ðет назначение ÑиÑтемы по умолчанию"
msgid "notify-events not specified."
-msgstr ""
+msgstr "notify-events не указаны."
#, c-format
msgid "notify-recipient-uri URI \"%s\" is already used."
-msgstr ""
+msgstr "notify-recipient-uri URI \"%s\" уже иÑпользуетÑÑ."
#, c-format
msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
-msgstr ""
+msgstr "notify-recipient-uri URI \"%s\" иÑпользует неизвеÑтную Ñхему."
msgid "pending"
msgstr "задержка"
#, c-format
msgid "ppdc: Adding include directory \"%s\"."
-msgstr ""
+msgstr "ppdc: Добавление каталога \"%s\"."
#, c-format
msgid "ppdc: Adding/updating UI text from %s."
-msgstr ""
+msgstr "ppdc: Добавление/обновление текÑта интерфейÑа из %s."
#, c-format
msgid "ppdc: Bad boolean value (%s) on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐедопуÑтимое двоичное значение (%s) в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Bad font attribute: %s"
-msgstr ""
+msgstr "ppdc: ÐедопуÑтимый атрибут шрифта: %s"
#, c-format
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐедопуÑтимое Ð¸Ð¼Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ \"%s\" в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Bad status keyword %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐедопуÑтимое ключевое Ñлово ÑтатуÑа %s в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð·Ð°Ð¼ÐµÐ½Ð° переменной ($%c) в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Choice found on line %d of %s with no Option."
msgstr ""
+"ppdc: Ð’ Ñтроке %d из %s обнаружено значение, не привÑзанное к параметру"
#, c-format
msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: Дубликат #po Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° %s в Ñтроке %d из %s"
#, c-format
msgid "ppdc: Expected a filter definition on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть определение фильтра."
#, c-format
msgid "ppdc: Expected a program name on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹."
#, c-format
msgid "ppdc: Expected boolean value on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть двоичное значение."
#, c-format
msgid "ppdc: Expected charset after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должен быть набор Ñимволов."
#, c-format
msgid "ppdc: Expected choice code on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть код выбора."
#, c-format
msgid "ppdc: Expected choice name/text on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть имÑ/текÑÑ‚ выбора."
#, c-format
msgid "ppdc: Expected color order for ColorModel on line %d of %s."
msgstr ""
+"ppdc: ПоÑле ColorModel в Ñтроке %d из %s должна быть указана Ñ†Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема."
#, c-format
msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð”Ð»Ñ ColorModel в Ñтроке %d из %s должно быть указано colorspace."
#, c-format
msgid "ppdc: Expected compression for ColorModel on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð”Ð»Ñ ColorModel в Ñтроке %d из %s должно быть указано Ñжатие."
#, c-format
msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
msgstr ""
+"ppdc: Ð”Ð»Ñ UIConstraints в Ñтроке %d из %s должна быть указана Ñтрока "
+"ограничений."
#, c-format
msgid ""
"ppdc: Expected driver type keyword following DriverType on line %d of %s."
msgstr ""
+"ppdc: ПоÑле DriverType в Ñтроке %d из %s должно быть указано ключевое Ñлово "
+"типа драйвера."
#, c-format
msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Duplex в Ñтроке %d из %s должен быть указан тип дуплекÑа."
#, c-format
msgid "ppdc: Expected encoding after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должна быть указана кодировка."
#, c-format
msgid "ppdc: Expected filename after #po %s on line %d of %s."
-msgstr ""
+msgstr "ПоÑле #po %s в Ñтроке %d из %s должно быть указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
#, c-format
msgid "ppdc: Expected group name/text on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть указанно Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹/текÑÑ‚."
#, c-format
msgid "ppdc: Expected include filename on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
#, c-format
msgid "ppdc: Expected integer on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть целое чиÑло."
#, c-format
msgid "ppdc: Expected locale after #po on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле #po в Ñтроке %d из %s должен быть указан регион."
#, c-format
msgid "ppdc: Expected name after %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name after FileName on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле FileName в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name after Manufacturer on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Manufacturer в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name after MediaSize on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле MediaSize в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name after ModelName on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле ModelName в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name after PCFileName on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле PCFileName в Ñтроке %d из %s должно быть указано имÑ."
#, c-format
msgid "ppdc: Expected name/text after %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚."
#, c-format
msgid "ppdc: Expected name/text after Installable on line %d of %s."
msgstr ""
+"ppdc: ПоÑле Installable в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚."
#, c-format
msgid "ppdc: Expected name/text after Resolution on line %d of %s."
msgstr ""
+"ppdc: ПоÑле Resolution в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚."
#, c-format
msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
msgstr ""
+"ppdc: ПоÑле ColorModel в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚."
#, c-format
msgid "ppdc: Expected option name/text on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть указано Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°/текÑÑ‚."
#, c-format
msgid "ppdc: Expected option section on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должен быть указан раздел параметров."
#, c-format
msgid "ppdc: Expected option type on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должен быть указан тип параметра."
#, c-format
msgid "ppdc: Expected override field after Resolution on line %d of %s."
msgstr ""
+"ppdc: ПоÑле Resolution в Ñтроке %d из %s должно быть поле переопределениÑ."
#, c-format
msgid "ppdc: Expected quoted string on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должна быть запиÑÑŒ в кавычках."
#, c-format
msgid "ppdc: Expected real number on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть дейÑтвительное чиÑло."
#, c-format
msgid ""
"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
msgstr ""
+"ppdc: ПоÑле ColorProfile в Ñтроке %d из %s должно быть указано разрешение/"
+"тип ноÑителÑ."
#, c-format
msgid ""
"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
"of %s."
msgstr ""
+"ppdc: ПоÑле SimpleColorProfile в Ñтроке %d из %s должно быть указано "
+"разрешение/тип ноÑителÑ."
#, c-format
msgid "ppdc: Expected selector after %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должен быть selector."
#, c-format
msgid "ppdc: Expected status after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должен быть указан ÑтатуÑ."
#, c-format
msgid "ppdc: Expected string after Copyright on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s пропущено значение параметра Copyright."
#, c-format
msgid "ppdc: Expected string after Version on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s пропущено значение параметра Version."
#, c-format
msgid "ppdc: Expected two option names on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð’ Ñтроке %d из %s должны быть два имени параметра."
#, c-format
msgid "ppdc: Expected value after %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должно быть значение."
#, c-format
msgid "ppdc: Expected version after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должна быть указана верÑиÑ."
#, c-format
msgid "ppdc: Invalid #include/#po filename \"%s\"."
-msgstr ""
+msgstr "ppdc: Ðеверное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° #include/#po \"%s\"."
#, c-format
msgid "ppdc: Invalid cost for filter on line %d of %s."
-msgstr ""
+msgstr "ppdc: Затраты на фильтр в Ñтроке %d из %s указаны неверно."
#, c-format
msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐедопуÑтимый пуÑтой MIME-тип Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Invalid empty program name for filter on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐедопуÑтимое пуÑтое Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ðеверный раздел параметров \"%s\" в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ðеверный тип параметра \"%s\" в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Loading driver information file \"%s\"."
-msgstr ""
+msgstr "ppdc: ЗагружаетÑÑ Ñ„Ð°Ð¹Ð» Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о драйвере \"%s\"."
#, c-format
msgid "ppdc: Loading messages for locale \"%s\"."
-msgstr ""
+msgstr "ppdc: Загружаю ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° \"%s\"."
#, c-format
msgid "ppdc: Loading messages from \"%s\"."
-msgstr ""
+msgstr "ppdc: Загружаю ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· \"%s\"."
#, c-format
msgid "ppdc: Missing #endif at end of \"%s\"."
-msgstr ""
+msgstr "ppdc: ОтÑутÑтвует #endif в конце \"%s\"."
#, c-format
msgid "ppdc: Missing #if on line %d of %s."
-msgstr ""
+msgstr "ppdc: ОтÑутÑтвует #if в Ñтроке %d из %s."
#, c-format
msgid ""
"ppdc: Need a msgid line before any translation strings on line %d of %s."
-msgstr ""
+msgstr "ppdc: ТребуетÑÑ Ñтрока msgid перед Ñтрокой перевода в Ñтроке %d из %s"
#, c-format
msgid "ppdc: No message catalog provided for locale %s."
-msgstr ""
+msgstr "ppdc: Ðе указан каталог Ñообщений Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° %s."
#, c-format
msgid "ppdc: Option %s defined in two different groups on line %d of %s."
-msgstr ""
+msgstr "ppdc: Параметр %s определен в двух разных группах в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Option %s redefined with a different type on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ð”Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s определен другой тип в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Option constraint must *name on line %d of %s."
msgstr ""
+"ppdc: Ð”Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° должно быть указано *name в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Too many nested #if's on line %d of %s."
-msgstr ""
+msgstr "ppdc: Слишком много вложенных операторов #if в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unable to create PPD file \"%s\" - %s."
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ñоздать PPD-файл \"%s\" - %s."
#, c-format
msgid "ppdc: Unable to create output directory %s: %s"
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ñоздать каталог Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… данных %s: %s"
#, c-format
msgid "ppdc: Unable to create output pipes: %s"
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ñоздать конвейеры Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… данных: %s"
#, c-format
msgid "ppdc: Unable to execute cupstestppd: %s"
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ cupstestppd: %s"
#, c-format
msgid "ppdc: Unable to find #po file %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл #po %s в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл \"%s\" в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unable to find localization for \"%s\" - %s"
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ перевод Ð´Ð»Ñ \"%s\" - %s"
#, c-format
msgid "ppdc: Unable to load localization file \"%s\" - %s"
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ файл перевода \"%s\" - %s"
#, c-format
msgid "ppdc: Unable to open %s: %s"
-msgstr ""
+msgstr "ppdc: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ %s: %s"
#, c-format
msgid "ppdc: Undefined variable (%s) on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ðе определена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ (%s) в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unexpected text on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐеизвеÑтный текÑÑ‚ в %2$s Ñтроки %1$d"
#, c-format
msgid "ppdc: Unknown driver type %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐеизвеÑтный тип драйвера %s в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐеизвеÑтный тип дуплекÑа \"%s\" в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐеизвеÑтный размер бумаги \"%s\" в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Unknown message catalog format for \"%s\"."
-msgstr ""
+msgstr "ppdc: ÐеизвеÑтный формат каталога Ñообщений Ð´Ð»Ñ \"%s\""
#, c-format
msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
-msgstr ""
+msgstr "ppdc: ÐеизвеÑтный маркер \"%s\" в Ñтроке %d из %s."
#, c-format
msgid ""
"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
msgstr ""
+"ppdc: ÐеизвеÑтные конечные Ñимволы в вещеÑтвенном чиÑле \"%s\" в Ñтроке %d "
+"из %s."
#, c-format
msgid "ppdc: Unterminated string starting with %c on line %d of %s."
-msgstr ""
+msgstr "ppdc: Ðе завершена Ñтрока, начинающаÑÑÑ Ñ %c в Ñтроке %d из %s."
#, c-format
msgid "ppdc: Warning - overlapping filename \"%s\"."
-msgstr ""
+msgstr "ppdc: Внимание - дублирующееÑÑ Ð¸Ð¼Ñ \"%s\"."
#, c-format
msgid "ppdc: Writing %s."
-msgstr ""
+msgstr "ppdc: ЗапиÑываетÑÑ %s."
#, c-format
msgid "ppdc: Writing PPD files to directory \"%s\"."
-msgstr ""
+msgstr "ppdc: ЗапиÑываютÑÑ PPD-файлы в каталог \"%s\"."
#, c-format
msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
-msgstr ""
+msgstr "ppdmerge: Ðеверное значение LanguageVersion \"%s\" в %s."
#, c-format
msgid "ppdmerge: Ignoring PPD file %s."
-msgstr ""
+msgstr "ppdmerge: ПропуÑкаетÑÑ PPD-файл %s."
#, c-format
msgid "ppdmerge: Unable to backup %s to %s - %s"
-msgstr ""
+msgstr "ppdmerge: Ðе удаетÑÑ Ñоздать резервную копию %s на %s- %s"
#, c-format
msgid "printer %s disabled since %s -"
-msgstr ""
+msgstr "принтер %s отключен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -"
#, c-format
msgid "printer %s is idle. enabled since %s"
-msgstr ""
+msgstr "принтер %s Ñвободен. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s"
#, c-format
msgid "printer %s now printing %s-%d. enabled since %s"
-msgstr ""
+msgstr "принтер %s ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÐµÑ‚ %s-%d. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s"
#, c-format
msgid "printer %s/%s disabled since %s -"
-msgstr ""
+msgstr "принтер %s/%s отключен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -"
#, c-format
msgid "printer %s/%s is idle. enabled since %s"
-msgstr ""
+msgstr "принтер %s/%s Ñвободен. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s"
#, c-format
msgid "printer %s/%s now printing %s-%d. enabled since %s"
-msgstr ""
+msgstr "принтер %s/%s ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÐµÑ‚ %s-%d. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s"
msgid "processing"
msgstr "обработка"
#, c-format
msgid "request id is %s-%d (%d file(s))"
-msgstr ""
+msgstr "id запроÑа %s-%d (%d файл.)"
msgid "request-id uses indefinite length"
msgstr "Ð”Ð»Ñ request-id длина не определена"
msgid "scheduler is not running"
-msgstr ""
+msgstr "планировщик не запущен"
msgid "scheduler is running"
-msgstr ""
+msgstr "планировщик запущен"
#, c-format
msgid "stat of %s failed: %s"
msgstr "не удалоÑÑŒ уÑтановить %s: %s"
msgid "status\t\tShow status of daemon and queue."
-msgstr ""
+msgstr "ÑтатуÑ\t\tпоказать ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´ÐµÐ¼Ð¾Ð½Ð° и очереди"
msgid "stopped"
msgstr "оÑтановлен"
#, c-format
msgid "system default destination: %s"
-msgstr ""
+msgstr "назначение ÑиÑтемы по умолчанию: %s"
#, c-format
msgid "system default destination: %s/%s"
-msgstr ""
+msgstr "назначение ÑиÑтемы по умолчанию: %s/%s"
msgid "unknown"
msgstr "неизвеÑтный"
@@ -5171,3511 +5992,21 @@ msgstr "новый"
msgid "variable-bindings uses indefinite length"
msgstr "Ð”Ð»Ñ variable-bindings длина не уÑтановлена"
-#~ msgid "\t\t(all)\n"
-#~ msgstr "\t\t(вÑе)\n"
-
-#~ msgid "\t\t(none)\n"
-#~ msgstr "\t\t(нет)\n"
-
-#~ msgid "\t%d entries\n"
-#~ msgstr "\tзапиÑей: %d\n"
-
-#~ msgid "\tAfter fault: continue\n"
-#~ msgstr "\tПоÑле ошибки: продолжить\n"
-
-#~ msgid "\tAlerts:"
-#~ msgstr "\tПредупреждениÑ:"
-
-#~ msgid "\tBanner required\n"
-#~ msgstr "\tТребуетÑÑ Ð±Ð°Ð½Ð½ÐµÑ€\n"
-
-#~ msgid "\tCharset sets:\n"
-#~ msgstr "\tÐабор Ñимволов уÑтанавливает:\n"
-
-#~ msgid "\tConnection: direct\n"
-#~ msgstr "\tПодключение: прÑмое\n"
-
-#~ msgid "\tConnection: remote\n"
-#~ msgstr "\tПодключение: удаленное\n"
-
-#~ msgid "\tDefault page size:\n"
-#~ msgstr "\tРазмер Ñтраницы по умолчанию:\n"
-
-#~ msgid "\tDefault pitch:\n"
-#~ msgstr "\tÐ’Ñ‹Ñота по умолчанию:\n"
-
-#~ msgid "\tDefault port settings:\n"
-#~ msgstr "\tÐаÑтройки порта по умолчанию:\n"
-
-#~ msgid "\tDescription: %s\n"
-#~ msgstr "\tОпиÑание: %s\n"
-
-#~ msgid ""
-#~ "\tForm mounted:\n"
-#~ "\tContent types: any\n"
-#~ "\tPrinter types: unknown\n"
-#~ msgstr ""
-#~ "\tФорма подключениÑ:\n"
-#~ "\tТипы контента: любые\n"
-#~ "\tТипы принтеров: неизвеÑтно\n"
-
-#~ msgid "\tForms allowed:\n"
-#~ msgstr "\tРазрешенные формы:\n"
-
-#~ msgid "\tInterface: %s.ppd\n"
-#~ msgstr "\tИнтерфейÑ: %s.ppd\n"
-
-#~ msgid "\tInterface: %s/interfaces/%s\n"
-#~ msgstr "\tИнтерфейÑ: %s/интерфейÑÑ‹/%s\n"
-
-#~ msgid "\tInterface: %s/ppd/%s.ppd\n"
-#~ msgstr "\tИнтерфейÑ: %s/ppd/%s.ppd\n"
-
-#~ msgid "\tLocation: %s\n"
-#~ msgstr "\tРаÑположение: %s\n"
-
-#~ msgid "\tOn fault: no alert\n"
-#~ msgstr "\tПри ошибке: не выводить предупреждение\n"
-
-#~ msgid "\tUsers allowed:\n"
-#~ msgstr "\tРазрешенные пользователи:\n"
-
-#~ msgid "\tUsers denied:\n"
-#~ msgstr "\tЗапрещенные пользователи:\n"
-
-#~ msgid "\tdaemon present\n"
-#~ msgstr "\tдемон приÑутÑтвует\n"
-
-#~ msgid "\tno entries\n"
-#~ msgstr "\tнет запиÑей\n"
-
-#~ msgid "\tprinter is on device '%s' speed -1\n"
-#~ msgstr "\tпринтер на ÑкороÑти -1 уÑтройÑтва «%s»\n"
-
-#~ msgid "\tprinting is disabled\n"
-#~ msgstr "\tпечать отключена\n"
-
-#~ msgid "\tprinting is enabled\n"
-#~ msgstr "\tпечать включена\n"
-
-#~ msgid "\tqueued for %s\n"
-#~ msgstr "\tочередь Ð´Ð»Ñ %s\n"
-
-#~ msgid "\tqueuing is disabled\n"
-#~ msgstr "\tочередь отключена\n"
-
-#~ msgid "\tqueuing is enabled\n"
-#~ msgstr "\tочередь включена\n"
-
-#~ msgid "\treason unknown\n"
-#~ msgstr "\tпричина неизвеÑтна\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " DETAILED CONFORMANCE TEST RESULTS\n"
-#~ msgstr ""
-#~ "\n"
-#~ " ПОДРОБÐЫЕ РЕЗУЛЬТÐТЫ ТЕСТРСООТВЕТСТВИЯ\n"
-
-#~ msgid " REF: Page 15, section 3.1.\n"
-#~ msgstr " REF: Стр. 15, раздел 3.1.\n"
-
-#~ msgid " REF: Page 15, section 3.2.\n"
-#~ msgstr " REF: Стр. 15, раздел 3.2.\n"
-
-#~ msgid " REF: Page 19, section 3.3.\n"
-#~ msgstr " REF: Стр. 19, раздел 3.3.\n"
-
-#~ msgid " REF: Page 20, section 3.4.\n"
-#~ msgstr " REF: Стр. 20, раздел 3.4.\n"
-
-#~ msgid " REF: Page 27, section 3.5.\n"
-#~ msgstr " REF: Стр. 27, раздел 3.5.\n"
-
-#~ msgid " REF: Page 42, section 5.2.\n"
-#~ msgstr " REF: Стр. 42, раздел 5.2.\n"
-
-#~ msgid " REF: Pages 16-17, section 3.2.\n"
-#~ msgstr " REF: Стр. 16-17, раздел 3.2.\n"
-
-#~ msgid " REF: Pages 42-45, section 5.2.\n"
-#~ msgstr " REF: Стр. 42-45, раздел 5.2.\n"
-
-#~ msgid " REF: Pages 45-46, section 5.2.\n"
-#~ msgstr " REF: Стр. 45-46, раздел 5.2.\n"
-
-#~ msgid " REF: Pages 48-49, section 5.2.\n"
-#~ msgstr " REF: Стр. 48-49, раздел 5.2.\n"
-
-#~ msgid " REF: Pages 52-54, section 5.2.\n"
-#~ msgstr " REF: Стр. 52-54, раздел 5.2.\n"
-
-#~ msgid " %-39.39s %.0f bytes\n"
-#~ msgstr " %-39.39s %.0f байт\n"
-
-#~ msgid " PASS Default%s\n"
-#~ msgstr " PASS Default%s\n"
-
-#~ msgid " PASS DefaultImageableArea\n"
-#~ msgstr " PASS DefaultImageableArea\n"
-
-#~ msgid " PASS DefaultPaperDimension\n"
-#~ msgstr " PASS DefaultPaperDimension\n"
-
-#~ msgid " PASS FileVersion\n"
-#~ msgstr " PASS FileVersion\n"
-
-#~ msgid " PASS FormatVersion\n"
-#~ msgstr " PASS FormatVersion\n"
-
-#~ msgid " PASS LanguageEncoding\n"
-#~ msgstr " PASS LanguageEncoding\n"
-
-#~ msgid " PASS LanguageVersion\n"
-#~ msgstr " PASS LanguageVersion\n"
-
-#~ msgid " PASS Manufacturer\n"
-#~ msgstr " PASS Manufacturer\n"
-
-#~ msgid " PASS ModelName\n"
-#~ msgstr " PASS ModelName\n"
-
-#~ msgid " PASS NickName\n"
-#~ msgstr " PASS NickName\n"
-
-#~ msgid " PASS PCFileName\n"
-#~ msgstr " PASS PCFileName\n"
-
-#~ msgid " PASS PSVersion\n"
-#~ msgstr " PASS PSVersion\n"
-
-#~ msgid " PASS PageRegion\n"
-#~ msgstr " PASS PageRegion\n"
-
-#~ msgid " PASS PageSize\n"
-#~ msgstr " PASS PageSize\n"
-
-#~ msgid " PASS Product\n"
-#~ msgstr " PASS Product\n"
-
-#~ msgid " PASS ShortNickName\n"
-#~ msgstr " PASS ShortNickName\n"
-
-#~ msgid ""
-#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n"
-#~ " (constraint=\"%s %s %s %s\")\n"
-#~ msgstr ""
-#~ " WARN «%s %s» конфликтует Ñ Â«%s %s»\n"
-#~ " (constraint=«%s %s %s %s»)\n"
-
-#~ msgid " WARN %s has no corresponding options\n"
-#~ msgstr "\tWARN\t%s не имеет ÑоответÑтвующих параметров\n"
-
-#~ msgid ""
-#~ " WARN %s shares a common prefix with %s\n"
-#~ " REF: Page 15, section 3.2.\n"
-#~ msgstr ""
-#~ " WARN %s иÑпользует общий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑовмеÑтно Ñ %s\n"
-#~ " REF: Стр. 15, раздел 3.2.\n"
-
-#~ msgid " WARN Default choices conflicting\n"
-#~ msgstr "\tWARN\tЗначениÑ, иÑпользуемые по умолчанию, конфликтуют\n"
-
-#~ msgid ""
-#~ " WARN Duplex option keyword %s may not work as expected and "
-#~ "should be named Duplex\n"
-#~ " REF: Page 122, section 5.17\n"
-#~ msgstr ""
-#~ "\tWARN\tКлючевое Ñлово параметра дуплекÑа %s может привеÑти к "
-#~ "некорректным результатам. ИÑпользуйте Ð¸Ð¼Ñ 'Duplex'\n"
-#~ "\t\tREF: Стр. 122, раздел 5.17\n"
-
-#~ msgid ""
-#~ " WARN File contains a mix of CR, LF, and CR LF line endings\n"
-#~ msgstr "\tWARN\tФайл Ñодержит комбинацию окончаний Ñтроки CR, LF, CR LF \n"
-
-#~ msgid ""
-#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n"
-#~ " REF: Pages 56-57, section 5.3.\n"
-#~ msgstr ""
-#~ " WARN LanguageEncoding требуетÑÑ Ñпецификацией PPD 4.3.\n"
-#~ " REF: Стр. 56-57, раздел 5.3.\n"
-
-#~ msgid " WARN Line %d only contains whitespace\n"
-#~ msgstr "\tWARN\tСтрока %d Ñодержит только пробелы\n"
-
-#~ msgid ""
-#~ " WARN Manufacturer required by PPD 4.3 spec.\n"
-#~ " REF: Pages 58-59, section 5.3.\n"
-#~ msgstr ""
-#~ " WARN Manufacturer требуетÑÑ Ñпецификацией PPD 4.3.\n"
-#~ " REF: Стр. 58-59, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " WARN Non-Windows PPD files should use lines ending with only "
-#~ "LF, not CR LF\n"
-#~ msgstr ""
-#~ "\tWARN\tPPD-файлы не из Windows должны иÑпользовать Ñтроки только Ñ "
-#~ "окончанием LF, а не Ñ CR LF\n"
-
-#~ msgid ""
-#~ " WARN Obsolete PPD version %.1f\n"
-#~ " REF: Page 42, section 5.2.\n"
-#~ msgstr ""
-#~ "\tWARN\tУÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð²ÐµÑ€ÑÐ¸Ñ PPD %.1f\n"
-#~ "\t\tREF: Стр. 42, раздел 5.2. \n"
-
-#~ msgid ""
-#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
-#~ " REF: Pages 61-62, section 5.3.\n"
-#~ msgstr ""
-#~ " WARN PCFileName длиннее чем 8.3 нарушает Ñпецификацию PPD.\n"
-#~ " REF: Стр. 61-62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " WARN PCFileName should contain a unique filename.\n"
-#~ " REF: Pages 61-62, section 5.3.\n"
-#~ msgstr ""
-#~ "\tWARN\tPCFilename должен Ñодержать уникальное название\n"
-#~ "\t\tREF: Стр. 61-62, раздел 5.3. \n"
-
-#~ msgid ""
-#~ " WARN Protocols contains PJL but JCL attributes are not set.\n"
-#~ " REF: Pages 78-79, section 5.7.\n"
-#~ msgstr ""
-#~ " WARN Protocols Ñодержит PJL, но атрибуты JCL не наÑтроены.\n"
-#~ " REF: Стр. 78-79, раздел 5.7.\n"
-
-#~ msgid ""
-#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n"
-#~ " REF: Pages 78-79, section 5.7.\n"
-#~ msgstr ""
-#~ "\tWARN\tProtocols Ñодержит PJL и BCP;\n"
-#~ "\t\tREF: Стр. 78-79, раздел 5.7.\n"
-
-#~ msgid ""
-#~ " WARN ShortNickName required by PPD 4.3 spec.\n"
-#~ " REF: Pages 64-65, section 5.3.\n"
-#~ msgstr ""
-#~ " WARN ShortNickName требуетÑÑ Ñпецификацией PPD 4.3.\n"
-#~ " REF: Стр. 64-65, раздел 5.3.\n"
-
-#~ msgid " %s %s %s does not exist\n"
-#~ msgstr "\t%s %s %s не ÑущеÑтвует\n"
-
-#~ msgid " %s %s file \"%s\" has the wrong capitalization\n"
-#~ msgstr " %s %s файл \"%s\" имеет неверный региÑÑ‚Ñ€\n"
-
-#~ msgid ""
-#~ " %s Bad %s choice %s\n"
-#~ " REF: Page 122, section 5.17\n"
-#~ msgstr ""
-#~ " %s Ðеверный %s выбор %s!\n"
-#~ " REF: Стр. 122, раздел 5.17\n"
-
-#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s\n"
-#~ msgstr "\t%s Ðеверный перевод UTF-8 \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s\n"
-
-#~ msgid ""
-#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s\n"
-#~ msgstr "\t%s Ðеверный перевод UTF-8 \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s, выбора %s\n"
-
-#~ msgid " %s Bad cupsFilter value \"%s\"\n"
-#~ msgstr "\t%s Ðеверное значение cupsFilter \"%s\"\n"
-
-#~ msgid " %s Bad cupsICCProfile %s\n"
-#~ msgstr "\t%s Ðеверный cupsICCProfile %s\n"
-
-#~ msgid " %s Bad cupsPreFilter value \"%s\"\n"
-#~ msgstr "\t%s Ðеверное значение cupsPreFilter \"%s\"\n"
-
-#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"\n"
-#~ msgstr "\t%s Ðеверное значение cupsUIConstraints %s: \"%s\"\n"
-
-#~ msgid " %s Bad language \"%s\"\n"
-#~ msgstr "\t%s Ðеверный Ñзык \"%s\"\n"
-
-#~ msgid " %s Bad permissions on APDialogExtension file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° APDialogExtension \"%s\"\n"
-
-#~ msgid " %s Bad permissions on APPrinterIconPath file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° APPrinterIconPath \"%s\"\n"
-
-#~ msgid " %s Bad permissions on APPrinterLowInkTool file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° APPrinterLowInkTool \"%s\"\n"
-
-#~ msgid " %s Bad permissions on APPrinterUtilityPath file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° APPrinterUtilityPath \"%s\"\n"
-
-#~ msgid " %s Bad permissions on APScanAppPath file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° APScanAppPath \"%s\"\n"
-
-#~ msgid " %s Bad permissions on cupsFilter file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° cupsFilter \"%s\"\n"
-
-#~ msgid " %s Bad permissions on cupsICCProfile file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° cupsICCProfile \"%s\"\n"
-
-#~ msgid " %s Bad permissions on cupsPreFilter file \"%s\"\n"
-#~ msgstr " %s Ðеверные права Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° cupsPreFilter \"%s\"\n"
-
-#~ msgid " %s Bad spelling of %s - should be %s\n"
-#~ msgstr " %s Ошибки в %s - должно быть %s.\n"
-
-#~ msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID\n"
-#~ msgstr ""
-#~ " %s Ðевозможно предоÑтавить APScanAppPath и APScanAppBundleID "
-#~ "вмеÑте.\n"
-
-#~ msgid " %s Empty cupsUIConstraints %s\n"
-#~ msgstr " %s ПуÑтой cupsUIConstraints %s\n"
-
-#~ msgid " %s Missing \"%s\" translation string for option %s\n"
-#~ msgstr "\t%s Перевод \"%s\" отÑутÑтвует Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s\n"
-
-#~ msgid ""
-#~ " %s Missing \"%s\" translation string for option %s, choice %s\n"
-#~ msgstr "\t%s Перевод \"%s\" отÑутÑтвует Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s, выбора %s\n"
-
-#~ msgid " %s Missing APDialogExtension file \"%s\"\n"
-#~ msgstr "\t%s Файл APDialogExtention отÑутÑтвует \"%s\"\n"
-
-#~ msgid " %s Missing APPrinterIconPath file \"%s\"\n"
-#~ msgstr "\t%s Файл APPrinterIconPath отÑутÑтвует \"%s\"\n"
-
-#~ msgid " %s Missing APPrinterLowInkTool file \"%s\"\n"
-#~ msgstr "\t%s Файл APPrinterLowInkTool отÑутÑтвует \"%s\"\n"
-
-#~ msgid " %s Missing APPrinterUtilityPath file \"%s\"\n"
-#~ msgstr "\t%s Файл APPrinterUtilityPath отÑутÑтвует \"%s\"\n"
-
-#~ msgid " %s Missing APScanAppPath file \"%s\"\n"
-#~ msgstr "\t%s Файл APScanAppPath отÑутÑтвует \"%s\"\n"
-
-#~ msgid ""
-#~ " %s Missing REQUIRED PageRegion option\n"
-#~ " REF: Page 100, section 5.14.\n"
-#~ msgstr ""
-#~ "\t%s ОбÑзательный параметр PageRegion отÑутÑтвует.\n"
-#~ "\t\t REF: Стр. 100, раздел 5.14.\n"
-
-#~ msgid ""
-#~ " %s Missing REQUIRED PageSize option\n"
-#~ " REF: Page 99, section 5.14.\n"
-#~ msgstr ""
-#~ "\t%s ОбÑзательный параметр PageSize отÑутÑтвует.\n"
-#~ "\t\t REF: Стр. 99, раздел 5.14.\n"
-
-#~ msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"\n"
-#~ msgstr ""
-#~ " %s Выбор *%s %s отÑутÑтвует в UIConstraints \"*%s %s *%s %s\"\n"
-
-#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"\n"
-#~ msgstr " %s Выбор *%s %s отÑутÑтвует в cupsUIConstraints %s: \"%s\"\n"
-
-#~ msgid " %s Missing cupsFilter file \"%s\"\n"
-#~ msgstr " %s Файл cupsFilter отÑутÑтвует «%s»\n"
-
-#~ msgid " %s Missing cupsICCProfile file \"%s\"\n"
-#~ msgstr "\t%s Файл cupsICCProfile отÑутÑтвует \"%s\"\n"
-
-#~ msgid " %s Missing cupsPreFilter file \"%s\"\n"
-#~ msgstr " %s Файл cupsFilter «%s» отÑутÑтвует\n"
-
-#~ msgid " %s Missing cupsUIResolver %s\n"
-#~ msgstr "\t%s cupsUIResolver отÑутÑтвует %s\n"
-
-#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"\n"
-#~ msgstr "\t%s ОтÑутÑтвует параметр %s у UIConstraints \"*%s %s *%s %s\"\n"
-
-#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"\n"
-#~ msgstr "\t%s ОтÑутÑтвует параметр %s у cupsUIConstraints %s: \"%s\"\n"
-
-#~ msgid " %s No base translation \"%s\" is included in file\n"
-#~ msgstr "\t%s ОÑновной перевод \"%s\" не включен в файл\n"
-
-#~ msgid ""
-#~ " %s Non-standard size name \"%s\"\n"
-#~ " REF: Page 187, section B.2.\n"
-#~ msgstr ""
-#~ "\t%s Ðе Ñтандартный размер Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ \"%s\"\n"
-#~ "\t\tREF: Стр. 187, раздел B.2.\n"
-
-#~ msgid ""
-#~ " %s REQUIRED %s does not define choice None\n"
-#~ " REF: Page 122, section 5.17\n"
-#~ msgstr ""
-#~ "\t ТРЕБУЕТСЯ %s: %s не определÑет выбор \"Ðет\"\n"
-#~ "\t\tREF: Стр. 122, раздел 5.17\n"
-
-#~ msgid " %s Size \"%s\" defined for %s but not for %s\n"
-#~ msgstr "\t%s Размер \"%s\" определен Ð´Ð»Ñ %s, но не определен Ð´Ð»Ñ %s\n"
-
-#~ msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)\n"
-#~ msgstr "\t%s Размер \"%s\" имеет неверное значение (%gx%g)\n"
-
-#~ msgid " %s cupsICCProfile %s hash value collides with %s\n"
-#~ msgstr "\tХеш-значение %s cupsICCProfile %s конфликтует Ñ %s\n"
-
-#~ msgid " %s cupsUIResolver %s causes a loop\n"
-#~ msgstr "\t%s cupsUIResolver %s Ñоздает цикл\n"
-
-#~ msgid ""
-#~ " %s cupsUIResolver %s does not list at least two different options\n"
-#~ msgstr "\t%s Ð’ cupsUIResolver %s не перечиÑлено как минимум два параметра\n"
-
-#~ msgid " **FAIL** %s choice names %s and %s differ only by case\n"
-#~ msgstr ""
-#~ "\t**FAIL** Ð”Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° %s имена %s и %s различаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ региÑтром "
-#~ "Ñимволов\n"
-
-#~ msgid ""
-#~ " **FAIL** %s must be 1284DeviceID\n"
-#~ " REF: Page 72, section 5.5\n"
-#~ msgstr ""
-#~ "\t**FAIL** %s должно ÑоответÑтвовать 1284DeviceID\n"
-#~ "\t\tREF: Стр. 72, раздел 5.5\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD Default%s %s\n"
-#~ " REF: Page 40, section 4.5.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐЫЙ Default%s %s\n"
-#~ " REF: Стр. 40, раздел 4.5.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD DefaultImageableArea %s\n"
-#~ " REF: Page 102, section 5.15.\n"
-#~ msgstr ""
-#~ "\t**FAIL** Ðеверный DefaultImageableArea %s\n"
-#~ "\t\tREF: Стр. 102, раздел 5.15.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD DefaultPaperDimension %s\n"
-#~ " REF: Page 103, section 5.15.\n"
-#~ msgstr ""
-#~ "\t**FAIL** Ðеверный DefaultPaperDimension %s\n"
-#~ "\t\tREF: Стр. 103, раздел 5.15.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD JobPatchFile attribute in file\n"
-#~ " REF: Page 24, section 3.4.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐЫЙ JobPatchFile атрибут в файле\n"
-#~ " REF: Стр. 24, раздел 3.4.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n"
-#~ " REF: Page 211, table D.1.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐЫЙ Manufacturer (должен быть «HP»)\n"
-#~ " REF: Стр. 211, таблица D.1.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n"
-#~ " REF: Page 211, table D.1.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐЫЙ Manufacturer (должен быть «Oki»)\n"
-#~ " REF: Стр. 211, таблица D.1.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n"
-#~ " REF: Pages 59-60, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐОЕ ModelName – «%c» не разрешено в Ñтроке.\n"
-#~ " REF: Стр. 59-60, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n"
-#~ " REF: Pages 62-64, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐÐЯ PSVersion – не «(string) int».\n"
-#~ " REF: Стр. 62-64, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD Product - not \"(string)\".\n"
-#~ " REF: Page 62, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐЫЙ Product – не «(string)».\n"
-#~ " REF: Стр. 62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n"
-#~ " REF: Pages 64-65, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐЕВЕРÐЫЙ ShortNickName – длиннее чем 31 Ñимв.\n"
-#~ " REF: Стр. 64-65, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** Bad %s choice %s\n"
-#~ " REF: Page 84, section 5.9\n"
-#~ msgstr ""
-#~ "\t**FAIL** Ðеверный %s выбор %s\n"
-#~ "\t\t REF: Стр. 84, раздел 5.9\n"
-
-#~ msgid ""
-#~ " **FAIL** Bad FileVersion \"%s\"\n"
-#~ " REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ FileVersion \"%s\"\n"
-#~ " REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** Bad FormatVersion \"%s\"\n"
-#~ " REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ FormatVersion \"%s\"\n"
-#~ " REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1\n"
-#~ msgstr "\t**FAIL** Ðеверный LanguageEncoding %s - должен быть ISOLatin1\n"
-
-#~ msgid " **FAIL** Bad LanguageVersion %s - must be English\n"
-#~ msgstr "\t**FAIL** Ðеверный LanguageVersion %s - должен быть английÑкий\n"
-
-#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n"
-#~ msgstr ""
-#~ " **FAIL** Ðе удаетÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ñ€ÐµÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ код параметра по умолчанию: "
-#~ "%s\n"
-
-#~ msgid ""
-#~ " **FAIL** Default translation string for option %s choice %s "
-#~ "contains 8-bit characters\n"
-#~ msgstr ""
-#~ "\t**FAIL** Стандартный перевод Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s выбора %s Ñодержит 8-"
-#~ "битовые Ñимволы\n"
-
-#~ msgid ""
-#~ " **FAIL** Default translation string for option %s contains 8-bit "
-#~ "characters\n"
-#~ msgstr ""
-#~ "\t**FAIL** Стандартный перевод Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s Ñодержит 8-"
-#~ "битовыеÑимволы\n"
-
-#~ msgid " **FAIL** Group names %s and %s differ only by case\n"
-#~ msgstr ""
-#~ "\t**FAIL** Имена групп %s и %s отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ региÑтром Ñимволов\n"
-
-#~ msgid " **FAIL** Multiple occurrences of %s choice name %s\n"
-#~ msgstr "\t**FAIL** Ð”Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° %s Ð¸Ð¼Ñ %s вÑтречаетÑÑ Ð½ÐµÑколько раз\n"
-
-#~ msgid " **FAIL** Option names %s and %s differ only by case\n"
-#~ msgstr ""
-#~ "\t**FAIL** ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² %s и %s отличаютÑÑ Ð»Ð¸ÑˆÑŒ региÑтром "
-#~ "Ñимволов\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED Default%s\n"
-#~ " REF: Page 40, section 4.5.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ Default%s\n"
-#~ " REF: Стр. 40, раздел 4.5.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED DefaultImageableArea\n"
-#~ " REF: Page 102, section 5.15.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ DefaultImageableArea\n"
-#~ " REF: Стр. 102, раздел 5.15.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED DefaultPaperDimension\n"
-#~ " REF: Page 103, section 5.15.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ DefaultPaperDimension\n"
-#~ " REF: Стр. 103, раздел 5.15.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED FileVersion\n"
-#~ " REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ FileVersion\n"
-#~ " REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED FormatVersion\n"
-#~ " REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ FormatVersion\n"
-#~ " REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n"
-#~ " REF: Page 41, section 5.\n"
-#~ " REF: Page 102, section 5.15.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ ImageableArea Ð´Ð»Ñ PageSize %s\n"
-#~ " REF: Стр. 41, раздел 5.\n"
-#~ " REF: Стр. 102, раздел 5.15.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED LanguageEncoding\n"
-#~ " REF: Pages 56-57, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ LanguageEncoding\n"
-#~ " REF: Стр. 56-57, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED LanguageVersion\n"
-#~ " REF: Pages 57-58, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ LanguageVersion\n"
-#~ " REF: Стр. 57-58, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED Manufacturer\n"
-#~ " REF: Pages 58-59, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ Manufacturer\n"
-#~ " REF: Стр. 58-59, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED ModelName\n"
-#~ " REF: Pages 59-60, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ ModelName\n"
-#~ " REF: Стр. 59-60, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED NickName\n"
-#~ " REF: Page 60, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ NickName\n"
-#~ " REF: Стр. 60, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED PCFileName\n"
-#~ " REF: Pages 61-62, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ PCFileName\n"
-#~ " REF: Стр. 61-62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED PSVersion\n"
-#~ " REF: Pages 62-64, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ PSVersion\n"
-#~ " REF: Стр. 62-64, раздел 5.3.\n"
+#~ msgid " %s Missing \"%s\" translation string for option %s"
+#~ msgstr "\t%s Перевод \"%s\" отÑутÑтвует Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
#~ msgid ""
-#~ " **FAIL** REQUIRED PageRegion\n"
-#~ " REF: Page 100, section 5.14.\n"
+#~ " Missing %%EndComments comment.\n"
+#~ " REF: Page 41, %%EndComments"
#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ PageRegion\n"
-#~ " REF: Стр. 100, раздел 5.14.\n"
+#~ " Комментарий %%EndComments отÑутÑтвует.\n"
+#~ " REF: Стр. 41, %%EndComments"
-#~ msgid ""
-#~ " **FAIL** REQUIRED PageSize\n"
-#~ " REF: Page 41, section 5.\n"
-#~ " REF: Page 99, section 5.14.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ PageSize\n"
-#~ " REF: Стр. 41, раздел 5.\n"
-#~ " REF: Стр. 99, раздел 5.14.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED PageSize\n"
-#~ " REF: Pages 99-100, section 5.14.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ PageSize\n"
-#~ " REF: Стр. 99-100, раздел 5.14.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n"
-#~ " REF: Page 41, section 5.\n"
-#~ " REF: Page 103, section 5.15.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ PaperDimension Ð´Ð»Ñ PageSize %s\n"
-#~ " REF: Стр. 41, раздел 5.\n"
-#~ " REF: Стр. 103, раздел 5.15.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED Product\n"
-#~ " REF: Page 62, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ Product\n"
-#~ " REF: Стр. 62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ " **FAIL** REQUIRED ShortNickName\n"
-#~ " REF: Page 64-65, section 5.3.\n"
-#~ msgstr ""
-#~ " **FAIL** ТРЕБУЕТСЯ ShortNickName\n"
-#~ " REF: Стр. 64-65, раздел 5.3.\n"
-
-#~ msgid " %d ERRORS FOUND\n"
-#~ msgstr " ОБÐÐРУЖЕÐО ОШИБОК: %d\n"
-
-#~ msgid ""
-#~ " Bad %%%%BoundingBox: on line %d\n"
-#~ " REF: Page 39, %%%%BoundingBox:\n"
-#~ msgstr ""
-#~ " Ðеверный %%%%BoundingBox: в Ñтроке %d\n"
-#~ "\t REF: Стр. 39, %%%%BoundingBox:\n"
-
-#~ msgid ""
-#~ " Bad %%%%Page: on line %d\n"
-#~ " REF: Page 53, %%%%Page:\n"
-#~ msgstr ""
-#~ " ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ %%%%Page: в Ñтроке %d\n"
-#~ "\t REF: Стр. 53, %%%%Page:\n"
-
-#~ msgid ""
-#~ " Bad %%%%Pages: on line %d\n"
-#~ " REF: Page 43, %%%%Pages:\n"
-#~ msgstr ""
-#~ " Ðеверные %%%%Pages: в Ñтроке %d\n"
-#~ "\t REF: Стр. 43, %%%%Pages:\n"
-
-#~ msgid ""
-#~ " Line %d is longer than 255 characters (%d)\n"
-#~ " REF: Page 25, Line Length\n"
-#~ msgstr ""
-#~ "\tДлина Ñтроки %d больше 255 Ñимволов (%d)\n"
-#~ "\t REF: Стр. 25, Длина Ñтроки \n"
-
-#~ msgid ""
-#~ " Missing %!PS-Adobe-3.0 on first line\n"
-#~ " REF: Page 17, 3.1 Conforming Documents\n"
-#~ msgstr ""
-#~ " %!PS-Adobe-3.0 отÑутÑтвует в первой Ñтроке\n"
-#~ "\t REF: Стр. 17, 3.1 СоответÑтвующие документы\n"
-
-#~ msgid ""
-#~ " Missing %%EndComments comment\n"
-#~ " REF: Page 41, %%EndComments\n"
-#~ msgstr ""
-#~ " Комментарий %%EndComments отÑутÑтвует\n"
-#~ "\t REF: Стр. 41, %%EndComments\n"
-
-#~ msgid ""
-#~ " Missing or bad %%BoundingBox: comment\n"
-#~ " REF: Page 39, %%BoundingBox:\n"
-#~ msgstr ""
-#~ " ОтÑутÑтвует или неверный %%BoundingBox: комментарий\n"
-#~ "\t REF: Стр. 39, %%BoundingBox:\n"
+#~ msgid "Looking for printer."
+#~ msgstr "ПоиÑк принтера."
#~ msgid ""
-#~ " Missing or bad %%Page: comments\n"
-#~ " REF: Page 53, %%Page:\n"
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
#~ msgstr ""
-#~ " ОтÑутÑтвует или Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ %%Page: комментарий\n"
-#~ "\t REF: Стр. 53, %%Page:\n"
-
-#~ msgid ""
-#~ " Missing or bad %%Pages: comment\n"
-#~ " REF: Page 43, %%Pages:\n"
-#~ msgstr ""
-#~ " ОтÑутÑтвуют или неверные %%Pages: комментарий\n"
-#~ "\t REF: Стр. 43, %%Pages:\n"
-
-#~ msgid " NO ERRORS FOUND\n"
-#~ msgstr " ОШИБОК ÐЕ ОБÐÐРУЖЕÐО\n"
-
-#~ msgid " Saw %d lines that exceeded 255 characters\n"
-#~ msgstr "\tÐайдено %d Ñтрок, длина которых превышает 255 Ñимволов\n"
-
-#~ msgid " Too many %%BeginDocument comments\n"
-#~ msgstr " Слишком много комментариев %%BeginDocument\n"
-
-#~ msgid " Too many %%EndDocument comments\n"
-#~ msgstr " Слишком много комментариев %%EndDocument\n"
-
-#~ msgid " Warning: file contains binary data\n"
-#~ msgstr " WARNING: файл Ñодержит бинарные данные\n"
-
-#~ msgid " Warning: no %%EndComments comment in file\n"
-#~ msgstr " WARNING: нет ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ %%EndComments в файле\n"
-
-#~ msgid " Warning: obsolete DSC version %.1f in file\n"
-#~ msgstr " WARNING: уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð²ÐµÑ€ÑÐ¸Ñ DSC %.1f в файле\n"
-
-#~ msgid " FAIL\n"
-#~ msgstr " FAIL\n"
-
-#~ msgid ""
-#~ " FAIL\n"
-#~ " **FAIL** Unable to open PPD file - %s\n"
-#~ msgstr ""
-#~ " FAIL\n"
-#~ " **FAIL** Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл – %s\n"
-
-#~ msgid ""
-#~ " FAIL\n"
-#~ " **FAIL** Unable to open PPD file - %s on line %d.\n"
-#~ msgstr ""
-#~ " FAIL\n"
-#~ " **FAIL** Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл – %s в Ñтроке %d.\n"
-
-#~ msgid " PASS\n"
-#~ msgstr " PASS\n"
-
-#~ msgid "#10 Envelope"
-#~ msgstr "#10 Envelope"
-
-#~ msgid "#11 Envelope"
-#~ msgstr "#11 Envelope"
-
-#~ msgid "#12 Envelope"
-#~ msgstr "#12 Envelope"
-
-#~ msgid "#14 Envelope"
-#~ msgstr "#14 Envelope"
-
-#~ msgid "#9 Envelope"
-#~ msgstr "#9 Envelope"
-
-#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
-#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f байт\n"
-
-#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
-#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f байт\n"
-
-#~ msgid "%.0f x %.0f millimeters"
-#~ msgstr "%.0f x %.0f мм"
-
-#~ msgid "%.0f x %.0f to %.0f x %.0f millimeters"
-#~ msgstr "%.0f x %.0f — %.0f x %.0f мм"
-
-#~ msgid "%.2f x %.2f inches"
-#~ msgstr "%.2f x %.2f дюймов"
-
-#~ msgid "%.2f x %.2f to %.2f x %.2f inches"
-#~ msgstr "%.2f x %.2f-%.2f x %.2f дюймов"
-
-#~ msgid "%s accepting requests since %s\n"
-#~ msgstr "%s принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s\n"
-
-#~ msgid "%s is not implemented by the CUPS version of lpc.\n"
-#~ msgstr "%s не выполнено верÑией CUPS Ð´Ð»Ñ lpc.\n"
-
-#~ msgid "%s is not ready\n"
-#~ msgstr "%s не готов\n"
-
-#~ msgid "%s is ready\n"
-#~ msgstr "%s готов\n"
-
-#~ msgid "%s is ready and printing\n"
-#~ msgstr "%s готов и печатает\n"
-
-#~ msgid ""
-#~ "%s not accepting requests since %s -\n"
-#~ "\t%s\n"
-#~ msgstr ""
-#~ "%s не принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -\n"
-#~ "\t%s\n"
-
-#~ msgid "%s not supported"
-#~ msgstr "%s не поддерживаетÑÑ"
-
-#~ msgid "%s/%s accepting requests since %s\n"
-#~ msgstr "%s/%s принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s\n"
-
-#~ msgid ""
-#~ "%s/%s not accepting requests since %s -\n"
-#~ "\t%s\n"
-#~ msgstr ""
-#~ "%s/%s не принимает запроÑÑ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -\n"
-#~ "\t%s\n"
-
-#~ msgid "%s: %-33.33s [job %d localhost]\n"
-#~ msgstr "%s: %-33.33s [задание %d localhost]\n"
-
-#~ msgid "%s: %s failed: %s\n"
-#~ msgstr "%s: ошибка %s: %s\n"
-
-#~ msgid "%s: Don't know what to do\n"
-#~ msgstr "%s: Дальнейшие дейÑÑ‚Ð²Ð¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтны\n"
-
-#~ msgid ""
-#~ "%s: Error - %s environment variable names non-existent destination \"%s"
-#~ "\"\n"
-#~ msgstr ""
-#~ "%s: Ошибка - %s Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ на неÑущеÑтвующее "
-#~ "назначение \"%s\"\n"
-
-#~ msgid "%s: Error - bad job ID\n"
-#~ msgstr "%s: Ошибка - неверный ID заданиÑ\n"
-
-#~ msgid "%s: Error - cannot print files and alter jobs simultaneously\n"
-#~ msgstr ""
-#~ "%s: Ошибка - невозможно печатать файлы и редактировать Ð·Ð°Ð´Ð°Ð½Ð¸Ñ "
-#~ "одновременно\n"
-
-#~ msgid ""
-#~ "%s: Error - cannot print from stdin if files or a job ID are provided\n"
-#~ msgstr ""
-#~ "%s: Ошибка - не удаетÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ из stdin, еÑли предоÑтавлены файлы или ID "
-#~ "заданиÑ\n"
-
-#~ msgid "%s: Error - expected character set after '-S' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-S' должен идти набор Ñимволов\n"
-
-#~ msgid "%s: Error - expected content type after '-T' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-T' должен быть указан тип контента\n"
-
-#~ msgid "%s: Error - expected copies after '-n' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - поÑле параметра '-n' должно быть указано количеÑтво копий\n"
-
-#~ msgid "%s: Error - expected copy count after '-#' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-#' должен быть указан номер копии\n"
-
-#~ msgid "%s: Error - expected destination after '-P' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-P' должно быть указано назначение\n"
-
-#~ msgid "%s: Error - expected destination after '-b' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-b' должно быть указано назначение\n"
-
-#~ msgid "%s: Error - expected destination after '-d' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-d' должно быть указано назначение\n"
-
-#~ msgid "%s: Error - expected form after '-f' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-f' должна быть указана форма\n"
-
-#~ msgid "%s: Error - expected hold name after '-H' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-H' должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта\n"
-
-#~ msgid "%s: Error - expected hostname after '-H' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-H' должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта\n"
-
-#~ msgid "%s: Error - expected hostname after '-h' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-h' должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта\n"
-
-#~ msgid "%s: Error - expected mode list after '-y' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - поÑле параметра '-y' должен быть указан ÑпиÑок режимов\n"
-
-#~ msgid "%s: Error - expected name after '-%c' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-%c' должно быть указано имÑ\n"
-
-#~ msgid "%s: Error - expected option string after '-o' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - поÑле параметра '-o' должна быть указана Ñтрока параметра\n"
-
-#~ msgid "%s: Error - expected page list after '-P' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-H' должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта\n"
-
-#~ msgid "%s: Error - expected priority after '-%c' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-%c' должен быть указан приоритет\n"
-
-#~ msgid "%s: Error - expected reason text after '-r' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-r' должен идти текÑÑ‚ причины\n"
-
-#~ msgid "%s: Error - expected title after '-t' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-t' должен быть указан заголовок\n"
-
-#~ msgid "%s: Error - expected username after '-U' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - поÑле параметра '-U'должно быть указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\n"
-
-#~ msgid "%s: Error - expected username after '-U' option!n"
-#~ msgstr ""
-#~ "%s: Ошибка - поÑле параметра '-U'должно быть указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\n"
-
-#~ msgid "%s: Error - expected username after '-u' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - поÑле параметра '-u'должно быть указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\n"
-
-#~ msgid "%s: Error - expected value after '-%c' option\n"
-#~ msgstr "%s: Ошибка - поÑле параметра '-%c'должно быть указано значение\n"
-
-#~ msgid ""
-#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' "
-#~ "option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - требуетÑÑ \"завершено\",\"не завершено\" или \"вÑе\" поÑле "
-#~ "параметра '-W'\n"
-
-#~ msgid "%s: Error - no default destination available.\n"
-#~ msgstr "%s: Ошибка – нет доÑтупного Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию.\n"
-
-#~ msgid "%s: Error - priority must be between 1 and 100.\n"
-#~ msgstr "%s: Ошибка – приоритет должен быть от 1 до 100.\n"
-
-#~ msgid "%s: Error - scheduler not responding\n"
-#~ msgstr "%s: Ошибка - планировщик не отвечает\n"
-
-#~ msgid "%s: Error - too many files - \"%s\"\n"
-#~ msgstr "%s: Ошибка – Ñлишком много файлов – «%s»\n"
-
-#~ msgid "%s: Error - unable to access \"%s\" - %s\n"
-#~ msgstr "%s: Ошибка – не удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к «%s» – %s\n"
-
-#~ msgid "%s: Error - unable to queue from stdin - %s\n"
-#~ msgstr "%s: Ошибка – не удаетÑÑ Ð¿Ð¾Ñтавить в очередь из stdin - %s\n"
-
-#~ msgid "%s: Error - unknown destination \"%s\"\n"
-#~ msgstr "%s: Ошибка - неизвеÑтное назначение \"%s\"\n"
-
-#~ msgid "%s: Error - unknown destination \"%s/%s\"\n"
-#~ msgstr "%s: ошибка - неизвеÑтное назначение \"%s/%s\"\n"
-
-#~ msgid "%s: Error - unknown option '%c'\n"
-#~ msgstr "%s: Ошибка - неизвеÑтный параметр '%c'\n"
-
-#~ msgid "%s: Error - unknown option '%s'\n"
-#~ msgstr "%s: Ошибка - неизвеÑтный параметр '%s'\n"
-
-#~ msgid "%s: Expected job ID after '-i' option\n"
-#~ msgstr "%s: ОжидаетÑÑ ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñле параметра '-i'\n"
-
-#~ msgid "%s: Filter \"%s\" not available: %s\n"
-#~ msgstr "%s: Фильтр «%s» недоÑтупен: %s\n"
-
-#~ msgid "%s: Invalid destination name in list \"%s\"\n"
-#~ msgstr "%s: ÐедопуÑтимое Ð¸Ð¼Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² ÑпиÑке \"%s\"\n"
-
-#~ msgid "%s: Invalid filter string \"%s\"\n"
-#~ msgstr "%s: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока фильтра «%s»\n"
-
-#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'\n"
-#~ msgstr "%s: Ðеобходимо указать ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ('-i jobid') перед '-H restart'\n"
-
-#~ msgid "%s: No filter to convert from %s/%s to %s/%s\n"
-#~ msgstr ""
-#~ "%s: ОтÑутÑтвует фильтр, необходимый Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· %s/%s в %s/%s\n"
-
-#~ msgid "%s: Operation failed: %s\n"
-#~ msgstr "%s: ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ: %s\n"
-
-#~ msgid "%s: Sorry, no encryption support compiled in\n"
-#~ msgstr "%s: Ðет Ñкомпилированной поддержки шифрованиÑ\n"
-
-#~ msgid "%s: Unable to connect to server\n"
-#~ msgstr "%s: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу\n"
-
-#~ msgid "%s: Unable to contact server\n"
-#~ msgstr "%s: Ðе удаетÑÑ ÑƒÑтановить ÑвÑзь Ñ Ñервером\n"
-
-#~ msgid "%s: Unable to determine MIME type of \"%s\"\n"
-#~ msgstr "%s: Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ тип MIME \"%s\"\n"
-
-#~ msgid "%s: Unable to open %s: %s\n"
-#~ msgstr "%s: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ %s: %s\n"
-
-#~ msgid "%s: Unable to open PPD file: %s on line %d\n"
-#~ msgstr "%s: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл: %s в Ñтроке %d.\n"
-
-#~ msgid "%s: Unable to open PPD file: %s on line %d.\n"
-#~ msgstr "%s: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD файл: %s в Ñтроке %d.\n"
-
-#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"\n"
-#~ msgstr "%s: Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ базу данных MIME из \"%s\" или \"%s\"\n"
-
-#~ msgid "%s: Unknown destination \"%s\"\n"
-#~ msgstr "%s: ÐеизвеÑтное назначение \"%s\"\n"
-
-#~ msgid "%s: Unknown destination MIME type %s/%s\n"
-#~ msgstr "%s: ÐеизвеÑтный MIME-тип Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s/%s\n"
-
-#~ msgid "%s: Unknown option '%c'\n"
-#~ msgstr "%s: ÐеизвеÑтный параметр '%c'\n"
-
-#~ msgid "%s: Unknown source MIME type %s/%s\n"
-#~ msgstr "%s: ÐеизвеÑтный MIME-тип иÑточника %s/%s\n"
-
-#~ msgid ""
-#~ "%s: Warning - '%c' format modifier not supported - output may not be "
-#~ "correct\n"
-#~ msgstr ""
-#~ "%s: Внимание - модификатор формата '%c' не поддерживаетÑÑ - вывод может "
-#~ "быть неправильным\n"
-
-#~ msgid "%s: Warning - character set option ignored\n"
-#~ msgstr "%s: Внимание - параметр набора Ñимволов пропущен\n"
-
-#~ msgid "%s: Warning - content type option ignored\n"
-#~ msgstr "%s: Внимание - параметр типа контента пропущен\n"
-
-#~ msgid "%s: Warning - form option ignored\n"
-#~ msgstr "%s: Внимание - параметр формы пропущен\n"
-
-#~ msgid "%s: Warning - mode option ignored\n"
-#~ msgstr "%s: Внимание - параметр режима пропущен\n"
-
-#~ msgid ""
-#~ "%s: error - %s environment variable names non-existent destination \"%s"
-#~ "\"\n"
-#~ msgstr ""
-#~ "%s: ошибка - Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ %s указывает на неÑущеÑтвующее значение "
-#~ "\"%s\"\n"
-
-#~ msgid "%s: error - expected option=value after '-o' option\n"
-#~ msgstr ""
-#~ "%s: ошибка - поÑле параметра '-o' должна идти запиÑÑŒ вида option=value\n"
-
-#~ msgid "%s: error - no default destination available.\n"
-#~ msgstr "%s: ошибка – нет доÑтупного Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию.\n"
-
-#~ msgid "10 x 11\""
-#~ msgstr "10 x 11\""
-
-#~ msgid "10 x 13\""
-#~ msgstr "10 x 13\""
-
-#~ msgid "10 x 14\""
-#~ msgstr "10 x 14\""
-
-#~ msgid "12 x 11\""
-#~ msgstr "12 x 11\""
-
-#~ msgid "15 x 11\""
-#~ msgstr "15 x 11\""
-
-#~ msgid "3.5\" Disk - 2 1/8 x 2 3/4\""
-#~ msgstr "ДиÑк 3.5\" - 2 1/8 x 2 3/4\""
-
-#~ msgid "60x720dpi"
-#~ msgstr "60x720dpi"
-
-#~ msgid "7 x 9\""
-#~ msgstr "7 x 9\""
-
-#~ msgid "8 x 10\""
-#~ msgstr "8 x 10\""
-
-#~ msgid "9 x 11\""
-#~ msgstr "9 x 11\""
-
-#~ msgid "9 x 12\""
-#~ msgstr "9 x 12\""
-
-#~ msgid "?Invalid help command unknown\n"
-#~ msgstr "?ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ñправки неизвеÑтна\n"
-
-#~ msgid "A class named \"%s\" already exists"
-#~ msgstr "КлаÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\" уже ÑущеÑтвует"
-
-#~ msgid "A printer named \"%s\" already exists"
-#~ msgstr "Принтер Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\" уже ÑущеÑтвует"
-
-#~ msgid "A3 (Oversize)"
-#~ msgstr "A3 (раÑширенный)"
-
-#~ msgid "A4 (Oversize)"
-#~ msgstr "A4 (раÑширенный)"
-
-#~ msgid "A4 (Small)"
-#~ msgstr "A4 (уменьшенный)"
-
-#~ msgid "A5 (Oversize)"
-#~ msgstr "A5 (раÑширенный)"
-
-#~ msgid "ARCH A"
-#~ msgstr "ARCH A"
-
-#~ msgid "ARCH B"
-#~ msgstr "ARCH B"
-
-#~ msgid "Address - 1 1/8 x 3 1/2\""
-#~ msgstr "ÐÐ´Ñ€ÐµÑ - 1 1/8 x 3 1/2\""
-
-#~ msgid "Attempt to set %s printer-state to bad value %d"
-#~ msgstr "Попытка уÑтановить %s printer-state на неверное значение %d"
-
-#~ msgid "Attribute groups are out of order (%x < %x)"
-#~ msgstr "Группы атрибутов не дейÑтвуют (%x < %x)"
-
-#~ msgid "Bad device URI \"%s\"\n"
-#~ msgstr "Ðеверный URI уÑтройÑтва \"%s\"\n"
-
-#~ msgid "Bad device-uri \"%s\""
-#~ msgstr "Ðеверное значение device-uri \"%s\""
-
-#~ msgid "Bad device-uri scheme \"%s\""
-#~ msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñхема device-uri \"%s\""
-
-#~ msgid "Bad document-format \"%s\""
-#~ msgstr "Ðеверное значение document-format \"%s\""
-
-#~ msgid "Bad font attribute: %s\n"
-#~ msgstr "Ðеверный атрибут шрифта: %s\n"
-
-#~ msgid "Bad job-priority value"
-#~ msgstr "Ðеверное значение job-priority"
-
-#~ msgid "Bad job-sheets value \"%s\""
-#~ msgstr "Ðеверное значение job-sheets \"%s\""
-
-#~ msgid "Bad job-sheets value type"
-#~ msgstr "Ðеверный тип Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ job-sheets"
-
-#~ msgid "Bad job-state value"
-#~ msgstr "Ðеверное значение job-state"
-
-#~ msgid "Bad job-uri attribute \"%s\""
-#~ msgstr "Ðеверный атрибут job-uri \"%s\""
-
-#~ msgid "Bad notify-pull-method \"%s\""
-#~ msgstr "Ðеверное значение notify-pull-method \"%s\""
-
-#~ msgid "Bad notify-recipient-uri URI \"%s\""
-#~ msgstr "Ðеверный URI notify-recipient-uri \"%s\""
-
-#~ msgid "Bad option + choice on line %d"
-#~ msgstr "Ðеверный параметр + выбор в Ñтроке %d"
-
-#~ msgid "Bad port-monitor \"%s\""
-#~ msgstr "Ðеверное значение port-monitor \"%s\""
-
-#~ msgid "Bad printer-state value %d"
-#~ msgstr "Ðеверное значение printer-state %d"
-
-#~ msgid "Bad request ID %d"
-#~ msgstr "Ðеверный ID запроÑа %d"
-
-#~ msgid "Bad request version number %d.%d"
-#~ msgstr "Ðеверный номер верÑии запроÑа %d.%d"
-
-#~ msgid "Billing Information: "
-#~ msgstr "Реквизиты Ð´Ð»Ñ Ð²Ñ‹ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчета: "
-
-#~ msgid "C0 Envelope"
-#~ msgstr "Конверт C0"
-
-#~ msgid "C1 Envelope"
-#~ msgstr "Конверт C1"
-
-#~ msgid "C2 Envelope"
-#~ msgstr "Конверт C2"
-
-#~ msgid "C3 Envelope"
-#~ msgstr "Конверт C3"
-
-#~ msgid "C4"
-#~ msgstr "C4"
-
-#~ msgid "C4 Envelope"
-#~ msgstr "Конверт C4"
-
-#~ msgid "C5"
-#~ msgstr "C5"
-
-#~ msgid "C5 Envelope"
-#~ msgstr "Конверт C5"
-
-#~ msgid "C6"
-#~ msgstr "C6"
-
-#~ msgid "C6 Envelope"
-#~ msgstr "Конверт C6"
-
-#~ msgid "C65 Envelope"
-#~ msgstr "Конверт C65"
-
-#~ msgid "C7 Envelope"
-#~ msgstr "Конверт C7"
-
-#~ msgid "Character set \"%s\" not supported"
-#~ msgstr "Ðабор Ñимволов \"%s\" не поддерживаетÑÑ"
-
-#~ msgid "Chou3 Envelope"
-#~ msgstr "Конверт Chou3"
-
-#~ msgid "Chou4 Envelope"
-#~ msgstr "Конверт Chou4"
-
-#~ msgid ""
-#~ "Commands may be abbreviated. Commands are:\n"
-#~ "\n"
-#~ "exit help quit status ?\n"
-#~ msgstr ""
-#~ "Команды могут быть Ñокращены. Команды:\n"
-#~ "\n"
-#~ "exit help quit status ?\n"
-
-#~ msgid "Could not scan type \"%s\""
-#~ msgstr "Ðе удалоÑÑŒ Ñканировать тип \"%s\""
-
-#~ msgid "Created On: "
-#~ msgstr "Дата ÑозданиÑ: "
-
-#~ msgid "DL"
-#~ msgstr "DL"
-
-#~ msgid "DL Envelope"
-#~ msgstr "Конверт DL"
-
-#~ msgid "Description: "
-#~ msgstr "ОпиÑание: "
-
-#~ msgid ""
-#~ "Device: uri = %s\n"
-#~ " class = %s\n"
-#~ " info = %s\n"
-#~ " make-and-model = %s\n"
-#~ " device-id = %s\n"
-#~ " location = %s\n"
-#~ msgstr ""
-#~ "УÑтройÑтво: uri = %s\n"
-#~ " class = %s\n"
-#~ " info = %s\n"
-#~ " make-and-model = %s\n"
-#~ " device-id = %s\n"
-#~ " location = %s\n"
-
-#~ msgid "Document %d not found in job %d."
-#~ msgstr "Документ %d в задании %d не найден."
-
-#~ msgid "Double Postcard"
-#~ msgstr "Ð”Ð²Ð¾Ð¹Ð½Ð°Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÐºÐ°"
-
-#~ msgid "Driver Name: "
-#~ msgstr "Ð˜Ð¼Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð°: "
-
-#~ msgid "Driver Version: "
-#~ msgstr "ВерÑÐ¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð°: "
-
-#~ msgid "EMERG: Unable to allocate memory for page info: %s\n"
-#~ msgstr "EMERG: Ðе удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ памÑÑ‚ÑŒ Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ Ñтраницы: %s\n"
-
-#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n"
-#~ msgstr "EMERG: Ðе удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ памÑÑ‚ÑŒ Ð´Ð»Ñ Ð¼Ð°ÑÑива Ñтраниц: %s\n"
-
-#~ msgid "ERROR: %s job-id user title copies options [file]\n"
-#~ msgstr "ERROR: %s задание пользователь название копий параметры [файл]\n"
-
-#~ msgid "ERROR: Bad %%BoundingBox: comment seen\n"
-#~ msgstr "ERROR: Ðеверный %%BoundingBox: комментарий проÑмотрен\n"
-
-#~ msgid "ERROR: Bad %%IncludeFeature: comment\n"
-#~ msgstr "ERROR: Ðеверный %%IncludeFeature: комментарий\n"
-
-#~ msgid "ERROR: Bad %%Page: comment in file\n"
-#~ msgstr "ERROR: Ðеверный %%Page: комментарий в файле\n"
-
-#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file\n"
-#~ msgstr "ERROR: Ðеверный %%PageBoundingBox: комментарий в файле\n"
-
-#~ msgid "ERROR: Bad charset file %s\n"
-#~ msgstr "ERROR: Ðеверный файл набора Ñимволов %s\n"
-
-#~ msgid "ERROR: Bad charset type %s\n"
-#~ msgstr "ERROR: Ðеверный тип набора Ñимволов %s\n"
-
-#~ msgid "ERROR: Bad columns value %d\n"
-#~ msgstr "ERROR: Ðеверное значение количеÑтва Ñтолбцов %d\n"
-
-#~ msgid "ERROR: Bad cpi value %f\n"
-#~ msgstr "ERROR: Ðеверное значение cpi %f\n"
-
-#~ msgid "ERROR: Bad font description line: %s\n"
-#~ msgstr "ERROR: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока опиÑÐ°Ð½Ð¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°: %s\n"
-
-#~ msgid "ERROR: Bad lpi value %f\n"
-#~ msgstr "ERROR: Ðеверное значение lpi %f\n"
-
-#~ msgid "ERROR: Bad page setup\n"
-#~ msgstr "ERROR: Ðеверные параметры Ñтраницы\n"
-
-#~ msgid "ERROR: Bad text direction %s\n"
-#~ msgstr "ERROR: Ðеверное направление текÑта %s\n"
-
-#~ msgid "ERROR: Bad text width %s\n"
-#~ msgstr "ERROR: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° текÑта %s\n"
-
-#~ msgid "ERROR: Destination printer does not exist\n"
-#~ msgstr "ERROR: Целевой принтер не ÑущеÑтвует\n"
-
-#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen\n"
-#~ msgstr "ERROR: Дубликат %%BoundingBox: комментарий проÑмотрен\n"
-
-#~ msgid "ERROR: Duplicate %%Pages: comment seen\n"
-#~ msgstr "ERROR: Дубликат %%Pages: комментарий проÑмотрен\n"
-
-#~ msgid "ERROR: Empty print file\n"
-#~ msgstr "ERROR: ПуÑтой файл печати\n"
-
-#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n"
-#~ msgstr "ERROR: Ошибка %d при отправке запроÑа PAPSendData: %s\n"
-
-#~ msgid "ERROR: Expected quoted string on line %d of %s\n"
-#~ msgstr "ERROR: Ð’ Ñтроке %d из %s должна быть запиÑÑŒ в ковычках\n"
-
-#~ msgid "ERROR: Fatal USB error\n"
-#~ msgstr "ERROR: КритичеÑкий Ñбой USB\n"
-
-#~ msgid "ERROR: Missing %%EndProlog\n"
-#~ msgstr "ERROR: ОтÑутÑтвует %%endProlog\n"
-
-#~ msgid "ERROR: Missing %%EndSetup\n"
-#~ msgstr "ERROR: ОтÑутÑтвует %%EndSetup\n"
-
-#~ msgid "ERROR: Missing value on line %d of banner file\n"
-#~ msgstr "ERROR: ОтÑутÑтвует значение в Ñтроке %d в файле баннера.\n"
-
-#~ msgid ""
-#~ "ERROR: Need a msgid line before any translation strings on line %d of %s\n"
-#~ msgstr ""
-#~ "ERROR: ТребуетÑÑ Ñтрока msgid перед Ñтрокой перевода в Ñтроке %d из %s\n"
-
-#~ msgid "ERROR: No %%BoundingBox: comment in header\n"
-#~ msgstr "ERROR: Ðет %%BoundingBox: комментарий в заголовке\n"
-
-#~ msgid "ERROR: No %%Pages: comment in header\n"
-#~ msgstr "ERROR: Ðет %%Pages: комментарий в заголовке\n"
-
-#~ msgid ""
-#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment "
-#~ "variable\n"
-#~ msgstr ""
-#~ "ERROR: Ðе обнаружено URI уÑтройÑтва в argv[0] или переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ "
-#~ "DEVICE_URI\n"
-
-#~ msgid "ERROR: No fonts in charset file %s\n"
-#~ msgstr "ERROR: ОтÑутÑтвуют шрифты в файле набора Ñимволов %s\n"
-
-#~ msgid "ERROR: No pages found\n"
-#~ msgstr "ERROR: Страницы не найдены\n"
-
-#~ msgid "ERROR: Out of paper\n"
-#~ msgstr "ERROR: Ðе хватает бумаги\n"
-
-#~ msgid "ERROR: PRINTER environment variable not defined\n"
-#~ msgstr "ERROR: ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PRINTER не указана\n"
-
-#~ msgid "ERROR: Print file was not accepted (%s)\n"
-#~ msgstr "ERROR: Файл печати не был принÑÑ‚ (%s)\n"
-
-#~ msgid "ERROR: Printer not responding\n"
-#~ msgstr "ERROR: Принтер не отвечает\n"
-
-#~ msgid "ERROR: Printer sent unexpected EOF\n"
-#~ msgstr "ERROR: Принтер преждевременно передал индикатор EOF\n"
-
-#~ msgid "ERROR: Remote host did not accept control file (%d)\n"
-#~ msgstr "ERROR: Удаленный хоÑÑ‚ не принÑл контрольный файл (%d)\n"
-
-#~ msgid "ERROR: Remote host did not accept data file (%d)\n"
-#~ msgstr "ERROR: Удаленный хоÑÑ‚ не принÑл файл данных (%d)\n"
-
-#~ msgid "ERROR: There was a timeout error while sending data to the printer\n"
-#~ msgstr ""
-#~ "ERROR: Сбой, ÑвÑзанный Ñо временем Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ отправке данных на "
-#~ "принтер\n"
-
-#~ msgid "ERROR: Unable to add file %d to job: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ файл %d к заданию: %s\n"
-
-#~ msgid "ERROR: Unable to cancel job %d: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ задание %d: %s\n"
-
-#~ msgid "ERROR: Unable to connect to printer; will retry in 30 seconds...\n"
-#~ msgstr ""
-#~ "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº принтеру; Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° через 30 "
-#~ "Ñекунд...\n"
-
-#~ msgid "ERROR: Unable to copy PDF file"
-#~ msgstr "ERROR: Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файл PDF"
-
-#~ msgid "ERROR: Unable to create pipe"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñоздать конвейер"
-
-#~ msgid "ERROR: Unable to create socket"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñоздать Ñокет"
-
-#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñоздать временный Ñжатый файл печати: %s\n"
-
-#~ msgid "ERROR: Unable to create temporary file"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñоздать временный файл"
-
-#~ msgid "ERROR: Unable to exec pictwpstops: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ pictwpstops: %s\n"
-
-#~ msgid "ERROR: Unable to execute gs program"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить программу gs"
-
-#~ msgid "ERROR: Unable to execute pdftops program"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить программу pdftops"
-
-#~ msgid "ERROR: Unable to execute pstops program"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ pstops"
-
-#~ msgid "ERROR: Unable to fork pictwpstops: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñ€Ð°Ð·Ð²ÐµÑ‚Ð²Ð¸Ñ‚ÑŒ pictwpstops: %s\n"
-
-#~ msgid "ERROR: Unable to get PAP request"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ Ð·Ð°Ð¿Ñ€Ð¾Ñ PAP"
-
-#~ msgid "ERROR: Unable to get PAP response"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ответ PAP"
-
-#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ PPD-файл Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° «%s» – %s.\n"
-
-#~ msgid "ERROR: Unable to get default AppleTalk zone"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ Ñтандартную зону AppleTalk"
-
-#~ msgid "ERROR: Unable to get job %d attributes (%s)\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок параметров (%s) Ð·Ð°Ð´Ð°Ð½Ð¸Ñ %d \n"
-
-#~ msgid "ERROR: Unable to get printer status (%s)\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ (%s) принтера\n"
-
-#~ msgid "ERROR: Unable to locate printer '%s'\n"
-#~ msgstr "ERROR: Принтер '%s' не найден\n"
-
-#~ msgid "ERROR: Unable to look for PAP response"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑти поиÑк ответа PAP"
-
-#~ msgid "ERROR: Unable to lookup AppleTalk printers"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑти поиÑк принтеров AppleTalk"
-
-#~ msgid "ERROR: Unable to make AppleTalk address"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñтавить Ð°Ð´Ñ€ÐµÑ AppleTalk"
-
-#~ msgid "ERROR: Unable to open \"%s\" - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ «%s» – %s\n"
-
-#~ msgid "ERROR: Unable to open %s: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ %s: %s\n"
-
-#~ msgid "ERROR: Unable to open PPD file\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD файл\n"
-
-#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл баннера «%s» – %s\n"
-
-#~ msgid "ERROR: Unable to open device file \"%s\": %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл уÑтройÑтва «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to open file \"%s\" - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл «%s» – %s\n"
-
-#~ msgid "ERROR: Unable to open file \"%s\": %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to open image file for printing\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ изображение Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸\n"
-
-#~ msgid "ERROR: Unable to open print file \"%s\": %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл печати «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to open print file %s - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл печати %s – %s\n"
-
-#~ msgid "ERROR: Unable to open print file %s: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл печати %s: %s\n"
-
-#~ msgid "ERROR: Unable to open raster file - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ раÑтровый файл - %s\n"
-
-#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ временный Ñжатый файл печати: %s\n"
-
-#~ msgid "ERROR: Unable to print %d text columns\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð½Ð°Ð¿ÐµÑ‡Ð°Ñ‚Ð°Ñ‚ÑŒ Ñтолбцы Ñ Ñ‚ÐµÐºÑтом %d\n"
-
-#~ msgid "ERROR: Unable to print %dx%d text page\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð½Ð°Ð¿ÐµÑ‡Ð°Ñ‚Ð°Ñ‚ÑŒ Ñтраницу Ñ Ñ‚ÐµÐºÑтом %dx%d\n"
-
-#~ msgid "ERROR: Unable to read print data"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ñчитать данные печати"
-
-#~ msgid "ERROR: Unable to read print data\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ данные Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸\n"
-
-#~ msgid "ERROR: Unable to reserve port"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ порт"
-
-#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ к Ñмещению %ld в файле – %s\n"
-
-#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ к Ñмещению %lld в файле – %s\n"
-
-#~ msgid "ERROR: Unable to send LPD command"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ команду LPD"
-
-#~ msgid "ERROR: Unable to send PAP tickle request"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ контрольный Ð·Ð°Ð¿Ñ€Ð¾Ñ PAP"
-
-#~ msgid "ERROR: Unable to send initial PAP send data request"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ иÑходный Ð·Ð°Ð¿Ñ€Ð¾Ñ PAP на отправку данных"
-
-#~ msgid "ERROR: Unable to send print data\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ данные Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸\n"
-
-#~ msgid "ERROR: Unable to send print file to printer"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ файл печати на принтер"
-
-#~ msgid "ERROR: Unable to send trailing nul to printer"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ конечное нулевое значение на принтер"
-
-#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð¿Ð¾Ð´Ð¾Ð¶Ð´Ð°Ñ‚ÑŒ pictwpstops: %s\n"
-
-#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать %d байт на «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to write %d bytes to printer\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать %d байт на принтер\n"
-
-#~ msgid "ERROR: Unable to write control file"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать контрольный файл"
-
-#~ msgid "ERROR: Unable to write print data"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать данные печати"
-
-#~ msgid "ERROR: Unable to write print data: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать данные печати: %s\n"
-
-#~ msgid "ERROR: Unable to write raster data to driver\n"
-#~ msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать раÑтровые данные на принтер\n"
-
-#~ msgid "ERROR: Unable to write uncompressed document data: %s\n"
-#~ msgstr "ERROR: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать неÑжатые данные документа: %s\n"
-
-#~ msgid "ERROR: Unexpected text on line %d of %s\n"
-#~ msgstr "ERROR: ÐеизвеÑтный текÑÑ‚ в %s Ñтроки %d\n"
-
-#~ msgid "ERROR: Unknown encryption option value \"%s\"\n"
-#~ msgstr "ERROR: ÐеизвеÑтное значение \"%s\" параметра шифрованиÑ\n"
-
-#~ msgid "ERROR: Unknown file order \"%s\"\n"
-#~ msgstr "ERROR: ÐеизвеÑтный порÑдок файлов «%s»\n"
-
-#~ msgid "ERROR: Unknown format character \"%c\"\n"
-#~ msgstr "ERROR: Символ неизвеÑтного формата «%c»\n"
-
-#~ msgid "ERROR: Unknown message catalog format for \"%s\"\n"
-#~ msgstr "ERROR: ÐеизвеÑтный формат каталога Ñообщений Ð´Ð»Ñ \"%s\"\n"
-
-#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"\n"
-#~ msgstr "ERROR: ÐеизвеÑтный параметр \"%s\" Ñо значением \"%s\"\n"
-
-#~ msgid "ERROR: Unknown print mode \"%s\"\n"
-#~ msgstr "ERROR: ÐеизвеÑтный режим печати «%s»\n"
-
-#~ msgid "ERROR: Unknown version option value \"%s\"\n"
-#~ msgstr "ERROR: ÐеизвеÑтное значение параметра верÑии \"%s\"\n"
-
-#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100\n"
-#~ msgstr ""
-#~ "ERROR: Ðеподдерживаемое значение ÑркоÑти %s, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ "
-#~ "brightness=100\n"
-
-#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000\n"
-#~ msgstr ""
-#~ "ERROR: Ðеподдерживаемое значение гаммы %s, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ "
-#~ "gamma=1000\n"
-
-#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1\n"
-#~ msgstr ""
-#~ "ERROR: Ðеподдерживаемое значение number-up %d, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ "
-#~ "number-up=1\n"
-
-#~ msgid ""
-#~ "ERROR: Unsupported number-up-layout value %s, using number-up-"
-#~ "layout=lrtb\n"
-#~ msgstr ""
-#~ "ERROR: Ðеподдерживаемое значение number-up-layout %s, иÑпользуетÑÑ "
-#~ "значение number-up-layout=lrtb\n"
-
-#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none\n"
-#~ msgstr ""
-#~ "ERROR: Ðеподдерживаемое значение page-border %s, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ "
-#~ "page-border=none\n"
-
-#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting\n"
-#~ msgstr "ERROR: Обнаружено переполнение doc_printf (%d байт). Прервать.\n"
-
-#~ msgid "ERROR: pictwpstops exited on signal %d\n"
-#~ msgstr "ERROR: pictwpstops завершилÑÑ Ð¿Ð¾ Ñигналу %d\n"
-
-#~ msgid "ERROR: pictwpstops exited with status %d\n"
-#~ msgstr "ERROR: pitwpstops завершилÑÑ Ñо ÑтатуÑом %d\n"
-
-#~ msgid "ERROR: select() failed"
-#~ msgstr "ERROR: Сбой оператора select()"
-
-#~ msgid "ERROR: unable to stat print file"
-#~ msgstr "ERROR: Ðе удаетÑÑ ÑƒÑтановить файл печати"
-
-#~ msgid "Empty PPD file"
-#~ msgstr "ПуÑтой PPD файл"
-
-#~ msgid "Error: need hostname after '-h' option\n"
-#~ msgstr "ERROR: ТребуетÑÑ Ð¸Ð¼Ñ Ñ…Ð¾Ñта поÑле параметра '-h'\n"
-
-#~ msgid "FAIL\n"
-#~ msgstr "FAIL\n"
-
-#~ msgid "File Folder"
-#~ msgstr "Каталог файла"
-
-#~ msgid "File Folder - 9/16 x 3 7/16\""
-#~ msgstr "Каталог файла - 9 16/8 x 3 7/16\""
-
-#~ msgid ""
-#~ "File device URIs have been disabled! To enable, see the FileDevice "
-#~ "directive in \"%s/cupsd.conf\"."
-#~ msgstr ""
-#~ "URI-адреÑа файлового уÑтройÑтва отключены! Чтобы включить их, иÑпользуйте "
-#~ "директиву FileDevice в «%s/cupsd.conf»."
-
-#~ msgid "German FanFold"
-#~ msgstr "German FanFold"
-
-#~ msgid "German FanFold Legal"
-#~ msgstr "German FanFold Legal"
-
-#~ msgid "Got a printer-uri attribute but no job-id"
-#~ msgstr "Получен атрибут printer-uri, но не job-id"
-
-#~ msgid "Hanging Folder - 9/16 x 2\""
-#~ msgstr "Папка подвеÑного Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ - 9/16 x 2\""
-
-#~ msgid "INFO: AppleTalk disabled in System Preferences\n"
-#~ msgstr "INFO: AppleTalk отключен в СиÑтемных наÑтройках\n"
-
-#~ msgid "INFO: AppleTalk disabled in System Preferences.\n"
-#~ msgstr "INFO: AppleTalk отключен в СиÑтемных наÑтройках.\n"
-
-#~ msgid "INFO: Canceling print job...\n"
-#~ msgstr "INFO: Отмена Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸â€¦\n"
-
-#~ msgid "INFO: Connected to printer...\n"
-#~ msgstr "INFO: Подключен к принтеру…\n"
-
-#~ msgid "INFO: Connecting to printer...\n"
-#~ msgstr "INFO: Подключение к принтеру…\n"
-
-#~ msgid "INFO: Control file sent successfully\n"
-#~ msgstr "INFO: Контрольный файл уÑпешно отправлен\n"
-
-#~ msgid "INFO: Copying print data...\n"
-#~ msgstr "INFO: Копирование данных печати...\n"
-
-#~ msgid "INFO: Data file sent successfully\n"
-#~ msgstr "INFO: Файл данных уÑпешно отправлен\n"
-
-#~ msgid "INFO: Finished page %d...\n"
-#~ msgstr "INFO: ПоÑледнÑÑ Ñтраница %d...\n"
-
-#~ msgid "INFO: Formatting page %d...\n"
-#~ msgstr "INFO: Форматирование Ñтраницы %d…\n"
-
-#~ msgid "INFO: Loading image file...\n"
-#~ msgstr "INFO: Загрузка файла изображениÑ…\n"
-
-#~ msgid "INFO: Looking for printer...\n"
-#~ msgstr "INFO: ПоиÑк принтера...\n"
-
-#~ msgid "INFO: Opening connection\n"
-#~ msgstr "INFO: УÑтановка ÑоединениÑ\n"
-
-#~ msgid "INFO: Print file sent, waiting for printer to finish...\n"
-#~ msgstr "INFO: Файл печати отправлен, ожидание Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ принтера…\n"
-
-#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n"
-#~ msgstr "INFO: Принтер занÑÑ‚; попытка будет повторена через 10 Ñекунд…\n"
-
-#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n"
-#~ msgstr "INFO: Принтер занÑÑ‚; попытка будет повторена через 30 Ñекунд…\n"
-
-#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n"
-#~ msgstr "INFO: Принтер занÑÑ‚; попытка будет повторена через 5 Ñекунд…\n"
-
-#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n"
-#~ msgstr ""
-#~ "INFO: Принтер не поддерживает IPP/%d.%d; попытка иÑпользовать IPP/1.0…\n"
-
-#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n"
-#~ msgstr "INFO: Принтер занÑÑ‚; попытка будет повторена через 5 Ñекунд…\n"
-
-#~ msgid "INFO: Printer is currently off-line.\n"
-#~ msgstr "INFO: Ð’ данный момент принтер не подключен к Ñети.\n"
-
-#~ msgid "INFO: Printer is currently offline.\n"
-#~ msgstr "INFO: Ð’ данный момент принтер не подключен к Ñети.\n"
-
-#~ msgid "INFO: Printer is now online.\n"
-#~ msgstr "INFO: Принтер подключен к Ñети.\n"
-
-#~ msgid "INFO: Printer is offline.\n"
-#~ msgstr "INFO: Принтер не подключен к Ñети.\n"
-
-#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n"
-#~ msgstr ""
-#~ "INFO: Принтер не подключен; попытка будет повторена через 30 Ñекунд…\n"
-
-#~ msgid "INFO: Printing page %d, %d%% complete...\n"
-#~ msgstr "INFO: Печать Ñтраницы %d, %d%% завершена…\n"
-
-#~ msgid "INFO: Printing page %d...\n"
-#~ msgstr "INFO: Печать Ñтраницы %d…\n"
-
-#~ msgid "INFO: Ready to print.\n"
-#~ msgstr "INFO: Готов к печати.\n"
-
-#~ msgid "INFO: Sending control file (%lu bytes)\n"
-#~ msgstr "INFO: Отправка контрольного файла (%lu байт)\n"
-
-#~ msgid "INFO: Sending control file (%u bytes)\n"
-#~ msgstr "INFO: Отправка контрольного файла (%u байт)\n"
-
-#~ msgid "INFO: Sending data\n"
-#~ msgstr "INFO: Отправка данных\n"
-
-#~ msgid "INFO: Sending data file (%ld bytes)\n"
-#~ msgstr "INFO: Отправка файла данных (%ld байт)\n"
-
-#~ msgid "INFO: Sending data file (%lld bytes)\n"
-#~ msgstr "INFO: Отправка файла данных (%lld байт)\n"
-
-#~ msgid "INFO: Sending print data...\n"
-#~ msgstr "INFO: Отправка данных печати…\n"
-
-#~ msgid "INFO: Sent print file, %ld bytes...\n"
-#~ msgstr "INFO: Отправлен файл печати, %ld байт…\n"
-
-#~ msgid "INFO: Sent print file, %lld bytes...\n"
-#~ msgstr "INFO: Отправлен файл печати, %lld байт…\n"
-
-#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n"
-#~ msgstr "INFO: Спулинг Ð·Ð°Ð´Ð°Ð½Ð¸Ñ LPR, %.0f%% выполнено…\n"
-
-#~ msgid "INFO: Starting page %d...\n"
-#~ msgstr "INFO: Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница %d...\n"
-
-#~ msgid ""
-#~ "INFO: Unable to contact printer, queuing on next printer in class...\n"
-#~ msgstr ""
-#~ "INFO: Ðе удаетÑÑ ÑƒÑтановить ÑвÑзь Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼, поÑтановка в очередь на "
-#~ "Ñледующем принтере в клаÑÑе…\n"
-
-#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n"
-#~ msgstr "INFO: ИÑпользуетÑÑ ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð·Ð¾Ð½Ð° AppleTalk «%s»\n"
-
-#~ msgid "INFO: Waiting for job to complete...\n"
-#~ msgstr "INFO: Ожидание Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ…\n"
-
-#~ msgid "INFO: Waiting for printer to become available...\n"
-#~ msgstr "INFO: Ожидание доÑтупа к принтеру...\n"
-
-#~ msgid "ISO B0"
-#~ msgstr "ISO B0"
-
-#~ msgid "ISO B1"
-#~ msgstr "ISO B1"
-
-#~ msgid "ISO B10"
-#~ msgstr "ISO B10"
-
-#~ msgid "ISO B2"
-#~ msgstr "ISO B2"
-
-#~ msgid "ISO B3"
-#~ msgstr "ISO B3"
-
-#~ msgid "ISO B4"
-#~ msgstr "ISO B4"
-
-#~ msgid "ISO B4 Envelope"
-#~ msgstr "Конверт ISO B4"
-
-#~ msgid "ISO B5"
-#~ msgstr "ISO B5"
-
-#~ msgid "ISO B5 (Oversize)"
-#~ msgstr "ISO B5 (раÑширенный)"
-
-#~ msgid "ISO B5 Envelope"
-#~ msgstr "Конверт ISO B5"
-
-#~ msgid "ISO B6"
-#~ msgstr "ISO B6"
-
-#~ msgid "ISO B6 Envelope"
-#~ msgstr "Конверт ISO B6"
-
-#~ msgid "ISO B7"
-#~ msgstr "ISO B7"
-
-#~ msgid "ISO B8"
-#~ msgstr "ISO B8"
-
-#~ msgid "ISO B9"
-#~ msgstr "ISO B9"
-
-#~ msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\""
-#~ msgstr "Ðаклейки Internet Postage 2-Part - 2 1/4 x 7 1/2\""
-
-#~ msgid "Internet Postage 3-Part - 2 1/4 x 7\""
-#~ msgstr "Ðаклейки Internet Postage 3-Part - 2 1/4 x 7\""
-
-#~ msgid "Invite Envelope"
-#~ msgstr "Конверт Invite Envelope"
-
-#~ msgid "Italian Envelope"
-#~ msgstr "Конверт Italian Envelope"
-
-#~ msgid "Job #%d cannot be restarted - no files"
-#~ msgstr "Задание #%d не может быть перезапущено - отÑутÑтвуют файлы"
-
-#~ msgid "Job #%d does not exist"
-#~ msgstr "Задание #%d не ÑущеÑтвует"
-
-#~ msgid "Job #%d is finished and cannot be altered"
-#~ msgstr "Задание #%d завершено и не может быть изменено"
-
-#~ msgid "Job #%d is not complete"
-#~ msgstr "Задание #%d не завершено"
-
-#~ msgid "Job #%d is not held"
-#~ msgstr "Задание #%d не задержано"
-
-#~ msgid "Job #%d is not held for authentication"
-#~ msgstr "Задание #%d не задержано Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸"
-
-#~ msgid "Job #%s does not exist"
-#~ msgstr "Задание #%d не ÑущеÑтвует"
-
-#~ msgid "Job %d not found"
-#~ msgstr "Задание %d не найдено"
-
-#~ msgid "Job ID: "
-#~ msgstr "ID заданиÑ: "
-
-#~ msgid "Job UUID: "
-#~ msgstr "UUID заданиÑ: "
-
-#~ msgid "Job operation failed:"
-#~ msgstr "Сбой операции заданиÑ:"
-
-#~ msgid "Job subscriptions cannot be renewed"
-#~ msgstr "ПодпиÑки на задание не могут быть обновлены"
-
-#~ msgid "Kaku2 Envelope"
-#~ msgstr "Конверт Kaku2"
-
-#~ msgid "Kaku3 Envelope"
-#~ msgstr "Конверт Kaku3"
-
-#~ msgid "Language \"%s\" not supported"
-#~ msgstr "Язык \"%s\" не поддерживаетÑÑ"
-
-#~ msgid "Large Address - 1 4/10 x 3 1/2\""
-#~ msgstr "Полный Ð°Ð´Ñ€ÐµÑ - 1 4/10 x 3 1/2\""
-
-#~ msgid "Location: "
-#~ msgstr "МеÑтоположение: "
-
-#~ msgid "Make and Model: "
-#~ msgstr "Марка и модель: "
-
-#~ msgid "Media Dimensions: "
-#~ msgstr "Размеры бумаги: "
-
-#~ msgid "Media Limits: "
-#~ msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ¼Ð°Ð³Ð¸: "
-
-#~ msgid "Media Name: "
-#~ msgstr "Ðазвание бумаги: "
-
-#~ msgid "Missing document-number attribute"
-#~ msgstr "ОтÑутÑтвует атрибут document-number"
-
-#~ msgid "Missing double quote on line %d"
-#~ msgstr "ОтÑутÑтвует Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²Ñ‹Ñ‡ÐºÐ° в Ñтроке %d"
-
-#~ msgid "Missing notify-subscription-ids attribute"
-#~ msgstr "ОтÑутÑтвует атрибут notify-subscription-ids"
-
-#~ msgid "Missing requesting-user-name attribute"
-#~ msgstr "ОтÑутÑтвует атрибут requesting-user-name"
-
-#~ msgid "Missing required attributes"
-#~ msgstr "ОтÑутÑтвуют обÑзательные атрибуты"
-
-#~ msgid "Missing value on line %d"
-#~ msgstr "ОтÑутÑтвует значение в Ñтроке %d"
-
-#~ msgid ""
-#~ "Model: name = %s\n"
-#~ " natural_language = %s\n"
-#~ " make-and-model = %s\n"
-#~ " device-id = %s\n"
-#~ msgstr ""
-#~ "Model: name = %s\n"
-#~ " natural_language = %s\n"
-#~ " make-and-model = %s\n"
-#~ " device-id = %s\n"
-
-#~ msgid "Monarch"
-#~ msgstr "Monarch"
-
-#~ msgid "Monarch Envelope"
-#~ msgstr "Конверт Monarch"
-
-#~ msgid "NOTICE: Print file accepted - job ID %d.\n"
-#~ msgstr "NOTICE: Файл печати принÑÑ‚ – ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ %d.\n"
-
-#~ msgid "NOTICE: Print file accepted - job ID unknown.\n"
-#~ msgstr "NOTICE: Файл печати принÑÑ‚ – ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтен.\n"
-
-#~ msgid "Nested classes are not allowed"
-#~ msgstr "Вложенные группы не допуÑкаютÑÑ"
-
-#~ msgid "No Windows printer drivers are installed"
-#~ msgstr "Ðет уÑтановленных драйверов принтера Windows"
-
-#~ msgid "No active jobs on %s"
-#~ msgstr "Ðет активных заданий на %s"
-
-#~ msgid "No attributes in request"
-#~ msgstr "Ðет атрибутов в запроÑе"
-
-#~ msgid "No authentication information provided"
-#~ msgstr "Ðет информации Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подлинноÑти"
-
-#~ msgid "No default printer"
-#~ msgstr "Ðет принтера по умолчанию"
-
-#~ msgid "No file!?"
-#~ msgstr "Ðет файла!?"
-
-#~ msgid "No printer-uri in request"
-#~ msgstr "Ðет адреÑа printer-uri в запроÑе"
-
-#~ msgid "No subscription attributes in request"
-#~ msgstr "Ðет атрибутов подпиÑки в запроÑе"
-
-#~ msgid "Options: "
-#~ msgstr "Параметры: "
-
-#~ msgid "Output for printer %s is sent to %s\n"
-#~ msgstr "Вывод Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° %s отправлен на %s\n"
-
-#~ msgid "Output for printer %s is sent to remote printer %s on %s\n"
-#~ msgstr "Вывод Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° %s отправлен на удаленный принтер %s на %s\n"
-
-#~ msgid "Output for printer %s/%s is sent to %s\n"
-#~ msgstr "Вывод Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° %s/%s отправлен на %s\n"
-
-#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
-#~ msgstr "Вывод Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° %s/%s отправлен на удаленный принтер %s на %s\n"
-
-#~ msgid "PASS\n"
-#~ msgstr "PASS\n"
-
-#~ msgid "PRC1 Envelope"
-#~ msgstr "Конверт PRC1"
-
-#~ msgid "PRC10 Envelope"
-#~ msgstr "Конверт PRC10"
-
-#~ msgid "PRC2 Envelope"
-#~ msgstr "Конверт PRC2"
-
-#~ msgid "PRC3 Envelope"
-#~ msgstr "Конверт PRC3"
-
-#~ msgid "PRC32K (Oversize)"
-#~ msgstr "PRC32K (раÑширенный)"
-
-#~ msgid "PRC4 Envelope"
-#~ msgstr "Конверт PRC4"
-
-#~ msgid "PRC5 Envelope"
-#~ msgstr "Конверт PRC5"
-
-#~ msgid "PRC6 Envelope"
-#~ msgstr "Конверт PRC6"
-
-#~ msgid "PRC7 Envelope"
-#~ msgstr "Конверт PRC7"
-
-#~ msgid "PRC8 Envelope"
-#~ msgstr "Конверт PRC8"
-
-#~ msgid "PRC9 Envelope"
-#~ msgstr "Конверт PRC9"
-
-#~ msgid "Personal Envelope"
-#~ msgstr "Индивидуальный конверт"
-
-#~ msgid "Printed For: "
-#~ msgstr "Ðапечатано длÑ: "
-
-#~ msgid "Printed From: "
-#~ msgstr "Ðапечатано из: "
-
-#~ msgid "Printed On: "
-#~ msgstr "Дата печати: "
-
-#~ msgid "Printer Name: "
-#~ msgstr "Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°: "
-
-#~ msgid "Rank Owner Job File(s) Total Size\n"
-#~ msgstr ""
-#~ "Ранг Владелец Задание Файл(ы) Общий "
-#~ "размер\n"
-
-#~ msgid ""
-#~ "Rank Owner Pri Job Files Total Size\n"
-#~ msgstr ""
-#~ "Ранг Владелец Задание печати Файл(ы) "
-#~ "Общий размер\n"
-
-#~ msgid "Return Address - 3/4 x 2\""
-#~ msgstr "Обратный Ð°Ð´Ñ€ÐµÑ - 3/4 x 2\""
-
-#~ msgid "Running command: %s %s -N -A %s -c '%s'\n"
-#~ msgstr "Ð—Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: %s %s -N -A %s -c «%s»\n"
-
-#~ msgid "Serial Port #%d"
-#~ msgstr "ПоÑледовательный порт #%d"
-
-#~ msgid "Shipping Address - 2 5/16 x 4\""
-#~ msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð¾Ñтавки - 2 5/16 x 4\""
-
-#~ msgid "Tabloid (Oversize)"
-#~ msgstr "Tabloid (раÑширенный)"
-
-#~ msgid "The notify-user-data value is too large (%d > 63 octets)"
-#~ msgstr "Значение notify-user-data Ñлишком большое(%d > 63 октета)"
-
-#~ msgid "The printer is almost out of ink."
-#~ msgstr "ЗаканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°."
-
-#~ msgid "The printer is low on toner."
-#~ msgstr "ЗаканчиваетÑÑ Ñ‚Ð¾Ð½ÐµÑ€."
-
-#~ msgid "The printer is out of ink."
-#~ msgstr "Чернила закончилиÑÑŒ."
-
-#~ msgid "The printer is out of toner."
-#~ msgstr "Тонер закончилÑÑ."
-
-#~ msgid "The printer or class is not shared"
-#~ msgstr "Ðет общего доÑтупа к принтеру или клаÑÑу."
-
-#~ msgid "The printer or class was not found."
-#~ msgstr "Принтер или клаÑÑ Ð½Ðµ найден."
-
-#~ msgid "The printer-uri attribute is required"
-#~ msgstr "ТребуетÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ printer-uri"
-
-#~ msgid "Title: "
-#~ msgstr "Заголовок: "
-
-#~ msgid "Too many job-sheets values (%d > 2)"
-#~ msgstr "Слишком много значений job-sheets (%d>2)"
-
-#~ msgid "Too many printer-state-reasons values (%d > %d)"
-#~ msgstr "Слишком много значений printer-state-reasons (%d > %d)"
-
-#~ msgid "US Executive"
-#~ msgstr "US Executive"
-
-#~ msgid "US Fanfold"
-#~ msgstr "US Fanfold"
-
-#~ msgid "US Legal (Oversize)"
-#~ msgstr "US Legal (раÑширенный)"
-
-#~ msgid "US Letter (Oversize)"
-#~ msgstr "US Letter (раÑширенный)"
-
-#~ msgid "US Letter (Small)"
-#~ msgstr "US Letter (уменьшенный)"
-
-#~ msgid "USB Serial Port #%d"
-#~ msgstr "ПоÑледовательный порт USB #%d"
-
-#~ msgid "Unable to access cupsd.conf file:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к файлу «cupsd.conf»:"
-
-#~ msgid "Unable to add RSS subscription:"
-#~ msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ подпиÑку RSS:"
-
-#~ msgid "Unable to add class:"
-#~ msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ клаÑÑ:"
-
-#~ msgid "Unable to add job for destination \"%s\""
-#~ msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ задание Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"%s\""
-
-#~ msgid "Unable to add printer:"
-#~ msgstr "Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ принтер:"
-
-#~ msgid "Unable to allocate memory for file types"
-#~ msgstr "Ðе удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ памÑÑ‚ÑŒ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² файлов"
-
-#~ msgid "Unable to cancel RSS subscription:"
-#~ msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ подпиÑку RSS:"
-
-#~ msgid "Unable to change printer-is-shared attribute:"
-#~ msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ атрибут printer-is-shared:"
-
-#~ msgid "Unable to change printer:"
-#~ msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ принтер:"
-
-#~ msgid "Unable to change server settings:"
-#~ msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ наÑтройки Ñервера:"
-
-#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)"
-#~ msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ 64-битовые файлы драйвера принтера CUPS (%d)"
-
-#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)"
-#~ msgstr ""
-#~ "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ 64-битовые файлы драйвера принтера Ð´Ð»Ñ Windows (%d)"
-
-#~ msgid "Unable to copy CUPS printer driver files (%d)"
-#~ msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файлы драйвера принтера CUPS (%d)"
-
-#~ msgid "Unable to copy PPD file"
-#~ msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ PPD-файл"
-
-#~ msgid "Unable to copy Windows 2000 printer driver files (%d)"
-#~ msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файлы драйвера принтера Windows 2000 (%d)"
-
-#~ msgid "Unable to copy Windows 9x printer driver files (%d)"
-#~ msgstr "Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файлы драйвера принтера Windows 9x (%d)"
-
-#~ msgid "Unable to create temporary file:"
-#~ msgstr "Ðе удаетÑÑ Ñоздать временный файл:"
-
-#~ msgid "Unable to delete class:"
-#~ msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ клаÑÑ:"
-
-#~ msgid "Unable to delete printer:"
-#~ msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ принтер:"
-
-#~ msgid "Unable to do maintenance command:"
-#~ msgstr "Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ команду обÑлуживаниÑ:"
-
-#~ msgid "Unable to find printer\n"
-#~ msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ принтер\n"
-
-#~ msgid "Unable to get class list:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок клаÑÑа:"
-
-#~ msgid "Unable to get class status:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ»Ð°ÑÑа:"
-
-#~ msgid "Unable to get list of printer drivers:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок драйверов принтера:"
-
-#~ msgid "Unable to get printer attributes:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ атрибуты принтера:"
-
-#~ msgid "Unable to get printer list:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑпиÑок принтеров:"
-
-#~ msgid "Unable to get printer status:"
-#~ msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°:"
-
-#~ msgid "Unable to install Windows 2000 printer driver files (%d)"
-#~ msgstr "Ðе удаетÑÑ ÑƒÑтановить файлы драйвера принтера Windows 2000 (%d)"
-
-#~ msgid "Unable to install Windows 9x printer driver files (%d)"
-#~ msgstr "Ðе удаетÑÑ ÑƒÑтановить файлы драйвера принтера Windows 9x (%d)"
-
-#~ msgid "Unable to modify class:"
-#~ msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ клаÑÑ:"
-
-#~ msgid "Unable to modify printer:"
-#~ msgstr "Ðе удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ принтер:"
-
-#~ msgid "Unable to open PPD file:"
-#~ msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл:"
-
-#~ msgid "Unable to open document %d in job %d"
-#~ msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ документ %d в задании %d"
-
-#~ msgid "Unable to print test page:"
-#~ msgstr "Ðе удаетÑÑ Ð½Ð°Ð¿ÐµÑ‡Ð°Ñ‚Ð°Ñ‚ÑŒ пробную Ñтраницу:"
-
-#~ msgid "Unable to run \"%s\": %s\n"
-#~ msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить «%s»: %s\n"
-
-#~ msgid "Unable to set Windows printer driver (%d)"
-#~ msgstr "Ðе удаетÑÑ Ð½Ð°Ñтроить драйвер принтера Windows (%d)"
-
-#~ msgid "Unable to set options:"
-#~ msgstr "Ðе удаетÑÑ Ð½Ð°Ñтроить параметры:"
-
-#~ msgid "Unable to set server default:"
-#~ msgstr "Ðе удаетÑÑ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒ Ñервер иÑпользуемым по умолчанию:"
-
-#~ msgid "Unable to upload cupsd.conf file:"
-#~ msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ файл «cupsd.conf»:"
-
-#~ msgid "Unable to use legacy USB class driver\n"
-#~ msgstr "Ðе удаетÑÑ Ð¸Ñпользовать уÑтаревший драйвер клаÑÑа USB \n"
-
-#~ msgid "Unsupported character set \"%s\""
-#~ msgstr "Ðеподдерживаемый набор Ñимволов \"%s\""
-
-#~ msgid "Unsupported compression \"%s\""
-#~ msgstr "Ðеподдерживаемое Ñжатие \"%s\""
-
-#~ msgid "Unsupported compression attribute %s"
-#~ msgstr "Ðеподдерживаемый атрибут ÑÐ¶Ð°Ñ‚Ð¸Ñ %s"
-
-#~ msgid "Unsupported format \"%s\""
-#~ msgstr "Ðеподдерживаемый формат \"%s\""
-
-#~ msgid "Unsupported format '%s'"
-#~ msgstr "Ðеподдерживаемый формат '%s'"
-
-#~ msgid "Unsupported format '%s/%s'"
-#~ msgstr "Ðеподдерживаемый формат '%s/%s'"
-
-#~ 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 ""
-#~ "СинтакÑиÑ:\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"
-
-#~ msgid "Usage: %s job user title copies options [filename]\n"
-#~ msgstr "СинтакÑиÑ: %s job user title copies options [filename]\n"
-
-#~ msgid "Usage: %s job-id user title copies options [file]\n"
-#~ msgstr "СинтакÑиÑ: %s job-id user title copies options [file]\n"
-
-#~ msgid "Usage: %s job-id user title copies options file\n"
-#~ msgstr "СинтакÑиÑ: %s job-id user title copies options file\n"
-
-#~ msgid ""
-#~ "Usage: convert [ options ]\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ " -e Use every filter from the PPD file\n"
-#~ " -f filename Set file to be converted (otherwise stdin)\n"
-#~ " -o filename Set file to be generated (otherwise stdout)\n"
-#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n"
-#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n"
-#~ " -P filename.ppd Set PPD file\n"
-#~ " -a 'name=value ...' Set option(s)\n"
-#~ " -U username Set username for job\n"
-#~ " -J title Set title\n"
-#~ " -c copies Set number of copies\n"
-#~ " -u Remove the PPD file when finished\n"
-#~ " -D Remove the input file when finished\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: convert [ options ]\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ " -f filename УказываетÑÑ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¹ файл (в противном "
-#~ "Ñлучае stdin)\n"
-#~ " -o filename УказываетÑÑ Ñоздаваемый файл (в противном Ñлучае "
-#~ "stdout)\n"
-#~ " -i mime/type УказываетÑÑ MIME-тип данных на входе (в противном "
-#~ "Ñлучае auto-typed)\n"
-#~ " -j mime/type УказываетÑÑ MIME-тип данных на выходе (в противном "
-#~ "Ñлучае application/pdf)\n"
-#~ " -P filename.ppd УказываетÑÑ PPD-файл\n"
-#~ " -a 'name=value ...' УказываютÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹\n"
-#~ " -U username УказываетÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ\n"
-#~ " -J title УказываетÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº\n"
-#~ " -c copies УказываетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво копий\n"
-#~ " -u PPD-файл удалÑетÑÑ Ð¿Ð¾Ñле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹\n"
-#~ " -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 ""
-#~ "СинтакÑиÑ: cupsaddsmb [options] printer1 ... printerN\n"
-#~ " cupsaddsmb [options] -a\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ " -E Подключение к Ñерверу шифруетÑÑ\n"
-#~ " -H samba-server ИÑпользуетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð½Ñ‹Ð¹ Ñервер SAMBA\n"
-#~ " -U samba-user ВыполнÑетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° подлинноÑти Ñ Ð¸Ñпользованием "
-#~ "указанного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SAMBA\n"
-#~ " -a ЭкÑпортируютÑÑ Ð²Ñе принтеры\n"
-#~ " -h cups-server ИÑпользуетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð½Ñ‹Ð¹ Ñервер CUPS\n"
-#~ " -v Подробное отображение (показать команды)\n"
-
-#~ msgid ""
-#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ " -E Enable encryption\n"
-#~ " -U username Specify username\n"
-#~ " -h server[:port] Specify server address\n"
-#~ "\n"
-#~ " --[no-]debug-logging Turn debug logging on/off\n"
-#~ " --[no-]remote-admin Turn remote administration on/off\n"
-#~ " --[no-]remote-any Allow/prevent access from the Internet\n"
-#~ " --[no-]remote-printers Show/hide remote printers\n"
-#~ " --[no-]share-printers Turn printer sharing on/off\n"
-#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: cupsctl [options] [param=value ... paramN=valueN]\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ " -E ВключаетÑÑ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ðµ\n"
-#~ " -U username УказываетÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\n"
-#~ " -h server[:port] УказываетÑÑ Ð°Ð´Ñ€ÐµÑ Ñервера\n"
-#~ "\n"
-#~ " --[no-]debug-logging ВключаетÑÑ/отключаетÑÑ Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ журнала "
-#~ "отладки\n"
-#~ " --[no-]remote-admin ВключаетÑÑ/отключаетÑÑ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ðµ "
-#~ "админиÑтрирование\n"
-#~ " --[no-]remote-any РазрешаетÑÑ/запрещаетÑÑ Ð´Ð¾Ñтуп из Интернета\n"
-#~ " --[no-]remote-printers ОтображаютÑÑ/ÑкрываютÑÑ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ðµ принтеры\n"
-#~ " --[no-]share-printers ВключаетÑÑ/отключаетÑÑ ÑовмеÑтное "
-#~ "иÑпользование принтеров\n"
-#~ " --[no-]user-cancel-any ПользователÑм разрешаетÑÑ/запрещаетÑÑ "
-#~ "отменÑÑ‚ÑŒ заданиÑ\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 ""
-#~ "СинтакÑиÑ: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
-#~ "\n"
-#~ "-c config-file ЗагружаетÑÑ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ð¹ файл конфигурации\n"
-#~ "-f Задание имеет выÑокий приоритет\n"
-#~ "-F Задание имеет выÑокий приоритет и выделÑетÑÑ\n"
-#~ "-h ОтображаетÑÑ Ð´Ð°Ð½Ð½Ð¾Ðµ Ñообщение\n"
-#~ "-l cupsd запуÑкаетÑÑ Ð¸Ð· launchd(8)\n"
-
-#~ msgid ""
-#~ "Usage: cupsfilter -m mime/type [ options ] filename\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ " -c cupsd.conf Set cupsd.conf file to use\n"
-#~ " -e Use every filter from the PPD file\n"
-#~ " -j job-id[,N] Filter file N from the specified job (default is file "
-#~ "1)\n"
-#~ " -n copies Set number of copies\n"
-#~ " -o name=value Set option(s)\n"
-#~ " -p filename.ppd Set PPD file\n"
-#~ " -t title Set title\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: cupsfilter -m mime/type [ options ] filename\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ " -c cupsd.conf ИÑпользуетÑÑ Ñ„Ð°Ð¹Ð» cupsd.conf\n"
-#~ " -j job-id[,N] Из указанного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±Ð¸Ñ€Ð°ÐµÑ‚ÑÑ Ñ„Ð°Ð¹Ð» N (по умолчанию "
-#~ "файл 1)\n"
-#~ " -n copies ЗадаетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво копий\n"
-#~ " -o name=value ЗадаютÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹\n"
-#~ " -p filename.ppd ЗадаетÑÑ PPD-файл\n"
-#~ " -t title ЗадаетÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº\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 ""
-#~ "СинтакÑиÑ: cupstestdsc [options] filename.ps [... filename.ps]\n"
-#~ " cupstestdsc [options] -\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ " -h ОтображаетÑÑ Ñправка по иÑпользованию программы\n"
-#~ "\n"
-#~ " Примечание: Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° проверÑет только комментарии DSC, а не "
-#~ "Ñам PostScript.\n"
-
-#~ msgid ""
-#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
-#~ " program | cupstestppd [options] -\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ " -I {filename,filters,none,profiles}\n"
-#~ " Ignore specific warnings\n"
-#~ " -R root-directory Set alternate root\n"
-#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
-#~ "translations}\n"
-#~ " Issue warnings instead of errors\n"
-#~ " -q Run silently\n"
-#~ " -r Use 'relaxed' open mode\n"
-#~ " -v Be slightly verbose\n"
-#~ " -vv Be very verbose\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[."
-#~ "gz]]\n"
-#~ " program | cupstestppd [options] -\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ " -R root-directory ЗадаетÑÑ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ð¹ корневой каталог\n"
-#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n"
-#~ " ВмеÑто ошибок выдаютÑÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ\n"
-#~ " -q Команда выполнÑетÑÑ Ð² «тихом» режиме\n"
-#~ " -r ИÑпользуетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¹ режим\n"
-#~ " -v Режим более подробного отображениÑ\n"
-#~ " -vv Режим макÑимально подробного отображениÑ\n"
-
-#~ msgid ""
-#~ "Usage: ipptest [options] URI filename.test [ ... filenameN.test ]\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "-E Test with encryption.\n"
-#~ "-V version Set default IPP version.\n"
-#~ "-X Produce XML instead of plain text.\n"
-#~ "-c Send requests using chunking (default)\n"
-#~ "-d name=value Define variable.\n"
-#~ "-f filename Set default test file.\n"
-#~ "-i seconds Repeat the last test file with the given interval.\n"
-#~ "-l Send requests using content-length\n"
-#~ "-v Show all attributes sent and received.\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: ipptest [options] URI filename.test [ ... filenameN.test ]\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "-E\t\tТеÑÑ‚ Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼.\n"
-#~ "-V version\tЗадаетÑÑ ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ IPP.\n"
-#~ "-X\t\tСоздание XML вмеÑто обычного текÑта.\n"
-#~ "-c\t\tПередача запроÑа Ñ Ð¸Ñпользованием chunking (по умолчанию)-d "
-#~ "name=value\tОпределение переменной.\n"
-#~ "-f filename\tСоздание Ñтандартного теÑÑ‚-файла.\n"
-#~ "-i seconds\tПовторение поÑледнего теÑÑ‚-файла Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ интервалом.\n"
-#~ "-l\t\tПередача запроÑа Ñ Ð¸Ñпользованием content-length.\n"
-#~ "-v\t\tПоказать вÑе атрибуты отправленных и полученных.\n"
-
-#~ msgid "Usage: lpmove job/src dest\n"
-#~ msgstr "СинтакÑиÑ: lpmove job/src dest\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 ""
-#~ "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"
-
-#~ msgid "Usage: lppasswd [-g groupname]\n"
-#~ msgstr "СинтакÑиÑ: lppasswd [-g groupname]\n"
-
-#~ msgid ""
-#~ "Usage: lppasswd [-g groupname] [username]\n"
-#~ " lppasswd [-g groupname] -a [username]\n"
-#~ " lppasswd [-g groupname] -x [username]\n"
-#~ msgstr ""
-#~ "{>СинтакÑиÑ: lppasswd [-g groupname] [username]\n"
-#~ " lppasswd [-g groupname] -a [username]\n"
-#~ " lppasswd [-g groupname] -x [username]\n"
-
-#~ msgid ""
-#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] "
-#~ "[+interval]\n"
-
-#~ msgid ""
-#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
-#~ "Options:\n"
-#~ " -D name=value Set named variable to value.\n"
-#~ " -I include-dir Add include directory to search path.\n"
-#~ " -c catalog.po Load the specified message catalog.\n"
-#~ " -d output-dir Specify the output directory.\n"
-#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n"
-#~ " -m Use the ModelName value as the filename.\n"
-#~ " -t Test PPDs instead of generating them.\n"
-#~ " -v Be verbose (more v's for more verbosity).\n"
-#~ " -z Compress PPD files using GNU zip.\n"
-#~ " --cr End lines with CR (Mac OS 9).\n"
-#~ " --crlf End lines with CR + LF (Windows).\n"
-#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
-#~ "Параметры:\n"
-#~ " -D name=value Указанной переменной приÑваиваетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ.\n"
-#~ " -I include-dir ДобавлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³ в путь поиÑка.\n"
-#~ " -c catalog.po ЗагружаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¹ каталог Ñообщений.\n"
-#~ " -d output-dir УказываетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³ Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… данных.\n"
-#~ " -l lang[,lang,...] УказываетÑÑ Ñзык (регион) Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… данных.\n"
-#~ " -m Ð’ качеÑтве имени файла иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ "
-#~ "ModelName.\n"
-#~ " -t ВмеÑто ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ PPD-файлов выполнÑетÑÑ Ð¸Ñ… "
-#~ "проверка.\n"
-#~ " -v Режим подробного Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (чем больше букв v, "
-#~ "тем выше уровень детализации).\n"
-#~ " -z Файлы PPD ÑжимаютÑÑ Ñ Ð¸Ñпользованием GNU zip.\n"
-#~ " --cr Строки заканчиваютÑÑ Ð½Ð° CR (Mac OS 9).\n"
-#~ " --crlf Строки заканчиваютÑÑ Ð½Ð° CR + LF (Windows).\n"
-#~ " --lf Строки заканчиваютÑÑ Ð½Ð° LF (UNIX/Linux/Mac OS X).\n"
-
-#~ msgid ""
-#~ "Usage: ppdhtml [options] filename.drv >filename.html\n"
-#~ " -D name=value Set named variable to value.\n"
-#~ "Options:\n"
-#~ " -I include-dir Add include directory to search path.\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: ppdhtml [options] filename.drv >filename.html\n"
-#~ " -D name=value Указанной переменной приÑваиваетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ.\n"
-#~ "Параметры:\n"
-#~ " -I include-dir ДобавлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³ в путь поиÑка.\n"
-
-#~ msgid ""
-#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Options:\n"
-#~ " -I include-dir\n"
-#~ " -o filename.drv\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Параметры:\n"
-#~ " -I include-dir\n"
-#~ " -o filename.drv\n"
-
-#~ msgid ""
-#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Options:\n"
-#~ " -o filename.ppd[.gz]\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Параметры:\n"
-#~ " -o filename.ppd[.gz]\n"
-
-#~ msgid ""
-#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n"
-#~ "Options:\n"
-#~ " -D name=value Set named variable to value.\n"
-#~ " -I include-dir Add include directory to search path.\n"
-#~ " -v Be verbose (more v's for more verbosity).\n"
-#~ msgstr ""
-#~ "СинтакÑиÑ: ppdpo [options] -o filename.po filename.drv [ ... filenameN."
-#~ "drv ]\n"
-#~ "Параметры:\n"
-#~ " -D name=value Указанной переменной приÑваиваетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ.\n"
-#~ " -I include-dir ДобавлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³ в путь поиÑка.\n"
-#~ " -v Подробный режим (чем больше букв v, тем выше уровень "
-#~ "детализации).\n"
-
-#~ msgid "Usage: snmp [host-or-ip-address]\n"
-#~ msgstr "СинтакÑиÑ: snmp [host-or-ip-address]\n"
-
-#~ msgid "WARNING: Adding only the first %d printers found"
-#~ msgstr "WARNING: Будут добавлены только первые найденные принтеры (%d)"
-
-#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n"
-#~ msgstr "WARNING: Параметр waiteof «%s» должен иметь булево значение\n"
-
-#~ msgid "WARNING: Network host '%s' is busy; will retry in %d seconds...\n"
-#~ msgstr ""
-#~ "WARNING: Сетевой узел '%s' занÑÑ‚; повторить попытку через %d Ñекунд...\n"
-
-#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature\n"
-#~ msgstr ""
-#~ "WARNING: Параметр \"%s\" не может быть добавлен через IncludeFeature\n"
-
-#~ msgid "WARNING: Printer not responding\n"
-#~ msgstr "WARNING: Принтер не отвечает\n"
-
-#~ msgid "WARNING: Printer sent unexpected EOF\n"
-#~ msgstr "WARNING: Принтер преждевременно передал индикатор EOF\n"
-
-#~ msgid ""
-#~ "WARNING: Remote host did not respond with command status byte after %d "
-#~ "seconds\n"
-#~ msgstr ""
-#~ "WARNING: Удаленный хоÑÑ‚ не отвечает на команду в течение %d Ñекунд\n"
-
-#~ msgid ""
-#~ "WARNING: Remote host did not respond with control status byte after %d "
-#~ "seconds\n"
-#~ msgstr ""
-#~ "WARNING: Удаленный хоÑÑ‚ не отвечает на управлÑющую поÑледовательноÑÑ‚ÑŒ в "
-#~ "течение %d Ñекунд\n"
-
-#~ msgid ""
-#~ "WARNING: Remote host did not respond with data status byte after %d "
-#~ "seconds\n"
-#~ msgstr ""
-#~ "WARNING: Удаленный хоÑÑ‚ не отвечает при передачи данных в течение %d "
-#~ "Ñекунд\n"
-
-#~ msgid ""
-#~ "WARNING: This document does not conform to the Adobe Document Structuring "
-#~ "Conventions and may not print correctly\n"
-#~ msgstr ""
-#~ "WARNING: Этот документ не ÑоответÑтвует Adobe Document Structuring "
-#~ "Conventions и может быть напечатан неправильно\n"
-
-#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n"
-#~ msgstr "WARNING: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ «%s:%s»: %s\n"
-
-#~ msgid "WARNING: Unable to send PAP status request"
-#~ msgstr "WARNING: Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑтатуÑа PAP"
-
-#~ msgid "WARNING: Unexpected PAP packet of type %d\n"
-#~ msgstr "WARNING: Ðепредвиденный PAP-пакет типа %d\n"
-
-#~ msgid "WARNING: Unknown PAP packet of type %d\n"
-#~ msgstr "WARNING: ÐеизвеÑтный PAP-пакет типа %d\n"
-
-#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"\n"
-#~ msgstr "WARNING: ÐеизвеÑтный выбор \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"\n"
-
-#~ msgid "WARNING: Unknown option \"%s\"\n"
-#~ msgstr "WARNING: ÐеизвеÑтный параметр \"%s\"\n"
-
-#~ msgid "WARNING: Unsupported baud rate %s\n"
-#~ msgstr "WARNING: ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÑкороÑÑ‚ÑŒ передачи данных в бодах %s\n"
-
-#~ msgid "WARNING: number expected for status option \"%s\"\n"
-#~ msgstr "WARNING: Параметр ÑтатуÑа «%s» должен иметь чиÑловое значение\n"
-
-#~ msgid "Warning, no Windows 2000 printer drivers are installed"
-#~ msgstr "WARNING: Драйверы принтера Windows 2000 не уÑтановлены"
-
-#~ msgid "You4 Envelope"
-#~ msgstr "Конверт You4"
-
-#~ msgid "convert: Use the -f option to specify a file to convert.\n"
-#~ msgstr ""
-#~ "convert: ИÑпользуйте параметр -f Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€ÑƒÐµÐ¼Ð¾Ð³Ð¾ файла.\n"
-
-#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n"
-#~ msgstr "cupsaddsmb: Ðет PPD-файла Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° «%s» – %s\n"
-
-#~ msgid "cupsctl: Unable to connect to server: %s\n"
-#~ msgstr "cupsctl: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу: %s\n"
-
-#~ msgid "cupsctl: Unknown option \"%s\"\n"
-#~ msgstr "cupsctl: ÐеизвеÑтный параметр \"%s\"\n"
-
-#~ msgid "cupsctl: Unknown option \"-%c\"\n"
-#~ msgstr "cupsctl: ÐеизвеÑтный параметр \"-%c\"\n"
-
-#~ msgid "cupsd: Expected config filename after \"-c\" option\n"
-#~ msgstr "cupsd: Ожидаемое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации поÑле параметра \"-Ñ\"\n"
-
-#~ msgid "cupsd: Unable to get current directory\n"
-#~ msgstr "cupsd: Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ текущий каталог\n"
-
-#~ msgid "cupsd: Unknown argument \"%s\" - aborting\n"
-#~ msgstr "cupsd: ÐеизвеÑтный аргумент \"%s\" - отмена\n"
-
-#~ msgid "cupsd: Unknown option \"%c\" - aborting\n"
-#~ msgstr "cupsd: ÐеизвеÑтный параметр \"%c\" - отмена\n"
-
-#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
-#~ msgstr ""
-#~ "cupsd: Поддержка launchd(8) не Ñкомпилирована, работа в нормальном "
-#~ "режиме.\n"
-
-#~ msgid "cupsfilter: Invalid document number %d\n"
-#~ msgstr "cupsfilter: ÐедопуÑтимый номер документа %d\n"
-
-#~ msgid "cupsfilter: Invalid job ID %d\n"
-#~ msgstr "cupsfilter: ÐедопуÑтимый ID Ð·Ð°Ð´Ð°Ð½Ð¸Ñ %d\n"
-
-#~ msgid "cupsfilter: Only one filename can be specified\n"
-#~ msgstr "cupsfilter: Может быть указано только одно Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°\n"
-
-#~ msgid "cupsfilter: Unable to get job file - %s\n"
-#~ msgstr "cupsfilter: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ - %s\n"
-
-#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n"
-#~ msgstr "cupstestppd: Параметр «-q» неÑовмеÑтим Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ «-v».\n"
-
-#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n"
-#~ msgstr "cupstestppd: Параметр «-v» неÑовмеÑтим Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ «-q».\n"
-
-#~ msgid "device for %s/%s: %s\n"
-#~ msgstr "уÑтройÑтво Ð´Ð»Ñ %s/%s: %s\n"
-
-#~ msgid "device for %s: %s\n"
-#~ msgstr "уÑтройÑтво Ð´Ð»Ñ %s: %s\n"
-
-#~ msgid "help\t\tget help on commands\n"
-#~ msgstr "Ñправка\t\tполучить Ñправку о командах\n"
-
-#~ msgid "ipptest: \"-i\" is incompatible with \"-x\".\n"
-#~ msgstr "ipptest: \"-i\" неÑовмеÑтимо Ñ \"-x\".\n"
-
-#~ msgid "ipptest: Bad URI - %s.\n"
-#~ msgstr "ipptest: Ðеверный URI - %s.\n"
-
-#~ msgid "ipptest: Bad version %s for \"-V\".\n"
-#~ msgstr "ipptest: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s Ð´Ð»Ñ \"-V\".\n"
-
-#~ msgid "ipptest: May only specify a single URI.\n"
-#~ msgstr "ipptest: Может быть определен лишь один URI.\n"
-
-#~ msgid "ipptest: Missing filename for \"-f\".\n"
-#~ msgstr "ipptest: Ðе определено Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ \"-f\".\n"
-
-#~ msgid "ipptest: Missing name=value for \"-d\".\n"
-#~ msgstr "ipptest: Ðе определено name=value Ð´Ð»Ñ \"-d\".\n"
-
-#~ msgid "ipptest: Missing seconds for \"-i\".\n"
-#~ msgstr "ipptest: Ðе указаны Ñекунды Ð´Ð»Ñ \"-i\".\n"
-
-#~ msgid "ipptest: Missing version for \"-V\".\n"
-#~ msgstr "ipptest: Ðе определена верÑÐ¸Ñ Ð´Ð»Ñ \"-V\".\n"
-
-#~ msgid "ipptest: Only http, https, and ipp URIs are supported."
-#~ msgstr "ipptest: ПоддерживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ http, https и ipp URI."
-
-#~ msgid "ipptest: URI required before test file."
-#~ msgstr "ipptest: Ðеобходим URI перед указанием теÑÑ‚-файла."
-
-#~ msgid "ipptest: Unknown option \"-%c\".\n"
-#~ msgstr "ipptest: ÐеизвеÑтный параметр \"-%c\".\n"
-
-#~ msgid "job-printer-uri attribute missing"
-#~ msgstr "Ðтрибут job-printer-uri отÑутÑтвует."
-
-#~ msgid "lpadmin: Class name can only contain printable characters\n"
-#~ msgstr "lpadmin: Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа может Ñодержать только печатные Ñимволы\n"
-
-#~ msgid "lpadmin: Expected PPD after '-P' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-P' должен быть указан PPD\n"
-
-#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option\n"
-#~ msgstr ""
-#~ "lpadmin: ПоÑле параметра '-u' должен быть указан allow/deny:userlist.\n"
-
-#~ msgid "lpadmin: Expected class after '-r' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-r' должно быть указано Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа\n"
-
-#~ msgid "lpadmin: Expected class name after '-c' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-c' должно быть указано Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹\n"
-
-#~ msgid "lpadmin: Expected description after '-D' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-D' должно быть указано опиÑание\n"
-
-#~ msgid "lpadmin: Expected device URI after '-v' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-v' должно быть указано URI\n"
-
-#~ msgid "lpadmin: Expected file type(s) after '-I' option\n"
-#~ msgstr ""
-#~ "lpadmin: ПоÑле параметра '-I' должен(-ны) быть указан(-Ñ‹) тип(-Ñ‹) файла(-"
-#~ "ов)\n"
-
-#~ msgid "lpadmin: Expected hostname after '-h' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-h' должно быть указано Ð¸Ð¼Ñ Ñ…Ð¾Ñта\n"
-
-#~ msgid "lpadmin: Expected interface after '-i' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-i' должен быть указан интерфейÑ.\n"
-
-#~ msgid "lpadmin: Expected location after '-L' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-L' должно быть указано меÑтоположение\n"
-
-#~ msgid "lpadmin: Expected model after '-m' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-m'должна быть указана модель\n"
-
-#~ msgid "lpadmin: Expected name=value after '-o' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-o' должно быть указано name=value\n"
-
-#~ msgid "lpadmin: Expected printer after '-p' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-p' должен быть указан принтер\n"
-
-#~ msgid "lpadmin: Expected printer name after '-d' option\n"
-#~ msgstr "lpadmin: ПоÑле параметра '-d' должно быть указано Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid "lpadmin: Expected printer or class after '-x' option\n"
-#~ msgstr ""
-#~ "lpadmin: ПоÑле параметра '-x' должен быть указан принтер или клаÑÑ\n"
-
-#~ msgid "lpadmin: No member names were seen\n"
-#~ msgstr "lpadmin: Имена пользователей не были найдены\n"
-
-#~ msgid "lpadmin: Printer %s is already a member of class %s.\n"
-#~ msgstr "lpadmin: Принтер %s уже ÑвлÑетÑÑ Ñ‡Ð»ÐµÐ½Ð¾Ð¼ клаÑÑа %s.\n"
-
-#~ msgid "lpadmin: Printer %s is not a member of class %s.\n"
-#~ msgstr "lpadmin: Принтер %s не ÑвлÑетÑÑ Ñ‡Ð»ÐµÐ½Ð¾Ð¼ клаÑÑа %s.\n"
-
-#~ msgid "lpadmin: Printer name can only contain printable characters\n"
-#~ msgstr "lpadmin: Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° может Ñодержать только печатные принтеры\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to add a printer to the class:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ принтер в клаÑÑ:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid "lpadmin: Unable to connect to server: %s\n"
-#~ msgstr "lpadmin: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу: %s\n"
-
-#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n"
-#~ msgstr "lpadmin: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD-файл «%s» – %s\n"
-
-#~ msgid "lpadmin: Unable to open file \"%s\": %s\n"
-#~ msgstr "lpadmin: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл «%s»: %s\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to remove a printer from the class:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ принтер из клаÑÑа:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the PPD file:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ Ð½Ð°Ñтроить PPD-файл:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the device URI:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: не удаетÑÑ Ð½Ð°Ñтроить URI уÑтройÑтва:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the interface script or PPD file:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ Ð½Ð°Ñтроить Ñкрипт интерфейÑа или PPD-файл:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the interface script:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: не удаетÑÑ Ð½Ð°Ñтроить Ñкрипт интерфейÑа:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the printer description:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ Ð½Ð°Ñтроить опиÑание принтера:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the printer location:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ Ð½Ð°Ñтроить размещение принтера:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the printer options:\n"
-#~ " You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Ðе удаетÑÑ Ð½Ð°Ñтроить параметры принтера:\n"
-#~ "\t Ðеобходимо Ñначала указать Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°\n"
-
-#~ msgid "lpadmin: Unknown allow/deny option \"%s\"\n"
-#~ msgstr "lpadmin: ÐеизвеÑтный параметр allow/deny \"%s\"\n"
-
-#~ msgid "lpadmin: Unknown argument '%s'\n"
-#~ msgstr "lpadmin: ÐеизвеÑтный аргумент '%s'\n"
-
-#~ msgid "lpadmin: Unknown option '%c'\n"
-#~ msgstr "lpadmin: ÐеизвеÑтный параметр '%c'\n"
-
-#~ msgid "lpadmin: Warning - content type list ignored\n"
-#~ msgstr "lpadmin: Warning - ÑпиÑок типов контента пропущен\n"
-
-#~ msgid "lpinfo: Expected 1284 device ID string after --device-id\n"
-#~ msgstr "lpinfo: ПоÑле --device-id должна идти Ñтрока ID уÑтройÑтва 1284\n"
-
-#~ msgid "lpinfo: Expected language after --language\n"
-#~ msgstr "lpinfo: ПоÑле --language необходимо указать Ñзык\n"
-
-#~ msgid "lpinfo: Expected make and model after --make-and-model\n"
-#~ msgstr "lpinfo: ПоÑле --make-and-model должна быть указана марка и модель\n"
-
-#~ msgid "lpinfo: Expected product string after --product\n"
-#~ msgstr "lpinfo: ПоÑле --product должна идти Ñтрока продукта\n"
-
-#~ msgid "lpinfo: Expected scheme list after --exclude-schemes\n"
-#~ msgstr "lpinfo: ПоÑле --exclude-schemes должен идти ÑпиÑок Ñхем\n"
-
-#~ msgid "lpinfo: Expected scheme list after --include-schemes\n"
-#~ msgstr "lpinfo: ПоÑле --include-schemes должен идти ÑпиÑок Ñхем\n"
-
-#~ msgid "lpinfo: Expected timeout after --timeout\n"
-#~ msgstr "lpinfo: ПоÑле --timeout должно быть указано Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ\n"
-
-#~ msgid "lpinfo: Unknown argument '%s'\n"
-#~ msgstr "lpinfo: ÐеизвеÑтный аргумент '%s'\n"
-
-#~ msgid "lpinfo: Unknown option '%c'\n"
-#~ msgstr "lpinfo: ÐеизвеÑтный параметр '%c'\n"
-
-#~ msgid "lpinfo: Unknown option '%s'\n"
-#~ msgstr "lpinfo: ÐеизвеÑтный параметр '%s'\n"
-
-#~ msgid "lpmove: Unable to connect to server: %s\n"
-#~ msgstr "lpmove: Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу: %s\n"
-
-#~ msgid "lpmove: Unknown argument '%s'\n"
-#~ msgstr "lpmove: ÐеизвеÑтный аргумент '%s'\n"
-
-#~ msgid "lpmove: Unknown option '%c'\n"
-#~ msgstr "lpmove: ÐеизвеÑтный параметр '%c'\n"
-
-#~ msgid "lpoptions: No printers\n"
-#~ msgstr "lpoptions: Ðет принтеров?!\n"
-
-#~ msgid "lpoptions: Unable to add printer or instance: %s\n"
-#~ msgstr ""
-#~ "lpoptions: Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ принтер или предÑÑ‚Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ ÐºÐ»Ð°ÑÑа: %s\n"
-
-#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n"
-#~ msgstr "lpoptions: Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ PPD-файл Ð´Ð»Ñ %s: %s\n"
-
-#~ msgid "lpoptions: Unable to open PPD file for %s\n"
-#~ msgstr "lpoptions: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ PPD файл Ð´Ð»Ñ %s\n"
-
-#~ msgid "lpoptions: Unknown printer or class\n"
-#~ msgstr "lpoptions: ÐеизвеÑтный принтер или клаÑÑ\n"
-
-#~ msgid "lppasswd: Only root can add or delete passwords\n"
-#~ msgstr ""
-#~ "lppasswd: Только пользователь root может добавлÑÑ‚ÑŒ или удалÑÑ‚ÑŒ пароли\n"
-
-#~ msgid "lppasswd: Password file busy\n"
-#~ msgstr "lppasswd: Файл Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð·Ð°Ð½ÑÑ‚\n"
-
-#~ msgid "lppasswd: Password file not updated\n"
-#~ msgstr "lppasswd: Файл Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ обновлен"
-
-#~ msgid "lppasswd: Sorry, password doesn't match\n"
-#~ msgstr "lppasswd: Пароль не вÑтретилÑÑ\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: Пароль отклонен.\n"
-#~ "Пароль должен ÑоÑтоÑÑ‚ÑŒ как минимум из 6 Ñимволов, не может Ñодержать\n"
-#~ "Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ должен Ñодержать по крайней мере одну букву и "
-#~ "цифру.\n"
-
-#~ msgid "lppasswd: Sorry, passwords don't match\n"
-#~ msgstr "lppasswd: Пароль не вÑтретилÑÑ\n"
-
-#~ msgid "lppasswd: Unable to copy password string: %s\n"
-#~ msgstr "lppasswd: Ðе удаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñтроку паролÑ: %s\n"
-
-#~ msgid "lppasswd: Unable to open password file: %s\n"
-#~ msgstr "lppasswd: Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл паролÑ: %s\n"
-
-#~ msgid "lppasswd: Unable to write to password file: %s\n"
-#~ msgstr "lppasswd: Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать файл паролÑ: %s\n"
-
-#~ msgid "lppasswd: failed to backup old password file: %s\n"
-#~ msgstr "lppasswd: Ðе удалоÑÑŒ Ñоздать рез. копию Ñтарого файла паролÑ: %s\n"
-
-#~ msgid "lppasswd: failed to rename password file: %s\n"
-#~ msgstr "lppasswd: Ðе удалоÑÑŒ переименовать файл паролÑ: %s\n"
-
-#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
-#~ msgstr "lppasswd: Пользователь «%s» и группа «%s» не ÑущеÑтвуют.\n"
-
-#~ msgid ""
-#~ "lpstat: error - %s environment variable names non-existent destination "
-#~ "\"%s\"\n"
-#~ msgstr ""
-#~ "lpstat: ошибка - %s Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ неÑущеÑтвующее "
-#~ "назначение \"%s\"\n"
-
-#~ msgid "members of class %s:\n"
-#~ msgstr "члены клаÑÑа %s:\n"
-
-#~ msgid "no entries\n"
-#~ msgstr "нет запиÑей\n"
-
-#~ msgid "no system default destination\n"
-#~ msgstr "нет Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑиÑтемы по умолчанию\n"
-
-#~ msgid "notify-events not specified"
-#~ msgstr "notify-events не указаны"
-
-#~ msgid "notify-recipient-uri URI \"%s\" is already used"
-#~ msgstr "notify-recipient-uri URI \"%s\" уже иÑпользуетÑÑ"
-
-#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme"
-#~ msgstr "notify-recipient-uri URI \"%s\" иÑпользует неизвеÑтную Ñхему"
-
-#~ msgid "notify-subscription-id %d no good"
-#~ msgstr "Ðеверный notify-subscription-id %d"
-
-#~ msgid "ppdc: Adding include directory \"%s\"...\n"
-#~ msgstr "ppdc: ДобавлÑÑŽ каталог «%s»...\n"
-
-#~ msgid "ppdc: Adding/updating UI text from %s...\n"
-#~ msgstr "ppdc: ДобавлÑÑŽ/обновлÑÑŽ текÑÑ‚ интерфейÑа из %s...\n"
-
-#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n"
-#~ msgstr "ppdc: ÐедопуÑтимое булево значение (%s) в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: ÐедопуÑтимое Ð¸Ð¼Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ \"%s\" в Ñтроке %d bp %s.\n"
-
-#~ msgid "ppdc: Bad status keyword %s on line %d of %s\n"
-#~ msgstr "ppdc: ÐедопуÑтимое ключевое Ñлово ÑтатуÑа %s в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n"
-#~ msgstr "ppdc: ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð·Ð°Ð¼ÐµÐ½Ð° переменной ($%c) в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Choice found on line %d of %s with no Option\n"
-#~ msgstr ""
-#~ "ppdc: Ð’ Ñтроке %d из %s обнаружено значение, не привÑзанное к параметру\n"
-
-#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s\n"
-#~ msgstr "ppdc: Дубликат #po Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° %s в Ñтроке %d из %s\n"
-
-#~ msgid "ppdc: Expected a filter definition on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть определение фильтра\n"
-
-#~ msgid "ppdc: Expected a program name on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹\n"
-
-#~ msgid "ppdc: Expected boolean value on line %d of %s.\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть булево значение.\n"
-
-#~ msgid "ppdc: Expected charset after Font on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле Font в Ñтроке %d из %s должен быть указан набор Ñимволов.\n"
-
-#~ msgid "ppdc: Expected choice code on line %d of %s.\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должен быть код выбора.\n"
-
-#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть имÑ/текÑÑ‚ выбора.\n"
-
-#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле ColorModel в Ñтроке %d из %s должна быть указана Ñ†Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ "
-#~ "Ñхема\n"
-
-#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Ð”Ð»Ñ ColorModel в Ñтроке %d из %s должно быть указано проÑтранÑтво "
-#~ "цветов.\n"
-
-#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Ð”Ð»Ñ ColorModel в Ñтроке %d из %s должно быть указано Ñжатие.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Ð”Ð»Ñ UIConstraints в Ñтроке %d из %s должна быть указана Ñтрока "
-#~ "ограничений\n"
-
-#~ msgid ""
-#~ "ppdc: Expected driver type keyword following DriverType on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле DriverType в Ñтроке %d из %s должно быть указано ключевое "
-#~ "Ñлово типа драйвера.\n"
-
-#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле Duplex в Ñтроке %d из %s должен быть указан тип дуплекÑа.\n"
-
-#~ msgid "ppdc: Expected encoding after Font on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должна быть указана кодировка.\n"
-
-#~ msgid "ppdc: Expected filename after #po %s on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле #po %s в Ñтроке %d из %s должно быть указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°.\n"
-
-#~ msgid "ppdc: Expected group name/text on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть указанно Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹/текÑÑ‚.\n"
-
-#~ msgid "ppdc: Expected include filename on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°.\n"
-
-#~ msgid "ppdc: Expected integer on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть целое чиÑло.\n"
-
-#~ msgid "ppdc: Expected locale after #po on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле #po в Ñтроке %d из %s должен быть указан регион.\n"
-
-#~ msgid "ppdc: Expected name after %s on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name after FileName on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле FileName в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name after Font on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле Manufacturer в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name after MediaSize on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле MediaSize в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name after ModelName on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле ModelName в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name after PCFileName on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле PCFileName в Ñтроке %d из %s должно быть указано имÑ.\n"
-
-#~ msgid "ppdc: Expected name/text after %s on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚.\n"
-
-#~ msgid "ppdc: Expected name/text after Installable on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле Installable в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚.\n"
-
-#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле Resolution в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле ColorModel в Ñтроке %d из %s должно быть указано имÑ/текÑÑ‚.\n"
-
-#~ msgid "ppdc: Expected option name/text on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть указано Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°/текÑÑ‚.\n"
-
-#~ msgid "ppdc: Expected option section on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должен быть указан раздел параметров.\n"
-
-#~ msgid "ppdc: Expected option type on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должен быть указан тип параметра.\n"
-
-#~ msgid "ppdc: Expected override field after Resolution on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле Resolution в Ñтроке %d из %s должно быть поле "
-#~ "переопределениÑ.\n"
-
-#~ msgid "ppdc: Expected real number on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должно быть дейÑтвительное чиÑло.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of "
-#~ "%s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле ColorProfile в Ñтроке %d из %s должно быть указано разрешение/"
-#~ "тип ноÑителÑ.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line "
-#~ "%d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ПоÑле SimpleColorProfile в Ñтроке %d из %s должно быть указано "
-#~ "разрешение/тип ноÑителÑ.\n"
-
-#~ msgid "ppdc: Expected selector after %s on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должен быть Ñелектор.\n"
-
-#~ msgid "ppdc: Expected status after Font on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле Font в Ñтроке %d из %s должен быть указан ÑтатуÑ.\n"
-
-#~ msgid "ppdc: Expected string after Copyright on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s пропущено значение параметра Copyright.\n"
-
-#~ msgid "ppdc: Expected string after Version on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s пропущено значение параметра Version.\n"
-
-#~ msgid "ppdc: Expected two option names on line %d of %s\n"
-#~ msgstr "ppdc: Ð’ Ñтроке %d из %s должны быть два имени параметра.\n"
-
-#~ msgid "ppdc: Expected value after %s on line %d of %s\n"
-#~ msgstr "ppdc: ПоÑле %s в Ñтроке %d из %s должно быть значение.\n"
-
-#~ msgid "ppdc: Expected version after Font on line %d of %s\n"
-#~ msgstr "ppdc: поÑле Font в Ñтроке %d из %s должна быть указана верÑиÑ.\n"
-
-#~ msgid "ppdc: Invalid #include/#po filename \"%s\"\n"
-#~ msgstr "ppdc: Ðеверное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° #include/#po \"%s\"\n"
-
-#~ msgid "ppdc: Invalid cost for filter on line %d of %s\n"
-#~ msgstr "ppdc: Затраты на фильтр в Ñтроке %d из %s указаны неверно.\n"
-
-#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s\n"
-#~ msgstr "ppdc: ÐедопуÑтимый пуÑтой MIME-тип Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ÐедопуÑтимое пуÑтое Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Ðеверный раздел параметров \"%s\" в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Ðеверный тип параметра \"%s\" в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Loading driver information file \"%s\"...\n"
-#~ msgstr "ppdc: Загружаю файл Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о драйвере «%s»...\n"
-
-#~ msgid "ppdc: Loading messages for locale \"%s\"...\n"
-#~ msgstr "ppdc: Загружаю ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° «%s»...\n"
-
-#~ msgid "ppdc: Loading messages from \"%s\"...\n"
-#~ msgstr "ppdc: Загружаю ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· «%s»...\n"
-
-#~ msgid "ppdc: Missing #endif at end of \"%s\"\n"
-#~ msgstr "ppdc: ОтÑутÑтвует #endif в конце \"%s\".\n"
-
-#~ msgid "ppdc: Missing #if on line %d of %s\n"
-#~ msgstr "ppdc: ОтÑутÑтвует #if в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: No message catalog provided for locale %s\n"
-#~ msgstr "ppdc: Ðе указан каталог Ñообщений Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° %s.\n"
-
-#~ msgid "ppdc: Option %s defined in two different groups on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Параметр %s определен в двух разных группах в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s\n"
-#~ msgstr "ppdc: Ð”Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s определен другой тип в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Option constraint must *name on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Ð”Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° должно быть указано *name в Ñтроке %d из "
-#~ "%s.\n"
-
-#~ msgid "ppdc: Too many nested #if's on line %d of %s\n"
-#~ msgstr "ppdc: Слишком много вложенных операторов #if в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n"
-#~ msgstr "lpadmin: Ðе удаетÑÑ Ñоздать PPD-файл «%s» – %s\n"
-
-#~ msgid "ppdc: Unable to create output directory %s: %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ñоздать каталог Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… данных %s: %s\n"
-
-#~ msgid "ppdc: Unable to create output pipes: %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ñоздать конвейеры Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… данных: %s\n"
-
-#~ msgid "ppdc: Unable to execute cupstestppd: %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ cupstestppd: %s\n"
-
-#~ msgid "ppdc: Unable to find #po file %s on line %d of %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл #po %s в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл \"%s\" в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ локализацию Ð´Ð»Ñ Â«%s» - %s\n"
-
-#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n"
-#~ msgstr "ppdc: Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ файл локализации «%s» - %s\n"
-
-#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n"
-#~ msgstr "ppdc: Ðе определена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ (%s) в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown driver type %s on line %d of %s\n"
-#~ msgstr "ppdc: ÐеизвеÑтный тип драйвера %s в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: ÐеизвеÑтный тип дуплекÑа \"%s\" в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: ÐеизвеÑтный размер ноÑÐ¸Ñ‚ÐµÐ»Ñ \"%s\" в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s\n"
-#~ msgstr "ppdc: ÐеизвеÑтный маркер \"%s\" в Ñтроке %d из %s.\n"
-
-#~ msgid ""
-#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: ÐеизвеÑтные конечные Ñимволы в вещеÑтвенном чиÑле \"%s\" в Ñтроке "
-#~ "%d из %s.\n"
-
-#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s\n"
-#~ msgstr "ppdc: Ðе завершена Ñтрока, начинающаÑÑÑ Ñ %c в Ñтроке %d из %s.\n"
-
-#~ msgid "ppdc: Warning - overlapping filename \"%s\".\n"
-#~ msgstr "ppdc: Внимание - дублирующееÑÑ Ð¸Ð¼Ñ \"%s\".\n"
-
-#~ msgid "ppdc: Writing %s...\n"
-#~ msgstr "ppdc: ЗапиÑываю %s...\n"
-
-#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n"
-#~ msgstr "ppdc: ЗапиÑываю PPD-файлы в каталог «%s»...\n"
-
-#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s\n"
-#~ msgstr "ppdmerge: Ðеверное значение LanguageVersion \"%s\" в %s\n"
-
-#~ msgid "ppdmerge: Ignoring PPD file %s...\n"
-#~ msgstr "ppdmerge: ПропуÑкаю PPD-файл %s...\n"
-
-#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n"
-#~ msgstr "ppdmerge: Ðе удаетÑÑ Ñоздать резервную копию %s на %s- %s\n"
-
-#~ msgid "printer %s disabled since %s -\n"
-#~ msgstr "принтер %s отключен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -\n"
-
-#~ msgid "printer %s is idle. enabled since %s\n"
-#~ msgstr "принтер %s Ñвободен. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s\n"
-
-#~ msgid "printer %s now printing %s-%d. enabled since %s\n"
-#~ msgstr "принтер %s ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÐµÑ‚ %s-%d. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s\n"
-
-#~ msgid "printer %s/%s disabled since %s -\n"
-#~ msgstr "принтер %s/%s отключен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s -\n"
-
-#~ msgid "printer %s/%s is idle. enabled since %s\n"
-#~ msgstr "принтер %s/%s Ñвободен. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s\n"
-
-#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n"
-#~ msgstr "принтер %s/%s ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÐµÑ‚ %s-%d. Включен Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° %s\n"
-
-#~ msgid "request id is %s-%d (%d file(s))\n"
-#~ msgstr "id запроÑа %s-%d (%d файл.)\n"
-
-#~ msgid "scheduler is not running\n"
-#~ msgstr "планировщик не запущен\n"
-
-#~ msgid "scheduler is running\n"
-#~ msgstr "планировщик запущен\n"
-
-#~ msgid "status\t\tshow status of daemon and queue\n"
-#~ msgstr "ÑтатуÑ\t\tпоказать ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´ÐµÐ¼Ð¾Ð½Ð° и очереди\n"
-
-#~ msgid "system default destination: %s\n"
-#~ msgstr "назначение ÑиÑтемы по умолчанию: %s\n"
-
-#~ msgid "system default destination: %s/%s\n"
-#~ msgstr "назначение ÑиÑтемы по умолчанию: %s/%s\n"
+#~ "Ðтрибут '%s' Job Description не может быть подÑтавлен при ÑозданиизаданиÑ"
diff --git a/locale/po2strings.c b/locale/po2strings.c
index 22dd494..0bedd97 100644
--- a/locale/po2strings.c
+++ b/locale/po2strings.c
@@ -1,15 +1,15 @@
/*
- * "$Id: po2strings.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: po2strings.c 12794 2015-07-20 18:26:20Z msweet $"
*
- * Convert a GNU gettext .po file to an Apple .strings file.
+ * Convert a GNU gettext .po file to an Apple .strings file.
*
- * Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
* Usage:
*
@@ -18,10 +18,6 @@
* Compile with:
*
* gcc -o po2strings po2strings.c `cups-config --libs`
- *
- * Contents:
- *
- * main() - Convert .po file to .strings.
*/
#include <cups/cups-private.h>
@@ -53,6 +49,9 @@
* characters like newline and the double quote character.
*/
+static char *normalize_string(const char *idstr, char *buffer, size_t bufsize);
+
+
/*
* main() - Convert .po file to .strings.
*/
@@ -70,8 +69,9 @@ main(int argc, /* I - Number of command-line args */
*ptr, /* Pointer into buffer */
*temp, /* New string */
*msgid, /* msgid string */
- *msgstr; /* msgstr string */
- int length; /* Length of combined strings */
+ *msgstr, /* msgstr string */
+ normalized[8192];/* Normalized msgid string */
+ size_t length; /* Length of combined strings */
int use_msgid; /* Use msgid strings for msgstr? */
@@ -194,8 +194,7 @@ main(int argc, /* I - Number of command-line args */
if (msgid && msgstr)
{
if (*msgid)
- cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
- (use_msgid || !*msgstr) ? msgid : msgstr);
+ cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, normalize_string((use_msgid || !*msgstr) ? msgid : msgstr, normalized, sizeof(normalized)));
}
if (msgid)
@@ -213,10 +212,12 @@ main(int argc, /* I - Number of command-line args */
* Append to current string...
*/
- length = (int)strlen(msgstr ? msgstr : msgid);
+ size_t ptrlen = strlen(ptr); /* Length of string */
+
+ length = strlen(msgstr ? msgstr : msgid);
if ((temp = realloc(msgstr ? msgstr : msgid,
- length + strlen(ptr) + 1)) == NULL)
+ length + ptrlen + 1)) == NULL)
{
free(msgid);
if (msgstr)
@@ -235,7 +236,7 @@ main(int argc, /* I - Number of command-line args */
msgstr = temp;
- strcpy(msgstr + length, ptr);
+ memcpy(msgstr + length, ptr, ptrlen + 1);
}
else
{
@@ -247,7 +248,7 @@ main(int argc, /* I - Number of command-line args */
msgid = temp;
- strcpy(msgid + length, ptr);
+ memcpy(msgid + length, ptr, ptrlen + 1);
}
}
else if (!strncmp(s, "msgstr", 6) && msgid)
@@ -272,8 +273,7 @@ main(int argc, /* I - Number of command-line args */
if (msgid && msgstr)
{
if (*msgid)
- cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
- (use_msgid || !*msgstr) ? msgid : msgstr);
+ cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, normalize_string((use_msgid || !*msgstr) ? msgid : msgstr, normalized, sizeof(normalized)));
}
if (msgid)
@@ -290,5 +290,79 @@ main(int argc, /* I - Number of command-line args */
/*
- * End of "$Id: po2strings.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'normalize_string()' - Normalize a msgid string.
+ *
+ * This function converts ASCII ellipsis and double quotes to their Unicode
+ * counterparts.
+ */
+
+static char * /* O - Normalized string */
+normalize_string(const char *idstr, /* I - msgid string */
+ char *buffer, /* I - Normalized string buffer */
+ size_t bufsize) /* I - Size of string buffer */
+{
+ char *bufptr = buffer, /* Pointer into buffer */
+ *bufend = buffer + bufsize - 3; /* End of buffer */
+ int quote = 0, /* Quote direction */
+ html = 0; /* HTML text */
+
+
+ while (*idstr && bufptr < bufend)
+ {
+ if (!strncmp(idstr, "<A ", 3))
+ html = 1;
+ else if (html && *idstr == '>')
+ html = 0;
+
+ if (*idstr == '.' && idstr[1] == '.' && idstr[2] == '.')
+ {
+ /*
+ * Convert ... to Unicode ellipsis...
+ */
+
+ *bufptr++ = (char)0xE2;
+ *bufptr++ = (char)0x80;
+ *bufptr++ = (char)0xA6;
+ idstr += 2;
+ }
+ else if (!html && *idstr == '\\' && idstr[1] == '\"' && (quote || strchr(idstr + 2, '\"') != NULL))
+ {
+ if (quote)
+ {
+ /*
+ * Convert \" to Unicode right (curley) double quote.
+ */
+
+ *bufptr++ = (char)0xE2;
+ *bufptr++ = (char)0x80;
+ *bufptr++ = (char)0x9D;
+ }
+ else
+ {
+ /*
+ * Convert \" to Unicode left (curley) double quote.
+ */
+
+ *bufptr++ = (char)0xE2;
+ *bufptr++ = (char)0x80;
+ *bufptr++ = (char)0x9C;
+ }
+
+ quote = !quote;
+ idstr ++;
+ }
+ else
+ *bufptr++ = *idstr;
+
+ idstr ++;
+ }
+
+ *bufptr = '\0';
+
+ return (buffer);
+}
+
+
+/*
+ * End of "$Id: po2strings.c 12794 2015-07-20 18:26:20Z msweet $".
*/
diff --git a/locale/strings2po.c b/locale/strings2po.c
index fb20804..6c2864c 100644
--- a/locale/strings2po.c
+++ b/locale/strings2po.c
@@ -1,8 +1,16 @@
/*
- * "$Id: strings2po.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: strings2po.c 11558 2014-02-06 18:33:34Z msweet $"
*
* Convert Apple .strings file (UTF-16 BE text file) to GNU gettext .po files.
*
+ * Copyright 2007-2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
* Usage:
*
* strings2po filename.strings filename.po
@@ -10,12 +18,6 @@
* Compile with:
*
* gcc -o strings2po strings2po.c
- *
- * Contents:
- *
- * main() - Convert .strings file to .po.
- * read_strings() - Read a line from a .strings file.
- * write_po() - Write a line to the .po file.
*/
#include <stdio.h>
@@ -116,7 +118,7 @@ read_strings(FILE *strings, /* I - .strings file */
char *bufptr; /* Pointer into buffer */
- while (fgets(buffer, bufsize, strings))
+ while (fgets(buffer, (int)bufsize, strings))
{
if (buffer[0] != '\"')
continue;
@@ -171,5 +173,5 @@ write_po(FILE *po, /* I - .po file */
/*
- * End of "$Id: strings2po.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: strings2po.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/locale/translate.c b/locale/translate.c
deleted file mode 100644
index 8004825..0000000
--- a/locale/translate.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * "$Id: translate.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * HTTP-based translation program for CUPS.
- *
- * This program uses Google to translate the CUPS template (cups.pot) to
- * several different languages. The translation isn't perfect, but it's
- * a start (better than working from scratch.)
- *
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry.
- * save_messages() - Save messages to a .po file.
- * translate_messages() - Translate messages using Google.
- * write_string() - Write a quoted string to a file.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include <cups/cups-private.h>
-#include <unistd.h>
-
-
-/*
- * Local functions...
- */
-
-int save_messages(cups_array_t *cat, const char *filename);
-int translate_messages(cups_array_t *cat, const char *lang);
-int write_string(cups_file_t *fp, const char *s);
-
-
-/*
- * 'main()' - Main entry.
- */
-
-int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
-{
- cups_array_t *cat; /* Message catalog */
-
-
- if (argc != 3)
- {
- fputs("Usage: translate cups_language.po language\n", stderr);
- return (1);
- }
-
- if (access(argv[1], 0))
- cat = _cupsMessageLoad("cups.pot", 1);
- else
- cat = _cupsMessageLoad(argv[1], 1);
-
- if (!cat)
- {
- puts("Unable to load message catalog.");
- return (1);
- }
-
- if (!translate_messages(cat, argv[2]))
- {
- puts("Unable to translate message catalog.");
- return (1);
- }
-
- if (!save_messages(cat, argv[1]))
- {
- puts("Unable to save message catalog.");
- return (1);
- }
-
- return (0);
-}
-
-
-/*
- * 'save_messages()' - Save messages to a .po file.
- */
-
-int /* O - 1 on success, 0 on error */
-save_messages(cups_array_t *cat, /* I - Message catalog */
- const char *filename) /* I - File to save to */
-{
- _cups_message_t *m; /* Current message */
- cups_file_t *fp; /* File pointer */
-
-
- /*
- * Open the message catalog...
- */
-
- if ((fp = cupsFileOpen(filename, "w")) == NULL)
- return (0);
-
- /*
- * Save the messages to a file...
- */
-
- for (m = (_cups_message_t *)cupsArrayFirst(cat);
- m;
- m = (_cups_message_t *)cupsArrayNext(cat))
- {
- if (cupsFilePuts(fp, "msgid \"") < 0)
- break;
-
- if (!write_string(fp, m->id))
- break;
-
- if (cupsFilePuts(fp, "\"\nmsgstr \"") < 0)
- break;
-
- if (m->str)
- {
- if (!write_string(fp, m->str))
- break;
- }
-
- if (cupsFilePuts(fp, "\"\n") < 0)
- break;
- }
-
- cupsFileClose(fp);
-
- return (!m);
-}
-
-
-/*
- * 'translate_messages()' - Translate messages using Google.
- */
-
-int /* O - 1 on success, 0 on error */
-translate_messages(cups_array_t *cat, /* I - Message catalog */
- const char *lang) /* I - Output language... */
-{
- /*
- * Google provides a simple translation/language tool for translating
- * from one language to another. It is far from perfect, however it
- * can be used to get a basic translation done or update an existing
- * translation when no other resources are available.
- *
- * Translation requests are sent as HTTP POSTs to
- * "http://translate.google.com/translate_t" with the following form
- * variables:
- *
- * Name Description Value
- * -------- ---------------------------------- ----------------
- * hl Help language? "en"
- * ie Input encoding "UTF8"
- * langpair Language pair "en|" + language
- * oe Output encoding "UTF8"
- * text Text to translate translation string
- */
-
- int ret; /* Return value */
- _cups_message_t *m; /* Current message */
- int tries; /* Number of tries... */
- http_t *http; /* HTTP connection */
- http_status_t status; /* Status of POST request */
- char *idptr, /* Pointer into msgid */
- buffer[65536], /* Input/output buffer */
- *bufptr, /* Pointer into buffer */
- *bufend, /* Pointer to end of buffer */
- length[16]; /* Content length */
- int bytes; /* Number of bytes read */
-
-
- /*
- * Connect to translate.google.com...
- */
-
- puts("Connecting to translate.google.com...");
-
- if ((http = httpConnect("translate.google.com", 80)) == NULL)
- {
- perror("Unable to connect to translate.google.com");
- return (0);
- }
-
- /*
- * Scan the current messages, requesting a translation of any untranslated
- * messages...
- */
-
- for (m = (_cups_message_t *)cupsArrayFirst(cat), ret = 1;
- m;
- m = (_cups_message_t *)cupsArrayNext(cat))
- {
- /*
- * Skip messages that are already translated...
- */
-
- if (m->str && m->str[0])
- continue;
-
- /*
- * Encode the form data into the buffer...
- */
-
- snprintf(buffer, sizeof(buffer),
- "hl=en&ie=UTF8&langpair=en|%s&oe=UTF8&text=", lang);
- bufptr = buffer + strlen(buffer);
- bufend = buffer + sizeof(buffer) - 5;
-
- for (idptr = m->id; *idptr && bufptr < bufend; idptr ++)
- if (*idptr == ' ')
- *bufptr++ = '+';
- else if (*idptr < ' ' || *idptr == '%')
- {
- sprintf(bufptr, "%%%02X", *idptr & 255);
- bufptr += 3;
- }
- else if (*idptr != '&')
- *bufptr++ = *idptr;
-
- *bufptr++ = '&';
- *bufptr = '\0';
-
- sprintf(length, "%d", (int)(bufptr - buffer));
-
- /*
- * Send the request...
- */
-
- printf("\"%s\" = ", m->id);
- fflush(stdout);
-
- tries = 0;
-
- do
- {
- httpClearFields(http);
- httpSetField(http, HTTP_FIELD_CONTENT_TYPE,
- "application/x-www-form-urlencoded");
- httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, length);
-
- if (httpPost(http, "/translate_t"))
- {
- httpReconnect(http);
- httpPost(http, "/translate_t");
- }
-
- httpWrite2(http, buffer, bufptr - buffer);
-
- while ((status = httpUpdate(http)) == HTTP_CONTINUE);
-
- if (status != HTTP_OK && status != HTTP_ERROR)
- httpFlush(http);
-
- tries ++;
- }
- while (status == HTTP_ERROR && tries < 10);
-
- if (status == HTTP_OK)
- {
- /*
- * OK, read the translation back...
- */
-
- bufptr = buffer;
- bufend = buffer + sizeof(buffer) - 1;
-
- while ((bytes = httpRead2(http, bufptr, bufend - bufptr)) > 0)
- bufptr += bytes;
-
- if (bytes < 0)
- {
- /*
- * Read error, abort!
- */
-
- puts("READ ERROR!");
- ret = 0;
- break;
- }
-
- *bufptr = '\0';
-
- /*
- * Find the div containing translation
- */
-
- if ((bufptr = strstr(buffer, "<div id=result_box")) == NULL)
- {
- /*
- * No textarea, abort!
- */
-
- puts("NO div id=result_box!");
- ret = 0;
- break;
- }
-
- if ((bufptr = strchr(bufptr, '>')) == NULL)
- {
- /*
- * textarea doesn't end, abort!
- */
-
- puts("DIV SHORT DATA!");
- ret = 0;
- break;
- }
-
- bufptr ++;
-
- if ((bufend = strstr(bufptr, "</div>")) == NULL)
- {
- /*
- * textarea doesn't close, abort!
- */
-
- puts("/DIV SHORT DATA!");
- ret = 0;
- break;
- }
-
- *bufend = '\0';
-
- /*
- * Copy the translation...
- */
-
- m->str = strdup(bufptr);
-
- /*
- * Convert character entities to regular chars...
- */
-
- for (bufptr = strchr(m->str, '&');
- bufptr;
- bufptr = strchr(bufptr + 1, '&'))
- {
- if (!strncmp(bufptr, "&lt;", 4))
- {
- *bufptr = '<';
- _cups_strcpy(bufptr + 1, bufptr + 4);
- }
- else if (!strncmp(bufptr, "&gt;", 4))
- {
- *bufptr = '>';
- _cups_strcpy(bufptr + 1, bufptr + 4);
- }
- else if (!strncmp(bufptr, "&amp;", 5))
- _cups_strcpy(bufptr + 1, bufptr + 5);
- }
-
- printf("\"%s\"\n", m->str);
- }
- else if (status == HTTP_ERROR)
- {
- printf("NETWORK ERROR (%s)!\n", strerror(httpError(http)));
- ret = 0;
- break;
- }
- else
- {
- printf("HTTP ERROR %d!\n", status);
- ret = 0;
- break;
- }
- }
-
- httpClose(http);
-
- return (ret);
-}
-
-
-/*
- * 'write_string()' - Write a quoted string to a file.
- */
-
-int /* O - 1 on success, 0 on failure */
-write_string(cups_file_t *fp, /* I - File to write to */
- const char *s) /* I - String */
-{
- while (*s)
- {
- switch (*s)
- {
- case '\n' :
- if (cupsFilePuts(fp, "\\n") < 0)
- return (0);
- break;
-
- case '\r' :
- if (cupsFilePuts(fp, "\\r") < 0)
- return (0);
- break;
-
- case '\t' :
- if (cupsFilePuts(fp, "\\t") < 0)
- return (0);
- break;
-
- case '\\' :
- if (cupsFilePuts(fp, "\\\\") < 0)
- return (0);
- break;
-
- case '\"' :
- if (cupsFilePuts(fp, "\\\"") < 0)
- return (0);
- break;
-
- default :
- if ((*s & 255) < ' ')
- {
- if (cupsFilePrintf(fp, "\\%o", *s) < 0)
- return (0);
- }
- else if (cupsFilePutChar(fp, *s) < 0)
- return (0);
- break;
- }
-
- s ++;
- }
-
- return (1);
-}
-
-
-/*
- * End of "$Id: translate.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/man/Makefile b/man/Makefile
index c5d68a5..e01cf58 100644
--- a/man/Makefile
+++ b/man/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12814 2015-07-30 15:03:33Z msweet $"
#
-# Man page makefile for CUPS.
+# Man page makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1993-2006 by Easy Software Products.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1993-2006 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
@@ -21,13 +21,14 @@ include ../Makedefs
#
MAN1 = cancel.$(MAN1EXT) \
+ cups.$(MAN1EXT) \
cups-config.$(MAN1EXT) \
cupstestdsc.$(MAN1EXT) \
cupstestppd.$(MAN1EXT) \
+ $(IPPFIND_MAN) \
ipptool.$(MAN1EXT) \
lp.$(MAN1EXT) \
lpoptions.$(MAN1EXT) \
- lppasswd.$(MAN1EXT) \
lpq.$(MAN1EXT) \
lprm.$(MAN1EXT) \
lpr.$(MAN1EXT) \
@@ -42,6 +43,7 @@ MAN5 = classes.conf.$(MAN5EXT) \
cups-files.conf.$(MAN5EXT) \
cups-snmp.conf.$(MAN5EXT) \
cupsd.conf.$(MAN5EXT) \
+ cupsd-logs.$(MAN5EXT) \
ipptoolfile.$(MAN5EXT) \
mailto.conf.$(MAN5EXT) \
mime.convs.$(MAN5EXT) \
@@ -56,11 +58,10 @@ MAN8 = cupsaccept.$(MAN8EXT) \
cupsaddsmb.$(MAN8EXT) \
cupsctl.$(MAN8EXT) \
cupsfilter.$(MAN8EXT) \
- cups-deviced.$(MAN8EXT) \
- cups-driverd.$(MAN8EXT) \
cups-lpd.$(MAN8EXT) \
cups-snmp.$(MAN8EXT) \
cupsd.$(MAN8EXT) \
+ cupsd-helper.$(MAN8EXT) \
cupsenable.$(MAN8EXT) \
lpadmin.$(MAN8EXT) \
lpinfo.$(MAN8EXT) \
@@ -96,22 +97,6 @@ unittests:
clean:
$(RM) mantohtml mantohtml.o
$(RM) $(MAN1) $(MAN5) $(MAN7) $(MAN8)
- for file in $(MAN1); do \
- if test $$file != ipptool.$(MAN1EXT); then \
- $(RM) ../doc/help/man-`basename $$file .$(MAN1EXT)`.html; \
- fi \
- done
- for file in $(MAN5); do \
- if test $$file != ipptoolfile.$(MAN5EXT); then \
- $(RM) ../doc/help/man-`basename $$file .$(MAN5EXT)`.html; \
- fi \
- done
- for file in $(MAN7); do \
- $(RM) ../doc/help/man-`basename $$file .$(MAN7EXT)`.html; \
- done
- for file in $(MAN8); do \
- $(RM) ../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \
- done
#
@@ -159,6 +144,10 @@ install-data: all
done
$(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT)
$(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT)
+ for file in cups-deviced cups-driverd cups-exec; do \
+ $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \
+ $(LN) cupsd-helper.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \
+ done
#
@@ -232,10 +221,12 @@ html: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml
./mantohtml `basename $$file .$(MAN8EXT)`.man >../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \
done
-mantohtml: mantohtml.o
- $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ mantohtml.o
+mantohtml: mantohtml.o ../cups/$(LIBCUPSSTATIC)
+ $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ mantohtml.o \
+ ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) \
+ $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12814 2015-07-30 15:03:33Z msweet $".
#
diff --git a/man/backend.man b/man/backend.man
index b97ab4a..c744b11 100644
--- a/man/backend.man
+++ b/man/backend.man
@@ -1,172 +1,205 @@
.\"
-.\" "$Id: backend.man 7810 2008-07-29 01:11:15Z mike $"
+.\" "$Id: backend.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" Backend man page for CUPS.
+.\" Backend man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH backend 7 "CUPS" "23 April 2012" "Apple Inc."
-
+.TH backend 7 "CUPS" "4 April 2014" "Apple Inc."
.SH NAME
backend \- cups backend transmission interfaces
.SH SYNOPSIS
.B backend
.br
.B backend
-job user title num-copies options [
+.I job
+.I user
+.I title
+.I num-copies
+.I options
+[
.I filename
]
+.nf
+
+\fB#include <cups/cups.h>\fR
+
+\fBconst char *cupsBackendDeviceURI\fR(\fBchar **\fIargv\fR);
+
+\fBvoid cupsBackendReport\fR(\fBconst char *\fIdevice_scheme\fR,
+ \fBconst char *\fIdevice_uri\fR,
+ \fBconst char *\fIdevice_make_and_model\fR,
+ \fBconst char *\fIdevice_info\fR,
+ \fBconst char *\fIdevice_id\fR,
+ \fBconst char *\fIdevice_location\fR);
+
+\fBssize_t cupsBackChannelWrite\fR(\fBconst char *\fIbuffer\fR,
+ \fBsize_t \fIbytes\fR, \fBdouble \fItimeout\fR);
+
+\fBint cupsSideChannelRead\fR(\fBcups_sc_command_t *\fIcommand\fR,
+ \fBcups_sc_status_t *\fIstatus\fR, \fBchar *\fIdata\fR,
+ \fBint *\fIdatalen\fR, \fBdouble \fItimeout\fR);
+
+\fBint cupsSideChannelWrite\fR(\fBcups_sc_command_t \fIcommand\fR,
+ \fBcups_sc_status_t \fIstatus\fR, \fBconst char *\fIdata\fR,
+ \fBint \fIdatalen\fR, \fBdouble \fItimeout\fR);
+.fi
.SH DESCRIPTION
-Backends are a special type of \fIfilter(7)\fR which is used to send print data
-to and discover different devices on the system.
+Backends are a special type of
+.BR filter (7)
+which is used to send print data to and discover different devices on the system.
.LP
-Like filters, backends must be capable of reading from a filename on the
-command-line or from the standard input, copying the standard input to a
-temporary file as required by the physical interface.
+Like filters, backends must be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the physical interface.
.LP
-The command name (argv[0]) is set to the device URI of the destination printer.
-Starting with CUPS 1.1.22, any authentication information in argv[0] is removed,
-so backend developers are urged to use the DEVICE_URI environment variable
-whenever authentication information is required. The CUPS API includes a
-\fIcupsBackendDeviceURI\fR function for retrieving the correct device URI.
+The command name (\fIargv[0]\fR) is set to the device URI of the destination printer. Authentication information in
+.I argv[0]
+is removed, so backend developers are urged to use the
+.B DEVICE_URI
+environment variable whenever authentication information is required. The
+.BR cupsBackendDeviceURI ()
+function may be used to retrieve the correct device URI.
.LP
-Back-channel data from the device should be relayed to the job
-filters by writing to file descriptor 3. The CUPS API includes
-the \fIcupsBackChannelWrite\fR function for this purpose.
-.SH WARNING
-CUPS backends are not generally design to be run directly by the user. Aside
-from the device URI issue (argv[0] and DEVICE_URI environment variable contain
-the device URI), CUPS backends also expect specific environment variables and
-file descriptors, and typically run in a user session that (on OS X) has
-additional restrictions that affect how it runs. Backends can also be installed
-with restricted permissions (0500 or 0700) that tell the scheduler to run them
-as the "root" user instead of an unprivileged user (typically "lp") on the
-system.
+Back-channel data from the device should be relayed to the job filters using the \fIcupsBackChannelWrite\fR function.
.LP
-Unless you are a developer and know what you are doing, please do not run
-backends directly. Instead, use the \fIlp(1)\fR or \fIlpr(1)\fR programs to send
-a print job or \fIlpinfo(8)\fR program to query for available printers using the
-backend. The one exception is the SNMP backend - see \fIsnmpbackend(8)\fR for
-more information.
-.SH DEVICE DISCOVERY
-When run with no arguments, the backend should list the devices and schemes it
-supports or is advertising to stdout. The output consists of zero or more lines
-consisting of any of the following forms:
-
+Backends are responsible for reading side-channel requests using the
+.BR cupsSideChannelRead ()
+function and responding with the
+.BR cupsSideChannelWrite()
+function. The
+.B CUPS_SC_FD
+constant defines the file descriptor that should be monitored for incoming requests.
+.SS DEVICE DISCOVERY
+When run with no arguments, the backend should list the devices and schemes it supports or is advertising to the standard output. The output consists of zero or more lines consisting of any of the following forms:
.nf
+
device-class scheme "Unknown" "device-info"
device-class device-uri "device-make-and-model" "device-info"
device-class device-uri "device-make-and-model" "device-info" "device-id"
device-class device-uri "device-make-and-model" "device-info" "device-id" "device-location"
.fi
.LP
-The \fIdevice-class\fR field is one of the following values:
+The
+.BR cupsBackendReport ()
+function can be used to generate these lines and handle any necessary escaping of characters in the various strings.
+.LP
+The
+.I device-class
+field is one of the following values:
.TP 5
-direct
-.br
-The device-uri refers to a specific direct-access device with no options, such
-as a parallel, USB, or SCSI device.
+.B direct
+The device-uri refers to a specific direct-access device with no options, such as a parallel, USB, or SCSI device.
.TP 5
-file
-.br
+.B file
The device-uri refers to a file on disk.
.TP 5
-network
-.br
+.B network
The device-uri refers to a networked device and conforms to the general form for
network URIs.
.TP 5
-serial
-.br
-The device-uri refers to a serial device with configurable baud rate and other
-options. If the device-uri contains a baud value, it represents the maximum baud
-rate supported by the device.
+.B serial
+The device-uri refers to a serial device with configurable baud rate and other options. If the device-uri contains a baud value, it represents the maximum baud rate supported by the device.
.LP
-The \fIscheme\fR field provides the URI scheme that is supported by the backend.
-Backends should use this form only when the backend supports any URI using that
-scheme. The \fIdevice-uri\fR field specifies the full URI to use when
-communicating with the device.
+The
+.I scheme
+field provides the URI scheme that is supported by the backend. Backends should use this form only when the backend supports any URI using that scheme. The
+.I device-uri
+field specifies the full URI to use when communicating with the device.
.LP
-The \fIdevice-make-and-model\fR field specifies the make and model of the
-device, e.g. "Example Foojet 2000". If the make and model is not known, you must
-report "Unknown".
+The
+.I device-make-and-model
+field specifies the make and model of the device, e.g. "Example Foojet 2000". If the make and model is not known, you must report "Unknown".
.LP
-The \fIdevice-info\fR field specifies additional information about the device.
-Typically this includes the make and model along with the port number or network
-address, e.g. "Example Foojet 2000 USB #1".
+The
+.I device-info
+field specifies additional information about the device. Typically this includes the make and model along with the port number or network address, e.g. "Example Foojet 2000 USB #1".
.LP
-The optional \fIdevice-id\fR field specifies the IEEE-1284 device ID string for
-the device, which is used to select a matching driver.
+The optional
+.I device-id
+field specifies the IEEE-1284 device ID string for the device, which is used to select a matching driver.
.LP
-The optional \fIdevice-location\fR field specifies the physical location of
-the device, which is often used to pre-populate the printer-location attribute
-when adding a printer.
-.SH PERMISSIONS
-Backends without world execute permissions are run as the root user. Otherwise,
-the backend is run using an unprivileged user account, typically "lp".
-.SH EXIT CODES
-The following exit codes are defined for backends; C API constants defined in
-the <cups/backend.h> header file are defined in parenthesis:
+The optional
+.I device-location
+field specifies the physical location of the device, which is often used to pre-populate the printer-location attribute when adding a printer.
+.SS PERMISSIONS
+Backends without world read and execute permissions are run as the root user. Otherwise, the backend is run using an unprivileged user account, typically "lp".
+.SH EXIT STATUS
+The following exit codes are defined for backends:
.TP 5
-0 (CUPS_BACKEND_OK)
-.br
+.B CUPS_BACKEND_OK
The print file was successfully transmitted to the device or remote server.
.TP 5
-1 (CUPS_BACKEND_FAILED)
+.B CUPS_BACKEND_FAILED
.br
-The print file was not successfully transmitted to the device or remote server.
-The scheduler will respond to this by canceling the job, retrying the job, or
-stopping the queue depending on the state of the error-policy attribute.
-.TP 5
-2 (CUPS_BACKEND_AUTH_REQUIRED)
-.br
-The print file was not successfully transmitted because valid authentication
-information is required. The scheduler will respond to this by holding the job
-and adding the "cups-held-for-authentication" keyword to the "job-reasons"
+The print file was not successfully transmitted to the device or remote server. The scheduler will respond to this by canceling the job, retrying the job, or stopping the queue depending on the state of the
+.I printer-error-policy
attribute.
.TP 5
-3 (CUPS_BACKEND_HOLD)
-.br
-The print file was not successfully transmitted because it cannot be printed at
-this time. The scheduler will respond to this by holding the job.
+.B CUPS_BACKEND_AUTH_REQUIRED
+The print file was not successfully transmitted because valid authentication information is required. The scheduler will respond to this by holding the job and adding the 'cups-held-for-authentication' keyword to the "job-reasons" Job Description attribute.
.TP 5
-4 (CUPS_BACKEND_STOP)
-.br
-The print file was not successfully transmitted because it cannot be printed at
-this time. The scheduler will respond to this by stopping the queue.
+.B CUPS_BACKEND_HOLD
+The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by holding the job.
.TP 5
-5 (CUPS_BACKEND_CANCEL)
-.br
-The print file was not successfully transmitted because one or more attributes
-are not supported or the job was canceled at the printer. The scheduler will
-respond to this by canceling the job.
+.B CUPS_BACKEND_STOP
+The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by stopping the queue.
.TP 5
-6 (CUPS_BACKEND_RETRY)
-.br
-The print file was not successfully transmitted because of a temporary issue.
-The scheduler will retry the job at a future time - other jobs may print before
-this one.
+.B CUPS_BACKEND_CANCEL
+The print file was not successfully transmitted because one or more attributes are not supported or the job was canceled at the printer. The scheduler will respond to this by canceling the job.
.TP 5
-7 (CUPS_BACKEND_RETRY_CURRENT)
-.br
-The print file was not successfully transmitted because of a temporary issue.
-The scheduler will retry the job immediately without allowing intervening jobs.
+.B CUPS_BACKEND_RETRY
+The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job at a future time - other jobs may print before this one.
+.TP 5
+.B CUPS_BACKEND_RETRY_CURRENT
+The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job immediately without allowing intervening jobs.
.PP
All other exit code values are reserved.
+.SH ENVIRONMENT
+In addition to the environment variables listed in
+.BR cups (1)
+and
+.BR filter (7),
+CUPS backends can expect the following environment variable:
+.TP 5
+.B DEVICE_URI
+The device URI associated with the printer.
+.SH FILES
+.I /etc/cups/cups-files.conf
+.SH NOTES
+CUPS backends are not generally design to be run directly by the user. Aside from the device URI issue (
+.I argv[0]
+and
+.B DEVICE_URI
+environment variable contain the device URI), CUPS backends also expect specific environment variables and file descriptors, and typically run in a user session that (on OS X) has additional restrictions that affect how it runs. Backends can also be installed with restricted permissions (0500 or 0700) that tell the scheduler to run them as the "root" user instead of an unprivileged user (typically "lp") on the system.
+.LP
+Unless you are a developer and know what you are doing, please do not run backends directly. Instead, use the
+.BR lp (1)
+or
+.BR lpr (1)
+programs to send print jobs or
+.BR lpinfo (8)
+to query for available printers using the backend. The one exception is the SNMP backend - see
+.BR cups-snmp (8)
+for more information.
.SH SEE ALSO
-\fIcups-snmp(8)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fIfilter(7)\fR,
-\fIlpinfo(8)\fR,
+.IR cups (1),
+.IR cups-files.conf (5),
+.IR cups-snmp (8),
+.IR cupsd (8),
+.IR filter (7),
+.IR lp (1),
+.IR lpinfo (8),
+.IR lpr (1),
.br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: backend.man 7810 2008-07-29 01:11:15Z mike $".
+.\" End of "$Id: backend.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cancel.man b/man/cancel.man
index 5134d1f..97c5b72 100644
--- a/man/cancel.man
+++ b/man/cancel.man
@@ -1,75 +1,99 @@
.\"
-.\" "$Id: cancel.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cancel.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cancel man page for CUPS.
+.\" cancel man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cancel 1 "CUPS" "20 March 2006" "Apple Inc."
+.TH cancel 1 "CUPS" "15 April 2014" "Apple Inc."
.SH NAME
-cancel - cancel jobs
+cancel \- cancel jobs
.SH SYNOPSIS
.B cancel
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -a ] [ -h
+] [
+.B \-a
+] [
+.B \-h
.I hostname[:port]
-] [ -u
+] [
+.B \-u
.I username
] [
+.B \-x
+] [
.I id
] [
.I destination
] [
-.I destination-id
+.I destination\-id
]
.SH DESCRIPTION
-\fIcancel\fR cancels existing print jobs. The \fI-a\fR option will remove
-all jobs from the specified destination.
+The \fBcancel\fR command cancels print jobs.
+If no \fIdestination\fR or \fIid\fR is specified, the currently printing job on the default destination is canceled.
.SH OPTIONS
-The following options are recognized by \fIcancel\fR:
-.TP 5
--E
-.br
-Forces encryption when connecting to the server.
+The following options are recognized by \fBcancel\fR:
.TP 5
--U username
-.br
-Specifies the username to use when connecting to the server.
-.TP 5
--a
-.br
+.B \-a
Cancel all jobs on the named destination, or all jobs on all
destinations if none is provided.
.TP 5
--h hostname[:port]
-.br
-Chooses an alternate server.
+.B \-E
+Forces encryption when connecting to the server.
+.TP 5
+\fB\-h \fIhostname\fR[\fI:port\fR]
+Specifies an alternate server.
.TP 5
--u username
-.br
+\fB\-U \fIusername\fR
+Specifies the username to use when connecting to the server.
+.TP 5
+\fB\-u \fIusername\fR
Cancels jobs owned by \fIusername\fR.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
-Also, printer and class names are \fInot\fR case-sensitive.
+.TP 5
+.B \-x
+Deletes job data files in addition to canceling.
+.SH CONFORMING TO
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are \fInot\fR case-sensitive.
+.SH EXAMPLES
+Cancel the current print job:
+.nf
+
+ cancel
+
+.fi
+Cancel job "myprinter-42":
+.nf
+
+ cancel myprinter\-42
+
+.fi
+Cancel all jobs:
+.nf
+
+ cancel \-a
+.fi
.SH NOTES
-Administrators wishing to prevent unauthorized cancellation of
-jobs via the \fI-u\fR option should require authentication for
-Cancel-Jobs operations in \fIcupsd.conf(5)\fR.
+Administrators wishing to prevent unauthorized cancellation of jobs via the \fI\-u\fR option should require authentication for Cancel-Jobs operations in
+.BR cupsd.conf (5).
.SH SEE ALSO
-\fIlp(1)\fR, \fIlpmove(8)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cupsd.conf (5),
+.BR lp (1),
+.BR lpmove (8),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cancel.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cancel.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/classes.conf.man b/man/classes.conf.man
index 8149d15..9e4a113 100644
--- a/man/classes.conf.man
+++ b/man/classes.conf.man
@@ -1,110 +1,36 @@
.\"
-.\" "$Id: classes.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: classes.conf.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" classes.conf man page for CUPS.
+.\" classes.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH classes.conf 5 "CUPS" "29 April 2009" "Apple Inc."
+.TH classes.conf 5 "CUPS" "15 April 2014" "Apple Inc."
.SH NAME
classes.conf \- class configuration file for cups
.SH DESCRIPTION
-The \fIclasses.conf\fR file defines the local printer classes that are
-available. It is normally located in the \fI/etc/cups\fR directory and
-is generated automatically by the \fIcupsd(8)\fR program when printer
-classes are added or deleted.
-.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-.TP 5
-<Class name> ... </Class>
-.br
-Defines a specific printer class.
-.TP 5
-<DefaultClass name> ... </Class>
-.br
-Defines a default printer class.
-.TP 5
-Accepting Yes
-.TP 5
-Accepting No
-.br
-Specifies whether the printer is accepting new jobs.
-.TP 5
-AllowUser [ user @group ... ]
-.br
-Allows specific users and groups to print to the printer.
-.TP 5
-DenyUser [ user @group ... ]
-.br
-Prevents specific users and groups from printing to the printer.
-.TP 5
-Info text
-.br
-Specifies human-readable text describing the printer.
-.TP 5
-JobSheets banner banner
-.br
-Specifies the banner pages to use for the printer.
-.TP 5
-KLimit number
-.br
-Specifies the job-k-limit value for the printer.
-.TP 5
-Location text
-.br
-Specifies human-readable text describing the location of the printer.
-.TP 5
-OpPolicy name
-.br
-Specifies the operation policy for the printer.
-.TP 5
-PageLimit number
-.br
-Specifies the job-page-limit value for the printer.
-.TP 5
-Printer
-.br
-Specifies a printer that is a member of the printer class.
-.TP 5
-QuotaPeriod seconds
-.br
-Specifies the job-quota-period value for the printer.
-.TP 5
-Shared Yes
-.TP 5
-Shared No
-.br
-Specifies whether the printer is shared.
-.TP 5
-State idle
-.TP 5
-State stopped
-.br
-Specifies the initial state of the printer (Idle or Stopped)
-.TP 5
-StateMessage text
-.br
-Specifies the message associated with the state.
-.TP 5
-StateTime seconds
-.br
-Specifies the date/time associated with the state.
+The \fBclasses.conf\fR file defines the local printer classes that are available. It is normally located in the \fI/etc/cups\fR directory and is maintained by the
+.BR cupsd (8)
+program. This file is not intended to be edited or managed manually.
+.SH NOTES
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
.SH SEE ALSO
-\fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fImime.convs(5)\fR,
-\fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR cupsd (8),
+.BR cupsd.conf (5),
+.BR mime.convs (5),
+.BR mime.types (5),
+.BR printers.conf (5),
+.BR subscriptions.conf (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: classes.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: classes.conf.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/client.conf.man.in b/man/client.conf.man.in
index 36b70d5..ae6cdb0 100644
--- a/man/client.conf.man.in
+++ b/man/client.conf.man.in
@@ -1,65 +1,86 @@
.\"
-.\" "$Id: client.conf.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: client.conf.man.in 12645 2015-05-20 01:20:52Z msweet $"
.\"
-.\" client.conf man page for CUPS.
+.\" client.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH client.conf 5 "CUPS" "25 June 2013" "Apple Inc."
+.TH client.conf 5 "CUPS" "19 May 2015" "Apple Inc."
.SH NAME
-client.conf \- client configuration file for cups
+client.conf \- client configuration file for cups (deprecated)
.SH DESCRIPTION
-The \fIclient.conf\fR file configures the CUPS client and is
-normally located in the \fI@CUPS_SERVERROOT@\fR or \fI~/.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.
-.SH DIRECTIVES
-The following directives are understood by the client. Consult the
-on-line help for detailed descriptions:
-.TP 5
-Encryption IfRequested
-.TP 5
-Encryption Never
-.TP 5
-Encryption Required
-.br
-Specifies the level of encryption that is required for a particular
-location.
-.TP 5
-GSSServiceName name
-Specifies the Kerberos service name that is used for authentication, typically
-"host", "http", or "ipp". CUPS adds the remote hostname
-("name@server.example.com") for you. The default name is
-"@CUPS_DEFAULT_GSSSERVICENAME@".
-.TP 5
-ServerName hostname-or-ip-address[:port]
-.TP 5
-ServerName /domain/socket
-.br
-Specifies the address and optionally the port to use when connecting to the
-server. \fBNote: Not supported on OS X 10.7 or later.\fR
-.TP 5
-ServerName hostname-or-ip-address[:port]/version=1.1
-.br
-Specifies the address and optionally the port to use when connecting to a
-server running CUPS 1.3.12 and earlier. \fBNote: Not supported on OS X 10.7 or
-later.\fR
-.TP 5
-User name
-.br
+The \fBclient.conf\fR file configures the CUPS client and is normally located in the \fI/etc/cups\fR and/or \fI~/.cups\fR directories.
+Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.
+.LP
+\fBNote:\fR Starting with OS X 10.7, this file is only used by command-line and X11 applications plus the IPP backend.
+The \fBServerName\fR directive is not supported on OS X at all.
+.SS DIRECTIVES
+The following directives are understood by the client. Consult the online help for detailed descriptions:
+.TP 5
+\fBAllowAnyRoot Yes\fR
+.TP 5
+\fBAllowAnyRoot No\fR
+Specifies whether to allow TLS with certificates that have not been signed by a trusted Certificate Authority.
+The default is "Yes".
+.TP 5
+\fBAllowExpiredCerts Yes\fR
+.TP 5
+\fBAllowExpiredCerts No\fR
+Specifies whether to allow TLS with expired certificates.
+The default is "Yes".
+.TP 5
+\fBEncryption IfRequested\fR
+.TP 5
+\fBEncryption Never\fR
+.TP 5
+\fBEncryption Required\fR
+Specifies the level of encryption that should be used.
+.TP 5
+\fBGSSServiceName \fIname\fR
+Specifies the Kerberos service name that is used for authentication, typically "host", "http", or "ipp".
+CUPS adds the remote hostname ("name@server.example.com") for you. The default name is "http".
+.TP 5
+\fBServerName \fIhostname-or-ip-address\fR[\fI:port\fR]
+.TP 5
+\fBServerName \fI/domain/socket\fR
+Specifies the address and optionally the port to use when connecting to the server.
+\fBNote: This directive it not supported on OS X 10.7 or later.\fR
+.TP 5
+\fBServerName \fIhostname-or-ip-address\fR[\fI:port\fR]\fB/version=1.1\fR
+Specifies the address and optionally the port to use when connecting to a server running CUPS 1.3.12 and earlier.
+.TP 5
+\fBSSLOptions \fR[\fIAllowDH\fR] [\fIAllowRC4\fR] [\fIAllowSSL3\fR] [\fIDenyTLS1.0\fR]
+.TP 5
+\fBSSLOptions None\fR
+Sets encryption options (only in /etc/cups/client.conf).
+By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites.
+The \fIAllowDH\fR option enables cipher suites using plain Diffie-Hellman key negotiation.
+The \fIAllowRC4\fR option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The \fIAllowSSL3\fR option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+The \fIDenyTLS1.0\fR option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1.
+.TP 5
+\fBUser \fIname\fR
Specifies the default user name to use for requests.
+.TP 5
+\fBValidateCerts Yes\fR
+.TP 5
+\fBValidateCerts No\fR
+Specifies whether to only allow TLS with certificates whose common name matches the hostname.
+The default is "No".
+.SH NOTES
+The \fBclient.conf\fR file is deprecated and will no longer be supported in a future version of CUPS.
.SH SEE ALSO
-http://localhost:631/help
+.BR cups (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: client.conf.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: client.conf.man.in 12645 2015-05-20 01:20:52Z msweet $".
.\"
diff --git a/man/cups-config.man b/man/cups-config.man
index c13e935..0cd37a6 100644
--- a/man/cups-config.man
+++ b/man/cups-config.man
@@ -1,117 +1,116 @@
.\"
-.\" "$Id: cups-config.man 7646 2008-06-16 17:26:20Z mike $"
+.\" "$Id: cups-config.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cups-config man page for CUPS.
+.\" cups-config man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cups-config 1 "CUPS" "23 October 2008" "Apple Inc."
+.TH cups-config 1 "CUPS" "15 April 2014" "Apple Inc."
.SH NAME
-cups-config \- get cups api, compiler, directory, and link information.
+cups\-config \- get cups api, compiler, directory, and link information.
.SH SYNOPSIS
-.B cups-config
---api-version
+.B cups\-config
+.I \-\-api\-version
.br
-.B cups-config
---build
+.B cups\-config
+.I \-\-build
.br
-.B cups-config
---cflags
+.B cups\-config
+.I \-\-cflags
.br
-.B cups-config
---datadir
+.B cups\-config
+.I \-\-datadir
.br
-.B cups-config
---help
+.B cups\-config
+.I \-\-help
.br
-.B cups-config
---ldflags
+.B cups\-config
+.I \-\-ldflags
.br
-.B cups-config
+.B cups\-config
[
-.I --image
+.I \-\-image
] [
-.I --static
-] --libs
+.I \-\-static
+]
+.I \-\-libs
.br
-.B cups-config
---serverbin
+.B cups\-config
+.I \-\-serverbin
.br
-.B cups-config
---serverroot
+.B cups\-config
+.I \-\-serverroot
.br
.B cups-config
---version
+.I \-\-version
.br
.SH DESCRIPTION
-\fBcups-config\fR is the CUPS program configuration utility. It should be
-used by application developers to determine the necessary command-line
-options for the compiler and linker, as well as determining installation
-directories for filters, configuration files, and drivers.
+The \fBcups-config\fR command allows application developers to determine the necessary command-line options for the compiler and linker, as well as the installation directories for filters, configuration files, and drivers.
+All values are reported to the standard output.
.SH OPTIONS
+The \fBcups-config\fR command accepts the following command-line options:
.TP 5
---api-version
-.br
-Displays the current API version (major.minor).
+.B \-\-api-version
+Reports the current API version (major.minor).
.TP 5
---build
-.br
-Displays a system-specific build number.
+.B \-\-build
+Reports a system-specific build number.
.TP 5
---cflags
-.br
-Displays the necessary compiler options.
+.B \-\-cflags
+Reports the necessary compiler options.
.TP 5
---datadir
-.br
-Displays the default CUPS data directory.
+.B \-\-datadir
+Reports the default CUPS data directory.
.TP 5
---help
-.br
-Displays the program usage message.
+.B \-\-help
+Reports the program usage message.
.TP 5
---image
-.br
-When used with \fI--libs\fR, adds the CUPS imaging library to the
-list of displayed libraries.
+.B \-\-image
+When used with \fI\-\-libs\fR, adds the CUPS imaging library to the
+list of libraries.
.TP 5
---ldflags
-.br
-Displays the necessary linker options.
+.B \-\-ldflags
+Reports the necessary linker options.
.TP 5
---libs
-.br
-Displays the necessary librarys to link to.
+.B \-\-libs
+Reports the necessary libraries to link to.
.TP 5
---serverbin
-.br
-Displays the default CUPS binary directory,
-where filters and backends are stored.
+.B \-\-serverbin
+Reports the default CUPS binary directory, where filters and backends are stored.
.TP 5
---serverroot
-.br
-Displays the default CUPS configuration file directory.
+.B \-\-serverroot
+Reports the default CUPS configuration file directory.
.TP 5
---static
-.br
-When used with \fI--libs\fR, shows the static libraries instead
-of the default (shared) libraries.
+.B \-\-static
+When used with \fI\-\-libs\fR, reports the static libraries instead of the default (shared) libraries.
.TP 5
---version
-.br
-Displays the full version number of the CUPS installation
-(major.minor.patch).
+.B \-\-version
+Reports the full version number of the CUPS installation (major.minor.patch).
+.SH EXAMPLES
+Show the currently installed version of CUPS:
+.nf
+
+ cups-config \-\-version
+
+.fi
+Compile a simple one-file CUPS filter:
+.nf
+
+ cc `cups\-config \-\-cflags \-\-ldflags` \-o filter filter.c \\
+ `cups\-config \-\-libs`
+.fi
.SH SEE ALSO
-http://localhost:631/help
+.BR cups (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cups-config.man 7646 2008-06-16 17:26:20Z mike $".
+.\" End of "$Id: cups-config.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cups-deviced.man.in b/man/cups-deviced.man.in
deleted file mode 100644
index 8961882..0000000
--- a/man/cups-deviced.man.in
+++ /dev/null
@@ -1,44 +0,0 @@
-.\"
-.\" "$Id: cups-deviced.man.in 11173 2013-07-23 12:31:34Z msweet $"
-.\"
-.\" cups-deviced man page for CUPS.
-.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
-.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
-.\"
-.TH cups-deviced 8 "CUPS" "16 June 2008" "Apple Inc."
-.SH NAME
-cups-deviced \- cups device daemon
-.SH SYNOPSIS
-.B cups-deviced
-.I request-id limit user-id options
-.SH DESCRIPTION
-\fIcups-deviced\fR polls the backends in
-\fI@CUPS_SERVERBIN@/backend\fR for a list of available devices.
-It is run by \fIcupsd(8)\fR in response to a
-\fICUPS-Get-Devices\fR request. The output format is an IPP
-response message. The \fIrequest-id\fR argument is the request ID
-from the original IPP request, typically 1. The \fIlimit\fR
-argument is the limit value from the original IPP request - 0
-means no limit. The \fIuser-id\fR argument is the
-requesting-user-name value from the original IPP request.
-Finally, the \fIoptions\fR argument is a space-delimited list of
-attributes ("name=value name=value \...") that were passed in
-with the request. Currently \fIcups-deviced\fR looks for the
-\fIrequested-attributes\fR attribute and tailors the output
-accordingly.
-.SH SEE ALSO
-backend(7), cupsd(8), cupsd.conf(5),
-.br
-http://localhost:631/help
-.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
-.\"
-.\" End of "$Id: cups-deviced.man.in 11173 2013-07-23 12:31:34Z msweet $".
-.\"
diff --git a/man/cups-driverd.man.in b/man/cups-driverd.man.in
deleted file mode 100644
index d40fa54..0000000
--- a/man/cups-driverd.man.in
+++ /dev/null
@@ -1,122 +0,0 @@
-.\"
-.\" "$Id: cups-driverd.man.in 11173 2013-07-23 12:31:34Z msweet $"
-.\"
-.\" cups-driverd man page for CUPS.
-.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
-.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
-.\"
-.TH cups-driverd 8 "CUPS" "6 January 2011" "Apple Inc."
-.SH NAME
-cups-driverd \- cups driver daemon
-.SH SYNOPSIS
-.B cups-driverd
-cat
-.I ppd-name
-.br
-.B cups-driverd
-list
-.I request_id limit options
-.SH DESCRIPTION
-\fIcups-driverd\fR shows or lists PPD files. It is run in
-response to CUPS-Add-Modify-Printer or CUPS-Get-Devices requests.
-The first form ("cups-driverd cat ppd-name") writes the named PPD
-file to stdout. The output format is an uncompressed PPD file.
-.LP
-The second form lists the available manufacturers or PPD files to
-stdout as indicated by the \fIoptions\fR argument. The output
-format is an IPP response message. The \fIrequest_id\fR argument
-is the request ID from the original IPP request, typically 1. The
-\fIlimit\fR argument is the limit value from the original IPP
-request - 0 means no limit. Finally, the \fIoptions\fR argument
-is a space-delimited list of attributes ("name=value name=value
-\&...") that were passed in with the request. Currently
-\fIcups-driverd\fR looks for the \fIppd-make\fR and
-\fIrequested-attributes\fR attributes and tailors the output
-accordingly.
-.SH DRIVERS
-Drivers can be static PPD files under the
-\fI@CUPS_DATADIR@/model\fR directory or programs under the
-\fI@CUPS_SERVERBIN@/driver\fR directory. Static PPD files must
-conform to the Adobe PPD File Format Specification version 4.3
-and may be compressed using the \fIgzip(1)\fR program. Driver
-programs must implement the command-line interface shown in the
-next section.
-.SS DRIVER PROGRAMS
-Driver programs provide a interface to dynamically-generated PPD
-files. The following arguments are currently defined:
-.TP 5
-drivername list
-.br
-Lists the supported PPD files to stdout.
-.TP 5
-drivername cat ppdname
-.br
-Writes the named PPD file to stdout.
-.PP
-Driver programs MUST NOT query hardware or make other long-term operations that
-would delay the return of a driver list. See the NOTES section below for
-specific recommendations.
-.SS LISTING FILES (drivername list)
-When run with the single argument "list", the program must list
-the available PPD files it can generate to stdout using the
-following format:
-.nf
- "drivername:ppdname" language "make" "make and model"
- "drivername:ppdname" language "make" "make and model" "1284 device id"
- "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)"
- "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" "PostScript version"
- "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" "PostScript version" "type"
-.fi
-.LP
-\fIDrivername\fR is the name of the driver program. \fIPpdname\fR
-is the name used to select the given driver. \fILanguage\fR is
-the locale associated with the default language of the PPD file,
-typically "en". \fIMake\fR is the Manufacturer name from the PPD
-file. \fIMake and model\fR is the NickName name from the PPD
-file. \fI1284 device id\fR is the 1284DeviceId from the PPD file,
-if any. \fI(PPD product)\fR is the Product string as it would appear in the PPD
-file or from a PostScript query. \fIPostScript version\fR is the PSVersion
-string as it would appear in the PPD file or from a PostScript query. \fIType\fR
-is "postscript" for PostScript printers, "pdf" for PDF printers, "raster" for
-raster printers, or "fax" for facsimile devices.
-.SS WRITING FILES (drivername cat ppdname)
-When the driver program is run with the "cat ppdname" arguments,
-it must write the named PPD file to stdout, uncompressed. If the
-named PPD file does not exist, the driver program must not write
-any output to stdout and report the error to stderr instead.
-.SS DRIVER ERROR MESSAGES
-Error messages can be relayed back to \fIcupsd\fR by writing them
-to stderr. The following prefixes are recognized:
-.TP 5
-DEBUG: [drivername]
-.br
-Debugging messages
-.TP 5
-ERROR: [drivername]
-.br
-Error messages
-.TP 5
-INFO: [drivername]
-.br
-Informational messages
-.SH NOTES
-Due to performance considerations, driver programs have been officially
-deprecated and should not be used for new development. Currently only the
-CUPS web interface and \fIlpinfo(8)\fR command will request lists from all
-driver programs.
-.SH SEE ALSO
-cupsd(8), cupsd.conf(5), cupstestppd(1), lpinfo(8),
-.br
-http://localhost:631/help
-.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
-.\"
-.\" End of "$Id: cups-driverd.man.in 11173 2013-07-23 12:31:34Z msweet $".
-.\"
diff --git a/man/cups-files.conf.man.in b/man/cups-files.conf.man.in
index 559ea45..8603754 100644
--- a/man/cups-files.conf.man.in
+++ b/man/cups-files.conf.man.in
@@ -1,152 +1,229 @@
.\"
-.\" "$Id: cups-files.conf.man.in 11221 2013-08-06 16:16:01Z msweet $"
+.\" "$Id: cups-files.conf.man.in 12699 2015-06-08 18:16:30Z msweet $"
.\"
-.\" cupsd.conf man page for CUPS.
+.\" cups-files.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cups-files.conf 5 "CUPS" "26 July 2013" "Apple Inc."
+.TH cups-files.conf 5 "CUPS" "3 June 2015" "Apple Inc."
.SH NAME
-cups-files.conf \- file and directory configuration file for cups
+cups\-files.conf \- file and directory configuration file for cups
.SH DESCRIPTION
-The \fIcups-files.conf\fR file configures the files and directories used by the
-CUPS scheduler, \fIcupsd(8)\fR. It is normally located in the
-\fI@CUPS_SERVERROOT@\fR directory.
+The \fBcups\-files.conf\fR file configures the files and directories used by the CUPS scheduler,
+.BR cupsd (8).
+It is normally located in the \fI/etc/cups\fR directory.
.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-The following directives are understood by \fIcupsd(8)\fR. Consult the
-on-line help for detailed descriptions:
+Each line in the file can be a configuration directive, a blank line, or a comment.
+Configuration directives typically consist of a name and zero or more values separated by whitespace.
+The configuration directive name and values are case-insensitive.
+Comment lines start with the # character.
+.SS DIRECTIVES
+The following directives are understood by
+.BR cupsd (8):
+.\"#AccessLog
.TP 5
-AccessLog filename
+\fBAccessLog\fR
.TP 5
-AccessLog syslog
-.br
-Defines the access log filename.
-.TP 5
-ConfigFilePerm mode
-.br
-Specifies the permissions for all configuration files that the scheduler
-writes.
-.TP 5
-DataDir path
-.br
-Specified the directory where data files can be found.
-.TP 5
-DocumentRoot directory
-.br
-Specifies the root directory for the internal web server documents.
-.TP 5
-ErrorLog filename
-.TP 5
-ErrorLog syslog
-.br
-Specifies the error log filename.
-.TP 5
-FatalErrors none
-.TP 5
-FatalErrors all -kind [... -kind]
-.TP 5
-FatalErrors kind [... kind]
-.br
-Specifies which errors are fatal, causing the scheduler to exit. "Kind" is
-"browse", "config", "listen", "log", or "permissions".
-.TP 5
-FileDevice Yes
-.TP 5
-FileDevice No
-.br
-Specifies whether the file pseudo-device can be used for new
-printer queues.
-.TP 5
-FontPath directory[:directory:...]
-.br
-Specifies the search path for fonts.
-.TP 5
-Group group-name-or-number
-.br
-Specifies the group name or ID that will be used when executing
-external programs.
-.TP 5
-LogFilePerm mode
-.br
-Specifies the permissions for all log files that the scheduler writes.
+\fBAccessLog \fIfilename\fR
.TP 5
-PageLog filename
+\fBAccessLog stderr\fR
.TP 5
-PageLog syslog
-.br
-Specifies the page log filename.
-.TP 5
-Printcap
-.TP 5
-Printcap filename
-.br
-Specifies the filename for a printcap file that is updated
-automatically with a list of available printers (needed for
-legacy applications); specifying Printcap with no filename
-disables printcap generation.
-.TP 5
-RemoteRoot user-name
-.br
-Specifies the username that is associated with unauthenticated root
-accesses.
-.TP 5
-RequestRoot directory
-.br
-Specifies the directory to store print jobs and other HTTP request
-data.
-.TP 5
-ServerBin directory
-.br
-Specifies the directory where backends, CGIs, daemons, and filters may
-be found.
-.TP 5
-ServerCertificate filename
-.br
-Specifies the encryption certificate to use.
-.TP 5
-ServerKey filename
-.br
-Specifies the encryption key to use.
-.TP 5
-ServerRoot directory
-.br
-Specifies the directory where the server configuration files can be found.
-.TP 5
-SyncOnClose Yes
-.TP 5
-SyncOnClose No
-Specifies whether the scheduler calls \fIfsync(2)\fR after writing configuration
-or state files. The default is No.
-.TP 5
-SystemGroup group-name [group-name ...]
-.br
-Specifies the group(s) to use for System class authentication.
-.TP 5
-TempDir directory
-.br
+\fBAccessLog syslog\fR
+Defines the access log filename.
+Specifying a blank filename disables access log generation.
+The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background.
+The value "syslog" causes log entries to be sent to the system log daemon.
+The server name may be included in filenames using the string "%s", for example:
+.nf
+
+ AccessLog /var/log/cups/%s-access_log
+
+.fi
+The default is "/var/log/cups/access_log".
+.\"#ConfigFilePerm
+.TP 5
+\fBConfigFilePerm \fImode\fR
+Specifies the permissions for all configuration files that the scheduler writes.
+The default is "0644" on OS X and "0640" on all other operating systems.
+.LP
+\fBNote:\fR The permissions for the \fIprinters.conf\fR file are currently masked to only allow access from the scheduler user (typically root).
+This is done because printer device URIs sometimes contain sensitive authentication information that should not be generally known on the system.
+There is no way to disable this security feature.
+.\"#DataDir
+.TP 5
+\fBDataDir \fIpath\fR
+Specifies the directory where data files can be found.
+The default is usually "/usr/share/cups".
+.\"#DocumentRoot
+.TP 5
+\fBDocumentRoot \fIdirectory\fR
+Specifies the root directory for the CUPS web interface content.
+The default is usually "/usr/share/doc/cups".
+.\"#ErrorLog
+.TP 5
+\fBErrorLog\fR
+.TP 5
+\fBErrorLog \fIfilename\fR
+.TP 5
+\fBErrorLog stderr\fR
+.TP 5
+\fBErrorLog syslog\fR
+Defines the error log filename.
+Specifying a blank filename disables error log generation.
+The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background.
+The value "syslog" causes log entries to be sent to the system log daemon.
+The server name may be included in filenames using the string "%s", for example:
+.nf
+
+ ErrorLog /var/log/cups/%s-error_log
+
+.fi
+The default is "/var/log/cups/error_log".
+.\"#FatalErrors
+.TP 5
+\fBFatalErrors none\fR
+.TP 5
+\fBFatalErrors all \fI\-kind \fR[ ... \fI\-kind \fR]
+.TP 5
+\fBFatalErrors \fIkind \fR[ ... \fIkind \fR]
+Specifies which errors are fatal, causing the scheduler to exit.
+The default is "config".
+The \fIkind\fR strings are:
+.RS 5
+.TP 5
+.B none
+No errors are fatal.
+.TP 5
+.B all
+All of the errors below are fatal.
+.TP 5
+.B browse
+Browsing initialization errors are fatal, for example failed connections to the DNS-SD daemon.
+.TP 5
+.B config
+Configuration file syntax errors are fatal.
+.TP 5
+.B listen
+Listen or Port errors are fatal, except for IPv6 failures on the loopback or "any" addresses.
+.TP 5
+.B log
+Log file creation or write errors are fatal.
+.TP 5
+.B permissions
+Bad startup file permissions are fatal, for example shared TLS certificate and key files with world-read permissions.
+.RE
+.\"#FileDevice
+.TP 5
+\fBFileDevice Yes\fR
+.TP 5
+\fBFileDevice No\fR
+Specifies whether the file pseudo-device can be used for new printer queues.
+The URI "file:///dev/null" is always allowed.
+.\"#Group
+.TP 5
+\fBGroup \fIgroup-name-or-number\fR
+Specifies the group name or ID that will be used when executing external programs.
+The default group is operating system specific but is usually "lp" or "nobody".
+.\"#LogFilePerm
+.TP 5
+\fBLogFilePerm \fImode\fR
+Specifies the permissions of all log files that the scheduler writes.
+The default is "0644".
+.\"#PageLog
+.TP 5
+\fBPageLog \fR[ \fIfilename\fR ]
+.TP 5
+\fBPageLog stderr\fR
+.TP 5
+\fBPageLog syslog\fR
+Defines the page log filename.
+The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background.
+The value "syslog" causes log entries to be sent to the system log daemon.
+Specifying a blank filename disables page log generation.
+The server name may be included in filenames using the string "%s", for example:
+.nf
+
+ PageLog /var/log/cups/%s-page_log
+
+.fi
+The default is "/var/log/cups/page_log".
+.\"#RemoteRoot
+.TP 5
+\fBRemoteRoot \fIusername\fR
+Specifies the username that is associated with unauthenticated accesses by clients claiming to be the root user.
+The default is "remroot".
+.\"#RequestRoot
+.TP 5
+\fBRequestRoot \fIdirectory\fR
+Specifies the directory that contains print jobs and other HTTP request data.
+The default is "/var/spool/cups".
+.\"#Sandboxing
+.TP 5
+\fBSandboxing relaxed\fR
+.TP 5
+\fBSandboxing strict\fR
+Specifies the level of security sandboxing that is applied to print filters, backends, and other child processes of the scheduler.
+The default is "strict".
+This directive is currently only used/supported on OS X.
+.\"#ServerBin
+.TP 5
+\fBServerBin \fIdirectory\fR
+Specifies the directory containing the backends, CGI programs, filters, helper programs, notifiers, and port monitors.
+The default is "/usr/lib/cups" or "/usr/libexec/cups" depending on the platform.
+.\"#ServerKeychain
+.TP 5
+\fBServerKeychain \fIpath\fR
+Specifies the location of TLS certificates and private keys.
+The default is "/Library/Keychains/System.keychain" on OS X and "/etc/cups/ssl" on all other operating systems.
+OS X uses its keychain database to store certificates and keys while other platforms use separate files in the specified directory, *.crt for PEM-encoded certificates and *.key for PEM-encoded private keys.
+.\"#ServerRoot
+.TP 5
+\fBServerRoot \fIdirectory\fR
+Specifies the directory containing the server configuration files.
+The default is "/etc/cups".
+.\"#SyncOnClose
+.TP 5
+\fBSyncOnClose Yes\fR
+.TP 5
+\fBSyncOnClose No\fR
+Specifies whether the scheduler calls
+.BR fsync (2)
+after writing configuration or state files.
+The default is "No".
+.\"#SystemGroup
+.TP 5
+\fBSystemGroup \fIgroup-name \fR[ ... \fIgroup-name\fR ]
+Specifies the group(s) to use for \fI@SYSTEM\fR group authentication.
+The default contains "admin", "lpadmin", "root", "sys", and/or "system".
+.\"#TempDir
+.TP 5
+\fBTempDir \fIdirectory\fR
Specifies the directory where temporary files are stored.
+The default is "/var/spool/cups/tmp".
+.\"#User
.TP 5
-User user-name
-.br
+\fBUser \fIusername\fR
Specifies the user name or ID that is used when running external programs.
+The default is "lp".
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fImime.convs(5)\fR,
-\fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-\fIsubscriptions.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR classes.conf (5),
+.BR cups (1),
+.BR cupsd (8),
+.BR cupsd.conf (5),
+.BR mime.convs (5),
+.BR mime.types (5),
+.BR printers.conf (5),
+.BR subscriptions.conf (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cups-files.conf.man.in 11221 2013-08-06 16:16:01Z msweet $".
+.\" End of "$Id: cups-files.conf.man.in 12699 2015-06-08 18:16:30Z msweet $".
.\"
diff --git a/man/cups-lpd.man.in b/man/cups-lpd.man.in
index e030b61..2b52fa6 100644
--- a/man/cups-lpd.man.in
+++ b/man/cups-lpd.man.in
@@ -1,124 +1,126 @@
.\"
-.\" "$Id: cups-lpd.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cups-lpd.man.in 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cups-lpd man page for CUPS.
+.\" cups-lpd man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cups-lpd 8 "CUPS" "4 August 2008" "Apple Inc."
+.TH cups-lpd 8 "CUPS" "3 June 2014" "Apple Inc."
.SH NAME
cups-lpd \- receive print jobs and report printer status to lpd clients
.SH SYNOPSIS
.B cups-lpd
-[ -h
-.I hostname[:port]
-] [ -n ] [ -o
+[
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B -n
+] [
+.B -o
.I option=value
]
.SH DESCRIPTION
-\fIcups-lpd\fR is the CUPS Line Printer Daemon ("LPD")
-mini-server that supports legacy client systems that use the LPD
-protocol. \fIcups-lpd\fR does not act as a standalone network
-daemon but instead operates using the Internet "super-server"
-\fIinetd(8)\fR or \fIxinetd(8)\fR. If you are using \fIinetd\fR,
-add the following line to the \fIinetd.conf\fR file to enable the
-\fIcups-lpd\fR mini-server:
-.br
-.nf
-
- printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\
- -o document-format=application/octet-stream
-.fi
-.LP
-.LP
-\fBNote:\fR If you are using Solaris 10 or higher, you must run
-the \fIinetdconv(1m)\fR program to register the changes to the
-inetd.conf file.
-.LP
-If you are using the newer \fIxinetd(8)\fR daemon, create a file
-named \fI/etc/xinetd.d/cups\fR containing the following lines:
-.br
-.nf
-
- service printer
- {
- socket_type = stream
- protocol = tcp
- wait = no
- user = lp
- group = sys
- passenv =
- server = @CUPS_SERVERBIN@/daemon/cups-lpd
- server_args = -o document-format=application/octet-stream
- }
-.fi
+.B cups-lpd
+is the CUPS Line Printer Daemon ("LPD") mini-server that supports legacy client systems that use the LPD protocol.
+.B cups-lpd
+does not act as a standalone network daemon but instead operates using any of the Internet "super-servers" such as
+.BR inetd (8),
+.BR launchd (8),
+and
+.BR systemd (8).
.SH OPTIONS
.TP 5
--h hostname[:port]
-.br
+\fB-h \fIhostname\fR[\fB:\fIport\fR]
Sets the CUPS server (and port) to use.
.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.
+.B -n
+Disables reverse address lookups; normally
+.B cups-lpd
+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
-disable the "l" filter so that remote print jobs are filtered as
-needed for printing; the examples in the previous section set the
-"document-format" option to "application/octet-stream" which
-forces autodetection of the print file format.
-.SH PERFORMANCE
-\fIcups-lpd\fR performs well with small numbers of clients and
-printers. However, since a new process is created for each
-connection and since each process must query the printing system
-before each job submission, it does not scale to larger
-configurations. We highly recommend that large configurations
-use the native IPP support provided by CUPS instead.
-.SH SECURITY
-\fIcups-lpd\fR currently does not perform any access control
-based on the settings in \fIcupsd.conf(5)\fR or in the
-\fIhosts.allow(5)\fR or \fIhosts.deny(5)\fR files used by TCP
-wrappers. Therefore, running \fIcups-lpd\fR on your server will
-allow any computer on your network (and perhaps the entire
+\fB-o \fIname=value\fR
+Inserts options for all print queues. Most often this is used to disable the "l" filter so that remote print jobs are filtered as needed for printing; the
+.BR inetd (8)
+example below sets the "document-format" option to "application/octet-stream" which forces autodetection of the print file format.
+.SH CONFORMING TO
+.B cups-lpd
+does not enforce the restricted source port number specified in RFC 1179, as using restricted ports does not prevent users from submitting print jobs.
+While this behavior is different than standard Berkeley LPD implementations, it should not affect normal client operations.
+.LP
+The output of the status requests follows RFC 2569, Mapping between LPD and IPP Protocols. Since many LPD implementations stray from this definition, remote status reporting to LPD clients may be unreliable.
+.SH ERRORS
+Errors are sent to the system log.
+.SH FILES
+.nf
+.I /etc/inetd.conf
+.I /etc/xinetd.d/cups-lpd
+.I /System/Library/LaunchDaemons/org.cups.cups-lpd.plist
+.fi
+.SH NOTES
+.SS PERFORMANCE
+.B cups-lpd
+performs well with small numbers of clients and printers.
+However, since a new process is created for each connection and since each process must query the printing system before each job submission, it does not scale to larger configurations.
+We highly recommend that large configurations use the native IPP support provided by CUPS instead.
+.SS SECURITY
+.B cups-lpd
+currently does not perform any access control based on the settings in \fIcupsd.conf(5)\fR or in the \fIhosts.allow(5)\fR or \fIhosts.deny(5)\fR files used by TCP wrappers.
+Therefore, running
+.B cups-lpd
+on your server will allow any computer on your network (and perhaps the entire
Internet) to print to your server.
.LP
-While \fIxinetd\fR has built-in access control support, you
-should use the TCP wrappers package with \fIinetd\fR to limit
-access to only those computers that should be able to print
-through your server.
+While
+.BR xinetd (8)
+has built-in access control support, you should use the TCP wrappers package with
+.BR inetd (8)
+to limit access to only those computers that should be able to print through your server.
+.LP
+.B cups-lpd
+is not enabled by the standard CUPS distribution.
+Please consult with your operating system vendor to determine whether it is enabled by default on your system.
+.SH EXAMPLE
+If you are using
+.BR inetd (8),
+add the following line to the \fIinetd.conf\fR file to enable the
+.B cups-lpd
+mini-server:
+.nf
+
+ printer stream tcp nowait lp /usr/lib/cups/daemon/cups\-lpd cups\-lpd \\
+ \-o document\-format=application/octet\-stream
+
+.fi
.LP
-\fIcups-lpd\fR is not enabled by the standard CUPS distribution.
-Please consult with your operating system vendor to determine
-whether it is enabled on your system.
-.SH COMPATIBILITY
-\fIcups-lpd\fR does not enforce the restricted source port
-number specified in RFC 1179, as using restricted ports does not
-prevent users from submitting print jobs. While this behavior is
-different than standard Berkeley LPD implementations, it should
-not affect normal client operations.
+\fINote:\fR If you are using Solaris 10 or higher, you must run the
+.BR inetdconv (1m)
+program to register the changes to the \fIinetd.conf\fR file.
.LP
-The output of the status requests follows RFC 2569, Mapping
-between LPD and IPP Protocols. Since many LPD implementations
-stray from this definition, remote status reporting to LPD
-clients may be unreliable.
+CUPS includes configuration files for
+.BR launchd (8),
+.BR systemd (8),
+and
+.BR xinetd(8).
+Simply enable the
+.B cups-lpd
+service using the corresponding control program.
.SH SEE ALSO
-\fIcups(1)\fR, \fIcupsd(8)\fR, \fIinetconv(1m)\fR,
-\fIinetd(8)\fR, \fIxinetd(8)\fR,
-.br
-http://localhost:631/help
+.BR cups (1),
+.BR cupsd (8),
+.BR inetconv (1m),
+.BR inetd (8),
+.BR launchd (8),
+.BR xinetd (8),
+CUPS Online Help (http://localhost:631/help),
+RFC 2569
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cups-lpd.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cups-lpd.man.in 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cups-snmp.conf.man b/man/cups-snmp.conf.man
index 608a2b5..07dfcfb 100644
--- a/man/cups-snmp.conf.man
+++ b/man/cups-snmp.conf.man
@@ -1,78 +1,69 @@
.\"
-.\" "$Id: cups-snmp.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cups-snmp.conf.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" snmp.conf man page for CUPS.
+.\" snmp.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH snmp.conf 5 "CUPS" "23 April 2012" "Apple Inc."
-
+.TH snmp.conf 5 "CUPS" "10 June 2014" "Apple Inc."
.SH NAME
snmp.conf \- snmp configuration file for cups
.SH DESCRIPTION
-The \fIsnmp.conf\fR file configures how the standard CUPS network backends
-(http, https, ipp, ipps, lpd, snmp, and socket) access printer information using
-SNMPv1 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.
+The
+.B snmp.conf
+file configures how the standard CUPS network backends (http, https, ipp, ipps, lpd, snmp, and socket) access printer information using SNMPv1 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 Community and DebugLevel directives are used by all backends. The remainder
-apply only to the SNMP backend (\fIcups-snmp(8)\fR).
+The Community and DebugLevel directives are used by all backends. The remainder apply only to the SNMP backend -
+.BR cups-snmp (8).
.SH DIRECTIVES
-The following directives are understood by the CUPS network backends. Consult
-the on-line help for detailed descriptions:
+The following directives are understood by the CUPS network backends:
.TP 5
-Address @IF(\fIname\fR)
+\fBAddress @IF(\fIname\fB)\fR
.TP 5
-Address @LOCAL
+\fBAddress @LOCAL\fR
.TP 5
-Address \fIaddress\fR
-.br
-Sends SNMP broadcast queries to the specified address(es). There is no default
-for the broadcast address.
+\fBAddress \fIaddress\fR
+Sends SNMP broadcast queries (for discovery) to the specified address(es).
+There is no default for the broadcast address.
.TP 5
-Community \fIname\fR
-.br
-Specifies the community name to use. Only a single community name may be
-specified. The default community name is "public".
+\fBCommunity \fIname\fR
+Specifies the community name to use.
+Only a single community name may be specified.
+The default community name is "public".
.TP 5
-DebugLevel number
-.br
-Specifies the logging level from 0 (none) to 3 (everything). Typically only used
-for debugging (thus the name). The default debug level is 0.
+\fBDebugLevel \fInumber\fR
+Specifies the logging level from 0 (none) to 3 (everything).
+Typically only used for debugging (thus the name).
+The default debug level is 0.
.TP 5
-DeviceURI "regular expression" device-uri [... device-uri]
-.br
-Specifies one or more device URIs that should be used for a given make and model
-string. The regular expression is used to match the detected make and model, and
-the device URI strings must be of the form "scheme://%s[:port]/[path]", where
-"%s" represents the detected address or hostname. There are no default device
-URI matching rules.
+\fBDeviceURI "\fIregular expression\fB" \fIdevice-uri \fR[... \fIdevice-uri\fR]
+Specifies one or more device URIs that should be used for a given make and model string.
+The regular expression is used to match the detected make and model, and the device URI strings must be of the form "scheme://%s[:port]/[path]", where "%s" represents the detected address or hostname.
+There are no default device URI matching rules.
.TP 5
-HostNameLookups on
+\fBHostNameLookups on\fR
.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".
+\fBHostNameLookups off\fR
+Specifies whether the addresses of printers should be converted to hostnames or left as numeric IP addresses.
+The default is "off".
.TP 5
-MaxRunTime \fIseconds\fR
-.br
+\fBMaxRunTime \fIseconds\fR
Specifies the maximum number of seconds that the SNMP backend will scan the
-network for printers. The default is 120 seconds (2 minutes).
+network for printers.
+The default is 120 seconds (2 minutes).
.SH SEE ALSO
-cups-snmp(8),
-.br
-http://localhost:631/help
+.BR cups-snmp (8),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cups-snmp.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cups-snmp.conf.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cups-snmp.man.in b/man/cups-snmp.man.in
index 797a038..1ab3025 100644
--- a/man/cups-snmp.man.in
+++ b/man/cups-snmp.man.in
@@ -1,59 +1,61 @@
.\"
-.\" "$Id: cups-snmp.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cups-snmp.man.in 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" SNMP backend man page for CUPS.
+.\" SNMP backend man page for CUPS.
.\"
-.\" Copyright 2012-2013 by Apple Inc.
+.\" Copyright 2012-2014 by Apple Inc.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cups-snmp 8 "CUPS" "23 April 2012" "Apple Inc."
+.TH cups-snmp 8 "CUPS" "10 June 2014" "Apple Inc."
.SH NAME
snmp \- cups snmp backend
.SH SYNOPSIS
-.B @CUPS_SERVERBIN@/backend/snmp
+.B /usr/lib/cups/backend/snmp
.I ip-address-or-hostname
.br
-.B lpinfo -v --include-schemes snmp
+.B /usr/libexec/cups/backend/snmp
+.I ip-address-or-hostname
+.br
+.B lpinfo
+.B \-v
+.B \-\-include-schemes
+snmp
.SH DESCRIPTION
-The CUPS SNMP backend provides legacy discovery and identification of network
-printers using SNMPv1. When used for discovery through the scheduler, the
-backend will list all printers that respond to a broadcast SNMPv1 query with the
-"public" community name. Additional queries are then sent to printers that
-respond in order to determine the correct device URI, make and model, and other
-information needed for printing.
+The CUPS SNMP backend provides legacy discovery and identification of network printers using SNMPv1.
+When used for discovery through the scheduler, the backend will list all printers that respond to a broadcast SNMPv1 query with the "public" community name.
+Additional queries are then sent to printers that respond in order to determine the correct device URI, make and model, and other information needed for printing.
.LP
-In the first form, the SNMP backend is run directly by the user to look up the
-device URI and other information when you have an IP address or hostname. This
-can be used for programs that need to configure print queues where the user has
-supplied an address but nothing else.
+In the first form, the SNMP backend is run directly by the user to look up the device URI and other information when you have an IP address or hostname.
+This can be used for programs that need to configure print queues where the user has supplied an address but nothing else.
.LP
-In the second form, the SNMP backend is run indirectly using the \fIlpinfo(8)\fR
-command. The output provides all printers detected via SNMP on the configured
-broadcast addresses. \fBNote\fR: no broadcast addresses are configured by
-default.
-.SH MIBS
-The CUPS SNMP backend uses the information from the Host, Printer, and Port
-Monitor MIBs along with some vendor private MIBs and intelligent port probes to
-determine the correct device URI and make and model for each printer.
-.SH CONFIGURATION
-The SNMP backend reads the @CUPS_SERVERROOT@/snmp.conf configuration file, if
+In the second form, the SNMP backend is run indirectly using the
+.BR lpinfo (8)
+command.
+The output provides all printers detected via SNMP on the configured
+broadcast addresses.
+\fINote: no broadcast addresses are configured by default.\fR
+.SH ENVIRONMENT
+The DebugLevel value can be overridden using the CUPS_DEBUG_LEVEL environment variable.
+The MaxRunTime value can be overridden using the CUPS_MAX_RUN_TIME environment variable.
+.SH FILES
+The SNMP backend reads the \fI/etc/cups/snmp.conf\fR configuration file, if
present, to set the default broadcast address, community name, and logging
-level. The configuration file is documented in \fIcups-snmp.conf(5)\fR. The
-DebugLevel value can be overridden using the CUPS_DEBUG_LEVEL environment
-variable and the MaxRunTime value can be overridden using the CUPS_MAX_RUN_TIME
-environment variable.
+level.
+.SH CONFORMING TO
+The CUPS SNMP backend uses the information from the Host, Printer, and Port Monitor MIBs along with some vendor private MIBs and intelligent port probes to determine the correct device URI and make and model for each printer.
.SH SEE ALSO
-\fIbackend(7)\fR, \fIcups-snmp.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fIfilter(7)\fR, \fIlpinfo(8)\fR,
-.br
-http://localhost:631/help
+.BR backend (7),
+.BR cups-snmp.conf (5),
+.BR cupsd (8),
+.BR lpinfo (8),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cups-snmp.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cups-snmp.man.in 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cups.man b/man/cups.man
new file mode 100644
index 0000000..02a9bac
--- /dev/null
+++ b/man/cups.man
@@ -0,0 +1,147 @@
+.\"
+.\" "$Id: cups.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" cups (intro) man page for CUPS.
+.\"
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH cups 1 "CUPS" "16 April 2014" "Apple Inc."
+.SH NAME
+cups \- a standards-based, open source printing system
+.SH DESCRIPTION
+.B CUPS
+is the software you use to print from applications like word processors, email readers, photo editors, and web browsers. It converts the page descriptions produced by your application (put a paragraph here, draw a line there, and so forth) into something your printer can understand and then sends the information to the printer for printing.
+.LP
+Now, since every printer manufacturer does things differently, printing can be very complicated.
+.B CUPS
+does its best to hide this from you and your application so that you can concentrate on printing and less on how to print. Generally, the only time you need to know anything about your printer is when you use it for the first time, and even then
+.B CUPS
+can often figure things out on its own.
+.SS HOW DOES IT WORK?
+The first time you print to a printer,
+.B CUPS
+creates a queue to keep track of the current status of the printer (everything OK, out of paper, etc.) and any pages you have printed. Most of the time the queue points to a printer connected directly to your computer via a USB port, however it can also point to a printer on your network, a printer on the Internet, or multiple printers depending on the configuration. Regardless of where the queue points, it will look like any other printer to you and your applications.
+.LP
+Every time you print something,
+.B CUPS
+creates a job which contains the queue you are sending the print to, the name of the document you are printing, and the page descriptions. Job are numbered (queue-1, queue-2, and so forth) so you can monitor the job as it is printed or cancel it if you see a mistake. When
+.B CUPS
+gets a job for printing, it determines the best programs (filters, printer drivers, port monitors, and backends) to convert the pages into a printable format and then runs them to actually print the job.
+.LP
+When the print job is completely printed,
+.B CUPS
+removes the job from the queue and moves on to any other jobs you have submitted. You can also be notified when the job is finished, or if there are any errors during printing, in several different ways.
+.SS WHERE DO I BEGIN?
+The easiest way to start is by using the web interface to configure your printer. Go to "http://localhost:631" and choose the Administration tab at the top of the page. Click/press on the Add Printer button and follow the prompts.
+.LP
+When you are asked for a username and password, enter your login username and password or the "root" username and password.
+.LP
+After the printer is added you will be asked to set the default printer options (paper size, output mode, etc.) for the printer. Make any changes as needed and then click/press on the Set Default Options button to save them. Some printers also support auto-configuration - click/press on the Query Printer for Default Options button to update the options automatically.
+.LP
+Once you have added the printer, you can print to it from any application. You can also choose Print Test Page from the maintenance menu to print a simple test page and verify that everything is working properly.
+.LP
+You can also use the
+.BR lpadmin (8)
+and
+.BR lpinfo (8)
+commands to add printers to
+.BR CUPS .
+Additionally, your operating system may include graphical user interfaces or automatically create printer queues when you connect a printer to your computer.
+.SS HOW DO I GET HELP?
+The
+.B CUPS
+web site (http://www.CUPS.org) provides access to the
+.I cups
+and
+.I cups-devel
+mailing lists, additional documentation and resources, and a bug report database. Most vendors also provide online discussion forums to ask printing questions for your operating system of choice.
+.SH ENVIRONMENT
+.B CUPS
+commands use the following environment variables to override the default locations of files and so forth. For security reasons, these environment variables are ignored for setuid programs:
+.TP 5
+.B CUPS_ANYROOT
+Whether to allow any X.509 certificate root (Y or N).
+.TP 5
+.B CUPS_CACHEDIR
+The directory where semi-persistent cache files can be found.
+.TP 5
+.B CUPS_DATADIR
+The directory where data files can be found.
+.TP 5
+.B CUPS_ENCRYPTION
+The default level of encryption (Always, IfRequested, Never, Required).
+.TP 5
+.B CUPS_EXPIREDCERTS
+Whether to allow expired X.509 certificates (Y or N).
+.TP 5
+.B CUPS_GSSSERVICENAME
+The Kerberos service name used for authentication.
+.TP 5
+.B CUPS_SERVER
+The hostname/IP address and port number of the CUPS scheduler (hostname:port or ipaddress:port).
+.TP 5
+.B CUPS_SERVERBIN
+The directory where server helper programs, filters, backend, etc. can be found.
+.TP 5
+.B CUPS_SERVERROOT
+The root directory of the server.
+.TP 5
+.B CUPS_STATEDIR
+The directory where state files can be found.
+.TP 5
+.B CUPS_USER
+Specifies the name of the user for print requests.
+.TP 5
+.B HOME
+Specifies the home directory of the current user.
+.TP 5
+.B IPP_PORT
+Specifies the default port number for IPP requests.
+.TP 5
+.B LOCALEDIR
+Specifies the location of localization files.
+.TP 5
+.B LPDEST
+Specifies the default print queue (System V standard).
+.TP 5
+.B PRINTER
+Specifies the default print queue (Berkeley standard).
+.TP 5
+.B TMPDIR
+Specifies the location of temporary files.
+.SH FILES
+.nf
+.I ~/.cups/client.conf
+.I ~/.cups/lpoptions
+.fi
+.SH CONFORMING TO
+.B CUPS
+conforms to the Internet Printing Protocol version 2.1 and implements the Berkeley and System V UNIX print commands.
+.SH SEE ALSO
+.BR cancel (1),
+.BR client.conf (7),
+.BR cupsctl (8),
+.BR cupsd (8),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpinfo (8),
+.BR lpoptions (1),
+.BR lpr (1),
+.BR lprm (1),
+.BR lpq (1),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help),
+CUPS Web Site (http://www.CUPS.org),
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2015 by Apple Inc.
+.\"
+.\" End of "$Id: cups.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
diff --git a/man/cupsaccept.man b/man/cupsaccept.man
index 0c8ba03..70385f8 100644
--- a/man/cupsaccept.man
+++ b/man/cupsaccept.man
@@ -1,79 +1,94 @@
.\"
-.\" "$Id: cupsaccept.man 7930 2008-09-10 22:25:54Z mike $"
+.\" "$Id: cupsaccept.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" accept/reject man page for CUPS.
+.\" accept/reject man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsaccept 8 "CUPS" "12 February 2006" "Apple Inc."
+.TH cupsaccept 8 "CUPS" "10 June 2014" "Apple Inc."
.SH NAME
cupsaccept/cupsreject \- accept/reject jobs sent to a destination
.SH SYNOPSIS
.B cupsaccept
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
+] [
+.B \-h
.I hostname[:port]
-] destination(s)
+]
+.I destination(s)
.br
.B cupsreject
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
+] [
+.B \-h
.I hostname[:port]
-] [ -r
+] [
+.B \-r
.I reason
-] destination(s)
+]
+.I destination(s)
.SH DESCRIPTION
-\fIcupsaccept\fR instructs the printing system to accept print jobs to the
-specified destinations.
+The
+.B cupsaccept
+command instructs the printing system to accept print jobs to the specified destinations.
.LP
-\fIcupsreject\fR instructs the printing system to reject print jobs to the
-specified destinations. The \fI-r\fR option sets the reason for rejecting
-print jobs. If not specified the reason defaults to "Reason Unknown".
+The
+.B cupsreject
+command instructs the printing system to reject print jobs to the
+specified destinations.
+The \fI-r\fR option sets the reason for rejecting print jobs. If not specified, the reason defaults to "Reason Unknown".
.SH OPTIONS
-The following options are supported by both \fIcupsaccept\fR and
-\fIcupsreject\fR:
+The following options are supported by both
+.B cupsaccept
+and
+.BR cupsreject :
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--U username
-.br
+\fB-U \fIusername\fR
Sets the username that is sent when connecting to the server.
.TP 5
--h hostname[:port]
-.br
+\fB-h \fIhostname[:port]\fR
Chooses an alternate server.
.TP 5
--r "reason"
-.br
-Sets the reason string that is shown for a printer that is
-rejecting jobs.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
+\fB-r \fR"\fIreason\fR"
+Sets the reason string that is shown for a printer that is rejecting jobs.
+.SH CONFORMING TO
+The
+.B cupsaccept
+and
+.B cupsreject
+commands correspond to the System V printing system commands "accept" and "reject", respectively.
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
Also, printer and class names are \fInot\fR case-sensitive.
.LP
-The CUPS versions of \fIaccept\fR and \fIreject\fR may ask the
-user for an access password depending on the printing system
-configuration. This differs from the System V versions which
-require the root user to execute these commands.
+Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration.
.SH SEE ALSO
-\fIcancel(1)\fR, \fIcupsenable(8)\fR, \fIlp(1)\fR,
-\fIlpadmin(8)\fR, \fIlpstat(1)\fR,
+.BR cancel (1),
+.BR cupsenable (8),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpstat (1),
.br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsaccept.man 7930 2008-09-10 22:25:54Z mike $".
+.\" End of "$Id: cupsaccept.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupsaddsmb.man.in b/man/cupsaddsmb.man.in
index 335cf68..355c372 100644
--- a/man/cupsaddsmb.man.in
+++ b/man/cupsaddsmb.man.in
@@ -1,81 +1,63 @@
.\"
-.\" "$Id: cupsaddsmb.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cupsaddsmb.man.in 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupsaddsmb man page for CUPS.
+.\" cupsaddsmb man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsaddsmb 8 "CUPS" "8 July 2013" "Apple Inc."
+.TH cupsaddsmb 8 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
cupsaddsmb \- export printers to samba for windows clients
.SH SYNOPSIS
.B cupsaddsmb
-[ -H
+[
+.B \-H
.I samba-server
-] [ -U
+] [
+.B \-U
.I samba-user[%samba-password]
-] [ -h
+] [
+.B \-h
.I cups-server[:port]
-] [ -v ] -a
+] [
+.B \-v
+]
+.B \-a
.br
.B cupsaddsmb
-[ -H
+[
+.B \-H
.I samba-server
-] [ -U
+] [
+.B \-U
.I samba-user[%samba-password]
-] [ -h
+] [
+.B \-h
.I cups-server[:port]
-] [ -v ] printer [ ... printer ]
-
+] [
+.B \-v
+]
+.I printer
+[ ...
+.I 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
--H samba-server
-.br
-Specifies the SAMBA server which defaults to the CUPS server.
-.TP 5
--U samba-user[%samba-password]
-.br
-Specifies the SAMBA print admin username which defaults to your
-current username. If the username contains a percent (%)
-character, then the text following the percent is treated as the
-SAMBA password to use.
-.TP 5
--a
-.br
-Exports all known printers. Otherwise only the named printers are
-exported.
-.TP 5
--h cups-server[:port]
-.br
-Specifies a different CUPS server to use.
-.TP 5
--v
-.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
-client machines. In order to use this functionality, you must
-first configure the SAMBA \fIsmb.conf(5)\fR file to support
-printing through CUPS and provide a printer driver download
+The \fBcupsaddsmb\fR program 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.
+.SS SAMBA CONFIGURATION
+\fBcupsaddsmb\fR uses the RPC-based printing support in SAMBA to provide printer drivers and PPD files to Windows client machines.
+In order to use this functionality, you must first configure the SAMBA
+.BR smb.conf (5)
+file to support printing through CUPS and provide a printer driver download
share, as follows:
.nf
@@ -100,77 +82,50 @@ share, as follows:
guest ok = no
read only = yes
write list = root
-.fi
-.LP
-This configuration assumes a FHS-compliant installation of
-SAMBA; adjust the [printers] and [print$] share paths
-accordingly on your system as needed.
-.SH MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS
-The base driver for Windows 2000 and higher is the Microsoft
-PostScript driver, which is available on any system running
-Windows 2000 or higher in the
-%WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\W32X86\\3 folder for 32-bit
-drivers and
-%WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\X64\\3 folder for 64-bit
-drivers.
-.LP
-However, currently only Windows 2000 and higher is supported by the Microsoft
-driver, so you will also need to get the Adobe driver to support
-Windows 95, 98, and Me clients. The Adobe and Microsoft drivers
-for Windows 2000 are identical.
+.fi
+This configuration assumes a FHS-compliant installation of SAMBA; adjust the [printers] and [print$] share paths accordingly on your system as needed.
+.SS MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS
+The base driver for Windows 2000 and higher is the Microsoft PostScript driver, which is available on any system running Windows 2000 or higher in the %WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\W32X86\\3 folder for 32-bit drivers and %WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\X64\\3 folder for 64-bit drivers.
.LP
-Once you have extracted the driver files, copy the 32-bit drivers
-to the \fI/usr/share/cups/drivers\fR directory and the 64-bit
-drivers to the \fI/usr/share/cups/drivers/x64\fR directory exactly
-as named below:
+Copy the 32-bit drivers to the \fI/usr/share/cups/drivers\fR directory and the 64-bit drivers to the \fI/usr/share/cups/drivers/x64\fR directory exactly as named below:
.nf
- [Windows 2000 and higher]
ps5ui.dll
pscript.hlp
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
-Windows 95, 98, and ME, which are available for download from the
-Adobe web site (http://www.adobe.com).
-.LP
-The Adobe driver does not support the page-label, job-billing, or
-job-hold-until options.
-.LP
-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]
- ADFONTS.MFM
- ADOBEPS4.DRV
- ADOBEPS4.HLP
- 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 KNOWN ISSUES
-Getting the full set of Windows driver files should be easier.
-
+\fBNote:\fR Unlike Windows, case is significant - make sure that you use the lowercase filenames shown above, otherwise \fBcupsaddsmb\fR will fail to export the drivers.
+.SH OPTIONS
+\fBcupsaddsmb\fR supports the following options:
+.TP 5
+\fB\-H \fIsamba-server\fR
+Specifies the SAMBA server which defaults to the CUPS server.
+.TP 5
+\fB\-U \fIsamba-user\fR[\fB%\fIsamba-password\fR]
+Specifies the SAMBA print admin username which defaults to your current username.
+If the username contains a percent (%) character, then the text following the percent is treated as the SAMBA password to use.
+.TP 5
+.B \-a
+Exports all known printers.
+Otherwise only the named printers are exported.
+.TP 5
+\fB\-h \fIcups-server\fR[\fB:\fIport\fR]
+Specifies a different CUPS server to use.
+.TP 5
+.B \-v
+Specifies that verbose information should be shown.
+This is useful for debugging SAMBA configuration problems.
.SH SEE ALSO
-\fIsmbd(8)\fR, \fIsmb.conf(5)\fR,
-http://localhost:631/help
-
+.BR rpcclient (1),
+.BR smbclient (1),
+.BR smbd (8),
+.BR smb.conf (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsaddsmb.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cupsaddsmb.man.in 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupsctl.man b/man/cupsctl.man
index 8dc01b0..47ac9e2 100644
--- a/man/cupsctl.man
+++ b/man/cupsctl.man
@@ -1,97 +1,106 @@
.\"
-.\" "$Id: cupsctl.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupsctl.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupsctl man page for CUPS.
+.\" cupsctl man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsctl 8 "CUPS" "11 January 2013" "Apple Inc."
+.TH cupsctl 8 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
cupsctl \- configure cupsd.conf options
.SH SYNOPSIS
.B cupsctl
-[ -E ] [-U
-.I username
-] [ -h
-.I server[:port]
-] [ --[no-]debug-logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ]
-[ --[no-]share-printers ] [ --[no-]user-cancel-any ]
[
+.B \-E
+] [
+.B \-U
+.I username
+] [
+.B \-h
+\fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-\-\fR[\fBno\-\fR]\fBdebug\-logging\fR
+] [
+\fB\-\-\fR[\fBno\-\fR]\fBremote\-admin\fR
+] [
+\fB\-\-\fR[\fBno\-\fR]\fBremote\-any\fR
+] [
+\fB\-\-\fR[\fBno\-\fR]\fBshare\-printers\fR
+] [
+\fB\-\-\fR[\fBno\-\fR]\fBuser\-cancel\-any\fR
+] [
.I name=value
]
.SH DESCRIPTION
-\fIcupsctl\fR updates or queries the \fBcupsd.conf\fR file for a server. When
+\fBcupsctl\fR updates or queries the \fIcupsd.conf\fR file for a server. When
no changes are requested, the current configuration values are written to the
standard output in the format "name=value", one per line.
.SH OPTIONS
The following options are recognized:
.TP 5
--E
-.br
+.B \-E
Enables encryption on the connection to the scheduler.
.TP 5
--U \fIusername\fR
-.br
+\fB\-U \fIusername\fR
Specifies an alternate username to use when authenticating with the scheduler.
.TP 5
--h \fIserver[:port]\fR
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Specifies the server address.
.TP 5
---[no-]debug-logging
-.br
-Enables or disables debug logging in the \fBerror_log\fR file.
+.B \-\-\fR[\fBno\-\fR]\fBdebug\-logging
+Enables (disables) debug logging to the \fIerror_log\fR file.
.TP 5
---[no-]remote-admin
-.br
-Enables or disables remote administration.
+.B \-\-\fR[\fBno\-\fR]\fBremote\-admin
+Enables (disables) remote administration.
.TP 5
---[no-]remote-any
-.br
-Enables or disables printing from any address, e.g. the Internet.
+.B \-\-\fR[\fBno\-\fR]\fBremote\-any
+Enables (disables) printing from any address, e.g., the Internet.
.TP 5
---[no-]share-printers
-.br
-Enables or disables sharing of local printers with other computers.
+.B \-\-\fR[\fBno\-\fR]\fBshare\-printers
+Enables (disables) sharing of local printers with other computers.
.TP 5
---[no-]user-cancel-any
-.br
-Allows or prevents users from canceling jobs owned by others.
+.B \-\-\fR[\fBno\-\fR]\fBuser\-cancel\-any
+Allows (prevents) users to cancel jobs owned by others.
.SH EXAMPLES
Display the current settings:
.nf
+
cupsctl
+
.fi
-.LP
Enable debug logging:
.nf
+
cupsctl --debug-logging
+
.fi
-.LP
Get the current debug logging state:
.nf
+
cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'
+
.fi
-.LP
Disable printer sharing:
.nf
+
cupsctl --no-share-printers
.fi
.SH KNOWN ISSUES
-You cannot set the Listen or Port directives using \fIcupsctl\fR.
+You cannot set the Listen or Port directives using \fBcupsctl\fR.
.SH SEE ALSO
-\fIcupsd.conf(5)\fR, \fIcupsd(8)\fR,
+.BR cupsd.conf (5),
+.BR cupsd (8),
.br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsctl.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupsctl.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupsd-helper.man b/man/cupsd-helper.man
new file mode 100644
index 0000000..51bdc30
--- /dev/null
+++ b/man/cupsd-helper.man
@@ -0,0 +1,94 @@
+.\"
+.\" "$Id: cupsd-helper.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" cupsd-helper man page for CUPS.
+.\"
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH cupsd-helper 8 "CUPS" "15 April 2014" "Apple Inc."
+.SH NAME
+cupsd\-helper \- cupsd helper programs
+.SH SYNOPSIS
+.B cups\-deviced
+.I request-id
+.I limit
+.I user-id
+.I options
+.br
+.B cups\-driverd
+.B cat
+.I ppd-name
+.br
+.B cups\-driverd
+.B list
+.I request_id
+.I limit
+.I options
+.br
+.B cups\-exec
+.I sandbox-profile
+[
+.I \-g
+.I group-id
+] [
+.I \-n
+.I nice-value
+] [
+.I \-u
+.I user-id
+]
+.I /path/to/program
+.I argv0
+.I ...
+.I argvN
+.SH DESCRIPTION
+The \fBcupsd\-helper\fR programs perform long-running operations on behalf of the scheduler,
+.BR cupsd (8).
+The \fBcups-deviced\fR helper program runs each CUPS
+.BR backend (7)
+with no arguments in order to discover the available printers.
+.LP
+The \fBcups-driverd\fR helper program lists all available printer drivers, a subset of "matching" printer drivers, or a copy of a specific driver PPD file.
+.LP
+The \fBcups-exec\fR helper program runs backends, filters, and other programs. On OS X these programs are run in a secure sandbox.
+.SH FILES
+The \fBcups-driverd\fR program looks for PPD and driver information files in the following directories:
+.nf
+
+ \fI/Library/Printers\fR
+ \fI/opt/share/ppd\fR
+ \fI/System/Library/Printers\fR
+ \fI/usr/local/share/ppd\fR
+ \fI/usr/share/cups/drv\fR
+ \fI/usr/share/cups/model\fR
+ \fI/usr/share/ppd\fR
+.fi
+.LP
+PPD files can be compressed using the
+.BR gzip (1)
+program or placed in compressed
+.BR tar (1)
+archives to further reduce their size.
+.LP
+Driver information files must conform to the format defined in
+.BR ppdcfile (5).
+.SH SEE ALSO
+.BR backend (7),
+.BR cups (1),
+.BR cupsd (8),
+.BR cupsd.conf (5),
+.BR filter (7),
+.BR ppdcfile (5),
+CUPS Online Help (http://localhost:631/help)
+.SH COPYRIGHT
+Copyright \[co] 2007-2015 by Apple Inc.
+.\"
+.\" End of "$Id: cupsd-helper.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
diff --git a/man/cupsd-logs.man b/man/cupsd-logs.man
new file mode 100644
index 0000000..7dbb706
--- /dev/null
+++ b/man/cupsd-logs.man
@@ -0,0 +1,241 @@
+.\"
+.\" "$Id: cupsd-logs.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" cupsd-logs man page for CUPS.
+.\"
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH cupsd-logs 5 "CUPS" "11 June 2014" "Apple Inc."
+.SH NAME
+cupsd\-logs \- cupsd log files (access_log, error_log, and page_log)
+.SH DESCRIPTION
+.BR cupsd (8)
+normally maintains three log files: \fIaccess_log\fR to track requests that are submitted to the scheduler, \fIerror_log\fR to track progress and errors, and \fIpage_log\fR to track pages that are printed.
+Configuration directives in
+.BR cupsd.conf (5)
+and
+.BR cups-files.conf (5)
+control what information is logged and where it is stored.
+.SS ACCESS LOG FILE FORMAT
+The \fIaccess_log\fR file lists each HTTP resource that is accessed by a web browser or client.
+Each line is in an extended version of the so-called "Common Log Format" used by many web servers and web reporting tools:
+.nf
+
+ \fIhost group user date-time \fR"\fImethod resource version\fR" \fIstatus bytes
+ ipp-operation ipp-status\fR
+
+.fi
+For example:
+.nf
+
+ 10.0.1.2 - - [01/Dec/2005:21:50:28 +0000] "POST / HTTP/1.1" 200 317
+ CUPS-Get-Printers successful-ok-ignored-or-substituted-attributes
+ localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
+ 200 0 - -
+ localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1"
+ 200 157 CUPS-Get-Printers
+ successful-ok-ignored-or-substituted-attributes
+ localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1"
+ 200 1411 CUPS-Get-Devices -
+ localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
+ 200 6667 - -
+
+.fi
+The \fIhost\fR field will normally only be an IP address unless you have enabled the HostNameLookups directive in the \fIcupsd.conf\fR file or if the IP address corresponds to your local machine.
+.LP
+The \fIgroup\fR field always contains "-".
+.LP
+The \fIuser\fR field is the authenticated username of the requesting user.
+If no username and password is supplied for the request then this field contains "-".
+.LP
+The \fIdate-time\fR field is the date and time of the request in local time and is in the format "[DD/MON/YYYY:HH:MM:SS +ZZZZ]".
+.LP
+The \fImethod\fR field is the HTTP method used: "GET", "HEAD", "OPTIONS", "POST", or "PUT".
+"GET" requests are used to get files from the server, both for the web interface and to get configuration and log files.
+"HEAD" requests are used to get information about a resource prior to a "GET".
+"OPTIONS" requests are used to upgrade connections to TLS encryption.
+"POST" requests are used for web interface forms and IPP requests.
+"PUT" requests are used to upload configuration files.
+.LP
+The \fIresource\fR field is the filename of the requested resource.
+.LP
+The \fIversion\fR field is the HTTP specification version used by the client.
+For CUPS clients this will always be "HTTP/1.1".
+.LP
+The \fIstatus\fR field contains the HTTP result status of the request, as follows:
+.RS 5
+.TP 5
+200
+Successful operation.
+.TP 5
+201
+File created/modified successfully.
+.TP 5
+304
+The requested file has not changed.
+.TP 5
+400
+Bad HTTP request; typically this means that you have a malicious program trying to access your server.
+.TP 5
+401
+Unauthorized, authentication (username + password) is required.
+.TP 5
+403
+Access is forbidden; typically this means that a client tried to access a file or resource they do not have permission to access.
+.TP 5
+404
+The file or resource does not exist.
+.TP 5
+405
+URL access method is not allowed; typically this means you have a web browser using your server as a proxy.
+.TP 5
+413
+Request too large; typically this means that a client tried to print a file larger than the MaxRequestSize allows.
+.TP 5
+426
+Upgrading to TLS-encrypted connection.
+.TP 5
+500
+Server error; typically this happens when the server is unable to open/create a file - consult the error_log file for details.
+.TP 5
+501
+The client requested encryption but encryption support is not enabled/compiled in.
+.TP 5
+505
+HTTP version number not supported; typically this means that you have a malicious program trying to access your server.
+.RE
+.LP
+The \fIbytes\fR field contains the number of bytes in the request.
+For POST requests the bytes field contains the number of bytes of non-IPP data that is received from the client.
+.LP
+The \fIipp-operation\fR field contains either "-" for non-IPP requests or the IPP operation name for POST requests containing an IPP request.
+.LP
+The \fIipp-status\fR field contains either "-" for non-IPP requests or the IPP status code name for POST requests containing an IPP response.
+.SS ERROR LOG FILE FORMAT
+The \fIerror_log\fR file lists messages from the scheduler - errors, warnings, etc. The LogLevel directive in the
+.BR cupsd.conf (5)
+file controls which messages are logged:
+.nf
+
+ level date-time message
+
+.fi
+For example:
+.nf
+
+ I [20/May/1999:19:18:28 +0000] [Job 1] Queued on 'DeskJet' by 'mike'.
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[0]="DeskJet"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[1]="1"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[2]="mike"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[3]="myjob"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[4]="1"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[5]="media=
+ na_letter_8.5x11in sides=one-sided"
+ D [20/May/1999:19:18:28 +0000] [Job 1] argv[6]="/var/spool/cups/
+ d000001-001"
+ I [20/May/1999:19:21:02 +0000] [Job 2] Queued on 'DeskJet' by 'mike'.
+ I [20/May/1999:19:22:24 +0000] [Job 2] Canceled by 'mike'.
+
+.fi
+The \fIlevel\fR field contains the type of message:
+.TP 5
+A
+Alert message (LogLevel alert)
+.TP 5
+C
+Critical error message (LogLevel crit)
+.TP 5
+D
+Debugging message (LogLevel debug)
+.TP 5
+d
+Detailed debugging message (LogLevel debug2)
+.TP 5
+E
+Normal error message (LogLevel error)
+.TP 5
+I
+Informational message (LogLevel info)
+.TP 5
+N
+Notice message (LogLevel notice)
+.TP 5
+W
+Warning message (LogLevel warn)
+.TP 5
+X
+Emergency error message (LogLevel emerg)
+.LP
+The \fIdate-time\fR field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the \fIaccess_log\fR file.
+.LP
+The \fImessage\fR field contains a free-form textual message.
+Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID.
+.SS PAGE LOG FILE FORMAT
+The \fIpage_log\fR file lists each page or group of pages that are sent to a printer.
+By default, each line contains the following information:
+.nf
+
+ \fIprinter user job-id date-time page-number num-copies job-billing
+ job-originating-host-name job-name media sides\fR
+
+ \fIprinter user job-id date-time \fBtotal \fInum-impressions job-billing
+ job-originating-host-name job-name media sides\fR
+
+.fi
+For example the entries for a two page job called "myjob" might look like:
+.nf
+
+ DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123
+ localhost myjob na_letter_8.5x11in one-sided
+ DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123
+ localhost myjob na_letter_8.5x11in one-sided
+
+ DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
+ localhost myjob na_letter_8.5x11in one-sided
+
+.fi
+The PageLogFormat directive in the
+.BR cupsd.conf (5)
+file can be used to change this information.
+.LP
+The \fIprinter\fR field contains the name of the printer that printed the page.
+If you send a job to a printer class, this field will contain the name of the printer that was assigned the job.
+.LP
+The \fIuser\fR field contains the name of the user (the IPP requesting-user-name attribute) that submitted this file for printing.
+.LP
+The \fIjob-id\fR field contains the job number of the page being printed.
+.LP
+The \fIdate-time\fR field contains the date and time of when the page started printing.
+The format of this field is identical to the data-time field in the \fIaccess_log\fR file.
+.LP
+The \fIpage-number\fR and \fInum-copies\fR fields contain the page number and number of copies being printed of that page.
+For printers that cannot produce copies on their own, the num-copies field will always be 1.
+.LP
+Lines containing the keyword "total" have a \fInum-impressions\fR field instead which provides the total number of impressions (sides) that have been printed on for the job.
+.LP
+The \fIjob-billing\fR field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided.
+.LP
+The \fIjob-originating-host-name\fR field contains the hostname or IP address of the client that printed the job.
+.LP
+The \fIjob-name\fR field contains a copy of the job-name attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+.LP
+The \fImedia\fR field contains a copy of the media or media-col/media-size attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+.LP
+The \fIsides\fR field contains a copy of the sides attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+.SH SEE ALSO
+.BR cupsd (8),
+.BR cupsd.conf (5),
+.BR cups-files.conf (5),
+CUPS Online Help (http://localhost:631/help)
+.SH COPYRIGHT
+Copyright \[co] 2007-2015 by Apple Inc.
+.\"
+.\" End of "$Id: cupsd-logs.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
diff --git a/man/cupsd.conf.man.in b/man/cupsd.conf.man.in
index c362d09..9d38954 100644
--- a/man/cupsd.conf.man.in
+++ b/man/cupsd.conf.man.in
@@ -1,525 +1,876 @@
.\"
-.\" "$Id: cupsd.conf.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cupsd.conf.man.in 12767 2015-06-30 15:57:39Z msweet $"
.\"
-.\" cupsd.conf man page for CUPS.
+.\" cupsd.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsd.conf 5 "CUPS" "19 November 2012" "Apple Inc."
+.TH cupsd.conf 5 "CUPS" "30 June 2015" "Apple Inc."
.SH NAME
cupsd.conf \- server configuration file for cups
.SH DESCRIPTION
-The \fIcupsd.conf\fR file configures the CUPS scheduler, \fIcupsd(8)\fR. It
-is normally located in the \fI@CUPS_SERVERROOT@\fR directory. \fBNote:\fR
-File, directory, and user configuration directives that used to be allowed in
-the \fIcupsd.conf\fR file are now stored in the \fIcups-files.conf(5)\fR instead
-in order to prevent certain types of privilege escalation attacks.
+The
+.I cupsd.conf
+file configures the CUPS scheduler,
+.BR cupsd (8).
+It is normally located in the
+.I /etc/cups
+directory.
+\fBNote:\fR File, directory, and user configuration directives that used to be allowed in the \fBcupsd.conf\fR file are now stored in the
+.BR cups-files.conf (5)
+file instead in order to prevent certain types of privilege escalation attacks.
.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character. The
-configuration directives are intentionally similar to those used by the
-popular Apache web server software and are described below.
-.SH DIRECTIVES
-The following directives are understood by \fIcupsd(8)\fR. Consult the
-on-line help for detailed descriptions:
+Each line in the file can be a configuration directive, a blank line, or a comment.
+Configuration directives typically consist of a name and zero or more values separated by whitespace.
+The configuration directive name and values are case-insensitive.
+Comment lines start with the # character.
+.SS TOP-LEVEL DIRECTIVES
+The following top-level directives are understood by
+.BR cupsd (8):
+.\"#AccessLogLevel
.TP 5
-AccessLogLevel config
+\fBAccessLogLevel config\fR
.TP 5
-AccessLogLevel actions
+\fBAccessLogLevel actions\fR
.TP 5
-AccessLogLevel all
-.br
+\fBAccessLogLevel all\fR
Specifies the logging level for the AccessLog file.
+The "config" level logs when printers and classes are added, deleted, or modified and when configuration files are accessed or updated.
+The "actions" level logs when print jobs are submitted, held, released, modified, or canceled, and any of the conditions for "config".
+The "all" level logs all requests.
+The default access log level is "actions".
+.\"#AutoPurgeJobs
.TP 5
-Allow all
+\fBAutoPurgeJobs Yes\fR
.TP 5
-Allow none
+\fBAutoPurgeJobs No\fR
+.br
+Specifies whether to purge job history data automatically when it is no longer required for quotas.
+The default is "No".
+.\"#BrowseLocalProtocols
.TP 5
-Allow host.domain.com
+\fBBrowseLocalProtocols all\fR
.TP 5
-Allow *.domain.com
+\fBBrowseLocalProtocols dnssd\fR
.TP 5
-Allow ip-address
+\fBBrowseLocalProtocols none\fR
+Specifies which protocols to use for local printer sharing.
+The default is "dnssd" on systems that support Bonjour and "none" otherwise.
+.\"#BrowseWebIF
.TP 5
-Allow ip-address/netmask
+\fBBrowseWebIF Yes\fR
.TP 5
-Allow ip-address/mm
+\fBBrowseWebIF No\fR
+.br
+Specifies whether the CUPS web interface is advertised.
+The default is "No".
+.\"#Browsing
.TP 5
-Allow @IF(name)
+\fBBrowsing Yes\fR
.TP 5
-Allow @LOCAL
+\fBBrowsing No\fR
.br
-Allows access from the named hosts or addresses.
+Specifies whether shared printers are advertised.
+The default is "No".
+.\"#Classification
.TP 5
-AuthType None
+\fBClassification \fIbanner\fR
+.br
+Specifies the security classification of the server.
+Any valid banner name can be used, including "classified", "confidential", "secret", "topsecret", and "unclassified", or the banner can be omitted to disable secure printing functions.
+The default is no classification banner.
+.\"#ClassifyOverride
.TP 5
-AuthType Basic
+\fBClassifyOverride Yes\fR
.TP 5
-AuthType BasicDigest
+\fBClassifyOverride No\fR
+.br
+Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option.
+The default is "No".
+.\"#DefaultAuthType
.TP 5
-AuthType Digest
+\fBDefaultAuthType Basic\fR
.TP 5
-AuthType Negotiate
+\fBDefaultAuthType Negotiate\fR
.br
-Specifies the authentication type (None, Basic, BasicDigest, Digest, Negotiate)
+Specifies the default type of authentication to use.
+The default is "Basic".
+.\"#DefaultEncryption
.TP 5
-AutoPurgeJobs Yes
+\fBDefaultEncryption Never\fR
.TP 5
-AutoPurgeJobs No
-.br
-Specifies whether to purge job history data automatically when
-it is no longer required for quotas.
+\fBDefaultEncryption IfRequested\fR
.TP 5
-BrowseLocalProtocols [All] [DNSSD]
-.br
-Specifies the protocols to use for local printer sharing.
+\fBDefaultEncryption Required\fR
+Specifies whether encryption will be used for authenticated requests.
+The default is "Required".
+.\"#DefaultLanguage
.TP 5
-BrowseWebIF Yes
+\fBDefaultLanguage \fIlocale\fR
+Specifies the default language to use for text and web content.
+The default is "en".
+.\"#DefaultPaperSize
.TP 5
-BrowseWebIF No
-.br
-Specifies whether the CUPS web interface is advertised via DNS-SD.
+\fBDefaultPaperSize Auto\fR
.TP 5
-Browsing Yes
+\fBDefaultPaperSize None\fR
.TP 5
-Browsing No
-.br
-Specifies whether or not shared printers should be advertised.
+\fBDefaultPaperSize \fIsizename\fR
+Specifies the default paper size for new print queues. "Auto" uses a locale-specific default, while "None" specifies there is no default paper size.
+Specific size names are typically "Letter" or "A4".
+The default is "Auto".
+.\"#DefaultPolicy
.TP 5
-Classification banner
-.br
-Specifies the security classification of the server.
+\fBDefaultPolicy \fIpolicy-name\fR
+Specifies the default access policy to use.
+The default access policy is "default".
+.\"#DefaultShared
.TP 5
-ClassifyOverride Yes
+\fBDefaultShared Yes\fR
.TP 5
-ClassifyOverride No
-.br
-Specifies whether to allow users to override the classification
-of individual print jobs.
+\fBDefaultShared No\fR
+Specifies whether local printers are shared by default.
+The default is "Yes".
+.\"#DirtyCleanInterval
+.TP 5
+\fBDirtyCleanInterval \fIseconds\fR
+Specifies the delay for updating of configuration and state files.
+A value of 0 causes the update to happen as soon as possible, typically within a few milliseconds.
+The default value is "30".
+.\"#ErrorPolicy
+.TP 5
+\fBErrorPolicy abort-job\fR
+Specifies that a failed print job should be aborted (discarded) unless otherwise specified for the printer.
+.TP 5
+\fBErrorPolicy retry-job\fR
+Specifies that a failed print job should be retried at a later time unless otherwise specified for the printer.
+.TP 5
+\fBErrorPolicy retry-this-job\fR
+Specifies that a failed print job should be retried immediately unless otherwise specified for the printer.
+.TP 5
+\fBErrorPolicy stop-printer\fR
+Specifies that a failed print job should stop the printer unless otherwise specified for the printer. The 'stop-printer' error policy is the default.
+.\"#FilterLimit
+.TP 5
+\fBFilterLimit \fIlimit\fR
+Specifies the maximum cost of filters that are run concurrently, which can be used to minimize disk, memory, and CPU resource problems.
+A limit of 0 disables filter limiting.
+An average print to a non-PostScript printer needs a filter limit of about 200.
+A PostScript printer needs about half that (100).
+Setting the limit below these thresholds will effectively limit the scheduler to printing a single job at any time.
+The default limit is "0".
+.\"#FilterNice
+.TP 5
+\fBFilterNice \fInice-value\fR
+Specifies the scheduling priority (
+.BR nice (8)
+value) of filters that are run to print a job.
+The nice value ranges from 0, the highest priority, to 19, the lowest priority.
+The default is 0.
+.\"#GSSServiceName
+.TP 5
+\fBGSSServiceName \fIname\fR
+Specifies the service name when using Kerberos authentication.
+The default service name is "http."
+.TP 5
+.\"#HostNameLookups
+\fBHostNameLookups On\fR
+.TP 5
+\fBHostNameLookups Off\fR
+.TP 5
+\fBHostNameLookups Double\fR
+Specifies whether to do reverse lookups on connecting clients.
+The "Double" setting causes
+.BR cupsd (8)
+to verify that the hostname resolved from the address matches one of the addresses returned for that hostname.
+Double lookups also prevent clients with unregistered addresses from connecting to your server.
+The default is "Off" to avoid the potential server performance problems with hostname lookups.
+Only set this option to "On" or "Double" if absolutely required.
+.\"#JobKillDelay
+.TP 5
+\fBJobKillDelay \fIseconds\fR
+Specifies the number of seconds to wait before killing the filters and backend associated with a canceled or held job.
+The default is "30".
+.\"#JobRetryInterval
+.TP 5
+\fBJobRetryInterval \fIseconds\fR
+Specifies the interval between retries of jobs in seconds.
+This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job".
+The default is "30".
+.\"#JobRetryLimit
.TP 5
-DefaultAuthType Basic
+\fBJobRetryLimit \fIcount\fR
+Specifies the number of retries that are done for jobs.
+This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job".
+The default is "5".
+.\"#KeepAlive
.TP 5
-DefaultAuthType BasicDigest
+\fBKeepAlive Yes\fR
.TP 5
-DefaultAuthType Digest
+\fBKeepAlive No\fR
+Specifies whether to support HTTP keep-alive connections.
+The default is "Yes".
+.\"#KeepAliveTimeout
.TP 5
-DefaultAuthType Negotiate
-.br
-Specifies the default type of authentication to use.
+\fBKeepAliveTimeout \fIseconds\fR
+Specifies how long an idle client connection remains open.
+The default is "30".
+.\"#LimitIPP
.TP 5
-DefaultEncryption Never
+\fB<Limit \fIoperation \fR...\fB> \fR... \fB</Limit>\fR
+Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATIONS".
+.\"#Limit
.TP 5
-DefaultEncryption IfRequested
+\fB<Limit \fImethod \fR...\fB> \fR... \fB</Limit>\fR
+.\"#LimitExcept
.TP 5
-DefaultEncryption Required
-.br
-Specifies the type of encryption to use for authenticated requests.
+\fB<LimitExcept \fImethod \fR...\fB> \fR... \fB</LimitExcept>\fR
+Specifies the HTTP methods that are being limited inside a Location section. HTTP method names are listed below in the section "HTTP METHODS".
+.\"#LimitRequestBody
.TP 5
-DefaultLanguage locale
-.br
-Specifies the default language to use for text and web content.
+\fBLimitRequestBody \fIsize\fR
+Specifies the maximum size of print files, IPP requests, and HTML form data.
+The default is "0" which disables the limit check.
+.\"#Listen
.TP 5
-DefaultPaperSize Auto
+\fBListen \fIipv4-address\fB:\fIport\fR
.TP 5
-DefaultPaperSize None
+\fBListen [\fIipv6-address\fB]:\fIport\fR
.TP 5
-DefaultPaperSize sizename
-.br
-Specifies the default paper size for new print queues. "Auto" uses a locale-
-specific default, while "None" specifies there is no default paper size.
+\fBListen *:\fIport\fR
.TP 5
-DefaultPolicy policy-name
-.br
-Specifies the default access policy to use.
+\fBListen \fI/path/to/domain/socket\fR
+Listens to the specified address and port or domain socket path for connections.
+Multiple Listen directives can be provided to listen on multiple addresses.
+The Listen directive is similar to the Port directive but allows you to restrict access to specific interfaces or networks.
+.\"#ListenBackLog
.TP 5
-DefaultShared Yes
+\fBListenBackLog \fInumber\fR
+Specifies the number of pending connections that will be allowed.
+This normally only affects very busy servers that have reached the MaxClients limit, but can also be triggered by large numbers of simultaneous connections.
+When the limit is reached, the operating system will refuse additional connections until the scheduler can accept the pending ones.
+The default is the OS-defined default limit, typically either "5" for older operating systems or "128" for newer operating systems.
+.\"#Location
.TP 5
-DefaultShared No
-.br
-Specifies whether local printers are shared by default.
+\fB<Location \fI/path\fB> \fR... \fB</Location>\fR
+Specifies access control for the named location.
+Paths are documented below in the section "LOCATION PATHS".
+.\"#LogDebugHistory
.TP 5
-Deny all
+\fBLogDebugHistory \fInumber\fR
+Specifies the number of debugging messages that are retained for logging if an error occurs in a print job. Debug messages are logged regardless of the LogLevel setting.
+.\"#LogLevel
.TP 5
-Deny none
+\fBLogLevel \fRnone
.TP 5
-Deny host.domain.com
+\fBLogLevel \fRemerg
.TP 5
-Deny *.domain.com
+\fBLogLevel \fRalert
.TP 5
-Deny ip-address
+\fBLogLevel \fRcrit
.TP 5
-Deny ip-address/netmask
+\fBLogLevel \fRerror
.TP 5
-Deny ip-address/mm
+\fBLogLevel \fRwarn
.TP 5
-Deny @IF(name)
+\fBLogLevel \fRnotice
.TP 5
-Deny @LOCAL
-.br
-Denies access to the named host or address.
+\fBLogLevel \fRinfo
.TP 5
-DirtyCleanInterval seconds
-.br
-Specifies the delay for updating of configuration and state files. A value of 0
-causes the update to happen as soon as possible, typically within a few
-milliseconds.
+\fBLogLevel \fRdebug
.TP 5
-Encryption IfRequested
+\fBLogLevel \fRdebug2
+Specifies the level of logging for the ErrorLog file.
+The value "none" stops all logging while "debug2" logs everything.
+The default is "warn".
+.\"#LogTimeFormat
.TP 5
-Encryption Never
+\fBLogTimeFormat \fRstandard
.TP 5
-Encryption Required
-.br
-Specifies the level of encryption that is required for a particular
-location.
+\fBLogTimeFormat \fRusecs
+Specifies the format of the date and time in the log files.
+The value "standard" is the default and logs whole seconds while "usecs" logs microseconds.
+.\"#MaxClients
.TP 5
-FilterLimit limit
-.br
-Specifies the maximum cost of filters that are run concurrently.
+\fBMaxClients \fInumber\fR
+Specifies the maximum number of simultaneous clients that are allowed by the scheduler.
+The default is "100".
+.\"#MaxClientPerHost
.TP 5
-FilterNice nice-value
-.br
-Specifies the scheduling priority ("nice" value) of filters that
-are run to print a job.
+\fBMaxClientsPerHost \fInumber\fR
+Specifies the maximum number of simultaneous clients that are allowed from a
+single address.
+The default is the MaxClients value.
+.\"#MaxCopies
.TP 5
-GSSServiceName name
-.br
-Specifies the service name when using Kerberos authentication. The default
-service name is "@CUPS_DEFAULT_GSSSERVICENAME@".
+\fBMaxCopies \fInumber\fR
+Specifies the maximum number of copies that a user can print of each job.
+The default is "9999".
+.\"#MaxHoldTime
+.TP 5
+\fBMaxHoldTime \fIseconds\fR
+Specifies the maximum time a job may remain in the "indefinite" hold state before it is canceled.
+The default is "0" which disables cancellation of held jobs.
+.\"#MaxJobs
+.TP 5
+\fBMaxJobs \fInumber\fR
+Specifies the maximum number of simultaneous jobs that are allowed.
+Set to "0" to allow an unlimited number of jobs.
+The default is "500".
+.\"#MaxJobsPerPrinter
+.TP 5
+\fBMaxJobsPerPrinter \fInumber\fR
+Specifies the maximum number of simultaneous jobs that are allowed per printer.
+The default is "0" which allows up to MaxJobs jobs per printer.
+.\"#MaxJobsPerUser
+.TP 5
+\fBMaxJobsPerUser \fInumber\fR
+Specifies the maximum number of simultaneous jobs that are allowed per user.
+The default is "0" which allows up to MaxJobs jobs per user.
+.\"#MaxJobTime
+.TP 5
+\fBMaxJobTime \fIseconds\fR
+Specifies the maximum time a job may take to print before it is canceled.
+Set to "0" to disable cancellation of "stuck" jobs.
+The default is "10800" (3 hours).
+.\"#MaxLogSize
+.TP 5
+\fBMaxLogSize \fIsize\fR
+Specifies the maximum size of the log files before they are rotated.
+The value "0" disables log rotation.
+The default is "1048576" (1MB).
+.\"#MultipleOperationTimeout
+.TP 5
+\fBMultipleOperationTimeout \fIseconds\fR
+Specifies the maximum amount of time to allow between files in a multiple file print job.
+The default is "300" (5 minutes).
+.\"#PageLogFormat
+.TP 5
+\fBPageLogFormat \fIformat-string\fR
+Specifies the format of PageLog lines.
+Sequences beginning with percent (%) characters are replaced with the corresponding information, while all other characters are copied literally.
+The following percent sequences are recognized:
+.nf
+
+ "%%" inserts a single percent character.
+ "%{name}" inserts the value of the specified IPP attribute.
+ "%C" inserts the number of copies for the current page.
+ "%P" inserts the current page number.
+ "%T" inserts the current date and time in common log format.
+ "%j" inserts the job ID.
+ "%p" inserts the printer name.
+ "%u" inserts the username.
+
+.fi
+The default is the empty string, which disables page logging.
+The string "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}" creates a page log with the standard items.
+.\"#PassEnv
+.TP 5
+\fBPassEnv \fIvariable \fR[ ... \fIvariable \fR]
+Passes the specified environment variable(s) to child processes.
+.\"#Policy
.TP 5
-HostNameLookups On
+\fB<Policy \fIname\fB> \fR... \fB</Policy>\fR
+Specifies access control for the named policy.
+.\"#Port
.TP 5
-HostNameLookups Off
+\fBPort \fInumber\fR
+Listens to the specified port number for connections.
+.\"#PreserveJobFiles
.TP 5
-HostNameLookups Double
-.br
-Specifies whether or not to do reverse lookups on client addresses.
+\fBPreserveJobFiles Yes\fR
.TP 5
-Include filename
-.br
-Includes the named file.
+\fBPreserveJobFiles No\fR
.TP 5
-JobKillDelay seconds
-.br
-Specifies the number of seconds to wait before killing the filters and backend
-associated with a canceled or held job.
+\fBPreserveJobFiles \fIseconds\fR
+Specifies whether job files (documents) are preserved after a job is printed.
+If a numeric value is specified, job files are preserved for the indicated number of seconds after printing.
+The default is "86400" (preserve 1 day).
+.\"#PreserveJobHistory
.TP 5
-JobPrivateAccess all
+\fBPreserveJobHistory Yes\fR
.TP 5
-JobPrivateAccess default
+\fBPreserveJobHistory No\fR
.TP 5
-JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-.br
-Specifies an access list for a job's private values. The "default" access list
-is "@OWNER @SYSTEM". "@ACL" maps to the printer's requesting-user-name-allowed
-or requesting-user-name-denied values.
+\fBPreserveJobHistory \fIseconds\fR
+Specifies whether the job history is preserved after a job is printed.
+If a numeric value is specified, the job history is preserved for the indicated number of seconds after printing.
+If "Yes", the job history is preserved until the MaxJobs limit is reached.
+The default is "Yes".
+.\"#ReloadTimeout
.TP 5
-JobPrivateValues all
+\fBReloadTimeout \fIseconds\fR
+Specifies the amount of time to wait for job completion before restarting the scheduler.
+The default is "30".
+.\"#RIPCache
.TP 5
-JobPrivateValues default
+\fBRIPCache \fIsize\fR
+Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer.
+The default is "128m".
+.\"#ServerAdmin
.TP 5
-JobPrivateValues none
+\fBServerAdmin \fIemail-address\fR
+Specifies the email address of the server administrator.
+The default value is "root@ServerName".
+.\"#ServerAlias
.TP 5
-JobPrivateValues attribute-name-1 [ ... attribute-name-N ]
-Specifies the list of job values to make private. The "default" values are
-"job-name", "job-originating-host-name", and "job-originating-user-name".
+\fBServerAlias \fIhostname \fR[ ... \fIhostname \fR]
.TP 5
-JobRetryInterval seconds
-.br
-Specifies the interval between retries of jobs in seconds.
+\fBServerAlias *\fR
+The ServerAlias directive is used for HTTP Host header validation when clients connect to the scheduler from external interfaces.
+Using the special name "*" can expose your system to known browser-based DNS rebinding attacks, even when accessing sites through a firewall.
+If the auto-discovery of alternate names does not work, we recommend listing each alternate name with a ServerAlias directive instead of using "*".
+.\"#ServerName
.TP 5
-JobRetryLimit count
-.br
-Specifies the number of retries that are done for jobs.
+\fBServerName \fIhostname\fR
+Specifies the fully-qualified hostname of the server.
+The default is the value reported by the
+.BR hostname (1)
+command.
+.\"#ServerTokens
.TP 5
-KeepAlive Yes
+\fBServerTokens None\fR
.TP 5
-KeepAlive No
-.br
-Specifies whether to support HTTP keep-alive connections.
+\fBServerTokens ProductOnly\fR
.TP 5
-KeepAliveTimeout seconds
-.br
-Specifies the amount of time that connections are kept alive.
+\fBServerTokens Major\fR
.TP 5
-<Limit operations> ... </Limit>
-.br
-Specifies the IPP operations that are being limited inside a policy.
+\fBServerTokens Minor\fR
.TP 5
-<Limit methods> ... </Limit>
+\fBServerTokens Minimal\fR
.TP 5
-<LimitExcept methods> ... </LimitExcept>
-.br
-Specifies the HTTP methods that are being limited inside a location.
+\fBServerTokens OS\fR
.TP 5
-LimitRequestBody
-.br
-Specifies the maximum size of any print job request.
+\fBServerTokens Full\fR
+Specifies what information is included in the Server header of HTTP responses.
+"None" disables the Server header.
+"ProductOnly" reports "CUPS".
+"Major" reports "CUPS 2".
+"Minor" reports "CUPS 2.0".
+"Minimal" reports "CUPS 2.0.0".
+"OS" reports "CUPS 2.0.0 (UNAME)" where UNAME is the output of the
+.BR uname (1)
+command.
+"Full" reports "CUPS 2.0.0 (UNAME) IPP/2.0".
+The default is "Minimal".
+.\"#SetEnv
.TP 5
-Listen ip-address:port
+\fBSetEnv \fIvariable value\fR
+Set the specified environment variable to be passed to child processes.
+.\"#SSLListen
.TP 5
-Listen *:port
+\fBSSLListen \fIipv4-address\fB:\fIport\fR
.TP 5
-Listen /path/to/domain/socket
-.br
-Listens to the specified address and port or domain socket path.
+\fBSSLListen [\fIipv6-address\fB]:\fIport\fR
.TP 5
-<Location /path> ... </Location>
-.br
-Specifies access control for the named location.
+\fBSSLListen *:\fIport\fR
+Listens on the specified address and port for encrypted connections.
+.\"#SSLOptions
.TP 5
-LogDebugHistory #-messages
-.br
-Specifies the number of debugging messages that are logged when an error
-occurs in a print job.
+\fBSSLOptions \fR[\fIAllowRC4\fR] [\fIAllowSSL3\fR]
.TP 5
-LogLevel alert
+\fBSSLOptions None\fR
+Sets encryption options.
+By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites.
+The \fIAllowRC4\fR option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The \fIAllowSSL3\fR option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+.\"#SSLPort
.TP 5
-LogLevel crit
+\fBSSLPort \fIport\fR
+Listens on the specified port for encrypted connections.
+.\"#StrictConformance
.TP 5
-LogLevel debug2
+\fBStrictConformance Yes\fR
.TP 5
-LogLevel debug
+\fBStrictConformance No\fR
+Specifies whether the scheduler requires clients to strictly adhere to the IPP specifications.
+The default is "No".
+.\"#Timeout
.TP 5
-LogLevel emerg
+\fBTimeout \fIseconds\fR
+Specifies the HTTP request timeout.
+The default is "300" (5 minutes).
+.\"#WebInterface
.TP 5
-LogLevel error
+\fBWebInterface yes\fR
.TP 5
-LogLevel info
+\fBWebInterface no\fR
+Specifies whether the web interface is enabled.
+The default is "No".
+.SS HTTP METHOD NAMES
+The following HTTP methods are supported by
+.BR cupsd (8):
.TP 5
-LogLevel none
+GET
+Used by a client to download icons and other printer resources and to access the CUPS web interface.
.TP 5
-LogLevel notice
+HEAD
+Used by a client to get the type, size, and modification date of resources.
.TP 5
-LogLevel warn
-.br
-Specifies the logging level for the ErrorLog file.
+OPTIONS
+Used by a client to establish a secure (SSL/TLS) connection.
.TP 5
-LogTimeFormat standard
+POST
+Used by a client to submit IPP requests and HTML forms from the CUPS web interface.
.TP 5
-LogTimeFormat usecs
-.br
-Specifies the format of the date and time in the log files.
+PUT
+Used by a client to upload configuration files.
+.SS IPP OPERATION NAMES
+The following IPP operations are supported by
+.BR cupsd (8):
.TP 5
-MaxClients number
-.br
-Specifies the maximum number of simultaneous clients to support.
+CUPS\-Accept\-Jobs
+Allows a printer to accept new jobs.
.TP 5
-MaxClientsPerHost number
-.br
-Specifies the maximum number of simultaneous clients to support from a
-single address.
+CUPS\-Add\-Modify\-Class
+Adds or modifies a printer class.
.TP 5
-MaxCopies number
-.br
-Specifies the maximum number of copies that a user can print of each job.
+CUPS\-Add\-Modify\-Printer
+Adds or modifies a printer.
.TP 5
-MaxHoldTime seconds
-.br
-Specifies the maximum time a job may remain in the "indefinite" hold state
-before it is canceled. Set to 0 to disable cancellation of held jobs.
+CUPS\-Authenticate\-Job
+Releases a job that is held for authentication.
.TP 5
-MaxJobs number
-.br
-Specifies the maximum number of simultaneous jobs to support.
+CUPS\-Delete\-Class
+Deletes a printer class.
.TP 5
-MaxJobsPerPrinter number
-.br
-Specifies the maximum number of simultaneous jobs per printer to support.
+CUPS\-Delete\-Printer
+Deletes a printer.
.TP 5
-MaxJobsPerUser number
-.br
-Specifies the maximum number of simultaneous jobs per user to support.
+CUPS\-Get\-Classes
+Gets a list of printer classes.
.TP 5
-MaxJobTime seconds
-.br
-Specifies the maximum time a job may take to print before it is canceled. The
-default is 10800 seconds (3 hours). Set to 0 to disable cancellation of "stuck"
-jobs.
+CUPS\-Get\-Default
+Gets the server default printer or printer class.
.TP 5
-MaxLogSize number-bytes
-.br
-Specifies the maximum size of the log files before they are
-rotated (0 to disable rotation)
+CUPS\-Get\-Devices
+Gets a list of devices that are currently available.
.TP 5
-MaxRequestSize number-bytes
-.br
-Specifies the maximum request/file size in bytes (0 for no limit)
+CUPS\-Get\-Document
+Gets a document file for a job.
.TP 5
-MultipleOperationTimeout seconds
-.br
-Specifies the maximum amount of time to allow between files in a multiple file
-print job.
+CUPS\-Get\-PPD
+Gets a PPD file.
.TP 5
-Order allow,deny
+CUPS\-Get\-PPDs
+Gets a list of installed PPD files.
.TP 5
-Order deny,allow
-.br
-Specifies the order of HTTP access control (allow,deny or deny,allow)
+CUPS\-Get\-Printers
+Gets a list of printers.
.TP 5
-PageLogFormat format string
-.br
-Specifies the format of page log lines.
+CUPS\-Move\-Job
+Moves a job.
.TP 5
-PassEnv variable [... variable]
-.br
-Passes the specified environment variable(s) to child processes.
+CUPS\-Reject\-Jobs
+Prevents a printer from accepting new jobs.
.TP 5
-<Policy name> ... </Policy>
-.br
-Specifies access control for the named policy.
+CUPS\-Set\-Default
+Sets the server default printer or printer class.
.TP 5
-Port number
-.br
-Specifies a port number to listen to for HTTP requests.
+Cancel\-Job
+Cancels a job.
.TP 5
-PreserveJobFiles Yes
+Cancel\-Jobs
+Cancels one or more jobs.
.TP 5
-PreserveJobFiles No
-.br
-Specifies whether or not to preserve job files after they are printed.
+Cancel\-My\-Jobs
+Cancels one or more jobs creates by a user.
.TP 5
-PreserveJobHistory Yes
+Cancel\-Subscription
+Cancels a subscription.
.TP 5
-PreserveJobHistory No
-.br
-Specifies whether or not to preserve the job history after they are
-printed.
+Close\-Job
+Closes a job that is waiting for more documents.
.TP 5
-PrintcapFormat bsd
+Create\-Job
+Creates a new job with no documents.
.TP 5
-PrintcapFormat plist
+Create\-Job\-Subscriptions
+Creates a subscription for job events.
.TP 5
-PrintcapFormat solaris
-.br
-Specifies the format of the printcap file.
+Create\-Printer\-Subscriptions
+Creates a subscription for printer events.
.TP 5
-ReloadTimeout seconds
-.br
-Specifies the amount of time to wait for job completion before
-restarting the scheduler.
+Get\-Job\-Attributes
+Gets information about a job.
.TP 5
-Require group group-name-list
+Get\-Jobs
+Gets a list of jobs.
.TP 5
-Require user user-name-list
+Get\-Notifications
+Gets a list of event notifications for a subscription.
.TP 5
-Require valid-user
-.br
-Specifies that user or group authentication is required.
+Get\-Printer\-Attributes
+Gets information about a printer or printer class.
.TP 5
-RIPCache bytes
-.br
-Specifies the maximum amount of memory to use when converting images
-and PostScript files to bitmaps for a printer.
+Get\-Subscription\-Attributes
+Gets information about a subscription.
.TP 5
-Satisfy all
+Get\-Subscriptions
+Gets a list of subscriptions.
.TP 5
-Satisfy any
-.br
-Specifies whether all or any limits set for a Location must be
-satisfied to allow access.
+Hold\-Job
+Holds a job from printing.
.TP 5
-ServerAdmin user@domain.com
-.br
-Specifies the email address of the server administrator.
+Hold\-New\-Jobs
+Holds all new jobs from printing.
.TP 5
-ServerAlias hostname [... hostname]
+Pause\-Printer
+Stops processing of jobs by a printer or printer class.
.TP 5
-ServerAlias *
-.br
-Specifies an alternate name that the server is known by. The special name "*"
-allows any name to be used.
+Pause\-Printer\-After\-Current\-Job
+Stops processing of jobs by a printer or printer class after the current job is finished.
.TP 5
-ServerName hostname-or-ip-address
-.br
-Specifies the fully-qualified hostname of the server.
+Print\-Job
+Creates a new job with a single document.
.TP 5
-ServerTokens Full
+Purge\-Jobs
+Cancels one or more jobs and deletes the job history.
.TP 5
-ServerTokens Major
+Release\-Held\-New\-Jobs
+Allows previously held jobs to print.
.TP 5
-ServerTokens Minimal
+Release\-Job
+Allows a job to print.
.TP 5
-ServerTokens Minor
+Renew\-Subscription
+Renews a subscription.
.TP 5
-ServerTokens None
+Restart\-Job
+Reprints a job, if possible.
.TP 5
-ServerTokens OS
+Send\-Document
+Adds a document to a job.
.TP 5
-ServerTokens ProductOnly
-.br
-Specifies what information is included in the Server header of HTTP
-responses.
+Set\-Job\-Attributes
+Changes job information.
.TP 5
-SetEnv variable value
-.br
-Set the specified environment variable to be passed to child processes.
+Set\-Printer\-Attributes
+Changes printer or printer class information.
.TP 5
-SSLListen
-.br
-Listens on the specified address and port for encrypted connections.
+Validate\-Job
+Validates options for a new job.
+.SS LOCATION PATHS
+The following paths are commonly used when configuring
+.BR cupsd (8):
.TP 5
-SSLOptions None
+/
+The path for all get operations (get-printers, get-jobs, etc.)
.TP 5
-SSLOptions NoEmptyFragments
-.br
-Sets SSL/TLS protocol options for encrypted connections.
+/admin
+The path for all administration operations (add-printer, delete-printer, start-printer, etc.)
.TP 5
-SSLPort
-.br
-Listens on the specified port for encrypted connections.
+/admin/conf
+The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)
.TP 5
-StrictConformance Yes
+/admin/log
+The path for access to the CUPS log files (access_log, error_log, page_log)
.TP 5
-StrictConformance No
-.br
-Specifies whether the scheduler requires clients to strictly adhere to the IPP
-specifications. The default is No.
+/classes
+The path for all printer classes
.TP 5
-SubscriptionPrivateAccess all
+/classes/name
+The resource for the named printer class
.TP 5
-SubscriptionPrivateAccess default
+/jobs
+The path for all jobs (hold-job, release-job, etc.)
.TP 5
-SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-.br
-Specifies an access list for a subscription's private values. The "default"
-access list is "@OWNER @SYSTEM". "@ACL" maps to the printer's
-requesting-user-name-allowed or requesting-user-name-denied values.
+/jobs/id
+The path for the specified job.
.TP 5
-SubscriptionPrivateValues all
+/printers
+The path for all printers
.TP 5
-SubscriptionPrivateValues default
+/printers/name
+The path for the named printer
.TP 5
-SubscriptionPrivateValues none
+/printers/name.png
+The icon file path for the named printer
.TP 5
-SubscriptionPrivateValues attribute-name-1 [ ... attribute-name-N ]
-Specifies the list of job values to make private. The "default" values are
-"notify-events", "notify-pull-method", "notify-recipient-uri",
-"notify-subscriber-user-name", and "notify-user-data".
+/printers/name.ppd
+The PPD file path for the named printer
+.SS DIRECTIVES VALID WITHIN LOCATION AND LIMIT SECTIONS
+The following directives may be placed inside Location and Limit sections in the \fBcupsd.conf\fR file:
.TP 5
-Timeout seconds
-.br
-Specifies the HTTP request timeout in seconds.
+\fBAllow all\fR
.TP 5
-WebInterface yes
+\fBAllow none\fR
.TP 5
-WebInterface no
-Specifies whether the web interface is enabled.
+\fBAllow \fIhost.domain.com\fR
+.TP 5
+\fBAllow *.\fIdomain.com\fR
+.TP 5
+\fBAllow \fIipv4-address\fR
+.TP 5
+\fBAllow \fIipv4-address\fB/\fInetmask\fR
+.TP 5
+\fBAllow \fIipv4-address\fB/\fImm\fR
+.TP 5
+\fBAllow [\fIipv6-address\fB]\fR
+.TP 5
+\fBAllow [\fIipv6-address\fB]/\fImm\fR
+.TP 5
+\fBAllow @IF(\fIname\fB)\fR
+.TP 5
+\fBAllow @LOCAL\fR
+Allows access from the named hosts, domains, addresses, or interfaces.
+The Order directive controls whether Allow lines are evaluated before or after Deny lines.
+.TP 5
+\fBAuthType None\fR
+.TP 5
+\fBAuthType Basic\fR
+.TP 5
+\fBAuthType Default\fR
+.TP 5
+\fBAuthType Negotiate\fR
+Specifies the type of authentication required.
+The value "Default" corresponds to the DefaultAuthType value.
+.TP 5
+\fBDeny all\fR
+.TP 5
+\fBDeny none\fR
+.TP 5
+\fBDeny \fIhost.domain.com\fR
+.TP 5
+\fBDeny *.\fIdomain.com\fR
+.TP 5
+\fBDeny \fIipv4-address\fR
+.TP 5
+\fBDeny \fIipv4-address\fB/\fInetmask\fR
+.TP 5
+\fBDeny \fIipv4-address\fB/\fImm\fR
+.TP 5
+\fBDeny [\fIipv6-address\fB]\fR
+.TP 5
+\fBDeny [\fIipv6-address\fB]/\fImm\fR
+.TP 5
+\fBDeny @IF(\fIname\fB)\fR
+.TP 5
+\fBDeny @LOCAL\fR
+Denies access from the named hosts, domains, addresses, or interfaces.
+The Order directive controls whether Deny lines are evaluated before or after Allow lines.
+.TP 5
+\fBEncryption IfRequested\fR
+.TP 5
+\fBEncryption Never\fR
+.TP 5
+\fBEncryption Required\fR
+Specifies the level of encryption that is required for a particular location.
+The default value is "IfRequested".
+.TP 5
+\fBOrder allow,deny\fR
+Specifies that access is denied by default. Allow lines are then processed followed by Deny lines to determine whether a client may access a particular resource.
+.TP 5
+\fBOrder deny,allow\fR
+Specifies that access is allowed by default. Deny lines are then processed followed by Allow lines to determine whether a client may access a particular resource.
+.TP 5
+\fBRequire group \fIgroup-name \fR[ \fIgroup-name \fR... ]
+Specifies that an authenticated user must be a member of one of the named groups.
+.TP 5
+\fBRequire user {\fIuser-name\fR|\fB@\fIgroup-name\fR} ...
+Specifies that an authenticated user must match one of the named users or be a member of one of the named groups.
+The group name "@SYSTEM" corresponds to the list of groups defined by the SystemGroup directive in the
+.BR cups-files.conf (5)
+file.
+The group name "@OWNER" corresponds to the owner of the resource, for example the person that submitted a print job.
+.TP 5
+\fBRequire valid-user\fR
+Specifies that any authenticated user is acceptable.
+.TP 5
+\fBSatisfy all\fR
+Specifies that all Allow, AuthType, Deny, Order, and Require conditions must be satisfied to allow access.
+.TP 5
+\fBSatisfy any\fR
+Specifies that any a client may access a resource if either the authentication (AuthType/Require) or address (Allow/Deny/Order) conditions are satisfied.
+For example, this can be used to require authentication only for remote accesses.
+.SS DIRECTIVES VALID WITHIN POLICY SECTIONS
+The following directives may be placed inside Policy sections in the \fBcupsd.conf\fR file:
+.TP 5
+\fBJobPrivateAccess all\fR
+.TP 5
+\fBJobPrivateAccess default\fR
+.TP 5
+\fBJobPrivateAccess \fR{\fIuser\fR|\fB@\fIgroup\fR|\fB@ACL\fR|\fB@OWNER\fR|\fB@SYSTEM\fR} ...
+Specifies an access list for a job's private values.
+The "default" access list is "@OWNER @SYSTEM".
+"@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values.
+"@OWNER" maps to the job's owner.
+"@SYSTEM" maps to the groups listed for the SystemGroup directive in the
+.BR cups-files.conf (5)
+file.
+.TP 5
+\fBJobPrivateValues all\fR
+.TP 5
+\fBJobPrivateValues default\fR
+.TP 5
+\fBJobPrivateValues none\fR
+.TP 5
+\fBJobPrivateValues \fIattribute-name \fR[ ... \fIattribute-name \fR]
+Specifies the list of job values to make private.
+The "default" values are "job-name", "job-originating-host-name", "job-originating-user-name", and "phone".
+.TP 5
+\fBSubscriptionPrivateAccess all\fR
+.TP 5
+\fBSubscriptionPrivateAccess default\fR
+.TP 5
+\fBSubscriptionPrivateAccess \fR{\fIuser\fR|\fB@\fIgroup\fR|\fB@ACL\fR|\fB@OWNER\fR|\fB@SYSTEM\fR} ...
+Specifies an access list for a subscription's private values.
+The "default" access list is "@OWNER @SYSTEM".
+"@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values.
+"@OWNER" maps to the job's owner.
+"@SYSTEM" maps to the groups listed for the SystemGroup directive in the
+.BR cups-files.conf (5)
+file.
+.TP 5
+\fBSubscriptionPrivateValues all\fR
+.TP 5
+\fBSubscriptionPrivateValues default\fR
+.TP 5
+\fBSubscriptionPrivateValues none\fR
+.TP 5
+\fBSubscriptionPrivateValues \fIattribute-name \fR[ ... \fIattribute-name \fR]
+Specifies the list of subscription values to make private.
+The "default" values are "notify-events", "notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and "notify-user-data".
+.SH CONFORMING TO
+The \fBcupsd.conf\fR file format is based on the Apache HTTP Server configuration file format.
+.SH EXAMPLES
+Log everything with a maximum log file size of 32 megabytes:
+.nf
+
+ AccessLogLevel all
+ LogLevel debug2
+ MaxLogSize 32m
+
+.fi
+Require authentication for accesses from outside the 10. network:
+.nf
+
+ <Location />
+ Order allow,deny
+ Allow from 10./8
+ AuthType Basic
+ Require valid-user
+ Satisfy any
+ </Location>
+.fi
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcups-files.conf(5)\fR, \fIcupsd(8)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-\fIsubscriptions.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR classes.conf (5),
+.BR cups-files.conf (5),
+.BR cupsd (8),
+.BR mime.convs (5),
+.BR mime.types (5),
+.BR printers.conf (5),
+.BR subscriptions.conf (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsd.conf.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cupsd.conf.man.in 12767 2015-06-30 15:57:39Z msweet $".
.\"
diff --git a/man/cupsd.man.in b/man/cupsd.man.in
index 69bdc23..5b16c8a 100644
--- a/man/cupsd.man.in
+++ b/man/cupsd.man.in
@@ -1,72 +1,127 @@
.\"
-.\" "$Id: cupsd.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cupsd.man.in 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupsd man page for CUPS.
+.\" cupsd man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsd 8 "CUPS" "9 March 2009" "Apple Inc."
+.TH cupsd 8 "CUPS" "8 July 2014" "Apple Inc."
.SH NAME
cupsd \- cups scheduler
.SH SYNOPSIS
.B cupsd
-[ -c
+[
+.B \-c
.I config-file
-] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ]
+] [
+.B \-f
+] [
+.B \-F
+] [
+.B \-h
+] [
+.B -l
+] [
+.B -t
+]
.SH DESCRIPTION
-\fIcupsd\fR is the scheduler for CUPS. It implements a printing system based
-upon the Internet Printing Protocol, version 2.1. If no options are specified
-on the command-line then the default configuration file
-\fI@CUPS_SERVERROOT@/cupsd.conf\fR will be used.
+.B cupsd
+is the scheduler for CUPS. It implements a printing system based upon the Internet Printing Protocol, version 2.1. If no options are specified on the command-line then the default configuration file
+.I /etc/cups/cupsd.conf
+will be used.
.SH OPTIONS
.TP 5
--c config-file
-.br
+.BI \-c \ config-file
Uses the named configuration file.
.TP 5
--f
-.br
-Run \fIcupsd\fR in the foreground; the default is to run in the
-background as a "daemon".
+.B \-f
+Run
+.B cupsd
+in the foreground; the default is to run in the background as a "daemon".
.TP 5
--F
-.br
-Run \fIcupsd\fR in the foreground but detach the process from the
-controlling terminal and current directory. This is useful for
-running \fIcupsd\fR from \fIinit(8)\fR.
+.B \-F
+Run
+.B cupsd
+in the foreground but detach the process from the controlling terminal and current directory. This is useful for running
+.B cupsd
+from
+.BR init (8).
.TP 5
--h
-.br
+.B \-h
Shows the program usage.
.TP 5
--l
-.br
-This option is passed to \fIcupsd\fR when it is run from
-\fIlaunchd(8)\fR.
+.B \-l
+This option is passed to
+.B cupsd
+when it is run from
+.BR launchd (8)
+or
+.BR systemd (8).
.TP 5
--t
-.br
+.B \-t
Test the configuration file for syntax errors.
-.SH COMPATIBILITY
-\fIcupsd\fR implements all of the required IPP/2.1 attributes and
-operations. It also implements several CUPS-specific administration
-operations.
+.SH FILES
+.nf
+.I /etc/cups/classes.conf
+.I /etc/cups/cups-files.conf
+.I /etc/cups/cupsd.conf
+.I /usr/share/cups/mime/mime.convs
+.I /usr/share/cups/mime/mime.types
+.I /etc/cups/printers.conf
+.I /etc/cups/subscriptions.conf
+.fi
+.SH CONFORMING TO
+.B cupsd
+implements all of the required IPP/2.1 attributes and operations. It also implements several CUPS-specific administrative operations.
+.SH EXAMPLES
+Run
+.B cupsd
+in the background with the default configuration file:
+.nf
+
+ cupsd
+
+.fi
+Test a configuration file called
+.IR test.conf :
+.nf
+
+ cupsd \-t \-c test.conf
+
+.fi
+Run
+.B cupsd
+in the foreground with a test configuration file called
+.IR test.conf :
+.nf
+
+ cupsd \-f \-c test.conf
+
+.fi
.SH SEE ALSO
-\fIbackend(7)\fR, \fIclasses.conf(5)\fR, \fIcups-deviced(8)\fR,
-\fIcups-driverd(8)\fR, \fIcups-lpd(8)\fR, \fIcups-polld(8)\fR,
-\fIcupsd.conf(5)\fR, \fIfilter(7)\fR, \fIlaunchd(8)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR backend (7),
+.BR classes.conf (5),
+.BR cups (1),
+.BR cups-lpd (8),
+.BR cupsd.conf (5),
+.BR cupsd-helper (8),
+.BR cupsd-logs (8),
+.BR filter (7),
+.BR launchd (8),
+.BR mime.convs (5),
+.BR mime.types (5),
+.BR printers.conf (5),
+.BR systemd (8),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsd.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cupsd.man.in 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupsenable.man b/man/cupsenable.man
index 482a1e3..c81f4fd 100644
--- a/man/cupsenable.man
+++ b/man/cupsenable.man
@@ -1,93 +1,106 @@
.\"
-.\" "$Id: cupsenable.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupsenable.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupsenable/cupsdisable man page for CUPS.
+.\" cupsenable/cupsdisable man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsenable 8 "CUPS" "9 October 2008" "Apple Inc."
+.TH cupsenable 8 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
cupsdisable, cupsenable \- stop/start printers and classes
.SH SYNOPSIS
.B cupsdisable
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -c ] [ -h
-.I server[:port]
-] [ -r
+] [
+.B \-c
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-r
.I reason
-] [ --hold ] destination(s)
+] [
+.B \-\-hold
+]
+.I destination(s)
.br
.B cupsenable
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -c ] [ -h
-.I server[:port]
-] [ --release ] destination(s)
+] [
+.B \-c
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-\-release
+]
+.I destination(s)
.SH DESCRIPTION
-\fIcupsenable\fR starts the named printers or classes.
-.LP
-\fIcupsdisable\fR stops the named printers or classes. The
-following options may be used:
+.B cupsenable
+starts the named printers or classes while
+.B cupsdisable
+stops the named printers or classes.
+.SH OPTIONS
+The following options may be used:
.TP 5
--E
-.br
+.B \-E
Forces encryption of the connection to the server.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Uses the specified username when connecting to the server.
.TP 5
--c
-.br
+.B \-c
Cancels all jobs on the named destination.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Uses the specified server and port.
.TP 5
---hold
-.br
-Holds remaining jobs on the named printer. Useful for allowing the current
-job to complete before performing maintenance.
+.B \-\-hold
+Holds remaining jobs on the named printer.
+Useful for allowing the current job to complete before performing maintenance.
.TP 5
--r "reason"
-.br
-Sets the message associated with the stopped state. If no reason is specified
-then the message is set to "Reason Unknown".
+\fB\-r "\fIreason\fB"\fR
+Sets the message associated with the stopped state.
+If no reason is specified then the message is set to "Reason Unknown".
.TP 5
---release
-.br
-Releases pending jobs for printing. Use after running \fIcupsdisable\fR with
-the \fI--hold\fR option to resume printing.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
+.B \-\-release
+Releases pending jobs for printing.
+Use after running \fBcupsdisable\fR with the \fI\-\-hold\fR option to resume printing.
+.SH CONFORMING TO
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
Also, printer and class names are \fInot\fR case-sensitive.
.LP
-The System V versions of these commands are \fIdisable\fR and
-\fIenable\fR. They have been renamed to avoid conflicts with the
-\fIbash(1)\fR build-in commands of the same name.
+The System V versions of these commands are \fBdisable\fR and \fBenable\fR, respectively.
+They have been renamed to avoid conflicts with the
+.BR bash (1)
+build-in commands of the same names.
.LP
-The CUPS versions of \fIdisable\fR and \fIenable\fR may ask the
-user for an access password depending on the printing system
-configuration. This differs from the System V versions which
-require the root user to execute these commands.
+The CUPS versions of \fBdisable\fR and \fBenable\fR may ask the user for an access password depending on the printing system configuration.
+This differs from the System V versions which require the root user to execute these commands.
.SH SEE ALSO
-\fIcupsaccept(8)\fR, \fIcupsreject(8)\fR, \fIcancel(1)\fR, \fIlp(1)\fR,
-\fIlpadmin(8)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cupsaccept (8),
+.BR cupsreject (8),
+.BR cancel (1),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsenable.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupsenable.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupsfilter.man b/man/cupsfilter.man
index 5a67e4d..321d030 100644
--- a/man/cupsfilter.man
+++ b/man/cupsfilter.man
@@ -1,109 +1,143 @@
.\"
-.\" "$Id: cupsfilter.man 7936 2008-09-11 03:12:59Z mike $"
+.\" "$Id: cupsfilter.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupsfilter man page for CUPS.
+.\" cupsfilter man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
+.\" Copyright 2007-2014 by Apple Inc.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupsfilter 8 "CUPS" "20 June 2012" "Apple Inc."
+.TH cupsfilter 8 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
cupsfilter \- convert a file to another format using cups filters
.SH SYNOPSIS
.B cupsfilter
-[ -D ] [ -U
+[
+.B \-\-list\-filters
+] [
+.B \-D
+] [
+.B \-U
.I user
-] [ -c
+] [
+.B \-c
.I config-file
-] [ -d
+] [
+.B \-d
.I printer
-] [ -e ] [ -i
+] [
+.B \-e
+] [
+.B \-i
.I mime/type
-] [ -j
+] [
+.B \-j
.I job-id[,N]
-] [ -m
+] [
+.B \-m
.I mime/type
-] [ -n
+] [
+.B \-n
.I copies
-] [ -o
+] [
+.B \-o
.I name=value
-] [ -p
+] [
+.B \-p
.I filename.ppd
-] [ -t
+] [
+.B \-t
.I title
-] [ -u ]
+] [
+.B \-u
+]
.I filename
.SH DESCRIPTION
-\fIcupsfilter\fR is a front-end to the CUPS filter subsystem which allows you
-to convert a file to a specific format, just as if you had printed the file
-through CUPS. By default, \fIcupsfilter\fR generates a PDF file.
+.B cupsfilter
+is a front-end to the CUPS filter subsystem which allows you to convert a file to a specific format, just as if you had printed the file through CUPS. By default,
+.B cupsfilter
+generates a PDF file. The converted file is sent to the standard output.
.SH OPTIONS
.TP 5
--D
-.br
+.B \-\-list\-filters
+Do not actually run the filters, just print the filters used to stdout.
+.TP 5
+.B \-D
Delete the input file after conversion.
.TP 5
--U user
-.br
+\fB\-U \fIuser\fR
Specifies the username passed to the filters. The default is the name of the current user.
.TP 5
--c config-file
-.br
-Uses the named cupsd.conf configuration file.
+\fB\-c \fIconfig-file\fR
+Uses the named cups-files.conf configuration file.
.TP 5
--d printer
+\fB\-d \fIprinter\fR
Uses information from the named printer.
.TP 5
--e
-.br
+.B \-e
Use every filter from the PPD file.
.TP 5
--i mime/type
-.br
-Specifies the source file type. The default file type is guessed using the
-filename and contents of the file.
+\fB\-i \fImime/type\fR
+Specifies the source file type. The default file type is guessed using the filename and contents of the file.
.TP 5
--j job-id[,N]
-.br
-Converts document N from the specified job. If N is omitted, document 1 is
-converted.
+\fB\-j \fIjob-id[,N]\fR
+Converts document N from the specified job. If N is omitted, document 1 is converted.
.TP 5
--m mime/type
-.br
-Specifies the destination file type. The default file type is application/pdf.
-Use printer/foo to convert to the printer format defined by the filters in the
-PPD file.
+\fB\-m \fImime/type\fR
+Specifies the destination file type. The default file type is application/pdf. Use printer/foo to convert to the printer format defined by the filters in the PPD file.
.TP 5
--n copies
-.br
+\fB\-n \fIcopies\fR
Specifies the number of copies to generate.
.TP 5
--o name=value
-.br
+\fB\-o \fIname=value\fR
Specifies options to pass to the CUPS filters.
.TP 5
--p filename.ppd
-.br
+\fB\-p \fIfilename.ppd\fR
Specifies the PPD file to use.
.TP 5
--t title
-.br
+\fB\-t \fItitle\fR
Specifies the document title.
.TP 5
--u
-.br
+.B \-u
Delete the PPD file after conversion.
+.SH EXIT STATUS
+.B cupsfilter
+returns a non-zero exit status on any error.
+.SH ENVIRONMENT
+All of the standard
+.BR cups (1)
+environment variables affect the operation of
+.BR cupsfilter .
+.SH FILES
+.nf
+/etc/cups/cups-files.conf
+/etc/cups/*.convs
+/etc/cups/*.types
+/usr/share/cups/mime/*.convs
+/usr/share/cups/mime/*.types
+.SH NOTES
+Unlike when printing, filters run using the
+.B cupsfilter
+command use the current user and security session. This may result in different output or unexpected behavior.
+.SH EXAMPLE
+The following command will generate a PDF preview of job 42 for a printer named "myprinter" and save it to a file named "preview.pdf":
+.nf
+
+ cupsfilter -m application/pdf -d myprinter -j 42 >preview.pdf
+.fi
.SH SEE ALSO
-\fIcupsd.conf(5)\fR
-.br
-http://localhost:631/help
+.BR cups (1),
+.BR cupsd.conf (5),
+.BR filter(7),
+.BR mime.convs (7),
+.BR mime.types (7),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupsfilter.man 7936 2008-09-11 03:12:59Z mike $".
+.\" End of "$Id: cupsfilter.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupstestdsc.man b/man/cupstestdsc.man
index ec08797..e6d7c66 100644
--- a/man/cupstestdsc.man
+++ b/man/cupstestdsc.man
@@ -1,50 +1,51 @@
.\"
-.\" "$Id: cupstestdsc.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupstestdsc.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupstestdsc man page for CUPS.
+.\" cupstestdsc man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupstestdsc 1 "CUPS" "20 March 2006" "Apple Inc."
+.TH cupstestdsc 1 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
-cupstestdsc \- test conformance of postscript files
+cupstestdsc \- test conformance of postscript files (deprecated)
.SH SYNOPSIS
.B cupstestdsc
-[ -h ] filename.ps [ ...
+[
+.B \-h
+]
+.I filename.ps
+[ ...
.I filenameN.ps
]
.br
.B cupstestdsc
-[ -h ] -
+[
+.B \-h
+]
+.B \-
.SH DESCRIPTION
-\fIcupstestdsc\fR tests the conformance of PostScript files to
-the Adobe PostScript Language Document Structuring Conventions
-Specification version 3.0. The results of testing and any other
-output are sent to the standard output. The second form of the
-command reads PostScript from the standard input.
-.SH LIMITATIONS
-\fIcupstestdsc\fR only validates the DSC comments in a PostScript
-file and does not attempt to validate the PostScript code itself.
-Developers must ensure that the PostScript they generate follows
-the rules defined by Adobe. Specifically, all pages must be
-independent of each other, code outside page descriptions may not
-affect the graphics state (current font, color, transform matrix,
-etc.), and device-specific commands such as setpagedevice should
-not be used.
+\fBcupstestdsc\fR tests the conformance of PostScript files to the Adobe PostScript Language Document Structuring Conventions Specification version 3.0.
+The results of testing and any other output are sent to the standard output.
+The second form of the command reads PostScript from the standard input.
+.SH NOTES
+\fIThis program is deprecated and will be removed in a future release of CUPS.\fR
+.LP
+\fBcupstestdsc\fR only validates the DSC comments in a PostScript file and does not attempt to validate the PostScript code itself.
+Developers must ensure that the PostScript they generate follows the rules defined by Adobe.
+Specifically, all pages must be independent of each other, code outside page descriptions may not affect the graphics state (current font, color, transform matrix, etc.), and device-specific commands such as setpagedevice should not be used.
.SH SEE ALSO
-http://localhost:631/help
-.br
+CUPS Online Help (http://localhost:631/help),
Adobe PostScript Language Document Structuring Conventions
Specification, Version 3.0.
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupstestdsc.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupstestdsc.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/cupstestppd.man b/man/cupstestppd.man
index 2d66116..cf5f550 100644
--- a/man/cupstestppd.man
+++ b/man/cupstestppd.man
@@ -1,165 +1,151 @@
.\"
-.\" "$Id: cupstestppd.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupstestppd.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" cupstestppd man page for CUPS.
+.\" cupstestppd man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH cupstestppd 1 "CUPS" "19 November 2009" "Apple Inc."
+.TH cupstestppd 1 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
cupstestppd \- test conformance of ppd files
.SH SYNOPSIS
.B cupstestppd
-[ -I
+[
+.B \-I
.I category
-] [ -R
+] [
+.B \-R
.I rootdir
-] [ -W
+] [
+.B \-W
.I category
-] [ -q ] [-r] [ -v[v] ] filename.ppd[.gz] [ ... filenameN.ppd[.gz] ]
+] [
+.B \-q
+] [
+.B \-r
+] [
+\fB\-v\fR[\fBv\fR]
+]
+.I filename.ppd[.gz]
+[ ...
+.I filename.ppd[.gz]
+]
.br
.B cupstestppd
-[ -R
+[
+.B \-R
.I rootdir
-] [ -W
+] [
+.B \-W
.I category
-] [ -q ] [-r] [ -v[v] ] -
+] [
+.B \-q
+] [
+.B \-r
+] [
+\fB\-v\fR[\fBv\fR]
+]
+.B \-
.SH DESCRIPTION
-\fIcupstestppd\fR tests the conformance of PPD files to the
-Adobe PostScript Printer Description file format specification
-version 4.3. It can also be used to list the supported options
-and available fonts in a PPD file. The results of testing and
-any other output are sent to the standard output.
+\fBcupstestppd\fR tests the conformance of PPD files to the Adobe PostScript Printer Description file format specification version 4.3.
+It can also be used to list the supported options and available fonts in a PPD file.
+The results of testing and any other output are sent to the standard output.
.LP
-The first form of \fIcupstestppd\fR tests one or more PPD files
-on the command-line. The second form tests the PPD file provided
-on the standard input.
+The first form of \fBcupstestppd\fR tests one or more PPD files on the command-line.
+The second form tests the PPD file provided on the standard input.
.SH OPTIONS
-\fIcupstestppd\fR supports the following options:
+\fBcupstestppd\fR supports the following options:
.TP 5
--I filename
-.br
+\fB\-I filename\fR
Ignores all PCFileName warnings.
.TP 5
--I filters
-.br
+\fB\-I filters\fR
Ignores all filter errors.
.TP 5
--I profiles
-.br
+\fB\-I profiles\fR
Ignores all profile errors.
.TP 5
--R rootdir
-.br
-Specifies an alternate root directory for the filter, pre-filter,
-and other support file checks.
+\fB\-R \fIrootdir\fR
+Specifies an alternate root directory for the filter, pre-filter, and other support file checks.
.TP 5
--W constraints
-.br
+\fB\-W constraints\fR
Report all UIConstraint errors as warnings.
.TP 5
--W defaults
-.br
+\fB\-W defaults\fR
Except for size-related options, report all default option errors as warnings.
.TP 5
--W filters
-.br
+\fB\-W filters\fR
Report all filter errors as warnings.
.TP 5
--W profiles
-.br
+\fB\-W profiles\fR
Report all profile errors as warnings.
.TP 5
--W sizes
-.br
+\fB\-W sizes\fR
Report all media size errors as warnings.
.TP 5
--W translations
-.br
+\fB\-W translations\fR
Report all translation errors as warnings.
.TP 5
--W all
-.br
+\fB\-W all\fR
Report all of the previous errors as warnings.
.TP 5
--W none
-.br
+\fB\-W none\fR
Report all of the previous errors as errors.
.TP 5
--q
-.br
+.B \-q
Specifies that no information should be displayed.
.TP 5
--r
-.br
-Relaxes the PPD conformance requirements so that common
-whitespace, control character, and formatting problems are not
-treated as hard errors.
+.B \-r
+Relaxes the PPD conformance requirements so that common whitespace, control character, and formatting problems are not treated as hard errors.
.TP 5
--v
-.br
-Specifies that detailed conformance testing results should be
-displayed rather than the concise PASS/FAIL/ERROR status.
+.B \-v
+Specifies that detailed conformance testing results should be displayed rather than the concise PASS/FAIL/ERROR status.
.TP 5
--vv
-.br
-Specifies that all information in the PPD file should be
-displayed in addition to the detailed conformance testing
-results.
+.B \-vv
+Specifies that all information in the PPD file should be displayed in addition to the detailed conformance testing results.
.LP
The \fI-q\fR, \fI-v\fR, and \fI-vv\fR options are mutually exclusive.
.SH EXIT STATUS
-\fIcupstestppd\fR returns zero on success and non-zero on error. The
-error codes are as follows:
+\fBcupstestppd\fR returns zero on success and non-zero on error.
+The error codes are as follows:
.TP 5
1
-.br
Bad command-line arguments or missing PPD filename.
.TP 5
2
-.br
Unable to open or read PPD file.
.TP 5
3
-.br
The PPD file contains format errors that cannot be skipped.
.TP 5
4
-.br
The PPD file does not conform to the Adobe PPD specification.
.SH EXAMPLES
-The following command will test all PPD files under the current
-directory and print the names of each file that does not
-conform:
+The following command will test all PPD files under the current directory and print the names of each file that does not conform:
.nf
- find . -name \\*.ppd \\! -exec cupstestppd -q '{}' \\; -print
+ find . \-name \\*.ppd \\! \-exec cupstestppd \-q '{}' \\; \-print
.fi
-The next command tests all PPD files under the current directory
-and print detailed conformance testing results for the files
-that do not conform:
+The next command tests all PPD files under the current directory and print detailed conformance testing results for the files that do not conform:
.nf
- find . -name \\*.ppd \\! -exec cupstestppd -q '{}' \\; \\
- -exec cupstestppd -v '{}' \\;
-
+ find . \-name \\*.ppd \\! \-exec cupstestppd \-q '{}' \\; \\
+ \-exec cupstestppd \-v '{}' \\;
.fi
.SH SEE ALSO
-\fIlpadmin(8)\fR,
-.br
-http://localhost:631/help
-.br
+.BR lpadmin (8),
+CUPS Online Help (http://localhost:631/help),
Adobe PostScript Printer Description File Format Specification, Version 4.3.
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: cupstestppd.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupstestppd.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/filter.man b/man/filter.man
index 9a79dbd..0d51e99 100644
--- a/man/filter.man
+++ b/man/filter.man
@@ -1,238 +1,228 @@
.\"
-.\" "$Id: filter.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: filter.man 12848 2015-08-26 18:51:57Z msweet $"
.\"
-.\" filter man page for CUPS.
+.\" filter man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH filter 7 "CUPS" "18 May 2012" "Apple Inc."
+.TH filter 7 "CUPS" "26 August 2015" "Apple Inc."
.SH NAME
filter \- cups file conversion filter interface
.SH SYNOPSIS
.B filter
-job user title num-copies options [
+.I job
+.I user
+.I title
+.I num-copies
+.I options
+[
.I filename
]
+.nf
+
+\fB#include <cups/cups.h>\fR
+
+\fBssize_t cupsBackChannelRead\fR(\fBchar *\fIbuffer\fR, \fBsize_t \fIbytes\fR,
+ \fBdouble \fItimeout\fR);
+
+\fBcups_sc_status_t cupsSideChannelDoRequest\fR(\fBcups_sc_command_t \fIcommand\fR,
+ \fBchar *\fIdata\fR, \fBint *\fIdatalen\fR,
+ \fBdouble \fItimeout\fR);
+
+\fB#include <cups/ppd.h>\fR
+
+\fBconst char *cupsGetOption\fR(\fBconst char *\fIname\fR, \fBint \fInum_options\fR,
+ \fBcups_option_t *\fIoptions\fR);
+
+\fBint cupsMarkOptions\fR(\fBppd_file_t *\fIppd\fR, \fBint \fInum_options\fR,
+ \fBcups_option_t *\fIoptions\fR);
+
+\fBint cupsParseOptions\fR(\fBconst char *\fIarg\fR, \fBint \fInum_options\fR,
+ \fBcups_option_t **\fIoptions\fR);
+
+\fBppd_choice_t *ppdFindMarkedChoice\fR(\fBppd_file_t *\fIppd\fR, \fBconst char *\fIkeyword\fR);
+
+\fBvoid ppdMarkDefaults\fR(\fBppd_file_t *\fIppd\fR);
+
+\fBppd_file_t *ppdOpenFile\fR(\fBconst char *\fIfilename\fR);
+.fi
.SH DESCRIPTION
-The CUPS filter interface provides a standard method for adding support for
-new document types to CUPS. Each filter is capable of converting from one
-or more input formats to another format that can either be printed directly
-or piped into another filter to get it to a printable format.
+The CUPS filter interface provides a standard method for adding support for new document types or printers to CUPS.
+Each filter is capable of converting from one or more input formats to another format that can either be printed directly or piped into another filter to get it to a printable format.
.LP
-Filters \fBmust\fR be capable of reading from a filename on the command-line
-or from the standard input, copying the standard input to a temporary
-file as required by the file format. All output \fBmust\fR be sent to the
-standard output.
+Filters \fBMUST\fR be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the file format.
+All output \fBMUST\fR be sent to the standard output.
+Filters \fBMUST NOT\fR attempt to communicate directly with the printer, other processes, or other services.
.LP
-The command name (argv[0]) is set to the name of the destination printer but is
-also available in the PRINTER environment variable.
-.SH WARNING
-CUPS filters are not meant to be run directly by the user. Aside from the legacy
-System V interface issues (argv[0] is the printer name), CUPS filters also
-expect specific environment variables and file descriptors, and typically run in
-a user session that (on OS X) has additional restrictions that affect how it
-runs. Unless you are a developer and know what you are doing, please do not run
-filters directly. Instead, use the \fIcupsfilter(8)\fR program to use the
-appropriate filters to do the conversions you need.
+The command name (\fIargv[0]\fR) is set to the name of the destination printer but is also available in the \fBPRINTER\fI environment variable.
.SH OPTIONS
-Options passed on the command-line typically do not include the default choices
-the printer's PPD file. In addition, some options may be specified in multiple
-ways - "landscape" is a synonym for "orientation-requested=4", "media" is a
-synonym for "PageSize", "PageRegion", "InputSlot", and "MediaType", and "sides"
-is a synonym for the various "Duplex" options. Non-raster filters \fBmust\fR
-support both explicit and implicit specification of PPD options - use the
-ppdMarkDefaults and cupsMarkOptions functions in the CUPS library to use the
-correct mapping, and ppdFindMarkedChoice to get the user-selected choice.
+Options are passed in \fIargv[5]\fR and are encoded from the corresponding IPP attributes used when the job was submitted. Use the
+.BR cupsParseOptions ()
+function to load the options into a \fBcups_option_t\fR array and the
+.BR cupsGetOption ()
+function to get the value of a specific attribute.
+Be careful to look for common aliases of IPP attributes such as "landscape" for the IPP "orientation-requested" attribute.
.LP
-Raster filters should use option choices set through the raster page header, as
-those reflect the options in effect for a given page. Options specified on the
-command-line determine the default values for the entire job, which can be
-overridden on a per-page basis.
+Options passed on the command-line typically do not include the default choices the printer's PPD file. Use the
+.BR ppdMarkDefaults ()
+and
+.BR cupsMarkOptions ()
+functions in the CUPS library to apply the options to the PPD defaults and map any IPP attributes to the corresponding PPD options.
+Use
+.BR ppdFindMarkedChoice ()
+to get the user-selected choice for a PPD option. For example, a filter might use the following code to determine the current value of the \fBDuplex\fR PPD option:
+.nf
+
+ ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+ cups_option_t *options = NULL;
+ int num_options = cupsParseOptions(argv[5], 0, &options);
+
+ ppdMarkDefaults(ppd);
+ cupsMarkOptions(ppd, num_options, options);
+
+ ppd_choice_t *choice = ppdFindMarkedChoice(ppd, "Duplex");
+.fi
+.LP
+Raster filters should use option choices set through the raster page header, as those reflect the options in effect for a given page.
+Options specified on the command-line determine the default values for the entire job, which can be overridden on a per-page basis.
.SH LOG MESSAGES
-Messages sent to stderr are generally logged to
-printer-state-message attribute and the current \fIErrorLog\fR.
+Messages sent to the standard error are generally stored in the printer's "printer-state-message" attribute and the current \fBErrorLog\fR file.
Each line begins with a standard prefix:
.TP 5
-ALERT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "alert" log level.
+\fBALERT: \fImessage\fR
+Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "alert" log level.
.TP 5
-ATTR: attribute=value [attribute=value]
-.br
-Sets the named job or printer attribute(s). The following job attributes can be
-set: "job-media-progress". The following printer attributes can be set:
+\fBATTR: \fIattribute=value \fR[ \fI... attribute=value\fR]
+Sets the named job or printer attribute(s). The following job attributes can be set: "job-media-progress". The following printer attributes can be set:
"auth-info-required", "marker-colors", "marker-high-levels", "marker-levels",
"marker-low-levels", "marker-message", "marker-names", "marker-types",
"printer-alert", and "printer-alert-description".
.TP 5
-CRIT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "critical" log level.
+\fBCRIT: \fImessage\fR
+Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "critical" log level.
.TP 5
-DEBUG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug" log level.
+\fBDEBUG: \fImessage\fR
+Adds the specified message to the current \fBErrorLog\fR using the "debug" log level.
+\fBDEBUG\fR messages are never stored in the "printer-state-message" attribute.
.TP 5
-DEBUG2: message
+\fBDEBUG2: \fImessage\fR
.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug2" log level.
+Adds the specified message to the current \fBErrorLog\fR using the "debug2" log level.
+\fBDEBUG2\fR messages are never stored in the "printer-state-message" attribute.
.TP 5
-EMERG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "emergency" log level.
+\fBEMERG: \fImessage\fR
+Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "emergency" log level.
.TP 5
-ERROR: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "error" log level.
+\fBERROR:\fI message\fR
+Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "error" log level.
.TP 5
-INFO: message
-.br
-Sets the printer-state-message attribute. If the current \fILogLevel\fR
-is set to "debug2", also adds the specified message to the
-current \fIErrorLog\fR using the "info" log level.
+\fBINFO:\fI message\fR
+Sets the "printer-state-message" attribute. If the current \fBLogLevel\fR is set to "debug2", also adds the specified message to the current \fBErrorLog\fR using the "info" log level.
.TP 5
-NOTICE: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "notice" log level.
+\fBNOTICE:\fI message\fR
+Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "notice" log level.
.TP 5
-PAGE: page-number #-copies
+\fBPAGE:\fI page-number #-copies\fR
.TP 5
-PAGE: total #-pages
-.br
-Adds an entry to the current \fIPageLog\fR. The first form adds
-#-copies to the job-media-sheets-completed attribute. The second
-form sets the job-media-sheets-completed attribute to #-pages.
+\fBPAGE:\fI total #-pages\fR
+Adds an entry to the current \fBPageLog\fR. The first form adds \fI#-copies\fR to the "job-media-sheets-completed" attribute. The second form sets the "job-media-sheets-completed" attribute to \fI#-pages\fR.
.TP 5
-PPD: Keyword=Value ... KeywordN=Value
-.br
-Sets the named keywords in the printer's PPD file. This is typically
-used to update default option keywords such as DefaultPageSize and
-the various installable options in the PPD file.
+\fBPPD:\fI Keyword=Value\fR [ \fI... KeywordN=Value\fR ]
+Sets the named keywords in the printer's PPD file. This is typically used to update default option keywords such as \fBDefaultPageSize\fR and the various installable options in the PPD file.
.TP 5
-STATE: printer-state-reason [printer-state-reason ...]
+\fBSTATE:\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ]
.TP 5
-STATE: + printer-state-reason [printer-state-reason ...]
+\fBSTATE: +\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ]
.TP 5
-STATE: - printer-state-reason [printer-state-reason ...]
-.br
-Sets, adds, or removes printer-state-reason keywords to the
-current queue. Typically this is used to indicate media, ink, and
-toner conditions on a printer.
+\fBSTATE: -\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ]
+Sets, adds, or removes "printer-state-reason" keywords for the current queue. Typically this is used to indicate media, ink, and toner conditions on a printer.
.TP 5
-WARNING: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "warning" log level.
+\fBWARNING:\fI message\fR
+Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "warning" log level.
.SH ENVIRONMENT VARIABLES
The following environment variables are defined by the CUPS
server when executing the filter:
.TP 5
-CHARSET
-.br
-The default text character set, typically utf-8.
+.B CHARSET
+The default text character set, typically "utf-8".
.TP 5
-CLASS
-.br
-When a job is submitted to a printer class, contains the name of
-the destination printer class. Otherwise this environment
-variable will not be set.
+.B CLASS
+When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set.
.TP 5
-CONTENT_TYPE
-.br
-The MIME type associated with the file (e.g.
-application/postscript).
+.B CONTENT_TYPE
+The MIME media type associated with the submitted job file, for example "application/postscript".
.TP 5
-CUPS_CACHEDIR
-.br
-The directory for semi-persistent cache files can be found.
+.B CUPS_CACHEDIR
+The directory where semi-persistent cache files can be found and stored.
.TP 5
-CUPS_DATADIR
-.br
+.B CUPS_DATADIR
The directory where data files can be found.
.TP 5
-CUPS_FILETYPE
-.br
+.B CUPS_FILETYPE
The type of file being printed: "job-sheet" for a banner page and "document"
for a regular print file.
.TP 5
-CUPS_MAX_MESSAGE
-.br
-The maximum size of a message sent to stderr, including any leading prefix and
-the trailing newline.
+.B CUPS_MAX_MESSAGE
+The maximum size of a message sent to \fIstderr\fR, including any leading prefix and the trailing newline.
.TP 5
-CUPS_SERVERROOT
-.br
+.B CUPS_SERVERROOT
The root directory of the server.
.TP 5
-DEVICE_URI
-.br
-The device-uri associated with the printer.
-.TP 5
-FINAL_CONTENT_TYPE
-.br
-The MIME type associated with the printer (e.g.
-application/vnd.cups-postscript).
+.B FINAL_CONTENT_TYPE
+The MIME media type associated with the output destined for the printer, for example "application/vnd.cups-postscript".
.TP 5
-LANG
-.br
+.B LANG
The default language locale (typically C or en).
.TP 5
-PATH
-.br
-The standard execution path for external programs that may be run by
-the filter.
+.B PATH
+The standard execution path for external programs that may be run by the filter.
.TP 5
-PPD
-.br
-The full pathname of the PostScript Printer Description (PPD)
-file for this printer.
+.B PPD
+The full pathname of the PostScript Printer Description (PPD) file for this printer.
.TP 5
-PRINTER
-.br
+.B PRINTER
The name of the printer.
.TP 5
-RIP_CACHE
-.br
-The recommended amount of memory to use for Raster Image
-Processors (RIPs).
+.B RIP_CACHE
+The recommended amount of memory to use for Raster Image Processors (RIPs).
.TP 5
-SOFTWARE
-.br
-The name and version number of the server (typically CUPS/1.2).
+.B SOFTWARE
+The name and version number of the server (typically CUPS/\fImajor.minor\fR).
.TP 5
-TZ
-.br
+.B TZ
The timezone of the server.
.TP 5
-USER
-.br
-The user executing the filter, typically "lp" or "root"; consult the
-\fIcupsd.conf(5)\fR file for the current setting.
-.SH COMPATIBILITY
+.B USER
+The user executing the filter, typically "lp" or "root"; consult the \fIcups-files.conf\fR file for the current setting.
+.SH CONFORMING TO
While the filter interface is compatible with System V interface
scripts, it will only work with the System V interface script as the
only filter. Typically the interface script will be provided via the
\fIlpadmin(8)\fR command using the \fI-i\fR option.
+.SH NOTES
+CUPS filters are not meant to be run directly by the user.
+Aside from the legacy System V interface issues (\fIargv[0]\fR is the printer name), CUPS filters also expect specific environment variables and file descriptors, and typically run in a user session that (on OS X) has additional restrictions that affect how it runs.
+Unless you are a developer and know what you are doing, please do not run filters directly.
+Instead, use the
+.BR cupsfilter (8)
+program to use the appropriate filters to do the conversions you need.
.SH SEE ALSO
-\fIbackend(7)\fR, \fIcupsd(8)\fR, \fIcupsfilter(8)\fR,
+.BR backend (7),
+.BR cups (1),
+.BR cups-files.conf (5),
+.BR cupsd (8),
+.BR cupsfilter (8),
.br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: filter.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: filter.man 12848 2015-08-26 18:51:57Z msweet $".
.\"
diff --git a/man/ippfind.man b/man/ippfind.man
new file mode 100644
index 0000000..df05050
--- /dev/null
+++ b/man/ippfind.man
@@ -0,0 +1,261 @@
+.\"
+.\" "$Id: ippfind.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" ippfind man page for CUPS.
+.\"
+.\" Copyright 2013-2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippfind 1 "CUPS" "11 June 2014" "Apple Inc."
+.SH NAME
+ippfind \- find internet printing protocol printers
+.SH SYNOPSIS
+.B ippfind
+[
+.I options
+] \fIregtype\fR[\fB,\fIsubtype\fR][\fB.\fIdomain\fB.\fR] ... [
+.I expression
+ ... ]
+.br
+.B ippfind
+[
+.I options
+] \fIname\fR[\fB.\fIregtype\fR[\fB.\fIdomain\fB.\fR]] ... [
+.I expression
+ ... ]
+.br
+.B ippfind
+.B \-\-help
+.br
+.B ippfind
+.B \-\-version
+.SH DESCRIPTION
+\fBippfind\fR finds services registered with a DNS server or available through local devices.
+Its primary purpose is to find IPP printers and show their URIs, show their current status, or run commands.
+.SS REGISTRATION TYPES
+\fBippfind\fR supports the following registration types:
+.TP 5
+_http._tcp
+HyperText Transport Protocol (HTTP, RFC 2616)
+.TP 5
+_https._tcp
+Secure HyperText Transport Protocol (HTTPS, RFC 2818)
+.TP 5
+_ipp._tcp
+Internet Printing Protocol (IPP, RFC 2911)
+.TP 5
+_ipps._tcp
+Secure Internet Printing Protocol (IPPS, draft)
+.TP 5
+_printer._tcp
+Line Printer Daemon (LPD, RFC 1179)
+.SS EXPRESSIONS
+\fBippfind\fR supports expressions much like the
+.BR find (1)
+utility.
+However, unlike
+.BR find (1),
+\fBippfind\fR uses POSIX regular expressions instead of shell filename matching patterns.
+If \fI\-\-exec\fR, \fI\-l\fR, \fI\-\-ls\fR, \fI\-p\fR, \fI\-\-print\fR, \fI\-\-print\-name\fR, \fI\-q\fR, \fI\-\-quiet\fR, \fI\-s\fR, or \fI\-x\fR is not specified, \fBippfind\fR adds \fI\-\-print\fR to print the service URI of anything it finds.
+The following expressions are supported:
+.TP 5
+\fB\-d \fIregex\fR
+.TP 5
+\fB\-\-domain \fIregex\fR
+True if the domain matches the given regular expression.
+.TP 5
+.B \-\-false
+Always false.
+.TP 5
+\fB\-h \fIregex\fR
+.TP 5
+\fB\-\-host \fIregex\fR
+True is the hostname matches the given regular expression.
+.TP 5
+.B \-l
+.TP 5
+.B \-\-ls
+Lists attributes returned by Get-Printer-Attributes for IPP printers and traditional \fIfind\fR "-ls" output for HTTP URLs.
+The result is true if the URI is accessible, false otherwise.
+.TP 5
+.B \-\-local
+True if the service is local to this computer.
+.TP 5
+\fB\-n \fIregex\fR
+.TP 5
+\fB\-\-name \fIregex\fR
+True if the service instance name matches the given regular expression.
+.TP 5
+\fB\-\-path \fIregex\fR
+True if the URI resource path matches the given regular expression.
+.TP 5
+\fB\-P \fInumber\fR[\fB-\fInumber\fR]
+.TP 5
+\fB\-\-port \fInumber\fR[\fB-\fInumber\fR]
+True if the port matches the given number or range.
+.TP 5
+.B \-p
+.TP 5
+.B \-\-print
+Prints the URI if the result of previous expressions is true.
+The result is always true.
+.TP 5
+.B \-q
+.TP 5
+.B \-\-quiet
+Quiet mode - just returns the exit codes below.
+.TP 5
+.B \-r
+.TP 5
+.B \-\-remote
+True if the service is not local to this computer.
+.TP 5
+.B \-s
+.TP 5
+.B \-\-print\-name
+Prints the service instance name if the result of previous expressions is true.
+The result is always true.
+.TP 5
+.B \-\-true
+Always true.
+.TP 5
+\fB\-t \fIkey\fR
+.TP 5
+\fB\-\-txt \fIkey\fR
+True if the TXT record contains the named key.
+.TP 5
+\fB\-\-txt\-\fIkey regex\fR
+True if the TXT record contains the named key and matches the given regular expression.
+.TP 5
+\fB\-u \fIregex\fR
+.TP 5
+\fB\-\-uri \fIregex\fR
+True if the URI matches the given regular expression.
+.TP 5
+\fB\-x \fIutility \fR[ \fIargument \fR... ] \fB;\fR
+.TP 5
+\fB\-\-exec \fIutility \fR[ \fIargument \fR... ] \fB;\fR
+Executes the specified program if the current result is true.
+"{foo}" arguments are replaced with the corresponding value - see SUBSTITUTIONS below.
+.PP
+Expressions may also contain modifiers:
+.TP 5
+\fB( \fIexpression \fB)\fR
+Group the result of expressions.
+.TP 5
+\fB! \fIexpression\fR
+.TP 5
+\fB\-\-not \fIexpression\fR
+Unary NOT of the expression.
+.TP 5
+\fIexpression expression\fR
+.TP 5
+\fIexpression \fB\-\-and \fIexpression\fR
+Logical AND of expressions.
+.TP 5
+\fIexpression \fB\-\-or \fIexpression\fR
+Logical OR of expressions.
+.SS SUBSTITUTIONS
+The substitutions for "{foo}" in \fI\-e\fR and \fI\-\-exec\fR are:
+.TP 5
+.B {service_domain}
+Domain name, e.g., "example.com.", "local.", etc.
+.TP 5
+.B {service_hostname}
+Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
+.TP 5
+.B {service_name}
+Service instance name, e.g., "My Fine Printer".
+.TP 5
+.B {service_port}
+Port number for server, typically 631 for IPP and 80 for HTTP.
+.TP 5
+.B {service_regtype}
+DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
+.TP 5
+.B {service_scheme}
+URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
+.TP 5
+.B {}
+.TP 5
+.B {service_uri}
+URI for service, e.g., "ipp://printer.local./ipp/print", "http://printer.local./", etc.
+.TP 5
+\fB{txt_\fIkey\fB}\fR
+Value of TXT record \fIkey\fR (lowercase).
+.SH OPTIONS
+\fBippfind\fR supports the following options:
+.TP 5
+.B \-\-help
+Show program help.
+.TP 5
+.B \-\-version
+Show program version.
+.TP 5
+.B \-4
+Use IPv4 when listing.
+.TP 5
+.B \-6
+Use IPv6 when listing.
+.TP 5
+\fB\-T \fIseconds\fR
+Specify find timeout in seconds.
+If 1 or less, \fBippfind\fR stops as soon as it thinks it has found everything.
+The default timeout is 1 second.
+.TP 5
+\fB\-V \fIversion\fR
+Specifies the IPP version when listing.
+Supported values are "1.1", "2.0", "2.1", and "2.2".
+.SH EXIT STATUS
+\fBippfind\fR returns 0 if the result for all processed expressions is true, 1 if the result of any processed expression is false, 2 if browsing or any query or resolution failed, 3 if an undefined option or invalid expression was specified, and 4 if it ran out of memory.
+.SH ENVIRONMENT
+When executing a program, \fBippfind\fR sets the following environment variables for the matching service registration:
+.TP 5
+.B IPPFIND_SERVICE_DOMAIN
+Domain name, e.g., "example.com.", "local.", etc.
+.TP 5
+.B IPPFIND_SERVICE_HOSTNAME
+Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
+.TP 5
+.B IPPFIND_SERVICE_NAME
+Service instance name, e.g., "My Fine Printer".
+.TP 5
+.B IPPFIND_SERVICE_PORT
+Port number for server, typically 631 for IPP and 80 for HTTP.
+.TP 5
+.B IPPFIND_SERVICE_REGTYPE
+DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
+.TP 5
+.B IPPFIND_SERVICE_SCHEME
+URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
+.TP 5
+.B IPPFIND_SERVICE_URI
+URI for service, e.g., "ipp://printer.local./ipp/print", "http://printer.local./", etc.
+.TP 5
+.B IPPFIND_TXT_\fIKEY\fR
+Values of TXT record \fIKEY\fR (uppercase).
+.SH EXAMPLES
+To show the status of all registered IPP printers on your network, run:
+.nf
+
+ ippfind \-\-ls
+
+.fi
+Similarly, to send a PostScript test page to every PostScript printer, run:
+.nf
+
+ ippfind \-\-txt\-pdl application/postscript \-\-exec ipptool
+ \-f onepage\-letter.ps '{}' print\-job.test \\;
+.fi
+.SH SEE ALSO
+.BR ipptool (1)
+.SH COPYRIGHT
+Copyright \[co] 2013-2015 by Apple Inc.
+.\"
+.\" End of "$Id: ippfind.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
diff --git a/man/ipptool.man b/man/ipptool.man
index 16b1276..6dee72c 100644
--- a/man/ipptool.man
+++ b/man/ipptool.man
@@ -1,143 +1,248 @@
.\"
-.\" "$Id$"
+.\" "$Id: ipptool.man 12848 2015-08-26 18:51:57Z msweet $"
.\"
-.\" ipptool man page for CUPS.
+.\" ipptool man page for CUPS.
.\"
-.\" Copyright 2010-2013 by Apple Inc.
+.\" Copyright 2010-2015 by Apple Inc.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ipptool 1 "CUPS" "9 November 2010" "Apple Inc."
+.TH ipptool 1 "CUPS" "26 August 2015" "Apple Inc."
.SH NAME
-ipptool - perform internet printing protocol requests
+ipptool \- perform internet printing protocol requests
.SH SYNOPSIS
.B ipptool
-[ -4 ] [ -6 ] [ -C ] [ -E ] [ -I ] [ -L ] [ -S ] [ -T
+[
+.B \-\-help
+] [
+.B \-\-stop\-after\-include\-error
+] [
+.B \-\-version
+] [
+.B \-4
+] [
+.B \-6
+] [
+.B \-C
+] [
+.B \-E
+] [
+.B \-I
+] [
+.B \-L
+] [
+.B \-P
+.I filename.plist
+] [
+.B \-S
+] [
+.B \-T
.I seconds
-] [ -V
+] [
+.B \-V
.I version
-] [ -X ] [ -c ] [ -d
+] [
+.B \-X
+] [
+.B \-c
+] [
+.B \-d
.I name=value
-] [ -f
+] [
+.B \-f
.I filename
-] [ -i
+] [
+.B \-i
.I seconds
-] [ -n
+] [
+.B \-n
.I repeat-count
-] [ -q ] [ -t ] [ -v ]
-.I URI
-.I filename
-[
-.I ... filenameN
+] [
+.B \-q
+] [
+.B \-t
+] [
+.B \-v ]
+.I printer-uri
+.I testfile
+[ ...
+.I testfile
]
.SH DESCRIPTION
-\fIipptool\fR sends IPP requests to the specified URI and tests and/or displays the results. Each named file defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The file format is described in \fIipptoolfile(5)\fR.
+.B ipptool
+sends IPP requests to the specified
+.I printer-uri
+and tests and/or displays the results.
+Each named
+.I testfile
+defines one or more requests, including the expected response status, attributes, and values.
+Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed.
+The
+.I testfile
+format is described in
+.BR ipptoolfile (5).
.SH OPTIONS
-The following options are recognized by \fIipptool\fR:
+The following options are recognized by
+.B ipptool:
+.TP 5
+.B \-\-help
+Shows program help.
+.TP 5
+.B \-\-stop-after-include-error
+Tells
+.B ipptool
+to stop if an error occurs in an included file. Normally
+.B ipptool
+will continue with subsequent tests after the INCLUDE directive.
+.TP 5
+.B \-\-version
+Shows the version of
+.B ipptool
+being used.
.TP 5
--4
-Specifies that \fIipptool\fR must connect to the printer or server using IPv4.
+.B \-4
+Specifies that
+.B ipptool
+must connect to the printer or server using IPv4.
.TP 5
--6
-Specifies that \fIipptool\fR must connect to the printer or server using IPv6.
+.B \-6
+Specifies that
+.B ipptool
+must connect to the printer or server using IPv6.
.TP 5
--C
-Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
+.B \-C
+Specifies that requests should be sent using the HTTP/1.1 "Transfer\-Encoding: chunked" header, which is required for conformance by all versions of IPP.
+The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files.
.TP 5
--E
+.B \-E
Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
.TP 5
--I
-Specifies that \fIipptool\fR will continue past errors.
+.B \-I
+Specifies that
+.B ipptool
+will continue past errors.
+.TP 5
+.B \-L
+Specifies that requests should be sent using the HTTP/1.0 "Content\-Length:" header, which is required for conformance by all versions of IPP.
+The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files.
.TP 5
--L
-Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
+.BI \-P \ filename.plist
+Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (\fB\-t\fR).
+This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options.
.TP 5
--S
-Forces (dedicated) SSL encryption when connecting to the server.
+.B \-S
+Forces (dedicated) TLS encryption when connecting to the server.
.TP 5
--T seconds
+.BI \-T \ seconds
Specifies a timeout for IPP requests in seconds.
.TP 5
--V version
+.BI \-V \ version
Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used.
.TP 5
--X
-Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the \fI-i\fR (interval) and \fI-n\fR (repeat-count) options.
+.B \-X
+Specifies that XML (Apple plist) output is desired instead of the plain text report.
+This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options.
.TP 5
--c
-Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
+.B \-c
+Specifies that CSV (comma\-separated values) output is desired instead of the plain text output.
.TP 5
--d name=value
+.BI \-d \ name=value
Defines the named variable.
.TP 5
--f filename
+.BI \-f \ filename
Defines the default request filename for tests.
.TP 5
--i seconds
-Specifies that the (last) file should be repeated at the specified interval. This option is incompatible with the \fI-X\fR (XML plist output) option.
+.BI \-i \ seconds
+Specifies that the (last)
+.I testfile
+should be repeated at the specified interval.
+This option is incompatible with the \fB\-X\fR (XML plist output) option.
.TP 5
--l
+.B \-l
Specifies that plain text output is desired.
.TP 5
--n repeat-count
-Specifies that the (last) file should be repeated the specified number of times. This option is incompatible with the \fI-X\fR (XML plist output) option.
+.BI \-n \ repeat\-count
+Specifies that the (last)
+.I testfile
+should be repeated the specified number of times.
+This option is incompatible with the \fI\-X\fR (XML plist output) option.
+.TP 5
+.B \-q
+Be quiet and produce no output.
.TP 5
--t
+.B \-t
Specifies that CUPS test report output is desired instead of the plain text output.
.TP 5
--v
-Specifies that all request and response attributes should be output in CUPS test mode (\fI-t\fR). This is the default for XML output.
-.SH COMPATIBILITY
-The \fIipptool\fR program is unique to CUPS.
+.B \-v
+Specifies that all request and response attributes should be output in CUPS test mode (\fB\-t\fR).
+This is the default for XML output.
+.SH EXIT STATUS
+The
+.B ipptool
+program returns 0 if all tests were successful and 1 otherwise.
+.SH FILES
+The following standard files are available:
+.nf
+.I color.jpg
+.I create\-printer\-subscription.test
+.I document\-a4.pdf
+.I document\-a4.ps
+.I document\-letter.pdf
+.I document\-letter.ps
+.I get\-completed\-jobs.test
+.I get\-jobs.test
+.I get\-notifications.test
+.I get\-printer\-attributes.test
+.I get\-subscriptions.test
+.I gray.jpg
+.I ipp\-1.1.test
+.I ipp\-2.0.test
+.I ipp\-2.1.test
+.I ipp\-2.2.test
+.I ipp\-everywhere.test
+.I onepage\-a4.pdf
+.I onepage\-a4.ps
+.I onepage\-letter.pdf
+.I onepage\-letter.ps
+.I print\-job.test
+.I print\-job\-deflate.test
+.I print\-job\-gzip.test
+.I testfile.jpg
+.I testfile.pcl
+.I testfile.pdf
+.I testfile.ps
+.I testfile.txt
+.I validate\-job.test
+.fi
+.SH CONFORMING TO
+The
+.B ipptool
+program is unique to CUPS and conforms to the Internet Printing Protocol up to version 2.2.
.SH EXAMPLES
Get a list of completed jobs for "myprinter":
.nf
- ipptool ipp://localhost/printers/myprinter get-completed-jobs.test
+
+ ipptool ipp://localhost/printers/myprinter get\-completed\-jobs.test
.fi
.LP
Send email notifications to "user@example.com" when "myprinter" changes:
.nf
- ipptool -d recipient=mailto:user@example.com \
- ipp://localhost/printers/myprinter create-printer-subscription.test
-.fi
-.SH STANDARD FILES
-The following standard files are available:
-.nf
- color.jpg
- create-printer-subscription.test
- document-a4.pdf
- document-a4.ps
- document-letter.pdf
- document-letter.ps
- get-completed-jobs.test
- get-jobs.test
- get-printer-attributes.test
- gray.jpg
- ipp-1.1.test
- ipp-2.0.test
- ipp-2.1.test
- ipp-2.2.test
- onepage-a4.pdf
- onepage-a4.ps
- onepage-letter.pdf
- onepage-letter.ps
- print-job.test
- testfile.jpg
- testfile.pdf
- testfile.ps
- testfile.txt
+
+ ipptool \-d recipient=mailto:user@example.com \\
+ ipp://localhost/printers/myprinter create\-printer\-subscription.test
.fi
.SH SEE ALSO
-\fIipptoolfile(5)\fR,
-.br
-http://localhost:631/help
+.BR ipptoolfile (5),
+CUPS Online Help (http://localhost:631/help),
+IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations),
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+RFC 2911 (http://tools.ietf.org/html/rfc2911),
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id$".
+.\" End of "$Id: ipptool.man 12848 2015-08-26 18:51:57Z msweet $".
.\"
diff --git a/man/ipptoolfile.man b/man/ipptoolfile.man
index a82e739..f9c5c41 100644
--- a/man/ipptoolfile.man
+++ b/man/ipptoolfile.man
@@ -1,498 +1,541 @@
.\"
-.\" "$Id$"
+.\" "$Id: ipptoolfile.man 12487 2015-02-05 15:42:59Z msweet $"
.\"
-.\" ipptoolfile man page for CUPS.
+.\" ipptoolfile man page for CUPS.
.\"
-.\" Copyright 2010-2013 by Apple Inc.
+.\" Copyright 2010-2014 by Apple Inc.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ipptoolfile 5 "CUPS" "10 January 2013" "Apple Inc."
+.TH ipptoolfile 5 "CUPS" "4 February 2015" "Apple Inc."
.SH NAME
ipptoolfile \- ipptool file format
-
.SH DESCRIPTION
-The \fIipptool(1)\fR program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curly braces, for example:
+The
+.BR ipptool (1)
+program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curly braces, for example:
.nf
# This is a comment
{
# The name of the test
- NAME "Print PostScript Job"
+ NAME "Print PostScript File"
# The request to send
- OPERATION Print-Job
- GROUP operation-attributes-tag
- ATTR charset attributes-charset utf-8
- ATTR language attributes-natural-language en
- ATTR uri printer-uri $uri
- ATTR name requesting-user-name $user
+ OPERATION Print\-Job
+ GROUP operation\-attributes\-tag
+ ATTR charset attributes\-charset utf\-8
+ ATTR language attributes\-natural\-language en
+ ATTR uri printer\-uri $uri
+ ATTR name requesting\-user\-name $user
FILE testfile.ps
# The response to expect
- STATUS successful-ok
- EXPECT attributes-charset OF-TYPE charset
- EXPECT attributes-natural-language OF-TYPE naturalLanguage
- EXPECT job-id OF-TYPE integer
- EXPECT job-uri OF-TYPE uri
+ STATUS successful\-ok
+ EXPECT job\-id OF\-TYPE integer WITH\-VALUE >0
+ EXPECT job\-uri OF\-TYPE uri
}
{
# The name of the test
NAME "Get Attributes of PostScript Job"
# The request to send
- OPERATION Get-Job-Attributes
- GROUP operation-attributes-tag
- ATTR charset attributes-charset utf-8
- ATTR language attributes-natural-language en
- ATTR uri printer-uri $uri
- ATTR integer job-id $job-id
- ATTR name requesting-user-name $user
+ OPERATION Get\-Job\-Attributes
+ GROUP operation\-attributes\-tag
+ ATTR charset attributes\-charset utf\-8
+ ATTR language attributes\-natural\-language en
+ ATTR uri printer\-uri $uri
+ ATTR integer job\-id $job\-id
+ ATTR name requesting\-user\-name $user
# The response to expect
- STATUS successful-ok
- EXPECT attributes-charset OF-TYPE charset
- EXPECT attributes-natural-language OF-TYPE naturalLanguage
- EXPECT job-id OF-TYPE integer
- EXPECT job-uri OF-TYPE uri
- EXPECT job-state OF-TYPE enum
- EXPECT job-originating-user-name OF-TYPE name WITH-VALUE "$user"
+ STATUS successful\-ok
+ EXPECT job\-id OF\-TYPE integer WITH\-VALUE $job\-id
+ EXPECT job\-uri OF\-TYPE uri
+ EXPECT job\-state OF\-TYPE enum WITH\-VALUE 3,4,5,6,7,8,9
+ EXPECT job\-originating\-user\-name OF\-TYPE name WITH\-VALUE "$user"
}
.fi
-
-.SH TOP-LEVEL DIRECTIVES
-The following directives can be used outside of a test:
+.SS TOP-LEVEL DIRECTIVES
+The following directives can be used outside of a \fItest\fR:
.TP 5
-{ test }
+\fB{ \fItest \fB}\fR
Defines a test.
.TP 5
-DEFINE variable-name value
-Defines the named variable to the given value. This is equivalent to specifying
-"-d variable-name=value" on the \fIipptool\fR command-line.
+\fBDEFINE \fIvariable-name value\fR
+Defines the named variable to the given value. This is equivalent to specifying \fI\-d variable-name=value\fR on the
+.BR ipptool (8)
+command-line.
+.TP 5
+\fBDEFINE\-DEFAULT \fIvariable-name value\fR
+Defines the named variable to the given value if it does not already have a value.
.TP 5
-DEFINE-DEFAULT variable-name value
-Defines the named variable to the given value if it does not already have a
-value.
+\fBFILE\-ID "\fIidentifier\fB"\fR
+Specifies an identifier string for the current file.
.TP 5
-IGNORE-ERRORS yes
+\fBIGNORE\-ERRORS yes\fR
.TP 5
-IGNORE-ERRORS no
-Specifies whether, by default, \fIipptool\fR will ignore errors and continue with
-subsequent tests.
+\fBIGNORE\-ERRORS no\fR
+Specifies whether, by default,
+.BR ipptool (8)
+will ignore errors and continue with subsequent tests.
+.TP 5
+\fBINCLUDE "\fIfilename\fB"\fR
+.TP 5
+\fBINCLUDE <\fIfilename\fB>\fR
+Includes another test file. The first form includes a file relative to the current test file, while the second form includes a file from the
+.BR ipptool (8)
+include directory.
.TP 5
-INCLUDE "filename"
+\fBINCLUDE\-IF\-DEFINED \fIname \fB"\fIfilename\fB"\fR
.TP 5
-INCLUDE <filename>
-Includes another test file. The first form includes a file relative to the
-current test file, while the second form includes a file from the \fIipptool\fR
+\fBINCLUDE\-IF\-DEFINED \fIname \fB<\fIfilename\fB>\fR
+Includes another test file if the named variable is defined. The first form includes a file relative to the current test file, while the second form includes a file from the
+.BR ipptool (8)
include directory.
.TP 5
-INCLUDE-IF-DEFINED name "filename"
+\fBINCLUDE\-IF\-NOT\-DEFINED \fIname \fB"\fIfilename\fB"\fR
.TP 5
-INCLUDE-IF-DEFINED name <filename>
-Includes another test file if the named variable is defined. The first form
-includes a file relative to the current test file, while the second form
-includes a file from the \fIipptool\fR include directory.
+\fBINCLUDE\-IF\-NOT\-DEFINED \fIname \fB<\fIfilename\fB>\fR
+Includes another test file if the named variable is not defined. The first form includes a file relative to the current test file, while the second form includes a file from the
+.BR ipptool (8)
+include directory.
.TP 5
-INCLUDE-IF-NOT-DEFINED name "filename"
+\fBSKIP\-IF\-DEFINED \fIvariable-name\fR
.TP 5
-INCLUDE-IF-NOT-DEFINED name <filename>
-Includes another test file if the named variable is not defined. The first form
-includes a file relative to the current test file, while the second form
-includes a file from the \fIipptool\fR include directory.
+\fBSKIP\-IF\-NOT\-DEFINED \fIvariable-name\fR
+Specifies that the remainder of the test file should be skipped when the variable is or is not defined.
.TP 5
-SKIP-IF-DEFINED variable-name
+\fBSTOP\-AFTER\-INCLUDE\-ERROR no\fR
.TP 5
-SKIP-IF-NOT-DEFINED variable-name
-Specifies that the remainder of the test file should be skipped when the
-variable is or is not defined.
+\fBSTOP\-AFTER\-INCLUDE\-ERROR yes\fR
+Specifies whether tests will be stopped after an error in an included file.
.TP 5
-TRANSFER auto
-Specifies that tests will, by default, use "Transfer-Encoding: chunked" for
-requests with attached files and "Content-Length:" for requests without attached
-files.
+\fBTRANSFER auto\fR
+Specifies that tests will, by default, use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
.TP 5
-TRANSFER chunked
-Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding:
-chunked" header. This is the default and is equivalent to specifying "-c" on the
-\fIipptool\fR command-line. Support for chunked requests is required for
-conformance with all versions of IPP.
+\fBTRANSFER chunked\fR
+Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding: chunked" header. This is the default and is equivalent to specifying \fI\-c\fR on the
+.BR ipptool (8)
+command-line. Support for chunked requests is required for conformance with all versions of IPP.
.TP 5
-TRANSFER length
-Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:"
-header. This is equivalent to specifying "-l" on the \fIipptool\fR command-line.
-Support for content length requests is required for conformance with all
-versions of IPP.
+\fBTRANSFER length\fR
+Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:" header. This is equivalent to specifying \fI\-l\fR on the
+.BR ipptool (8)
+command-line. Support for content length requests is required for conformance with all versions of IPP.
.TP 5
-VERSION 1.0
+\fBVERSION 1.0\fR
.TP 5
-VERSION 1.1
+\fBVERSION 1.1\fR
.TP 5
-VERSION 2.0
+\fBVERSION 2.0\fR
.TP 5
-VERSION 2.1
+\fBVERSION 2.1\fR
.TP 5
-VERSION 2.2
+\fBVERSION 2.2\fR
Specifies the default IPP version number to use for the tests that follow.
-
-.SH TEST DIRECTIVES
-The following directives are understood in a test:
+.SS TEST DIRECTIVES
+The following directives are understood within a \fItest\fR:
+.TP 5
+\fBATTR \fItag attribute-name value(s)\fR
+Adds an attribute to the test request. Values are separated by the comma (",") character - escape commas using the "\" character. Common attributes and values are listed in the IANA IPP registry - see references below.
.TP 5
-ATTR tag attribute-name value(s)
-Adds an attribute to the test request. Values are separated by the comma (",")
-character - escape commas using the "\" character.
+\fBATTR collection \fIattribute-name \fB{ MEMBER \fItag member-name value(s) ... \fB}\fR [ \fI... \fB,{ \fI... \fB} \fR]
+Adds a collection attribute to the test request. Member attributes follow the same syntax as regular attributes and can themselves be nested collections. Multiple collection values can be supplied as needed, separated by commas.
.TP 5
-ATTR collection attribute-name { MEMBER tag member-name value(s) ... } [ ... { ... } ]
-Adds a collection attribute to the test request. Member attributes follow the
-same syntax as regular attributes and can themselves be nested collections.
-Multiple collection values can be supplied as needed.
+\fBCOMPRESSION deflate\fR
.TP 5
-DELAY seconds
+\fBCOMPRESSION gzip\fR
+.TP 5
+\fBCOMPRESSION none\fR
+Uses the specified compression on the document data following the attributes in a Print-Job or Send-Document request.
+.TP 5
+\fBDELAY \fIseconds\fR
Specifies a delay before this test will be run.
.TP 5
-DISPLAY attribute-name
+\fBDISPLAY \fIattribute-name\fR
Specifies that value of the named attribute should be output as part of the
test report.
.TP 5
-EXPECT attribute-name [ predicate(s) ]
+\fBEXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR]
+.TP 5
+\fBEXPECT ?\fIattribute-name predicate(s)\fR
.TP 5
-EXPECT ?attribute-name predicate(s)
+\fBEXPECT !\fIattribute-name\fR
+Specifies that the response must/may/must not include the named attribute. Additional requirements can be added as predicates - see the "EXPECT PREDICATES" section for more information on predicates. Attribute names can specify member attributes by separating the attribute and member names with the forward slash, for example "media\-col/media\-size/x\-dimension".
.TP 5
-EXPECT !attribute-name
-Specifies that the response must/may/must not include the named attribute.
-Additional requirements can be added as predicates - see the "EXPECT PREDICATES"
-section for more information on predicates.
+\fBEXPECT-ALL \fIattribute-name \fR[ \fIpredicate(s) \fR]
.TP 5
-FILE filename
-Specifies a file to include at the end of the request. This is typically used
-when sending a test print file.
+\fBEXPECT-ALL ?\fIattribute-name predicate(s)\fR
+Specifies that the response must/may include the named attribute and that all occurrences of that attribute must match the given predicates.
.TP 5
-GROUP tag
+\fBFILE filename\fR
+Specifies a file to include at the end of the request. This is typically used when sending a test print file.
+.TP 5
+\fBGROUP tag\fR
Specifies the group tag for subsequent attributes in the request.
.TP 5
-IGNORE-ERRORS yes
+\fBIGNORE\-ERRORS yes\fR
.TP 5
-IGNORE-ERRORS no
-Specifies whether \fIipptool\fR will ignore errors and continue with subsequent
-tests.
+\fBIGNORE\-ERRORS no\fR
+Specifies whether
+.BR ipptool (8)
+will ignore errors and continue with subsequent tests.
.TP 5
-NAME "literal string"
+\fBNAME "\fIliteral string\fB"\fR
Specifies the human-readable name of the test.
.TP 5
-OPERATION operation-code
+\fBOPERATION \fIoperation-code\fR
Specifies the operation to be performed.
.TP 5
-REQUEST-ID number
+\fBPAUSE "\fImessage\fB"\fR
+Displays the provided message and waits for the user to press a key to continue.
+.TP 5
+\fBREQUEST\-ID \fInumber\fR\fR
+.TP 5
+\fBREQUEST\-ID random\fR
+Specifies the request-id value to use in the request, either an integer or the word "random" to use a randomly generated value (the default).
.TP 5
-REQUEST-ID random
-Specifies the request-id value to use in the request, either an integer or the
-word "random" to use a randomly generated value (the default).
+\fBRESOURCE \fIpath\fR
+Specifies an alternate resource path that is used for the HTTP POST request. The default is the resource from the URI provided to the
+.BR ipptool (8)
+program.
.TP 5
-RESOURCE path
-Specifies an alternate resource path that is used for the HTTP POST request.
-The default is the resource from the URI provided to the \fIipptool\fR program.
+\fBSKIP\-IF\-DEFINED \fIvariable-name\fR
.TP 5
-SKIP-IF-DEFINED variable-name
+\fBSKIP\-IF\-NOT\-DEFINED \fIvariable-name\fR
+Specifies that the current test should be skipped when the variable is or is not defined.
.TP 5
-SKIP-IF-NOT-DEFINED variable-name
-Specifies that the current test should be skipped when the variable is or is not
-defined.
+\fBSKIP\-PREVIOUS\-ERROR yes\fR
.TP 5
-SKIP-PREVIOUS-ERROR yes
+\fBSKIP\-PREVIOUS\-ERROR no\fR
+Specifies whether
+.BR ipptool (8)
+will skip the current test if the previous test resulted in an error/failure.
.TP 5
-SKIP-PREVIOUS-ERROR no
-Specifies whether \fIipptool\fR will skip the current test if the previous test
-resulted in an error/failure.
+\fBSTATUS \fIstatus-code \fR[ \fIpredicate\fR ]
+Specifies an expected response status-code value. Additional requirements can be added as predicates - see the "STATUS PREDICATES" section for more information on predicates.
.TP 5
-STATUS status-code [ predicate ]
-Specifies an expected response status-code value. Additional requirements can be
-added as predicates - see the "STATUS PREDICATES" section for more information
-on predicates.
+\fBTEST\-ID "\fIidentifier\fR"
+Specifies an identifier string for the current test.
.TP 5
-TRANSFER auto
-Specifies that this test will use "Transfer-Encoding: chunked" if it has an
-attached file or "Content-Length:" otherwise.
+\fBTRANSFER auto\fR
+Specifies that this test will use "Transfer-Encoding: chunked" if it has an attached file or "Content-Length:" otherwise.
.TP 5
-TRANSFER chunked
-Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked"
-header.
+\fBTRANSFER chunked\fR
+Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" header.
.TP 5
-TRANSFER length
+\fBTRANSFER length\fR
Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
.TP 5
-VERSION 1.0
+\fBVERSION 1.0\fR
.TP 5
-VERSION 1.1
+\fBVERSION 1.1\fR
.TP 5
-VERSION 2.0
+\fBVERSION 2.0\fR
.TP 5
-VERSION 2.1
+\fBVERSION 2.1\fR
.TP 5
-VERSION 2.2
+\fBVERSION 2.2\fR
Specifies the IPP version number to use for this test.
-
-.SH EXPECT PREDICATES
-The following predicates are understood following the EXPECT test directive:
+.SS EXPECT PREDICATES
+The following predicates are understood following the \fBEXPECT\fR test directive:
.TP 5
-COUNT number
-Requires the EXPECT attribute to have the specified number of values.
+\fBCOUNT \fInumber\fR
+Requires the \fBEXPECT\fR attribute to have the specified number of values.
.TP 5
-DEFINE-MATCH variable-name
-Defines the variable to "1" when the EXPECT condition matches. A side-effect of
-this predicate is that this EXPECT will never fail a test.
+\fBDEFINE\-MATCH \fIvariable-name\fR
+Defines the variable to "1" when the \fBEXPECT\fR condition matches. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
.TP 5
-DEFINE-NO-MATCH variable-name
-Defines the variable to "1" when the EXPECT condition does not match. A side-
-effect of this predicate is that this EXPECT will never fail a test.
+\fBDEFINE\-NO\-MATCH \fIvariable-name\fR
+Defines the variable to "1" when the \fBEXPECT\fR condition does not match. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
.TP 5
-DEFINE-VALUE variable-name
-Defines the variable to the value of the attribute when the EXPECT condition
-matches. A side-effect of this predicate is that this EXPECT will never fail a test.
+\fBDEFINE\-VALUE \fIvariable-name\fR
+Defines the variable to the value of the attribute when the \fBEXPECT\fR condition matches. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
.TP 5
-IF-DEFINED variable-name
-Makes the EXPECT conditions apply only if the specified variable is defined.
+\fBIF\-DEFINED \fIvariable-name\fR
+Makes the \fBEXPECT\fR conditions apply only if the specified variable is defined.
.TP 5
-IF-NOT-DEFINED variable-name
-Makes the EXPECT conditions apply only if the specified variable is not
-defined.
+\fBIF\-NOT\-DEFINED \fIvariable-name\fR
+Makes the \fBEXPECT\fR conditions apply only if the specified variable is not defined.
.TP 5
-IN-GROUP tag
-Requires the EXPECT attribute to be in the specified group tag.
+\fBIN\-GROUP \fItag\fR
+Requires the \fBEXPECT\fR attribute to be in the specified group tag.
.TP 5
-OF-TYPE tag[,tag,...]
-Requires the EXPECT attribute to use the specified value tag(s).
+\fBOF\-TYPE \fItag[,tag,...]\fR
+Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s).
.TP 5
-REPEAT-LIMIT number
+\fBREPEAT\-LIMIT \fInumber\fR
.br
-Specifies the maximum number of times to repeat. The default value is 1000.
+Specifies the maximum number of times to repeat if the \fBREPEAT-MATCH\fR or \fBREPEAT-NO-MATCH\fR predicate is specified. The default value is 1000.
.TP 5
-REPEAT-MATCH
+\fBREPEAT\-MATCH\fR
.TP 5
-REPEAT-NO-MATCH
-Specifies that the current test should be repeated when the EXPECT condition
-matches or does not match.
+\fBREPEAT\-NO\-MATCH\fR
+Specifies that the current test should be repeated when the \fBEXPECT\fR condition matches or does not match.
.TP 5
-SAME-COUNT-AS attribute-name
-Requires the EXPECT attribute to have the same number of values as the specified
-parallel attribute.
+\fBSAME\-COUNT\-AS \fIattribute-name\fR
+Requires the \fBEXPECT\fR attribute to have the same number of values as the specified parallel attribute.
.TP 5
-WITH-ALL-VALUES "literal string"
-Requires that all values of the EXPECT attribute match the literal string. Comparisons are case-sensitive.
+\fBWITH\-ALL\-HOSTNAMES "\fIliteral string\fB"\fR
.TP 5
-WITH-ALL-VALUES <number
+\fBWITH\-ALL\-HOSTNAMES "/\fIregular expression\fB/"\fR
+Requires that all URI values contain a matching hostname.
.TP 5
-WITH-ALL-VALUES =number
+\fBWITH\-ALL\-RESOURCES "\fIliteral string\fB"\fR
.TP 5
-WITH-ALL-VALUES >number
+\fBWITH\-ALL\-RESOURCES "/\fIregular expression\fB/"\fR
+Requires that all URI values contain a matching resource (including leading /).
.TP 5
-WITH-ALL-VALUES number[,number,...]
-Requires that all values of the EXPECT attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
+\fBWITH\-ALL\-SCHEMES "\fIliteral string\fB"\fR
.TP 5
-WITH-ALL-VALUES "false"
+\fBWITH\-ALL-SCHEMES "/\fIregular expression\fB/"\fR
+Requires that all URI values contain a matching scheme.
.TP 5
-WITH-ALL-VALUES "true"
-Requires that all values of the EXPECT attribute match the boolean value given.
+\fBWITH\-ALL\-VALUES "\fIliteral string\fB"\fR
+Requires that all values of the \fBEXPECT\fR attribute match the literal string. Comparisons are case-sensitive.
.TP 5
-WITH-ALL-VALUES "/regular expression/"
-Requires that all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+\fBWITH\-ALL\-VALUES <\fInumber\fR
.TP 5
-WITH-VALUE "literal string"
-Requires that at least one value of the EXPECT attribute matches the literal string. Comparisons are case-sensitive.
+\fBWITH\-ALL\-VALUES =\fInumber\fR
.TP 5
-WITH-VALUE <number
+\fBWITH\-ALL\-VALUES >\fInumber\fR
.TP 5
-WITH-VALUE =number
+\fBWITH\-ALL\-VALUES \fInumber\fR[\fI,...,number\fR]
+Requires that all values of the \fBEXPECT\fR attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
.TP 5
-WITH-VALUE >number
+\fBWITH\-ALL\-VALUES "false"\fR
.TP 5
-WITH-VALUE number[,number,...]
-Requires that at least one value of the EXPECT attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
+\fBWITH\-ALL\-VALUES "true"\fR
+Requires that all values of the \fBEXPECT\fR attribute match the boolean value given.
.TP 5
-WITH-VALUE "false"
+\fBWITH\-ALL\-VALUES "/\fIregular expression\fB/"\fR
+Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
.TP 5
-WITH-VALUE "true"
-Requires that at least one value of the EXPECT attribute matches the boolean value given.
+\fBWITH\-HOSTNAME "\fIliteral string\fB"\fR
.TP 5
-WITH-VALUE "/regular expression/"
-Requires that at least one value of the EXPECT attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
-
-.SH STATUS PREDICATES
-The following predicates are understood following the STATUS test directive:
+\fBWITH\-HOSTNAME "/\fIregular expression\fB/"\fR
+Requires that at least one URI value contains a matching hostname.
+.TP 5
+\fBWITH\-RESOURCE "\fIliteral string\fB"\fR
+.TP 5
+\fBWITH\-RESOURCE "/\fIregular expression\fB/"\fR
+Requires that at least one URI value contains a matching resource (including leading /).
+.TP 5
+\fBWITH\-SCHEME "\fIliteral string\fB"\fR
+.TP 5
+\fBWITH\-SCHEME "/\fIregular expression\fB/"\fR
+Requires that at least one URI value contains a matching scheme.
+.TP 5
+\fBWITH\-VALUE "\fIliteral string\fB"\fR
+Requires that at least one value of the \fBEXPECT\fR attribute matches the literal string. Comparisons are case-sensitive.
.TP 5
-DEFINE-MATCH variable-name
-Defines the variable to "1" when the STATUS matches. A side-effect of this predicate is that this STATUS will never fail a test.
+\fBWITH\-VALUE <\fInumber\fR
.TP 5
-DEFINE-NO-MATCH variable-name
-Defines the variable to "1" when the STATUS does not match. A side-effect of this predicate is that this STATUS will never fail a test.
+\fBWITH\-VALUE =\fInumber\fR
.TP 5
-IF-DEFINED variable-name
-Makes the STATUS apply only if the specified variable is defined.
+\fBWITH\-VALUE >\fInumber\fR
.TP 5
-IF-NOT-DEFINED variable-name
-Makes the STATUS apply only if the specified variable is not defined.
+\fBWITH\-VALUE \fInumber\fR[\fI,...,number\fR]
+Requires that at least one value of the \fBEXPECT\fR attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
.TP 5
-REPEAT-LIMIT number
+\fBWITH\-VALUE "false"\fR
+.TP 5
+\fBWITH\-VALUE "true"\fR
+Requires that at least one value of the \fBEXPECT\fR attribute matches the boolean value given.
+.TP 5
+\fBWITH\-VALUE "/\fIregular expression\fB/"\fR
+Requires that at least one value of the \fBEXPECT\fR attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+.TP 5
+\fBWITH\-VALUE\-FROM \fIattribute-name\fR
+Requires that the value(s) of the \fBEXPECT\fR attribute matches the value(s) in the specified attribute.
+For example, "EXPECT job\-sheets WITH\-VALUE\-FROM job\-sheets\-supported" requires that the "job\-sheets" value is listed as a value of the "job\-sheets\-supported" attribute.
+.SS STATUS PREDICATES
+The following predicates are understood following the \fBSTATUS\fR test directive:
+.TP 5
+\fBDEFINE\-MATCH \fIvariable-name\fR
+Defines the variable to "1" when the \fBSTATUS\fR matches. A side-effect of this predicate is that this \fBSTATUS\fR will never fail a test.
+.TP 5
+\fBDEFINE\-NO\-MATCH \fIvariable-name\fR
+Defines the variable to "1" when the \fBSTATUS\fR does not match. A side-effect of this predicate is that this \fBSTATUS\fR will never fail a test.
+.TP 5
+\fBIF\-DEFINED \fIvariable-name\fR
+Makes the \fBSTATUS\fR apply only if the specified variable is defined.
+.TP 5
+\fBIF\-NOT\-DEFINED \fIvariable-name\fR
+Makes the \fBSTATUS\fR apply only if the specified variable is not defined.
+.TP 5
+\fBREPEAT\-LIMIT \fInumber\fR
.br
Specifies the maximum number of times to repeat. The default value is 1000.
.TP 5
-REPEAT-MATCH
+\fBREPEAT\-MATCH\fR
.TP 5
-REPEAT-NO-MATCH
-Specifies that the current test should be repeated when the response status-code
-matches or does not match the value specified by the STATUS directive.
-
-.SH OPERATION CODES
-Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from
-RFC 2911 and other IPP extension specifications. Here is a complete list:
+\fBREPEAT\-NO\-MATCH\fR
+Specifies that the current test should be repeated when the response status-code matches or does not match the value specified by the STATUS directive.
+.SS OPERATION CODES
+Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 2911 and other IPP extension specifications. Here is a complete list of names supported by
+.BR ipptool (8):
.nf
- Activate-Printer
- CUPS-Accept-Jobs
- CUPS-Add-Modify-Class
- CUPS-Add-Modify-Printer
- CUPS-Authenticate-Job
- CUPS-Delete-Class
- CUPS-Delete-Printer
- CUPS-Get-Classes
- CUPS-Get-Default
- CUPS-Get-Devices
- CUPS-Get-Document
- CUPS-Get-PPD
- CUPS-Get-PPDs
- CUPS-Get-Printers
- CUPS-Move-Job
- CUPS-Reject-Jobs
- CUPS-Set-Default
- Cancel-Current-Job
- Cancel-Job
- Cancel-Jobs
- Cancel-My-Jobs
- Cancel-Subscription
- Close-Job
- Create-Job
- Create-Job-Subscription
- Create-Printer-Subscription
- Deactivate-Printer
- Disable-Printer
- Enable-Printer
- Get-Job-Attributes
- Get-Jobs
- Get-Notifications
- Get-Printer-Attributes
- Get-Printer-Support-Files
- Get-Printer-Supported-Values
- Get-Subscription-Attributes
- Get-Subscriptions
- Hold-Job
- Hold-New-Jobs
- Identify-Printer
- Pause-Printer
- Pause-Printer-After-Current-Job
- Print-Job
- Print-URI
- Promote-Job
- Purge-Jobs
- Release-Held-New-Jobs
- Release-Job
- Renew-Subscription
- Reprocess-Job
- Restart-Job
- Restart-Printer
- Resubmit-Job
- Resume-Job
- Resume-Printer
- Schedule-Job-After
- Send-Document
- Send-Notifications
- Send-URI
- Set-Job-Attributes
- Set-Printer-Attributes
- Shutdown-Printer
- Startup-Printer
- Suspend-Current-Job
- Validate-Document
- Validate-Job
-.fi
-.SH STATUS CODES
-Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
-2911 and other IPP extension specifications. Here is a complete list:
-.nf
- client-error-attributes-not-settable
- client-error-attributes-or-values-not-supported
- client-error-bad-request
- client-error-charset-not-supported
- client-error-compression-error
- client-error-compression-not-supported
- client-error-conflicting-attributes
- client-error-document-access-error
- client-error-document-format-error
- client-error-document-format-not-supported
- client-error-document-password-error
- client-error-document-permission-error
- client-error-document-security-error
- client-error-document-unprintable-error
- client-error-forbidden
- client-error-gone
- client-error-ignored-all-notifications
- client-error-ignored-all-subscriptions
- client-error-not-authenticated
- client-error-not-authorized
- client-error-not-found
- client-error-not-possible
- client-error-print-support-file-not-found
- client-error-request-entity-too-large
- client-error-request-value-too-long
- client-error-timeout
- client-error-too-many-subscriptions
- client-error-uri-scheme-not-supported
- cups-see-other
- redirection-other-site
- server-error-busy
- server-error-device-error
- server-error-internal-error
- server-error-job-canceled
- server-error-multiple-document-jobs-not-supported
- server-error-not-accepting-jobs
- server-error-operation-not-supported
- server-error-printer-is-deactivated
- server-error-service-unavailable
- server-error-temporary-error
- server-error-version-not-supported
- successful-ok
- successful-ok-but-cancel-subscription
- successful-ok-conflicting-attributes
- successful-ok-events-complete
- successful-ok-ignored-notifications
- successful-ok-ignored-or-substituted-attributes
- successful-ok-ignored-subscriptions
- successful-ok-too-many-events
+ Activate\-Printer
+ CUPS\-Accept\-Jobs
+ CUPS\-Add\-Modify\-Class
+ CUPS\-Add\-Modify\-Printer
+ CUPS\-Authenticate\-Job
+ CUPS\-Delete\-Class
+ CUPS\-Delete\-Printer
+ CUPS\-Get\-Classes
+ CUPS\-Get\-Default
+ CUPS\-Get\-Devices
+ CUPS\-Get\-Document
+ CUPS\-Get\-PPD
+ CUPS\-Get\-PPDs
+ CUPS\-Get\-Printers
+ CUPS\-Move\-Job
+ CUPS\-Reject\-Jobs
+ CUPS\-Set\-Default
+ Cancel\-Current\-Job
+ Cancel\-Job
+ Cancel\-Jobs
+ Cancel\-My\-Jobs
+ Cancel\-Subscription
+ Close\-Job
+ Create\-Job
+ Create\-Job\-Subscriptions
+ Create\-Printer\-Subscriptions
+ Deactivate\-Printer
+ Disable\-Printer
+ Enable\-Printer
+ Get\-Job\-Attributes
+ Get\-Jobs
+ Get\-Notifications
+ Get\-Printer\-Attributes
+ Get\-Printer\-Support\-Files
+ Get\-Printer\-Supported\-Values
+ Get\-Subscription\-Attributes
+ Get\-Subscriptions
+ Hold\-Job
+ Hold\-New\-Jobs
+ Identify\-Printer
+ Pause\-Printer
+ Pause\-Printer\-After\-Current\-Job
+ Print\-Job
+ Print\-URI
+ Promote\-Job
+ Purge\-Jobs
+ Release\-Held\-New\-Jobs
+ Release\-Job
+ Renew\-Subscription
+ Reprocess\-Job
+ Restart\-Job
+ Restart\-Printer
+ Resubmit\-Job
+ Resume\-Job
+ Resume\-Printer
+ Schedule\-Job\-After
+ Send\-Document
+ Send\-Hardcopy\-Document
+ Send\-Notifications
+ Send\-URI
+ Set\-Job\-Attributes
+ Set\-Printer\-Attributes
+ Shutdown\-Printer
+ Startup\-Printer
+ Suspend\-Current\-Job
+ Validate\-Document
+ Validate\-Job
.fi
+.SS STATUS CODES
+Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 2911 and other IPP extension specifications. Here is a complete list of the names supported by
+.BR ipptool (8):
+.nf
-.SH TAGS
-Value and group tags correspond to the names from RFC 2911 and other IPP
-extension specifications. Here are the group tags:
+ client\-error\-account\-authorization\-failed
+ client\-error\-account\-closed
+ client\-error\-account\-info\-needed
+ client\-error\-account\-limit\-reached
+ client\-error\-attributes\-not\-settable
+ client\-error\-attributes\-or\-values\-not\-supported
+ client\-error\-bad\-request
+ client\-error\-charset\-not\-supported
+ client\-error\-compression\-error
+ client\-error\-compression\-not\-supported
+ client\-error\-conflicting\-attributes
+ client\-error\-document\-access\-error
+ client\-error\-document\-format\-error
+ client\-error\-document\-format\-not\-supported
+ client\-error\-document\-password\-error
+ client\-error\-document\-permission\-error
+ client\-error\-document\-security\-error
+ client\-error\-document\-unprintable\-error
+ client\-error\-forbidden
+ client\-error\-gone
+ client\-error\-ignored\-all\-notifications
+ client\-error\-ignored\-all\-subscriptions
+ client\-error\-not\-authenticated
+ client\-error\-not\-authorized
+ client\-error\-not\-found
+ client\-error\-not\-possible
+ client\-error\-print\-support\-file\-not\-found
+ client\-error\-request\-entity\-too\-large
+ client\-error\-request\-value\-too\-long
+ client\-error\-timeout
+ client\-error\-too\-many\-subscriptions
+ client\-error\-uri\-scheme\-not\-supported
+ cups\-error\-account\-authorization\-failed
+ cups\-error\-account\-closed
+ cups\-error\-account\-info\-needed
+ cups\-error\-account\-limit\-reached
+ cups\-see\-other
+ redirection\-other\-site
+ server\-error\-busy
+ server\-error\-device\-error
+ server\-error\-internal\-error
+ server\-error\-job\-canceled
+ server\-error\-multiple\-document\-jobs\-not\-supported
+ server\-error\-not\-accepting\-jobs
+ server\-error\-operation\-not\-supported
+ server\-error\-printer\-is\-deactivated
+ server\-error\-service\-unavailable
+ server\-error\-temporary\-error
+ server\-error\-version\-not\-supported
+ successful\-ok
+ successful\-ok\-but\-cancel\-subscription
+ successful\-ok\-conflicting\-attributes
+ successful\-ok\-events\-complete
+ successful\-ok\-ignored\-notifications
+ successful\-ok\-ignored\-or\-substituted\-attributes
+ successful\-ok\-ignored\-subscriptions
+ successful\-ok\-too\-many\-events
+.fi
+.SS TAGS
+Value and group tags correspond to the names from RFC 2911 and other IPP extension specifications. Here are the group tags:
.nf
- event-notification-attributes-tag
- job-attributes-tag
- operation-attributes-tag
- printer-attributes-tag
- subscription-attributes-tag
- unsupported-attributes-tag
+
+ document\-attributes\-tag
+ event\-notification\-attributes\-tag
+ job\-attributes\-tag
+ operation\-attributes\-tag
+ printer\-attributes\-tag
+ subscription\-attributes\-tag
+ unsupported\-attributes\-tag
.fi
.LP
Here are the value tags:
.nf
- admin-define
+
+ admin\-define
boolean
charset
collection
dateTime
default
- delete-attribute
+ delete\-attribute
enum
integer
keyword
@@ -500,8 +543,8 @@ Here are the value tags:
nameWithLanguage
nameWithoutLanguage
naturalLanguage
- no-value
- not-settable
+ no\-value
+ not\-settable
octetString
rangeOfInteger
resolution
@@ -512,63 +555,71 @@ Here are the value tags:
uri
uriScheme
.fi
-
-.SH VARIABLES
-The \fIipptool\fR program maintains a list of variables that can be used in any
-literal string or attribute value by specifying "$variable-name". Aside from
-variables defined using the "-d" option or "DEFINE" directive, the following
-pre-defined variables are available:
+.SS VARIABLES
+The
+.BR ipptool (8)
+program maintains a list of variables that can be used in any literal string or attribute value by specifying "\fI$variable-name\fR". Aside from variables defined using the \fI-d\fR option or \fBDEFINE\fR directive, the following pre-defined variables are available:
.TP 5
-$$
+\fB$$\fR
Inserts a single "$" character.
.TP 5
-$ENV[name]
-Inserts the value of the named environment variable, or an empty string if the
-environment variable is not defined.
+\fB$ENV[\fIname\fB]\fR
+Inserts the value of the named environment variable, or an empty string if the environment variable is not defined.
.TP 5
-$filename
-Inserts the filename provided to \fIipptool\fR with the "-f" option.
+\fB$filename\fR
+Inserts the filename provided to
+.BR ipptool (8)
+with the \fI-f\fR option.
.TP 5
-$hostname
-Inserts the hostname from the URI provided to \fIipptool\fR.
+\fB$filetype\fR
+Inserts the MIME media type for the filename provided to
+.BR ipptool (8)
+with the \fI-f\fR option.
.TP 5
-$job-id
-Inserts the last job-id value returned in a test response or 0 if no job-id has
-been seen.
+\fB$hostname\fR
+Inserts the hostname from the URI provided to
+.BR ipptool (8).
.TP 5
-$job-uri
-Inserts the last job-uri value returned in a test response or an empty string if
-no job-uri has been seen.
+\fB$job\-id\fR
+Inserts the last "job\-id" attribute value returned in a test response or 0 if no "job\-id" attribute has been seen.
.TP 5
-$scheme
-Inserts the scheme from the URI provided to \fIipptool\fR.
+\fB$job\-uri\fR
+Inserts the last "job\-uri" attribute value returned in a test response or an empty string if no "job\-uri" attribute has been seen.
.TP 5
-$notify-subscription-id
-Inserts the last notify-subscription-id value returned in a test response or 0 if
-no notify-subscription-id has been seen.
+\fB$notify\-subscription\-id\fR
+Inserts the last "notify\-subscription\-id" attribute value returned in a test response or 0 if no "notify\-subscription\-id" attribute has been seen.
.TP 5
-$port
-Inserts the port number from the URI provided to \fIipptool\fR.
+\fB$port\fR
+Inserts the port number from the URI provided to
+.BR ipptool (8).
.TP 5
-$resource
-Inserts the resource path from the URI provided to \fIipptool\fR.
+\fB$resource\fR
+Inserts the resource path from the URI provided to
+.BR ipptool (8).
.TP 5
-$uri
-Inserts the URI provided to \fIipptool\fR.
+\fB$scheme\fR
+Inserts the scheme from the URI provided to
+.BR ipptool (8).
.TP 5
-$user
-Inserts the current user's login name.
+\fB$uri\fR
+Inserts the URI provided to
+.BR ipptool (8).
.TP 5
-$username
-Inserts the username from the URI provided to \fIipptool\fR, if any.
-
+\fB$uriuser\fR
+Inserts the username from the URI provided to
+.BR ipptool (8),
+if any.
+.TP 5
+\fB$user\fR
+Inserts the current user's login name.
.SH SEE ALSO
-\fIipptool(1)\fR,
-.br
-http://localhost:631/help
-
+.BR ipptool (1),
+CUPS Online Help (http://localhost:631/help),
+IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations),
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp),
+RFC 2911 (http://tools.ietf.org/html/rfc3911)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id$".
+.\" End of "$Id: ipptoolfile.man 12487 2015-02-05 15:42:59Z msweet $".
.\"
diff --git a/man/lp.man b/man/lp.man
index 9846624..cd4237b 100644
--- a/man/lp.man
+++ b/man/lp.man
@@ -1,252 +1,222 @@
.\"
-.\" "$Id: lp.man 7889 2008-08-29 22:03:35Z mike $"
+.\" "$Id: lp.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lp man page for CUPS.
+.\" lp man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lp 1 "CUPS" "16 July 2012" "Apple Inc."
+.TH lp 1 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
-lp - print files
+lp \- print files
.SH SYNOPSIS
.B lp
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -c ] [ -d
-.I destination[/instance]
-] [ -h
-.I hostname[:port]
-] [ -m ] [ -n
+] [
+.B \-c
+] [
+\fB\-d \fIdestination\fR[\fB/\fIinstance\fR]
+] [
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B \-m
+] [
+.B \-n
.I num-copies
-] [ -o
-.I option[=value]
-] [ -q
+] [
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
+] [
+.B \-q
.I priority
-] [ -s ] [ -t
+] [
+.B \-s
+] [
+.B \-t
.I title
-] [ -H
+] [
+.B \-H
.I handling
-] [ -P
+] [
+.B \-P
.I page-list
-] [ -- ] [
+] [
+.B \-\-
+] [
.I file(s)
]
.br
.B lp
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -c ] [ -h
-.I hostname[:port]
-] [ -i
+] [
+.B \-c
+] [
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B \-i
.I job-id
-] [ -n
+] [
+.B \-n
.I num-copies
-] [ -o
-.I option[=value]
-] [ -q
+] [
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
+] [
+.B \-q
.I priority
-] [ -t
+] [
+.B \-t
.I title
-] [ -H
+] [
+.B \-H
.I handling
-] [ -P
+] [
+.B \-P
.I page-list
]
.SH DESCRIPTION
-\fIlp\fR submits files for printing or alters a pending job. Use
-a filename of "-" to force printing from the standard input.
-.SH THE DEFAULT DESTINATION
-CUPS provides many ways to set the default destination. The "LPDEST" and
-"PRINTER" environment variables are consulted first. If neither are set,
-the current default set using the \fIlpoptions(1)\fR command is used,
-followed by the default set using the \fIlpadmin(8)\fR command.
+\fBlp\fR submits files for printing or alters a pending job.
+Use a filename of "-" to force printing from the standard input.
+.SS THE DEFAULT DESTINATION
+CUPS provides many ways to set the default destination. The \fBLPDEST\fR and \fBPRINTER\fR environment variables are consulted first.
+If neither are set, the current default set using the
+.BR lpoptions (1)
+command is used, followed by the default set using the
+.BR lpadmin (8)
+command.
.SH OPTIONS
The following options are recognized by \fIlp\fR:
.TP 5
---
-.br
-Marks the end of options; use this to print a file whose name
-begins with a dash (-).
+.B \-\-
+Marks the end of options; use this to print a file whose name begins with a dash (\-).
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Specifies the username to use when connecting to the server.
.TP 5
--c
-.br
-This option is provided for backwards-compatibility only. On
-systems that support it, this option forces the print file to be
-copied to the spool directory before printing. In CUPS, print
-files are always sent to the scheduler via IPP which has the
-same effect.
+.B \-c
+This option is provided for backwards-compatibility only. On systems that support it, this option forces the print file to be copied to the spool directory before printing.
+In CUPS, print files are always sent to the scheduler via IPP which has the same effect.
.TP 5
--d destination
-.br
+\fB\-d \fIdestination\fR
Prints files to the named printer.
.TP 5
--h hostname[:port]
-.br
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
Chooses an alternate server.
.TP 5
--i job-id
-.br
+\fB\-i \fIjob-id\fR
Specifies an existing job to modify.
.TP 5
--m
-.br
+.B \-m
Sends an email when the job is completed.
.TP 5
--n copies
-.br
-Sets the number of copies to print from 1 to 100.
+\fB\-n \fIcopies\fR
+Sets the number of copies to print.
.TP 5
--o "name=value [name=value ...]"
-.br
+\fB\-o "\fIname\fB=\fIvalue \fR[ ... \fIname\fB=\fIvalue \fR]\fB"\fR
Sets one or more job options.
.TP 5
--q priority
-.br
-Sets the job priority from 1 (lowest) to 100 (highest). The
-default priority is 50.
+\fB\-q \fIpriority\fR
+Sets the job priority from 1 (lowest) to 100 (highest).
+The default priority is 50.
.TP 5
--s
-.br
+.B \-s
Do not report the resulting job IDs (silent mode.)
.TP 5
--t "name"
-.br
+\fB\-t "\fIname\fB"\fR
Sets the job name.
.TP 5
--H hh:mm
+\fB\-H \fIhh:mm\fR
.TP 5
--H hold
+\fB\-H hold\fR
.TP 5
--H immediate
+\fB-H immediate\fR
.TP 5
--H restart
+\fB-H restart\fR
.TP 5
--H resume
-.br
-Specifies when the job should be printed. A value of \fIimmediate\fR will print
-the file immediately, a value of \fIhold\fR will hold the job indefinitely, and
-a UTC time value (HH:MM) will hold the job until the specified UTC (not local)
-time. Use a value of \fIresume\fR with the \fI-i\fR option to resume a held job.
-Use a value of \fIrestart\fR with the \fI-i\fR option to restart
-a completed job.
-.TP 5
--P page-list
-.br
-Specifies which pages to print in the document. The list can
-contain a list of numbers and ranges (#-#) separated by commas
-(e.g. 1,3-5,16). The page numbers refer to the output pages and
-not the document's original pages - options like "number-up" can
-affect the numbering of the pages.
-.SH COMMON JOB OPTIONS
-Aside from the printer-specific options reported by the
-\fIlpoptions(1)\fR command, the following generic options are
-available:
+\fB-H resume\fR
+Specifies when the job should be printed.
+A value of \fIimmediate\fR will print the file immediately, a value of \fIhold\fR will hold the job indefinitely, and a UTC time value (HH:MM) will hold the job until the specified UTC (not local) time.
+Use a value of \fIresume\fR with the \fI-i\fR option to resume a held job.
+Use a value of \fIrestart\fR with the \fI-i\fR option to restart a completed job.
.TP 5
--o media=size
-.br
-Sets the page size to \fIsize\fR. Most printers support at least
-the size names "a4", "letter", and "legal".
+\fB\-P \fIpage-list\fR
+Specifies which pages to print in the document.
+The list can contain a list of numbers and ranges (#-#) separated by commas, e.g., "1,3-5,16".
+The page numbers refer to the output pages and not the document's original pages - options like "number-up" can affect the numbering of the pages.
+.SS COMMON JOB OPTIONS
+Aside from the printer-specific options reported by the
+.BR lpoptions (1)
+command, the following generic options are available:
.TP 5
--o landscape
+\fB\-o media=\fIsize\fR
+Sets the page size to \fIsize\fR. Most printers support at least the size names "a4", "letter", and "legal".
.TP 5
--o orientation-requested=4
-.br
+\fB\-o orientation\-requested=4\fR
Prints the job in landscape (rotated 90 degrees).
.TP 5
--o sides=one-sided
+\fB\-o sides=one\-sided\fR
+Prints on one side of the paper.
.TP 5
--o sides=two-sided-long-edge
+\fB\-o sides=two\-sided\-long\-edge\fR
+Prints on both sides of the paper for portrait output.
.TP 5
--o sides=two-sided-short-edge
-.br
-Prints on one or two sides of the paper. The value
-"two-sided-long-edge" is normally used when printing portrait
-(unrotated) pages, while "two-sided-short-edge" is used for
-landscape pages.
+\fB\-o sides=two\-sided\-short\-edge\fR
+Prints on both sides of the paper for landscape output.
.TP 5
--o fit-to-page
-.br
+\fB\-o fit\-to\-page\fR
Scales the print file to fit on the page.
.TP 5
--o number-up=2
-.TP 5
--o number-up=4
-.TP 5
--o number-up=6
-.TP 5
--o number-up=9
-.TP 5
--o number-up=16
-.br
-Prints multiple document pages on each output page.
-.TP 5
--o cpi=N
-.br
-Sets the number of characters per inch to use when printing a
-text file. The default is 10.
-.TP 5
--o lpi=N
-.br
-Sets the number of lines per inch to use when printing a text
-file. The default is 6.
-.TP 5
--o page-bottom=N
-.TP 5
--o page-left=N
-.TP 5
--o page-right=N
-.TP 5
--o page-top=N
-.br
-Sets the page margins when printing text files. The values are in
-points - there are 72 points to the inch.
+\fB\-o number\-up=\fR{\fI2|4|6|9|16\fR}
+Prints 2, 4, 6, 9, or 16 document (input) pages on each output page.
+.SH CONFORMING TO
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
+Also, printer and class names are \fInot\fR case-sensitive.
+.LP
+The \fI-q\fR option accepts a different range of values than the Solaris lp command, matching the IPP job priority values (1-100, 100 is highest priority) instead of the Solaris values (0-39, 0 is highest priority).
.SH EXAMPLES
-Print a double-sided legal document to a printer called "foo":
+Print two copies of a document to the default printer:
.nf
- lp -d foo -o media=legal -o sides=two-sided-long-edge filename
+
+ lp -n 2 filename
+
.fi
-.LP
-Print an image across 4 pages:
+Print a double-sided legal document to a printer called "foo":
.nf
- lp -d bar -o scaling=200 filename
+
+ lp -d foo -o media=legal -o sides=two-sided-long-edge filename
+
.fi
-.LP
-Print a text file with 12 characters per inch, 8 lines per inch, and
-a 1 inch left margin:
+Print a presentation document 2-up to a printer called "foo":
.nf
- lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename
+
+ lp -d foo -o number-up=2 filename
.fi
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
-Also, printer and class names are \fInot\fR case-sensitive.
-.LP
-The "q" option accepts a different range of values than the
-Solaris lp command, matching the IPP job priority values (1-100,
-100 is highest priority) instead of the Solaris values (0-39, 0
-is highest priority).
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlpadmin(8)\fR, \fIlpmove(8)\fR, \fIlpoptions(1)\fR,
-\fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR lpadmin (8),
+.BR lpoptions (1),
+.BR lpq (1),
+.BR lpr (1),
+.BR lprm (1),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lp.man 7889 2008-08-29 22:03:35Z mike $".
+.\" End of "$Id: lp.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lpadmin.man b/man/lpadmin.man
index 0ec81b0..1790022 100644
--- a/man/lpadmin.man
+++ b/man/lpadmin.man
@@ -1,227 +1,220 @@
.\"
-.\" "$Id: lpadmin.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpadmin.man 12513 2015-02-11 19:45:01Z msweet $"
.\"
-.\" lpadmin man page for CUPS.
+.\" lpadmin man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpadmin 8 "CUPS" "16 July 2012" "Apple Inc."
+.TH lpadmin 8 "CUPS" "11 February 2015" "Apple Inc."
.SH NAME
lpadmin \- configure cups printers and classes
.SH SYNOPSIS
.B lpadmin
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] -d
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+.B \-d
.I destination
.br
.B lpadmin
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] -p
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+.B \-p
.I destination
-[ -R
+[
+.B \-R
.I name-default
]
.I option(s)
.br
.B lpadmin
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] -x
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+.B \-x
.I destination
.SH DESCRIPTION
-\fIlpadmin\fR configures printer and class queues provided by
-CUPS. It can also be used to set the server default printer or
-class.
+\fBlpadmin\fR configures printer and class queues provided by CUPS.
+It can also be used to set the server default printer or class.
.LP
-When specified before the \fI-d\fR, \fI-p\fR, or \fI-x\fR
-options, the \fI-E\fR option forces encryption when connecting to
-the server.
+When specified before the \fI-d\fR, \fI-p\fR, or \fI-x\fR options, the \fI-E\fR option forces encryption when connecting to the server.
.LP
-The first form of the command (\fI-d\fR) sets the default printer
-or class to \fIdestination\fR. Subsequent print jobs submitted
-via the \fIlp(1)\fR or \fIlpr(1)\fR commands will use this
-destination unless the user specifies otherwise with the
-\fIlpoptions(1)\fR command.
+The first form of the command (\fI-d\fR) sets the default printer or class to \fIdestination\fR.
+Subsequent print jobs submitted via the
+.BR lp (1)
+or
+.BR lpr (1)
+commands will use this destination unless the user specifies otherwise with the
+.BR lpoptions (1)
+command.
.LP
-The second form of the command (\fI-p\fR) configures the named
-printer or class. The additional options are described below.
+The second form of the command (\fI-p\fR) configures the named printer or class. The additional options are described below.
.LP
-The third form of the command (\fI-x\fR) deletes the printer or
-class \fIdestination\fR. Any jobs that are pending for the
-destination will be removed and any job that is currently printed
-will be aborted.
-.SH CONFIGURATION OPTIONS
-The following options are recognized when configuring a printer
-queue:
-.TP 5
--c class
-.br
-Adds the named \fIprinter\fR to \fIclass\fR. If \fIclass\fR does
-not exist it is created automatically.
+The third form of the command (\fI-x\fR) deletes the printer or class \fIdestination\fR.
+Any jobs that are pending for the destination will be removed and any job that is currently printed will be aborted.
+.SH OPTIONS
+The following options are recognized when configuring a printer queue:
.TP 5
--i interface
-.br
-Sets a System V style interface script for the printer. This
-option cannot be specified with the \fI-P\fR option (PPD file)
-and is intended for providing support for legacy printer drivers.
+\fB\-c \fIclass\fR
+Adds the named \fIprinter\fR to \fIclass\fR.
+If \fIclass\fR does not exist it is created automatically.
.TP 5
--m model
-.br
-Sets a standard System V interface script or PPD file for the printer from the
-\fImodel\fR directory or using one of the driver interfaces. Use the \fI-m\fR
-option with the \fIlpinfo(8)\fR command to get a list of supported models.
+\fB\-i \fIinterface\fR
+Sets a System V style interface script for the printer.
+This option cannot be specified with the \fI-P\fR option (PPD file) and is intended for providing support for legacy printer drivers.
.TP 5
--o cupsIPPSupplies=true
+\fB\-m \fImodel\fR
+Sets a standard System V interface script or PPD file for the printer from the \fImodel\fR directory or using one of the driver interfaces.
+Use the \fI-m\fR option with the
+.BR lpinfo (8)
+command to get a list of supported models.
+The model "raw" clears any existing interface script or PPD file and the model "everywhere" queries the printer referred to by the specified IPP \fIdevice-uri\fR.
.TP 5
--o cupsIPPSupplies=false
-.br
+\fB\-o cupsIPPSupplies=true\fR
+.TP 5
+\fB\-o cupsIPPSupplies=false\fR
Specifies whether IPP supply level values should be reported.
.TP 5
--o cupsSNMPSupplies=true
+\fB\-o cupsSNMPSupplies=true\fR
.TP 5
--o cupsSNMPSupplies=false
-.br
+\fB\-o cupsSNMPSupplies=false\fR
Specifies whether SNMP supply level (RFC 3805) values should be reported.
.TP 5
--o job-k-limit=value
-.br
-Sets the kilobyte limit for per-user quotas. The value is an
-integer number of kilobytes; one kilobyte is 1024 bytes.
+\fB\-o job\-k\-limit=\fIvalue\fR
+Sets the kilobyte limit for per-user quotas.
+The value is an integer number of kilobytes; one kilobyte is 1024 bytes.
.TP 5
--o job-page-limit=value
-.br
-Sets the page limit for per-user quotas. The value is the integer
-number of pages that can be printed; double-sided pages are
-counted as two pages.
+\fB\-o job\-page\-limit=\fIvalue\fR
+Sets the page limit for per-user quotas.
+The value is the integer number of pages that can be printed; double-sided pages are counted as two pages.
.TP 5
--o job-quota-period=value
-.br
-Sets the accounting period for per-user quotas. The value is an
-integer number of seconds; 86,400 seconds are in one day.
+\fB-o job\-quota\-period=\fIvalue\fR
+Sets the accounting period for per-user quotas.
+The value is an integer number of seconds; 86,400 seconds are in one day.
.TP 5
--o job-sheets-default=banner
+\fB\-o job\-sheets\-default=\fIbanner\fR
.TP 5
--o job-sheets-default=banner,banner
-.br
+\fB\-o job\-sheets\-default=\fIbanner\fB,\fIbanner\fR
Sets the default banner page(s) to use for print jobs.
.TP 5
--o name=value
-.br
-Sets a PPD option for the printer. PPD options can be listed using the \fI-l\fR
-option with the \fIlpoptions(1)\fR command.
-.TP 5
--o name-default=value
-.br
-Sets a default server-side option for the destination. Any print-time
-option can be defaulted, e.g. "-o cpi-default=17" to set the default
-"cpi" option value to 17.
-.TP 5
--o port-monitor=name
-.br
-Sets the binary communications program to use when printing,
-"none", "bcp", or "tbcp". The default program is "none". The
-specified port monitor must be listed in the printer's PPD file.
-.TP 5
--o printer-error-policy=name
-.br
-Sets the error policy to be used when the printer backend is
-unable to send the job to the printer. The name must be one of
-"abort-job", "retry-job", "retry-current-job", or "stop-printer". The default
-error policy is "stop-printer" for printers and "retry-current-job" for
+\fB\-o \fIname\fB=\fIvalue\fR
+Sets a PPD option for the printer.
+PPD options can be listed using the \fI-l\fR option with the
+.BR lpoptions (1)
+command.
+.TP 5
+\fB\-o \fIname\fB-default=\fIvalue\fR
+Sets a default server-side option for the destination.
+Any print-time option can be defaulted, e.g., "-o number-up-default=2" to set the default "number-up" option value to 2.
+.TP 5
+\fB\-o port\-monitor=\fIname\fR
+Sets the binary communications program to use when printing, "none", "bcp", or "tbcp".
+The default program is "none".
+The specified port monitor must be listed in the printer's PPD file.
+.TP 5
+\fB\-o printer-error-policy=\fIname\fR
+Sets the error policy to be used when the printer backend is unable to send the job to the printer.
+The name must be one of "abort-job", "retry-job", "retry-current-job", or "stop-printer".
+The default error policy is "stop-printer" for printers and "retry-current-job" for
classes.
.TP 5
--o printer-is-shared=true/false
-.br
+\fB\-o printer\-is\-shared=true\fR
+.TP 5
+\fB\-o printer\-is\-shared=false\fR
Sets the destination to shared/published or unshared/unpublished.
-Shared/published destinations are publicly announced by the server
-on the LAN based on the browsing configuration in
-\fBcupsd.conf\fR, while unshared/unpublished destinations are not
-announced. The default value is "true".
+Shared/published destinations are publicly announced by the server on the LAN based on the browsing configuration in \fIcupsd.conf\fR, while unshared/unpublished destinations are not announced.
+The default value is "true".
.TP 5
--o printer-op-policy=name
-.br
-Sets the IPP operation policy associated with the destination. The
-name must be defined in the \fBcupsd.conf\fR in a Policy section.
+\fB\-o printer-op-policy=\fIname\fR
+Sets the IPP operation policy associated with the destination.
+The name must be defined in the \fIcupsd.conf\fR in a Policy section.
The default operation policy is "default".
.TP 5
--R name-default
-.br
+\fB\-R \fIname\fB\-default\fR
Deletes the named option from \fIprinter\fR.
.TP 5
--r class
-.br
-Removes the named \fIprinter\fR from \fIclass\fR. If the
-resulting class becomes empty it is removed.
+\fB\-r \fIclass\fR
+Removes the named \fIprinter\fR from \fIclass\fR.
+If the resulting class becomes empty it is removed.
.TP 5
--u allow:user,user,@group
+\fB-u allow:\fR{\fIuser\fR|\fB@\fIgroup\fR}{\fB,\fIuser\fR|\fB,@\fIgroup\fR}*
.TP 5
--u deny:user,user,@group
+\fB-u deny:\fR{\fIuser\fR|\fB@\fIgroup\fR}{\fB,\fIuser\fR|\fB,@\fIgroup\fR}*
.TP 5
--u allow:all
+\fB\-u allow:all\fR
.TP 5
--u deny:none
-.br
-Sets user-level access control on a destination. Names starting with
-"@" are interpreted as UNIX groups. The latter two forms turn
-user-level access control off.
+\fB\-u deny:none\fR
+Sets user-level access control on a destination.
+Names starting with "@" are interpreted as UNIX groups.
+The latter two forms turn user-level access control off.
.TP 5
--v "device-uri"
-.br
-Sets the \fIdevice-uri\fR attribute of the printer queue. Use the \fI-v\fR
-option with the \fIlpinfo(8)\fR command to get a list of supported device URIs
-and schemes.
+\fB\-v "\fIdevice-uri\fB"\fR
+Sets the \fIdevice-uri\fR attribute of the printer queue.
+Use the \fI-v\fR option with the
+.BR lpinfo (8)
+command to get a list of supported device URIs and schemes.
.TP 5
--D "info"
-.br
+\fB\-D "\fIinfo\fB"\fR
Provides a textual description of the destination.
.TP 5
--E
-.br
+.B \-E
Enables the destination and accepts jobs; this is the same as running the
-\fIcupsaccept(8)\fR and \fIcupsenable(8)\fR programs on the destination.
+.BR cupsaccept (8)
+and
+.BR cupsenable (8)
+programs on the destination.
.TP 5
--L "location"
-.br
+\fB\-L "\fIlocation\fB"\fR
Provides a textual location of the destination.
.TP 5
--P ppd-file
-.br
-Specifies a PostScript Printer Description file to use with the
-printer. If specified, this option overrides the \fI-i\fR option
-(interface script).
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
+\fB\-P \fIppd-file\fR
+Specifies a PostScript Printer Description file to use with the printer.
+If specified, this option overrides the \fI-i\fR option (interface script).
+.SH CONFORMING TO
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#".
Also, printer and class names are \fInot\fR case-sensitive.
-Finally, the CUPS version of \fIlpadmin\fR may ask the user for
-an access password depending on the printing system
-configuration. This differs from the System V version which
-requires the root user to execute this command.
-.SH LIMITATIONS
-The CUPS version of \fIlpadmin\fR does not support all of the
-System V or Solaris printing system configuration options.
+Finally, the CUPS version of \fBlpadmin\fR may ask the user for an access password depending on the printing system configuration.
+This differs from the System V version which requires the root user to execute this command.
+.SH NOTES
+The CUPS version of \fBlpadmin\fR does not support all of the System V or Solaris printing system configuration options.
+.SH EXAMPLE
+Create an IPP Everywhere print queue:
+.nf
+
+ lpadmin -p myprinter -E -v ipp://myprinter.local/ipp/print -m everywhere
+
+.fi
.SH SEE ALSO
-\fIcupsaccept(8)\fR, \fIcupsenable(8)\fR, \fIlpinfo(8)\fR,
-\fIlpoptions(1)\fR,
-.br
-http://localhost:631/help
+.BR cupsaccept (8),
+.BR cupsenable (8),
+.BR lpinfo (8),
+.BR lpoptions (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpadmin.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpadmin.man 12513 2015-02-11 19:45:01Z msweet $".
.\"
diff --git a/man/lpc.man b/man/lpc.man
index 8d5245c..4286b01 100644
--- a/man/lpc.man
+++ b/man/lpc.man
@@ -1,18 +1,18 @@
.\"
-.\" "$Id: lpc.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpc.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpc man page for CUPS.
+.\" lpc man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpc 8 "CUPS" "3 November 2008" "Apple Inc."
+.TH lpc 8 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
lpc \- line printer control program
.SH SYNOPSIS
@@ -23,49 +23,42 @@ lpc \- line printer control program
.I parameter(s)
] ]
.SH DESCRIPTION
-\fIlpc\fR provides limited control over printer and class queues
-provided by CUPS. It can also be used to query the state of
-queues.
+\fBlpc\fR provides limited control over printer and class queues provided by CUPS. It can also be used to query the state of queues.
.LP
-If no command is specified on the command-line, \fRlpc\fR will
-display a prompt and accept commands from the standard input.
-.SH COMMANDS
-The \fIlpc\fR program accepts a subset of commands accepted by
-the Berkeley \fIlpc\fR program of the same name:
+If no command is specified on the command-line, \fBlpc\fR displays a prompt and accepts commands from the standard input.
+.SS COMMANDS
+The \fBlpc\fR program accepts a subset of commands accepted by the Berkeley \fBlpc\fR program of the same name:
.TP 5
-exit
-.br
+.B exit
Exits the command interpreter.
.TP 5
-help [command]
+\fBhelp \fR[\fIcommand\fR]
.TP 5
-? [command]
-.br
+\fB? \fR[\fIcommand\fR]
Displays a short help message.
.TP 5
-quit
-.br
+.B quit
Exits the command interpreter.
.TP 5
-status [queue]
-.br
+\fBstatus \fR[\fIqueue\fR]
Displays the status of one or more printer or class queues.
-.SH LIMITATIONS
-Since \fIlpc\fR is geared towards the Berkeley printing system,
-it is impossible to use \fIlpc\fR to configure printer or class
-queues provided by CUPS. To configure printer or class queues
-you must use the \fIlpadmin(8)\fR command or another
-CUPS-compatible client with that functionality.
-.SH COMPATIBILITY
-The CUPS version of \fIlpc\fR does not implement all of the
-standard Berkeley or LPRng commands.
+.SH NOTES
+Since \fBlpc\fR is geared towards the Berkeley printing system, it is impossible to use \fBlpc\fR to configure printer or class queues provided by CUPS.
+To configure printer or class queues you must use the
+.BR lpadmin (8)
+command or another CUPS-compatible client with that functionality.
.SH SEE ALSO
-\fIcancel(1)\fR, \fIcupsaccept(8)\fR, \fIcupsenable(8)\fR,
-\fIlp(1)\fR, \fIlpr(1)\fR, \fIlprm(1)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR cupsaccept (8),
+.BR cupsenable (8),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpr (1),
+.BR lprm (1),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpc.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpc.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lpinfo.man b/man/lpinfo.man
index e45a7f3..f8dc471 100644
--- a/man/lpinfo.man
+++ b/man/lpinfo.man
@@ -1,115 +1,138 @@
.\"
-.\" "$Id: lpinfo.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpinfo.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpinfo man page for CUPS.
+.\" lpinfo man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpinfo 8 "CUPS" "5 December 2008" "Apple Inc."
+.TH lpinfo 8 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
lpinfo \- show available devices or drivers
.SH SYNOPSIS
.B lpinfo
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] [ -l ] [ --device-id
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-l
+] [
+.B \-\-device\-id
.I device-id-string
-] [ --exclude-schemes
+] [
+.B \-\-exclude\-schemes
.I scheme-list
-] [ --include-schemes
+] [
+.B \-\-include\-schemes
.I scheme-list
-] [ --language
+] [
+.B \-\-language
.I locale
-] [ --make-and-model
+] [
+.B \-\-make\-and\-model
.I name
-] [ --product
+] [
+.B \-\-product
.I name
-] -m
+]
+.B \-m
.br
.B lpinfo
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] [ -l ] [ --exclude-schemes
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-l
+] [
+.B \-\-exclude\-schemes
.I scheme-list
-] [ --include-schemes
+] [
+.B \-\-include\-schemes
.I scheme-list
-] [ --timeout
+] [
+.B \-\-timeout
.I seconds
-] -v
+]
+.B \-v
.SH DESCRIPTION
-\fIlpinfo\fR lists the available devices or drivers known to the
-CUPS server. The first form (\fI-m\fR) lists the available
-drivers, while the second form (\fI-v\fR) lists the available
-devices.
+\fBlpinfo\fR lists the available devices or drivers known to the CUPS server.
+The first form (\fI-m\fR) lists the available drivers, while the second form (\fI-v\fR) lists the available devices.
.SH OPTIONS
-\fIlpinfo\fR accepts the following options:
+\fBlpinfo\fR accepts the following options:
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Sets the username to use when connecting to the server.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Selects an alternate server.
.TP 5
--l
-.br
+.B \-l
Shows a "long" listing of devices or drivers.
.TP 5
---device-id device-id-string
-.br
-Specifies the IEEE-1284 device ID to match when listing drivers with the
-\fI-m\fR option.
+\fB\-\-device\-id \fIdevice-id-string\fR
+Specifies the IEEE-1284 device ID to match when listing drivers with the \fI\-m\fR option.
.TP 5
---exclude-schemes scheme-list
-.br
-Specifies a comma-separated list of device or PPD schemes that should be
-excluded from the results. Static PPD files use the "file" scheme.
+\fB\-\-exclude\-schemes \fIscheme-list\fR
+Specifies a comma-delimited list of device or PPD schemes that should be excluded from the results.
+Static PPD files use the "file" scheme.
.TP 5
---include-schemes scheme-list
-.br
-Specifies a comma-separated list of device or PPD schemes that should be
-included in the results. Static PPD files use the "file" scheme.
+\fB\-\-include\-schemes \fIscheme-list\fR
+Specifies a comma-delimited list of device or PPD schemes that should be included in the results.
+Static PPD files use the "file" scheme.
.TP 5
---language locale
-.br
-Specifies the language to match when listing drivers with the \fI-m\fR option.
+\fB\-\-language \fIlocale\fR
+Specifies the language to match when listing drivers with the \fI\-m\fR option.
.TP 5
---make-and-model name
-.br
-Specifies the make and model to match when listing drivers with the \fI-m\fR
-option.
+\fB\-\-make\-and\-model \fIname\fR
+Specifies the make and model to match when listing drivers with the \fI\-m\fR option.
.TP 5
---product name
-.br
-Specifies the product to match when listing drivers with the \fI-m\fR option.
+\fB\-\-product \fIname\fR
+Specifies the product to match when listing drivers with the \fI\-m\fR option.
.TP 5
---timeout seconds
-.br
-Specifies the timeout when listing devices with the \fI-v\fR option.
-.SH COMPATIBILITY
+\fB\-\-timeout \fIseconds\fR
+Specifies the timeout when listing devices with the \fI\-v\fR option.
+.SH CONFORMING TO
The \fIlpinfo\fR command is unique to CUPS.
+.SH EXAMPLES
+List all devices:
+.nf
+
+ lpinfo \-v
+
+.fi
+List all drivers:
+.nf
+
+ lpinfo \-m
+
+.fi
+List drivers matching "HP LaserJet":
+.nf
+
+ lpinfo \-\-make\-and\-model "HP LaserJet" \-m
+.fi
.SH SEE ALSO
-\fIlpadmin(8)\fR,
-.br
-http://localhost:631/help
+.BR lpadmin (8),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpinfo.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpinfo.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lpmove.man b/man/lpmove.man
index 23ea098..2447410 100644
--- a/man/lpmove.man
+++ b/man/lpmove.man
@@ -1,66 +1,82 @@
.\"
-.\" "$Id: lpmove.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpmove.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpmove man page for CUPS.
+.\" lpmove man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpmove 8 "CUPS" "12 February 2006" "Apple Inc."
+.TH lpmove 8 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
lpmove \- move a job or all jobs to a new destination
.SH SYNOPSIS
.B lpmove
-[ -E ] [ -h
-.I server[:port]
-] [ -U
+[
+.B \-E
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-U
.I username
]
-.I job destination
+.I job
+.I destination
.br
.B lpmove
-[ -E ] [ -h
-.I server[:port]
-] [ -U
+[
+.B \-E
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-U
.I username
]
-.I source destination
+.I source
+.I destination
.SH DESCRIPTION
-\fBlpmove\fR moves the specified \fIjob\fR or all jobs from
-\fIsource\fR to \fIdestination\fR. \fIjob\fR can be the job ID
-number or the old destination and job ID:
-.br
-.nf
-
- lpmove 123 newprinter
- lpmove oldprinter-123 newprinter
-.fi
+\fBlpmove\fR moves the specified \fIjob\fR or all jobs from \fIsource\fR to \fIdestination\fR. \fIjob\fR can be the job ID number or the old destination and job ID.
.SH OPTIONS
-The \fIlpmove\fR command supports the following options:
+The \fBlpmove\fR command supports the following options:
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Specifies an alternate username.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Specifies an alternate server.
+.SH EXAMPLES
+Move job 123 from "oldprinter" to "newprinter":
+.nf
+
+ lpmove 123 newprinter
+
+ \fIor\fR
+
+ lpmove oldprinter-123 newprinter
+
+.fi
+Move all jobs from "oldprinter" to "newprinter":
+.nf
+
+ lpmove oldprinter newprinter
+.fi
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR,
+.BR cancel (1),
+.BR lp (1),
+.BR lpr (1),
+.BR lprm (1),
.br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpmove.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpmove.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lpoptions.man.in b/man/lpoptions.man.in
index 343d20d..c9377c3 100644
--- a/man/lpoptions.man.in
+++ b/man/lpoptions.man.in
@@ -1,135 +1,141 @@
.\"
-.\" "$Id: lpoptions.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: lpoptions.man.in 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpoptions man page for CUPS.
+.\" lpoptions man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpoptions 1 "CUPS" "29 August 2008" "Apple Inc."
+.TH lpoptions 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
lpoptions \- display or set printer options and defaults
.SH SYNOPSIS
.B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] -d
-.I destination[/instance]
-[ -o
-.I option[=value]
-] ... [ -o
-.I option[=value]
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+\fB\-d \fIdestination\fR[\fB/\fIinstance\fR]
+[
+.B \-l
]
.br
.B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] [ -p
-.I destination[/instance]
-] -l
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-p \fIdestination\fR[\fB/\fIinstance\fR]
+]
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR] ...
.br
.B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] [ -o
-.I option[=value]
-] ... [ -o
-.I option[=value]
-] [ -p
-.I destination[/instance]
-] -r
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-p \fIdestination\fR[\fB/\fIinstance\fR]
+]
+.B \-r
.I option
.br
.B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] -x
-.I destination[/instance]
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+\fB\-x \fIdestination\fR[\fB/\fIinstance\fR]
.SH DESCRIPTION
-\fIlpoptions\fR displays or sets printer options and defaults.
-\fIlpoptions\fR shows the default printer options when run with no
-arguments. Other options include:
+\fBlpoptions\fR displays or sets printer options and defaults.
+If no printer is specified using the \fI\-p\fR option, the default printer is used as described in
+.BR lp (1).
+.LP
+If no \fI\-l\fR, \fI\-o\fR, or \fI\-r\fR options are specified, the current options are reported on the standard output.
+.LP
+Options set with the \fBlpoptions\fR command are used by the
+.BR lp (1)
+and
+.BR lpr (1)
+commands when submitting jobs.
+.LP
+When run by the root user, \fBlpoptions\fR gets and sets default options and instances for all users in the \fI/etc/cups/lpoptions\fR file.
+Otherwise, the per-user defaults are managed in the \fI~/.cups/lpoptions\fR file.
+.SH OPTIONS
+\fBlpoptions\fR supports the following options:
.TP 5
--E
-.br
+.B \-E
Enables encryption when communicating with the CUPS server.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Uses an alternate username.
.TP 5
--d destination[/instance]
-.br
-Sets the user default printer to \fIdestination\fR. If \fIinstance\fR
-is supplied then that particular instance is used. This option
-overrides the system default printer for the current user.
+\fB\-d \fIdestination\fR[\fB/\fIinstance\fR]
+Sets the user default printer to \fIdestination\fR.
+If \fIinstance\fR is supplied then that particular instance is used.
+This option overrides the system default printer for the current user.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Uses an alternate server.
.TP 5
--l
-.br
+.B \-l
Lists the printer specific options and their current settings.
.TP 5
--o option[=value]
-.br
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
Specifies a new option for the named destination.
.TP 5
--p destination[/instance]
-.br
-Sets the destination and instance, if specified, for any options
-that follow. If the named instance does not exist then it is
-created.
+\fB\-p \fIdestination\fR[\fB/\fIinstance\fR]
+Sets the destination and instance, if specified, for any options that follow.
+If the named instance does not exist then it is created.
+Destinations can only be created using the
+.BR lpadmin (8)
+program.
.TP 5
--r option
-.br
-Removes the specified option for the named destination.
+\fB\-r \fIoption\fR
+Removes the specified option from the named destination.
.TP 5
--x destination[/instance]
-.br
-Removes the options for the named destination and instance, if
-specified. If the named instance does not exist then this does
-nothing.
-.LP
-If no options are specified using the \fI-o\fR option, then the
-current options for the named printer are reported on the
-standard output.
-.LP
-Options set with the \fIlpoptions\fR command are used by the
-\fIlp(1)\fR and \fIlpr(1)\fR commands when submitting jobs.
-.SH ROOT ACCOUNT OPTIONS
-When run by the root user, \fIlpoptions\fR gets and sets default
-options and instances for \fIall users\fR in the
-@CUPS_SERVERROOT@/lpoptions file.
-.SH COMPATIBILITY
-The \fIlpoptions\fR command is unique to CUPS.
+\fB\-x \fIdestination\fR[\fB/\fIinstance\fR]
+Removes the options for the named destination and instance, if specified.
+If the named instance does not exist then this does nothing.
+Destinations can only be removed using the
+.BR lpadmin (8)
+command.
.SH FILES
-~/.cups/lpoptions - user defaults and instances created by non-root
-users.
+\fI~/.cups/lpoptions\fR - user defaults and instances created by non-root users.
.br
-@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances
-created by the root user.
+\fI/etc/cups/lpoptions\fR - system-wide defaults and instances created by the root user.
+.SH CONFORMING TO
+The \fBlpoptions\fR command is unique to CUPS.
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpadmin(8)\fR, \fIlpr(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpr (1),
+.BR lprm (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpoptions.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: lpoptions.man.in 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lppasswd.man b/man/lppasswd.man
deleted file mode 100644
index 1edb0d8..0000000
--- a/man/lppasswd.man
+++ /dev/null
@@ -1,68 +0,0 @@
-.\"
-.\" "$Id: lppasswd.man 7600 2008-05-20 21:06:23Z mike $"
-.\"
-.\" lpadmin man page for CUPS.
-.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
-.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
-.\"
-.TH lppasswd 1 "CUPS" "22 February 2008" "Apple Inc."
-.SH NAME
-lppasswd \- add, change, or delete digest passwords.
-.SH SYNOPSIS
-.B lppasswd
-[
-.I username
-]
-.br
-.B lppasswd
--a [ -g
-.I groupname
-]
-.I username
-.br
-.B lppasswd
--x
-.I username
-.SH DESCRIPTION
-\fIlppasswd\fR adds, changes, or deletes passwords in the CUPS
-digest password file, \fIpasswd.md5\fR. When run by a normal
-user, \fIlppasswd\fR will prompt for the old and new passwords.
-When run by the super-user, \fIlppasswd\fR can add new accounts
-(\fI-a username\fR), change existing accounts (\fIusername\fR),
-or delete accounts (\fI-x username\fR) in the digest password
-file. Digest usernames do not have to match local UNIX usernames.
-.SH OPTIONS
-\fIlppasswd\fR supports the following options:
-.TP 5
--g groupname
-.br
-Specifies a group other than the default system group.
-.SH SECURITY ISSUES
-By default, the \fIlppasswd\fR program is not installed to allow ordinary
-users to change their passwords. To enable this, the \fIlppasswd\fR command
-must be made setuid to root with the command:
-.br
-.nf
-chmod u+s lppasswd
-.fi
-.PP
-While every attempt has been made to make \fIlppasswd\fR secure against
-exploits that could grant super-user privileges to unprivileged users,
-paranoid system administrators may wish to use Basic authentication with
-accounts managed by PAM instead.
-.SH SEE ALSO
-\fIlp(1)\fR, \fIlpr(1)\fR,
-.br
-http://localhost:631/help
-.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
-.\"
-.\" End of "$Id: lppasswd.man 7600 2008-05-20 21:06:23Z mike $".
-.\"
diff --git a/man/lpq.man b/man/lpq.man
index 97630e9..7f71720 100644
--- a/man/lpq.man
+++ b/man/lpq.man
@@ -1,72 +1,72 @@
.\"
-.\" "$Id: lpq.man 7646 2008-06-16 17:26:20Z mike $"
+.\" "$Id: lpq.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpq man page for CUPS.
+.\" lpq man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpq 1 "CUPS" "16 June 2008" "Apple Inc."
+.TH lpq 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
lpq \- show printer queue status
.SH SYNOPSIS
.B lpq
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] [ -P
-.I destination[/instance]
-] [ -a ] [ -l ] [
-.I +interval
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
+] [
+.B \-a
+] [
+.B \-l
+] [
+.BI + interval
]
.SH DESCRIPTION
-\fIlpq\fR shows the current print queue status on the named
-printer. Jobs queued on the default destination will be shown if
-no printer or class is specified on the command-line.
+\fBlpq\fR shows the current print queue status on the named printer.
+Jobs queued on the default destination will be shown if no printer or class is specified on the command-line.
.LP
-The \fI+interval\fR option allows you to continuously report the
-jobs in the queue until the queue is empty; the list of jobs is
-shown once every \fIinterval\fR seconds.
+The \fI+interval\fR option allows you to continuously report the jobs in the queue until the queue is empty; the list of jobs is shown once every \fIinterval\fR seconds.
.SH OPTIONS
-\fIlpq\fR supports the following options:
+\fBlpq\fR supports the following options:
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--P destination[/instance]
-.br
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
Specifies an alternate printer or class name.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Specifies an alternate username.
.TP 5
--a
-.br
+.B \-a
Reports jobs on all printers.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Specifies an alternate server.
.TP 5
--l
-.br
+.B \-l
Requests a more verbose (long) reporting format.
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpr(1)\fR, \fIlprm(1)\fR,
-\fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR lp (1),
+.BR lpr (1),
+.BR lprm (1),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpq.man 7646 2008-06-16 17:26:20Z mike $".
+.\" End of "$Id: lpq.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lpr.man b/man/lpr.man
index c6392c7..ac24e3d 100644
--- a/man/lpr.man
+++ b/man/lpr.man
@@ -1,122 +1,149 @@
.\"
-.\" "$Id: lpr.man 7889 2008-08-29 22:03:35Z mike $"
+.\" "$Id: lpr.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpr man page for CUPS.
+.\" lpr man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2013 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpr 1 "CUPS" "29 August 2008" "Apple Inc."
+.TH lpr 1 "CUPS" "11 June 2014" "Apple Inc."
.SH NAME
lpr \- print files
.SH SYNOPSIS
.B lpr
-[ -E ] [ -H
-.I server[:port]
-] [ -U
+[
+.B \-E
+] [
+\fB\-H \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-U
.I username
-] [ -P
-.I destination[/instance]
-] [ -#
+] [
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
+] [
+.B \-#
.I num-copies
-[ -h ] [ -l ] [ -m ] [ -o
-.I option[=value]
-] [ -p] [ -q ] [ -r ] [ -C/J/T
+[
+.B \-h
+] [
+.B \-l
+] [
+.B \-m
+] [
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
+] [
+.B \-p
+] [
+.B \-q
+] [
+.B \-r
+] [
+.B \-C
+.I title
+] [
+.B \-J
+.I title
+] [
+.B \-T
.I title
] [
.I file(s)
]
.SH DESCRIPTION
-\fIlpr\fR submits files for printing. Files named on the command
-line are sent to the named printer (or the default destination if no
-destination is specified). If no files are listed on the command-line,
-\fIlpr\fR reads the print file from the standard input.
-.SH THE DEFAULT DESTINATION
-CUPS provides many ways to set the default destination. The "LPDEST" and
-"PRINTER" environment variables are consulted first. If neither are set,
-the current default set using the \fIlpoptions(1)\fR command is used,
-followed by the default set using the \fIlpadmin(8)\fR command.
+\fBlpr\fR submits files for printing.
+Files named on the command line are sent to the named printer or the default destination if no destination is specified.
+If no files are listed on the command-line, \fBlpr\fR reads the print file from the standard input.
+.SS THE DEFAULT DESTINATION
+CUPS provides many ways to set the default destination. The \fBLPDEST\fR and \fBPRINTER\fR environment variables are consulted first.
+If neither are set, the current default set using the
+.BR lpoptions (1)
+command is used, followed by the default set using the
+.BR lpadmin (8)
+command.
.SH OPTIONS
The following options are recognized by \fIlpr\fR:
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--H server[:port]
-.br
+\fB\-H \fIserver\fR[\fB:\fIport\fR]
Specifies an alternate server.
.TP 5
--C "name"
+\fB\-C "\fIname\fB"\fR
.TP 5
--J "name"
+\fB\-J "\fIname\fB"\fR
.TP 5
--T "name"
-.br
-Sets the job name.
+\fB\-T "\fIname\fB"\fR
+Sets the job name/title.
.TP 5
--P destination[/instance]
-.br
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
Prints files to the named printer.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Specifies an alternate username.
.TP 5
--# \fIcopies\fR
-.br
-Sets the number of copies to print from 1 to 100.
+\fB\-# \fIcopies\fR
+Sets the number of copies to print.
.TP 5
--h
-.br
-Disables banner printing. This option is equivalent to "-o
-job-sheets=none".
+.B \-h
+Disables banner printing. This option is equivalent to \fI-o job\-sheets=none\fR.
.TP 5
--l
-.br
-Specifies that the print file is already formatted for the
-destination and should be sent without filtering. This option is
-equivalent to "-o raw".
+.B \-l
+Specifies that the print file is already formatted for the destination and should be sent without filtering.
+This option is equivalent to \fI-o raw\fR.
.TP 5
--m
-.br
+.B \-m
Send an email on job completion.
.TP 5
--o option[=value]
-.br
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
Sets a job option.
.TP 5
--p
-.br
-Specifies that the print file should be formatted with a shaded
-header with the date, time, job name, and page number. This
-option is equivalent to "-o prettyprint" and is only useful when
-printing text files.
+.B \-p
+Specifies that the print file should be formatted with a shaded header with the date, time, job name, and page number.
+This option is equivalent to \fI\-o prettyprint\fR and is only useful when printing text files.
.TP 5
--q
-.br
+.B \-q
Hold job for printing.
.TP 5
--r
-.br
-Specifies that the named print files should be deleted after
-printing them.
-.SH COMPATIBILITY
-The "c", "d", "f", "g", "i", "n", "t", "v", and "w" options
-are not supported by CUPS and produce a warning message if used.
+.B \-r
+Specifies that the named print files should be deleted after submitting them.
+.SH NOTES
+The \fI\-c\fR, \fI\-d\fR, \fI\-f\fR, \fI\-g\fR, \fI\-i\fR, \fI\-n\fR, \fI\-t\fR, \fI\-v\fR, and \fI\-w\fR options are not supported by CUPS and produce a warning message if used.
+.SH EXAMPLES
+Print two copies of a document to the default printer:
+.nf
+
+ lpr -# 2 filename
+
+.fi
+Print a double-sided legal document to a printer called "foo":
+.nf
+
+ lpr -P foo -o media=legal -o sides=two-sided-long-edge filename
+
+.fi
+Print a presentation document 2-up to a printer called "foo":
+.nf
+
+ lpr -P foo -o number-up=2 filename
+.fi
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpadmin(8)\fR, \fIlpoptions(1)\fR,
-\fIlpq(1)\fR, \fIlprm(1)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpoptions (1),
+.BR lpq (1),
+.BR lprm (1),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpr.man 7889 2008-08-29 22:03:35Z mike $".
+.\" End of "$Id: lpr.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lprm.man b/man/lprm.man
index 3d3f30f..c989394 100644
--- a/man/lprm.man
+++ b/man/lprm.man
@@ -1,65 +1,90 @@
.\"
-.\" "$Id: lprm.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lprm.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lprm man page for CUPS.
+.\" lprm man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lprm 1 "CUPS" "28 August 2009" "Apple Inc."
+.TH lprm 1 "CUPS" "22 May 2014" "Apple Inc."
.SH NAME
lprm \- cancel print jobs
.SH SYNOPSIS
.B lprm
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
.I username
-] [ -h
-.I server[:port]
-] [ -P
-.I destination[/instance]
-] [ - ] [
-.I job ID(s)
+] [
+.B \-h
+.IR server [ :port ]
+] [
+.B \-P
+.IR destination [ /instance ]
+] [
+.B \-
+] [
+.I job-id(s)
]
.SH DESCRIPTION
-\fIlprm\fR cancels print jobs that have been queued for printing.
-If no arguments are supplied, the current job on the default
-destination is cancelled. You can specify one or more job ID
-numbers to cancel those jobs or use the \fI-\fR option to cancel
-all jobs.
+.B lprm
+cancels print jobs that have been queued for printing.
+If no arguments are supplied, the current job on the default destination is canceled.
+You can specify one or more job ID numbers to cancel those jobs or use the \fI\-\fR option to cancel all jobs.
.SH OPTIONS
-The \fIlprm\fR command supports the following options:
+The
+.B lprm
+command supports the following options:
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--P destination[/instance]
-.br
+\fB\-P \fIdestination\fR[\fI/instance\fR]
Specifies the destination printer or class.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Specifies an alternate username.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fI:port\fR]
Specifies an alternate server.
-.SH COMPATIBILITY
-The CUPS version of \fIlprm\fR is compatible with the standard
-Berkeley \fIlprm\fR command.
+.SH CONFORMING TO
+The CUPS version of
+.B lprm
+is compatible with the standard Berkeley command of the same name.
+.SH EXAMPLES
+Cancel the current job on the default printer:
+.nf
+
+ lprm
+
+.fi
+Cancel job 1234:
+.nf
+
+ lprm 1234
+
+.fi
+Cancel all jobs:
+.nf
+
+ lprm \-
+.fi
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpq(1)\fR, \fIlpr(1)\fR,
-\fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR lp (1),
+.BR lpq (1),
+.BR lpr (1),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lprm.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lprm.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/lpstat.man b/man/lpstat.man
index 37c39d7..d5d82c5 100644
--- a/man/lpstat.man
+++ b/man/lpstat.man
@@ -1,143 +1,152 @@
.\"
-.\" "$Id: lpstat.man 7921 2008-09-10 15:42:24Z mike $"
+.\" "$Id: lpstat.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" lpstat man page for CUPS.
+.\" lpstat man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH lpstat 1 "CUPS" "10 September 2008" "Apple Inc."
+.TH lpstat 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
lpstat \- print cups status information
.SH SYNOPSIS
.B lpstat
-[ -E ] [ -H ] [ -U
+[
+.B \-E
+] [
+.B \-H
+] [
+.B \-U
.I username
-] [ -h
-.I hostname[:port]
-] [ -l ] [ -W
+] [
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B \-l
+] [
+.B \-W
.I which-jobs
-] [ -a [
+] [
+.B \-a
+[
.I destination(s)
-] ] [ -c [
+] ] [
+.B \-c
+[
.I class(es)
-] ] [ -d ] [ -o [
+] ] [
+.B \-d
+] [
+.B \-o
+[
.I destination(s)
-] ] [ -p [
+] ] [
+.B \-p
+[
.I printer(s)
-] ] [ -r ] [ -R ] [ -s ] [ -t ] [ -u [
+] ] [
+.B \-r
+] [
+.B \-R
+] [
+.B \-s
+] [
+.B \-t
+] [
+.B \-u
+[
.I user(s)
-] ] [ -v [
+] ] [
+.B \-v
+[
.I printer(s)
] ]
.SH DESCRIPTION
-\fIlpstat\fR displays status information about the current
-classes, jobs, and printers. When run with no arguments,
-\fIlpstat\fR will list jobs queued by the current user.
+\fBlpstat\fR displays status information about the current classes, jobs, and printers.
+When run with no arguments, \fBlpstat\fR will list active jobs queued by the current user.
.SH OPTIONS
-The \fIlpstat\fR command supports the following options:
+The \fBlpstat\fR command supports the following options:
.TP 5
--E
-.br
+.B \-E
Forces encryption when connecting to the server.
.TP 5
--H
-.br
+.B \-H
Shows the server hostname and port.
.TP 5
--R
-.br
+.B \-R
Shows the ranking of print jobs.
.TP 5
--U username
-.br
+\fB\-U \fIusername\fR
Specifies an alternate username.
.TP 5
--W which-jobs
-.br
-Specifies which jobs to show, \fIcompleted\fR or
-\fInot-completed\fR (the default). This option \fImust\fR appear
-before the \fI-o\fR option and/or any printer names, otherwise
-the default (not-completed) value will be used in the request to
-the scheduler.
-.TP 5
--a [printer(s)]
-.br
-Shows the accepting state of printer queues. If no printers are
-specified then all printers are listed.
-.TP 5
--c [class(es)]
-.br
+\fB\-W \fIwhich-jobs\fR
+Specifies which jobs to show, "completed" or "not-completed" (the default).
+This option \fImust\fR appear before the \fI-o\fR option and/or any printer names, otherwise the default ("not-completed") value will be used in the request to the scheduler.
+.TP 5
+\fB\-a \fR[\fIprinter(s)\fR]
+Shows the accepting state of printer queues.
+If no printers are specified then all printers are listed.
+.TP 5
+\fB\-c \fR[\fIclass(es)\fR]
Shows the printer classes and the printers that belong to them.
If no classes are specified then all classes are listed.
.TP 5
--d
-.br
+.B \-d
Shows the current default destination.
.TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
Specifies an alternate server.
.TP 5
--l
-.br
+.B \-l
Shows a long listing of printers, classes, or jobs.
.TP 5
--o [destination(s)]
-.br
-Shows the jobs queue on the specified destinations. If no destinations are
-specified all jobs are shown.
+\fB\-o \fR[\fIdestination(s)\fR]
+Shows the jobs queued on the specified destinations.
+If no destinations are specified all jobs are shown.
.TP 5
--p [printer(s)]
-.br
-Shows the printers and whether or not they are enabled for printing. If
-no printers are specified then all printers are listed.
+\fB\-p \fR[\fIprinter(s)\fR]
+Shows the printers and whether they are enabled for printing.
+If no printers are specified then all printers are listed.
.TP 5
--r
-.br
+.B \-r
Shows whether the CUPS server is running.
.TP 5
--s
-.br
-Shows a status summary, including the default destination, a
-list of classes and their member printers, and a list of printers and
-their associated devices. This is equivalent to using the "-d", "-c",
-and "-v" options.
-.TP 5
--t
-.br
-Shows all status information. This is equivalent to using the "-r",
-"-d", "-c", "-v", "-a", "-p", and "-o" options.
-.TP 5
--u [user(s)]
-.br
-Shows a list of print jobs queued by the specified users. If no users
-are specified, lists the jobs queued by the current user.
-.TP 5
--v [printer(s)]
-.br
-Shows the printers and what device they are attached to. If no printers
-are specified then all printers are listed.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", and "#".
+.B \-s
+Shows a status summary, including the default destination, a list of classes and their member printers, and a list of printers and their associated devices.
+This is equivalent to using the \fI\-d\fR, \fI\-c\fR, and \fI\-v\fR options.
+.TP 5
+.B \-t
+Shows all status information.
+This is equivalent to using the \fI\-r\fR, \fI\-d\fR, \fI\-c\fR, \fI\-v\fR, \fI\-a\fR, \fI\-p\fR, and \fI\-o\fR options.
+.TP 5
+\fB\-u \fR[\fIuser(s)\fR]
+Shows a list of print jobs queued by the specified users.
+If no users are specified, lists the jobs queued by the current user.
+.TP 5
+\fB\-v \fR[\fIprinter(s)\fR]
+Shows the printers and what device they are attached to.
+If no printers are specified then all printers are listed.
+.SH CONFORMING TO
+Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", and "#".
Also, printer and class names are \fInot\fR case-sensitive.
.LP
-The "-h", "-E", "-U", and "-W" options are unique to CUPS.
+The \fI\-h\fR, \fI\-E\fR, \fI\-U\fR, and \fI\-W\fR options are unique to CUPS.
.LP
-The Solaris "-f", "-P", and "-S" options are silently ignored.
+The Solaris \fI\-f\fR, \fI\-P\fR, and \fI\-S\fR options are silently ignored.
.SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR,
-.br
-http://localhost:631/help
+.BR cancel (1),
+.BR lp (1),
+.BR lpq (1),
+.BR lpr (1),
+.BR lprm (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: lpstat.man 7921 2008-09-10 15:42:24Z mike $".
+.\" End of "$Id: lpstat.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/mailto.conf.man b/man/mailto.conf.man
index aa60386..c2f3c85 100644
--- a/man/mailto.conf.man
+++ b/man/mailto.conf.man
@@ -1,60 +1,52 @@
.\"
-.\" "$Id: mailto.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: mailto.conf.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" mailto.conf man page for CUPS.
+.\" mailto.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH mailto.conf 5 "CUPS" "12 July 2006" "Apple Inc."
+.TH mailto.conf 5 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
mailto.conf \- configuration file for cups email notifier
.SH DESCRIPTION
-The \fImailto.conf\fR file defines the local mail server and
-email notification preferences for CUPS.
+The \fBmailto.conf\fR file defines the local mail server and email notification preferences for CUPS.
.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
+Each line in the file can be a configuration directive, a blank line, or a comment.
+Configuration directives typically consist of a name and zero or more values separated by whitespace.
+The configuration directive name and values are case-insensitive.
+Comment lines start with the # character.
+.SS DIRECTIVES
.TP 5
-Cc \fIcc-address@domain.com\fR
-.br
+\fBCc \fIcc-address@domain.com\fR
Specifies an additional recipient for all email notifications.
.TP 5
-From \fIfrom-address@domain.com\fR
-.br
+\fBFrom \fIfrom-address@domain.com\fR
Specifies the sender of email notifications.
.TP 5
-Sendmail \fIsendmail command and options\fR
-.br
-Specifies the sendmail command to use when sending email
-notifications. Only one \fISendmail\fR or \fISMTPServer\fR line
-may be present in the \fImailto.conf\fR file. If multiple lines
-are present, only the last one is used.
+\fBSendmail \fIsendmail command and options\fR
+Specifies the sendmail command to use when sending email notifications.
+Only one \fISendmail\fR or \fISMTPServer\fR line may be present in the \fBmailto.conf\fR file.
+If multiple lines are present, only the last one is used.
.TP 5
-SMTPServer \fIservername\fR
-.br
-Specifies a SMTP server to send email notifications to. Only one
-\fISendmail\fR or \fISMTPServer\fR line may be present in the
-\fImailto.conf\fR file. If multiple lines are present, only the
-last one is used.
+\fBSMTPServer \fIservername\fR
+Specifies a SMTP server to send email notifications to.
+Only one \fISendmail\fR or \fISMTPServer\fR line may be present in the \fBmailto.conf\fR file.
+If multiple lines are present, only the last one is used.
.TP 5
-Subject \fIsubject-prefix\fR
-.br
+\fBSubject \fIsubject-prefix\fR
Specifies a prefix string for the subject line of an email notification.
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR cupsd (8),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: mailto.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: mailto.conf.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/mantohtml.c b/man/mantohtml.c
index 8974d20..11ae93a 100644
--- a/man/mantohtml.c
+++ b/man/mantohtml.c
@@ -1,22 +1,16 @@
/*
- * "$Id: mantohtml.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mantohtml.c 12362 2014-12-12 19:50:49Z msweet $"
*
- * Man page to HTML conversion program.
+ * Man page to HTML conversion program.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 2004-2006 by Easy Software Products.
+ * Copyright 2007-2010, 2014 by Apple Inc.
+ * Copyright 2004-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Convert a man page to HTML.
- * putc_entity() - Put a single character, using entities as needed.
- * strmove() - Move characters within a string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -24,14 +18,26 @@
*/
#include <cups/string-private.h>
+#include <cups/array-private.h>
#include <unistd.h>
/*
+ * Local globals...
+ */
+
+static const char /* Start/end tags for fonts */
+ * const start_fonts[] = { "", "<b>", "<i>" },
+ * const end_fonts[] = { "", "</b>", "</i>" };
+
+
+/*
* Local functions...
*/
-static void putc_entity(int ch, FILE *fp);
+static void html_alternate(const char *s, const char *first, const char *second, FILE *fp);
+static void html_fputs(const char *s, int *font, FILE *fp);
+static void html_putc(int ch, FILE *fp);
static void strmove(char *d, const char *s);
@@ -47,20 +53,19 @@ main(int argc, /* I - Number of command-line args */
*outfile; /* Output file */
char line[1024], /* Line from file */
*lineptr, /* Pointer into line */
- *endptr, /* Pointer to end of current */
- endchar, /* End character */
- *paren, /* Pointer to parenthesis */
- name[1024]; /* Man page name */
- int section, /* Man page section */
- pre, /* Preformatted */
- font, /* Current font */
- blist, /* In a bullet list? */
- list, /* In a list? */
- linenum; /* Current line number */
- const char *post; /* Text to add after the current line */
- static const char /* Start/end tags for fonts */
- * const start_fonts[] = { "", "<b>", "<i>" },
- * const end_fonts[] = { "", "</b>", "</i>" };
+ anchor[1024], /* Anchor */
+ name[1024], /* Man page name */
+ ddpost[256]; /* Tagged list post markup */
+ int section = -1, /* Man page section */
+ pre = 0, /* Preformatted */
+ font = 0, /* Current font */
+ linenum = 0; /* Current line number */
+ float list_indent = 0.0f, /* Current list indentation */
+ nested_indent = 0.0f; /* Nested list indentation, if any */
+ const char *list = NULL, /* Current list, if any */
+ *nested = NULL; /* Nested list, if any */
+ const char *post = NULL; /* Text to add after the current line */
+
/*
* Check arguments...
@@ -103,24 +108,22 @@ main(int argc, /* I - Number of command-line args */
* Read from input and write the output...
*/
- fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" "
- "\"http://www.w3.org/TR/html4/loose.dtd\">\n"
+ fputs("<!DOCTYPE HTML>\n"
"<html>\n"
"<!-- SECTION: Man Pages -->\n"
"<head>\n"
"\t<link rel=\"stylesheet\" type=\"text/css\" "
"href=\"../cups-printable.css\">\n", outfile);
- blist = 0;
- font = 0;
- list = 0;
- linenum = 0;
- pre = 0;
- post = NULL;
- section = -1;
+ anchor[0] = '\0';
while (fgets(line, sizeof(line), infile))
{
+ size_t linelen = strlen(line); /* Length of line */
+
+ if (linelen > 0 && line[linelen - 1] == '\n')
+ line[linelen - 1] = '\0';
+
linenum ++;
if (line[0] == '.')
@@ -163,247 +166,614 @@ main(int argc, /* I - Number of command-line args */
int first = 1;
fputs(end_fonts[font], outfile);
-
- if (blist)
- {
- fputs("</li>\n</ul>\n", outfile);
- blist = 0;
- }
+ font = 0;
if (list)
{
- if (list == 1)
- fputs("</dt>\n", outfile);
- else if (list)
- fputs("</dd>\n", outfile);
-
- fputs("</dl>\n", outfile);
- list = 0;
+ fprintf(outfile, "</%s>\n", list);
+ list = NULL;
}
- line[strlen(line) - 1] = '\0'; /* Strip LF */
-
if (line[2] == 'H')
fputs("<h2 class=\"title\"><a name=\"", outfile);
else
fputs("<h3><a name=\"", outfile);
- for (lineptr = line + 4; *lineptr; lineptr ++)
- if (*lineptr == '\"')
- continue;
- else if (*lineptr == ' ')
- putc_entity('_', outfile);
- else
- putc_entity(*lineptr, outfile);
+ if (anchor[0])
+ {
+ fputs(anchor, outfile);
+ anchor[0] = '\0';
+ }
+ else
+ {
+ for (lineptr = line + 4; *lineptr; lineptr ++)
+ if (*lineptr == '\"')
+ continue;
+ else if (isalnum(*lineptr & 255))
+ html_putc(*lineptr, outfile);
+ else
+ html_putc('_', outfile);
+ }
fputs("\">", outfile);
for (lineptr = line + 4; *lineptr; lineptr ++)
+ {
if (*lineptr == '\"')
continue;
else if (*lineptr == ' ')
{
- putc_entity(' ', outfile);
+ html_putc(' ', outfile);
first = 1;
}
else
{
if (first)
- putc_entity(*lineptr, outfile);
+ html_putc(*lineptr, outfile);
else
- putc_entity(tolower(*lineptr), outfile);
+ html_putc(tolower(*lineptr & 255), outfile);
first = 0;
}
+ }
if (line[2] == 'H')
- fprintf(outfile, "</a></h2>\n%s", start_fonts[font]);
+ fputs("</a></h2>\n", outfile);
else
- fprintf(outfile, "</a></h3>\n%s", start_fonts[font]);
+ fputs("</a></h3>\n", outfile);
}
- else if (!strncmp(line, ".LP", 3) || !strncmp(line, ".PP", 3))
+ else if (!strncmp(line, ".B ", 3))
{
/*
- * New paragraph...
+ * Grab bold text...
*/
fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
- if (blist)
+ html_alternate(line + 3, "b", "b", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
{
- fputs("</li>\n</ul>\n", outfile);
- blist = 0;
+ fputs(post, outfile);
+ post = NULL;
}
+ }
+ else if (!strncmp(line, ".I ", 3))
+ {
+ /*
+ * Grab italic text...
+ */
- if (list)
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 3, "i", "i", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
{
- if (list == 1)
- fputs("</dt>\n", outfile);
- else if (list)
- fputs("</dd>\n", outfile);
+ fputs(post, outfile);
+ post = NULL;
+ }
+ }
+ else if (!strncmp(line, ".BI ", 4))
+ {
+ /*
+ * Alternating bold and italic text...
+ */
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, "b", "i", outfile);
- fputs("</dl>\n", outfile);
- list = 0;
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
+ {
+ fputs(post, outfile);
+ post = NULL;
}
+ }
+ else if (!strncmp(line, ".BR ", 4))
+ {
+ /*
+ * Alternating bold and roman (plain) text...
+ */
- fputs("<p>", outfile);
+ fputs(end_fonts[font], outfile);
font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, "b", NULL, outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
+ {
+ fputs(post, outfile);
+ post = NULL;
+ }
}
- else if (!strncmp(line, ".TP ", 4))
+ else if (!strncmp(line, ".IB ", 4))
{
/*
- * Grab list...
- */
+ * Alternating italic and bold text...
+ */
fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
- if (blist)
+ html_alternate(line + 4, "i", "b", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
{
- fputs("</li>\n</ul>\n", outfile);
- blist = 0;
+ fputs(post, outfile);
+ post = NULL;
}
+ }
+ else if (!strncmp(line, ".IR ", 4))
+ {
+ /*
+ * Alternating italic and roman (plain) text...
+ */
- if (!list)
- fputs("<dl>\n", outfile);
- else if (list == 1)
- fputs("</dt>\n", outfile);
- else if (list)
- fputs("</dd>\n", outfile);
-
- fputs("<dt>", outfile);
- list = 1;
+ fputs(end_fonts[font], outfile);
font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, "i", NULL, outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
+ {
+ fputs(post, outfile);
+ post = NULL;
+ }
}
- else if (!strncmp(line, ".br", 3))
+ else if (!strncmp(line, ".RB ", 4))
{
/*
- * Grab line break...
- */
+ * Alternating roman (plain) and bold text...
+ */
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, NULL, "b", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
- if (list == 1)
+ if (post)
{
- fputs("</dt>\n<dd>", outfile);
- list = 2;
+ fputs(post, outfile);
+ post = NULL;
}
- else if (list)
- fputs("</dd>\n<dd>", outfile);
- else
- fputs("<br>\n", outfile);
}
- else if (!strncmp(line, ".de ", 4))
+ else if (!strncmp(line, ".RI ", 4))
{
/*
- * Define macro - ignore...
- */
+ * Alternating roman (plain) and italic text...
+ */
- while (fgets(line, sizeof(line), infile))
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, NULL, "i", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
{
- linenum ++;
+ fputs(post, outfile);
+ post = NULL;
+ }
+ }
+ else if (!strncmp(line, ".SB ", 4))
+ {
+ /*
+ * Alternating small and bold text...
+ */
- if (!strncmp(line, "..", 2))
- break;
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, "small", "b", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
+ {
+ fputs(post, outfile);
+ post = NULL;
}
}
- else if (!strncmp(line, ".RS", 3))
+ else if (!strncmp(line, ".SM ", 4))
{
/*
- * Indent...
- */
+ * Small text...
+ */
- fputs("<div style='margin-left: 3em;'>\n", outfile);
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (anchor[0])
+ fprintf(outfile, "<a name=\"%s\">", anchor);
+
+ html_alternate(line + 4, "small", "small", outfile);
+
+ if (anchor[0])
+ {
+ fputs("</a>", outfile);
+ anchor[0] = '\0';
+ }
+
+ if (post)
+ {
+ fputs(post, outfile);
+ post = NULL;
+ }
}
- else if (!strncmp(line, ".RE", 3))
+ else if (!strcmp(line, ".LP") || !strcmp(line, ".PP") || !strcmp(line, ".P"))
{
/*
- * Unindent...
+ * New paragraph...
*/
- fputs("</div>\n", outfile);
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (list)
+ {
+ fprintf(outfile, "</%s>\n", list);
+ list = NULL;
+ }
+
+ fputs("<p>", outfile);
+
+ if (anchor[0])
+ {
+ fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+ anchor[0] = '\0';
+ }
}
- else if (!strncmp(line, ".ds ", 4) || !strncmp(line, ".rm ", 4) ||
- !strncmp(line, ".tr ", 4) || !strncmp(line, ".hy ", 4) ||
- !strncmp(line, ".IX ", 4) || !strncmp(line, ".PD", 3) ||
- !strncmp(line, ".Sp", 3))
+ else if (!strcmp(line, ".RS") || !strncmp(line, ".RS ", 4))
{
/*
- * Ignore unused commands...
+ * Indent...
*/
+
+ float amount = 3.0; /* Indentation */
+
+ if (line[3])
+ amount = atof(line + 4);
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (list)
+ {
+ nested = list;
+ list = NULL;
+ nested_indent = list_indent;
+ list_indent = 0.0f;
+ }
+
+ fprintf(outfile, "<div style=\"margin-left: %.1fem;\">\n", amount - nested_indent);
}
- else if (!strncmp(line, ".Vb", 3) || !strncmp(line, ".nf", 3))
+ else if (!strcmp(line, ".RE"))
{
/*
- * Start preformatted...
+ * Unindent...
*/
- pre = 1;
- fputs("<pre>\n", outfile);
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ fputs("</div>\n", outfile);
+
+ if (nested)
+ {
+ list = nested;
+ nested = NULL;
+
+ list_indent = nested_indent;
+ nested_indent = 0.0f;
+ }
}
- else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3))
+ else if (!strcmp(line, ".HP") || !strncmp(line, ".HP ", 4))
{
/*
- * End preformatted...
+ * Hanging paragraph...
+ *
+ * .HP i
*/
- if (pre)
- {
- pre = 0;
- fputs("</pre>\n", outfile);
- }
+ float amount = 3.0; /* Indentation */
+
+ if (line[3])
+ amount = atof(line + 4);
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (list)
+ {
+ fprintf(outfile, "</%s>\n", list);
+ list = NULL;
+ }
+
+ fprintf(outfile, "<p style=\"margin-left: %.1fem; text-indent: %.1fem\">", amount, -amount);
+
+ if (anchor[0])
+ {
+ fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+ anchor[0] = '\0';
+ }
+
+ if (line[1] == 'T')
+ post = "<br>\n";
}
- else if (!strncmp(line, ".IP \\(bu", 8))
+ else if (!strcmp(line, ".TP") || !strncmp(line, ".TP ", 4))
{
/*
- * Bullet list...
+ * Tagged list...
+ *
+ * .TP i
*/
- if (blist)
- fputs("</li>\n", outfile);
- else
- {
- fputs("<ul>\n", outfile);
- blist = 1;
- }
+ float amount = 3.0; /* Indentation */
+
+ if (line[3])
+ amount = atof(line + 4);
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (list && strcmp(list, "dl"))
+ {
+ fprintf(outfile, "</%s>\n", list);
+ list = NULL;
+ }
+
+ if (!list)
+ {
+ fputs("<dl class=\"man\">\n", outfile);
+ list = "dl";
+ list_indent = amount;
+ }
+
+ fputs("<dt>", outfile);
+ snprintf(ddpost, sizeof(ddpost), "<dd style=\"margin-left: %.1fem\">", amount);
+ post = ddpost;
- fputs("<li>", outfile);
+ if (anchor[0])
+ {
+ fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+ anchor[0] = '\0';
+ }
}
else if (!strncmp(line, ".IP ", 4))
{
/*
* Indented paragraph...
+ *
+ * .IP x i
*/
- if (blist)
+ float amount = 3.0; /* Indentation */
+ const char *newlist = NULL; /* New list style */
+ const char *newtype = NULL; /* New list numbering type */
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ lineptr = line + 4;
+ while (isspace(*lineptr & 255))
+ lineptr ++;
+
+ if (!strncmp(lineptr, "\\(bu", 4) || !strncmp(lineptr, "\\(em", 4))
{
- fputs("</li>\n</ul>\n", outfile);
- blist = 0;
- }
+ /*
+ * Bullet list...
+ */
- fputs("<p style='margin-left: 3em;'>", outfile);
+ newlist = "ul";
+ }
+ else if (isdigit(*lineptr & 255))
+ {
+ /*
+ * Numbered list...
+ */
- for (lineptr = line + 4; isspace(*lineptr); lineptr ++);
+ newlist = "ol";
+ }
+ else if (islower(*lineptr & 255))
+ {
+ /*
+ * Lowercase alpha list...
+ */
- if (*lineptr == '\"')
+ newlist = "ol";
+ newtype = "a";
+ }
+ else if (isupper(*lineptr & 255))
{
- strmove(line, lineptr + 1);
+ /*
+ * Lowercase alpha list...
+ */
+
+ newlist = "ol";
+ newtype = "A";
+ }
- if ((lineptr = strchr(line, '\"')) != NULL)
- *lineptr = '\0';
+ while (!isspace(*lineptr & 255))
+ lineptr ++;
+ while (isspace(*lineptr & 255))
+ lineptr ++;
+
+ if (isdigit(*lineptr & 255))
+ amount = atof(lineptr);
+
+ if (newlist && list && strcmp(newlist, list))
+ {
+ fprintf(outfile, "</%s>\n", list);
+ list = NULL;
}
- else
- {
- strmove(line, lineptr);
- if ((lineptr = strchr(line, ' ')) != NULL)
- *lineptr = '\0';
+ if (newlist && !list)
+ {
+ if (newtype)
+ fprintf(outfile, "<%s type=\"%s\">\n", newlist, newtype);
+ else
+ fprintf(outfile, "<%s>\n", newlist);
+
+ list = newlist;
}
+ if (list)
+ fprintf(outfile, "<li style=\"margin-left: %.1fem;\">", amount);
+ else
+ fprintf(outfile, "<p style=\"margin-left: %.1fem;\">", amount);
+
+ if (anchor[0])
+ {
+ fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+ anchor[0] = '\0';
+ }
+ }
+ else if (!strncmp(line, ".br", 3))
+ {
+ /*
+ * Grab line break...
+ */
+
+ fputs("<br>\n", outfile);
+ }
+ else if (!strncmp(line, ".de ", 4))
+ {
+ /*
+ * Define macro - ignore...
+ */
+
+ while (fgets(line, sizeof(line), infile))
+ {
+ linenum ++;
+
+ if (!strncmp(line, "..", 2))
+ break;
+ }
+ }
+ else if (!strncmp(line, ".ds ", 4) || !strncmp(line, ".rm ", 4) ||
+ !strncmp(line, ".tr ", 4) || !strncmp(line, ".hy ", 4) ||
+ !strncmp(line, ".IX ", 4) || !strncmp(line, ".PD", 3) ||
+ !strncmp(line, ".Sp", 3))
+ {
+ /*
+ * Ignore unused commands...
+ */
+ }
+ else if (!strncmp(line, ".Vb", 3) || !strncmp(line, ".nf", 3) || !strncmp(line, ".EX", 3))
+ {
+ /*
+ * Start preformatted...
+ */
+
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+// if (list)
+// {
+// fprintf(outfile, "</%s>\n", list);
+// list = NULL;
+// }
+
+ pre = 1;
+ fputs("<pre class=\"man\">\n", outfile);
+ }
+ else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3) || !strncmp(line, ".EE", 3))
+ {
/*
- * Process the text as if it was in-line...
+ * End preformatted...
*/
- post = "\n<br>\n<br>";
- goto process_text;
+ fputs(end_fonts[font], outfile);
+ font = 0;
+
+ if (pre)
+ {
+ pre = 0;
+ fputs("</pre>\n", outfile);
+ }
}
else if (!strncmp(line, ".\\}", 3))
{
@@ -441,23 +811,13 @@ main(int argc, /* I - Number of command-line args */
*/
}
#endif /* 0 */
- else if (!strncmp(line, ".B ", 3))
+ else if (!strncmp(line, ".\\\"#", 4))
{
/*
- * Grab bold text...
- */
+ * Anchor for HTML output...
+ */
- fprintf(outfile, "%s<b>%s</b>%s", end_fonts[font], line + 3,
- start_fonts[font]);
- }
- else if (!strncmp(line, ".I ", 3))
- {
- /*
- * Grab italic text...
- */
-
- fprintf(outfile, "%s<i>%s</i>%s", end_fonts[font], line + 3,
- start_fonts[font]);
+ strlcpy(anchor, line + 4, sizeof(anchor));
}
else if (strncmp(line, ".\\\"", 3))
{
@@ -470,15 +830,14 @@ main(int argc, /* I - Number of command-line args */
else if ((lineptr = strchr(line, '\n')) != NULL)
*lineptr = '\0';
- fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d!\n",
- line, linenum);
+ fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d.\n", line, linenum);
}
/*
* Skip continuation lines...
*/
- lineptr = line + strlen(line) - 2;
+ lineptr = line + strlen(line) - 1;
if (lineptr >= line && *lineptr == '\\')
{
while (fgets(line, sizeof(line), infile))
@@ -497,169 +856,24 @@ main(int argc, /* I - Number of command-line args */
* Process man page text...
*/
-process_text:
-
- for (lineptr = line; *lineptr; lineptr ++)
- {
- if (!strncmp(lineptr, "http://", 7))
- {
- /*
- * Embed URL...
- */
-
- for (endptr = lineptr + 7;
- *endptr && !isspace(*endptr & 255);
- endptr ++);
-
- endchar = *endptr;
- *endptr = '\0';
-
- fprintf(outfile, "<a href='%s'>%s</a>", lineptr, lineptr);
- *endptr = endchar;
- lineptr = endptr - 1;
- }
- else if (!strncmp(lineptr, "\\fI", 3) &&
- (endptr = strstr(lineptr, "\\fR")) != NULL &&
- (paren = strchr(lineptr, '(')) != NULL &&
- paren < endptr)
- {
- /*
- * Link to man page?
- */
-
- char manfile[1024], /* Man page filename */
- manurl[1024]; /* Man page URL */
-
-
- /*
- * See if the man file is available locally...
- */
-
- lineptr += 3;
- endchar = *paren;
- *paren = '\0';
-
- snprintf(manfile, sizeof(manfile), "%s.man", lineptr);
- snprintf(manurl, sizeof(manurl), "man-%s.html?TOPIC=Man+Pages",
- lineptr);
-
- *paren = endchar;
- endchar = *endptr;
- *endptr = '\0';
-
- if (access(manfile, 0))
- {
- /*
- * Not a local man page, just do it italic...
- */
-
- fputs("<i>", outfile);
- while (*lineptr)
- putc_entity(*lineptr++, outfile);
- fputs("</i>", outfile);
- }
- else
- {
- /*
- * Local man page, do a link...
- */
-
- fprintf(outfile, "<a href='%s'>", manurl);
- while (*lineptr)
- putc_entity(*lineptr++, outfile);
- fputs("</a>", outfile);
- }
-
- *endptr = endchar;
- lineptr = endptr + 2;
- }
- else if (*lineptr == '\\')
- {
- lineptr ++;
- if (!*lineptr)
- break;
- else if (isdigit(lineptr[0]) && isdigit(lineptr[1]) &&
- isdigit(lineptr[2]))
- {
- fprintf(outfile, "&#%d;", ((lineptr[0] - '0') * 8 +
- lineptr[1] - '0') * 8 +
- lineptr[2] - '0');
- lineptr += 2;
- }
- else if (*lineptr == '&')
- continue;
- else if (*lineptr == 's')
- {
- while (lineptr[1] == '-' || isdigit(lineptr[1]))
- lineptr ++;
- }
- else if (*lineptr == '*')
- {
- lineptr += 2;
- }
- else if (*lineptr != 'f')
- putc_entity(*lineptr, outfile);
- else
- {
- lineptr ++;
- if (!*lineptr)
- break;
- else
- {
- fputs(end_fonts[font], outfile);
-
- switch (*lineptr)
- {
- default : /* Regular */
- font = 0;
- break;
- case 'B' : /* Bold */
- case 'b' :
- font = 1;
- break;
- case 'I' : /* Italic */
- case 'i' :
- font = 2;
- break;
- }
-
- fputs(start_fonts[font], outfile);
- }
- }
- }
- else
- putc_entity(*lineptr, outfile);
- }
+ html_fputs(line, &font, outfile);
+ putc('\n', outfile);
if (post)
{
fputs(post, outfile);
post = NULL;
}
-
- if (list == 1)
- {
- fputs("</dt>\n<dd>", outfile);
- list = 2;
- }
}
}
fprintf(outfile, "%s\n", end_fonts[font]);
-
- if (blist)
- {
- fputs("</li>\n</ul>\n", outfile);
- }
+ font = 0;
if (list)
{
- if (list == 1)
- fputs("</dt>\n", outfile);
- else if (list)
- fputs("</dd>\n", outfile);
-
- fputs("</dl>\n", outfile);
+ fprintf(outfile, "</%s>\n", list);
+ list = NULL;
}
fputs("</body>\n"
@@ -684,12 +898,303 @@ process_text:
/*
- * 'putc_entity()' - Put a single character, using entities as needed.
+ * 'html_alternate()' - Alternate words between two styles of text.
+ */
+
+static void
+html_alternate(const char *s, /* I - String */
+ const char *first, /* I - First style or NULL */
+ const char *second, /* I - Second style of NULL */
+ FILE *fp) /* I - File */
+{
+ int i = 0; /* Which style */
+ int quote = 0; /* Saw quote? */
+ int dolinks, /* Do hyperlinks to other man pages? */
+ link = 0; /* Doing a link now? */
+
+
+ /*
+ * Skip leading whitespace...
+ */
+
+ while (isspace(*s & 255))
+ s ++;
+
+ dolinks = first && !strcmp(first, "b") && !second;
+
+ while (*s)
+ {
+ if (!i && dolinks)
+ {
+ /*
+ * See if we need to make a link to a man page...
+ */
+
+ const char *end; /* End of current word */
+ const char *next; /* Start of next word */
+
+ for (end = s; *end && !isspace(*end & 255); end ++);
+ for (next = end; isspace(*next & 255); next ++);
+
+ if (isalnum(*s & 255) && *next == '(')
+ {
+ /*
+ * See if the man file is available locally...
+ */
+
+ char name[1024], /* Name */
+ manfile[1024], /* Man page filename */
+ manurl[1024]; /* Man page URL */
+
+ strlcpy(name, s, sizeof(name));
+ if ((size_t)(end - s) < sizeof(name))
+ name[end - s] = '\0';
+
+ snprintf(manfile, sizeof(manfile), "%s.man", name);
+ snprintf(manurl, sizeof(manurl), "man-%s.html?TOPIC=Man+Pages", name);
+
+ if (!access(manfile, 0))
+ {
+ /*
+ * Local man page, do a link...
+ */
+
+ fprintf(fp, "<a href=\"%s\">", manurl);
+ link = 1;
+ }
+ }
+ }
+
+ if (!i && first)
+ fprintf(fp, "<%s>", first);
+ else if (i && second)
+ fprintf(fp, "<%s>", second);
+
+ while ((!isspace(*s & 255) || quote) && *s)
+ {
+ if (*s == '\"')
+ quote = !quote;
+ else if (*s == '\\' && s[1])
+ {
+ s ++;
+ html_putc(*s++, fp);
+ }
+ else
+ html_putc(*s++, fp);
+ }
+
+ if (!i && first)
+ fprintf(fp, "</%s>", first);
+ else if (i && second)
+ fprintf(fp, "</%s>", second);
+
+ if (i && link)
+ {
+ fputs("</a>", fp);
+ link = 0;
+ }
+
+ i = 1 - i;
+
+ /*
+ * Skip trailing whitespace...
+ */
+
+ while (isspace(*s & 255))
+ s ++;
+ }
+
+ putc('\n', fp);
+}
+
+/*
+ * 'html_fputs()' - Output a string, quoting as needed HTML entities.
+ */
+
+static void
+html_fputs(const char *s, /* I - String */
+ int *font, /* IO - Font */
+ FILE *fp) /* I - File */
+{
+ while (*s)
+ {
+ if (*s == '\\')
+ {
+ s ++;
+ if (!*s)
+ break;
+
+ if (*s == 'f')
+ {
+ int newfont; /* New font */
+
+ s ++;
+ if (!*s)
+ break;
+
+ if (!font)
+ {
+ s ++;
+ continue;
+ }
+
+ switch (*s++)
+ {
+ case 'R' :
+ case 'P' :
+ newfont = 0;
+ break;
+
+ case 'b' :
+ case 'B' :
+ newfont = 1;
+ break;
+
+ case 'i' :
+ case 'I' :
+ newfont = 2;
+ break;
+
+ default :
+ fprintf(stderr, "mantohtml: Unknown font \"\\f%c\" ignored.\n", s[-1]);
+ newfont = *font;
+ break;
+ }
+
+ if (newfont != *font)
+ {
+ fputs(end_fonts[*font], fp);
+ *font = newfont;
+ fputs(start_fonts[*font], fp);
+ }
+ }
+ else if (*s == '*')
+ {
+ /*
+ * Substitute macro...
+ */
+
+ s ++;
+ if (!*s)
+ break;
+
+ switch (*s++)
+ {
+ case 'R' :
+ fputs("&reg;", fp);
+ break;
+
+ case '(' :
+ if (!strncmp(s, "lq", 2))
+ fputs("&ldquo;", fp);
+ else if (!strncmp(s, "rq", 2))
+ fputs("&rdquo;", fp);
+ else if (!strncmp(s, "Tm", 2))
+ fputs("<sup>TM</sup>", fp);
+ else
+ fprintf(stderr, "mantohtml: Unknown macro \"\\*(%2s\" ignored.\n", s);
+
+ if (*s)
+ s ++;
+ if (*s)
+ s ++;
+ break;
+
+ default :
+ fprintf(stderr, "mantohtml: Unknown macro \"\\*%c\" ignored.\n", s[-1]);
+ break;
+ }
+ }
+ else if (*s == '(')
+ {
+ if (!strncmp(s, "(em", 3))
+ {
+ fputs("&mdash;", fp);
+ s += 3;
+ }
+ else if (!strncmp(s, "(en", 3))
+ {
+ fputs("&ndash;", fp);
+ s += 3;
+ }
+ else
+ {
+ putc(*s, fp);
+ s ++;
+ }
+ }
+ else if (*s == '[')
+ {
+ /*
+ * Substitute escaped character...
+ */
+
+ s ++;
+ if (!strncmp(s, "co]", 3))
+ fputs("&copy;", fp);
+ else if (!strncmp(s, "de]", 3))
+ fputs("&deg;", fp);
+ else if (!strncmp(s, "rg]", 3))
+ fputs("&reg;", fp);
+ else if (!strncmp(s, "tm]", 3))
+ fputs("<sup>TM</sup>", fp);
+
+ if (*s)
+ s ++;
+ if (*s)
+ s ++;
+ if (*s)
+ s ++;
+ }
+ else if (isdigit(s[0]) && isdigit(s[1]) &&
+ isdigit(s[2]))
+ {
+ fprintf(fp, "&#%d;", ((s[0] - '0') * 8 + s[1] - '0') * 8 + s[2] - '0');
+ s += 3;
+ }
+ else
+ {
+ if (*s != '\\' && *s == '\"' && *s == '\'' && *s == '-')
+ fprintf(stderr, "mantohtml: Unrecognized escape \"\\%c\" ignored.\n", *s);
+
+ html_putc(*s++, fp);
+ }
+ }
+ else if (!strncmp(s, "http://", 7) || !strncmp(s, "https://", 8) || !strncmp(s, "ftp://", 6))
+ {
+ /*
+ * Embed URL...
+ */
+
+ char temp[1024]; /* Temporary string */
+ const char *end = s + 6; /* End of URL */
+
+ while (*end && !isspace(*end & 255))
+ end ++;
+
+ if (end[-1] == ',' || end[-1] == '.' || end[-1] == ')')
+ end --;
+
+ strlcpy(temp, s, sizeof(temp));
+ if ((size_t)(end -s) < sizeof(temp))
+ temp[end - s] = '\0';
+
+ fprintf(fp, "<a href=\"%s\">%s</a>", temp, temp);
+ s = end;
+ }
+ else
+ html_putc(*s++ & 255, fp);
+ }
+}
+
+
+/*
+ * 'html_putc()' - Put a single character, using entities as needed.
*/
static void
-putc_entity(int ch, /* I - Character */
- FILE *fp) /* I - File */
+html_putc(int ch, /* I - Character */
+ FILE *fp) /* I - File */
{
if (ch == '&')
fputs("&amp;", fp);
@@ -716,5 +1221,5 @@ strmove(char *d, /* I - Destination */
/*
- * End of "$Id: mantohtml.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mantohtml.c 12362 2014-12-12 19:50:49Z msweet $".
*/
diff --git a/man/mime.convs.man b/man/mime.convs.man
index 311353a..d5145ce 100644
--- a/man/mime.convs.man
+++ b/man/mime.convs.man
@@ -1,46 +1,66 @@
.\"
-.\" "$Id: mime.convs.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: mime.convs.man 12848 2015-08-26 18:51:57Z msweet $"
.\"
-.\" mime.convs man page for CUPS.
+.\" mime.convs man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH mime.convs 5 "CUPS" "20 March 2006" "Apple Inc."
+.TH mime.convs 5 "CUPS" "26 August 2015" "Apple Inc."
.SH NAME
mime.convs \- mime type conversion file for cups
.SH DESCRIPTION
-The \fImime.convs\fR file defines the filters that are available
-for converting files from one format to another. The standard
-filters support text, PDF, PostScript, HP-GL/2, and many types of
-image files.
+The \fBmime.convs\fR file defines the filters that are available for converting files from one format to another.
+The standard filters support text, PDF, PostScript, and many types of image files.
.LP
-Additional filters can be added to the \fImime.convs\fR file or
-(preferably) to other files in the CUPS configuration directory.
+Additional filters are specified in files with the extension \fI.convs\fR in the CUPS configuration directory.
.LP
-Each line in the \fImime.convs\fR file is a comment, blank, or filter
-line. Comment lines start with the # character. Filter lines specify
-the source and destination MIME types along with a relative cost
-associated with the filter and the filter to run:
+Each line in the \fBmime.convs\fR file is a comment, blank, or filter
+line.
+Comment lines start with the # character.
+Filter lines specify the source and destination MIME types along with a relative cost associated with the filter and the filter to run:
+.nf
+
+ source/type destination/type cost filter
+
+.fi
+The \fIsource/type\fR field specifies the source MIME media type that is consumed by the filter.
+.LP
+The \fIdestination/type\fR field specifies the destination MIME media type that is produced by the filter.
+.LP
+The \fIcost\fR field specifies the relative cost for running the filter.
+A value of 100 means that the filter uses a large amount of resources while a value of 0 means that the filter uses very few resources.
+.LP
+The \fIfilter\fR field specifies the filter program filename.
+Filenames are relative to the CUPS filter directory.
+.SH FILES
+\fI/etc/cups\fR - Typical CUPS configuration directory.
+.br
+\fI/usr/lib/cups/filter\fR - Typical CUPS filter directory.
.br
+\fI/usr/libexec/cups/filter\fR - CUPS filter directory on OS X.
+.SH EXAMPLES
+Define a filter that converts PostScript documents to CUPS Raster format:
.nf
-super/type super/type cost filter
-application/postscript application/vnd.cups-raster 50 pstoraster
+ application/vnd.cups\-postscript application/vnd.cups\-raster 50 pstoraster
+
.fi
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR cups-files.conf (5),
+.BR cupsd.conf (5),
+.BR cupsd (8),
+.BR cupsfilter (8),
+.BR mime.types (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: mime.convs.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: mime.convs.man 12848 2015-08-26 18:51:57Z msweet $".
.\"
diff --git a/man/mime.types.man b/man/mime.types.man
index bf1dd9b..c3dd2f3 100644
--- a/man/mime.types.man
+++ b/man/mime.types.man
@@ -1,115 +1,116 @@
.\"
-.\" "$Id: mime.types.man 7670 2008-06-17 22:42:08Z mike $"
+.\" "$Id: mime.types.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" mime.types man page for CUPS.
+.\" mime.types man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH mime.types 5 "CUPS" "16 May 2009" "Apple Inc."
+.TH mime.types 5 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
mime.types \- mime type description file for cups
.SH DESCRIPTION
-The \fImime.types\fR file defines the recognized file types.
+The \fBmime.types\fR file defines the recognized file types.
.LP
-Additional file types can be added to \fImime.types\fR or
-(preferably) in additional files in the CUPS configuration
-directory with the extension ".types".
+Additional file types are specified in files with the extension \fI.types\fR in the CUPS configuration directory.
.LP
-Each line in the \fImime.types\fR file is a comment, blank, or
-rule line. Comment lines start with the # character. Rule lines
-start with the MIME type name and are optionally followed by a
-series of file recognition rules that are used to automatically
-identify print and web files:
-.br
+Each line in the \fBmime.types\fR file is a comment, blank, or rule line.
+Comment lines start with the # character.
+Rule lines start with the MIME media type and are optionally followed by a series of file recognition rules:
.nf
- super/type rule [ ... ruleN]
+ \fImime/type \fR[ \fIrule \fR... \fIrule \fR]
+
+.fi
+Rules can be extended over multiple lines using the backslash character (\\):
+.nf
+
+ \fImime/type \fR[ \fIreally-really-really-long-rule \fR... \fB\\
+ \fIrule \fR]
+
.fi
-MIME type names are case-insensitive and are sorted in ascending alphanumeric
-order for the purposes of matching. See the "TYPE MATCHING AND PRIORITY"
-section for more information.
+MIME media types specified by the \fImime/type\fR field are case-insensitive and are sorted in ascending alphanumeric order for the purposes of matching.
+See the "TYPE MATCHING AND PRIORITY" section for more information.
.LP
-The rules may be grouped using parenthesis, joined using "+" for a
-logical AND and "," or whitespace for a logical OR, and negated using
-"!".
-.SH RULES
+The rules may be grouped using parenthesis, joined using "+" for a logical AND, joined using "," or whitespace for a logical OR, and negated using "!".
+.SS RULES
Rules take two forms - a filename extension by itself and functions with test
-values inside parenthesis. The following functions are available:
+values inside parenthesis.
+The following functions are available:
.TP 5
-match("pattern")
-.br
-Pattern match on filename
+\fBmatch("\fIpattern\fB")\fR
+True if the filename matches the given shell wildcard \fIpattern\fR.
.TP 5
-ascii(offset,length)
-.br
-True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126)
+\fBascii(\fIoffset\fB,\fIlength\fB)\fR
+True if the \fIlength\fR bytes starting at \fIoffset\fR are valid printable ASCII (CR, NL, TAB, BS, 32-126).
.TP 5
-printable(offset,length)
-.br
-True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254)
+\fBprintable(\fIoffset\fB,\fIlength\fB)\fR
+True if the \fIlength\fR bytes starting at \fIoffset\fR are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254).
.TP 5
-priority(number)
-.br
-Specifies the relative priority of this MIME type. The default priority is 100.
+\fBpriority(\fInumber\fB)\fR
+Specifies the relative priority of this MIME media type.
+The default priority is 100.
Larger values have higher priority while smaller values have lower priority.
.TP 5
-string(offset,"string")
-.br
-True if bytes are identical to string
+\fBstring(\fIoffset\fB,"\fIstring\fB")\fR
+True if the bytes starting at \fIoffset\fR are identical to \fIstring\fR.
.TP 5
-istring(offset,"string")
-.br
-True if a case-insensitive comparison of the bytes is identical
+\fBistring(\fIoffset\fB,"\fIstring\fB")\fR
+True if the bytes starting at \fIoffset\fR match \fIstring\fR without respect to case.
.TP 5
-char(offset,value)
-.br
-True if byte is identical
+\fBchar(\fIoffset\fB,\fIvalue\fB)\fR
+True if the byte at \fIoffset\fR is identical to \fIvalue\fR.
.TP 5
-short(offset,value)
-.br
-True if 16-bit integer is identical
+\fBshort(\fIoffset\fB,\fIvalue\fB)\fR
+True if the 16-bit big-endian integer at \fIoffset\fR is identical to \fIvalue\fR.
.TP 5
-int(offset,value)
-.br
-True if 32-bit integer is identical
+\fBint(\fIoffset\fB,\fIvalue\fB)\fR
+True if the 32-bit big-endian integer at \fIoffset\fR is identical to \fIvalue\fR.
.TP 5
-locale("string")
-.br
-True if current locale matches string
+\fBlocale("\fIstring\fB")\fR
+True if current locale matches \fIstring\fR.
.TP 5
-contains(offset,range,"string")
-.br
-True if the range contains the string
-.SH STRING CONSTANTS
-String constants can be specified inside quotes ("") for strings
-containing whitespace and angle brackets (<>) for hexadecimal
-strings.
-.SH TYPE MATCHING AND PRIORITY
-When CUPS needs to determine the MIME type of a given file, it checks every
-MIME type defined in the .types files. When two types have the same matching
-rules, the type chosen will depend on the type name and priority, with higher-
-priority types being used over lower-priority ones. If the types have the same
-priority, the type names are sorted alphanumerically in ascending order and the
-first type is chosen.
+\fBcontains(\fIoffset\fB,\fIrange\fB,"\fIstring\fB")\fR
+True if the bytes starting at \fIoffset\fR for \fIrange\fR bytes contains \fIstring\fR.
+.SS STRING CONSTANTS
+String constants can be specified inside quotes ("") for strings containing whitespace and angle brackets (<>) for hexadecimal strings.
+.SS TYPE MATCHING AND PRIORITY
+When CUPS needs to determine the MIME media type of a given file, it checks every MIME media type defined in the \fI.types\fR files.
+When two or more types match a given file, the type chosen will depend on the type name and priority, with higher-priority types being used over lower-priority ones.
+If the types have the same priority, the type names are sorted alphanumerically in ascending order and the first type is chosen.
.LP
For example, if two types "text/bar" and "text/foo" are defined as matching the
extension "doc", normally the type "text/bar" will be chosen since its name is
-alphanumerically smaller than "text/foo". However, if "text/foo" also defines a
-higher priority than "text/bar", "text/foo" will be chosen instead.
+alphanumerically smaller than "text/foo".
+However, if "text/foo" also defines a higher priority than "text/bar", "text/foo" will be chosen instead.
+.SH FILES
+\fI/etc/cups\fR - Typical CUPS configuration directory.
+.SH EXAMPLES
+Define two MIME media types for raster data, with one being a subset with higher priority:
+.nf
+
+ application/vnd.cups\-raster string(0,"RaSt") string(0,"tSaR") \\
+ string(0,"RaS2") string(0,"2SaR") \\
+ string(0,"RaS3") string(0,"3SaR")
+
+ image/pwg-raster string(0,"RaS2") + \\
+ string(4,PwgRaster<00>) priority(150)
+.fi
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR cups-files.conf (5),
+.BR cupsd.conf (5),
+.BR cupsd (8),
+.BR cupsfilter (8),
+.BR mime.convs (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: mime.types.man 7670 2008-06-17 22:42:08Z mike $".
+.\" End of "$Id: mime.types.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/notifier.man b/man/notifier.man
index 4112878..3284f59 100644
--- a/man/notifier.man
+++ b/man/notifier.man
@@ -1,18 +1,18 @@
.\"
-.\" "$Id$"
+.\" "$Id: notifier.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" notifier man page for CUPS.
+.\" notifier man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH notifier 7 "CUPS" "12 May 2009" "Apple Inc."
+.TH notifier 7 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
notifier \- cups notification interface
.SH SYNOPSIS
@@ -22,136 +22,23 @@ notifier \- cups notification interface
.I user-data
]
.SH DESCRIPTION
-The CUPS notifier interface provides a standard method for adding support for
-new event notification methods to CUPS. Each notifier delivers one or more IPP
-events from the standard input to the specified recipient.
+The CUPS notifier interface provides a standard method for adding support for new event notification methods to CUPS.
+Each notifier delivers one or more IPP events from the standard input to the specified recipient.
.LP
-Notifiers \fBmust\fR read IPP messages from the standard input using the
-ippNew and ippReadFile functions and exit on error. Notifiers are encouraged to
-exit after a suitable period of inactivity, however they may exit after reading
-the first message or stay running until an error is seen.
-.SH LOG MESSAGES
-Messages sent to stderr are generally logged to the current \fIErrorLog\fR.
-Each line begins with a standard prefix:
-
-.TP 5
-ALERT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "alert" log level.
-
-.TP 5
-CRIT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "critical" log level.
-
-.TP 5
-DEBUG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug" log level.
-
-.TP 5
-DEBUG2: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug2" log level.
-
-.TP 5
-EMERG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "emergency" log level.
-
-.TP 5
-ERROR: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "error" log level.
-
-.TP 5
-INFO: message
-.br
-Sets the printer-state-message attribute. If the current \fILogLevel\fR
-is set to "debug2", also adds the specified message to the
-current \fIErrorLog\fR using the "info" log level.
-
-.TP 5
-NOTICE: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "notice" log level.
-
-.TP 5
-WARNING: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "warning" log level.
-
-.SH ENVIRONMENT VARIABLES
-The following environment variables are defined by the CUPS server when
-executing the notifier:
-
-.TP 5
-CHARSET
-.br
-The default text character set, typically utf-8.
-
-.TP 5
-CUPS_CACHEDIR
-.br
-The directory for semi-persistent cache files can be found.
-
-.TP 5
-CUPS_DATADIR
-.br
-The directory where data files can be found.
-
-.TP 5
-CUPS_FILETYPE
-.br
-The type of file being printed: "job-sheet" for a banner page and "document"
-for a regular print file.
-
-.TP 5
-CUPS_SERVERROOT
-.br
-The root directory of the server.
-
-.TP 5
-LANG
-.br
-The default language locale (typically C or en).
-
-.TP 5
-PATH
-.br
-The standard execution path for external programs that may be run by
-the filter.
-
-.TP 5
-SOFTWARE
-.br
-The name and version number of the server (typically CUPS/1.2).
-
-.TP 5
-TZ
-.br
-The timezone of the server.
-
-.TP 5
-USER
-.br
-The user executing the filter, typically "lp"; consult the \fIcupsd.conf(5)\fR
-file for the current setting.
-
+Notifiers \fBMUST\fR read IPP messages from the standard input using the
+.BR ippNew ()
+and
+.BR ippReadFile ()
+functions and exit on error.
+Notifiers are encouraged to exit after a suitable period of inactivity, however they may exit after reading the first message or stay running until an error is seen.
+Notifiers inherit the environment and can use the logging mechanism documented in
+.BR filter (7).
.SH SEE ALSO
-\fIbackend(7)\fR, \fIcupsd(8)\fR, \fIfilter(7)\fR,
-.br
-http://localhost:631/help
+.BR cupsd (8),
+.BR filter (7),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id$".
+.\" End of "$Id: notifier.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/ppdc.man b/man/ppdc.man
index 933e7d1..20e96c4 100644
--- a/man/ppdc.man
+++ b/man/ppdc.man
@@ -1,81 +1,106 @@
.\"
-.\" "$Id: ppdc.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdc.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" ppdc man page for CUPS.
+.\" ppdc man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ppdc 1 "CUPS" "15 February 2012" "Apple Inc."
+.TH ppdc 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
-ppdc \- cups ppd compiler
+ppdc \- cups ppd compiler (deprecated)
.SH SYNOPSIS
.B ppdc
-[ -D
-.I name[=value]
-] [ -I
+[
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+] [
+.B \-I
.I include-directory
-] [ -c
+] [
+.B \-c
.I message-catalog
-] [ -d
+] [
+.B \-d
.I output-directory
-] [ -l
+] [
+.B \-l
.I language(s)
-] [-m] [-t] [ -v ] [ -z ] [ --cr ] [ --crlf ] [ --lf ]
+] [
+.B \-m
+] [
+.B \-t
+] [
+.B \-v
+] [
+.B \-z
+] [
+.B \-\-cr
+] [
+.B \-\-crlf
+] [
+.B \-\-lf
+]
.I source-file
.SH DESCRIPTION
-\fIppdc\fR compiles PPDC source files into one or more PPD
-files. \fBThis program is deprecated and will be removed in a future release of
-CUPS.\fR
-.PP
-The \fI-D\fR option sets the named variable for use in the
-source file. It is equivalent to using the #define directive
-in the source file.
-.PP
-The \fI-I\fR option specifies an alternate include directory;
-multiple \fI-I\fR options can be supplied to add additional
-directories.
-.PP
-The \fI-c\fR option specifies a single message catalog file in GNU
-gettext source format (filename.po) to be used for localization.
-.PP
-The \fI-d\fR option specifies the output directory for PPD
-files. The default output directory is "ppd".
-.PP
-The \fI-l\fR option specifies one or more languages to use when
-localizing the PPD file(s). The default language is "en"
-(English). Separate multiple languages with commas, for example
-"de_DE,en_UK,es_ES,es_MX,es_US,fr_CA,fr_FR,it_IT" will create PPD
-files with German, UK English, Spanish (Spain, Mexico, and US),
-French (France and Canada), and Italian languages in each file.
-.PP
-The \fI-m\fR option specifies that the output filename should be
-based on the ModelName value instead of FileName or PCFilenName.
-.PP
-The \fI-t\fR option specifies that PPD files should be tested instead
-of generated.
-.PP
-The \fI-v\fR option provides more verbose output, basically a
-running status of which files are being loaded or written.
-.PP
-The \fI-z\fR option generates compressed PPD files (filename.ppd.gz).
+\fBppdc\fR compiles PPDC source files into one or more PPD files.
+\fBThis program is deprecated and will be removed in a future release of CUPS.\fR
+.SH OPTIONS
+\fBppdc\fR supports the following options:
+.TP 5
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+Sets the named variable for use in the source file.
+It is equivalent to using the \fI#define\fR directive in the source file.
+.TP 5
+\fB\-I \fIinclude-directory\fR
+Specifies an alternate include directory.
+Multiple \fI-I\fR options can be supplied to add additional directories.
+.TP 5
+\fB\-c \fImessage-catalog\fR
+Specifies a single message catalog file in GNU gettext (filename.po) or Apple strings (filename.strings) format to be used for localization.
+.TP 5
+\fB\-d \fIoutput-directory\fR
+Specifies the output directory for PPD files.
+The default output directory is "ppd".
+.TP 5
+\fB\-l \fIlanguage(s)\fR
+Specifies one or more languages to use when localizing the PPD file(s).
+The default language is "en" (English).
+Separate multiple languages with commas, for example "de_DE,en_UK,es_ES,es_MX,es_US,fr_CA,fr_FR,it_IT" will create PPD files with German, UK English, Spanish (Spain, Mexico, and US), French (France and Canada), and Italian languages in each file.
+.TP 5
+.B \-m
+Specifies that the output filename should be based on the ModelName value instead of FileName or PCFilenName.
+.TP 5
+.B \-t
+Specifies that PPD files should be tested instead of generated.
+.TP 5
+.B \-v
+Specifies verbose output, basically a running status of which files are being loaded or written.
+.B \-z
+Generates compressed PPD files (filename.ppd.gz).
The default is to generate uncompressed PPD files.
-.PP
-The \fI--cr\fR, \fI--crlf\fR, and \fI--lf\fR options specify the
-line ending to use - carriage return, carriage return and line feed,
-or line feed. The default is to use the line feed character alone.
+.TP 5
+\fB\-\-cr\fR
+.TP 5
+\fB\-\-crlf\fR
+.TP 5
+\fB\-\-lf\fR
+Specifies the line ending to use - carriage return, carriage return and line feed, or line feed alone.
+The default is to use the line feed character alone.
.SH SEE ALSO
-ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.BR ppdhtml (1),
+.BR ppdi (1),
+.BR ppdmerge (1),
+.BR ppdpo (1),
+.BR ppdcfile (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: ppdc.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdc.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/ppdcfile.man b/man/ppdcfile.man
index a7a56a8..79ec4eb 100644
--- a/man/ppdcfile.man
+++ b/man/ppdcfile.man
@@ -1,170 +1,165 @@
.\"
-.\" "$Id: ppdcfile.man 7607 2008-05-21 01:06:23Z mike $"
+.\" "$Id: ppdcfile.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" ppdcfile man page for CUPS.
+.\" ppdcfile man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ppdcfile 5 "CUPS" "3 December 2012" "Apple Inc."
+.TH ppdcfile 5 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
ppdcfile \- cups ppd compiler source file format
.SH DESCRIPTION
-The CUPS PPD compiler reads meta files that contain descriptions
-of one or more PPD files to be generated by \fIppdc\fR. This man
-page provides a quick reference to the supported keywords and
-should be used in conjunction with the online help for CUPS.
+The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by
+.BR ppdc (1).
+This man page provides a quick reference to the supported keywords and should be used in conjunction with the online help for CUPS.
.PP
-The source file format is plain ASCII text that can be edited
-using your favorite text editor. Comments are supported using
-the C (/* ... */) and C++ (// ...) comment mechanisms.
+The source file format is plain ASCII text that can be edited using your favorite text editor. Comments are supported using the C (/* ... */) and C++ (// ...) comment mechanisms.
.PP
-Printer driver information can be grouped and shared using
-curly braces ({ ... }); PPD files are written when a close
-brace or end-of-file is seen and a PCFileName directive has been
-defined.
+Printer driver information can be grouped and shared using curly braces ({ ... }); PPD files are written when a close brace or end-of-file is seen and a PCFileName directive has been defined.
.PP
-Directives may be placed anywhere on a line and are followed by
-one or more values. The following is a list of the available
-directives and the values they accept:
+Directives may be placed anywhere on a line and are followed by one or more values. The following is a list of the available directives and the values they accept:
.TP 5
-\fB#define\fR name value
+\fB#define \fIname value\fR
.TP 5
-\fB#elif\fR {name | value}
+\fB#elif \fR{\fIname \fR| \fIvalue\fR}
.TP 5
\fB#else\fR
.TP 5
\fB#endif\fR
.TP 5
-\fB#font\fR name encoding "version" charset status
+\fB#font \fIname encoding "version" charset status\fR
.TP 5
-\fB#if\fR {name | value}
+\fB#if \fR{\fIname \fR| \fIvalue\fR}
.TP 5
-\fB#include\fR <filename>
+\fB#include <\fIfilename\fB>\fR
.TP 5
-\fB#include\fR "filename"
+\fB#include "\fIfilename\fB"\fR
.TP 5
-\fB#media\fR name width length
+\fB#media \fIname width length\fR
.TP 5
-\fB#media\fR "name/text" width length
+\fB#media "\fIname\fB/\fItext\fB" \fIwidth length\fR
.TP 5
-\fB#po\fR locale "filename.po"
+\fB#po \fIlocale \fB"\fIfilename\fB"\fR
.TP 5
-\fBAttribute\fR name "" value
+\fBAttribute \fIname \fB"" \fIvalue\fR
.TP 5
-\fBAttribute\fR name keyword value
+\fBAttribute \fIname keyword value\fR
.TP 5
-\fBAttribute\fR name "keyword/text" value
+\fBAttribute \fIname \fB"\fIkeyword\fB/\fItext\fB" \fIvalue\fR
.TP 5
-\fBChoice\fR name "code"
+\fBChoice \fIname \fB"\fIcode\fB"\fR
.TP 5
-\fBChoice\fR "name/text" "code"
+\fBChoice \fB"\fIname\fB/\fItext\fB" "\fIcode\fB"\fR
.TP 5
-\fBColorDevice\fR boolean-value
+\fBColorDevice \fIboolean-value\fR
.TP 5
-\fBColorModel\fR name colorspace colororder compression
+\fBColorModel \fIname colorspace colororder compression\fR
.TP 5
-\fBColorModel\fR "name/text" colorspace colororder compression
+\fBColorModel "\fIname\fB/\fItext\fB" \fIcolorspace colororder compression\fR
.TP 5
-\fBColorProfile\fR resolution/mediatype gamma density matrix
+\fBColorProfile \fIresolution\fB/\fImediatype gamma density matrix\fR
.TP 5
-\fBCopyright\fR "text"
+\fBCopyright "\fItext\fR"
.TP 5
-\fBCustomMedia\fR name width length left bottom right top "size-code" "region-code"
+\fBCustomMedia \fIname width length left bottom right top \fB"\fIsize-code\fB" "\fIregion-code\fB"\fR
.TP 5
-\fBCustomMedia\fR "name/text" width length left bottom right top "size-code" "region-code"
+\fBCustomMedia "\fIname\fB/\fItext\fB" \fIwidth length left bottom right top \fB"\fIsize-code\fB" "\fIregion-code\fB"\fR
.TP 5
-\fBCutter\fR boolean-value
+\fBCutter \fIboolean-value\fR
.TP 5
-\fBDarkness\fR temperature name
+\fBDarkness \fItemperature name\fR
.TP 5
-\fBDarkness\fR temperature "name/text"
+\fBDarkness \fItemperature \fB"\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBDriverType\fR type
+\fBDriverType \fItype\fR
.TP 5
-\fBDuplex\fR type
+\fBDuplex \fItype\fR
.TP 5
-\fBFilter\fR mime-type cost program
+\fBFilter \Imime-type cost program\fR
.TP 5
-\fBFinishing\fR name
+\fBFinishing \fIname\fR
.TP 5
-\fBFinishing\fR "name/text"
+\fBFinishing "\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBFont\fR *
+\fBFont *\fR
.TP 5
-\fBFont\fR name encoding "version" charset status
+\fBFont \fIname encoding \fB"\fIversion\fB" \fIcharset status\fR
.TP 5
-\fBGroup\fR name
+\fBGroup \fIname\fR
.TP 5
-\fBGroup\fR "name/text"
+\fBGroup "\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBHWMargins\fR left bottom right top
+\fBHWMargins \fIleft bottom right top\fR
.TP 5
-\fBInputSlot\fR position name
+\fBInputSlot \fIposition name\fR
.TP 5
-\fBInputSlot\fR position "name/text"
+\fBInputSlot \fIposition \fB"\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBInstallable\fR name
+\fBInstallable \fIname\fR
.TP 5
-\fBInstallable\fR "name/text"
+\fBInstallable "\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBLocAttribute\fR name "keyword/text" value
+\fBLocAttribute \fIname \fB"\fIkeyword\fB/\fItext\fB" \fIvalue\fR
.TP 5
-\fBManualCopies\fR boolean-value
+\fBManualCopies \fIboolean-value\fR
.TP 5
-\fBManufacturer\fR "name"
+\fBManufacturer "\fIname\fB"\fR
.TP 5
-\fBMaxSize\fR width length
+\fBMaxSize \fIwidth length\fR
.TP 5
-\fBMediaSize\fR name
+\fBMediaSize \fIname\fR
.TP 5
-\fBMediaType\fR type name
+\fBMediaType \fItype name\fR
.TP 5
-\fBMediaType\fR type "name/text"
+\fBMediaType \fItype \fB"\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBMinSize\fR width length
+\fBMinSize \fIwidth length\fR
.TP 5
-\fBModelName\fR "name"
+\fBModelName "\fIname\fB"\fR
.TP 5
-\fBModelNumber\fR number
+\fBModelNumber \fInumber\fR
.TP 5
-\fBOption\fR name type section order
+\fBOption \fIname type section order\fR
.TP 5
-\fBOption\fR "name/text" type section order
+\fBOption "\fIname\fB/\fItext\fB" \fItype section order\fR
.TP 5
-\fBPCFileName\fR "filename.ppd"
+\fBPCFileName "\fIfilename.ppd\fB"\fR
.TP 5
-\fBResolution\fR colorspace bits-per-color row-count row-feed row-step name
+\fBResolution \fIcolorspace bits-per-color row-count row-feed row-step name\fR
.TP 5
-\fBResolution\fR colorspace bits-per-color row-count row-feed row-step "name/text"
+\fBResolution \fIcolorspace bits-per-color row-count row-feed row-step \fB"\fIname\fB/\fItext\fB"\fR
.TP 5
-\fBSimpleColorProfile\fR resolution/mediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust
+\fBSimpleColorProfile \fIresolution\fB/\fImediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust\fR
.TP 5
-\fBThroughput\fR pages-per-minute
+\fBThroughput \fIpages-per-minute\fR
.TP 5
-\fBUIConstraints\fR "*Option1 *Option2"
+\fBUIConstraints "\fI*Option1 *Option2\fB"\fR
.TP 5
-\fBUIConstraints\fR "*Option1 Choice1 *Option2"
+\fBUIConstraints "\fI*Option1 Choice1 *Option2\fB"\fR
.TP 5
-\fBUIConstraints\fR "*Option1 *Option2 Choice2"
+\fBUIConstraints "\fI*Option1 *Option2 Choice2\fB"\fR
.TP 5
-\fBUIConstraints\fR "*Option1 Choice1 *Option2 Choice2"
+\fBUIConstraints "\fI*Option1 Choice1 *Option2 Choice2\fB"\fR
.TP 5
-\fBVariablePaperSize\fR boolean-value
+\fBVariablePaperSize \fIboolean-value\fR
.TP 5
-\fBVersion\fR number
+\fBVersion \fInumber\fR
.SH SEE ALSO
-ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1)
-.br
-http://localhost:631/help
+.BR ppdc (1),
+.BR ppdhtml (1),
+.BR ppdi (1),
+.BR ppdmerge (1),
+.BR ppdpo (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: ppdcfile.man 7607 2008-05-21 01:06:23Z mike $".
+.\" End of "$Id: ppdcfile.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/ppdhtml.man b/man/ppdhtml.man
index 78df7d3..f5a9596 100644
--- a/man/ppdhtml.man
+++ b/man/ppdhtml.man
@@ -1,46 +1,51 @@
.\"
-.\" "$Id: ppdhtml.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdhtml.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" ppdhtml man page for CUPS.
+.\" ppdhtml man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ppdhtml 1 "CUPS" "10 October 2008" "Apple Inc."
+.TH ppdhtml 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
-ppdhtml \- cups html summary generator
+ppdhtml \- cups html summary generator (deprecated)
.SH SYNOPSIS
.B ppdhtml
-[ -D
-.I name[=value]
-] [ -I
+[
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+] [
+.B \-I
.I include-directory
]
.I source-file
.SH DESCRIPTION
-\fIppdhtml\fR reads a driver information file and produces a
-HTML summary page that lists all of the drivers in a file and
-the supported options.
-.PP
-The \fI-D\fR option sets the named variable for use in the
-source file. It is equivalent to using the #define directive
-in the source file.
-.PP
-The \fI-I\fR option specifies an alternate include directory;
-multiple \fI-I\fR options can be supplied to add additional
-directories.
+\fBppdhtml\fR reads a driver information file and produces a HTML summary page that lists all of the drivers in a file and the supported options.
+\fBThis program is deprecated and will be removed in a future release of CUPS.\fR
+.SH OPTIONS
+\fBppdhtml\fR supports the following options:
+.TP 5
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+Sets the named variable for use in the source file.
+It is equivalent to using the \fI#define\fR directive in the source file.
+.TP 5
+\fB\-I \fIinclude-directory\fR
+Specifies an alternate include directory.
+Multiple \fI-I\fR options can be supplied to add additional directories.
.SH SEE ALSO
-ppdc(1), ppdcfile(5), ppdi(1), ppdmerge(1), ppdpo(1)
-.br
-http://localhost:631/help
+.BR ppdc (1),
+.BR ppdcfile (5),
+.BR ppdi (1),
+.BR ppdmerge (1),
+.BR ppdpo (1),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: ppdhtml.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdhtml.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/ppdi.man b/man/ppdi.man
index 38658e0..db04476 100644
--- a/man/ppdi.man
+++ b/man/ppdi.man
@@ -1,46 +1,58 @@
.\"
-.\" "$Id: ppdi.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdi.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" ppdi man page for CUPS.
+.\" ppdi man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ppdi 1 "CUPS" "20 May 2008" "Apple Inc."
+.TH ppdi 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
-ppdi \- import ppd files
+ppdi \- import ppd files (deprecated)
.SH SYNOPSIS
.B ppdi
-[ \-I
+[
+.B \-I
.I include-directory
-] [ \-o
+] [
+.B \-o
.I source-file
]
.I ppd-file
-[
-.I ppd-file2 ... ppd-fileN
+[ ...
+.I ppd-file
]
.SH DESCRIPTION
-\fIppdi\fR imports one or more PPD files into a PPD compiler source file.
-Multiple languages of the same PPD file are merged into a single printer
-definition to facilitate accurate changes for all localizations.
-.PP
-The \fI-o\fR option specifies the PPD source file to update. If the source
-file does not exist, a new source file is created. Otherwise the existing
-file is merged with the new PPD file(s) on the command-line. If no source
-file is specified, the filename "ppdi.drv" is used.
+\fBppdi\fR imports one or more PPD files into a PPD compiler source file.
+Multiple languages of the same PPD file are merged into a single printer definition to facilitate accurate changes for all localizations.
+\fBThis program is deprecated and will be removed in a future release of CUPS.\fR
+.SH OPTIONS
+\fBppdi\fR supports the following options:
+.TP 5
+\fB\-I \fIinclude-directory\fR
+Specifies an alternate include directory.
+Multiple \fI-I\fR options can be supplied to add additional directories.
+.TP 5
+\fB\-o \fIsource-file\fR
+Specifies the PPD source file to update.
+If the source file does not exist, a new source file is created.
+Otherwise the existing file is merged with the new PPD file(s) on the command-line.
+If no source file is specified, the filename \fIppdi.drv\fR is used.
.SH SEE ALSO
-ppdc(1), ppdhtml(1), ppdmerge(1), ppdpo(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.BR ppdc (1),
+.BR ppdhtml (1),
+.BR ppdmerge (1),
+.BR ppdpo (1),
+.BR ppdcfile (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: ppdi.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdi.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/ppdmerge.man b/man/ppdmerge.man
index 397314e..71239ad 100644
--- a/man/ppdmerge.man
+++ b/man/ppdmerge.man
@@ -1,47 +1,54 @@
.\"
-.\" "$Id: ppdmerge.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdmerge.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" ppdmerge man page for CUPS.
+.\" ppdmerge man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ppdmerge 1 "CUPS" "20 May 2008" "Apple Inc."
+.TH ppdmerge 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
-ppdmerge \- merge ppd files
+ppdmerge \- merge ppd files (deprecated)
.SH SYNOPSIS
.B ppdmerge
-[ \-o
+[
+.B \-o
.I output-ppd-file
]
.I ppd-file
-.I ppd-file2
-[
-.I ... ppd-fileN
+.I ppd-file
+[ ...
+.I ppd-file
]
.SH DESCRIPTION
-\fIppdmerge\fR merges two or more PPD files into a single, multi-language
+\fBppdmerge\fR merges two or more PPD files into a single, multi-language
PPD file.
-.PP
-The \fI-o\fR option specifies the PPD file to create. If not specified,
-the merged PPD file is written to the standard output. If the output file
-already exists, the new
+\fBThis program is deprecated and will be removed in a future release of CUPS.\fR
+.SH OPTIONS
+\fBppdmerge\fR supports the following options:
+.TP
+\fB\-o \fIoutput-ppd-file\fR
+Specifies the PPD file to create.
+If not specified, the merged PPD file is written to the standard output.
+If the output file already exists, it is silently overwritten.
.SH NOTES
-\fIppdmerge\fR does not check whether the merged PPD files are for the
-same device. Merging of different device PPDs will yield unpredictable
-results.
+\fBppdmerge\fR does not check whether the merged PPD files are for the same device.
+Merging of different device PPDs will yield unpredictable results.
.SH SEE ALSO
-cupsprofile(1), ppdc(1), ppdhtml(1), ppdi(1), ppdpo(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.BR ppdc (1),
+.BR ppdhtml (1),
+.BR ppdi (1),
+.BR ppdpo (1),
+.BR ppdcfile (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: ppdmerge.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdmerge.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/ppdpo.man b/man/ppdpo.man
index c6378bc..6acf098 100644
--- a/man/ppdpo.man
+++ b/man/ppdpo.man
@@ -1,52 +1,58 @@
.\"
-.\" "$Id: ppdpo.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdpo.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" ppdpo man page for CUPS.
+.\" ppdpo man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH ppdpo 1 "CUPS" "23 April 2012" "Apple Inc."
+.TH ppdpo 1 "CUPS" "12 June 2014" "Apple Inc."
.SH NAME
-ppdpo \- ppd message catalog generator
+ppdpo \- ppd message catalog generator (deprecated)
.SH SYNOPSIS
.B ppdpo
-[ -D
-.I name[=value]
-] [ -I
+[
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+] [
+.B \-I
.I include-directory
-] [ -o
+] [
+.B \-o
.I output-file
]
.I source-file
.SH DESCRIPTION
-\fIppdpo\fR extracts UI strings from PPDC source files and updates either
-a GNU gettext or OS X strings format message catalog source file for
-translation.
-.PP
-The \fI-D\fR option sets the named variable for use in the
-source file. It is equivalent to using the #define directive
-in the source file.
-.PP
-The \fI-I\fR option specifies an alternate include directory;
-multiple \fI-I\fR options can be supplied to add additional
-directories.
-.PP
-The \fI-o\fR option specifies the output file. The supported extensions are
-".po" or ".po.gz" for GNU gettext format message catalogs and ".strings" for
-OS X strings files.
+\fBppdpo\fR extracts UI strings from PPDC source files and updates either a GNU gettext or OS X strings format message catalog source file for translation.
+\fBThis program is deprecated and will be removed in a future release of CUPS.\fR
+.SH OPTIONS
+\fBppdpo\fR supports the following options:
+.TP 5
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+Sets the named variable for use in the source file.
+It is equivalent to using the \fI#define\fR directive in the source file.
+.TP 5
+\fB\-I \fIinclude-directory\fR
+Specifies an alternate include directory.
+Multiple \fI-I\fR options can be supplied to add additional directories.
+.TP 5
+\fB\-o \fIoutput-file\fR
+Specifies the output file.
+The supported extensions are \fI.po\fR or \fI.po.gz\fR for GNU gettext format message catalogs and \fI.strings\fR for OS X strings files.
.SH SEE ALSO
-ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.BR ppdc (1),
+.BR ppdhtml (1),
+.BR ppdi (1),
+.BR ppdmerge (1),
+.BR ppdcfile(5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: ppdpo.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdpo.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/printers.conf.man b/man/printers.conf.man
index 6d8609f..9a3d148 100644
--- a/man/printers.conf.man
+++ b/man/printers.conf.man
@@ -1,124 +1,36 @@
.\"
-.\" "$Id: printers.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: printers.conf.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" printers.conf man page for CUPS.
+.\" printers.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH printers.conf 5 "CUPS" "29 April 2009" "Apple Inc."
+.TH printers.conf 5 "CUPS" "15 April 2014" "Apple Inc."
.SH NAME
printers.conf \- printer configuration file for cups
.SH DESCRIPTION
-The \fIprinters.conf\fR file defines the local printers that are
-available. It is normally located in the \fI/etc/cups\fR directory and
-is generated automatically by the \fIcupsd(8)\fR program when printers
-are added or deleted.
-.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-.TP 5
-<Printer name> ... </Printer>
-.br
-Defines a specific printer.
-.TP 5
-<DefaultPrinter name> ... </Printer>
-.br
-Defines a default printer.
-.TP 5
-Accepting Yes
-.TP 5
-Accepting No
-.br
-Specifies whether the printer is accepting new jobs.
-.TP 5
-AllowUser [ user @group ... ]
-.br
-Allows specific users and groups to print to the printer.
-.TP 5
-DenyUser [ user @group ... ]
-.br
-Prevents specific users and groups from printing to the printer.
-.TP 5
-DeviceURI uri
-.br
-Specifies the device URI for a printer.
-.TP 5
-ErrorPolicy abort-job
-.TP 5
-ErrorPolicy retry-current-job
-.TP 5
-ErrorPolicy retry-job
-.TP 5
-ErrorPolicy stop-printer
-.br
-Specifies the error policy for the printer.
-.TP 5
-Info text
-.br
-Specifies human-readable text describing the printer.
-.TP 5
-JobSheets banner banner
-.br
-Specifies the banner pages to use for the printer.
-.TP 5
-KLimit number
-.br
-Specifies the job-k-limit value for the printer.
-.TP 5
-Location text
-.br
-Specifies human-readable text describing the location of the printer.
-.TP 5
-OpPolicy name
-.br
-Specifies the operation policy for the printer.
-.TP 5
-PageLimit number
-.br
-Specifies the job-page-limit value for the printer.
-.TP 5
-PortMonitor monitor
-.br
-Specifies the port monitor for a printer.
-.TP 5
-QuotaPeriod seconds
-.br
-Specifies the job-quota-period value for the printer.
-.TP 5
-Shared Yes
-.TP 5
-Shared No
-.br
-Specifies whether the printer is shared.
-.TP 5
-State idle
-.TP 5
-State stopped
-.br
-Specifies the initial state of the printer (Idle or Stopped)
-.TP 5
-StateMessage text
-.br
-Specifies the message associated with the state.
-.TP 5
-StateTime seconds
-.br
-Specifies the date/time associated with the state.
+The \fBprinters.conf\fR file defines the local printers that are available. It is normally located in the \fI/etc/cups\fR directory and is maintained by the
+.BR cupsd (8)
+program. This file is not intended to be edited or managed manually.
+.SH NOTES
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR,
-.br
-http://localhost:631/help
+.BR classes.conf (5),
+.BR cupsd (8),
+.BR cupsd.conf (5),
+.BR mime.convs (5),
+.BR mime.types (5),
+.BR subscriptions.conf (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: printers.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: printers.conf.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/man/subscriptions.conf.man b/man/subscriptions.conf.man
index 5531c6a..860c086 100644
--- a/man/subscriptions.conf.man
+++ b/man/subscriptions.conf.man
@@ -1,89 +1,36 @@
.\"
-.\" "$Id: subscriptions.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: subscriptions.conf.man 12854 2015-08-28 14:08:00Z msweet $"
.\"
-.\" subscriptions.conf man page for CUPS.
+.\" subscriptions.conf man page for CUPS.
.\"
-.\" Copyright 2007-2013 by Apple Inc.
-.\" Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" These coded instructions, statements, and computer programs are the
-.\" property of Apple Inc. and are protected by Federal copyright
-.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
-.\" which should have been included with this file. If this file is
-.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
.\"
-.TH subscriptions.conf 5 "CUPS" "30 April 2006" "Apple Inc."
+.TH subscriptions.conf 5 "CUPS" "15 April 2014" "Apple Inc."
.SH NAME
-subscriptions.conf \- subscriptions file for cups
+subscriptions.conf \- subscription configuration file for cups
.SH DESCRIPTION
-The \fIsubscriptions.conf\fR file defines the local subscriptions
-that are active. It is normally located in the \fI/etc/cups\fR
-directory and is generated automatically by the \fIcupsd(8)\fR
-program when subscriptions are created, renewed, or cancelled.
-.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-.TP 5
-<Subscription NNN> ... </Subscription>
-.br
-Defines a subscription.
-.TP 5
-Events name [ ... name ]
-.br
-Specifies the events that are subscribed.
-.TP 5
-ExpirationTime unix-time
-.br
-Specifies the expiration time of a subscription as a UNIX time
-value in seconds since January 1st, 1970.
-.TP 5
-Interval seconds
-.br
-Specifies the preferred time interval for event notifications in
-seconds.
-.TP 5
-JobId job-id
-.br
-Specifies the job ID associated with the subscription.
-.TP 5
-LeaseDuration seconds
-.br
-Specifies the number of seconds that the subscription is valid
-for. If 0, the subscription does not expire.
-.TP 5
-NextEventId number
-.br
-Specifies the next notify-sequence-number to use for the
-subscription.
-.TP 5
-NextSubscriptionId number
-.br
-Specifies the next subscription-id to use.
-.TP 5
-Owner username
-.br
-Specifies the user that owns the subscription.
-.TP 5
-PrinterName printername
-.br
-Specifies the printer or class associated with the subscription.
-.TP 5
-Recipient uri
-.br
-Specifies the notify-recipient-uri value for push-type notifications.
-.TP 5
-UserData hex-escaped-data
-.br
-Specifies user data to be included in event notifications. This
-is typically the "from" address in mailto: notifications.
+The \fBsubscriptions.conf\fR file defines the local event notification subscriptions that are active. It is normally located in the \fI/etc/cups\fR directory and is maintained by the
+.BR cupsd (8)
+program. This file is not intended to be edited or managed manually.
+.SH NOTES
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
.SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fRprinters.conf(5)\fR
-.br
-http://localhost:631/help
+.BR classes.conf (5),
+.BR cupsd (8),
+.BR cupsd.conf (5),
+.BR mime.convs (5),
+.BR mime.types (5),
+.BR printers.conf (5),
+CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
.\"
-.\" End of "$Id: subscriptions.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: subscriptions.conf.man 12854 2015-08-28 14:08:00Z msweet $".
.\"
diff --git a/monitor/Dependencies b/monitor/Dependencies
index 54d05e7..10a252a 100644
--- a/monitor/Dependencies
+++ b/monitor/Dependencies
@@ -1,13 +1,14 @@
bcp.o: bcp.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
- ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
tbcp.o: tbcp.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
diff --git a/monitor/Makefile b/monitor/Makefile
index c512db0..1c3bf69 100644
--- a/monitor/Makefile
+++ b/monitor/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $"
#
# Port monitor makefile for CUPS.
#
@@ -86,6 +86,7 @@ install-exec:
$(INSTALL_DIR) $(SYMROOT); \
for file in $(TARGETS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -142,5 +143,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $".
#
diff --git a/monitor/bcp.c b/monitor/bcp.c
index 103c92e..11c2e68 100644
--- a/monitor/bcp.c
+++ b/monitor/bcp.c
@@ -1,24 +1,18 @@
/*
- * "$Id: bcp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: bcp.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * TBCP port monitor for CUPS.
+ * TBCP port monitor for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1993-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1993-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry...
- * psgets() - Get a line from a file.
- * pswrite() - Write data from a file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -34,7 +28,7 @@
*/
static char *psgets(char *buf, size_t *bytes, FILE *fp);
-static size_t pswrite(const char *buf, size_t bytes, FILE *fp);
+static ssize_t pswrite(const char *buf, size_t bytes);
/*
@@ -151,7 +145,7 @@ main(int argc, /* I - Number of command-line args */
if (psgets(line, &linelen, fp) == NULL)
break;
}
- while (pswrite(line, linelen, stdout) > 0);
+ while (pswrite(line, linelen) > 0);
fflush(stdout);
}
@@ -184,7 +178,7 @@ psgets(char *buf, /* I - Buffer to read into */
bufptr = buf;
ch = EOF;
- while ((bufptr - buf) < len)
+ while ((size_t)(bufptr - buf) < len)
{
if ((ch = getc(fp)) == EOF)
break;
@@ -209,7 +203,7 @@ psgets(char *buf, /* I - Buffer to read into */
else if (ch == '\n')
break;
else
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
/*
@@ -218,8 +212,8 @@ psgets(char *buf, /* I - Buffer to read into */
if (ch == '\n' || ch == '\r')
{
- if ((bufptr - buf) < len)
- *bufptr++ = ch;
+ if ((size_t)(bufptr - buf) < len)
+ *bufptr++ = (char)ch;
else
ungetc(ch, fp);
}
@@ -229,7 +223,7 @@ psgets(char *buf, /* I - Buffer to read into */
*/
*bufptr = '\0';
- *bytes = bufptr - buf;
+ *bytes = (size_t)(bufptr - buf);
if (ch == EOF && bufptr == buf)
return (NULL);
@@ -242,10 +236,9 @@ psgets(char *buf, /* I - Buffer to read into */
* 'pswrite()' - Write data from a file.
*/
-static size_t /* O - Number of bytes written */
+static ssize_t /* O - Number of bytes written */
pswrite(const char *buf, /* I - Buffer to write */
- size_t bytes, /* I - Bytes to write */
- FILE *fp) /* I - File to write to */
+ size_t bytes) /* I - Bytes to write */
{
size_t count; /* Remaining bytes */
@@ -283,10 +276,10 @@ pswrite(const char *buf, /* I - Buffer to write */
break;
}
- return (bytes);
+ return ((ssize_t)bytes);
}
/*
- * End of "$Id: bcp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: bcp.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/monitor/tbcp.c b/monitor/tbcp.c
index a65aaec..5325faf 100644
--- a/monitor/tbcp.c
+++ b/monitor/tbcp.c
@@ -1,24 +1,18 @@
/*
- * "$Id: tbcp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: tbcp.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * TBCP port monitor for CUPS.
+ * TBCP port monitor for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1993-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1993-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry...
- * psgets() - Get a line from a file.
- * pswrite() - Write data from a file.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -34,7 +28,7 @@
*/
static char *psgets(char *buf, size_t *bytes, FILE *fp);
-static size_t pswrite(const char *buf, size_t bytes, FILE *fp);
+static ssize_t pswrite(const char *buf, size_t bytes);
/*
@@ -93,11 +87,8 @@ main(int argc, /* I - Number of command-line args */
*/
linelen = sizeof(line);
- if (psgets(line, &linelen, fp) == NULL)
- {
- fputs("ERROR: Empty print file!\n", stderr);
- return (1);
- }
+ if (!psgets(line, &linelen, fp))
+ break;
/*
* Handle leading PJL fun...
@@ -138,7 +129,7 @@ main(int argc, /* I - Number of command-line args */
* Loop until we see end-of-file...
*/
- while (pswrite(line, linelen, stdout) > 0)
+ while (pswrite(line, linelen) > 0)
{
linelen = sizeof(line);
if (psgets(line, &linelen, fp) == NULL)
@@ -176,7 +167,7 @@ psgets(char *buf, /* I - Buffer to read into */
bufptr = buf;
ch = EOF;
- while ((bufptr - buf) < len)
+ while ((size_t)(bufptr - buf) < len)
{
if ((ch = getc(fp)) == EOF)
break;
@@ -201,7 +192,7 @@ psgets(char *buf, /* I - Buffer to read into */
else if (ch == '\n')
break;
else
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
/*
@@ -210,8 +201,8 @@ psgets(char *buf, /* I - Buffer to read into */
if (ch == '\n' || ch == '\r')
{
- if ((bufptr - buf) < len)
- *bufptr++ = ch;
+ if ((size_t)(bufptr - buf) < len)
+ *bufptr++ = (char)ch;
else
ungetc(ch, fp);
}
@@ -221,7 +212,7 @@ psgets(char *buf, /* I - Buffer to read into */
*/
*bufptr = '\0';
- *bytes = bufptr - buf;
+ *bytes = (size_t)(bufptr - buf);
if (ch == EOF && bufptr == buf)
return (NULL);
@@ -234,10 +225,9 @@ psgets(char *buf, /* I - Buffer to read into */
* 'pswrite()' - Write data from a file.
*/
-static size_t /* O - Number of bytes written */
+static ssize_t /* O - Number of bytes written */
pswrite(const char *buf, /* I - Buffer to write */
- size_t bytes, /* I - Bytes to write */
- FILE *fp) /* I - File to write to */
+ size_t bytes) /* I - Bytes to write */
{
size_t count; /* Remaining bytes */
@@ -276,10 +266,10 @@ pswrite(const char *buf, /* I - Buffer to write */
break;
}
- return (bytes);
+ return ((ssize_t)bytes);
}
/*
- * End of "$Id: tbcp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: tbcp.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/notifier/Dependencies b/notifier/Dependencies
index f5a26a4..d844f9d 100644
--- a/notifier/Dependencies
+++ b/notifier/Dependencies
@@ -1,20 +1,22 @@
dbus.o: dbus.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
- ../cups/string-private.h ../config.h
+ ../cups/pwg.h ../cups/string-private.h ../config.h
mailto.o: mailto.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
rss.o: rss.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
- ../cups/string-private.h ../config.h ../cups/ipp-private.h
+ ../cups/pwg.h ../cups/string-private.h ../config.h \
+ ../cups/ipp-private.h
testnotify.o: testnotify.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
diff --git a/notifier/Makefile b/notifier/Makefile
index df7a188..3206dd0 100644
--- a/notifier/Makefile
+++ b/notifier/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $"
#
# Notifier makefile for CUPS.
#
@@ -77,7 +77,10 @@ install-exec:
done
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
- cp $(NOTIFIERS) $(SYMROOT); \
+ for file in $(NOTIFIERS); do \
+ cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
+ done \
fi
@@ -158,5 +161,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $".
#
diff --git a/notifier/dbus.c b/notifier/dbus.c
index 08449d3..2a01f24 100644
--- a/notifier/dbus.c
+++ b/notifier/dbus.c
@@ -1,23 +1,18 @@
/*
- * "$Id: dbus.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dbus.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * D-Bus notifier for CUPS.
+ * D-Bus notifier for CUPS.
*
- * Copyright 2008-2011 by Apple Inc.
- * Copyright (C) 2011 Red Hat, Inc.
- * Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2008-2014 by Apple Inc.
+ * Copyright (C) 2011, 2013 Red Hat, Inc.
+ * Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Read events and send DBUS notifications.
- * acquire_lock() - Acquire a lock so we only have a single notifier running.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -154,10 +149,18 @@ enum
/*
+ * Global variables...
+ */
+
+static char lock_filename[1024]; /* Lock filename */
+
+
+/*
* Local functions...
*/
static int acquire_lock(int *fd, char *lockfile, size_t locksize);
+static void release_lock(void);
/*
@@ -176,8 +179,6 @@ main(int argc, /* I - Number of command-line args */
DBusMessage *message; /* Message to send */
DBusMessageIter iter; /* Iterator for message data */
int lock_fd = -1; /* Lock file descriptor */
- char lock_filename[1024];
- /* Lock filename */
/*
@@ -416,7 +417,7 @@ main(int argc, /* I - Number of command-line args */
attr = ippFindAttribute(msg, "printer-state", IPP_TAG_ENUM);
if (attr)
{
- dbus_uint32_t val = ippGetInteger(attr, 0);
+ dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
dbus_message_iter_append_uint32(&iter, &val);
}
else
@@ -445,7 +446,7 @@ main(int argc, /* I - Number of command-line args */
if (i)
*p++ = ',';
- strcpy(p, ippGetString(attr, i, NULL));
+ strlcpy(p, ippGetString(attr, i, NULL), reasons_length - (size_t)(p - printer_reasons));
p += strlen(p);
}
if (!dbus_message_iter_append_string(&iter, &printer_reasons))
@@ -464,7 +465,7 @@ main(int argc, /* I - Number of command-line args */
IPP_TAG_BOOLEAN);
if (attr)
{
- dbus_bool_t val = ippGetBoolean(attr, 0);
+ dbus_bool_t val = (dbus_bool_t)ippGetBoolean(attr, 0);
dbus_message_iter_append_boolean(&iter, &val);
}
else
@@ -484,7 +485,7 @@ main(int argc, /* I - Number of command-line args */
attr = ippFindAttribute(msg, "notify-job-id", IPP_TAG_INTEGER);
if (attr)
{
- dbus_uint32_t val = ippGetInteger(attr, 0);
+ dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
dbus_message_iter_append_uint32(&iter, &val);
}
else
@@ -494,7 +495,7 @@ main(int argc, /* I - Number of command-line args */
attr = ippFindAttribute(msg, "job-state", IPP_TAG_ENUM);
if (attr)
{
- dbus_uint32_t val = ippGetInteger(attr, 0);
+ dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
dbus_message_iter_append_uint32(&iter, &val);
}
else
@@ -517,7 +518,7 @@ main(int argc, /* I - Number of command-line args */
if (i)
*p++ = ',';
- strcpy(p, ippGetString(attr, i, NULL));
+ strlcpy(p, ippGetString(attr, i, NULL), reasons_length - (size_t)(p - job_reasons));
p += strlen(p);
}
if (!dbus_message_iter_append_string(&iter, &job_reasons))
@@ -542,7 +543,7 @@ main(int argc, /* I - Number of command-line args */
IPP_TAG_INTEGER);
if (attr)
{
- dbus_uint32_t val = ippGetInteger(attr, 0);
+ dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
dbus_message_iter_append_uint32(&iter, &val);
}
else
@@ -576,7 +577,7 @@ main(int argc, /* I - Number of command-line args */
if (lock_fd >= 0)
{
close(lock_fd);
- unlink(lock_filename);
+ release_lock();
}
return (0);
@@ -584,6 +585,27 @@ main(int argc, /* I - Number of command-line args */
/*
+ * 'release_lock()' - Release the singleton lock.
+ */
+
+static void
+release_lock(void)
+{
+ unlink(lock_filename);
+}
+
+
+/*
+ * 'handle_sigterm()' - Handle SIGTERM signal.
+ */
+static void
+handle_sigterm(int signum)
+{
+ release_lock();
+ _exit(0);
+}
+
+/*
* 'acquire_lock()' - Acquire a lock so we only have a single notifier running.
*/
@@ -592,7 +614,8 @@ acquire_lock(int *fd, /* O - Lock file descriptor */
char *lockfile, /* I - Lock filename buffer */
size_t locksize) /* I - Size of filename buffer */
{
- const char *tmpdir; /* Temporary directory */
+ const char *tmpdir; /* Temporary directory */
+ struct sigaction action; /* POSIX sigaction data */
/*
@@ -610,8 +633,16 @@ acquire_lock(int *fd, /* O - Lock file descriptor */
if ((*fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) < 0)
return (-1);
- else
- return (0);
+
+ /*
+ * Set a SIGTERM handler to make sure we release the lock if the
+ * scheduler decides to stop us.
+ */
+ memset(&action, 0, sizeof(action));
+ action.sa_handler = handle_sigterm;
+ sigaction(SIGTERM, &action, NULL);
+
+ return (0);
}
#else /* !HAVE_DBUS */
int
@@ -623,5 +654,5 @@ main(void)
/*
- * End of "$Id: dbus.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dbus.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/notifier/mailto.c b/notifier/mailto.c
index fce6aec..724e12b 100644
--- a/notifier/mailto.c
+++ b/notifier/mailto.c
@@ -1,5 +1,5 @@
/*
- * "$Id: mailto.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mailto.c 10996 2013-05-29 11:51:34Z msweet $"
*
* "mailto" notifier for CUPS.
*
@@ -642,5 +642,5 @@ print_attributes(ipp_t *ipp, /* I - IPP request */
/*
- * End of "$Id: mailto.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mailto.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/notifier/rss.c b/notifier/rss.c
index 1489847..f2a0402 100644
--- a/notifier/rss.c
+++ b/notifier/rss.c
@@ -1,27 +1,16 @@
/*
- * "$Id: rss.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rss.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * RSS notifier for CUPS.
+ * RSS notifier for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for the test notifier.
- * compare_rss() - Compare two messages.
- * delete_message() - Free all memory used by a message.
- * load_rss() - Load an existing RSS feed file.
- * new_message() - Create a new RSS message.
- * password_cb() - Return the cached password.
- * save_rss() - Save messages to a RSS file.
- * xml_escape() - Copy a string, escaping &, <, and > as needed.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -29,6 +18,7 @@
*/
#include <cups/cups.h>
+#include <sys/stat.h>
#include <cups/language.h>
#include <cups/string-private.h>
#include <cups/array.h>
@@ -629,6 +619,8 @@ save_rss(cups_array_t *rss, /* I - RSS messages */
return (0);
}
+ fchmod(fileno(fp), 0644);
+
fputs("<?xml version=\"1.0\"?>\n", fp);
fputs("<rss version=\"2.0\">\n", fp);
fputs(" <channel>\n", fp);
@@ -649,15 +641,21 @@ save_rss(cups_array_t *rss, /* I - RSS messages */
msg;
msg = (_cups_rss_t *)cupsArrayPrev(rss))
{
+ char *subject = xml_escape(msg->subject);
+ char *text = xml_escape(msg->text);
+
fputs(" <item>\n", fp);
- fprintf(fp, " <title>%s</title>\n", msg->subject);
- fprintf(fp, " <description>%s</description>\n", msg->text);
+ fprintf(fp, " <title>%s</title>\n", subject);
+ fprintf(fp, " <description>%s</description>\n", text);
if (msg->link_url)
fprintf(fp, " <link>%s</link>\n", msg->link_url);
fprintf(fp, " <pubDate>%s</pubDate>\n",
httpGetDateString2(msg->event_time, date, sizeof(date)));
fprintf(fp, " <guid>%d</guid>\n", msg->sequence_number);
fputs(" </item>\n", fp);
+
+ free(subject);
+ free(text);
}
fputs(" </channel>\n", fp);
@@ -737,5 +735,5 @@ xml_escape(const char *s) /* I - String to escape */
/*
- * End of "$Id: rss.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rss.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/notifier/testnotify.c b/notifier/testnotify.c
index 3186b6f..67441ce 100644
--- a/notifier/testnotify.c
+++ b/notifier/testnotify.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testnotify.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testnotify.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Test notifier for CUPS.
*
@@ -123,5 +123,5 @@ print_attributes(ipp_t *ipp, /* I - IPP request */
/*
- * End of "$Id: testnotify.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testnotify.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/packaging/cups.list.in b/packaging/cups.list.in
index 3eb7f41..94a648e 100644
--- a/packaging/cups.list.in
+++ b/packaging/cups.list.in
@@ -1,21 +1,21 @@
#
-# "$Id: cups.list.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.list.in 11776 2014-03-28 19:16:05Z msweet $"
#
-# ESP Package Manager (EPM) file list for CUPS.
+# ESP Package Manager (EPM) file list for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
# Product information
%product CUPS
-%copyright 2007-2012 by Apple Inc.
+%copyright 2007-2014 by Apple Inc.
%vendor Apple Inc.
#%license LICENSE.txt
%readme LICENSE.txt
@@ -345,7 +345,6 @@ f 0555 root sys $BINDIR/cupstestppd systemv/cupstestppd
f 0555 root sys $BINDIR/ipptool test/ipptool
f 0555 root sys $BINDIR/lp systemv/lp
f 0555 root sys $BINDIR/lpoptions systemv/lpoptions
-f 0555 root sys $BINDIR/lppasswd systemv/lppasswd
f 0555 root sys $BINDIR/lpq berkeley/lpq
f 0555 root sys $BINDIR/lpr berkeley/lpr
f 0555 root sys $BINDIR/lprm berkeley/lprm
@@ -652,7 +651,6 @@ f 0444 root sys $MANDIR/man1/cupstestdsc.$MAN1EXT man/cupstestdsc.$MAN1EXT
f 0444 root sys $MANDIR/man1/cupstestppd.$MAN1EXT man/cupstestppd.$MAN1EXT
f 0444 root sys $MANDIR/man1/ipptool.$MAN1EXT man/ipptool.$MAN1EXT
f 0444 root sys $MANDIR/man1/lpoptions.$MAN1EXT man/lpoptions.$MAN1EXT
-f 0444 root sys $MANDIR/man1/lppasswd.$MAN1EXT man/lppasswd.$MAN1EXT
f 0444 root sys $MANDIR/man1/lpq.$MAN1EXT man/lpq.$MAN1EXT
f 0444 root sys $MANDIR/man1/lprm.$MAN1EXT man/lprm.$MAN1EXT
f 0444 root sys $MANDIR/man1/lpr.$MAN1EXT man/lpr.$MAN1EXT
@@ -736,5 +734,5 @@ f 0444 root sys $XINETD/cups-lpd scheduler/cups-lpd.xinetd
%subpackage
#
-# End of "$Id: cups.list.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.list.in 11776 2014-03-28 19:16:05Z msweet $".
#
diff --git a/packaging/cups.spec b/packaging/cups.spec
index 93a1e1d..2d5219b 100644
--- a/packaging/cups.spec
+++ b/packaging/cups.spec
@@ -1,25 +1,27 @@
#
-# "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $"
#
-# RPM "spec" file for CUPS.
+# RPM "spec" file for CUPS.
#
-# Original version by Jason McMullan <jmcc@ontv.com>.
+# Original version by Jason McMullan <jmcc@ontv.com>.
#
-# Copyright 2007-2013 by Apple Inc.
-# Copyright 1999-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1999-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
# Conditional build options (--with name/--without name):
#
# dbus - Enable/disable DBUS support (default = enable)
# dnssd - Enable/disable DNS-SD support (default = enable)
+# libusb1 - Enable/disable LIBUSB 1.0 support (default = enable)
# static - Enable/disable static libraries (default = enable)
+# systemd - Enable/disable systemd support (default = enable)
%{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}}
%{?_with_dbus: %define _dbus --enable-dbus}
@@ -29,22 +31,49 @@
%{?_with_dnssd: %define _dnssd --enable-dnssd}
%{!?_with_dnssd: %define _dnssd --disable-dnssd}
+%{!?_with_libusb1: %{!?_without_libusb1: %define _with_libusb1 --with-libusb1}}
+%{?_with_libusb1: %define _libusb1 --enable-libusb}
+%{!?_with_libusb1: %define _libusb1 --disable-libusb}
+
%{!?_with_static: %{!?_without_static: %define _without_static --without-static}}
%{?_with_static: %define _static --enable-static}
%{!?_with_static: %define _static --disable-static}
+%{!?_with_systemd: %{!?_without_systemd: %define _with_systemd --with-systemd}}
+%{?_with_systemd: %define _systemd --enable-systemd}
+%{!?_with_systemd: %define _systemd --disable-systemd}
+
Summary: CUPS
Name: cups
-Version: 1.6.4
+Version: 2.1.2
Release: 1
Epoch: 1
License: GPL
Group: System Environment/Daemons
-Source: http://www.cups.org/software/1.6.4/cups-1.6.4-source.tar.bz2
+Source: http://www.cups.org/software/2.1.2/cups-2.1.2-source.tar.bz2
Url: http://www.cups.org
Packager: Anonymous <anonymous@foo.com>
Vendor: Apple Inc.
+# Package names are as defined for Red Hat (and clone) distributions
+BuildRequires: gnutls-devel, pam-devel
+
+%if %{?_with_dbus:1}%{!?_with_dbus:0}
+BuildRequires: dbus-devel
+%endif
+
+%if %{?_with_dnssd:1}%{!?_with_dnssd:0}
+BuildRequires: avahi-devel
+%endif
+
+%if %{?_with_libusb1:1}%{!?_with_libusb1:0}
+BuildRequires: libusb-devel >= 1.0
+%endif
+
+%if %{?_with_systemd:1}%{!?_with_systemd:0}
+BuildRequires: systemd-devel
+%endif
+
# Use buildroot so as not to disturb the version already installed
BuildRoot: /tmp/%{name}-root
@@ -89,7 +118,7 @@ This package provides LPD client support.
%build
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \
- ./configure %{_dbus} %{_dnssd} %{_static}
+ ./configure %{_dbus} %{_dnssd} %{_libusb1} %{_static}
# If we got this far, all prerequisite libraries must be here.
make
@@ -98,6 +127,7 @@ make
rm -rf $RPM_BUILD_ROOT
make BUILDROOT=$RPM_BUILD_ROOT install
+rm -rf $RPM_BUILD_ROOT/usr/share/cups/banners $RPM_BUILD_ROOT/usr/share/cups/data
%post
/sbin/chkconfig --add cups
@@ -135,7 +165,9 @@ rm -rf $RPM_BUILD_ROOT
%defattr(-,root,root)
%dir /etc/cups
%config(noreplace) /etc/cups/*.conf
+/etc/cups/cups-files.conf.default
/etc/cups/cupsd.conf.default
+/etc/cups/snmp.conf.default
%dir /etc/cups/interfaces
%dir /etc/cups/ppd
%attr(0700,root,root) %dir /etc/cups/ssl
@@ -149,31 +181,23 @@ rm -rf $RPM_BUILD_ROOT
%dir /etc/pam.d
/etc/pam.d/*
-# RC dirs are a pain under Linux... Uncomment the appropriate ones if you
-# don't use Red Hat or Mandrake...
+%if %{?_with_systemd:1}%{!?_with_systemd:0}
+# SystemD
+/usr/lib/systemd/system/org.cups.cupsd.*
+%else
+# Legacy init support on Linux
/etc/init.d/*
/etc/rc0.d/*
/etc/rc2.d/*
/etc/rc3.d/*
/etc/rc5.d/*
-
-# OLD RedHat/Mandrake
-#/etc/rc.d/init.d/*
-#/etc/rc.d/rc0.d/*
-#/etc/rc.d/rc2.d/*
-#/etc/rc.d/rc3.d/*
-#/etc/rc.d/rc5.d/*
-
-#/sbin/rc.d/*
-#/sbin/rc.d/rc0.d/*
-#/sbin/rc.d/rc2.d/*
-#/sbin/rc.d/rc3.d/*
-#/sbin/rc.d/rc5.d/*
+%endif
/usr/bin/cancel
/usr/bin/cupstestdsc
/usr/bin/cupstestppd
+/usr/bin/ippfind
/usr/bin/ipptool
/usr/bin/lp*
%dir /usr/lib/cups
@@ -206,10 +230,6 @@ rm -rf $RPM_BUILD_ROOT
/usr/sbin/*
%dir /usr/share/cups
-%dir /usr/share/cups/banners
-/usr/share/cups/banners/*
-%dir /usr/share/cups/data
-/usr/share/cups/data/*
%dir /usr/share/cups/drv
/usr/share/cups/drv/*
%dir /usr/share/cups/ipptool
@@ -221,8 +241,11 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/cups/ppdc/*
%dir /usr/share/cups/templates
/usr/share/cups/templates/*
+%if %{?_with_libusb1:1}%{!?_with_libusb1:0}
+# LIBUSB quirks files
%dir /usr/share/cups/usb
/usr/share/cups/usb/*
+%endif
%dir /usr/share/doc/cups
/usr/share/doc/cups/*.*
@@ -240,20 +263,20 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/doc/cups/help/ref-*.html
/usr/share/doc/cups/help/security.html
/usr/share/doc/cups/help/sharing.html
-/usr/share/doc/cups/help/standard.html
/usr/share/doc/cups/help/translation.html
-/usr/share/doc/cups/help/whatsnew.html
%dir /usr/share/doc/cups/images
/usr/share/doc/cups/images/*
-%dir /usr/share/doc/cups/ca
-/usr/share/doc/cups/ca/*
-%dir /usr/share/doc/cups/cs
-/usr/share/doc/cups/cs/*
+#%dir /usr/share/doc/cups/ca
+#/usr/share/doc/cups/ca/*
+#%dir /usr/share/doc/cups/cs
+#/usr/share/doc/cups/cs/*
+%dir /usr/share/doc/cups/de
+/usr/share/doc/cups/de/*
%dir /usr/share/doc/cups/es
/usr/share/doc/cups/es/*
-%dir /usr/share/doc/cups/fr
-/usr/share/doc/cups/fr/*
+#%dir /usr/share/doc/cups/fr
+#/usr/share/doc/cups/fr/*
%dir /usr/share/doc/cups/ja
/usr/share/doc/cups/ja/*
%dir /usr/share/doc/cups/ru
@@ -263,10 +286,14 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/locale/ca/cups_ca.po
%dir /usr/share/locale/cs
/usr/share/locale/cs/cups_cs.po
+%dir /usr/share/locale/de
+/usr/share/locale/de/cups_de.po
%dir /usr/share/locale/es
/usr/share/locale/es/cups_es.po
%dir /usr/share/locale/fr
/usr/share/locale/fr/cups_fr.po
+%dir /usr/share/locale/it
+/usr/share/locale/it/cups_it.po
%dir /usr/share/locale/ja
/usr/share/locale/ja/cups_ja.po
%dir /usr/share/locale/ru
@@ -274,33 +301,37 @@ rm -rf $RPM_BUILD_ROOT
%dir /usr/share/man/man1
/usr/share/man/man1/cancel.1.gz
+/usr/share/man/man1/cups.1.gz
/usr/share/man/man1/cupstestdsc.1.gz
/usr/share/man/man1/cupstestppd.1.gz
+/usr/share/man/man1/ippfind.1.gz
/usr/share/man/man1/ipptool.1.gz
/usr/share/man/man1/lp.1.gz
/usr/share/man/man1/lpoptions.1.gz
-/usr/share/man/man1/lppasswd.1.gz
/usr/share/man/man1/lpq.1.gz
/usr/share/man/man1/lpr.1.gz
/usr/share/man/man1/lprm.1.gz
/usr/share/man/man1/lpstat.1.gz
%dir /usr/share/man/man5
/usr/share/man/man5/*.conf.5.gz
+/usr/share/man/man5/cupsd-logs.5.gz
/usr/share/man/man5/ipptoolfile.5.gz
/usr/share/man/man5/mime.*.5.gz
%dir /usr/share/man/man8
/usr/share/man/man8/accept.8.gz
+/usr/share/man/man8/cups-deviced.8.gz
+/usr/share/man/man8/cups-driverd.8.gz
+/usr/share/man/man8/cups-exec.8.gz
+/usr/share/man/man8/cups-snmp.8.gz
/usr/share/man/man8/cupsaddsmb.8.gz
/usr/share/man/man8/cupsaccept.8.gz
/usr/share/man/man8/cupsctl.8.gz
/usr/share/man/man8/cupsfilter.8.gz
/usr/share/man/man8/cupsd.8.gz
+/usr/share/man/man8/cupsd-helper.8.gz
/usr/share/man/man8/cupsdisable.8.gz
/usr/share/man/man8/cupsenable.8.gz
/usr/share/man/man8/cupsreject.8.gz
-/usr/share/man/man8/cups-deviced.8.gz
-/usr/share/man/man8/cups-driverd.8.gz
-/usr/share/man/man8/cups-snmp.8.gz
/usr/share/man/man8/lpadmin.8.gz
/usr/share/man/man8/lpc.8.gz
/usr/share/man/man8/lpinfo.8.gz
@@ -355,7 +386,14 @@ rm -rf $RPM_BUILD_ROOT
%files lpd
%defattr(-,root,root)
+%if %{?_with_systemd:1}%{!?_with_systemd:0}
+# SystemD
+/usr/lib/systemd/system/org.cups.cups-lpd*
+%else
+# Legacy xinetd
/etc/xinetd.d/cups-lpd
+%endif
+
%dir /usr/lib/cups
%dir /usr/lib/cups/daemon
/usr/lib/cups/daemon/cups-lpd
@@ -364,5 +402,5 @@ rm -rf $RPM_BUILD_ROOT
#
-# End of "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $".
#
diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in
index fd50b9d..63320a5 100644
--- a/packaging/cups.spec.in
+++ b/packaging/cups.spec.in
@@ -1,25 +1,27 @@
#
-# "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $"
#
-# RPM "spec" file for CUPS.
+# RPM "spec" file for CUPS.
#
-# Original version by Jason McMullan <jmcc@ontv.com>.
+# Original version by Jason McMullan <jmcc@ontv.com>.
#
-# Copyright 2007-2013 by Apple Inc.
-# Copyright 1999-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1999-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
# Conditional build options (--with name/--without name):
#
# dbus - Enable/disable DBUS support (default = enable)
# dnssd - Enable/disable DNS-SD support (default = enable)
+# libusb1 - Enable/disable LIBUSB 1.0 support (default = enable)
# static - Enable/disable static libraries (default = enable)
+# systemd - Enable/disable systemd support (default = enable)
%{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}}
%{?_with_dbus: %define _dbus --enable-dbus}
@@ -29,10 +31,18 @@
%{?_with_dnssd: %define _dnssd --enable-dnssd}
%{!?_with_dnssd: %define _dnssd --disable-dnssd}
+%{!?_with_libusb1: %{!?_without_libusb1: %define _with_libusb1 --with-libusb1}}
+%{?_with_libusb1: %define _libusb1 --enable-libusb}
+%{!?_with_libusb1: %define _libusb1 --disable-libusb}
+
%{!?_with_static: %{!?_without_static: %define _without_static --without-static}}
%{?_with_static: %define _static --enable-static}
%{!?_with_static: %define _static --disable-static}
+%{!?_with_systemd: %{!?_without_systemd: %define _with_systemd --with-systemd}}
+%{?_with_systemd: %define _systemd --enable-systemd}
+%{!?_with_systemd: %define _systemd --disable-systemd}
+
Summary: CUPS
Name: cups
Version: @CUPS_VERSION@
@@ -45,6 +55,25 @@ Url: http://www.cups.org
Packager: Anonymous <anonymous@foo.com>
Vendor: Apple Inc.
+# Package names are as defined for Red Hat (and clone) distributions
+BuildRequires: gnutls-devel, pam-devel
+
+%if %{?_with_dbus:1}%{!?_with_dbus:0}
+BuildRequires: dbus-devel
+%endif
+
+%if %{?_with_dnssd:1}%{!?_with_dnssd:0}
+BuildRequires: avahi-devel
+%endif
+
+%if %{?_with_libusb1:1}%{!?_with_libusb1:0}
+BuildRequires: libusb-devel >= 1.0
+%endif
+
+%if %{?_with_systemd:1}%{!?_with_systemd:0}
+BuildRequires: systemd-devel
+%endif
+
# Use buildroot so as not to disturb the version already installed
BuildRoot: /tmp/%{name}-root
@@ -89,7 +118,7 @@ This package provides LPD client support.
%build
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \
- ./configure %{_dbus} %{_dnssd} %{_static}
+ ./configure %{_dbus} %{_dnssd} %{_libusb1} %{_static}
# If we got this far, all prerequisite libraries must be here.
make
@@ -98,6 +127,7 @@ make
rm -rf $RPM_BUILD_ROOT
make BUILDROOT=$RPM_BUILD_ROOT install
+rm -rf $RPM_BUILD_ROOT/usr/share/cups/banners $RPM_BUILD_ROOT/usr/share/cups/data
%post
/sbin/chkconfig --add cups
@@ -135,7 +165,9 @@ rm -rf $RPM_BUILD_ROOT
%defattr(-,root,root)
%dir /etc/cups
%config(noreplace) /etc/cups/*.conf
+/etc/cups/cups-files.conf.default
/etc/cups/cupsd.conf.default
+/etc/cups/snmp.conf.default
%dir /etc/cups/interfaces
%dir /etc/cups/ppd
%attr(0700,root,root) %dir /etc/cups/ssl
@@ -149,31 +181,23 @@ rm -rf $RPM_BUILD_ROOT
%dir /etc/pam.d
/etc/pam.d/*
-# RC dirs are a pain under Linux... Uncomment the appropriate ones if you
-# don't use Red Hat or Mandrake...
+%if %{?_with_systemd:1}%{!?_with_systemd:0}
+# SystemD
+/usr/lib/systemd/system/org.cups.cupsd.*
+%else
+# Legacy init support on Linux
/etc/init.d/*
/etc/rc0.d/*
/etc/rc2.d/*
/etc/rc3.d/*
/etc/rc5.d/*
-
-# OLD RedHat/Mandrake
-#/etc/rc.d/init.d/*
-#/etc/rc.d/rc0.d/*
-#/etc/rc.d/rc2.d/*
-#/etc/rc.d/rc3.d/*
-#/etc/rc.d/rc5.d/*
-
-#/sbin/rc.d/*
-#/sbin/rc.d/rc0.d/*
-#/sbin/rc.d/rc2.d/*
-#/sbin/rc.d/rc3.d/*
-#/sbin/rc.d/rc5.d/*
+%endif
/usr/bin/cancel
/usr/bin/cupstestdsc
/usr/bin/cupstestppd
+/usr/bin/ippfind
/usr/bin/ipptool
/usr/bin/lp*
%dir /usr/lib/cups
@@ -206,10 +230,6 @@ rm -rf $RPM_BUILD_ROOT
/usr/sbin/*
%dir /usr/share/cups
-%dir /usr/share/cups/banners
-/usr/share/cups/banners/*
-%dir /usr/share/cups/data
-/usr/share/cups/data/*
%dir /usr/share/cups/drv
/usr/share/cups/drv/*
%dir /usr/share/cups/ipptool
@@ -221,8 +241,11 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/cups/ppdc/*
%dir /usr/share/cups/templates
/usr/share/cups/templates/*
+%if %{?_with_libusb1:1}%{!?_with_libusb1:0}
+# LIBUSB quirks files
%dir /usr/share/cups/usb
/usr/share/cups/usb/*
+%endif
%dir /usr/share/doc/cups
/usr/share/doc/cups/*.*
@@ -240,20 +263,20 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/doc/cups/help/ref-*.html
/usr/share/doc/cups/help/security.html
/usr/share/doc/cups/help/sharing.html
-/usr/share/doc/cups/help/standard.html
/usr/share/doc/cups/help/translation.html
-/usr/share/doc/cups/help/whatsnew.html
%dir /usr/share/doc/cups/images
/usr/share/doc/cups/images/*
-%dir /usr/share/doc/cups/ca
-/usr/share/doc/cups/ca/*
-%dir /usr/share/doc/cups/cs
-/usr/share/doc/cups/cs/*
+#%dir /usr/share/doc/cups/ca
+#/usr/share/doc/cups/ca/*
+#%dir /usr/share/doc/cups/cs
+#/usr/share/doc/cups/cs/*
+%dir /usr/share/doc/cups/de
+/usr/share/doc/cups/de/*
%dir /usr/share/doc/cups/es
/usr/share/doc/cups/es/*
-%dir /usr/share/doc/cups/fr
-/usr/share/doc/cups/fr/*
+#%dir /usr/share/doc/cups/fr
+#/usr/share/doc/cups/fr/*
%dir /usr/share/doc/cups/ja
/usr/share/doc/cups/ja/*
%dir /usr/share/doc/cups/ru
@@ -263,10 +286,14 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/locale/ca/cups_ca.po
%dir /usr/share/locale/cs
/usr/share/locale/cs/cups_cs.po
+%dir /usr/share/locale/de
+/usr/share/locale/de/cups_de.po
%dir /usr/share/locale/es
/usr/share/locale/es/cups_es.po
%dir /usr/share/locale/fr
/usr/share/locale/fr/cups_fr.po
+%dir /usr/share/locale/it
+/usr/share/locale/it/cups_it.po
%dir /usr/share/locale/ja
/usr/share/locale/ja/cups_ja.po
%dir /usr/share/locale/ru
@@ -274,33 +301,37 @@ rm -rf $RPM_BUILD_ROOT
%dir /usr/share/man/man1
/usr/share/man/man1/cancel.1.gz
+/usr/share/man/man1/cups.1.gz
/usr/share/man/man1/cupstestdsc.1.gz
/usr/share/man/man1/cupstestppd.1.gz
+/usr/share/man/man1/ippfind.1.gz
/usr/share/man/man1/ipptool.1.gz
/usr/share/man/man1/lp.1.gz
/usr/share/man/man1/lpoptions.1.gz
-/usr/share/man/man1/lppasswd.1.gz
/usr/share/man/man1/lpq.1.gz
/usr/share/man/man1/lpr.1.gz
/usr/share/man/man1/lprm.1.gz
/usr/share/man/man1/lpstat.1.gz
%dir /usr/share/man/man5
/usr/share/man/man5/*.conf.5.gz
+/usr/share/man/man5/cupsd-logs.5.gz
/usr/share/man/man5/ipptoolfile.5.gz
/usr/share/man/man5/mime.*.5.gz
%dir /usr/share/man/man8
/usr/share/man/man8/accept.8.gz
+/usr/share/man/man8/cups-deviced.8.gz
+/usr/share/man/man8/cups-driverd.8.gz
+/usr/share/man/man8/cups-exec.8.gz
+/usr/share/man/man8/cups-snmp.8.gz
/usr/share/man/man8/cupsaddsmb.8.gz
/usr/share/man/man8/cupsaccept.8.gz
/usr/share/man/man8/cupsctl.8.gz
/usr/share/man/man8/cupsfilter.8.gz
/usr/share/man/man8/cupsd.8.gz
+/usr/share/man/man8/cupsd-helper.8.gz
/usr/share/man/man8/cupsdisable.8.gz
/usr/share/man/man8/cupsenable.8.gz
/usr/share/man/man8/cupsreject.8.gz
-/usr/share/man/man8/cups-deviced.8.gz
-/usr/share/man/man8/cups-driverd.8.gz
-/usr/share/man/man8/cups-snmp.8.gz
/usr/share/man/man8/lpadmin.8.gz
/usr/share/man/man8/lpc.8.gz
/usr/share/man/man8/lpinfo.8.gz
@@ -355,7 +386,14 @@ rm -rf $RPM_BUILD_ROOT
%files lpd
%defattr(-,root,root)
+%if %{?_with_systemd:1}%{!?_with_systemd:0}
+# SystemD
+/usr/lib/systemd/system/org.cups.cups-lpd*
+%else
+# Legacy xinetd
/etc/xinetd.d/cups-lpd
+%endif
+
%dir /usr/lib/cups
%dir /usr/lib/cups/daemon
/usr/lib/cups/daemon/cups-lpd
@@ -364,5 +402,5 @@ rm -rf $RPM_BUILD_ROOT
#
-# End of "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $".
#
diff --git a/ppdc/Dependencies b/ppdc/Dependencies
index bcabc31..9feb967 100644
--- a/ppdc/Dependencies
+++ b/ppdc/Dependencies
@@ -1,184 +1,208 @@
ppdc-array.o: ppdc-array.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-attr.o: ppdc-attr.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-catalog.o: ppdc-catalog.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-choice.o: ppdc-choice.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-constraint.o: ppdc-constraint.cxx ppdc-private.h ppdc.h \
../cups/file.h ../cups/versioning.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/ppd-private.h \
- ../cups/ppd.h ../cups/thread-private.h
-ppdc-driver.o: ppdc-driver.cxx ppdc-private.h ppdc.h ../cups/file.h \
- ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ppdc-driver.o: ppdc-driver.cxx ppdc-private.h ppdc.h ../cups/file.h \
+ ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-file.o: ppdc-file.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-filter.o: ppdc-filter.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-font.o: ppdc-font.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-group.o: ppdc-group.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-import.o: ppdc-import.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-mediasize.o: ppdc-mediasize.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-message.o: ppdc-message.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-option.o: ppdc-option.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-profile.o: ppdc-profile.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-shared.o: ppdc-shared.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-source.o: ppdc-source.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/raster.h ../data/epson.h ../data/hp.h ../data/label.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h ../cups/raster.h ../data/epson.h ../data/hp.h \
+ ../data/label.h
ppdc-string.o: ppdc-string.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc-variable.o: ppdc-variable.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
genstrings.o: genstrings.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdc.o: ppdc.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdhtml.o: ppdhtml.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdi.o: ppdi.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
ppdmerge.o: ppdmerge.cxx ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
ppdpo.o: ppdpo.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
testcatalog.o: testcatalog.cxx ppdc-private.h ppdc.h ../cups/file.h \
../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../config.h ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+ ../cups/thread-private.h
diff --git a/ppdc/Makefile b/ppdc/Makefile
index c523144..7ac25ea 100644
--- a/ppdc/Makefile
+++ b/ppdc/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12615 2015-05-06 20:21:51Z msweet $"
#
-# Makefile for the CUPS PPD Compiler.
+# Makefile for the CUPS PPD Compiler.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 2002-2006 by Easy Software Products.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 2002-2006 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
#
@@ -104,7 +104,7 @@ clean:
$(RM) $(TARGETS) $(UNITTARGETS)
$(RM) -r ppd ppd2
$(RM) sample-import.drv sample.c test.drv
- $(RM) libcupsppdc.so libcupsppdc.sl libcupsppdc.dylib
+ $(RM) libcupsppdc.so libcupsppdc.dylib
#
@@ -145,6 +145,7 @@ install-exec:
$(INSTALL_DIR) $(SYMROOT); \
for file in $(EXECTARGETS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -167,7 +168,7 @@ install-libs: $(INSTALLSTATIC)
echo Installing libraries in $(LIBDIR)...
$(INSTALL_DIR) -m 755 $(LIBDIR)
$(INSTALL_LIB) $(LIBCUPSPPDC) $(LIBDIR)
- if test $(LIBCUPSPPDC) = "libcupsppdc.so.1" -o $(LIBCUPSPPDC) = "libcupsppdc.sl.1"; then \
+ if test $(LIBCUPSPPDC) = "libcupsppdc.so.1"; then \
$(RM) $(LIBDIR)/`basename $(LIBCUPSPPDC) .1`; \
$(LN) $(LIBCUPSPPDC) $(LIBDIR)/`basename $(LIBCUPSPPDC) .1`; \
fi
@@ -178,6 +179,7 @@ install-libs: $(INSTALLSTATIC)
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
cp $(LIBCUPSPPDC) $(SYMROOT); \
+ dsymutil $(SYMROOT)/$(LIBCUPSPPDC); \
fi
installstatic:
@@ -200,9 +202,6 @@ uninstall:
$(RM) $(LIBDIR)/libcupsppdc.1.dylib
$(RM) $(LIBDIR)/libcupsppdc.a
$(RM) $(LIBDIR)/libcupsppdc.dylib
- $(RM) $(LIBDIR)/libcupsppdc_s.a
- $(RM) $(LIBDIR)/libcupsppdc.sl
- $(RM) $(LIBDIR)/libcupsppdc.sl.1
$(RM) $(LIBDIR)/libcupsppdc.so
$(RM) $(LIBDIR)/libcupsppdc.so.1
-$(RMDIR) $(LIBDIR)
@@ -291,9 +290,9 @@ ppdi-static: ppdc-static ppdi.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC)
$(COMMONLIBS) $(LIBZ)
echo Testing PPD importer...
$(RM) -r ppd ppd2 sample-import.drv
- ./ppdc-static -I ../data sample.drv
+ ./ppdc-static -l en -I ../data sample.drv
./ppdi-static -I ../data -o sample-import.drv ppd/*
- ./ppdc-static -I ../data -d ppd2 sample-import.drv
+ ./ppdc-static -l en -I ../data -d ppd2 sample-import.drv
if diff -r ppd ppd2 >/dev/null; then \
echo PPD import OK; \
else \
@@ -332,10 +331,10 @@ testcatalog: testcatalog.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC)
#
-# libcupsppdc.so.1, libcupsppdc.sl.1
+# libcupsppdc.so.1
#
-libcupsppdc.so.1 libcupsppdc.sl.1: $(LIBOBJS) ../cups/$(LIBCUPS)
+libcupsppdc.so.1: $(LIBOBJS) ../cups/$(LIBCUPS)
echo Linking $@...
$(DSOXX) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LINKCUPS)
$(RM) `basename $@ .1`
@@ -355,23 +354,12 @@ libcupsppdc.1.dylib: $(LIBOBJS) ../cups/$(LIBCUPS)
-current_version 1.0.0 \
-compatibility_version 1.0.0 \
-exported_symbols_list t.exp \
- $(LIBOBJS) $(LINKCUPS)
+ $(LIBOBJS) $(LINKCUPS) $(COMMONLIBS)
$(RM) libcupsppdc.dylib t.exp
$(LN) $@ libcupsppdc.dylib
#
-# libcupsppdc_s.a
-#
-
-libcupsppdc_s.a: $(LIBOBJS) ../cups/$(LIBCUPS)
- echo Creating $@...
- $(DSOXX) $(DSOFLAGS) -o libcupsppdc_s.o $(LIBOBJS) $(LINKCUPS)
- $(RM) $@
- $(AR) $(ARFLAGS) $@ libcupsppdc_s.o
-
-
-#
# libcupsppdc.la
#
@@ -400,5 +388,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12615 2015-05-06 20:21:51Z msweet $".
#
diff --git a/ppdc/genstrings.cxx b/ppdc/genstrings.cxx
index f3496c7..72e9a85 100644
--- a/ppdc/genstrings.cxx
+++ b/ppdc/genstrings.cxx
@@ -1,31 +1,24 @@
//
-// "$Id: genstrings.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: genstrings.cxx 11800 2014-04-08 19:53:57Z msweet $"
//
-// GNU gettext message generator for the CUPS PPD Compiler.
+// GNU gettext message generator for the CUPS PPD Compiler.
//
-// This program is used to generate a dummy source file containing all of
-// the standard media and sample driver strings. The results are picked up
-// by GNU gettext and placed in the CUPS message catalog.
+// This program is used to generate a dummy source file containing all of
+// the standard media and sample driver strings. The results are picked up
+// by GNU gettext and placed in the CUPS message catalog.
//
-// Copyright 2008-2011 by Apple Inc.
+// Copyright 2008-2014 by Apple Inc.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
// Usage:
//
// ./genstrings >sample.c
//
-// Contents:
-//
-// main() - Main entry for the PPD compiler.
-// add_ui_strings() - Add all UI strings from the driver.
-// write_cstring() - Write a translation string as a valid C string to
-// stdout.
-//
//
// Include necessary headers...
@@ -211,5 +204,5 @@ write_cstring(const char *s) /* I - String to write */
//
-// End of "$Id: genstrings.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: genstrings.cxx 11800 2014-04-08 19:53:57Z msweet $".
//
diff --git a/ppdc/ppdc-array.cxx b/ppdc/ppdc-array.cxx
index 603ceb6..5b5bacc 100644
--- a/ppdc/ppdc-array.cxx
+++ b/ppdc/ppdc-array.cxx
@@ -1,25 +1,16 @@
//
-// "$Id: ppdc-array.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-array.cxx 11558 2014-02-06 18:33:34Z msweet $"
//
-// Array class for the CUPS PPD Compiler.
+// Array class for the CUPS PPD Compiler.
//
-// Copyright 2007-2009 by Apple Inc.
-// Copyright 2002-2005 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2005 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// ppdcArray::ppdcArray() - Create a new array.
-// ppdcArray::~ppdcArray() - Destroy an array.
-// ppdcArray::add() - Add an element to an array.
-// ppdcArray::first() - Return the first element in the array.
-// ppdcArray::next() - Return the next element in the array.
-// ppdcArray::remove() - Remove an element from the array.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -48,7 +39,7 @@ ppdcArray::ppdcArray(ppdcArray *a)
// Make a copy of the array...
data = new ppdcShared *[count];
- memcpy(data, a->data, count * sizeof(ppdcShared *));
+ memcpy(data, a->data, (size_t)count * sizeof(ppdcShared *));
for (int i = 0; i < count; i ++)
data[i]->retain();
@@ -98,7 +89,7 @@ ppdcArray::add(ppdcShared *d)
alloc += 10;
temp = new ppdcShared *[alloc];
- memcpy(temp, data, count * sizeof(ppdcShared *));
+ memcpy(temp, data, (size_t)count * sizeof(ppdcShared *));
delete[] data;
data = temp;
@@ -159,10 +150,10 @@ ppdcArray::remove(ppdcShared *d) // I - Data element
d->release();
if (i < count)
- memmove(data + i, data + i + 1, (count - i) * sizeof(ppdcShared *));
+ memmove(data + i, data + i + 1, (size_t)(count - i) * sizeof(ppdcShared *));
}
//
-// End of "$Id: ppdc-array.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-array.cxx 11558 2014-02-06 18:33:34Z msweet $".
//
diff --git a/ppdc/ppdc-attr.cxx b/ppdc/ppdc-attr.cxx
index 01286e7..4570f10 100644
--- a/ppdc/ppdc-attr.cxx
+++ b/ppdc/ppdc-attr.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-attr.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-attr.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Attribute class for the CUPS PPD Compiler.
//
@@ -62,5 +62,5 @@ ppdcAttr::~ppdcAttr()
//
-// End of "$Id: ppdc-attr.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-attr.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-catalog.cxx b/ppdc/ppdc-catalog.cxx
index ab23717..35cadd6 100644
--- a/ppdc/ppdc-catalog.cxx
+++ b/ppdc/ppdc-catalog.cxx
@@ -1,29 +1,16 @@
//
-// "$Id: ppdc-catalog.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-catalog.cxx 11800 2014-04-08 19:53:57Z msweet $"
//
-// Shared message catalog class for the CUPS PPD Compiler.
+// Shared message catalog class for the CUPS PPD Compiler.
//
-// Copyright 2007-2012 by Apple Inc.
-// Copyright 2002-2006 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2006 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// ppdcCatalog::ppdcCatalog() - Create a shared message catalog.
-// ppdcCatalog::~ppdcCatalog() - Destroy a shared message catalog.
-// ppdcCatalog::add_message() - Add a new message.
-// ppdcCatalog::find_message() - Find a message in a catalog...
-// ppdcCatalog::load_messages() - Load messages from a .po file.
-// ppdcCatalog::save_messages() - Save the messages to a .po file.
-// get_utf8() - Get a UTF-8 character.
-// get_utf16() - Get a UTF-16 character...
-// put_utf8() - Add a UTF-8 character to a string.
-// put_utf16() - Write a UTF-16 character to a file.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -50,6 +37,9 @@ typedef enum
// Local functions...
//
+#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR)
+static void apple_add_message(CFStringRef key, CFStringRef val, ppdcCatalog *c);
+#endif /* __APPLE__ && CUPS_BUNDLEDIR */
static int get_utf8(char *&ptr);
static int get_utf16(cups_file_t *fp, ppdc_cs_t &cs);
static int put_utf8(int ch, char *&ptr, char *end);
@@ -64,10 +54,6 @@ ppdcCatalog::ppdcCatalog(const char *l, // I - Locale
const char *f) // I - Message catalog file
: ppdcShared()
{
- _cups_globals_t *cg = _cupsGlobals();
- // Global information
-
-
PPDC_NEW;
locale = new ppdcString(l);
@@ -80,6 +66,67 @@ ppdcCatalog::ppdcCatalog(const char *l, // I - Locale
char pofile[1024]; // Message catalog file
+#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR)
+ char applelang[256]; // Apple language ID
+ CFURLRef url; // URL to cups.strings file
+ CFReadStreamRef stream = NULL; // File stream
+ CFPropertyListRef plist = NULL; // Localization file
+
+ snprintf(pofile, sizeof(pofile), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", _cupsAppleLanguage(l, applelang, sizeof(applelang)));
+ if (access(pofile, 0))
+ {
+ // Try alternate lproj directory names...
+ const char *tl = l; // Temporary locale string
+
+ if (!strncmp(l, "en", 2))
+ tl = "English";
+ else if (!strncmp(l, "nb", 2) || !strncmp(l, "nl", 2))
+ tl = "Dutch";
+ else if (!strncmp(l, "fr", 2))
+ tl = "French";
+ else if (!strncmp(l, "de", 2))
+ tl = "German";
+ else if (!strncmp(l, "it", 2))
+ tl = "Italian";
+ else if (!strncmp(l, "ja", 2))
+ tl = "Japanese";
+ else if (!strncmp(l, "es", 2))
+ tl = "Spanish";
+
+ snprintf(pofile, sizeof(pofile), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", tl);
+ }
+
+ url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)pofile, (CFIndex)strlen(pofile), false);
+ if (url)
+ {
+ stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url);
+
+ if (stream)
+ {
+ /*
+ * Read the property list containing the localization data.
+ */
+
+ CFReadStreamOpen(stream);
+
+ plist = CFPropertyListCreateWithStream(kCFAllocatorDefault, stream, 0, kCFPropertyListImmutable, NULL, NULL);
+
+ if (plist && CFGetTypeID(plist) == CFDictionaryGetTypeID())
+ CFDictionaryApplyFunction((CFDictionaryRef)plist, (CFDictionaryApplierFunction)apple_add_message, this);
+
+ if (plist)
+ CFRelease(plist);
+
+ CFRelease(stream);
+ }
+
+ CFRelease(url);
+ }
+
+#else
+ _cups_globals_t *cg = _cupsGlobals();
+ // Global information
+
snprintf(pofile, sizeof(pofile), "%s/%s/cups_%s.po", cg->localedir, l, l);
if (load_messages(pofile) && strchr(l, '_'))
@@ -94,9 +141,10 @@ ppdcCatalog::ppdcCatalog(const char *l, // I - Locale
load_messages(pofile);
}
+#endif /* __APPLE__ && CUPS_BUNDLEDIR */
}
- if (f)
+ if (f && *f)
load_messages(f);
}
@@ -206,8 +254,8 @@ ppdcCatalog::load_messages(
else if (!strcmp(ptr, ".strings"))
{
/*
- * Read messages in OS X ".strings" format, which are UTF-16 text files of
- * the format:
+ * Read messages in OS X ".strings" format, which are either UTF-8/UTF-16
+ * text files of the format:
*
* "id" = "str";
*
@@ -610,6 +658,27 @@ ppdcCatalog::save_messages(
}
+#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR)
+//
+// 'apple_add_message()' - Add a message from a localization dictionary.
+//
+
+static void
+apple_add_message(CFStringRef key, // I - Localization key
+ CFStringRef val, // I - Localized value
+ ppdcCatalog *c) // I - Message catalog
+{
+ char id[1024], // Message id
+ str[1024]; // Localized message
+
+
+ if (CFStringGetCString(key, id, sizeof(id), kCFStringEncodingUTF8) &&
+ CFStringGetCString(val, str, sizeof(str), kCFStringEncodingUTF8))
+ c->add_message(id, str);
+}
+#endif /* __APPLE__ && CUPS_BUNDLEDIR */
+
+
//
// 'get_utf8()' - Get a UTF-8 character.
//
@@ -817,7 +886,7 @@ put_utf8(int ch, // I - Unicode character
if (ptr >= end)
return (-1);
- *ptr++ = ch;
+ *ptr++ = (char)ch;
}
else if (ch < 0x800)
{
@@ -825,8 +894,8 @@ put_utf8(int ch, // I - Unicode character
if ((ptr + 1) >= end)
return (-1);
- *ptr++ = 0xc0 | (ch >> 6);
- *ptr++ = 0x80 | (ch & 0x3f);
+ *ptr++ = (char)(0xc0 | (ch >> 6));
+ *ptr++ = (char)(0x80 | (ch & 0x3f));
}
else if (ch < 0x10000)
{
@@ -834,9 +903,9 @@ put_utf8(int ch, // I - Unicode character
if ((ptr + 2) >= end)
return (-1);
- *ptr++ = 0xe0 | (ch >> 12);
- *ptr++ = 0x80 | ((ch >> 6) & 0x3f);
- *ptr++ = 0x80 | (ch & 0x3f);
+ *ptr++ = (char)(0xe0 | (ch >> 12));
+ *ptr++ = (char)(0x80 | ((ch >> 6) & 0x3f));
+ *ptr++ = (char)(0x80 | (ch & 0x3f));
}
else
{
@@ -844,10 +913,10 @@ put_utf8(int ch, // I - Unicode character
if ((ptr + 3) >= end)
return (-1);
- *ptr++ = 0xf0 | (ch >> 18);
- *ptr++ = 0x80 | ((ch >> 12) & 0x3f);
- *ptr++ = 0x80 | ((ch >> 6) & 0x3f);
- *ptr++ = 0x80 | (ch & 0x3f);
+ *ptr++ = (char)(0xf0 | (ch >> 18));
+ *ptr++ = (char)(0x80 | ((ch >> 12) & 0x3f));
+ *ptr++ = (char)(0x80 | ((ch >> 6) & 0x3f));
+ *ptr++ = (char)(0x80 | (ch & 0x3f));
}
return (0);
@@ -868,8 +937,8 @@ put_utf16(cups_file_t *fp, // I - File to write to
if (ch < 0x10000)
{
// One-word UTF-16 big-endian...
- buffer[0] = ch >> 8;
- buffer[1] = ch;
+ buffer[0] = (unsigned char)(ch >> 8);
+ buffer[1] = (unsigned char)ch;
if (cupsFileWrite(fp, (char *)buffer, 2) == 2)
return (0);
@@ -879,10 +948,10 @@ put_utf16(cups_file_t *fp, // I - File to write to
// Two-word UTF-16 big-endian...
ch -= 0x10000;
- buffer[0] = 0xd8 | (ch >> 18);
- buffer[1] = ch >> 10;
- buffer[2] = 0xdc | ((ch >> 8) & 0x03);
- buffer[3] = ch;
+ buffer[0] = (unsigned char)(0xd8 | (ch >> 18));
+ buffer[1] = (unsigned char)(ch >> 10);
+ buffer[2] = (unsigned char)(0xdc | ((ch >> 8) & 0x03));
+ buffer[3] = (unsigned char)ch;
if (cupsFileWrite(fp, (char *)buffer, 4) == 4)
return (0);
@@ -893,5 +962,5 @@ put_utf16(cups_file_t *fp, // I - File to write to
//
-// End of "$Id: ppdc-catalog.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-catalog.cxx 11800 2014-04-08 19:53:57Z msweet $".
//
diff --git a/ppdc/ppdc-choice.cxx b/ppdc/ppdc-choice.cxx
index 90872cb..e9937fe 100644
--- a/ppdc/ppdc-choice.cxx
+++ b/ppdc/ppdc-choice.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-choice.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-choice.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Option choice class for the CUPS PPD Compiler.
//
@@ -57,5 +57,5 @@ ppdcChoice::~ppdcChoice()
//
-// End of "$Id: ppdc-choice.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-choice.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-constraint.cxx b/ppdc/ppdc-constraint.cxx
index 948c329..c060979 100644
--- a/ppdc/ppdc-constraint.cxx
+++ b/ppdc/ppdc-constraint.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-constraint.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-constraint.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Contraint class for the CUPS PPD Compiler.
//
@@ -60,5 +60,5 @@ ppdcConstraint::~ppdcConstraint()
//
-// End of "$Id: ppdc-constraint.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-constraint.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-driver.cxx b/ppdc/ppdc-driver.cxx
index 61b2d24..105eb9c 100644
--- a/ppdc/ppdc-driver.cxx
+++ b/ppdc/ppdc-driver.cxx
@@ -1,34 +1,16 @@
//
-// "$Id: ppdc-driver.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-driver.cxx 11558 2014-02-06 18:33:34Z msweet $"
//
-// PPD file compiler definitions for the CUPS PPD Compiler.
+// PPD file compiler definitions for the CUPS PPD Compiler.
//
-// Copyright 2007-2011 by Apple Inc.
-// Copyright 2002-2006 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2006 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// ppdcDriver::ppdcDriver() - Create a new printer driver.
-// ppdcDriver::~ppdcDriver() - Destroy a printer driver.
-// ppdcDriver::find_attr() - Find an attribute.
-// ppdcDriver::find_group() - Find a group.
-// ppdcDriver::find_option() - Find an option.
-// ppdcDriver::find_option_group() - Find an option and its group.
-// ppdcDriver::set_custom_size_code() - Set the custom page size code.
-// ppdcDriver::set_default_font() - Set the default font name.
-// ppdcDriver::set_default_size() - Set the default size name.
-// ppdcDriver::set_file_name() - Set the full filename.
-// ppdcDriver::set_manufacturer() - Set the manufacturer name.
-// ppdcDriver::set_model_name() - Set the model name.
-// ppdcDriver::set_pc_file_name() - Set the PC filename.
-// ppdcDriver::set_version() - Set the version string.
-// ppdcDriver::write_ppd_file() - Write a PPD file...
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -1333,7 +1315,7 @@ ppdcDriver::write_ppd_file(
fn->status == PPDC_FONT_ROM ? "ROM" : "Disk", lf);
cupsFilePrintf(fp, "*%% End of %s, %05d bytes.%s", pc_file_name->value,
- (int)(cupsFileTell(fp) + 25 + strlen(pc_file_name->value)),
+ (int)((size_t)cupsFileTell(fp) + 25 + strlen(pc_file_name->value)),
lf);
if (delete_cat)
@@ -1344,5 +1326,5 @@ ppdcDriver::write_ppd_file(
//
-// End of "$Id: ppdc-driver.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-driver.cxx 11558 2014-02-06 18:33:34Z msweet $".
//
diff --git a/ppdc/ppdc-file.cxx b/ppdc/ppdc-file.cxx
index 3c243f3..0a24827 100644
--- a/ppdc/ppdc-file.cxx
+++ b/ppdc/ppdc-file.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-file.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-file.cxx 3755 2012-03-30 05:59:14Z msweet $"
//
// File class for the CUPS PPD Compiler.
//
@@ -106,5 +106,5 @@ ppdcFile::peek()
//
-// End of "$Id: ppdc-file.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-file.cxx 3755 2012-03-30 05:59:14Z msweet $".
//
diff --git a/ppdc/ppdc-filter.cxx b/ppdc/ppdc-filter.cxx
index 0b0bf4b..cc1ae00 100644
--- a/ppdc/ppdc-filter.cxx
+++ b/ppdc/ppdc-filter.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-filter.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-filter.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Filter class for the CUPS PPD Compiler.
//
@@ -56,5 +56,5 @@ ppdcFilter::~ppdcFilter()
//
-// End of "$Id: ppdc-filter.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-filter.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-font.cxx b/ppdc/ppdc-font.cxx
index d7b5f26..c5dad4d 100644
--- a/ppdc/ppdc-font.cxx
+++ b/ppdc/ppdc-font.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-font.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-font.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Shared font class for the CUPS PPD Compiler.
//
@@ -62,5 +62,5 @@ ppdcFont::~ppdcFont()
//
-// End of "$Id: ppdc-font.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-font.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-group.cxx b/ppdc/ppdc-group.cxx
index 56c847b..00d0a7c 100644
--- a/ppdc/ppdc-group.cxx
+++ b/ppdc/ppdc-group.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-group.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-group.cxx 3275 2011-05-20 07:26:13Z msweet $"
//
// Group class for the CUPS PPD Compiler.
//
@@ -99,5 +99,5 @@ ppdcGroup::find_option(const char *n) // I - Name of option
//
-// End of "$Id: ppdc-group.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-group.cxx 3275 2011-05-20 07:26:13Z msweet $".
//
diff --git a/ppdc/ppdc-import.cxx b/ppdc/ppdc-import.cxx
index 1c2a1c8..d41cbb9 100644
--- a/ppdc/ppdc-import.cxx
+++ b/ppdc/ppdc-import.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-import.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-import.cxx 3275 2011-05-20 07:26:13Z msweet $"
//
// PPD file import methods for the CUPS PPD Compiler.
//
@@ -339,5 +339,5 @@ ppdcSource::import_ppd(const char *f) // I - Filename
//
-// End of "$Id: ppdc-import.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-import.cxx 3275 2011-05-20 07:26:13Z msweet $".
//
diff --git a/ppdc/ppdc-mediasize.cxx b/ppdc/ppdc-mediasize.cxx
index 43bcf79..48afd38 100644
--- a/ppdc/ppdc-mediasize.cxx
+++ b/ppdc/ppdc-mediasize.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-mediasize.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-mediasize.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Shared media size class for the CUPS PPD Compiler.
//
@@ -81,5 +81,5 @@ ppdcMediaSize::~ppdcMediaSize()
//
-// End of "$Id: ppdc-mediasize.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-mediasize.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-message.cxx b/ppdc/ppdc-message.cxx
index 614c237..fbbe40c 100644
--- a/ppdc/ppdc-message.cxx
+++ b/ppdc/ppdc-message.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-message.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-message.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Shared message class for the CUPS PPD Compiler.
//
@@ -54,5 +54,5 @@ ppdcMessage::~ppdcMessage()
//
-// End of "$Id: ppdc-message.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-message.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-option.cxx b/ppdc/ppdc-option.cxx
index 6bbe1db..3fdc296 100644
--- a/ppdc/ppdc-option.cxx
+++ b/ppdc/ppdc-option.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-option.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-option.cxx 3275 2011-05-20 07:26:13Z msweet $"
//
// Option class for the CUPS PPD Compiler.
//
@@ -125,5 +125,5 @@ ppdcOption::set_defchoice(ppdcChoice *c) // I - Choice
//
-// End of "$Id: ppdc-option.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-option.cxx 3275 2011-05-20 07:26:13Z msweet $".
//
diff --git a/ppdc/ppdc-profile.cxx b/ppdc/ppdc-profile.cxx
index 0a63666..244e34f 100644
--- a/ppdc/ppdc-profile.cxx
+++ b/ppdc/ppdc-profile.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-profile.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-profile.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Color profile class for the CUPS PPD Compiler.
//
@@ -61,5 +61,5 @@ ppdcProfile::~ppdcProfile()
//
-// End of "$Id: ppdc-profile.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-profile.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc-shared.cxx b/ppdc/ppdc-shared.cxx
index bd2983b..e6b6167 100644
--- a/ppdc/ppdc-shared.cxx
+++ b/ppdc/ppdc-shared.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-shared.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-shared.cxx 1556 2009-06-10 19:02:58Z msweet $"
//
// Shared data class for the CUPS PPD Compiler.
//
@@ -84,5 +84,5 @@ ppdcShared::retain()
//
-// End of "$Id: ppdc-shared.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-shared.cxx 1556 2009-06-10 19:02:58Z msweet $".
//
diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx
index 46c1bdd..85ef17e 100644
--- a/ppdc/ppdc-source.cxx
+++ b/ppdc/ppdc-source.cxx
@@ -1,59 +1,16 @@
//
-// "$Id: ppdc-source.cxx 11173 2013-07-23 12:31:34Z msweet $"
-//
-// Source class for the CUPS PPD Compiler.
-//
-// Copyright 2007-2012 by Apple Inc.
-// Copyright 2002-2007 by Easy Software Products.
-//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// ppdcSource::ppdcSource() - Load a driver source file.
-// ppdcSource::~ppdcSource() - Free a driver source file.
-// ppdcSource::add_include() - Add an include directory.
-// ppdcSource::find_driver() - Find a driver.
-// ppdcSource::find_include() - Find an include file.
-// ppdcSource::find_po() - Find a message catalog for the given
-// locale.
-// ppdcSource::find_size() - Find a media size.
-// ppdcSource::find_variable() - Find a variable.
-// ppdcSource::get_attr() - Get an attribute.
-// ppdcSource::get_boolean() - Get a boolean value.
-// ppdcSource::get_choice() - Get a choice.
-// ppdcSource::get_color_model() - Get an old-style color model option.
-// ppdcSource::get_color_order() - Get an old-style color order value.
-// ppdcSource::get_color_profile() - Get a color profile definition.
-// ppdcSource::get_color_space() - Get an old-style colorspace value.
-// ppdcSource::get_constraint() - Get a constraint.
-// ppdcSource::get_custom_size() - Get a custom media size definition from
-// a file.
-// ppdcSource::get_duplex() - Get a duplex option.
-// ppdcSource::get_filter() - Get a filter.
-// ppdcSource::get_float() - Get a single floating-point number.
-// ppdcSource::get_font() - Get a font definition.
-// ppdcSource::get_generic() - Get a generic old-style option.
-// ppdcSource::get_group() - Get an option group.
-// ppdcSource::get_installable() - Get an installable option.
-// ppdcSource::get_integer() - Get an integer value from a file.
-// ppdcSource::get_measurement() - Get a measurement value.
-// ppdcSource::get_option() - Get an option definition.
-// ppdcSource::get_po() - Get a message catalog.
-// ppdcSource::get_resolution() - Get an old-style resolution option.
-// ppdcSource::get_simple_profile() - Get a simple color profile definition.
-// ppdcSource::get_size() - Get a media size definition from a file.
-// ppdcSource::get_token() - Get a token from a file.
-// ppdcSource::get_variable() - Get a variable definition.
-// ppdcSource::quotef() - Write a formatted, quoted string...
-// ppdcSource::read_file() - Read a driver source file.
-// ppdcSource::scan_file() - Scan a driver source file.
-// ppdcSource::set_variable() - Set a variable.
-// ppdcSource::write_file() - Write the current source data to a file.
+// "$Id: ppdc-source.cxx 11558 2014-02-06 18:33:34Z msweet $"
+//
+// Source class for the CUPS PPD Compiler.
+//
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2007 by Easy Software Products.
+//
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -235,9 +192,9 @@ ppdcSource::find_include(
{
// Check for the local file relative to the current directory...
if (base && *base && f[0] != '/')
- snprintf(n, nlen, "%s/%s", base, f);
+ snprintf(n, (size_t)nlen, "%s/%s", base, f);
else
- strlcpy(n, f, nlen);
+ strlcpy(n, f, (size_t)nlen);
if (!access(n, 0))
return (n);
@@ -253,7 +210,7 @@ ppdcSource::find_include(
{
for (dir = (ppdcString *)includes->first(); dir; dir = (ppdcString *)includes->next())
{
- snprintf(n, nlen, "%s/%s", dir->value, f);
+ snprintf(n, (size_t)nlen, "%s/%s", dir->value, f);
if (!access(n, 0))
return (n);
}
@@ -262,11 +219,11 @@ ppdcSource::find_include(
// Search the standard include directories...
_cups_globals_t *cg = _cupsGlobals(); // Global data
- snprintf(n, nlen, "%s/ppdc/%s", cg->cups_datadir, f);
+ snprintf(n, (size_t)nlen, "%s/ppdc/%s", cg->cups_datadir, f);
if (!access(n, 0))
return (n);
- snprintf(n, nlen, "%s/po/%s", cg->cups_datadir, f);
+ snprintf(n, (size_t)nlen, "%s/po/%s", cg->cups_datadir, f);
if (!access(n, 0))
return (n);
else
@@ -943,7 +900,7 @@ ppdcSource::get_filter(ppdcFile *fp) // I - File to read
while (isspace(*ptr))
ptr ++;
- strcpy(program, ptr);
+ strlcpy(program, ptr, sizeof(program));
}
else
{
@@ -1706,7 +1663,7 @@ ppdcSource::get_po(ppdcFile *fp) // I - File to read
if ((baseptr = strrchr(basedir, '/')) != NULL)
*baseptr = '\0';
else
- strcpy(basedir, ".");
+ strlcpy(basedir, ".", sizeof(basedir));
// Find the po file...
pofilename[0] = '\0';
@@ -1810,26 +1767,26 @@ ppdcSource::get_resolution(ppdcFile *fp)// I - File to read
if (color_order >= 0)
{
- snprintf(commptr, sizeof(command) - (commptr - command),
+ snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
"/cupsColorOrder %d", color_order);
commptr += strlen(commptr);
}
if (color_space >= 0)
{
- snprintf(commptr, sizeof(command) - (commptr - command),
+ snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
"/cupsColorSpace %d", color_space);
commptr += strlen(commptr);
}
if (compression >= 0)
{
- snprintf(commptr, sizeof(command) - (commptr - command),
+ snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
"/cupsCompression %d", compression);
commptr += strlen(commptr);
}
- snprintf(commptr, sizeof(command) - (commptr - command), ">>setpagedevice");
+ snprintf(commptr, sizeof(command) - (size_t)(commptr - command), ">>setpagedevice");
// Return the new choice...
return (new ppdcChoice(name, text, command));
@@ -2014,7 +1971,7 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
if (!isalnum(ch) && ch != '_')
break;
else if (nameptr < (name + sizeof(name) - 1))
- *nameptr++ = fp->get();
+ *nameptr++ = (char)fp->get();
}
if (nameptr == name)
@@ -2024,7 +1981,7 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
{
// $$ = $
if (bufptr < bufend)
- *bufptr++ = fp->get();
+ *bufptr++ = (char)fp->get();
}
else
{
@@ -2044,7 +2001,7 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
var = find_variable(name);
if (var)
{
- strlcpy(bufptr, var->value->value, bufend - bufptr + 1);
+ strlcpy(bufptr, var->value->value, (size_t)(bufend - bufptr + 1));
bufptr += strlen(bufptr);
}
else
@@ -2054,7 +2011,7 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
_("ppdc: Undefined variable (%s) on line %d of "
"%s."), name, fp->line, fp->filename);
- snprintf(bufptr, bufend - bufptr + 1, "$%s", name);
+ snprintf(bufptr, (size_t)(bufend - bufptr + 1), "$%s", name);
bufptr += strlen(bufptr);
}
}
@@ -2096,7 +2053,7 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
empty = 0;
if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
}
else if (ch == '\'' || ch == '\"')
@@ -2112,7 +2069,7 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
{
// Insert the opposing quote char...
if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
else
{
@@ -2128,14 +2085,14 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
startline = fp->line;
if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
else if ((ch == ')' && quote == '(') || (ch == '>' && quote == '<'))
{
quote = 0;
if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
else if (ch == '\\')
{
@@ -2145,13 +2102,13 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
break;
if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
else if (bufptr < bufend)
{
empty = 0;
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
if ((ch == '{' || ch == '}') && !quote)
break;
@@ -2171,7 +2128,6 @@ ppdcSource::get_token(ppdcFile *fp, // I - File to read
else
{
*bufptr = '\0';
-// puts(buffer);
return (buffer);
}
}
@@ -2292,7 +2248,7 @@ ppdcSource::quotef(cups_file_t *fp, // I - File to write to
if ((format - bufformat + 1) > (int)sizeof(tformat))
break;
- strncpy(tformat, bufformat, format - bufformat);
+ memcpy(tformat, bufformat, (size_t)(format - bufformat));
tformat[format - bufformat] = '\0';
bytes += cupsFilePrintf(fp, tformat, va_arg(ap, double));
@@ -2309,7 +2265,7 @@ ppdcSource::quotef(cups_file_t *fp, // I - File to write to
if ((format - bufformat + 1) > (int)sizeof(tformat))
break;
- strncpy(tformat, bufformat, format - bufformat);
+ memcpy(tformat, bufformat, (size_t)(format - bufformat));
tformat[format - bufformat] = '\0';
# ifdef HAVE_LONG_LONG
@@ -2327,7 +2283,7 @@ ppdcSource::quotef(cups_file_t *fp, // I - File to write to
if ((format - bufformat + 1) > (int)sizeof(tformat))
break;
- strncpy(tformat, bufformat, format - bufformat);
+ memcpy(tformat, bufformat, (size_t)(format - bufformat));
tformat[format - bufformat] = '\0';
bytes += cupsFilePrintf(fp, tformat, va_arg(ap, void *));
@@ -2341,7 +2297,7 @@ ppdcSource::quotef(cups_file_t *fp, // I - File to write to
}
else
{
- cupsFileWrite(fp, va_arg(ap, char *), width);
+ cupsFileWrite(fp, va_arg(ap, char *), (size_t)width);
bytes += width;
}
break;
@@ -2350,7 +2306,7 @@ ppdcSource::quotef(cups_file_t *fp, // I - File to write to
if ((s = va_arg(ap, char *)) == NULL)
s = (char *)"(nil)";
- slen = strlen(s);
+ slen = (int)strlen(s);
if (slen > width && prec != width)
width = slen;
@@ -2630,7 +2586,7 @@ ppdcSource::scan_file(ppdcFile *fp, // I - File to read
if ((baseptr = strrchr(basedir, '/')) != NULL)
*baseptr = '\0';
else
- strcpy(basedir, ".");
+ strlcpy(basedir, ".", sizeof(basedir));
// Find the include file...
if (find_include(inctemp, basedir, incname, sizeof(incname)))
@@ -3847,5 +3803,5 @@ ppdcSource::write_file(const char *f) // I - File to write
//
-// End of "$Id: ppdc-source.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-source.cxx 11558 2014-02-06 18:33:34Z msweet $".
//
diff --git a/ppdc/ppdc-string.cxx b/ppdc/ppdc-string.cxx
index f9dfb9e..b6e3512 100644
--- a/ppdc/ppdc-string.cxx
+++ b/ppdc/ppdc-string.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: ppdc-string.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-string.cxx 3933 2012-10-01 03:01:10Z msweet $"
//
// Shared string class for the CUPS PPD Compiler.
//
-// Copyright 2007-2009 by Apple Inc.
+// Copyright 2007-2012 by Apple Inc.
// Copyright 2002-2005 by Easy Software Products.
//
// These coded instructions, statements, and computer programs are the
@@ -36,8 +36,10 @@ ppdcString::ppdcString(const char *v) // I - String
if (v)
{
- value = new char[strlen(v) + 1];
- strcpy(value, v);
+ size_t vlen = strlen(v);
+
+ value = new char[vlen + 1];
+ memcpy(value, v, vlen + 1);
}
else
value = 0;
@@ -58,5 +60,5 @@ ppdcString::~ppdcString()
//
-// End of "$Id: ppdc-string.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-string.cxx 3933 2012-10-01 03:01:10Z msweet $".
//
diff --git a/ppdc/ppdc-variable.cxx b/ppdc/ppdc-variable.cxx
index 22b926c..d60ef72 100644
--- a/ppdc/ppdc-variable.cxx
+++ b/ppdc/ppdc-variable.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdc-variable.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-variable.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Variable class for the CUPS PPD Compiler.
//
@@ -67,5 +67,5 @@ ppdcVariable::set_value(const char *v)
//
-// End of "$Id: ppdc-variable.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-variable.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/ppdc/ppdc.cxx b/ppdc/ppdc.cxx
index 55990c4..d8a7c60 100644
--- a/ppdc/ppdc.cxx
+++ b/ppdc/ppdc.cxx
@@ -1,21 +1,16 @@
//
-// "$Id: ppdc.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc.cxx 11800 2014-04-08 19:53:57Z msweet $"
//
-// PPD file compiler main entry for the CUPS PPD Compiler.
+// PPD file compiler main entry for the CUPS PPD Compiler.
//
-// Copyright 2007-2012 by Apple Inc.
-// Copyright 2002-2007 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2007 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// main() - Main entry for the PPD compiler.
-// usage() - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -192,7 +187,7 @@ main(int argc, // I - Number of command-line arguments
catalog = new ppdcCatalog(argv[i]);
- if (catalog->messages->count == 0)
+ if (catalog->messages->count == 0 && strcmp(argv[i], "en"))
{
_cupsLangPrintf(stderr,
_("ppdc: Unable to find localization for "
@@ -344,7 +339,7 @@ main(int argc, // I - Number of command-line arguments
for (j = 0;
outname[j] && j < (int)(sizeof(pcfilename) - 1);
j ++)
- pcfilename[j] = tolower(outname[j] & 255);
+ pcfilename[j] = (char)tolower(outname[j] & 255);
pcfilename[j] = '\0';
}
@@ -464,5 +459,5 @@ usage(void)
//
-// End of "$Id: ppdc.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc.cxx 11800 2014-04-08 19:53:57Z msweet $".
//
diff --git a/ppdc/ppdhtml.cxx b/ppdc/ppdhtml.cxx
index 89d7393..234495c 100644
--- a/ppdc/ppdhtml.cxx
+++ b/ppdc/ppdhtml.cxx
@@ -1,21 +1,16 @@
//
-// "$Id: ppdhtml.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdhtml.cxx 12633 2015-05-15 19:16:58Z msweet $"
//
-// PPD to HTML utility for the CUPS PPD Compiler.
+// PPD to HTML utility for the CUPS PPD Compiler.
//
-// Copyright 2007-2011 by Apple Inc.
-// Copyright 2002-2005 by Easy Software Products.
+// Copyright 2007-2015 by Apple Inc.
+// Copyright 2002-2005 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// main() - Main entry for the PPD to HTML utility.
-// usage() - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -58,7 +53,7 @@ main(int argc, // I - Number of command-line arguments
_cupsSetLocale(argv);
// Scan the command-line...
- src = 0;
+ src = new ppdcSource();
for (i = 1; i < argc; i ++)
if (argv[i][0] == '-')
@@ -97,65 +92,75 @@ main(int argc, // I - Number of command-line arguments
else
{
// Open and load the driver info file...
- src = new ppdcSource(argv[i]);
-
- // Create a composite group with all of the features from the
- // drivers in the info file...
- composite = new ppdcGroup("", "");
-
- for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
- for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
- for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
- {
- if ((compo = composite->find_option(o->name->value)) == NULL)
- composite->add_option(new ppdcOption(o));
- }
-
- puts("<html>");
- printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
- printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
- printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
- for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
- printf("<th>%s</th>", compo->text->value);
- puts("</tr></thead><tbody>");
-
- // Write HTML summary...
- for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
- {
- // Write the summary for this driver...
- printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
- for (size = (ppdcMediaSize *)d->sizes->first(); size;
- size = (ppdcMediaSize *)d->sizes->next())
- printf("%s<br>", size->text->value);
- printf("</td>");
-
- for (compo = (ppdcOption *)composite->options->first(); compo;
- compo = (ppdcOption *)composite->options->next())
- if ((o = d->find_option(compo->name->value)) != NULL)
- {
- printf("<td nowrap>");
- for (c = (ppdcChoice *)o->choices->first(); c;
- c = (ppdcChoice *)o->choices->next())
- printf("%s<br>", c->text->value);
- printf("</td>");
- }
- else
- printf("<td>N/A</td>");
-
- puts("</tr>");
- }
-
- puts("</tbody></table></p>");
- puts("</body>");
- puts("</html>");
- // Delete the printer driver information...
- composite->release();
- src->release();
+ src->read_file(argv[i]);
+ }
+
+ if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
+ {
+ // Create a composite group with all of the features from the
+ // drivers in the info file...
+ composite = new ppdcGroup("", "");
+
+ while (d != NULL)
+ {
+ for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
+ for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
+ {
+ if ((compo = composite->find_option(o->name->value)) == NULL)
+ composite->add_option(new ppdcOption(o));
+ }
+
+ d = (ppdcDriver *)src->drivers->next();
}
- // If no drivers have been loaded, display the program usage message.
- if (!src)
+ puts("<html>");
+ printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
+ printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
+ printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
+ for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
+ printf("<th>%s</th>", compo->text->value);
+ puts("</tr></thead><tbody>");
+
+ // Write HTML summary...
+ for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
+ {
+ // Write the summary for this driver...
+ printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
+ for (size = (ppdcMediaSize *)d->sizes->first(); size;
+ size = (ppdcMediaSize *)d->sizes->next())
+ printf("%s<br>", size->text->value);
+ printf("</td>");
+
+ for (compo = (ppdcOption *)composite->options->first(); compo;
+ compo = (ppdcOption *)composite->options->next())
+ if ((o = d->find_option(compo->name->value)) != NULL)
+ {
+ printf("<td nowrap>");
+ for (c = (ppdcChoice *)o->choices->first(); c;
+ c = (ppdcChoice *)o->choices->next())
+ printf("%s<br>", c->text->value);
+ printf("</td>");
+ }
+ else
+ printf("<td>N/A</td>");
+
+ puts("</tr>");
+ }
+
+ puts("</tbody></table></p>");
+ puts("</body>");
+ puts("</html>");
+
+ // Delete the printer driver information...
+ composite->release();
+ }
+ else
+ {
+ // If no drivers have been loaded, display the program usage message.
usage();
+ }
+
+ src->release();
// Return with no errors.
return (0);
@@ -182,5 +187,5 @@ usage(void)
//
-// End of "$Id: ppdhtml.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdhtml.cxx 12633 2015-05-15 19:16:58Z msweet $".
//
diff --git a/ppdc/ppdi.cxx b/ppdc/ppdi.cxx
index 2ebe410..cbc728b 100644
--- a/ppdc/ppdi.cxx
+++ b/ppdc/ppdi.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: ppdi.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdi.cxx 3071 2011-03-23 00:05:29Z msweet $"
//
// PPD file import utility for the CUPS PPD Compiler.
//
@@ -138,5 +138,5 @@ usage(void)
//
-// End of "$Id: ppdi.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdi.cxx 3071 2011-03-23 00:05:29Z msweet $".
//
diff --git a/ppdc/ppdmerge.cxx b/ppdc/ppdmerge.cxx
index 2564905..cc38881 100644
--- a/ppdc/ppdmerge.cxx
+++ b/ppdc/ppdmerge.cxx
@@ -1,22 +1,16 @@
//
-// "$Id: ppdmerge.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdmerge.cxx 11558 2014-02-06 18:33:34Z msweet $"
//
-// PPD file merge utility for the CUPS PPD Compiler.
+// PPD file merge utility for the CUPS PPD Compiler.
//
-// Copyright 2007-2011 by Apple Inc.
-// Copyright 2002-2007 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2007 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// main() - Main entry for the PPD merge utility.
-// ppd_locale() - Return the locale associated with a PPD file.
-// usage() - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -302,8 +296,8 @@ main(int argc, // I - Number of command-line arguments
static const char * // O - Locale string
ppd_locale(ppd_file_t *ppd) // I - PPD file
{
- int i, // Looping var
- vlen; // Length of LanguageVersion string
+ int i; // Looping var
+ size_t vlen; // Length of LanguageVersion string
static char locale[255]; // Locale string
static struct // LanguageVersion translation table
{
@@ -375,5 +369,5 @@ usage(void)
//
-// End of "$Id: ppdmerge.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdmerge.cxx 11558 2014-02-06 18:33:34Z msweet $".
//
diff --git a/ppdc/ppdpo.cxx b/ppdc/ppdpo.cxx
index 14e96d0..ab53bf4 100644
--- a/ppdc/ppdpo.cxx
+++ b/ppdc/ppdpo.cxx
@@ -1,22 +1,16 @@
//
-// "$Id: ppdpo.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdpo.cxx 12633 2015-05-15 19:16:58Z msweet $"
//
-// PPD file message catalog program for the CUPS PPD Compiler.
+// PPD file message catalog program for the CUPS PPD Compiler.
//
-// Copyright 2007-2012 by Apple Inc.
-// Copyright 2002-2005 by Easy Software Products.
+// Copyright 2007-2015 by Apple Inc.
+// Copyright 2002-2005 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-// main() - Main entry for the PPD compiler.
-// add_ui_strings() - Add all UI strings from the driver.
-// usage() - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
//
@@ -58,7 +52,7 @@ main(int argc, // I - Number of command-line arguments
// Scan the command-line...
catalog = new ppdcCatalog("en");
- src = 0;
+ src = new ppdcSource();
verbose = 0;
outfile = 0;
@@ -123,23 +117,28 @@ main(int argc, // I - Number of command-line arguments
_("ppdc: Loading driver information file \"%s\"."),
argv[i]);
- src = new ppdcSource(argv[i]);
+ src->read_file(argv[i]);
+ }
- // Add UI strings...
- for (d = (ppdcDriver *)src->drivers->first();
- d;
- d = (ppdcDriver *)src->drivers->next())
- {
- if (verbose)
- _cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."),
- argv[i]);
+ // If no drivers have been loaded, display the program usage message.
+ if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
+ {
+ // Add UI strings...
+ while (d != NULL)
+ {
+ if (verbose)
+ _cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."), argv[i]);
- add_ui_strings(d, catalog);
- }
+ add_ui_strings(d, catalog);
- // Delete the printer driver information...
- src->release();
+ d = (ppdcDriver *)src->drivers->next();
}
+ }
+ else
+ usage();
+
+ // Delete the printer driver information...
+ src->release();
// Write the message catalog...
if (!outfile)
@@ -149,10 +148,6 @@ main(int argc, // I - Number of command-line arguments
catalog->release();
- // If no drivers have been loaded, display the program usage message.
- if (!src)
- usage();
-
// Return with no errors.
return (0);
}
@@ -263,5 +258,5 @@ usage(void)
//
-// End of "$Id: ppdpo.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdpo.cxx 12633 2015-05-15 19:16:58Z msweet $".
//
diff --git a/ppdc/sample.drv b/ppdc/sample.drv
index ec808d2..854e334 100644
--- a/ppdc/sample.drv
+++ b/ppdc/sample.drv
@@ -1,16 +1,16 @@
//
-// "$Id: sample.drv 3794 2012-04-23 22:44:16Z msweet $"
+// "$Id: sample.drv 12789 2015-07-20 14:51:28Z msweet $"
//
-// Driver info file for CUPS-supplied PPDs.
+// Driver info file for CUPS-supplied PPDs.
//
-// Copyright 2007-2011 by Apple Inc.
-// Copyright 1993-2006 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 1993-2006 by Easy Software Products.
//
-// These coded instructions, statements, and computer programs are the
-// property of Apple Inc. and are protected by Federal copyright
-// law. Distribution and use rights are outlined in the file "LICENSE.txt"
-// which should have been included with this file. If this file is
-// file is missing or damaged, see the license at "http://www.cups.org/".
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law. Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
//
// Include necessary files...
@@ -22,26 +22,37 @@
// Localizations are provided for all of the base languages supported by
// CUPS...
-//#po da ""
-//#po de ""
-//#po es ""
-//#po et ""
-//#po fi ""
-//#po fr ""
-//#po he ""
-//#po id ""
-//#po it ""
-//#po ja ""
-//#po ko ""
-//#po nl ""
-//#po no ""
-//#po pl ""
-//#po pt ""
-//#po pt_BR ""
-//#po ru ""
-//#po sv ""
-//#po zh ""
-//#po zh_TW ""
+#po ar ""
+#po ca ""
+#po cs ""
+#po da ""
+#po de ""
+#po el ""
+#po es ""
+#po fi ""
+#po fr ""
+#po he ""
+#po hr ""
+#po hu ""
+#po id ""
+#po it ""
+#po ja ""
+#po ko ""
+#po ms ""
+#po no ""
+#po pl ""
+#po pt ""
+#po pt_PT ""
+#po ro ""
+#po ru ""
+#po sk ""
+#po sv ""
+#po th ""
+#po tr ""
+#po uk ""
+#po vi ""
+#po zh_CN ""
+#po zh_TW ""
// MediaSize sizes used by label drivers...
#media "w90h18/1.25x0.25\"" 90 18
@@ -103,12 +114,12 @@
#media "w576h468/8.00x6.50\"" 576 468
// Common stuff for all drivers...
-Attribute "cupsVersion" "" "1.6"
+Attribute "cupsVersion" "" "2.1"
Attribute "FileSystem" "" "False"
Attribute "LandscapeOrientation" "" "Plus90"
Attribute "TTRasterizer" "" "Type42"
-Copyright "Copyright 2007-2012 by Apple Inc."
+Copyright "Copyright 2007-2014 by Apple Inc."
Copyright "Copyright 1997-2007 by Easy Software Products."
Copyright ""
Copyright "These coded instructions, statements, and computer programs are the"
@@ -119,7 +130,7 @@ Copyright "file is missing or damaged, see the license at \"http://www.cups.org/
Font *
-Version "1.5"
+Version "2.1"
// Dymo Label Printer
{
@@ -206,90 +217,6 @@ Version "1.5"
*Resolution k 1 8 0 0 120x72dpi
Resolution k 1 8 0 0 240x72dpi
}
-
- // Epson Stylus Color Series
- {
- ModelName "Stylus Color Series"
- Attribute NickName "" "Epson Stylus Color Series"
- PCFileName "stcolor.ppd"
- ModelNumber $EPSON_COLOR
- ColorDevice Yes
-
- HWMargins 8.6 39.6 8.6 25.51
- *MediaSize Letter
- MediaSize Legal
- MediaSize A4
-
- Resolution - 1 0 0 0 180dpi
- *Resolution - 1 0 0 0 360dpi
- Resolution - 1 0 0 0 720dpi
-
- *ColorModel CMYK cmyk banded 1
- ColorModel Gray/Grayscale k chunky 1
- }
-
- // Epson New Stylus Color Series
- {
- ModelName "New Stylus Color Series"
- Attribute NickName "" "Epson New Stylus Color Series"
- PCFileName "stcolor2.ppd"
- ModelNumber $EPSON_ICOLOR
- ColorDevice Yes
-
- HWMargins 8.6 39.6 8.6 25.51
- *MediaSize Letter
- MediaSize Legal
- MediaSize A4
-
- Resolution - 1 0 0 0 180dpi
- *Resolution - 1 0 0 0 360dpi
- Resolution - 1 0 0 0 720dpi
-
- *ColorModel CMYK cmyk banded 1
- ColorModel Gray/Grayscale k chunky 1
- }
-
- // Epson Stylus Color Series
- {
- ModelName "Stylus Photo Series"
- Attribute NickName "" "Epson Stylus Photo Series"
- PCFileName "stphoto.ppd"
- ModelNumber $EPSON_PHOTO
- ColorDevice Yes
-
- HWMargins 8.6 39.6 8.6 25.51
- *MediaSize Letter
- MediaSize Legal
- MediaSize A4
-
- Resolution - 1 0 0 0 180dpi
- *Resolution - 1 0 0 0 360dpi
- Resolution - 1 0 0 0 720dpi
-
- *ColorModel CMYK cmykcm banded 1
- ColorModel Gray/Grayscale k chunky 1
- }
-
- // Epson New Stylus Color Series
- {
- ModelName "New Stylus Photo Series"
- Attribute NickName "" "Epson New Stylus Photo Series"
- PCFileName "stphoto2.ppd"
- ModelNumber $EPSON_IPHOTO
- ColorDevice Yes
-
- HWMargins 8.6 39.6 8.6 25.51
- *MediaSize Letter
- MediaSize Legal
- MediaSize A4
-
- Resolution - 1 0 0 0 180dpi
- *Resolution - 1 0 0 0 360dpi
- Resolution - 1 0 0 0 720dpi
-
- *ColorModel CMYK cmykcm banded 1
- ColorModel Gray/Grayscale k chunky 1
- }
}
// Generic drivers
@@ -1241,5 +1168,5 @@ Version "1.5"
}
//
-// End of "$Id: sample.drv 3794 2012-04-23 22:44:16Z msweet $".
+// End of "$Id: sample.drv 12789 2015-07-20 14:51:28Z msweet $".
//
diff --git a/ppdc/testcatalog.cxx b/ppdc/testcatalog.cxx
index 1e8ecaa..0943dcc 100644
--- a/ppdc/testcatalog.cxx
+++ b/ppdc/testcatalog.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: testcatalog.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: testcatalog.cxx 1378 2009-04-08 03:17:45Z msweet $"
//
// Test program for message catalog class.
//
@@ -59,5 +59,5 @@ main(int argc, // I - Number of command-line arguments
//
-// End of "$Id: testcatalog.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: testcatalog.cxx 1378 2009-04-08 03:17:45Z msweet $".
//
diff --git a/scheduler/Dependencies b/scheduler/Dependencies
index 2035646..e61c288 100644
--- a/scheduler/Dependencies
+++ b/scheduler/Dependencies
@@ -1,264 +1,270 @@
auth.o: auth.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
-avahi.o: avahi.c ../config.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
banners.o: banners.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h ../cups/dir.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h ../cups/dir.h
cert.o: cert.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
classes.o: classes.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
client.o: client.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
+colorman.o: colorman.c cupsd.h ../cups/cups-private.h \
+ ../cups/string-private.h ../config.h ../cups/debug-private.h \
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
conf.o: conf.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
dirsvc.o: dirsvc.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
env.o: env.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
file.o: file.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h ../cups/dir.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h ../cups/dir.h
main.o: main.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
ipp.o: ipp.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
listen.o: listen.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
job.o: job.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h ../cups/backend.h ../cups/dir.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h ../cups/backend.h \
+ ../cups/dir.h
log.o: log.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
-network.o: network.c ../cups/http-private.h ../config.h ../cups/http.h \
- ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
- ../cups/ipp-private.h ../cups/ipp.h cupsd.h ../cups/cups-private.h \
- ../cups/string-private.h ../cups/debug-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+ banners.h dirsvc.h network.h subscriptions.h
+network.o: network.c ../cups/http-private.h ../config.h \
+ ../cups/language.h ../cups/array.h ../cups/versioning.h ../cups/http.h \
+ ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h cupsd.h \
+ ../cups/cups-private.h ../cups/string-private.h \
+ ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
policy.o: policy.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
printers.o: printers.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h ../cups/dir.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h ../cups/dir.h
process.o: process.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
quotas.o: quotas.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
select.o: select.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
-server.o: server.c ../cups/http-private.h ../config.h ../cups/http.h \
- ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
- ../cups/ipp-private.h ../cups/ipp.h cupsd.h ../cups/cups-private.h \
- ../cups/string-private.h ../cups/debug-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
+server.o: server.c ../cups/http-private.h ../config.h ../cups/language.h \
+ ../cups/array.h ../cups/versioning.h ../cups/http.h \
+ ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h cupsd.h \
+ ../cups/cups-private.h ../cups/string-private.h \
+ ../cups/debug-private.h ../cups/array-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
statbuf.o: statbuf.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
subscriptions.o: subscriptions.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
sysman.o: sysman.c cupsd.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
-timeout.o: timeout.c cupsd.h ../cups/cups-private.h \
- ../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h
-tls.o: tls.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
- client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
- network.h subscriptions.h tls-darwin.c
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+ sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+ classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+ subscriptions.h
filter.o: filter.c ../cups/string-private.h ../config.h \
../cups/debug-private.h ../cups/versioning.h mime.h ../cups/array.h \
../cups/ipp.h ../cups/http.h ../cups/file.h
@@ -271,59 +277,60 @@ type.o: type.c ../cups/string-private.h ../config.h \
../cups/ipp.h ../cups/http.h ../cups/file.h
cupsfilter.o: cupsfilter.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/file-private.h mime.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h
cups-deviced.o: cups-deviced.c util.h ../cups/array-private.h \
../cups/array.h ../cups/versioning.h ../cups/file-private.h \
../cups/cups-private.h ../cups/string-private.h ../config.h \
../cups/debug-private.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/dir.h
-cups-exec.o: cups-exec.c ../cups/string-private.h ../config.h
+cups-exec.o: cups-exec.c ../cups/string-private.h ../config.h \
+ ../cups/file.h ../cups/versioning.h
cups-lpd.o: cups-lpd.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
testlpd.o: testlpd.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
- ../cups/string-private.h ../config.h
+ ../cups/pwg.h ../cups/string-private.h ../config.h
testmime.o: testmime.c ../cups/string-private.h ../config.h ../cups/dir.h \
../cups/versioning.h ../cups/debug-private.h ../cups/ppd-private.h \
../cups/cups.h ../cups/file.h ../cups/ipp.h ../cups/http.h \
- ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/pwg-private.h \
- mime.h
+ ../cups/array.h ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+ ../cups/pwg-private.h mime.h
testspeed.o: testspeed.c ../cups/string-private.h ../config.h \
../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/language.h \
+ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
../cups/debug-private.h
testsub.o: testsub.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
- ../cups/debug-private.h ../cups/string-private.h ../config.h \
- ../cups/ipp-private.h
+ ../cups/pwg.h ../cups/debug-private.h ../cups/string-private.h \
+ ../config.h ../cups/ipp-private.h
util.o: util.c util.h ../cups/array-private.h ../cups/array.h \
../cups/versioning.h ../cups/file-private.h ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
cups-driverd.o: cups-driverd.cxx util.h ../cups/array-private.h \
../cups/array.h ../cups/versioning.h ../cups/file-private.h \
../cups/cups-private.h ../cups/string-private.h ../config.h \
../cups/debug-private.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/dir.h ../ppdc/ppdc.h
diff --git a/scheduler/Makefile b/scheduler/Makefile
index 2790569..c7d244d 100644
--- a/scheduler/Makefile
+++ b/scheduler/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $"
#
-# Scheduler Makefile for CUPS.
+# Scheduler Makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
@@ -40,8 +40,7 @@ CUPSDOBJS = \
server.o \
statbuf.o \
subscriptions.o \
- sysman.o \
- tls.o
+ sysman.o
LIBOBJS = \
filter.o \
mime.o \
@@ -114,7 +113,7 @@ unittests: $(UNITTARGETS)
clean:
$(RM) $(OBJS)
$(RM) $(TARGETS) $(UNITTARGETS) convert
- $(RM) libcupsmime.so libcupsmime.sl libcupsmime.dylib
+ $(RM) libcupsmime.so libcupsmime.dylib
#
@@ -172,7 +171,7 @@ install-data:
echo Creating $(REQUESTS)/tmp...
$(INSTALL_DIR) -m 1770 -g $(CUPS_GROUP) $(REQUESTS)/tmp
echo Creating $(CACHEDIR)...
- $(INSTALL_DIR) -m 775 -g $(CUPS_GROUP) $(CACHEDIR)
+ $(INSTALL_DIR) -m 770 -g $(CUPS_GROUP) $(CACHEDIR)
if test "x$(INITDIR)" != x; then \
echo Installing init scripts...; \
$(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/init.d; \
@@ -180,32 +179,36 @@ install-data:
for level in $(RCLEVELS); do \
$(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc$${level}.d; \
$(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc$${level}.d/S$(RCSTART)cups; \
- if test `uname` = HP-UX; then \
- level=`expr $$level - 1`; \
- $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc$${level}.d; \
- fi; \
$(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc$${level}.d/K$(RCSTOP)cups; \
done; \
$(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc0.d; \
$(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc0.d/K$(RCSTOP)cups; \
fi
- if test "x$(INITDIR)" = x -a "x$(INITDDIR)" != x; then \
- $(INSTALL_DIR) $(BUILDROOT)$(INITDDIR); \
- if test "$(INITDDIR)" = "/System/Library/LaunchDaemons"; then \
- echo Installing LaunchDaemons configuration files...; \
- $(INSTALL_DATA) org.cups.cupsd.plist $(BUILDROOT)$(DEFAULT_LAUNCHD_CONF); \
- $(INSTALL_DATA) org.cups.cups-lpd.plist $(BUILDROOT)/System/Library/LaunchDaemons; \
- else \
- echo Installing RC script...; \
- $(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/cups; \
- fi \
+ if test "x$(INITDDIR)" != x; then \
+ echo Installing init script...; \
+ $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDDIR); \
+ $(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR); \
+ fi
+ if test "x$(LAUNCHD_DIR)" != x; then \
+ echo Installing launchd configuration files...; \
+ $(INSTALL_DIR) $(BUILDROOT)$(LAUNCHD_DIR); \
+ $(INSTALL_DATA) org.cups.cupsd.plist $(BUILDROOT)$(LAUNCHD_DIR); \
+ $(INSTALL_DATA) org.cups.cups-lpd.plist $(BUILDROOT)$(LAUNCHD_DIR); \
fi
if test "x$(SMFMANIFESTDIR)" != x; then \
echo Installing SMF manifest in $(SMFMANIFESTDIR)...;\
$(INSTALL_DIR) $(BUILDROOT)/$(SMFMANIFESTDIR); \
$(INSTALL_SCRIPT) cups.xml $(BUILDROOT)$(SMFMANIFESTDIR)/cups.xml; \
fi
- if test "x$(XINETD)" != x; then \
+ if test "x$(SYSTEMD_DIR)" != x; then \
+ echo Installing systemd configuration files...; \
+ $(INSTALL_DIR) $(BUILDROOT)$(SYSTEMD_DIR); \
+ $(INSTALL_DATA) org.cups.cupsd.path $(BUILDROOT)$(SYSTEMD_DIR); \
+ $(INSTALL_DATA) org.cups.cupsd.service $(BUILDROOT)$(SYSTEMD_DIR); \
+ $(INSTALL_DATA) org.cups.cupsd.socket $(BUILDROOT)$(SYSTEMD_DIR); \
+ $(INSTALL_DATA) org.cups.cups-lpdAT.service $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cups-lpd@.service; \
+ $(INSTALL_DATA) org.cups.cups-lpd.socket $(BUILDROOT)$(SYSTEMD_DIR); \
+ elif test "x$(XINETD)" != x; then \
echo Installing xinetd configuration file for cups-lpd...; \
$(INSTALL_DIR) -m 755 $(BUILDROOT)$(XINETD); \
$(INSTALL_DATA) cups-lpd.xinetd $(BUILDROOT)$(XINETD)/cups-lpd; \
@@ -232,6 +235,7 @@ install-exec:
$(INSTALL_DIR) $(SYMROOT); \
for file in $(PROGRAMS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -254,7 +258,7 @@ install-libs: $(INSTALLSTATIC)
echo Installing libraries in $(LIBDIR)...
$(INSTALL_DIR) -m 755 $(LIBDIR)
$(INSTALL_LIB) $(LIBCUPSMIME) $(LIBDIR)
- if test $(LIBCUPSMIME) = "libcupsmime.so.1" -o $(LIBCUPSMIME) = "libcupsmime.sl.1"; then \
+ if test $(LIBCUPSMIME) = "libcupsmime.so.1"; then \
$(RM) $(LIBDIR)/`basename $(LIBCUPSMIME) .1`; \
$(LN) $(LIBCUPSMIME) $(LIBDIR)/`basename $(LIBCUPSMIME) .1`; \
fi
@@ -265,6 +269,7 @@ install-libs: $(INSTALLSTATIC)
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
cp $(LIBCUPSMIME) $(SYMROOT); \
+ dsymutil $(SYMROOT)/$(LIBCUPSMIME); \
fi
installstatic:
@@ -285,7 +290,6 @@ uninstall:
$(RM) $(SERVERBIN)/daemon/cups-driverd
$(RM) $(SERVERBIN)/daemon/cups-exec
$(RM) $(SERVERBIN)/daemon/cups-lpd
- $(RM) $(BUILDROOT)/System/Library/Printers/Libraries/convert
-$(RMDIR) $(STATEDIR)/certs
-$(RMDIR) $(STATEDIR)
-$(RMDIR) $(SERVERROOT)/ppd
@@ -302,16 +306,13 @@ uninstall:
$(RM) $(LIBDIR)/libcupsmime.1.dylib
$(RM) $(LIBDIR)/libcupsmime.a
$(RM) $(LIBDIR)/libcupsmime.dylib
- $(RM) $(LIBDIR)/libcupsmime_s.a
- $(RM) $(LIBDIR)/libcupsmime.sl
- $(RM) $(LIBDIR)/libcupsmime.sl.1
$(RM) $(LIBDIR)/libcupsmime.so
$(RM) $(LIBDIR)/libcupsmime.so.1
-$(RMDIR) $(LIBDIR)
$(RM) $(INCLUDEDIR)/cups/mime.h
-$(RMDIR) $(INCLUDEDIR)/cups
- echo Uninstalling startup script...
if test "x$(INITDIR)" != x; then \
+ echo Uninstalling init scripts...; \
$(RM) $(BUILDROOT)$(INITDIR)/init.d/cups; \
$(RMDIR) $(BUILDROOT)$(INITDIR)/init.d; \
$(RM) $(BUILDROOT)$(INITDIR)/rc0.d/K00cups; \
@@ -323,23 +324,24 @@ uninstall:
$(RM) $(BUILDROOT)$(INITDIR)/rc5.d/S99cups; \
$(RMDIR) $(BUILDROOT)$(INITDIR)/rc5.d; \
fi
- if test "x$(INITDIR)" = x -a "x$(INITDDIR)" != x; then \
- if test "$(INITDDIR)" = "/System/Library/StartupItems/PrintingServices"; then \
- $(RM) $(BUILDROOT)$(INITDDIR)/PrintingServices; \
- $(RM) $(BUILDROOT)$(INITDDIR)/StartupParameters.plist; \
- $(RM) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj/Localizable.strings; \
- $(RMDIR) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj; \
- elif test "$(INITDDIR)" = "/System/Library/LaunchDaemons"; then \
- $(RM) $(BUILDROOT)$(INITDDIR)/org.cups.cupsd.plist; \
- $(RM) $(BUILDROOT)$(INITDDIR)/org.cups.cups-lpd.plist; \
- $(RMDIR) $(BUILDROOT)/System/Library/StartupItems/PrintingServices; \
- else \
- $(INSTALL_SCRIPT) init/cups.sh $(BUILDROOT)$(INITDDIR)/cups; \
- fi \
+ if test "x$(INITDDIR)" != x; then \
+ echo Uninstalling startup script...; \
+ $(RM) $(BUILDROOT)$(INITDDIR)/cups.sh; \
$(RMDIR) $(BUILDROOT)$(INITDDIR); \
fi
+ if test "x$LAUNCHD_DIR" != x; then \
+ echo Uninstalling launchd files...; \
+ $(RM) $(BUILDROOT)$(LAUNCHD_DIR)/org.cups.cupsd.plist; \
+ $(RM) $(BUILDROOT)$(LAUNCHD_DIR)/org.cups.cups-lpd.plist; \
+ fi
+ if test "x$SYSTEMD_DIR" != x; then \
+ echo Uninstalling systemd files...; \
+ $(RM) $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cupsd.path; \
+ $(RM) $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cupsd.service; \
+ $(RM) $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cupsd.socket; \
+ fi
if test "x$(SMFMANIFESTDIR)" != x; then \
- echo Uninstalling SMF manifest in $(SMFMANIFESTDIR)...;\
+ echo Uninstalling SMF manifest file...;\
$(RM) $(BUILDROOT)$(SMFMANIFESTDIR)/cups.xml; \
fi
if test "x$(XINETD)" != x; then \
@@ -378,18 +380,16 @@ cupsd: $(CUPSDOBJS) $(LIBCUPSMIME) ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o cupsd $(CUPSDOBJS) -L. -lcupsmime \
$(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
- $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBS) \
- $(LIBGSSAPI) $(LIBWRAP)
+ $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) \
+ $(DNSSDLIBS) $(LIBS) $(LIBGSSAPI) $(LIBWRAP)
cupsd-static: $(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC)
echo Linking $@...
$(CC) $(LDFLAGS) -o cupsd-static $(CUPSDOBJS) libcupsmime.a \
$(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(LIBPAPER) \
- $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBGSSAPI) \
- $(LIBWRAP)
-
-tls.o: tls-darwin.c tls-gnutls.c tls-openssl.c
+ $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) $(DNSSDLIBS) \
+ $(LIBGSSAPI) $(LIBWRAP)
#
@@ -402,6 +402,12 @@ cupsfilter: cupsfilter.o $(LIBCUPSMIME) ../cups/$(LIBCUPS)
$(RM) convert
$(LN) cupsfilter convert
+cupsfilter-static: cupsfilter.o libcupsmime.a ../cups/$(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o cupsfilter-static cupsfilter.o libcupsmime.a \
+ ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(SSLLIBS) \
+ $(DNSSDLIBS) $(LIBGSSAPI)
+
#
# Make the device daemon, "cups-deviced".
@@ -441,10 +447,10 @@ cups-lpd: cups-lpd.o ../cups/$(LIBCUPS)
#
-# libcupsmime.so.1, libcupsmime.sl.1
+# libcupsmime.so.1
#
-libcupsmime.so.1 libcupsmime.sl.1: $(LIBOBJS)
+libcupsmime.so.1: $(LIBOBJS)
echo Linking $@...
$(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS)
$(RM) `basename $@ .1`
@@ -468,17 +474,6 @@ libcupsmime.1.dylib: $(LIBOBJS) libcupsmime.exp
#
-# libcupsmime_s.a
-#
-
-libcupsmime_s.a: $(LIBOBJS)
- echo Creating $@...
- $(DSO) $(DSOFLAGS) -o libcupsmime_s.o $(LIBOBJS) $(LIBS)
- $(RM) $@
- $(AR) $(ARFLAGS) $@ libcupsmime_s.o
-
-
-#
# libcupsmime.la
#
@@ -559,5 +554,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $".
#
diff --git a/scheduler/auth.c b/scheduler/auth.c
index 1169adf..ac9badc 100644
--- a/scheduler/auth.c
+++ b/scheduler/auth.c
@@ -1,51 +1,19 @@
/*
- * "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: auth.c 12945 2015-10-26 19:46:02Z msweet $"
*
- * Authorization routines for the CUPS scheduler.
+ * Authorization routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * This file contains Kerberos support code, copyright 2006 by
- * Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddIPMask() - Add an IP address authorization mask.
- * cupsdAddLocation() - Add a location for authorization.
- * cupsdAddName() - Add a name to a location...
- * cupsdAddNameMask() - Add a host or interface name authorization
- * mask.
- * cupsdAuthorize() - Validate any authorization credentials.
- * cupsdCheckAccess() - Check whether the given address is allowed to
- * access a location.
- * 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.
- * cupsdFindBest() - Find the location entry that best matches the
- * resource.
- * cupsdFindLocation() - Find the named location.
- * cupsdFreeLocation() - Free all memory used by a location.
- * cupsdIsAuthorized() - Check to see if the user is authorized...
- * cupsdNewLocation() - Create a new location for authorization.
- * check_authref() - Check if an authorization services reference
- * has the supplied right.
- * compare_locations() - Compare two locations.
- * copy_authmask() - Copy function for auth masks.
- * cups_crypt() - Encrypt the password using the DES or MD5
- * algorithms, as needed.
- * free_authmask() - Free function for auth masks.
- * get_md5_password() - Get an MD5 password.
- * pam_func() - PAM conversation function.
- * to64() - Base64-encode an integer value...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -67,9 +35,6 @@
# include <security/pam_appl.h>
# endif /* HAVE_PAM_PAM_APPL_H */
#endif /* HAVE_LIBPAM */
-#ifdef HAVE_USERSEC_H
-# include <usersec.h>
-#endif /* HAVE_USERSEC_H */
#ifdef HAVE_MEMBERSHIP_H
# include <membership.h>
#endif /* HAVE_MEMBERSHIP_H */
@@ -108,16 +73,14 @@ static int check_authref(cupsd_client_t *con, const char *right);
static int compare_locations(cupsd_location_t *a,
cupsd_location_t *b);
static cupsd_authmask_t *copy_authmask(cupsd_authmask_t *am, void *data);
-#if !HAVE_LIBPAM && !defined(HAVE_USERSEC_H)
+#if !HAVE_LIBPAM
static char *cups_crypt(const char *pw, const char *salt);
-#endif /* !HAVE_LIBPAM && !HAVE_USERSEC_H */
+#endif /* !HAVE_LIBPAM */
static void free_authmask(cupsd_authmask_t *am, void *data);
-static char *get_md5_password(const char *username,
- const char *group, char passwd[33]);
#if HAVE_LIBPAM
static int pam_func(int, const struct pam_message **,
struct pam_response **, void *);
-#elif !defined(HAVE_USERSEC_H)
+#else
static void to64(char *s, unsigned long v, int n);
#endif /* HAVE_LIBPAM */
@@ -136,15 +99,6 @@ typedef struct cupsd_authdata_s /**** Authentication data ****/
/*
- * Local globals...
- */
-
-#if defined(__hpux) && HAVE_LIBPAM
-static cupsd_authdata_t *auth_data; /* Current client being authenticated */
-#endif /* __hpux && HAVE_LIBPAM */
-
-
-/*
* 'cupsdAddIPMask()' - Add an IP address authorization mask.
*/
@@ -157,12 +111,7 @@ cupsdAddIPMask(
cupsd_authmask_t temp; /* New host/domain mask */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, "
- "netmask=%x:%x:%x:%x)",
- masks, *masks,
- address[0], address[1], address[2], address[3],
- netmask[0], netmask[1], netmask[2], netmask[3]);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, netmask=%x:%x:%x:%x)", masks, *masks, address[0], address[1], address[2], address[3], netmask[0], netmask[1], netmask[2], netmask[3]);
temp.type = CUPSD_AUTH_IP;
memcpy(temp.mask.ip.address, address, sizeof(temp.mask.ip.address));
@@ -202,8 +151,7 @@ cupsdAddLocation(cupsd_location_t *loc) /* I - Location to add */
{
cupsArrayAdd(Locations, loc);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddLocation: Added location \"%s\"",
- loc->location ? loc->location : "(null)");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddLocation: Added location \"%s\"", loc->location ? loc->location : "(null)");
}
}
@@ -216,8 +164,7 @@ void
cupsdAddName(cupsd_location_t *loc, /* I - Location to add to */
char *name) /* I - Name to add */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")",
- loc, name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", loc, name);
if (!loc->names)
loc->names = cupsArrayNew3(NULL, NULL, NULL, 0,
@@ -247,9 +194,7 @@ cupsdAddNameMask(cups_array_t **masks, /* IO - Masks array (created as needed) *
*ifptr; /* Pointer to end of name */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddNameMask(masks=%p(%p), name=\"%s\")",
- masks, *masks, name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", masks, *masks, name);
if (!_cups_strcasecmp(name, "@LOCAL"))
{
@@ -326,26 +271,6 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
password[HTTP_MAX_VALUE];
/* Password string */
cupsd_cert_t *localuser; /* Certificate username */
- char nonce[HTTP_MAX_VALUE], /* Nonce value from client */
- md5[33], /* MD5 password */
- basicmd5[33]; /* MD5 of Basic password */
- static const char * const states[] = /* HTTP client states... */
- {
- "WAITING",
- "OPTIONS",
- "GET",
- "GET",
- "HEAD",
- "POST",
- "POST",
- "POST",
- "PUT",
- "PUT",
- "DELETE",
- "TRACE",
- "CLOSE",
- "STATUS"
- };
/*
@@ -353,13 +278,10 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* authentication to expect...
*/
- con->best = cupsdFindBest(con->uri, con->http.state);
+ con->best = cupsdFindBest(con->uri, httpGetState(con->http));
con->type = CUPSD_AUTH_NONE;
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] con->uri=\"%s\", con->best=%p(%s)",
- con->http.fd, con->uri, con->best,
- con->best ? con->best->location : "");
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location : "");
if (con->best && con->best->type != CUPSD_AUTH_NONE)
{
@@ -375,10 +297,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* Decode the Authorization string...
*/
- authorization = httpGetField(&con->http, HTTP_FIELD_AUTHORIZATION);
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Client %d] Authorization=\"%s\"",
- con->http.fd, authorization);
+ authorization = httpGetField(con->http, HTTP_FIELD_AUTHORIZATION);
username[0] = '\0';
password[0] = '\0';
@@ -401,16 +320,16 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* No authorization data provided, return early...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] No authentication data provided.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "No authentication data provided.");
return;
}
#ifdef HAVE_AUTHORIZATION_H
else if (!strncmp(authorization, "AuthRef ", 8) &&
- !_cups_strcasecmp(con->http.hostname, "localhost"))
+ httpAddrLocalhost(httpGetAddress(con->http)))
{
OSStatus status; /* Status */
+ char authdata[HTTP_MAX_VALUE];
+ /* Nonce value from client */
int authlen; /* Auth string length */
AuthorizationItemSet *authinfo; /* Authorization item set */
@@ -422,24 +341,18 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
while (isspace(*authorization & 255))
authorization ++;
- authlen = sizeof(nonce);
- httpDecode64_2(nonce, &authlen, authorization);
+ authlen = sizeof(authdata);
+ httpDecode64_2(authdata, &authlen, authorization);
if (authlen != kAuthorizationExternalFormLength)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] External Authorization reference size is "
- "incorrect.", con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "External Authorization reference size is incorrect.");
return;
}
- if ((status = AuthorizationCreateFromExternalForm(
- (AuthorizationExternalForm *)nonce, &con->authref)) != 0)
+ if ((status = AuthorizationCreateFromExternalForm((AuthorizationExternalForm *)authdata, &con->authref)) != 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] AuthorizationCreateFromExternalForm "
- "returned %d (%s)", con->http.fd, (int)status,
- cssmErrorString(status));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "AuthorizationCreateFromExternalForm returned %d (%s)", (int)status, cssmErrorString(status));
return;
}
@@ -453,9 +366,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
{
strlcpy(username, authinfo->items[0].value, sizeof(username));
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as \"%s\" using AuthRef",
- con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using AuthRef.", username);
}
AuthorizationFreeItemSet(authinfo);
@@ -473,28 +384,21 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
peersize = sizeof(peercred);
- if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize))
+ if (getsockopt(httpGetFd(con->http), 0, LOCAL_PEERCRED, &peercred, &peersize))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to get peer credentials - %s",
- con->http.fd, strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", strerror(errno));
return;
}
if ((pwd = getpwuid(CUPSD_UCRED_UID(peercred))) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to find UID %d for peer "
- "credentials.", con->http.fd,
- (int)CUPSD_UCRED_UID(peercred));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to find UID %d for peer credentials.", (int)CUPSD_UCRED_UID(peercred));
return;
}
strlcpy(username, pwd->pw_name, sizeof(username));
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as \"%s\" using "
- "AuthRef + PeerCred", con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using AuthRef + PeerCred.", username);
}
con->type = CUPSD_AUTH_BASIC;
@@ -502,7 +406,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
#endif /* HAVE_AUTHORIZATION_H */
#if defined(SO_PEERCRED) && defined(AF_LOCAL)
else if (!strncmp(authorization, "PeerCred ", 9) &&
- con->http.hostaddr->addr.sa_family == AF_LOCAL)
+ con->http->hostaddr->addr.sa_family == AF_LOCAL && con->best)
{
/*
* Use peer credentials from domain socket connection...
@@ -539,50 +443,37 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if (no_peer)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] PeerCred authentication not allowed for "
- "resource per AUTHKEY policy.", con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "PeerCred authentication not allowed for resource per AUTHKEY policy.");
return;
}
#endif /* HAVE_AUTHORIZATION_H */
if ((pwd = getpwnam(authorization + 9)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] User \"%s\" does not exist.", con->http.fd,
- authorization + 9);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "User \"%s\" does not exist.", authorization + 9);
return;
}
peersize = sizeof(peercred);
# ifdef __APPLE__
- if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize))
+ if (getsockopt(httpGetFd(con->http), 0, LOCAL_PEERCRED, &peercred, &peersize))
# else
- if (getsockopt(con->http.fd, SOL_SOCKET, SO_PEERCRED, &peercred, &peersize))
+ if (getsockopt(httpGetFd(con->http), SOL_SOCKET, SO_PEERCRED, &peercred, &peersize))
# endif /* __APPLE__ */
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to get peer credentials - %s",
- con->http.fd, strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", strerror(errno));
return;
}
if (pwd->pw_uid != CUPSD_UCRED_UID(peercred))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Invalid peer credentials for \"%s\" - got "
- "%d, expected %d!", con->http.fd, authorization + 9,
- CUPSD_UCRED_UID(peercred), pwd->pw_uid);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Invalid peer credentials for \"%s\" - got %d, expected %d.", authorization + 9, CUPSD_UCRED_UID(peercred), pwd->pw_uid);
# ifdef HAVE_SYS_UCRED_H
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_version=%d",
- con->http.fd, peercred.cr_version);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_uid=%d",
- con->http.fd, peercred.cr_uid);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_ngroups=%d",
- con->http.fd, peercred.cr_ngroups);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_groups[0]=%d",
- con->http.fd, peercred.cr_groups[0]);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_version=%d", peercred.cr_version);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_uid=%d", peercred.cr_uid);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_ngroups=%d", peercred.cr_ngroups);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_groups[0]=%d", peercred.cr_groups[0]);
# endif /* HAVE_SYS_UCRED_H */
return;
}
@@ -593,15 +484,13 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
con->gss_uid = CUPSD_UCRED_UID(peercred);
# endif /* HAVE_GSSAPI */
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as %s using PeerCred", con->http.fd,
- username);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as %s using PeerCred.", username);
con->type = CUPSD_AUTH_BASIC;
}
#endif /* SO_PEERCRED && AF_LOCAL */
else if (!strncmp(authorization, "Local", 5) &&
- !_cups_strcasecmp(con->http.hostname, "localhost"))
+ httpAddrLocalhost(httpGetAddress(con->http)))
{
/*
* Get Local certificate authentication data...
@@ -613,18 +502,14 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if ((localuser = cupsdFindCert(authorization)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Local authentication certificate not found.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Local authentication certificate not found.");
return;
}
strlcpy(username, localuser->username, sizeof(username));
con->type = localuser->type;
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as %s using Local", con->http.fd,
- username);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as %s using Local.", username);
}
else if (!strncmp(authorization, "Basic", 5))
{
@@ -648,8 +533,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if ((ptr = strchr(username, ':')) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "[Client %d] Missing Basic password.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Missing Basic password.");
return;
}
@@ -661,8 +545,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* Username must not be empty...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR, "[Client %d] Empty Basic username.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Empty Basic username.");
return;
}
@@ -672,8 +555,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* Password must not be empty...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR, "[Client %d] Empty Basic password.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Empty Basic password.");
return;
}
@@ -703,59 +585,40 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
strlcpy(data.username, username, sizeof(data.username));
strlcpy(data.password, password, sizeof(data.password));
-# if defined(__sun) || defined(__hpux)
+# ifdef __sun
pamdata.conv = (int (*)(int, struct pam_message **,
struct pam_response **,
void *))pam_func;
# else
pamdata.conv = pam_func;
-# endif /* __sun || __hpux */
+# endif /* __sun */
pamdata.appdata_ptr = &data;
-# ifdef __hpux
- /*
- * Workaround for HP-UX bug in pam_unix; see pam_func() below for
- * more info...
- */
-
- auth_data = &data;
-# endif /* __hpux */
-
pamerr = pam_start("cups", username, &pamdata, &pamh);
if (pamerr != PAM_SUCCESS)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] pam_start() returned %d (%s)",
- con->http.fd, pamerr, pam_strerror(pamh, pamerr));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "pam_start() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
return;
}
# ifdef HAVE_PAM_SET_ITEM
# ifdef PAM_RHOST
- pamerr = pam_set_item(pamh, PAM_RHOST, con->http.hostname);
+ pamerr = pam_set_item(pamh, PAM_RHOST, con->http->hostname);
if (pamerr != PAM_SUCCESS)
- cupsdLogMessage(CUPSD_LOG_WARN,
- "[Client %d] pam_set_item(PAM_RHOST) "
- "returned %d (%s)", con->http.fd, pamerr,
- pam_strerror(pamh, pamerr));
+ cupsdLogClient(con, CUPSD_LOG_WARN, "pam_set_item(PAM_RHOST) returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
# endif /* PAM_RHOST */
# ifdef PAM_TTY
pamerr = pam_set_item(pamh, PAM_TTY, "cups");
if (pamerr != PAM_SUCCESS)
- cupsdLogMessage(CUPSD_LOG_WARN,
- "[Client %d] pam_set_item(PAM_TTY) "
- "returned %d (%s)!", con->http.fd, pamerr,
- pam_strerror(pamh, pamerr));
+ cupsdLogClient(con, CUPSD_LOG_WARN, "pam_set_item(PAM_TTY) returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
# endif /* PAM_TTY */
# endif /* HAVE_PAM_SET_ITEM */
pamerr = pam_authenticate(pamh, PAM_SILENT);
if (pamerr != PAM_SUCCESS)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] pam_authenticate() returned %d (%s)",
- con->http.fd, pamerr, pam_strerror(pamh, pamerr));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "pam_authenticate() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
pam_end(pamh, 0);
return;
}
@@ -763,47 +626,19 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
# ifdef HAVE_PAM_SETCRED
pamerr = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
if (pamerr != PAM_SUCCESS)
- cupsdLogMessage(CUPSD_LOG_WARN,
- "[Client %d] pam_setcred() returned %d (%s)",
- con->http.fd, pamerr,
- pam_strerror(pamh, pamerr));
+ cupsdLogClient(con, CUPSD_LOG_WARN, "pam_setcred() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
# endif /* HAVE_PAM_SETCRED */
pamerr = pam_acct_mgmt(pamh, PAM_SILENT);
if (pamerr != PAM_SUCCESS)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] pam_acct_mgmt() returned %d (%s)",
- con->http.fd, pamerr, pam_strerror(pamh, pamerr));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "pam_acct_mgmt() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
pam_end(pamh, 0);
return;
}
pam_end(pamh, PAM_SUCCESS);
-#elif defined(HAVE_USERSEC_H)
- /*
- * Use AIX authentication interface...
- */
-
- char *authmsg; /* Authentication message */
- int reenter; /* ??? */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] AIX authenticate of username \"%s\"",
- con->http.fd, username);
-
- reenter = 1;
- if (authenticate(username, password, &reenter, &authmsg) != 0)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Unable to authenticate username "
- "\"%s\": %s", con->http.fd, username,
- strerror(errno));
- return;
- }
-
#else
/*
* Use normal UNIX password file-based authentication...
@@ -825,9 +660,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* No such user...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unknown username \"%s\".",
- con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unknown username \"%s\".", username);
return;
}
@@ -841,9 +674,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* Don't allow blank passwords!
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Username \"%s\" has no shadow "
- "password.", con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Username \"%s\" has no shadow password.", username);
return;
}
@@ -856,9 +687,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* Don't allow blank passwords!
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Username \"%s\" has no password.",
- con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Username \"%s\" has no password.", username);
return;
}
@@ -869,10 +698,6 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
pass = cups_crypt(password, pw->pw_passwd);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] pw_passwd=\"%s\", crypt=\"%s\"",
- con->http.fd, pw->pw_passwd, pass);
-
if (!pass || strcmp(pw->pw_passwd, pass))
{
# ifdef HAVE_SHADOW_H
@@ -880,143 +705,28 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
{
pass = cups_crypt(password, spw->sp_pwdp);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] sp_pwdp=\"%s\", crypt=\"%s\"",
- con->http.fd, spw->sp_pwdp, pass);
-
if (pass == NULL || strcmp(spw->sp_pwdp, pass))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Authentication failed for user "
- "\"%s\".", con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Authentication failed for user \"%s\".", username);
return;
}
}
else
# endif /* HAVE_SHADOW_H */
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Authentication failed for user "
- "\"%s\".", con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Authentication failed for user \"%s\".", username);
return;
}
}
#endif /* HAVE_LIBPAM */
}
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as %s using Basic",
- con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using Basic.", username);
break;
-
- case CUPSD_AUTH_BASICDIGEST :
- /*
- * Do Basic authentication with the Digest password file...
- */
-
- if (!get_md5_password(username, NULL, md5))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unknown MD5 username \"%s\".",
- con->http.fd, username);
- return;
- }
-
- httpMD5(username, "CUPS", password, basicmd5);
-
- if (strcmp(md5, basicmd5))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Authentication failed for \"%s\".",
- con->http.fd, username);
- return;
- }
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as %s using BasicDigest",
- con->http.fd, username);
- break;
}
con->type = type;
}
- else if (!strncmp(authorization, "Digest", 6))
- {
- /*
- * Get the username, password, and nonce from the Digest attributes...
- */
-
- if (!httpGetSubField2(&(con->http), HTTP_FIELD_AUTHORIZATION, "username",
- username, sizeof(username)) || !username[0])
- {
- /*
- * Username must not be empty...
- */
-
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Empty or missing Digest username.",
- con->http.fd);
- return;
- }
-
- if (!httpGetSubField2(&(con->http), HTTP_FIELD_AUTHORIZATION, "response",
- password, sizeof(password)) || !password[0])
- {
- /*
- * Password must not be empty...
- */
-
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Empty or missing Digest password.",
- con->http.fd);
- return;
- }
-
- if (!httpGetSubField(&(con->http), HTTP_FIELD_AUTHORIZATION, "nonce",
- nonce))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] No nonce value for Digest authentication.",
- con->http.fd);
- return;
- }
-
- if (strcmp(con->http.hostname, nonce))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Bad nonce value, expected \"%s\", "
- "got \"%s\".", con->http.fd, con->http.hostname, nonce);
- return;
- }
-
- /*
- * Validate the username and password...
- */
-
- if (!get_md5_password(username, NULL, md5))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unknown MD5 username \"%s\".",
- con->http.fd, username);
- return;
- }
-
- httpMD5Final(nonce, states[con->http.state], con->uri, md5);
-
- if (strcmp(md5, password))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Authentication failed for \"%s\".",
- con->http.fd, username);
- return;
- }
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as %s using Digest", con->http.fd,
- username);
-
- con->type = CUPSD_AUTH_DIGEST;
- }
#ifdef HAVE_GSSAPI
else if (!strncmp(authorization, "Negotiate", 9))
{
@@ -1037,12 +747,9 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* to use it...
*/
- if (gss_init_sec_context == NULL)
+ if (&gss_init_sec_context == NULL)
{
- cupsdLogMessage(CUPSD_LOG_WARN,
- "[Client %d] GSSAPI/Kerberos authentication failed "
- "because the Kerberos framework is not present.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_WARN, "GSSAPI/Kerberos authentication failed because the Kerberos framework is not present.");
return;
}
# endif /* __APPLE__ */
@@ -1057,9 +764,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if (!*authorization)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] No authentication data specified.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "No authentication data specified.");
return;
}
@@ -1067,11 +772,11 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* Decode the authorization string to get the input token...
*/
- len = strlen(authorization);
- input_token.value = malloc(len);
+ len = (int)strlen(authorization);
+ input_token.value = malloc((size_t)len);
input_token.value = httpDecode64_2(input_token.value, &len,
authorization);
- input_token.length = len;
+ input_token.length = (size_t)len;
/*
* Accept the input token to get the authorization info...
@@ -1096,9 +801,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if (GSS_ERROR(major_status))
{
- cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
- "[Client %d] Error accepting GSSAPI security context",
- con->http.fd);
+ cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, "[Client %d] Error accepting GSSAPI security context.", con->number);
if (context != GSS_C_NO_CONTEXT)
gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER);
@@ -1112,8 +815,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
*/
if (major_status == GSS_S_CONTINUE_NEEDED)
- cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
- "[Client %d] Credentials not complete", con->http.fd);
+ cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, "[Client %d] Credentials not complete.", con->number);
else if (major_status == GSS_S_COMPLETE)
{
major_status = gss_display_name(&minor_status, client_name,
@@ -1121,8 +823,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if (GSS_ERROR(major_status))
{
- cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
- "[Client %d] Error getting username", con->http.fd);
+ cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, "[Client %d] Error getting username.", con->number);
gss_release_name(&minor_status, &client_name);
gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER);
return;
@@ -1130,9 +831,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
strlcpy(username, output_token.value, sizeof(username));
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Authorized as %s using Negotiate",
- con->http.fd, username);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using Negotiate.", username);
gss_release_name(&minor_status, &client_name);
gss_release_buffer(&minor_status, &output_token);
@@ -1148,7 +847,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
* to run as the correct user to get Kerberos credentials of its own.
*/
- if (_httpAddrFamily(con->http.hostaddr) == AF_LOCAL)
+ if (httpAddrFamily(con->http->hostaddr) == AF_LOCAL)
{
cupsd_ucred_t peercred; /* Peer credentials */
socklen_t peersize; /* Size of peer credentials */
@@ -1156,21 +855,17 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
peersize = sizeof(peercred);
# ifdef __APPLE__
- if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize))
+ if (getsockopt(httpGetFd(con->http), 0, LOCAL_PEERCRED, &peercred, &peersize))
# else
- if (getsockopt(con->http.fd, SOL_SOCKET, SO_PEERCRED, &peercred,
+ if (getsockopt(httpGetFd(con->http), SOL_SOCKET, SO_PEERCRED, &peercred,
&peersize))
# endif /* __APPLE__ */
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to get peer credentials - %s",
- con->http.fd, strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", strerror(errno));
}
else
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Using credentials for UID %d.",
- con->http.fd, CUPSD_UCRED_UID(peercred));
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Using credentials for UID %d.", CUPSD_UCRED_UID(peercred));
con->gss_uid = CUPSD_UCRED_UID(peercred);
}
}
@@ -1183,11 +878,9 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
if (sscanf(authorization, "%255s", scheme) != 1)
- strcpy(scheme, "UNKNOWN");
+ strlcpy(scheme, "UNKNOWN", sizeof(scheme));
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Bad authentication data \"%s ...\"",
- con->http.fd, scheme);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Bad authentication data \"%s ...\".", scheme);
return;
}
@@ -1210,8 +903,8 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
int /* O - 1 if allowed, 0 otherwise */
cupsdCheckAccess(
unsigned ip[4], /* I - Client address */
- char *name, /* I - Client hostname */
- int namelen, /* I - Length of hostname */
+ const char *name, /* I - Client hostname */
+ size_t namelen, /* I - Length of hostname */
cupsd_location_t *loc) /* I - Location to check */
{
int allow; /* 1 if allowed, 0 otherwise */
@@ -1269,8 +962,8 @@ cupsdCheckAccess(
int /* O - 1 if mask matches, 0 otherwise */
cupsdCheckAuth(unsigned ip[4], /* I - Client address */
- char *name, /* I - Client hostname */
- int name_len, /* I - Length of hostname */
+ const char *name, /* I - Client hostname */
+ size_t name_len, /* I - Length of hostname */
cups_array_t *masks) /* I - Masks */
{
int i; /* Looping var */
@@ -1302,6 +995,8 @@ cupsdCheckAuth(unsigned ip[4], /* I - Client address */
netip6[3] = htonl(ip[3]);
#endif /* AF_INET6 */
+ cupsdNetIFUpdate();
+
if (!strcmp(mask->mask.name.name, "*"))
{
#ifdef __APPLE__
@@ -1317,8 +1012,6 @@ cupsdCheckAuth(unsigned ip[4], /* I - Client address */
* Check against all local interfaces...
*/
- cupsdNetIFUpdate();
-
for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList);
iface;
iface = (cupsd_netif_t *)cupsArrayNext(NetIFList))
@@ -1456,7 +1149,6 @@ cupsdCheckGroup(
{
int i; /* Looping var */
struct group *group; /* System group info */
- char junk[33]; /* MD5 password (not used) */
#ifdef HAVE_MBR_UID_TO_UUID
uuid_t useruuid, /* UUID for username */
groupuuid; /* UUID for groupname */
@@ -1464,9 +1156,7 @@ cupsdCheckGroup(
#endif /* HAVE_MBR_UID_TO_UUID */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")",
- username, user, groupname);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", username, user, groupname);
/*
* Validate input...
@@ -1543,15 +1233,6 @@ cupsdCheckGroup(
#endif /* HAVE_MBR_UID_TO_UUID */
/*
- * Username not found, group not found, or user is not part of the
- * system group... Check for a user and group in the MD5 password
- * file...
- */
-
- if (get_md5_password(username, groupname, junk) != NULL)
- return (1);
-
- /*
* If we get this far, then the user isn't part of the named group...
*/
@@ -1587,6 +1268,7 @@ cupsdCopyLocation(
if (loc->location)
temp->location = _cupsStrAlloc(loc->location);
+ temp->length = loc->length;
temp->limit = loc->limit;
temp->order_type = loc->order_type;
temp->type = loc->type;
@@ -1672,7 +1354,7 @@ cupsdFindBest(const char *path, /* I - Resource path */
*uriptr; /* Pointer into URI */
cupsd_location_t *loc, /* Current location */
*best; /* Best match for location so far */
- int bestlen; /* Length of best match */
+ size_t bestlen; /* Length of best match */
int limit; /* Limit field */
static const int limits[] = /* Map http_status_t to CUPSD_AUTH_LIMIT_xyz */
{
@@ -1689,6 +1371,8 @@ cupsdFindBest(const char *path, /* I - Resource path */
CUPSD_AUTH_LIMIT_DELETE,
CUPSD_AUTH_LIMIT_TRACE,
CUPSD_AUTH_LIMIT_ALL,
+ CUPSD_AUTH_LIMIT_ALL,
+ CUPSD_AUTH_LIMIT_ALL,
CUPSD_AUTH_LIMIT_ALL
};
@@ -1701,6 +1385,12 @@ cupsdFindBest(const char *path, /* I - Resource path */
strlcpy(uri, path, sizeof(uri));
+ if ((uriptr = strchr(uri, '?')) != NULL)
+ *uriptr = '\0'; /* Drop trailing query string */
+
+ if ((uriptr = uri + strlen(uri) - 1) > uri && *uriptr == '/')
+ *uriptr = '\0'; /* Remove trailing '/' */
+
if (!strncmp(uri, "/printers/", 10) ||
!strncmp(uri, "/classes/", 9))
{
@@ -1714,8 +1404,6 @@ cupsdFindBest(const char *path, /* I - Resource path */
*uriptr = '\0';
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: uri = \"%s\"...", uri);
-
/*
* Loop through the list of locations to find a match...
*/
@@ -1724,12 +1412,14 @@ cupsdFindBest(const char *path, /* I - Resource path */
best = NULL;
bestlen = 0;
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: uri=\"%s\", limit=%x...", uri, limit);
+
+
for (loc = (cupsd_location_t *)cupsArrayFirst(Locations);
loc;
loc = (cupsd_location_t *)cupsArrayNext(Locations))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: Location %s Limit %x",
- loc->location ? loc->location : "nil", loc->limit);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: Location %s(%d) Limit %x", loc->location ? loc->location : "(null)", (int)loc->length, loc->limit);
if (!strncmp(uri, "/printers/", 10) || !strncmp(uri, "/classes/", 9))
{
@@ -1767,8 +1457,7 @@ cupsdFindBest(const char *path, /* I - Resource path */
* Return the match, if any...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: best = %s",
- best ? best->location : "NONE");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: best=%s", best ? best->location : "NONE");
return (best);
}
@@ -1817,9 +1506,13 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
int i, /* Looping vars */
auth, /* Authorization status */
type; /* Type of authentication */
+ http_addr_t *hostaddr = httpGetAddress(con->http);
+ /* Client address */
+ const char *hostname = httpGetHostname(con->http, NULL, 0);
+ /* Client hostname */
unsigned address[4]; /* Authorization address */
cupsd_location_t *best; /* Best match for location so far */
- int hostlen; /* Length of hostname */
+ size_t hostlen; /* Length of hostname */
char *name, /* Current username */
username[256], /* Username to authorize */
ownername[256], /* Owner name to authorize */
@@ -1835,19 +1528,13 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
{
"None",
"Basic",
- "Digest",
- "BasicDigest",
"Negotiate"
};
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)",
- con->uri, con->best, con->best ? con->best->location ?
- con->best->location : "(null)" : "");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location ? con->best->location : "(null)" : "");
if (owner)
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: owner=\"%s\"", owner);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: owner=\"%s\"", owner);
/*
* If there is no "best" authentication rule for this request, then
@@ -1857,8 +1544,9 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
if (!con->best)
{
- if (!strcmp(con->http.hostname, "localhost") ||
- !strcmp(con->http.hostname, ServerName))
+ if (httpAddrLocalhost(httpGetAddress(con->http)) ||
+ !strcmp(hostname, ServerName) ||
+ cupsArrayFind(ServerAlias, (void *)hostname))
return (HTTP_OK);
else
return (HTTP_FORBIDDEN);
@@ -1869,35 +1557,30 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
if ((type = best->type) == CUPSD_AUTH_DEFAULT)
type = cupsdDefaultAuthType();
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: level=CUPSD_AUTH_%s, type=%s, "
- "satisfy=CUPSD_AUTH_SATISFY_%s, num_names=%d",
- levels[best->level], types[type],
- best->satisfy ? "ANY" : "ALL", cupsArrayCount(best->names));
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: level=CUPSD_AUTH_%s, type=%s, satisfy=CUPSD_AUTH_SATISFY_%s, num_names=%d", levels[best->level], types[type], best->satisfy ? "ANY" : "ALL", cupsArrayCount(best->names));
if (best->limit == CUPSD_AUTH_LIMIT_IPP)
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: op=%x(%s)",
- best->op, ippOpString(best->op));
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: op=%x(%s)", best->op, ippOpString(best->op));
/*
* Check host/ip-based accesses...
*/
#ifdef AF_INET6
- if (con->http.hostaddr->addr.sa_family == AF_INET6)
+ if (httpAddrFamily(hostaddr) == AF_INET6)
{
/*
* Copy IPv6 address...
*/
- address[0] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[0]);
- address[1] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[1]);
- address[2] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2]);
- address[3] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[3]);
+ address[0] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[0]);
+ address[1] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[1]);
+ address[2] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[2]);
+ address[3] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[3]);
}
else
#endif /* AF_INET6 */
- if (con->http.hostaddr->addr.sa_family == AF_INET)
+ if (con->http->hostaddr->addr.sa_family == AF_INET)
{
/*
* Copy IPv4 address...
@@ -1906,18 +1589,17 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
address[0] = 0;
address[1] = 0;
address[2] = 0;
- address[3] = ntohl(con->http.hostaddr->ipv4.sin_addr.s_addr);
+ address[3] = ntohl(hostaddr->ipv4.sin_addr.s_addr);
}
else
memset(address, 0, sizeof(address));
- hostlen = strlen(con->http.hostname);
+ hostlen = strlen(hostname);
- auth = cupsdCheckAccess(address, con->http.hostname, hostlen, best)
+ auth = cupsdCheckAccess(address, hostname, hostlen, best)
? CUPSD_AUTH_ALLOW : CUPSD_AUTH_DENY;
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=CUPSD_AUTH_%s...",
- auth ? "DENY" : "ALLOW");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=CUPSD_AUTH_%s...", auth ? "DENY" : "ALLOW");
if (auth == CUPSD_AUTH_DENY && best->satisfy == CUPSD_AUTH_SATISFY_ALL)
return (HTTP_FORBIDDEN);
@@ -1927,8 +1609,9 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
* See if encryption is required...
*/
- if ((best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http.tls &&
- _cups_strcasecmp(con->http.hostname, "localhost") &&
+ if ((best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http->tls &&
+ _cups_strcasecmp(hostname, "localhost") &&
+ !httpAddrLocalhost(hostaddr) &&
best->satisfy == CUPSD_AUTH_SATISFY_ALL) &&
!(type == CUPSD_AUTH_NEGOTIATE ||
(type == CUPSD_AUTH_NONE &&
@@ -1993,9 +1676,9 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
#ifdef HAVE_GSSAPI
(type != CUPSD_AUTH_NEGOTIATE || con->gss_uid <= 0) &&
#endif /* HAVE_GSSAPI */
- (con->type != CUPSD_AUTH_BASIC || type != CUPSD_AUTH_BASICDIGEST))
+ con->type != CUPSD_AUTH_BASIC)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Authorized using %s, expected %s!",
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Authorized using %s, expected %s.",
types[con->type], types[type]);
return (HTTP_UNAUTHORIZED);
@@ -2056,8 +1739,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
* allowed...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: Checking user membership...");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking user membership...");
#ifdef HAVE_AUTHORIZATION_H
/*
@@ -2110,8 +1792,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
* Check to see if this user is in any of the named groups...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: Checking group membership...");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group membership...");
/*
* Check to see if this user is in any of the named groups...
@@ -2121,9 +1802,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
name;
name = (char *)cupsArrayNext(best->names))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: Checking group \"%s\" membership...",
- name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group \"%s\" membership...", name);
if (!_cups_strcasecmp(name, "@SYSTEM"))
{
@@ -2139,8 +1818,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
* The user isn't part of the specified group, so deny access...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "cupsdIsAuthorized: User not in group(s)!");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdIsAuthorized: User not in group(s).");
return (con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED);
}
@@ -2230,9 +1908,7 @@ check_authref(cupsd_client_t *con, /* I - Connection */
return (0);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "AuthorizationCopyRights(\"%s\") succeeded!",
- authright.name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "AuthorizationCopyRights(\"%s\") succeeded.", authright.name);
return (1);
}
@@ -2290,7 +1966,7 @@ copy_authmask(cupsd_authmask_t *mask, /* I - Existing auth mask */
}
-#if !HAVE_LIBPAM && !defined(HAVE_USERSEC_H)
+#if !HAVE_LIBPAM
/*
* 'cups_crypt()' - Encrypt the password using the DES or MD5 algorithms,
* as needed.
@@ -2379,23 +2055,23 @@ cups_crypt(const char *pw, /* I - Password string */
* Copy the final sum to the result string and return...
*/
- memcpy(result, salt, salt_end - salt);
+ memcpy(result, salt, (size_t)(salt_end - salt));
ptr = result + (salt_end - salt);
*ptr++ = '$';
for (i = 0; i < 5; i ++, ptr += 4)
{
- n = (((digest[i] << 8) | digest[i + 6]) << 8);
+ n = ((((unsigned)digest[i] << 8) | (unsigned)digest[i + 6]) << 8);
if (i < 4)
- n |= digest[i + 12];
+ n |= (unsigned)digest[i + 12];
else
- n |= digest[5];
+ n |= (unsigned)digest[5];
to64(ptr, n, 4);
}
- to64(ptr, digest[11], 2);
+ to64(ptr, (unsigned)digest[11], 2);
ptr += 2;
*ptr = '\0';
@@ -2410,7 +2086,7 @@ cups_crypt(const char *pw, /* I - Password string */
return (crypt(pw, salt));
}
}
-#endif /* !HAVE_LIBPAM && !HAVE_USERSEC_H */
+#endif /* !HAVE_LIBPAM */
/*
@@ -2430,68 +2106,6 @@ free_authmask(cupsd_authmask_t *mask, /* I - Auth mask to free */
}
-/*
- * 'get_md5_password()' - Get an MD5 password.
- */
-
-static char * /* O - MD5 password string */
-get_md5_password(const char *username, /* I - Username */
- const char *group, /* I - Group */
- char passwd[33]) /* O - MD5 password string */
-{
- cups_file_t *fp; /* passwd.md5 file */
- char filename[1024], /* passwd.md5 filename */
- line[256], /* Line from file */
- tempuser[33], /* User from file */
- tempgroup[33]; /* Group from file */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "get_md5_password(username=\"%s\", group=\"%s\", passwd=%p)",
- username, group ? group : "(null)", passwd);
-
- snprintf(filename, sizeof(filename), "%s/passwd.md5", ServerRoot);
- if ((fp = cupsFileOpen(filename, "r")) == NULL)
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open %s - %s", filename,
- strerror(errno));
-
- return (NULL);
- }
-
- while (cupsFileGets(fp, line, sizeof(line)) != NULL)
- {
- if (sscanf(line, "%32[^:]:%32[^:]:%32s", tempuser, tempgroup, passwd) != 3)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad MD5 password line: %s", line);
- continue;
- }
-
- if (!strcmp(username, tempuser) &&
- (group == NULL || !strcmp(group, tempgroup)))
- {
- /*
- * Found the password entry!
- */
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "Found MD5 user %s, group %s...",
- username, tempgroup);
-
- cupsFileClose(fp);
- return (passwd);
- }
- }
-
- /*
- * Didn't find a password entry - return NULL!
- */
-
- cupsFileClose(fp);
- return (NULL);
-}
-
-
#if HAVE_LIBPAM
/*
* 'pam_func()' - PAM conversation function.
@@ -2514,7 +2128,7 @@ pam_func(
* Allocate memory for the responses...
*/
- if ((replies = malloc(sizeof(struct pam_response) * num_msg)) == NULL)
+ if ((replies = malloc(sizeof(struct pam_response) * (size_t)num_msg)) == NULL)
return (PAM_CONV_ERR);
/*
@@ -2523,17 +2137,7 @@ pam_func(
DEBUG_printf(("pam_func: appdata_ptr = %p\n", appdata_ptr));
-#ifdef __hpux
- /*
- * Apparently some versions of HP-UX 11 have a broken pam_unix security
- * module. This is a workaround...
- */
-
- data = auth_data;
- (void)appdata_ptr;
-#else
data = (cupsd_authdata_t *)appdata_ptr;
-#endif /* __hpux */
for (i = 0; i < num_msg; i ++)
{
@@ -2583,7 +2187,7 @@ pam_func(
return (PAM_SUCCESS);
}
-#elif !defined(HAVE_USERSEC_H)
+#else
/*
@@ -2607,5 +2211,5 @@ to64(char *s, /* O - Output string */
/*
- * End of "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: auth.c 12945 2015-10-26 19:46:02Z msweet $".
*/
diff --git a/scheduler/auth.h b/scheduler/auth.h
index 8979023..c42c0a2 100644
--- a/scheduler/auth.h
+++ b/scheduler/auth.h
@@ -1,16 +1,16 @@
/*
- * "$Id: auth.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: auth.h 11776 2014-03-28 19:16:05Z msweet $"
*
- * Authorization definitions for the CUPS scheduler.
+ * Authorization definitions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -27,10 +27,8 @@
#define CUPSD_AUTH_DEFAULT -1 /* Use DefaultAuthType */
#define CUPSD_AUTH_NONE 0 /* No authentication */
#define CUPSD_AUTH_BASIC 1 /* Basic authentication */
-#define CUPSD_AUTH_DIGEST 2 /* Digest authentication */
-#define CUPSD_AUTH_BASICDIGEST 3 /* Basic authentication w/passwd.md5 */
-#define CUPSD_AUTH_NEGOTIATE 4 /* Kerberos authentication */
-#define CUPSD_AUTH_AUTO 5 /* Kerberos or Basic, depending on configuration of server */
+#define CUPSD_AUTH_NEGOTIATE 2 /* Kerberos authentication */
+#define CUPSD_AUTH_AUTO 3 /* Kerberos or Basic, depending on configuration of server */
#define CUPSD_AUTH_ANON 0 /* Anonymous access */
#define CUPSD_AUTH_USER 1 /* Must have a valid username/password */
@@ -74,7 +72,7 @@ typedef struct
typedef struct
{
- int length; /* Length of name */
+ size_t length; /* Length of name */
char *name; /* Name string */
} cupsd_namemask_t;
@@ -91,9 +89,9 @@ typedef struct
typedef struct
{
char *location; /* Location of resource */
+ size_t length; /* Length of location string */
ipp_op_t op; /* IPP operation */
int limit, /* Limit for these types of requests */
- length, /* Length of location string */
order_type, /* Allow or Deny */
type, /* Type of authentication */
level, /* Access level required */
@@ -130,10 +128,8 @@ extern void cupsdAddLocation(cupsd_location_t *loc);
extern void cupsdAddName(cupsd_location_t *loc, char *name);
extern int cupsdAddNameMask(cups_array_t **masks, char *name);
extern void cupsdAuthorize(cupsd_client_t *con);
-extern int cupsdCheckAccess(unsigned ip[4], char *name,
- int namelen, cupsd_location_t *loc);
-extern int cupsdCheckAuth(unsigned ip[4], char *name, int namelen,
- cups_array_t *masks);
+extern int cupsdCheckAccess(unsigned ip[4], const char *name, size_t namelen, cupsd_location_t *loc);
+extern int cupsdCheckAuth(unsigned ip[4], const char *name, size_t namelen, cups_array_t *masks);
extern int cupsdCheckGroup(const char *username,
struct passwd *user,
const char *groupname);
@@ -147,5 +143,5 @@ extern cupsd_location_t *cupsdNewLocation(const char *location);
/*
- * End of "$Id: auth.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: auth.h 11776 2014-03-28 19:16:05Z msweet $".
*/
diff --git a/scheduler/banners.c b/scheduler/banners.c
index 87a1a68..631a891 100644
--- a/scheduler/banners.c
+++ b/scheduler/banners.c
@@ -1,5 +1,5 @@
/*
- * "$Id: banners.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: banners.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Banner routines for the CUPS scheduler.
*
@@ -220,5 +220,5 @@ free_banners(void)
/*
- * End of "$Id: banners.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: banners.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/banners.h b/scheduler/banners.h
index 4a91e8a..19ab6f7 100644
--- a/scheduler/banners.h
+++ b/scheduler/banners.h
@@ -1,5 +1,5 @@
/*
- * "$Id: banners.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: banners.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Banner definitions for the CUPS scheduler.
*
@@ -41,5 +41,5 @@ extern void cupsdLoadBanners(const char *d);
/*
- * End of "$Id: banners.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: banners.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/cert.c b/scheduler/cert.c
index cd47228..6d93426 100644
--- a/scheduler/cert.c
+++ b/scheduler/cert.c
@@ -1,25 +1,16 @@
/*
- * "$Id: cert.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cert.c 12972 2015-11-13 20:30:37Z msweet $"
*
- * Authentication certificate routines for the CUPS scheduler.
+ * Authentication certificate routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddCert() - Add a certificate.
- * cupsdDeleteCert() - Delete a single certificate.
- * cupsdDeleteAllCerts() - Delete all certificates...
- * cupsdFindCert() - Find a certificate.
- * cupsdInitCerts() - Initialize the certificate "system" and root
- * certificate.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -36,6 +27,13 @@
/*
+ * Local functions...
+ */
+
+static int ctcompare(const char *a, const char *b);
+
+
+/*
* 'cupsdAddCert()' - Add a certificate.
*/
@@ -52,8 +50,7 @@ cupsdAddCert(int pid, /* I - Process ID */
/* Hex constants... */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddCert: Adding certificate for PID %d", pid);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAddCert: Adding certificate for PID %d", pid);
/*
* Allocate memory for the certificate...
@@ -111,8 +108,7 @@ cupsdAddCert(int pid, /* I - Process ID */
fchmod(fd, 0440);
fchown(fd, RunUser, SystemGroupIDs[0]);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d",
- NumSystemGroups);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d", NumSystemGroups);
#ifdef HAVE_ACL_INIT
if (NumSystemGroups > 1)
@@ -288,8 +284,7 @@ cupsdDeleteCert(int pid) /* I - Process ID */
* Remove this certificate from the list...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDeleteCert: Removing certificate for PID %d", pid);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteCert: Removing certificate for PID %d.", pid);
DEBUG_printf(("DELETE pid=%d, username=%s, cert=%s\n", cert->pid,
cert->username, cert->certificate));
@@ -363,17 +358,15 @@ cupsdFindCert(const char *certificate) /* I - Certificate */
cupsd_cert_t *cert; /* Current certificate */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)",
- certificate);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)", certificate);
for (cert = Certs; cert != NULL; cert = cert->next)
- if (!_cups_strcasecmp(certificate, cert->certificate))
+ if (!ctcompare(certificate, cert->certificate))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning %s...",
- cert->username);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning \"%s\".", cert->username);
return (cert);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found!");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found.");
return (NULL);
}
@@ -417,10 +410,10 @@ cupsdInitCerts(void)
* them as the seed...
*/
- seed = cupsFileGetChar(fp);
- seed = (seed << 8) | cupsFileGetChar(fp);
- seed = (seed << 8) | cupsFileGetChar(fp);
- CUPS_SRAND((seed << 8) | cupsFileGetChar(fp));
+ seed = (unsigned)cupsFileGetChar(fp);
+ seed = (seed << 8) | (unsigned)cupsFileGetChar(fp);
+ seed = (seed << 8) | (unsigned)cupsFileGetChar(fp);
+ CUPS_SRAND((seed << 8) | (unsigned)cupsFileGetChar(fp));
cupsFileClose(fp);
}
@@ -436,5 +429,27 @@ cupsdInitCerts(void)
/*
- * End of "$Id: cert.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'ctcompare()' - Compare two strings in constant time.
+ */
+
+static int /* O - 0 on match, non-zero on non-match */
+ctcompare(const char *a, /* I - First string */
+ const char *b) /* I - Second string */
+{
+ int result = 0; /* Result */
+
+
+ while (*a && *b)
+ {
+ result |= *a ^ *b;
+ a ++;
+ b ++;
+ }
+
+ return (result);
+}
+
+
+/*
+ * End of "$Id: cert.c 12972 2015-11-13 20:30:37Z msweet $".
*/
diff --git a/scheduler/cert.h b/scheduler/cert.h
index 26eaa9f..063c5de 100644
--- a/scheduler/cert.h
+++ b/scheduler/cert.h
@@ -1,5 +1,5 @@
/*
- * "$Id: cert.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cert.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Authentication certificate definitions for the CUPS scheduler.
*
@@ -49,5 +49,5 @@ extern void cupsdInitCerts(void);
/*
- * End of "$Id: cert.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cert.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/classes.c b/scheduler/classes.c
index 1aed92c..17add06 100644
--- a/scheduler/classes.c
+++ b/scheduler/classes.c
@@ -1,27 +1,16 @@
/*
- * "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: classes.c 11781 2014-03-28 20:57:22Z msweet $"
*
- * Printer class routines for the CUPS scheduler.
+ * Printer class routines for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddClass() - Add a class to the system.
- * cupsdAddPrinterToClass() - Add a printer to a class...
- * cupsdDeletePrinterFromClass() - Delete a printer from a class.
- * cupsdDeletePrinterFromClasses() - Delete a printer from all classes.
- * cupsdFindAvailablePrinter() - Find an available printer in a class.
- * cupsdFindClass() - Find the named class.
- * cupsdLoadAllClasses() - Load classes from the classes.conf file.
- * cupsdSaveAllClasses() - Save classes to the classes.conf file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -93,7 +82,7 @@ cupsdAddPrinterToClass(
if (c->num_printers == 0)
temp = malloc(sizeof(cupsd_printer_t *));
else
- temp = realloc(c->printers, sizeof(cupsd_printer_t *) * (c->num_printers + 1));
+ temp = realloc(c->printers, sizeof(cupsd_printer_t *) * (size_t)(c->num_printers + 1));
if (temp == NULL)
{
@@ -147,7 +136,7 @@ cupsdDeletePrinterFromClass(
c->num_printers --;
if (i < c->num_printers)
memmove(c->printers + i, c->printers + i + 1,
- (c->num_printers - i) * sizeof(cupsd_printer_t *));
+ (size_t)(c->num_printers - i) * sizeof(cupsd_printer_t *));
}
else
return (0);
@@ -343,7 +332,7 @@ cupsdLoadAllClasses(void)
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!_cups_strcasecmp(line, "</Class>"))
+ else if (!_cups_strcasecmp(line, "</Class>") || !_cups_strcasecmp(line, "</DefaultClass>"))
{
if (p != NULL)
{
@@ -806,7 +795,10 @@ cupsdSaveAllClasses(void)
cupsFilePutConf(fp, "Option", value);
}
- cupsFilePuts(fp, "</Class>\n");
+ if (pclass == DefaultPrinter)
+ cupsFilePuts(fp, "</DefaultClass>\n");
+ else
+ cupsFilePuts(fp, "</Class>\n");
}
cupsdCloseCreatedConfFile(fp, filename);
@@ -814,5 +806,5 @@ cupsdSaveAllClasses(void)
/*
- * End of "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: classes.c 11781 2014-03-28 20:57:22Z msweet $".
*/
diff --git a/scheduler/classes.h b/scheduler/classes.h
index 6d94de2..bc0196e 100644
--- a/scheduler/classes.h
+++ b/scheduler/classes.h
@@ -1,5 +1,5 @@
/*
- * "$Id: classes.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: classes.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Printer class definitions for the CUPS scheduler.
*
@@ -31,5 +31,5 @@ extern void cupsdSaveAllClasses(void);
/*
- * End of "$Id: classes.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: classes.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/client.c b/scheduler/client.c
index b341e9d..3ec3b5c 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -1,90 +1,38 @@
/*
- * "$Id: client.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: client.c 12978 2015-11-17 19:29:52Z msweet $"
*
- * Client routines for the CUPS scheduler.
+ * Client routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * This file contains Kerberos support code, copyright 2006 by
- * Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAcceptClient() - Accept a new client.
- * cupsdCloseAllClients() - Close all remote clients immediately.
- * cupsdCloseClient() - Close a remote client.
- * cupsdFlushHeader() - Flush the header fields to the client.
- * cupsdReadClient() - Read data from a client.
- * cupsdSendCommand() - Send output from a command via HTTP.
- * cupsdSendError() - Send an error message via HTTP.
- * cupsdSendHeader() - Send an HTTP request.
- * cupsdUpdateCGI() - Read status messages from CGI scripts and
- * programs.
- * cupsdWriteClient() - Write data to a client as needed.
- * check_if_modified() - Decode an "If-Modified-Since" line.
- * compare_clients() - Compare two client connections.
- * data_ready() - Check whether data is available from a client.
- * get_file() - Get a filename and state info.
- * install_cupsd_conf() - Install a configuration file.
- * is_cgi() - Is the resource a CGI script/program?
- * is_path_absolute() - Is a path absolute and free of relative elements
- * (i.e. "..").
- * pipe_command() - Pipe the output of a command to the remote
- * client.
- * valid_host() - Is the Host: field valid?
- * write_file() - Send a file via HTTP.
- * write_pipe() - Flag that data is available on the CGI pipe.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
* Include necessary headers...
*/
+#define _CUPS_NO_DEPRECATED
+#define _HTTP_NO_PRIVATE
#include "cupsd.h"
+#ifdef __APPLE__
+# include <libproc.h>
+#endif /* __APPLE__ */
#ifdef HAVE_TCPD_H
# include <tcpd.h>
#endif /* HAVE_TCPD_H */
/*
- * Local globals...
- */
-
-static const char * const http_states[] =
- { /* HTTP state strings */
- "HTTP_WAITING",
- "HTTP_OPTIONS",
- "HTTP_GET",
- "HTTP_GET_SEND",
- "HTTP_HEAD",
- "HTTP_POST",
- "HTTP_POST_RECV",
- "HTTP_POST_SEND",
- "HTTP_PUT",
- "HTTP_PUT_RECV",
- "HTTP_DELETE",
- "HTTP_TRACE",
- "HTTP_CLOSE",
- "HTTP_STATUS"
- };
-static const char * const ipp_states[] =
- { /* IPP state strings */
- "IPP_IDLE",
- "IPP_HEADER",
- "IPP_ATTRIBUTE",
- "IPP_DATA"
- };
-
-
-/*
* Local functions...
*/
@@ -92,9 +40,11 @@ static int check_if_modified(cupsd_client_t *con,
struct stat *filestats);
static int compare_clients(cupsd_client_t *a, cupsd_client_t *b,
void *data);
-static int data_ready(cupsd_client_t *con);
+#ifdef HAVE_SSL
+static int cupsd_start_tls(cupsd_client_t *con, http_encryption_t e);
+#endif /* HAVE_SSL */
static char *get_file(cupsd_client_t *con, struct stat *filestats,
- char *filename, int len);
+ char *filename, size_t len);
static http_status_t install_cupsd_conf(cupsd_client_t *con);
static int is_cgi(cupsd_client_t *con, const char *filename,
struct stat *filestats, mime_type_t *type);
@@ -115,14 +65,12 @@ static void write_pipe(cupsd_client_t *con);
void
cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
{
+ const char *hostname; /* Hostname of client */
+ char name[256]; /* Hostname of client */
int count; /* Count of connections on a host */
- int val; /* Parameter value */
cupsd_client_t *con, /* New client pointer */
*tempcon; /* Temporary client pointer */
- http_addrlist_t *addrlist, /* List of adddresses for host */
- *addr; /* Current address */
socklen_t addrlen; /* Length of address */
- char *hostname; /* Hostname for address */
http_addr_t temp; /* Temporary address variable */
static time_t last_dos = 0; /* Time of last DoS attack */
#ifdef HAVE_TCPD_H
@@ -130,9 +78,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
#endif /* HAVE_TCPD_H */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAcceptClient(lis=%p(%d)) Clients=%d",
- lis, lis->fd, cupsArrayCount(Clients));
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAcceptClient(lis=%p(%d)) Clients=%d", lis, lis->fd, cupsArrayCount(Clients));
/*
* Make sure we don't have a full set of clients already...
@@ -174,19 +120,14 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
return;
}
- con->file = -1;
- con->http.activity = time(NULL);
- con->http.hostaddr = &(con->clientaddr);
- con->http.wait_value = 10000;
-
/*
* Accept the client and get the remote address...
*/
- addrlen = sizeof(http_addr_t);
+ con->number = ++ LastClientNumber;
+ con->file = -1;
- if ((con->http.fd = accept(lis->fd, (struct sockaddr *)con->http.hostaddr,
- &addrlen)) < 0)
+ if ((con->http = httpAcceptConnection(lis->fd, 0)) == NULL)
{
if (errno == ENFILE || errno == EMFILE)
cupsdPauseListening();
@@ -199,23 +140,10 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
}
/*
- * Save the connected port number...
- */
-
- _httpAddrSetPort(con->http.hostaddr, _httpAddrPort(&(lis->address)));
-
-#ifdef AF_INET6
- /*
- * Convert IPv4 over IPv6 addresses (::ffff:n.n.n.n) to IPv4 forms we
- * can more easily use...
+ * Save the connected address and port number...
*/
- if (lis->address.addr.sa_family == AF_INET6 &&
- con->http.hostaddr->ipv6.sin6_addr.s6_addr32[0] == 0 &&
- con->http.hostaddr->ipv6.sin6_addr.s6_addr32[1] == 0 &&
- ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2]) == 0xffff)
- con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2] = 0;
-#endif /* AF_INET6 */
+ con->clientaddr = lis->address;
/*
* Check the number of clients on the same address...
@@ -224,7 +152,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
for (count = 0, tempcon = (cupsd_client_t *)cupsArrayFirst(Clients);
tempcon;
tempcon = (cupsd_client_t *)cupsArrayNext(Clients))
- if (httpAddrEqual(tempcon->http.hostaddr, con->http.hostaddr))
+ if (httpAddrEqual(httpGetAddress(tempcon->http), httpGetAddress(con->http)))
{
count ++;
if (count >= MaxClientsPerHost)
@@ -238,18 +166,12 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
last_dos = time(NULL);
cupsdLogMessage(CUPSD_LOG_WARN,
"Possible DoS attack - more than %d clients connecting "
- "from %s!",
+ "from %s.",
MaxClientsPerHost,
- httpAddrString(con->http.hostaddr, con->http.hostname,
- sizeof(con->http.hostname)));
+ httpGetHostname(con->http, name, sizeof(name)));
}
-#ifdef WIN32
- closesocket(con->http.fd);
-#else
- close(con->http.fd);
-#endif /* WIN32 */
-
+ httpClose(con->http);
free(con);
return;
}
@@ -258,31 +180,10 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
* Get the hostname or format the IP address as needed...
*/
- if (httpAddrLocalhost(con->http.hostaddr))
- {
- /*
- * Map accesses from the loopback interface to "localhost"...
- */
-
- strlcpy(con->http.hostname, "localhost", sizeof(con->http.hostname));
- hostname = con->http.hostname;
- }
+ if (HostNameLookups)
+ hostname = httpResolveHostname(con->http, NULL, 0);
else
- {
- /*
- * Map accesses from the same host to the server name.
- */
-
- if (HostNameLookups)
- hostname = httpAddrLookup(con->http.hostaddr, con->http.hostname,
- sizeof(con->http.hostname));
- else
- {
- hostname = NULL;
- httpAddrString(con->http.hostaddr, con->http.hostname,
- sizeof(con->http.hostname));
- }
- }
+ hostname = httpGetHostname(con->http, NULL, 0);
if (hostname == NULL && HostNameLookups == 2)
{
@@ -290,15 +191,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
* Can't have an unresolved IP address with double-lookups enabled...
*/
-#ifdef WIN32
- closesocket(con->http.fd);
-#else
- close(con->http.fd);
-#endif /* WIN32 */
+ httpClose(con->http);
- cupsdLogMessage(CUPSD_LOG_WARN,
+ cupsdLogClient(con, CUPSD_LOG_WARN,
"Name lookup failed - connection from %s closed!",
- con->http.hostname);
+ httpGetHostname(con->http, NULL, 0));
free(con);
return;
@@ -310,15 +207,17 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
* Do double lookups as needed...
*/
- if ((addrlist = httpAddrGetList(con->http.hostname, AF_UNSPEC, NULL))
- != NULL)
+ http_addrlist_t *addrlist, /* List of addresses */
+ *addr; /* Current address */
+
+ if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, NULL)) != NULL)
{
/*
* See if the hostname maps to the same IP address...
*/
for (addr = addrlist; addr; addr = addr->next)
- if (httpAddrEqual(con->http.hostaddr, &(addr->addr)))
+ if (httpAddrEqual(httpGetAddress(con->http), &(addr->addr)))
break;
}
else
@@ -333,15 +232,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
* with double-lookups enabled...
*/
-#ifdef WIN32
- closesocket(con->http.fd);
-#else
- close(con->http.fd);
-#endif /* WIN32 */
+ httpClose(con->http);
- cupsdLogMessage(CUPSD_LOG_WARN,
+ cupsdLogClient(con, CUPSD_LOG_WARN,
"IP lookup failed - connection from %s closed!",
- con->http.hostname);
+ httpGetHostname(con->http, NULL, 0));
free(con);
return;
}
@@ -352,53 +247,73 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
* See if the connection is denied by TCP wrappers...
*/
- request_init(&wrap_req, RQ_DAEMON, "cupsd", RQ_FILE, con->http.fd, NULL);
+ request_init(&wrap_req, RQ_DAEMON, "cupsd", RQ_FILE, httpGetFd(con->http),
+ NULL);
fromhost(&wrap_req);
if (!hosts_access(&wrap_req))
{
-#ifdef WIN32
- closesocket(con->http.fd);
-#else
- close(con->http.fd);
-#endif /* WIN32 */
+ httpClose(con->http);
- cupsdLogMessage(CUPSD_LOG_WARN,
+ cupsdLogClient(con, CUPSD_LOG_WARN,
"Connection from %s refused by /etc/hosts.allow and "
- "/etc/hosts.deny rules.", con->http.hostname);
+ "/etc/hosts.deny rules.", httpGetHostname(con->http, NULL, 0));
free(con);
return;
}
#endif /* HAVE_TCPD_H */
#ifdef AF_LOCAL
- if (con->http.hostaddr->addr.sa_family == AF_LOCAL)
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Accepted from %s (Domain)",
- con->http.fd, con->http.hostname);
+ if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
+ {
+# ifdef __APPLE__
+ socklen_t peersize; /* Size of peer credentials */
+ pid_t peerpid; /* Peer process ID */
+ char peername[256]; /* Name of process */
+
+ peersize = sizeof(peerpid);
+ if (!getsockopt(httpGetFd(con->http), SOL_LOCAL, LOCAL_PEERPID, &peerpid,
+ &peersize))
+ {
+ if (!proc_name((int)peerpid, peername, sizeof(peername)))
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Accepted from %s (Domain ???[%d])",
+ httpGetHostname(con->http, NULL, 0), (int)peerpid);
+ else
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Accepted from %s (Domain %s[%d])",
+ httpGetHostname(con->http, NULL, 0), peername, (int)peerpid);
+ }
+ else
+# endif /* __APPLE__ */
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Accepted from %s (Domain)",
+ httpGetHostname(con->http, NULL, 0));
+ }
else
#endif /* AF_LOCAL */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Accepted from %s:%d (IPv%d)",
- con->http.fd, con->http.hostname,
- _httpAddrPort(con->http.hostaddr),
- _httpAddrFamily(con->http.hostaddr) == AF_INET ? 4 : 6);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Accepted from %s:%d (IPv%d)",
+ httpGetHostname(con->http, NULL, 0),
+ httpAddrPort(httpGetAddress(con->http)),
+ httpAddrFamily(httpGetAddress(con->http)) == AF_INET ? 4 : 6);
/*
* Get the local address the client connected to...
*/
addrlen = sizeof(temp);
- if (getsockname(con->http.fd, (struct sockaddr *)&temp, &addrlen))
+ if (getsockname(httpGetFd(con->http), (struct sockaddr *)&temp, &addrlen))
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get local address - %s",
- strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get local address - %s",
+ strerror(errno));
- strcpy(con->servername, "localhost");
+ strlcpy(con->servername, "localhost", sizeof(con->servername));
con->serverport = LocalPort;
}
#ifdef AF_LOCAL
- else if (_httpAddrFamily(&temp) == AF_LOCAL)
+ else if (httpAddrFamily(&temp) == AF_LOCAL)
{
- strcpy(con->servername, "localhost");
+ strlcpy(con->servername, "localhost", sizeof(con->servername));
con->serverport = LocalPort;
}
#endif /* AF_LOCAL */
@@ -411,7 +326,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
else
httpAddrString(&temp, con->servername, sizeof(con->servername));
- con->serverport = _httpAddrPort(&(lis->address));
+ con->serverport = httpAddrPort(&(lis->address));
}
/*
@@ -421,25 +336,13 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
cupsArrayAdd(Clients, con);
/*
- * Using TCP_NODELAY improves responsiveness, especially on systems with a slow
- * loopback interface. Since we write large buffers when sending print files
- * and requests there shouldn't be any performance penalty for this...
- */
-
- val = 1;
- setsockopt(con->http.fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
-
- /*
- * Close this file on all execs...
- */
-
- fcntl(con->http.fd, F_SETFD, fcntl(con->http.fd, F_GETFD) | FD_CLOEXEC);
-
- /*
* Add the socket to the server select.
*/
- cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
+ cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, NULL,
+ con);
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for request.");
/*
* Temporarily suspend accept()'s until we lose a client...
@@ -453,15 +356,13 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
* See if we are connecting on a secure port...
*/
- if (lis->encryption == HTTP_ENCRYPT_ALWAYS)
+ if (lis->encryption == HTTP_ENCRYPTION_ALWAYS)
{
/*
* https connection; go secure...
*/
- con->http.encryption = HTTP_ENCRYPT_ALWAYS;
-
- if (!cupsdStartTLS(con))
+ if (cupsd_start_tls(con, HTTP_ENCRYPTION_ALWAYS))
cupsdCloseClient(con);
}
else
@@ -480,8 +381,7 @@ cupsdCloseAllClients(void)
cupsd_client_t *con; /* Current client */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d",
- cupsArrayCount(Clients));
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d", cupsArrayCount(Clients));
for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
con;
@@ -499,36 +399,18 @@ int /* O - 1 if partial close, 0 if fully closed */
cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */
{
int partial; /* Do partial close for SSL? */
-#ifdef HAVE_LIBSSL
-#elif defined(HAVE_GNUTLS)
-# elif defined(HAVE_CDSASSL)
-#endif /* HAVE_LIBSSL */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Closing connection.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing connection.");
/*
* Flush pending writes before closing...
*/
- httpFlushWrite(HTTP(con));
+ httpFlushWrite(con->http);
partial = 0;
-#ifdef HAVE_SSL
- /*
- * Shutdown encryption as needed...
- */
-
- if (con->http.tls)
- {
- partial = 1;
-
- cupsdEndTLS(con);
- }
-#endif /* HAVE_SSL */
-
if (con->pipe_pid != 0)
{
/*
@@ -551,19 +433,31 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */
* Close the socket and clear the file from the input set for select()...
*/
- if (con->http.fd >= 0)
+ if (httpGetFd(con->http) >= 0)
{
cupsArrayRemove(ActiveClients, con);
cupsdSetBusyState();
+#ifdef HAVE_SSL
+ /*
+ * Shutdown encryption as needed...
+ */
+
+ if (httpIsEncrypted(con->http))
+ partial = 1;
+#endif /* HAVE_SSL */
+
if (partial)
{
/*
* Only do a partial close so that the encrypted client gets everything.
*/
- shutdown(con->http.fd, 0);
- cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
+ httpShutdown(con->http);
+ cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient,
+ NULL, con);
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for socket close.");
}
else
{
@@ -571,9 +465,9 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */
* Shut the socket down fully...
*/
- cupsdRemoveSelect(con->http.fd);
- close(con->http.fd);
- con->http.fd = -1;
+ cupsdRemoveSelect(httpGetFd(con->http));
+ httpClose(con->http);
+ con->http = NULL;
}
}
@@ -583,13 +477,16 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */
* Free memory...
*/
- if (con->http.input_set)
- free(con->http.input_set);
+ cupsdRemoveSelect(httpGetFd(con->http));
+
+ httpClose(con->http);
- httpClearCookie(HTTP(con));
- httpClearFields(HTTP(con));
+ if (con->filename)
+ {
+ unlink(con->filename);
+ cupsdClearString(&con->filename);
+ }
- cupsdClearString(&con->filename);
cupsdClearString(&con->command);
cupsdClearString(&con->options);
cupsdClearString(&con->query_string);
@@ -642,21 +539,6 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */
/*
- * 'cupsdFlushHeader()' - Flush the header fields to the client.
- */
-
-int /* I - Bytes written or -1 on error */
-cupsdFlushHeader(cupsd_client_t *con) /* I - Client to flush to */
-{
- int bytes = httpFlushWrite(HTTP(con));
-
- con->http.data_encoding = HTTP_ENCODE_LENGTH;
-
- return (bytes);
-}
-
-
-/*
* 'cupsdReadClient()' - Read data from a client.
*/
@@ -664,11 +546,8 @@ void
cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
{
char line[32768], /* Line from client... */
- operation[64], /* Operation code from socket */
- version[64], /* HTTP version number string */
locale[64], /* Locale */
*ptr; /* Pointer into strings */
- int major, minor; /* HTTP version numbers */
http_status_t status; /* Transfer status */
ipp_state_t ipp_state; /* State of IPP transfer */
int bytes; /* Number of bytes to POST */
@@ -680,25 +559,34 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
static unsigned request_id = 0; /* Request ID for temp files */
- status = HTTP_CONTINUE;
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] cupsdReadClient "
- "error=%d, "
- "used=%d, "
- "state=%s, "
- "data_encoding=HTTP_ENCODE_%s, "
- "data_remaining=" CUPS_LLFMT ", "
- "request=%p(%s), "
- "file=%d",
- con->http.fd, con->http.error, con->http.used,
- http_states[con->http.state],
- con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
- "CHUNKED" : "LENGTH",
- CUPS_LLCAST con->http.data_remaining,
- con->request,
- con->request ? ipp_states[con->request->state] : "",
- con->file);
+ status = HTTP_STATUS_CONTINUE;
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdReadClient: error=%d, used=%d, state=%s, data_encoding=HTTP_ENCODING_%s, data_remaining=" CUPS_LLFMT ", request=%p(%s), file=%d", httpError(con->http), (int)httpGetReady(con->http), httpStateString(httpGetState(con->http)), httpIsChunked(con->http) ? "CHUNKED" : "LENGTH", CUPS_LLCAST httpGetRemaining(con->http), con->request, con->request ? ippStateString(ippGetState(con->request)) : "", con->file);
+
+ if (httpGetState(con->http) == HTTP_STATE_GET_SEND ||
+ httpGetState(con->http) == HTTP_STATE_POST_SEND ||
+ httpGetState(con->http) == HTTP_STATE_STATUS)
+ {
+ /*
+ * If we get called in the wrong state, then something went wrong with the
+ * connection and we need to shut it down...
+ */
+
+ if (!httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1)
+ {
+ /*
+ * Connection closed...
+ */
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on EOF.");
+ cupsdCloseClient(con);
+ return;
+ }
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on unexpected HTTP read state %s.", httpStateString(httpGetState(con->http)));
+ cupsdCloseClient(con);
+ return;
+ }
#ifdef HAVE_SSL
if (con->auto_ssl)
@@ -709,18 +597,16 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
con->auto_ssl = 0;
- if (recv(con->http.fd, buf, 1, MSG_PEEK) == 1 &&
+ if (recv(httpGetFd(con->http), buf, 1, MSG_PEEK) == 1 &&
(!buf[0] || !strchr("DGHOPT", buf[0])))
{
/*
* Encrypt this connection...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] Saw first byte %02X, auto-negotiating "
- "SSL/TLS session.", con->http.fd, buf[0] & 255);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "Saw first byte %02X, auto-negotiating SSL/TLS session.", buf[0] & 255);
- if (!cupsdStartTLS(con))
+ if (cupsd_start_tls(con, HTTP_ENCRYPTION_ALWAYS))
cupsdCloseClient(con);
return;
@@ -728,24 +614,26 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
#endif /* HAVE_SSL */
- switch (con->http.state)
+ switch (httpGetState(con->http))
{
- case HTTP_WAITING :
+ case HTTP_STATE_WAITING :
/*
* See if we've received a request line...
*/
- if (httpGets(line, sizeof(line) - 1, HTTP(con)) == NULL)
+ con->operation = httpReadRequest(con->http, con->uri, sizeof(con->uri));
+ if (con->operation == HTTP_STATE_ERROR ||
+ con->operation == HTTP_STATE_UNKNOWN_METHOD ||
+ con->operation == HTTP_STATE_UNKNOWN_VERSION)
{
- if (con->http.error && con->http.error != EPIPE)
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] HTTP_WAITING Closing for error %d "
- "(%s)", con->http.fd, con->http.error,
- strerror(con->http.error));
+ if (httpError(con->http))
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "HTTP_STATE_WAITING Closing for error %d (%s)",
+ httpError(con->http), strerror(httpError(con->http)));
else
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] HTTP_WAITING Closing on EOF",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "HTTP_STATE_WAITING Closing on error: %s",
+ cupsLastErrorString());
cupsdCloseClient(con);
return;
@@ -755,29 +643,19 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Ignore blank request lines...
*/
- if (line[0] == '\0')
+ if (con->operation == HTTP_STATE_WAITING)
break;
/*
* Clear other state variables...
*/
- httpClearFields(HTTP(con));
-
- con->http.activity = time(NULL);
- con->http.version = HTTP_1_0;
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
- con->http.data_encoding = HTTP_ENCODE_LENGTH;
- con->http.data_remaining = 0;
- con->http._data_remaining = 0;
- con->operation = HTTP_WAITING;
- con->bytes = 0;
- con->file = -1;
- con->file_ready = 0;
- con->pipe_pid = 0;
- con->username[0] = '\0';
- con->password[0] = '\0';
- con->uri[0] = '\0';
+ con->bytes = 0;
+ con->file = -1;
+ con->file_ready = 0;
+ con->pipe_pid = 0;
+ con->username[0] = '\0';
+ con->password[0] = '\0';
cupsdClearString(&con->command);
cupsdClearString(&con->options);
@@ -807,62 +685,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
#endif /* HAVE_GSSAPI */
/*
- * Grab the request line...
- */
-
- switch (sscanf(line, "%63s%1023s%63s", operation, con->uri, version))
- {
- case 1 :
- if (line[0])
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Bad request line \"%s\" from %s.",
- con->http.fd,
- _httpEncodeURI(buf, line, sizeof(buf)),
- con->http.hostname);
- cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
- cupsdCloseClient(con);
- }
- return;
- case 2 :
- con->http.version = HTTP_0_9;
- break;
- case 3 :
- if (sscanf(version, "HTTP/%d.%d", &major, &minor) != 2)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Bad request line \"%s\" from %s.",
- con->http.fd,
- _httpEncodeURI(buf, line, sizeof(buf)),
- con->http.hostname);
- cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
- cupsdCloseClient(con);
- return;
- }
-
- if (major < 2)
- {
- con->http.version = (http_version_t)(major * 100 + minor);
- if (con->http.version == HTTP_1_1 && KeepAlive)
- con->http.keep_alive = HTTP_KEEPALIVE_ON;
- else
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unsupported request line \"%s\" "
- "from %s.", con->http.fd,
- _httpEncodeURI(buf, line, sizeof(buf)),
- con->http.hostname);
- cupsdSendError(con, HTTP_NOT_SUPPORTED, CUPSD_AUTH_NONE);
- cupsdCloseClient(con);
- return;
- }
- break;
- }
-
- /*
* Handle full URLs in the request line...
*/
@@ -874,18 +696,24 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
resource[HTTP_MAX_URI]; /* Resource path */
int port; /* Port number */
-
/*
* Separate the URI into its components...
*/
- httpSeparateURI(HTTP_URI_CODING_MOST, con->uri,
- scheme, sizeof(scheme),
- userpass, sizeof(userpass),
- hostname, sizeof(hostname), &port,
- resource, sizeof(resource));
+ if (httpSeparateURI(HTTP_URI_CODING_MOST, con->uri,
+ scheme, sizeof(scheme),
+ userpass, sizeof(userpass),
+ hostname, sizeof(hostname), &port,
+ resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ {
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Bad URI \"%s\" in request.",
+ con->uri);
+ cupsdSendError(con, HTTP_STATUS_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
+ }
- /*
+ /*
* Only allow URIs with the servername, localhost, or an IP
* address...
*/
@@ -893,16 +721,16 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (strcmp(scheme, "file") &&
_cups_strcasecmp(hostname, ServerName) &&
_cups_strcasecmp(hostname, "localhost") &&
+ !cupsArrayFind(ServerAlias, hostname) &&
!isdigit(hostname[0]) && hostname[0] != '[')
{
/*
* Nope, we don't do proxies...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Bad URI \"%s\" in request.",
- con->http.fd, con->uri);
- cupsdSendError(con, HTTP_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Bad URI \"%s\" in request.",
+ con->uri);
+ cupsdSendError(con, HTTP_STATUS_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
}
@@ -912,45 +740,19 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* con->uri are HTTP_MAX_URI bytes in size...
*/
- strcpy(con->uri, resource);
+ strlcpy(con->uri, resource, sizeof(con->uri));
}
/*
* Process the request...
*/
- if (!strcmp(operation, "GET"))
- con->http.state = HTTP_GET;
- else if (!strcmp(operation, "PUT"))
- con->http.state = HTTP_PUT;
- else if (!strcmp(operation, "POST"))
- con->http.state = HTTP_POST;
- else if (!strcmp(operation, "DELETE"))
- con->http.state = HTTP_DELETE;
- else if (!strcmp(operation, "TRACE"))
- con->http.state = HTTP_TRACE;
- else if (!strcmp(operation, "OPTIONS"))
- con->http.state = HTTP_OPTIONS;
- else if (!strcmp(operation, "HEAD"))
- con->http.state = HTTP_HEAD;
- else
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Bad operation \"%s\".", con->http.fd,
- operation);
- cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
- cupsdCloseClient(con);
- return;
- }
-
gettimeofday(&(con->start), NULL);
- con->operation = con->http.state;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %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;
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "%s %s HTTP/%d.%d",
+ httpStateString(con->operation) + 11, con->uri,
+ httpGetVersion(con->http) / 100,
+ httpGetVersion(con->http) % 100);
if (!cupsArrayFind(ActiveClients, con))
{
@@ -958,49 +760,45 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
cupsdSetBusyState();
}
- case HTTP_OPTIONS :
- case HTTP_DELETE :
- case HTTP_GET :
- case HTTP_HEAD :
- case HTTP_POST :
- case HTTP_PUT :
- case HTTP_TRACE :
+ case HTTP_STATE_OPTIONS :
+ case HTTP_STATE_DELETE :
+ case HTTP_STATE_GET :
+ case HTTP_STATE_HEAD :
+ case HTTP_STATE_POST :
+ case HTTP_STATE_PUT :
+ case HTTP_STATE_TRACE :
/*
* Parse incoming parameters until the status changes...
*/
- while ((status = httpUpdate(HTTP(con))) == HTTP_CONTINUE)
- if (!data_ready(con))
+ while ((status = httpUpdate(con->http)) == HTTP_STATUS_CONTINUE)
+ if (!httpGetReady(con->http))
break;
- if (status != HTTP_OK && status != HTTP_CONTINUE)
+ if (status != HTTP_STATUS_OK && status != HTTP_STATUS_CONTINUE)
{
- if (con->http.error && con->http.error != EPIPE)
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing for error %d (%s) while "
- "reading headers.",
- con->http.fd, con->http.error,
- strerror(con->http.error));
+ if (httpError(con->http) && httpError(con->http) != EPIPE)
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Closing for error %d (%s) while reading headers.",
+ httpError(con->http), strerror(httpError(con->http)));
else
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing on EOF while reading headers.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Closing on EOF while reading headers.");
- cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
}
break;
default :
- if (!data_ready(con) && recv(con->http.fd, buf, 1, MSG_PEEK) < 1)
+ if (!httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1)
{
/*
* Connection closed...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing on EOF", con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on EOF.");
cupsdCloseClient(con);
return;
}
@@ -1011,24 +809,26 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Handle new transfers...
*/
- if (status == HTTP_OK)
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Read: status=%d", status);
+
+ if (status == HTTP_STATUS_OK)
{
- if (con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE][0])
+ if (httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE)[0])
{
/*
* Figure out the locale from the Accept-Language and Content-Type
* fields...
*/
- if ((ptr = strchr(con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE],
+ if ((ptr = strchr(httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE),
',')) != NULL)
*ptr = '\0';
- if ((ptr = strchr(con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE],
+ if ((ptr = strchr(httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE),
';')) != NULL)
*ptr = '\0';
- if ((ptr = strstr(con->http.fields[HTTP_FIELD_CONTENT_TYPE],
+ if ((ptr = strstr(httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE),
"charset=")) != NULL)
{
/*
@@ -1037,14 +837,14 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
*/
snprintf(locale, sizeof(locale), "%s.%s",
- con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], ptr + 8);
+ httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE), ptr + 8);
if ((ptr = strchr(locale, ',')) != NULL)
*ptr = '\0';
}
else
snprintf(locale, sizeof(locale), "%s.UTF-8",
- con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE]);
+ httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE));
con->language = cupsLangGet(locale);
}
@@ -1053,25 +853,23 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
cupsdAuthorize(con);
- if (!_cups_strncasecmp(con->http.fields[HTTP_FIELD_CONNECTION],
+ if (!_cups_strncasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION),
"Keep-Alive", 10) && KeepAlive)
- con->http.keep_alive = HTTP_KEEPALIVE_ON;
- else if (!_cups_strncasecmp(con->http.fields[HTTP_FIELD_CONNECTION],
+ httpSetKeepAlive(con->http, HTTP_KEEPALIVE_ON);
+ else if (!_cups_strncasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION),
"close", 5))
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+ httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
- if (!con->http.fields[HTTP_FIELD_HOST][0] &&
- con->http.version >= HTTP_1_1)
+ if (!httpGetField(con->http, HTTP_FIELD_HOST)[0] &&
+ httpGetVersion(con->http) >= HTTP_VERSION_1_1)
{
/*
* HTTP/1.1 and higher require the "Host:" field...
*/
- if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Missing Host: field in request.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Missing Host: field in request.");
cupsdCloseClient(con);
return;
}
@@ -1083,18 +881,17 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* or IPv6 values in the Host: field.
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Request from \"%s\" using invalid Host: "
- "field \"%s\"", con->http.fd, con->http.hostname,
- con->http.fields[HTTP_FIELD_HOST]);
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Request from \"%s\" using invalid Host: field \"%s\".",
+ httpGetHostname(con->http, NULL, 0), httpGetField(con->http, HTTP_FIELD_HOST));
- if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
}
- else if (con->operation == HTTP_OPTIONS)
+ else if (con->operation == HTTP_STATE_OPTIONS)
{
/*
* Do OPTIONS command...
@@ -1102,45 +899,37 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (con->best && con->best->type != CUPSD_AUTH_NONE)
{
- if (!cupsdSendHeader(con, HTTP_UNAUTHORIZED, NULL, CUPSD_AUTH_NONE))
+ httpClearFields(con->http);
+
+ if (!cupsdSendHeader(con, HTTP_STATUS_UNAUTHORIZED, NULL, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
}
- if (!_cups_strcasecmp(con->http.fields[HTTP_FIELD_CONNECTION], "Upgrade") &&
- con->http.tls == NULL)
+ if (!_cups_strcasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION), "Upgrade") && strstr(httpGetField(con->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(con->http))
{
#ifdef HAVE_SSL
/*
* Do encryption stuff...
*/
- if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
-
- httpPrintf(HTTP(con), "Connection: Upgrade\r\n");
- httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n");
- httpPrintf(HTTP(con), "Content-Length: 0\r\n");
- httpPrintf(HTTP(con), "\r\n");
+ httpClearFields(con->http);
- if (cupsdFlushHeader(con) < 0)
- {
+ if (!cupsdSendHeader(con, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE))
+ {
cupsdCloseClient(con);
return;
}
- if (!cupsdStartTLS(con))
+ if (cupsd_start_tls(con, HTTP_ENCRYPTION_REQUIRED))
{
cupsdCloseClient(con);
return;
}
#else
- if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1148,17 +937,12 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
#endif /* HAVE_SSL */
}
- if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
-
- httpPrintf(HTTP(con), "Allow: GET, HEAD, OPTIONS, POST, PUT\r\n");
- httpPrintf(HTTP(con), "Content-Length: 0\r\n");
- httpPrintf(HTTP(con), "\r\n");
+ httpClearFields(con->http);
+ httpSetField(con->http, HTTP_FIELD_ALLOW,
+ "GET, HEAD, OPTIONS, POST, PUT");
+ httpSetField(con->http, HTTP_FIELD_CONTENT_LENGTH, "0");
- if (cupsdFlushHeader(con) < 0)
+ if (!cupsdSendHeader(con, HTTP_STATUS_OK, NULL, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1170,11 +954,10 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Protect against malicious users!
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Request for non-absolute resource \"%s\".",
- con->http.fd, con->uri);
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Request for non-absolute resource \"%s\".", con->uri);
- if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1182,39 +965,30 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
else
{
- if (!_cups_strcasecmp(con->http.fields[HTTP_FIELD_CONNECTION],
- "Upgrade") && con->http.tls == NULL)
+ if (!_cups_strcasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION),
+ "Upgrade") && !httpIsEncrypted(con->http))
{
#ifdef HAVE_SSL
/*
* Do encryption stuff...
*/
- if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL,
+ httpClearFields(con->http);
+
+ if (!cupsdSendHeader(con, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL,
CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
- httpPrintf(HTTP(con), "Connection: Upgrade\r\n");
- httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n");
- httpPrintf(HTTP(con), "Content-Length: 0\r\n");
- httpPrintf(HTTP(con), "\r\n");
-
- if (cupsdFlushHeader(con) < 0)
- {
- cupsdCloseClient(con);
- return;
- }
-
- if (!cupsdStartTLS(con))
+ if (cupsd_start_tls(con, HTTP_ENCRYPTION_REQUIRED))
{
cupsdCloseClient(con);
return;
}
#else
- if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1222,23 +996,23 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
#endif /* HAVE_SSL */
}
- if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_OK)
+ if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_STATUS_OK)
{
cupsdSendError(con, status, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
}
- if (con->http.expect &&
- (con->operation == HTTP_POST || con->operation == HTTP_PUT))
+ if (httpGetExpect(con->http) &&
+ (con->operation == HTTP_STATE_POST || con->operation == HTTP_STATE_PUT))
{
- if (con->http.expect == HTTP_CONTINUE)
+ if (httpGetExpect(con->http) == HTTP_STATUS_CONTINUE)
{
/*
* Send 100-continue header...
*/
- if (!cupsdSendHeader(con, HTTP_CONTINUE, NULL, CUPSD_AUTH_NONE))
+ if (httpWriteResponse(con->http, HTTP_STATUS_CONTINUE))
{
cupsdCloseClient(con);
return;
@@ -1250,29 +1024,23 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Send 417-expectation-failed header...
*/
- if (!cupsdSendHeader(con, HTTP_EXPECTATION_FAILED, NULL,
- CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
-
- httpPrintf(HTTP(con), "Content-Length: 0\r\n");
- httpPrintf(HTTP(con), "\r\n");
+ httpClearFields(con->http);
+ httpSetField(con->http, HTTP_FIELD_CONTENT_LENGTH, "0");
- if (cupsdFlushHeader(con) < 0)
- {
- cupsdCloseClient(con);
- return;
- }
+ cupsdSendError(con, HTTP_STATUS_EXPECTATION_FAILED, CUPSD_AUTH_NONE);
+ cupsdCloseClient(con);
+ return;
}
}
- switch (con->http.state)
+ switch (httpGetState(con->http))
{
- case HTTP_GET_SEND :
+ case HTTP_STATE_GET_SEND :
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Processing GET %s", con->uri);
+
if ((!strncmp(con->uri, "/ppd/", 5) ||
- !strncmp(con->uri, "/printers/", 10)) &&
+ !strncmp(con->uri, "/printers/", 10) ||
+ !strncmp(con->uri, "/classes/", 9)) &&
!strcmp(con->uri + strlen(con->uri) - 4, ".ppd"))
{
/*
@@ -1284,8 +1052,36 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (!strncmp(con->uri, "/ppd/", 5))
p = cupsdFindPrinter(con->uri + 5);
- else
+ else if (!strncmp(con->uri, "/printers/", 10))
p = cupsdFindPrinter(con->uri + 10);
+ else
+ {
+ p = cupsdFindClass(con->uri + 9);
+
+ if (p)
+ {
+ int i; /* Looping var */
+
+ for (i = 0; i < p->num_printers; i ++)
+ {
+ if (!(p->printers[i]->type & CUPS_PRINTER_CLASS))
+ {
+ char ppdname[1024];/* PPD filename */
+
+ snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd",
+ ServerRoot, p->printers[i]->name);
+ if (!access(ppdname, 0))
+ {
+ p = p->printers[i];
+ break;
+ }
+ }
+ }
+
+ if (i >= p->num_printers)
+ p = NULL;
+ }
+ }
if (p)
{
@@ -1293,7 +1089,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
else
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1319,13 +1115,39 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
else if (!strncmp(con->uri, "/printers/", 10))
p = cupsdFindPrinter(con->uri + 10);
else
- p = cupsdFindClass(con->uri + 9);
+ {
+ p = cupsdFindClass(con->uri + 9);
+
+ if (p)
+ {
+ int i; /* Looping var */
+
+ for (i = 0; i < p->num_printers; i ++)
+ {
+ if (!(p->printers[i]->type & CUPS_PRINTER_CLASS))
+ {
+ char ppdname[1024];/* PPD filename */
+
+ snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd",
+ ServerRoot, p->printers[i]->name);
+ if (!access(ppdname, 0))
+ {
+ p = p->printers[i];
+ break;
+ }
+ }
+ }
+
+ if (i >= p->num_printers)
+ p = NULL;
+ }
+ }
if (p)
snprintf(con->uri, sizeof(con->uri), "/icons/%s.png", p->name);
else
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1340,7 +1162,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Web interface is disabled. Show an appropriate message...
*/
- if (!cupsdSendError(con, HTTP_WEBIF_DISABLED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_CUPS_WEBIF_DISABLED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1411,17 +1233,17 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (!cupsdSendCommand(con, con->command, con->options, 0))
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
}
else
- cupsdLogRequest(con, HTTP_OK);
+ cupsdLogRequest(con, HTTP_STATUS_OK);
- if (con->http.version <= HTTP_1_0)
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+ if (httpGetVersion(con->http) <= HTTP_VERSION_1_0)
+ httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
}
else if ((!strncmp(con->uri, "/admin/conf/", 12) &&
(strchr(con->uri + 12, '/') ||
@@ -1435,10 +1257,10 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* /admin/conf...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
"Request for subdirectory \"%s\"!", con->uri);
- if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1455,7 +1277,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if ((filename = get_file(con, &filestats, buf,
sizeof(buf))) == NULL)
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1466,6 +1288,8 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
type = mimeFileType(MimeDatabase, filename, NULL, NULL);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "filename=\"%s\", type=%s/%s", filename, type ? type->super : "", type ? type->type : "");
+
if (is_cgi(con, filename, &filestats, type))
{
/*
@@ -1475,23 +1299,23 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (!cupsdSendCommand(con, con->command, con->options, 0))
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
}
else
- cupsdLogRequest(con, HTTP_OK);
+ cupsdLogRequest(con, HTTP_STATUS_OK);
- if (con->http.version <= HTTP_1_0)
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+ if (httpGetVersion(con->http) <= HTTP_VERSION_1_0)
+ httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
break;
}
if (!check_if_modified(con, &filestats))
{
- if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_MODIFIED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1500,11 +1324,11 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
else
{
if (type == NULL)
- strcpy(line, "text/plain");
+ strlcpy(line, "text/plain", sizeof(line));
else
snprintf(line, sizeof(line), "%s/%s", type->super, type->type);
- if (!write_file(con, HTTP_OK, filename, line, &filestats))
+ if (!write_file(con, HTTP_STATUS_OK, filename, line, &filestats))
{
cupsdCloseClient(con);
return;
@@ -1513,21 +1337,21 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
break;
- case HTTP_POST_RECV :
+ case HTTP_STATE_POST_RECV :
/*
* See if the POST request includes a Content-Length field, and if
* so check the length against any limits that are set...
*/
- if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
+ if (httpGetField(con->http, HTTP_FIELD_CONTENT_LENGTH)[0] &&
MaxRequestSize > 0 &&
- con->http.data_remaining > MaxRequestSize)
+ httpGetLength2(con->http) > MaxRequestSize)
{
/*
* Request too large...
*/
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1535,15 +1359,13 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
break;
}
- else if (con->http.data_remaining < 0 ||
- (!con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
- con->http.data_encoding == HTTP_ENCODE_LENGTH))
+ else if (httpGetLength2(con->http) < 0)
{
/*
* Negative content lengths are invalid!
*/
- if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1557,7 +1379,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* content-type field will be "application/ipp"...
*/
- if (!strcmp(con->http.fields[HTTP_FIELD_CONTENT_TYPE],
+ if (!strcmp(httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE),
"application/ipp"))
con->request = ippNew();
else if (!WebInterface)
@@ -1566,7 +1388,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Web interface is disabled. Show an appropriate message...
*/
- if (!cupsdSendError(con, HTTP_WEBIF_DISABLED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_CUPS_WEBIF_DISABLED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1634,8 +1456,8 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
cupsdSetString(&con->options, NULL);
}
- if (con->http.version <= HTTP_1_0)
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+ if (httpGetVersion(con->http) <= HTTP_VERSION_1_0)
+ httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
}
else
{
@@ -1646,7 +1468,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if ((filename = get_file(con, &filestats, buf,
sizeof(buf))) == NULL)
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1663,7 +1485,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Only POST to CGI's...
*/
- if (!cupsdSendError(con, HTTP_UNAUTHORIZED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_UNAUTHORIZED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1672,7 +1494,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
break;
- case HTTP_PUT_RECV :
+ case HTTP_STATE_PUT_RECV :
/*
* Validate the resource name...
*/
@@ -1683,11 +1505,10 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* PUT can only be done to the cupsd.conf file...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Disallowed PUT request for \"%s\".",
- con->http.fd, con->uri);
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Disallowed PUT request for \"%s\".", con->uri);
- if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1701,15 +1522,15 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* so check the length against any limits that are set...
*/
- if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
+ if (httpGetField(con->http, HTTP_FIELD_CONTENT_LENGTH)[0] &&
MaxRequestSize > 0 &&
- con->http.data_remaining > MaxRequestSize)
+ httpGetLength2(con->http) > MaxRequestSize)
{
/*
* Request too large...
*/
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1717,13 +1538,13 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
break;
}
- else if (con->http.data_remaining < 0)
+ else if (httpGetLength2(con->http) < 0)
{
/*
* Negative content lengths are invalid!
*/
- if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1742,12 +1563,11 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (con->file < 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to create request file "
- "\"%s\": %s", con->http.fd, con->filename,
- strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Unable to create request file \"%s\": %s",
+ con->filename, strerror(errno));
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -1759,13 +1579,13 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
break;
- case HTTP_DELETE :
- case HTTP_TRACE :
- cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE);
+ case HTTP_STATE_DELETE :
+ case HTTP_STATE_TRACE :
+ cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
- case HTTP_HEAD :
+ case HTTP_STATE_HEAD :
if (!strncmp(con->uri, "/printers/", 10) &&
!strcmp(con->uri + strlen(con->uri) - 4, ".ppd"))
{
@@ -1780,12 +1600,13 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
snprintf(con->uri, sizeof(con->uri), "/ppd/%s.ppd", p->name);
else
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
+ cupsdLogRequest(con, HTTP_STATUS_NOT_FOUND);
break;
}
}
@@ -1803,36 +1624,27 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
snprintf(con->uri, sizeof(con->uri), "/icons/%s.png", p->name);
else
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
+ cupsdLogRequest(con, HTTP_STATUS_NOT_FOUND);
break;
}
}
else if (!WebInterface)
{
- if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
-
- if (httpPrintf(HTTP(con), "\r\n") < 0)
- {
- cupsdCloseClient(con);
- return;
- }
+ httpClearFields(con->http);
- if (cupsdFlushHeader(con) < 0)
+ if (!cupsdSendHeader(con, HTTP_STATUS_OK, NULL, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
- con->http.state = HTTP_WAITING;
+ cupsdLogRequest(con, HTTP_STATUS_OK);
break;
}
@@ -1848,25 +1660,15 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* CGI output...
*/
- if (!cupsdSendHeader(con, HTTP_OK, "text/html", CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
-
- if (httpPrintf(HTTP(con), "\r\n") < 0)
- {
- cupsdCloseClient(con);
- return;
- }
+ httpClearFields(con->http);
- if (cupsdFlushHeader(con) < 0)
+ if (!cupsdSendHeader(con, HTTP_STATUS_OK, "text/html", CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
- cupsdLogRequest(con, HTTP_OK);
+ cupsdLogRequest(con, HTTP_STATUS_OK);
}
else if ((!strncmp(con->uri, "/admin/conf/", 12) &&
(strchr(con->uri + 12, '/') ||
@@ -1880,39 +1682,41 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* /admin/conf...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Request for subdirectory \"%s\".",
- con->http.fd, con->uri);
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Request for subdirectory \"%s\".", con->uri);
- if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
+ cupsdLogRequest(con, HTTP_STATUS_FORBIDDEN);
break;
}
else if ((filename = get_file(con, &filestats, buf,
sizeof(buf))) == NULL)
{
- if (!cupsdSendHeader(con, HTTP_NOT_FOUND, "text/html",
+ httpClearFields(con->http);
+
+ if (!cupsdSendHeader(con, HTTP_STATUS_NOT_FOUND, "text/html",
CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
- cupsdLogRequest(con, HTTP_NOT_FOUND);
+ cupsdLogRequest(con, HTTP_STATUS_NOT_FOUND);
}
else if (!check_if_modified(con, &filestats))
{
- if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_MODIFIED, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
- cupsdLogRequest(con, HTTP_NOT_MODIFIED);
+ cupsdLogRequest(con, HTTP_STATUS_NOT_MODIFIED);
}
else
{
@@ -1922,46 +1726,24 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
type = mimeFileType(MimeDatabase, filename, NULL, NULL);
if (type == NULL)
- strcpy(line, "text/plain");
+ strlcpy(line, "text/plain", sizeof(line));
else
snprintf(line, sizeof(line), "%s/%s", type->super, type->type);
- if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
+ httpClearFields(con->http);
- if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n",
- httpGetDateString(filestats.st_mtime)) < 0)
- {
- cupsdCloseClient(con);
- return;
- }
+ httpSetField(con->http, HTTP_FIELD_LAST_MODIFIED,
+ httpGetDateString(filestats.st_mtime));
+ httpSetLength(con->http, (size_t)filestats.st_size);
- if (httpPrintf(HTTP(con), "Content-Length: %lu\r\n",
- (unsigned long)filestats.st_size) < 0)
+ if (!cupsdSendHeader(con, HTTP_STATUS_OK, line, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
- cupsdLogRequest(con, HTTP_OK);
- }
-
- if (httpPrintf(HTTP(con), "\r\n") < 0)
- {
- cupsdCloseClient(con);
- return;
- }
-
- if (cupsdFlushHeader(con) < 0)
- {
- cupsdCloseClient(con);
- return;
+ cupsdLogRequest(con, HTTP_STATUS_OK);
}
-
- con->http.state = HTTP_WAITING;
break;
default :
@@ -1974,22 +1756,20 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Handle any incoming data...
*/
- switch (con->http.state)
+ switch (httpGetState(con->http))
{
- case HTTP_PUT_RECV :
+ case HTTP_STATE_PUT_RECV :
do
{
- if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0)
+ if ((bytes = httpRead2(con->http, line, sizeof(line))) < 0)
{
- if (con->http.error && con->http.error != EPIPE)
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] HTTP_PUT_RECV Closing for error "
- "%d (%s)", con->http.fd, con->http.error,
- strerror(con->http.error));
+ if (httpError(con->http) && httpError(con->http) != EPIPE)
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "HTTP_STATE_PUT_RECV Closing for error %d (%s)",
+ httpError(con->http), strerror(httpError(con->http)));
else
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] HTTP_PUT_RECV Closing on EOF",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "HTTP_STATE_PUT_RECV Closing on EOF.");
cupsdCloseClient(con);
return;
@@ -1998,29 +1778,47 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
{
con->bytes += bytes;
- if (write(con->file, line, bytes) < bytes)
+ if (MaxRequestSize > 0 && con->bytes > MaxRequestSize)
+ {
+ close(con->file);
+ con->file = -1;
+ unlink(con->filename);
+ cupsdClearString(&con->filename);
+
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+ }
+ }
+
+ if (write(con->file, line, (size_t)bytes) < bytes)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to write %d bytes to "
- "\"%s\": %s", con->http.fd, bytes, con->filename,
- strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Unable to write %d bytes to \"%s\": %s", bytes,
+ con->filename, strerror(errno));
close(con->file);
con->file = -1;
unlink(con->filename);
cupsdClearString(&con->filename);
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
}
}
+ else if (httpGetState(con->http) == HTTP_STATE_PUT_RECV)
+ {
+ cupsdCloseClient(con);
+ return;
+ }
}
- while (con->http.state == HTTP_PUT_RECV && data_ready(con));
+ while (httpGetState(con->http) == HTTP_STATE_PUT_RECV && httpGetReady(con->http));
- if (con->http.state == HTTP_WAITING)
+ if (httpGetState(con->http) == HTTP_STATE_STATUS)
{
/*
* End of file, see how big it is...
@@ -2041,7 +1839,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
unlink(con->filename);
cupsdClearString(&con->filename);
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -2066,7 +1864,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
break;
- case HTTP_POST_RECV :
+ case HTTP_STATE_POST_RECV :
do
{
if (con->request && con->file < 0)
@@ -2075,39 +1873,43 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* Grab any request data from the connection...
*/
- if ((ipp_state = ippRead(&(con->http), con->request)) == IPP_ERROR)
+ if (!httpWait(con->http, 0))
+ return;
+
+ if ((ipp_state = ippRead(con->http, con->request)) == IPP_STATE_ERROR)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] IPP read error: %s", con->http.fd,
- cupsLastErrorString());
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "IPP read error: %s",
+ cupsLastErrorString());
- cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
}
- else if (ipp_state != IPP_DATA)
+ else if (ipp_state != IPP_STATE_DATA)
{
- if (con->http.state == HTTP_POST_SEND)
+ if (httpGetState(con->http) == HTTP_STATE_POST_SEND)
{
- cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+ cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
}
+ if (httpGetReady(con->http))
+ continue;
break;
}
else
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] %d.%d %s %d",
- con->http.fd, con->request->request.op.version[0],
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "%d.%d %s %d",
+ con->request->request.op.version[0],
con->request->request.op.version[1],
ippOpString(con->request->request.op.operation_id),
con->request->request.op.request_id);
- con->bytes += ippLength(con->request);
+ con->bytes += (off_t)ippLength(con->request);
}
}
- if (con->file < 0 && con->http.state != HTTP_POST_SEND)
+ if (con->file < 0 && httpGetState(con->http) != HTTP_STATE_POST_SEND)
{
/*
* Create a file as needed for the request data...
@@ -2119,12 +1921,11 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (con->file < 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to create request file "
- "\"%s\": %s", con->http.fd, con->filename,
- strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Unable to create request file \"%s\": %s",
+ con->filename, strerror(errno));
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -2136,19 +1937,19 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
}
- if (con->http.state != HTTP_POST_SEND)
+ if (httpGetState(con->http) != HTTP_STATE_POST_SEND)
{
- if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0)
+ if (!httpWait(con->http, 0))
+ return;
+ else if ((bytes = httpRead2(con->http, line, sizeof(line))) < 0)
{
- if (con->http.error && con->http.error != EPIPE)
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] HTTP_POST_SEND Closing for "
- "error %d (%s)", con->http.fd, con->http.error,
- strerror(con->http.error));
+ if (httpError(con->http) && httpError(con->http) != EPIPE)
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "HTTP_STATE_POST_SEND Closing for error %d (%s)",
+ httpError(con->http), strerror(httpError(con->http)));
else
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] HTTP_POST_SEND Closing on EOF",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "HTTP_STATE_POST_SEND Closing on EOF.");
cupsdCloseClient(con);
return;
@@ -2157,19 +1958,32 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
{
con->bytes += bytes;
- if (write(con->file, line, bytes) < bytes)
+ if (MaxRequestSize > 0 && con->bytes > MaxRequestSize)
+ {
+ close(con->file);
+ con->file = -1;
+ unlink(con->filename);
+ cupsdClearString(&con->filename);
+
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+ }
+ }
+
+ if (write(con->file, line, (size_t)bytes) < bytes)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to write %d bytes to "
- "\"%s\": %s", con->http.fd, bytes,
- con->filename, strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Unable to write %d bytes to \"%s\": %s",
+ bytes, con->filename, strerror(errno));
close(con->file);
con->file = -1;
unlink(con->filename);
cupsdClearString(&con->filename);
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE,
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE,
CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
@@ -2177,21 +1991,21 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
}
}
}
- else if (con->http.state == HTTP_POST_RECV)
+ else if (httpGetState(con->http) == HTTP_STATE_POST_RECV)
return;
- else if (con->http.state != HTTP_POST_SEND)
+ else if (httpGetState(con->http) != HTTP_STATE_POST_SEND)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing on unexpected state %s.",
- con->http.fd, http_states[con->http.state]);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Closing on unexpected state %s.",
+ httpStateString(httpGetState(con->http)));
cupsdCloseClient(con);
return;
}
}
}
- while (con->http.state == HTTP_POST_RECV && data_ready(con));
+ while (httpGetState(con->http) == HTTP_STATE_POST_RECV && httpGetReady(con->http));
- if (con->http.state == HTTP_POST_SEND)
+ if (httpGetState(con->http) == HTTP_STATE_POST_SEND)
{
if (con->file >= 0)
{
@@ -2220,7 +2034,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
con->request = NULL;
}
- if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
@@ -2240,14 +2054,14 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
{
if (!cupsdSendCommand(con, con->command, con->options, 0))
{
- if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+ if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
{
cupsdCloseClient(con);
return;
}
}
else
- cupsdLogRequest(con, HTTP_OK);
+ cupsdLogRequest(con, HTTP_STATUS_OK);
}
}
@@ -2270,13 +2084,12 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
break; /* Anti-compiler-warning-code */
}
- if (con->http.state == HTTP_WAITING)
+ if (httpGetState(con->http) == HTTP_STATE_WAITING)
{
- if (!con->http.keep_alive)
+ if (!httpGetKeepAlive(con->http))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing because Keep-Alive disabled",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Closing because Keep-Alive is disabled.");
cupsdCloseClient(con);
}
else
@@ -2308,10 +2121,10 @@ cupsdSendCommand(
if (fd < 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Client %d] Unable to open \"%s\" for reading: %s",
- con->http.fd, con->filename ? con->filename : "/dev/null",
- strerror(errno));
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
+ "Unable to open \"%s\" for reading: %s",
+ con->filename ? con->filename : "/dev/null",
+ strerror(errno));
return (0);
}
@@ -2320,16 +2133,16 @@ cupsdSendCommand(
else
fd = -1;
- con->pipe_pid = pipe_command(con, fd, &(con->file), command, options, root);
+ con->pipe_pid = pipe_command(con, fd, &(con->file), command, options, root);
+ con->pipe_status = HTTP_STATUS_OK;
+
+ httpClearFields(con->http);
if (fd >= 0)
close(fd);
- cupsdLogMessage(CUPSD_LOG_INFO, "[Client %d] Started \"%s\" (pid=%d)",
- con->http.fd, command, con->pipe_pid);
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] file=%d", con->http.fd,
- con->file);
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Started \"%s\" (pid=%d, file=%d)",
+ command, con->pipe_pid, con->file);
if (con->pipe_pid == 0)
return (0);
@@ -2338,6 +2151,8 @@ cupsdSendCommand(
cupsdAddSelect(con->file, (cupsd_selfunc_t)write_pipe, NULL, con);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for CGI data.");
+
con->sent_header = 0;
con->file_ready = 0;
con->got_fields = 0;
@@ -2356,9 +2171,10 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
http_status_t code, /* I - Error code */
int auth_type)/* I - Authentication type */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] cupsdSendError code=%d, auth_type=%d",
- con->http.fd, code, auth_type);
+ char location[HTTP_MAX_VALUE]; /* Location field */
+
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdSendError code=%d, auth_type=%d", code, auth_type);
#ifdef HAVE_SSL
/*
@@ -2366,12 +2182,12 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
* server is configured...
*/
- if (code == HTTP_UNAUTHORIZED &&
- DefaultEncryption == HTTP_ENCRYPT_REQUIRED &&
- _cups_strcasecmp(con->http.hostname, "localhost") &&
- !con->http.tls)
+ if (code == HTTP_STATUS_UNAUTHORIZED &&
+ DefaultEncryption == HTTP_ENCRYPTION_REQUIRED &&
+ _cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost") &&
+ !httpIsEncrypted(con->http))
{
- code = HTTP_UPGRADE_REQUIRED;
+ code = HTTP_STATUS_UPGRADE_REQUIRED;
}
#endif /* HAVE_SSL */
@@ -2389,34 +2205,20 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
* never disable it in that case.
*/
- if (code >= HTTP_BAD_REQUEST && con->http.auth_type != CUPSD_AUTH_NEGOTIATE)
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+ strlcpy(location, httpGetField(con->http, HTTP_FIELD_LOCATION), sizeof(location));
- /*
- * Send an error message back to the client. If the error code is a
- * 400 or 500 series, make sure the message contains some text, too!
- */
+ httpClearFields(con->http);
- if (!cupsdSendHeader(con, code, NULL, auth_type))
- return (0);
+ httpSetField(con->http, HTTP_FIELD_LOCATION, location);
-#ifdef HAVE_SSL
- if (code == HTTP_UPGRADE_REQUIRED)
- if (httpPrintf(HTTP(con), "Connection: Upgrade\r\n") < 0)
- return (0);
+ if (code >= HTTP_STATUS_BAD_REQUEST && con->type != CUPSD_AUTH_NEGOTIATE)
+ httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
- if (httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n") < 0)
- return (0);
-#endif /* HAVE_SSL */
+ if (httpGetVersion(con->http) >= HTTP_VERSION_1_1 &&
+ httpGetKeepAlive(con->http) == HTTP_KEEPALIVE_OFF)
+ httpSetField(con->http, HTTP_FIELD_CONNECTION, "close");
- if (con->http.version >= HTTP_1_1 &&
- con->http.keep_alive == HTTP_KEEPALIVE_OFF)
- {
- if (httpPrintf(HTTP(con), "Connection: close\r\n") < 0)
- return (0);
- }
-
- if (code >= HTTP_BAD_REQUEST)
+ if (code >= HTTP_STATUS_BAD_REQUEST)
{
/*
* Send a human-readable error message.
@@ -2430,13 +2232,13 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
redirect[0] = '\0';
- if (code == HTTP_UNAUTHORIZED)
+ if (code == HTTP_STATUS_UNAUTHORIZED)
text = _cupsLangString(con->language,
_("Enter your username and password or the "
"root username and password to access this "
"page. If you are using Kerberos authentication, "
"make sure you have a valid Kerberos ticket."));
- else if (code == HTTP_UPGRADE_REQUIRED)
+ else if (code == HTTP_STATUS_UPGRADE_REQUIRED)
{
text = urltext;
@@ -2453,7 +2255,7 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
"CONTENT=\"3;URL=https://%s:%d%s\">\n",
con->servername, con->serverport, con->uri);
}
- else if (code == HTTP_WEBIF_DISABLED)
+ else if (code == HTTP_STATUS_CUPS_WEBIF_DISABLED)
text = _cupsLangString(con->language,
_("The web interface is currently disabled. Run "
"\"cupsctl WebInterface=yes\" to enable it."));
@@ -2477,25 +2279,34 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
"<P>%s</P>\n"
"</BODY>\n"
"</HTML>\n",
- httpStatus(code), redirect, httpStatus(code), text);
+ _httpStatus(con->language, code), redirect,
+ _httpStatus(con->language, code), text);
- if (httpPrintf(HTTP(con), "Content-Type: text/html; charset=utf-8\r\n") < 0)
- return (0);
- if (httpPrintf(HTTP(con), "Content-Length: %d\r\n",
- (int)strlen(message)) < 0)
+ /*
+ * Send an error message back to the client. If the error code is a
+ * 400 or 500 series, make sure the message contains some text, too!
+ */
+
+ size_t length = strlen(message); /* Length of message */
+
+ httpSetLength(con->http, length);
+
+ if (!cupsdSendHeader(con, code, "text/html", auth_type))
return (0);
- if (httpPrintf(HTTP(con), "\r\n") < 0)
+
+ if (httpWrite2(con->http, message, length) < 0)
return (0);
- if (httpPrintf(HTTP(con), "%s", message) < 0)
+
+ if (httpFlushWrite(con->http) < 0)
return (0);
}
- else if (httpPrintf(HTTP(con), "\r\n") < 0)
- return (0);
-
- if (cupsdFlushHeader(con) < 0)
- return (0);
+ else
+ {
+ httpSetField(con->http, HTTP_FIELD_CONTENT_LENGTH, "0");
- con->http.state = HTTP_WAITING;
+ if (!cupsdSendHeader(con, code, NULL, auth_type))
+ return (0);
+ }
return (1);
}
@@ -2515,54 +2326,29 @@ cupsdSendHeader(
char auth_str[1024]; /* Authorization string */
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "cupsdSendHeader: code=%d, type=\"%s\", auth_type=%d", code, type, auth_type);
+
/*
* Send the HTTP status header...
*/
- if (code == HTTP_CONTINUE)
- {
- /*
- * 100-continue doesn't send any headers...
- */
-
- return (httpPrintf(HTTP(con), "HTTP/%d.%d 100 Continue\r\n\r\n",
- con->http.version / 100, con->http.version % 100) > 0);
- }
- else if (code == HTTP_WEBIF_DISABLED)
+ if (code == HTTP_STATUS_CUPS_WEBIF_DISABLED)
{
/*
* Treat our special "web interface is disabled" status as "200 OK" for web
* browsers.
*/
- code = HTTP_OK;
+ code = HTTP_STATUS_OK;
}
- httpFlushWrite(HTTP(con));
-
- con->http.data_encoding = HTTP_ENCODE_FIELDS;
-
- if (httpPrintf(HTTP(con), "HTTP/%d.%d %d %s\r\n", con->http.version / 100,
- con->http.version % 100, code, httpStatus(code)) < 0)
- return (0);
- if (httpPrintf(HTTP(con), "Date: %s\r\n", httpGetDateString(time(NULL))) < 0)
- return (0);
if (ServerHeader)
- if (httpPrintf(HTTP(con), "Server: %s\r\n", ServerHeader) < 0)
- return (0);
- if (con->http.keep_alive && con->http.version >= HTTP_1_0)
- {
- if (httpPrintf(HTTP(con), "Connection: Keep-Alive\r\n") < 0)
- return (0);
- if (httpPrintf(HTTP(con), "Keep-Alive: timeout=%d\r\n",
- KeepAliveTimeout) < 0)
- return (0);
- }
- if (code == HTTP_METHOD_NOT_ALLOWED)
- if (httpPrintf(HTTP(con), "Allow: GET, HEAD, OPTIONS, POST, PUT\r\n") < 0)
- return (0);
+ httpSetField(con->http, HTTP_FIELD_SERVER, ServerHeader);
+
+ if (code == HTTP_STATUS_METHOD_NOT_ALLOWED)
+ httpSetField(con->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST, PUT");
- if (code == HTTP_UNAUTHORIZED)
+ if (code == HTTP_STATUS_UNAUTHORIZED)
{
if (auth_type == CUPSD_AUTH_NONE)
{
@@ -2574,16 +2360,13 @@ cupsdSendHeader(
auth_str[0] = '\0';
- if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST)
+ if (auth_type == CUPSD_AUTH_BASIC)
strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str));
- else if (auth_type == CUPSD_AUTH_DIGEST)
- snprintf(auth_str, sizeof(auth_str), "Digest realm=\"CUPS\", nonce=\"%s\"",
- con->http.hostname);
#ifdef HAVE_GSSAPI
else if (auth_type == CUPSD_AUTH_NEGOTIATE)
{
# ifdef AF_LOCAL
- if (_httpAddrFamily(con->http.hostaddr) == AF_LOCAL)
+ if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str));
else
# endif /* AF_LOCAL */
@@ -2592,7 +2375,7 @@ cupsdSendHeader(
#endif /* HAVE_GSSAPI */
if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE &&
- !_cups_strcasecmp(con->http.hostname, "localhost"))
+ !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost"))
{
/*
* Add a "trc" (try root certification) parameter for local non-Kerberos
@@ -2608,7 +2391,7 @@ cupsdSendHeader(
size_t auth_size; /* Size of remaining buffer */
auth_key = auth_str + strlen(auth_str);
- auth_size = sizeof(auth_str) - (auth_key - auth_str);
+ auth_size = sizeof(auth_str) - (size_t)(auth_key - auth_str);
for (name = (char *)cupsArrayFirst(con->best->names);
name;
@@ -2641,35 +2424,24 @@ cupsdSendHeader(
if (auth_str[0])
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] WWW-Authenticate: %s", con->http.fd,
- auth_str);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "WWW-Authenticate: %s", auth_str);
- if (httpPrintf(HTTP(con), "WWW-Authenticate: %s\r\n", auth_str) < 0)
- return (0);
+ httpSetField(con->http, HTTP_FIELD_WWW_AUTHENTICATE, auth_str);
}
}
if (con->language && strcmp(con->language->language, "C"))
- {
- if (httpPrintf(HTTP(con), "Content-Language: %s\r\n",
- con->language->language) < 0)
- return (0);
- }
+ httpSetField(con->http, HTTP_FIELD_CONTENT_LANGUAGE, con->language->language);
if (type)
{
if (!strcmp(type, "text/html"))
- {
- if (httpPrintf(HTTP(con),
- "Content-Type: text/html; charset=utf-8\r\n") < 0)
- return (0);
- }
- else if (httpPrintf(HTTP(con), "Content-Type: %s\r\n", type) < 0)
- return (0);
+ httpSetField(con->http, HTTP_FIELD_CONTENT_TYPE, "text/html; charset=utf-8");
+ else
+ httpSetField(con->http, HTTP_FIELD_CONTENT_TYPE, type);
}
- return (1);
+ return (!httpWriteResponse(con->http, code));
}
@@ -2722,36 +2494,35 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
ipp_state_t ipp_state; /* IPP state value */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] cupsdWriteClient "
- "error=%d, "
- "used=%d, "
- "state=%s, "
- "data_encoding=HTTP_ENCODE_%s, "
- "data_remaining=" CUPS_LLFMT ", "
- "response=%p(%s), "
- "pipe_pid=%d, "
- "file=%d",
- con->http.fd, con->http.error, con->http.used,
- http_states[con->http.state],
- con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
- "CHUNKED" : "LENGTH",
- CUPS_LLCAST con->http.data_remaining,
- con->response,
- con->response ? ipp_states[con->response->state] : "",
- con->pipe_pid, con->file);
-
- if (con->http.state != HTTP_GET_SEND &&
- con->http.state != HTTP_POST_SEND)
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "con->http=%p", con->http);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "cupsdWriteClient "
+ "error=%d, "
+ "used=%d, "
+ "state=%s, "
+ "data_encoding=HTTP_ENCODING_%s, "
+ "data_remaining=" CUPS_LLFMT ", "
+ "response=%p(%s), "
+ "pipe_pid=%d, "
+ "file=%d",
+ httpError(con->http), (int)httpGetReady(con->http),
+ httpStateString(httpGetState(con->http)),
+ httpIsChunked(con->http) ? "CHUNKED" : "LENGTH",
+ CUPS_LLCAST httpGetLength2(con->http),
+ con->response,
+ con->response ? ippStateString(ippGetState(con->request)) : "",
+ con->pipe_pid, con->file);
+
+ if (httpGetState(con->http) != HTTP_STATE_GET_SEND &&
+ httpGetState(con->http) != HTTP_STATE_POST_SEND)
{
/*
* If we get called in the wrong state, then something went wrong with the
* connection and we need to shut it down...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing on unexpected HTTP state %s.",
- con->http.fd, http_states[con->http.state]);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on unexpected HTTP write state %s.",
+ httpStateString(httpGetState(con->http)));
cupsdCloseClient(con);
return;
}
@@ -2764,27 +2535,71 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
cupsdAddSelect(con->file, (cupsd_selfunc_t)write_pipe, NULL, con);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for CGI data.");
+
if (!con->file_ready)
{
/*
* Try again later when there is CGI output available...
*/
- cupsdRemoveSelect(con->http.fd);
+ cupsdRemoveSelect(httpGetFd(con->http));
return;
}
con->file_ready = 0;
}
- if (con->response && con->response->state != IPP_DATA)
+ bytes = (ssize_t)(sizeof(con->header) - (size_t)con->header_used);
+
+ if (!con->pipe_pid && bytes > (ssize_t)httpGetRemaining(con->http))
{
- ipp_state = ippWrite(HTTP(con), con->response);
- bytes = ipp_state != IPP_ERROR &&
- (con->file >= 0 || ipp_state != IPP_DATA);
+ /*
+ * Limit GET bytes to original size of file (STR #3265)...
+ */
+
+ bytes = (ssize_t)httpGetRemaining(con->http);
}
- else if ((bytes = read(con->file, con->header + con->header_used,
- sizeof(con->header) - con->header_used)) > 0)
+
+ if (con->response && con->response->state != IPP_STATE_DATA)
+ {
+ size_t wused = httpGetPending(con->http); /* Previous write buffer use */
+
+ do
+ {
+ /*
+ * Write a single attribute or the IPP message header...
+ */
+
+ ipp_state = ippWrite(con->http, con->response);
+
+ /*
+ * If the write buffer has been flushed, stop buffering up attributes...
+ */
+
+ if (httpGetPending(con->http) <= wused)
+ break;
+ }
+ while (ipp_state != IPP_STATE_DATA && ipp_state != IPP_STATE_ERROR);
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Writing IPP response, ipp_state=%s, old "
+ "wused=" CUPS_LLFMT ", new wused=" CUPS_LLFMT,
+ ippStateString(ipp_state),
+ CUPS_LLCAST wused, CUPS_LLCAST httpGetPending(con->http));
+
+ if (httpGetPending(con->http) > 0)
+ httpFlushWrite(con->http);
+
+ bytes = ipp_state != IPP_STATE_ERROR &&
+ (con->file >= 0 || ipp_state != IPP_STATE_DATA);
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "bytes=%d, http_state=%d, data_remaining=" CUPS_LLFMT,
+ (int)bytes, httpGetState(con->http),
+ CUPS_LLCAST httpGetLength2(con->http));
+ }
+ else if ((bytes = read(con->file, con->header + con->header_used, (size_t)bytes)) > 0)
{
con->header_used += bytes;
@@ -2809,7 +2624,7 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
bufptr[-1] = '\0';
*bufptr++ = '\0';
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Script header: %s", con->header);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Script header: %s", con->header);
if (!con->sent_header)
{
@@ -2817,46 +2632,43 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
* Handle redirection and CGI status codes...
*/
- if (!_cups_strncasecmp(con->header, "Location:", 9))
+ http_field_t field; /* HTTP field */
+ char *value = strchr(con->header, ':');
+ /* Value of field */
+
+ if (value)
{
- if (!cupsdSendHeader(con, HTTP_SEE_OTHER, NULL, CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
+ *value++ = '\0';
+ while (isspace(*value & 255))
+ value ++;
+ }
- con->sent_header = 2;
+ field = httpFieldValue(con->header);
- if (httpPrintf(HTTP(con), "Content-Length: 0\r\n") < 0)
- return;
+ if (field != HTTP_FIELD_UNKNOWN && value)
+ {
+ httpSetField(con->http, field, value);
+
+ if (field == HTTP_FIELD_LOCATION)
+ {
+ con->pipe_status = HTTP_STATUS_SEE_OTHER;
+ con->sent_header = 2;
+ }
+ else
+ con->sent_header = 1;
}
- else if (!_cups_strncasecmp(con->header, "Status:", 7))
+ else if (!_cups_strcasecmp(con->header, "Status") && value)
{
- cupsdSendError(con, (http_status_t)atoi(con->header + 7),
- CUPSD_AUTH_NONE);
+ con->pipe_status = (http_status_t)atoi(value);
con->sent_header = 2;
}
- else
+ else if (!_cups_strcasecmp(con->header, "Set-Cookie") && value)
{
- if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE))
- {
- cupsdCloseClient(con);
- return;
- }
-
+ httpSetCookie(con->http, value);
con->sent_header = 1;
-
- if (con->http.version == HTTP_1_1)
- {
- if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0)
- return;
- }
- }
+ }
}
- if (_cups_strncasecmp(con->header, "Status:", 7))
- httpPrintf(HTTP(con), "%s\r\n", con->header);
-
/*
* Update buffer...
*/
@@ -2864,7 +2676,7 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
con->header_used -= bufptr - con->header;
if (con->header_used > 0)
- memmove(con->header, bufptr, con->header_used);
+ memmove(con->header, bufptr, (size_t)con->header_used);
bufptr = con->header - 1;
@@ -2876,14 +2688,28 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
{
con->got_fields = 1;
- if (cupsdFlushHeader(con) < 0)
+ if (httpGetVersion(con->http) == HTTP_VERSION_1_1 &&
+ !httpGetField(con->http, HTTP_FIELD_CONTENT_LENGTH)[0])
+ httpSetLength(con->http, 0);
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Sending status %d for CGI.", con->pipe_status);
+
+ if (con->pipe_status == HTTP_STATUS_OK)
{
- cupsdCloseClient(con);
- return;
+ if (!cupsdSendHeader(con, con->pipe_status, NULL, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+ }
+ }
+ else
+ {
+ if (!cupsdSendError(con, con->pipe_status, CUPSD_AUTH_NONE))
+ {
+ cupsdCloseClient(con);
+ return;
+ }
}
-
- if (con->http.version == HTTP_1_1)
- con->http.data_encoding = HTTP_ENCODE_CHUNKED;
}
else
field_col = 0;
@@ -2893,30 +2719,25 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
}
if (!con->got_fields)
- {
- con->http.activity = time(NULL);
return;
- }
}
if (con->header_used > 0)
{
- if (httpWrite2(HTTP(con), con->header, con->header_used) < 0)
+ if (httpWrite2(con->http, con->header, (size_t)con->header_used) < 0)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing for error %d (%s)",
- con->http.fd, con->http.error,
- strerror(con->http.error));
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing for error %d (%s)",
+ httpError(con->http), strerror(httpError(con->http)));
cupsdCloseClient(con);
return;
}
- if (con->http.data_encoding == HTTP_ENCODE_CHUNKED)
- httpFlushWrite(HTTP(con));
+ if (httpIsChunked(con->http))
+ httpFlushWrite(con->http);
con->bytes += con->header_used;
- if (con->http.state == HTTP_WAITING)
+ if (httpGetState(con->http) == HTTP_STATE_WAITING)
bytes = 0;
else
bytes = con->header_used;
@@ -2926,33 +2747,36 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
}
if (bytes <= 0 ||
- (con->http.state != HTTP_GET_SEND && con->http.state != HTTP_POST_SEND))
+ (httpGetState(con->http) != HTTP_STATE_GET_SEND &&
+ httpGetState(con->http) != HTTP_STATE_POST_SEND))
{
if (!con->sent_header && con->pipe_pid)
- cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+ cupsdSendError(con, HTTP_STATUS_SERVER_ERROR, CUPSD_AUTH_NONE);
else
{
- cupsdLogRequest(con, HTTP_OK);
-
- httpFlushWrite(HTTP(con));
+ cupsdLogRequest(con, HTTP_STATUS_OK);
- if (con->http.data_encoding == HTTP_ENCODE_CHUNKED && con->sent_header == 1)
+ if (httpIsChunked(con->http) && (!con->pipe_pid || con->sent_header > 0))
{
- if (httpWrite2(HTTP(con), "", 0) < 0)
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Sending 0-length chunk.");
+
+ if (httpWrite2(con->http, "", 0) < 0)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing for error %d (%s)",
- con->http.fd, con->http.error,
- strerror(con->http.error));
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing for error %d (%s)",
+ httpError(con->http), strerror(httpError(con->http)));
cupsdCloseClient(con);
return;
}
}
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Flushing write buffer.");
+ httpFlushWrite(con->http);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "New state is %s", httpStateString(httpGetState(con->http)));
}
- con->http.state = HTTP_WAITING;
+ cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, NULL, con);
- cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for request.");
if (con->file >= 0)
{
@@ -2988,11 +2812,10 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
cupsdClearString(&con->options);
cupsdClearString(&con->query_string);
- if (!con->http.keep_alive)
+ if (!httpGetKeepAlive(con->http))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Client %d] Closing because Keep-Alive disabled.",
- con->http.fd);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG,
+ "Closing because Keep-Alive is disabled.");
cupsdCloseClient(con);
return;
}
@@ -3002,8 +2825,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */
cupsdSetBusyState();
}
}
-
- con->http.activity = time(NULL);
}
@@ -3016,23 +2837,19 @@ check_if_modified(
cupsd_client_t *con, /* I - Client connection */
struct stat *filestats) /* I - File information */
{
- char *ptr; /* Pointer into field */
+ const char *ptr; /* Pointer into field */
time_t date; /* Time/date value */
off_t size; /* Size/length value */
size = 0;
date = 0;
- ptr = con->http.fields[HTTP_FIELD_IF_MODIFIED_SINCE];
+ ptr = httpGetField(con->http, HTTP_FIELD_IF_MODIFIED_SINCE);
if (*ptr == '\0')
return (1);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] check_if_modified "
- "filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"",
- con->http.fd, filestats, CUPS_LLCAST filestats->st_size,
- (int)filestats->st_mtime, ptr);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "check_if_modified: filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"", filestats, CUPS_LLCAST filestats->st_size, (int)filestats->st_mtime, ptr);
while (*ptr != '\0')
{
@@ -3083,35 +2900,26 @@ compare_clients(cupsd_client_t *a, /* I - First client */
}
+#ifdef HAVE_SSL
/*
- * 'data_ready()' - Check whether data is available from a client.
+ * 'cupsd_start_tls()' - Start encryption on a connection.
*/
-static int /* O - 1 if data is ready, 0 otherwise */
-data_ready(cupsd_client_t *con) /* I - Client */
+static int /* O - 0 on success, -1 on error */
+cupsd_start_tls(cupsd_client_t *con, /* I - Client connection */
+ http_encryption_t e) /* I - Encryption mode */
{
- if (con->http.used > 0)
- return (1);
-#ifdef HAVE_SSL
- else if (con->http.tls)
+ if (httpEncryption(con->http, e))
{
-# ifdef HAVE_LIBSSL
- if (SSL_pending((SSL *)(con->http.tls)))
- return (1);
-# elif defined(HAVE_GNUTLS)
- if (gnutls_record_check_pending(con->http.tls))
- return (1);
-# elif defined(HAVE_CDSASSL)
- size_t bytes; /* Bytes that are available */
-
- if (!SSLGetBufferedReadSize(con->http.tls, &bytes) && bytes > 0)
- return (1);
-# endif /* HAVE_LIBSSL */
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to encrypt connection: %s",
+ cupsLastErrorString());
+ return (-1);
}
-#endif /* HAVE_SSL */
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Connection now encrypted.");
return (0);
}
+#endif /* HAVE_SSL */
/*
@@ -3122,12 +2930,14 @@ static char * /* O - Real filename */
get_file(cupsd_client_t *con, /* I - Client connection */
struct stat *filestats, /* O - File information */
char *filename, /* IO - Filename buffer */
- int len) /* I - Buffer length */
+ size_t len) /* I - Buffer length */
{
int status; /* Status of filesystem calls */
char *ptr; /* Pointer info filename */
- int plen; /* Remaining length after pointer */
- char language[7]; /* Language subdirectory, if any */
+ size_t plen; /* Remaining length after pointer */
+ char language[7], /* Language subdirectory, if any */
+ dest[1024]; /* Destination name */
+ int perm_check = 1; /* Do permissions check? */
/*
@@ -3137,17 +2947,59 @@ get_file(cupsd_client_t *con, /* I - Client connection */
language[0] = '\0';
if (!strncmp(con->uri, "/ppd/", 5) && !strchr(con->uri + 5, '/'))
+ {
+ strlcpy(dest, con->uri + 5, sizeof(dest));
+ ptr = dest + strlen(dest) - 4;
+
+ if (ptr <= dest || strcmp(ptr, ".ppd"))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Disallowed path \"%s\".", con->uri);
+ return (NULL);
+ }
+
+ *ptr = '\0';
+ if (!cupsdFindPrinter(dest))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "No printer \"%s\" found.", dest);
+ return (NULL);
+ }
+
snprintf(filename, len, "%s%s", ServerRoot, con->uri);
+
+ perm_check = 0;
+ }
else if (!strncmp(con->uri, "/icons/", 7) && !strchr(con->uri + 7, '/'))
{
- snprintf(filename, len, "%s/%s", CacheDir, con->uri + 7);
+ strlcpy(dest, con->uri + 7, sizeof(dest));
+ ptr = dest + strlen(dest) - 4;
+
+ if (ptr <= dest || strcmp(ptr, ".png"))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Disallowed path \"%s\".", con->uri);
+ return (NULL);
+ }
+
+ *ptr = '\0';
+ if (!cupsdFindDest(dest))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "No printer \"%s\" found.", dest);
+ return (NULL);
+ }
+
+ snprintf(filename, len, "%s/%s.png", CacheDir, dest);
if (access(filename, F_OK) < 0)
snprintf(filename, len, "%s/images/generic.png", DocumentRoot);
+
+ perm_check = 0;
}
else if (!strncmp(con->uri, "/rss/", 5) && !strchr(con->uri + 5, '/'))
snprintf(filename, len, "%s/rss/%s", CacheDir, con->uri + 5);
- else if (!strncmp(con->uri, "/admin/conf/", 12))
- snprintf(filename, len, "%s%s", ServerRoot, con->uri + 11);
+ else if (!strcmp(con->uri, "/admin/conf/cupsd.conf"))
+ {
+ strlcpy(filename, ConfigurationFile, len);
+
+ perm_check = 0;
+ }
else if (!strncmp(con->uri, "/admin/log/", 11))
{
if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/')
@@ -3158,6 +3010,8 @@ get_file(cupsd_client_t *con, /* I - Client connection */
strlcpy(filename, PageLog, len);
else
return (NULL);
+
+ perm_check = 0;
}
else if (con->language)
{
@@ -3175,7 +3029,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
* then fallback to the default one...
*/
- if ((status = stat(filename, filestats)) != 0 && language[0] &&
+ if ((status = lstat(filename, filestats)) != 0 && language[0] &&
strncmp(con->uri, "/icons/", 7) &&
strncmp(con->uri, "/ppd/", 5) &&
strncmp(con->uri, "/rss/", 5) &&
@@ -3192,7 +3046,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
if ((ptr = strchr(filename, '?')) != NULL)
*ptr = '\0';
- if ((status = stat(filename, filestats)) != 0)
+ if ((status = lstat(filename, filestats)) != 0)
{
/*
* Drop the language prefix and try the root directory...
@@ -3204,12 +3058,33 @@ get_file(cupsd_client_t *con, /* I - Client connection */
if ((ptr = strchr(filename, '?')) != NULL)
*ptr = '\0';
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
}
}
/*
- * If we're found a directory, get the index.html file instead...
+ * If we've found a symlink, 404 the sucker to avoid disclosing information.
+ */
+
+ if (!status && S_ISLNK(filestats->st_mode))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Symlinks such as \"%s\" are not allowed.", filename);
+ return (NULL);
+ }
+
+ /*
+ * Similarly, if the file/directory does not have world read permissions, do
+ * not allow access...
+ */
+
+ if (!status && perm_check && !(filestats->st_mode & S_IROTH))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename);
+ return (NULL);
+ }
+
+ /*
+ * If we've found a directory, get the index.html file instead...
*/
if (!status && S_ISDIR(filestats->st_mode))
@@ -3249,16 +3124,16 @@ get_file(cupsd_client_t *con, /* I - Client connection */
*ptr = '\0';
ptr = filename + strlen(filename);
- plen = len - (ptr - filename);
+ plen = len - (size_t)(ptr - filename);
strlcpy(ptr, "index.html", plen);
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
#ifdef HAVE_JAVA
if (status)
{
strlcpy(ptr, "index.class", plen);
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
}
#endif /* HAVE_JAVA */
@@ -3266,7 +3141,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
if (status)
{
strlcpy(ptr, "index.pl", plen);
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
}
#endif /* HAVE_PERL */
@@ -3274,7 +3149,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
if (status)
{
strlcpy(ptr, "index.php", plen);
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
}
#endif /* HAVE_PHP */
@@ -3282,24 +3157,42 @@ get_file(cupsd_client_t *con, /* I - Client connection */
if (status)
{
strlcpy(ptr, "index.pyc", plen);
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
}
if (status)
{
strlcpy(ptr, "index.py", plen);
- status = stat(filename, filestats);
+ status = lstat(filename, filestats);
}
#endif /* HAVE_PYTHON */
}
while (status && language[0]);
+
+ /*
+ * If we've found a symlink, 404 the sucker to avoid disclosing information.
+ */
+
+ if (!status && S_ISLNK(filestats->st_mode))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Symlinks such as \"%s\" are not allowed.", filename);
+ return (NULL);
+ }
+
+ /*
+ * Similarly, if the file/directory does not have world read permissions, do
+ * not allow access...
+ */
+
+ if (!status && perm_check && !(filestats->st_mode & S_IROTH))
+ {
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename);
+ return (NULL);
+ }
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] get_file filestats=%p, filename=%p, len=%d, "
- "returning \"%s\".", con->http.fd, filestats, filename, len,
- status ? "(null)" : filename);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "get_file: filestats=%p, filename=%p, len=" CUPS_LLFMT ", returning \"%s\".", filestats, filename, CUPS_LLCAST len, status ? "(null)" : filename);
if (status)
return (NULL);
@@ -3328,9 +3221,9 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
if ((in = cupsFileOpen(con->filename, "rb")) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open request file \"%s\": %s",
+ cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to open request file \"%s\": %s",
con->filename, strerror(errno));
- return (HTTP_SERVER_ERROR);
+ goto server_error;
}
/*
@@ -3340,10 +3233,10 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
if ((out = cupsdCreateConfFile(ConfigurationFile, ConfigFilePerm)) == NULL)
{
cupsFileClose(in);
- return (HTTP_SERVER_ERROR);
+ goto server_error;
}
- cupsdLogMessage(CUPSD_LOG_INFO, "Installing config file \"%s\"...",
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Installing config file \"%s\"...",
ConfigurationFile);
/*
@@ -3351,9 +3244,9 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
*/
while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0)
- if (cupsFileWrite(out, buffer, bytes) < bytes)
+ if (cupsFileWrite(out, buffer, (size_t)bytes) < bytes)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
+ cupsdLogClient(con, CUPSD_LOG_ERROR,
"Unable to copy to config file \"%s\": %s",
ConfigurationFile, strerror(errno));
@@ -3361,9 +3254,9 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
cupsFileClose(out);
snprintf(filename, sizeof(filename), "%s.N", ConfigurationFile);
- cupsdRemoveFile(filename);
+ cupsdUnlinkOrRemoveFile(filename);
- return (HTTP_SERVER_ERROR);
+ goto server_error;
}
/*
@@ -3373,13 +3266,13 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
cupsFileClose(in);
if (cupsdCloseCreatedConfFile(out, ConfigurationFile))
- return (HTTP_SERVER_ERROR);
+ goto server_error;
/*
* Remove the request file...
*/
- cupsdRemoveFile(con->filename);
+ cupsdUnlinkOrRemoveFile(con->filename);
cupsdClearString(&con->filename);
/*
@@ -3393,7 +3286,18 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
* Return that the file was created successfully...
*/
- return (HTTP_CREATED);
+ return (HTTP_STATUS_CREATED);
+
+ /*
+ * Common exit for errors...
+ */
+
+ server_error:
+
+ cupsdUnlinkOrRemoveFile(con->filename);
+ cupsdClearString(&con->filename);
+
+ return (HTTP_STATUS_SERVER_ERROR);
}
@@ -3426,11 +3330,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
if (!type || _cups_strcasecmp(type->super, "application"))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 0", con->http.fd, filename,
- filestats, type ? type->super : "unknown",
- type ? type->type : "unknown");
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, filestats, type ? type->super : "unknown", type ? type->type : "unknown");
return (0);
}
@@ -3446,10 +3346,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
if (options)
cupsdSetStringf(&con->options, " %s", options);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 1", con->http.fd, filename,
- filestats, type->super, type->type);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
return (1);
}
#ifdef HAVE_JAVA
@@ -3466,10 +3363,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
else
cupsdSetStringf(&con->options, " %s", filename);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 1", con->http.fd, filename,
- filestats, type->super, type->type);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
return (1);
}
#endif /* HAVE_JAVA */
@@ -3487,10 +3381,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
else
cupsdSetStringf(&con->options, " %s", filename);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 1", con->http.fd, filename,
- filestats, type->super, type->type);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
return (1);
}
#endif /* HAVE_PERL */
@@ -3508,10 +3399,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
else
cupsdSetStringf(&con->options, " %s", filename);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 1", con->http.fd, filename,
- filestats, type->super, type->type);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
return (1);
}
#endif /* HAVE_PHP */
@@ -3529,18 +3417,12 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
else
cupsdSetStringf(&con->options, " %s", filename);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 1", con->http.fd, filename,
- filestats, type->super, type->type);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
return (1);
}
#endif /* HAVE_PYTHON */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
- "type=%s/%s, returning 0", con->http.fd, filename,
- filestats, type->super, type->type);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, filestats, type->super, type->type);
return (0);
}
@@ -3560,6 +3442,14 @@ is_path_absolute(const char *path) /* I - Input path */
return (0);
/*
+ * Check for "<" or quotes in the path and reject since this is probably
+ * someone trying to inject HTML...
+ */
+
+ if (strchr(path, '<') != NULL || strchr(path, '\"') != NULL || strchr(path, '\'') != NULL)
+ return (0);
+
+ /*
* Check for "/.." in the path...
*/
@@ -3639,21 +3529,12 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
* be consistent with Apache...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] pipe_command infile=%d, outfile=%p, "
- "command=\"%s\", options=\"%s\", root=%d",
- con->http.fd, infile, outfile, command,
- options ? options : "(null)", root);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "pipe_command: infile=%d, outfile=%p, command=\"%s\", options=\"%s\", root=%d", infile, outfile, command, options ? options : "(null)", root);
argv[0] = command;
if (options)
- {
- commptr = options;
- if (*commptr == ' ')
- commptr ++;
- strlcpy(argbuf, commptr, sizeof(argbuf));
- }
+ strlcpy(argbuf, options, sizeof(argbuf));
else
argbuf[0] = '\0';
@@ -3680,7 +3561,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
commptr ++;
}
- if (*commptr == '?' && con->operation == HTTP_GET && !con->query_string)
+ if (*commptr == '?' && con->operation == HTTP_STATE_GET && !con->query_string)
{
commptr ++;
cupsdSetStringf(&(con->query_string), "QUERY_STRING=%s", commptr);
@@ -3723,9 +3604,9 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
*/
if (commptr[1] >= '0' && commptr[1] <= '9')
- *commptr = (commptr[1] - '0') << 4;
+ *commptr = (char)((commptr[1] - '0') << 4);
else
- *commptr = (tolower(commptr[1]) - 'a' + 10) << 4;
+ *commptr = (char)((tolower(commptr[1]) - 'a' + 10) << 4);
if (commptr[2] >= '0' && commptr[2] <= '9')
*commptr |= commptr[2] - '0';
@@ -3753,7 +3634,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
if (con->username[0])
{
snprintf(auth_type, sizeof(auth_type), "AUTH_TYPE=%s",
- httpGetField(HTTP(con), HTTP_FIELD_AUTHORIZATION));
+ httpGetField(con->http, HTTP_FIELD_AUTHORIZATION));
if ((uriptr = strchr(auth_type + 10, ' ')) != NULL)
*uriptr = '\0';
@@ -3773,7 +3654,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
* the POSIX locale...
*/
- strcpy(lang, "LANG=C");
+ strlcpy(lang, "LANG=C", sizeof(lang));
break;
case 2 :
@@ -3801,14 +3682,14 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
else if (con->language)
snprintf(lang, sizeof(lang), "LANG=%s.UTF8", con->language->language);
else
- strcpy(lang, "LANG=C");
+ strlcpy(lang, "LANG=C", sizeof(lang));
- strcpy(remote_addr, "REMOTE_ADDR=");
- httpAddrString(con->http.hostaddr, remote_addr + 12,
+ strlcpy(remote_addr, "REMOTE_ADDR=", sizeof(remote_addr));
+ httpAddrString(httpGetAddress(con->http), remote_addr + 12,
sizeof(remote_addr) - 12);
snprintf(remote_host, sizeof(remote_host), "REMOTE_HOST=%s",
- con->http.hostname);
+ httpGetHostname(con->http, NULL, 0));
snprintf(script_name, sizeof(script_name), "SCRIPT_NAME=%s", con->uri);
if ((uriptr = strchr(script_name, '?')) != NULL)
@@ -3817,14 +3698,14 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
snprintf(script_filename, sizeof(script_filename), "SCRIPT_FILENAME=%s%s",
DocumentRoot, script_name + 12);
- sprintf(server_port, "SERVER_PORT=%d", con->serverport);
+ snprintf(server_port, sizeof(server_port), "SERVER_PORT=%d", con->serverport);
- if (con->http.fields[HTTP_FIELD_HOST][0])
+ if (httpGetField(con->http, HTTP_FIELD_HOST)[0])
{
char *nameptr; /* Pointer to ":port" */
snprintf(server_name, sizeof(server_name), "SERVER_NAME=%s",
- con->http.fields[HTTP_FIELD_HOST]);
+ httpGetField(con->http, HTTP_FIELD_HOST));
if ((nameptr = strrchr(server_name, ':')) != NULL && !strchr(nameptr, ']'))
*nameptr = '\0'; /* Strip trailing ":port" */
}
@@ -3857,35 +3738,35 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
envp[envc ++] = remote_user;
}
- if (con->http.version == HTTP_1_1)
+ if (httpGetVersion(con->http) == HTTP_VERSION_1_1)
envp[envc ++] = "SERVER_PROTOCOL=HTTP/1.1";
- else if (con->http.version == HTTP_1_0)
+ else if (httpGetVersion(con->http) == HTTP_VERSION_1_0)
envp[envc ++] = "SERVER_PROTOCOL=HTTP/1.0";
else
envp[envc ++] = "SERVER_PROTOCOL=HTTP/0.9";
- if (con->http.cookie)
+ if (httpGetCookie(con->http))
{
snprintf(http_cookie, sizeof(http_cookie), "HTTP_COOKIE=%s",
- con->http.cookie);
+ httpGetCookie(con->http));
envp[envc ++] = http_cookie;
}
- if (con->http.fields[HTTP_FIELD_USER_AGENT][0])
+ if (httpGetField(con->http, HTTP_FIELD_USER_AGENT)[0])
{
snprintf(http_user_agent, sizeof(http_user_agent), "HTTP_USER_AGENT=%s",
- con->http.fields[HTTP_FIELD_USER_AGENT]);
+ httpGetField(con->http, HTTP_FIELD_USER_AGENT));
envp[envc ++] = http_user_agent;
}
- if (con->http.fields[HTTP_FIELD_REFERER][0])
+ if (httpGetField(con->http, HTTP_FIELD_REFERER)[0])
{
snprintf(http_referer, sizeof(http_referer), "HTTP_REFERER=%s",
- con->http.fields[HTTP_FIELD_REFERER]);
+ httpGetField(con->http, HTTP_FIELD_REFERER));
envp[envc ++] = http_referer;
}
- if (con->operation == HTTP_GET)
+ if (con->operation == HTTP_STATE_GET)
{
envp[envc ++] = "REQUEST_METHOD=GET";
@@ -3905,7 +3786,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
sprintf(content_length, "CONTENT_LENGTH=" CUPS_LLFMT,
CUPS_LLCAST con->bytes);
snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s",
- con->http.fields[HTTP_FIELD_CONTENT_TYPE]);
+ httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE));
envp[envc ++] = "REQUEST_METHOD=POST";
envp[envc ++] = content_length;
@@ -3916,7 +3797,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
* Tell the CGI if we are using encryption...
*/
- if (con->http.tls)
+ if (httpIsEncrypted(con->http))
envp[envc ++] = "HTTPS=ON";
/*
@@ -3991,31 +3872,42 @@ valid_host(cupsd_client_t *con) /* I - Client connection */
{
cupsd_alias_t *a; /* Current alias */
cupsd_netif_t *netif; /* Current network interface */
- const char *host, /* Host field */
- *end; /* End character */
+ const char *end; /* End character */
+ char *ptr; /* Pointer into host value */
+
+ /*
+ * Copy the Host: header for later use...
+ */
+
+ strlcpy(con->clientname, httpGetField(con->http, HTTP_FIELD_HOST),
+ sizeof(con->clientname));
+ if ((ptr = strrchr(con->clientname, ':')) != NULL && !strchr(ptr, ']'))
+ {
+ *ptr++ = '\0';
+ con->clientport = atoi(ptr);
+ }
+ else
+ con->clientport = con->serverport;
- host = con->http.fields[HTTP_FIELD_HOST];
+ /*
+ * Then validate...
+ */
- if (httpAddrLocalhost(con->http.hostaddr))
+ if (httpAddrLocalhost(httpGetAddress(con->http)))
{
/*
* Only allow "localhost" or the equivalent IPv4 or IPv6 numerical
* addresses when accessing CUPS via the loopback interface...
*/
- return (!_cups_strcasecmp(host, "localhost") ||
- !_cups_strncasecmp(host, "localhost:", 10) ||
- !_cups_strcasecmp(host, "localhost.") ||
- !_cups_strncasecmp(host, "localhost.:", 11) ||
+ return (!_cups_strcasecmp(con->clientname, "localhost") ||
+ !_cups_strcasecmp(con->clientname, "localhost.") ||
#ifdef __linux
- !_cups_strcasecmp(host, "localhost.localdomain") ||
- !_cups_strncasecmp(host, "localhost.localdomain:", 22) ||
+ !_cups_strcasecmp(con->clientname, "localhost.localdomain") ||
#endif /* __linux */
- !strcmp(host, "127.0.0.1") ||
- !strncmp(host, "127.0.0.1:", 10) ||
- !strcmp(host, "[::1]") ||
- !strncmp(host, "[::1]:", 6));
+ !strcmp(con->clientname, "127.0.0.1") ||
+ !strcmp(con->clientname, "[::1]"));
}
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
@@ -4023,19 +3915,18 @@ valid_host(cupsd_client_t *con) /* I - Client connection */
* Check if the hostname is something.local (Bonjour); if so, allow it.
*/
- if ((end = strrchr(host, '.')) != NULL && end > host &&
- (!end[1] || end[1] == ':'))
+ if ((end = strrchr(con->clientname, '.')) != NULL && end > con->clientname &&
+ !end[1])
{
/*
* "." on end, work back to second-to-last "."...
*/
- for (end --; end > host && *end != '.'; end --);
+
+ for (end --; end > con->clientname && *end != '.'; end --);
}
if (end && (!_cups_strcasecmp(end, ".local") ||
- !_cups_strncasecmp(end, ".local:", 7) ||
- !_cups_strcasecmp(end, ".local.") ||
- !_cups_strncasecmp(end, ".local.:", 8)))
+ !_cups_strcasecmp(end, ".local.")))
return (1);
#endif /* HAVE_DNSSD || HAVE_AVAHI */
@@ -4043,22 +3934,16 @@ valid_host(cupsd_client_t *con) /* I - Client connection */
* Check if the hostname is an IP address...
*/
- if (isdigit(*host & 255) || *host == '[')
+ if (isdigit(con->clientname[0] & 255) || con->clientname[0] == '[')
{
/*
* Possible IPv4/IPv6 address...
*/
- char temp[1024], /* Temporary string */
- *ptr; /* Pointer into temporary string */
http_addrlist_t *addrlist; /* List of addresses */
- strlcpy(temp, host, sizeof(temp));
- if ((ptr = strrchr(temp, ':')) != NULL && !strchr(ptr, ']'))
- *ptr = '\0'; /* Strip :port from host value */
-
- if ((addrlist = httpAddrGetList(temp, AF_UNSPEC, NULL)) != NULL)
+ if ((addrlist = httpAddrGetList(con->clientname, AF_UNSPEC, NULL)) != NULL)
{
/*
* Good IPv4/IPv6 address...
@@ -4084,16 +3969,15 @@ valid_host(cupsd_client_t *con) /* I - Client connection */
if (!strcmp(a->name, "*"))
return (1);
- if (!_cups_strncasecmp(host, a->name, a->namelen))
+ if (!_cups_strncasecmp(con->clientname, a->name, a->namelen))
{
/*
- * Prefix matches; check the character at the end - it must be ":", ".",
- * ".:", or nul...
+ * Prefix matches; check the character at the end - it must be "." or nul.
*/
- end = host + a->namelen;
+ end = con->clientname + a->namelen;
- if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':')))
+ if (!*end || (*end == '.' && !end[1]))
return (1);
}
}
@@ -4110,16 +3994,15 @@ valid_host(cupsd_client_t *con) /* I - Client connection */
if (!strcmp(a->name, "*"))
return (1);
- if (!_cups_strncasecmp(host, a->name, a->namelen))
+ if (!_cups_strncasecmp(con->clientname, a->name, a->namelen))
{
/*
- * Prefix matches; check the character at the end - it must be ":", ".",
- * ".:", or nul...
+ * Prefix matches; check the character at the end - it must be "." or nul.
*/
- end = host + a->namelen;
+ end = con->clientname + a->namelen;
- if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':')))
+ if (!*end || (*end == '.' && !end[1]))
return (1);
}
}
@@ -4133,16 +4016,15 @@ valid_host(cupsd_client_t *con) /* I - Client connection */
netif;
netif = (cupsd_netif_t *)cupsArrayNext(NetIFList))
{
- if (!_cups_strncasecmp(host, netif->hostname, netif->hostlen))
+ if (!_cups_strncasecmp(con->clientname, netif->hostname, netif->hostlen))
{
/*
- * Prefix matches; check the character at the end - it must be ":", ".",
- * ".:", or nul...
+ * Prefix matches; check the character at the end - it must be "." or nul.
*/
- end = host + netif->hostlen;
+ end = con->clientname + netif->hostlen;
- if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':')))
+ if (!*end || (*end == '.' && !end[1]))
return (1);
}
}
@@ -4164,43 +4046,29 @@ write_file(cupsd_client_t *con, /* I - Client connection */
{
con->file = open(filename, O_RDONLY);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] write_file code=%d, filename=\"%s\" (%d), "
- "type=\"%s\", filestats=%p", con->http.fd,
- code, filename, con->file, type ? type : "(null)", filestats);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "write_file: code=%d, filename=\"%s\" (%d), type=\"%s\", filestats=%p.", code, filename, con->file, type ? type : "(null)", filestats);
if (con->file < 0)
return (0);
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
- con->pipe_pid = 0;
+ con->pipe_pid = 0;
+ con->sent_header = 1;
- if (!cupsdSendHeader(con, code, type, CUPSD_AUTH_NONE))
- return (0);
+ httpClearFields(con->http);
- if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n",
- httpGetDateString(filestats->st_mtime)) < 0)
- return (0);
- if (httpPrintf(HTTP(con), "Content-Length: " CUPS_LLFMT "\r\n",
- CUPS_LLCAST filestats->st_size) < 0)
- return (0);
- if (httpPrintf(HTTP(con), "\r\n") < 0)
- return (0);
+ httpSetLength(con->http, (size_t)filestats->st_size);
- if (cupsdFlushHeader(con) < 0)
- return (0);
+ httpSetField(con->http, HTTP_FIELD_LAST_MODIFIED,
+ httpGetDateString(filestats->st_mtime));
- con->http.data_encoding = HTTP_ENCODE_LENGTH;
- con->http.data_remaining = filestats->st_size;
+ if (!cupsdSendHeader(con, code, type, CUPSD_AUTH_NONE))
+ return (0);
- if (con->http.data_remaining <= INT_MAX)
- con->http._data_remaining = con->http.data_remaining;
- else
- con->http._data_remaining = INT_MAX;
+ cupsdAddSelect(httpGetFd(con->http), NULL, (cupsd_selfunc_t)cupsdWriteClient, con);
- cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient,
- (cupsd_selfunc_t)cupsdWriteClient, con);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Sending file.");
return (1);
}
@@ -4213,17 +4081,17 @@ write_file(cupsd_client_t *con, /* I - Client connection */
static void
write_pipe(cupsd_client_t *con) /* I - Client connection */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Client %d] write_pipe CGI output on fd %d",
- con->http.fd, con->file);
+ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "write_pipe: CGI output on fd %d.", con->file);
con->file_ready = 1;
cupsdRemoveSelect(con->file);
- cupsdAddSelect(con->http.fd, NULL, (cupsd_selfunc_t)cupsdWriteClient, con);
+ cupsdAddSelect(httpGetFd(con->http), NULL, (cupsd_selfunc_t)cupsdWriteClient, con);
+
+ cupsdLogClient(con, CUPSD_LOG_DEBUG, "CGI data ready to be sent.");
}
/*
- * End of "$Id: client.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: client.c 12978 2015-11-17 19:29:52Z msweet $".
*/
diff --git a/scheduler/client.h b/scheduler/client.h
index 106e43e..5096c4f 100644
--- a/scheduler/client.h
+++ b/scheduler/client.h
@@ -1,16 +1,16 @@
/*
- * "$Id: client.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: client.h 11717 2014-03-21 16:42:53Z msweet $"
*
- * Client definitions for the CUPS scheduler.
+ * Client definitions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#ifdef HAVE_AUTHORIZATION_H
@@ -24,7 +24,8 @@
struct cupsd_client_s
{
- http_t http; /* HTTP client connection */
+ int number; /* Connection number */
+ http_t *http; /* HTTP client connection */
ipp_t *request, /* IPP request information */
*response; /* IPP response information */
cupsd_location_t *best; /* Best match for AAA */
@@ -45,6 +46,7 @@ struct cupsd_client_s
int file; /* Input/output file */
int file_ready; /* Input ready on file/pipe? */
int pipe_pid; /* Pipe process ID (or 0 if not a pipe) */
+ http_status_t pipe_status; /* HTTP status from pipe process */
int sent_header, /* Non-zero if sent HTTP header */
got_fields, /* Non-zero if all fields seen */
header_used; /* Number of header bytes used */
@@ -53,7 +55,9 @@ struct cupsd_client_s
#ifdef HAVE_SSL
int auto_ssl; /* Automatic test for SSL/TLS */
#endif /* HAVE_SSL */
- http_addr_t clientaddr; /* Client address */
+ http_addr_t clientaddr; /* Client's server address */
+ char clientname[256];/* Client's server name for connection */
+ int clientport; /* Client's server port for connection */
char servername[256];/* Server name for connection */
int serverport; /* Server port for connection */
#ifdef HAVE_GSSAPI
@@ -65,7 +69,7 @@ struct cupsd_client_s
#endif /* HAVE_AUTHORIZATION_H */
};
-#define HTTP(con) &((con)->http)
+#define HTTP(con) ((con)->http)
/*
@@ -77,6 +81,9 @@ typedef struct
int fd; /* File descriptor for this server */
http_addr_t address; /* Bind address of socket */
http_encryption_t encryption; /* To encrypt or not to encrypt... */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ int on_demand; /* Is this a socket from launchd/systemd? */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
} cupsd_listener_t;
@@ -84,7 +91,9 @@ typedef struct
* Globals...
*/
-VAR int ListenBackLog VALUE(SOMAXCONN),
+VAR int LastClientNumber VALUE(0),
+ /* Last client connection number */
+ ListenBackLog VALUE(SOMAXCONN),
/* Max backlog of pending connections */
LocalPort VALUE(631),
/* Local port to use */
@@ -116,7 +125,6 @@ extern void cupsdAcceptClient(cupsd_listener_t *lis);
extern void cupsdCloseAllClients(void);
extern int cupsdCloseClient(cupsd_client_t *con);
extern void cupsdDeleteAllListeners(void);
-extern int cupsdFlushHeader(cupsd_client_t *con);
extern void cupsdPauseListening(void);
extern int cupsdProcessIPPRequest(cupsd_client_t *con);
extern void cupsdReadClient(cupsd_client_t *con);
@@ -140,5 +148,5 @@ extern int cupsdStartTLS(cupsd_client_t *con);
/*
- * End of "$Id: client.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: client.h 11717 2014-03-21 16:42:53Z msweet $".
*/
diff --git a/scheduler/colorman.c b/scheduler/colorman.c
index be064b6..0d90dde 100644
--- a/scheduler/colorman.c
+++ b/scheduler/colorman.c
@@ -1,22 +1,22 @@
/*
- * "$Id: colorman.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: colorman.c 12619 2015-05-06 21:00:19Z msweet $"
*
- * Color management routines for the CUPS scheduler.
+ * Color management routines for the CUPS scheduler.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * Original DBUS/colord code is Copyright 2011 Red Hat, Inc.
+ * Original DBUS/colord code is Copyright 2011 Red Hat, Inc.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
@@ -25,40 +25,18 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Contents:
- *
- * cupsdRegisterColor() - Register vendor color profiles in a PPD
- * file.
- * cupsdStartColor() - Initialize color management.
- * cupsdStopColor() - Shutdown color management.
- * cupsdUnregisterColor() - Unregister vendor color profiles in a PPD
- * file.
- * apple_init_profile() - Initialize a color profile.
- * apple_register_profiles() - Register color profiles for a printer.
- * apple_unregister_profiles() - Remove color profiles for the specified
- * printer.
- * colord_create_device() - Create a device and register profiles.
- * colord_create_profile() - Create a color profile for a printer.
- * colord_delete_device() - Delete a device
- * colord_device_add_profile() - Assign a profile to a device.
- * colord_dict_add_strings() - Add two strings to a dictionary.
- * colord_find_device() - Finds a device
- * colord_get_qualifier_format() - Get the qualifier format.
- * colord_register_printer() - Register profiles for a printer.
- * colord_unregister_printer() - Unregister profiles for a printer.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
@@ -173,8 +151,11 @@ cupsdRegisterColor(cupsd_printer_t *p) /* I - Printer */
}
#elif defined(HAVE_DBUS)
- colord_unregister_printer(p);
- colord_register_printer(p);
+ if (!RunUser)
+ {
+ colord_unregister_printer(p);
+ colord_register_printer(p);
+ }
#endif /* __APPLE__ */
}
@@ -208,7 +189,8 @@ void
cupsdStopColor(void)
{
#if !defined(__APPLE__) && defined(HAVE_DBUS)
- dbus_connection_unref(colord_con);
+ if (colord_con)
+ dbus_connection_unref(colord_con);
colord_con = NULL;
#endif /* !__APPLE__ && HAVE_DBUS */
}
@@ -226,7 +208,8 @@ cupsdUnregisterColor(cupsd_printer_t *p)/* I - Printer */
apple_unregister_profiles(p);
#elif defined(HAVE_DBUS)
- colord_unregister_printer(p);
+ if (!RunUser)
+ colord_unregister_printer(p);
#endif /* __APPLE__ */
}
@@ -327,9 +310,7 @@ apple_init_profile(
if (iccfile && *iccfile)
{
- url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
- (const UInt8 *)iccfile,
- strlen(iccfile), false);
+ url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8 *)iccfile, (CFIndex)strlen(iccfile), false);
if (url)
{
@@ -387,7 +368,7 @@ apple_register_profiles(
* Make sure ColorSync is available...
*/
- if (ColorSyncRegisterDevice == NULL)
+ if (&ColorSyncRegisterDevice == NULL)
return;
/*
@@ -887,7 +868,7 @@ apple_unregister_profiles(
* Make sure ColorSync is available...
*/
- if (ColorSyncUnregisterDevice != NULL)
+ if (&ColorSyncUnregisterDevice != NULL)
{
CFUUIDRef deviceUUID; /* Device UUID */
@@ -1538,5 +1519,5 @@ colord_unregister_printer(
/*
- * End of "$Id: colorman.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: colorman.c 12619 2015-05-06 21:00:19Z msweet $".
*/
diff --git a/scheduler/colorman.h b/scheduler/colorman.h
index a95adcf..3360fd4 100644
--- a/scheduler/colorman.h
+++ b/scheduler/colorman.h
@@ -1,5 +1,5 @@
/*
- * "$Id: colorman.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: colorman.h 3833 2012-05-23 22:51:18Z msweet $"
*
* Color management definitions for the CUPS scheduler.
*
@@ -24,5 +24,5 @@ extern void cupsdUnregisterColor(cupsd_printer_t *p);
/*
- * End of "$Id: colorman.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: colorman.h 3833 2012-05-23 22:51:18Z msweet $".
*/
diff --git a/scheduler/conf.c b/scheduler/conf.c
index 7ae8fed..f3e6514 100644
--- a/scheduler/conf.c
+++ b/scheduler/conf.c
@@ -1,39 +1,16 @@
/*
- * "$Id: conf.c 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: conf.c 12819 2015-07-31 13:52:00Z msweet $"
*
- * Configuration routines for the CUPS scheduler.
+ * Configuration routines for the CUPS scheduler.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddAlias() - Add a host alias.
- * cupsdCheckPermissions() - Fix the mode and ownership of a file or
- * directory.
- * cupsdDefaultAuthType() - Get the default AuthType.
- * cupsdFreeAliases() - Free all of the alias entries.
- * cupsdReadConfiguration() - Read the cupsd.conf file.
- * get_address() - Get an address + port number from a line.
- * get_addr_and_mask() - Get an IP address and netmask.
- * mime_error_cb() - Log a MIME error.
- * parse_aaa() - Parse authentication, authorization, and access
- * control lines.
- * parse_fatal_errors() - Parse FatalErrors values in a string.
- * parse_groups() - Parse system group names in a string.
- * parse_protocols() - Parse browse protocols in a string.
- * parse_variable() - Parse a variable line.
- * read_cupsd_conf() - Read the cupsd.conf configuration file.
- * read_cups_files_conf() - Read the cups-files.conf configuration file.
- * read_location() - Read a <Location path> definition.
- * read_policy() - Read a <Policy name> definition.
- * set_policy_defaults() - Set default policy values as needed.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -44,6 +21,12 @@
#include <stdarg.h>
#include <grp.h>
#include <sys/utsname.h>
+#ifdef HAVE_ASL_H
+# include <asl.h>
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+# define SD_JOURNAL_SUPPRESS_LOCATION
+# include <systemd/sd-journal.h>
+#endif /* HAVE_ASL_H */
#include <syslog.h>
#ifdef HAVE_LIBPAPER
@@ -70,7 +53,8 @@ typedef enum
CUPSD_VARTYPE_TIME, /* Time interval option */
CUPSD_VARTYPE_STRING, /* String option */
CUPSD_VARTYPE_BOOLEAN, /* Boolean option */
- CUPSD_VARTYPE_PATHNAME /* File/directory name option */
+ CUPSD_VARTYPE_PATHNAME, /* File/directory name option */
+ CUPSD_VARTYPE_PERM /* File/directory permissions */
} cupsd_vartype_t;
typedef struct
@@ -107,13 +91,16 @@ static const cupsd_var_t cupsd_vars[] =
#ifdef HAVE_GSSAPI
{ "GSSServiceName", &GSSServiceName, CUPSD_VARTYPE_STRING },
#endif /* HAVE_GSSAPI */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ { "IdleExitTimeout", &IdleExitTimeout, CUPSD_VARTYPE_TIME },
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
{ "JobKillDelay", &JobKillDelay, CUPSD_VARTYPE_TIME },
{ "JobRetryLimit", &JobRetryLimit, CUPSD_VARTYPE_INTEGER },
{ "JobRetryInterval", &JobRetryInterval, CUPSD_VARTYPE_TIME },
{ "KeepAliveTimeout", &KeepAliveTimeout, CUPSD_VARTYPE_TIME },
{ "KeepAlive", &KeepAlive, CUPSD_VARTYPE_BOOLEAN },
#ifdef HAVE_LAUNCHD
- { "LaunchdTimeout", &LaunchdTimeout, CUPSD_VARTYPE_TIME },
+ { "LaunchdTimeout", &IdleExitTimeout, CUPSD_VARTYPE_TIME },
#endif /* HAVE_LAUNCHD */
{ "LimitRequestBody", &MaxRequestSize, CUPSD_VARTYPE_INTEGER },
{ "ListenBackLog", &ListenBackLog, CUPSD_VARTYPE_INTEGER },
@@ -127,7 +114,7 @@ static const cupsd_var_t cupsd_vars[] =
{ "MaxJobs", &MaxJobs, CUPSD_VARTYPE_INTEGER },
{ "MaxJobsPerPrinter", &MaxJobsPerPrinter, CUPSD_VARTYPE_INTEGER },
{ "MaxJobsPerUser", &MaxJobsPerUser, CUPSD_VARTYPE_INTEGER },
- { "MaxJobTime", &MaxJobTime, CUPSD_VARTYPE_INTEGER },
+ { "MaxJobTime", &MaxJobTime, CUPSD_VARTYPE_TIME },
{ "MaxLeaseDuration", &MaxLeaseDuration, CUPSD_VARTYPE_TIME },
{ "MaxLogSize", &MaxLogSize, CUPSD_VARTYPE_INTEGER },
{ "MaxRequestSize", &MaxRequestSize, CUPSD_VARTYPE_INTEGER },
@@ -152,13 +139,13 @@ static const cupsd_var_t cupsfiles_vars[] =
{
{ "AccessLog", &AccessLog, CUPSD_VARTYPE_STRING },
{ "CacheDir", &CacheDir, CUPSD_VARTYPE_STRING },
- { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_INTEGER },
+ { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_PERM },
{ "DataDir", &DataDir, CUPSD_VARTYPE_STRING },
{ "DocumentRoot", &DocumentRoot, CUPSD_VARTYPE_STRING },
{ "ErrorLog", &ErrorLog, CUPSD_VARTYPE_STRING },
{ "FileDevice", &FileDevice, CUPSD_VARTYPE_BOOLEAN },
{ "FontPath", &FontPath, CUPSD_VARTYPE_STRING },
- { "LogFilePerm", &LogFilePerm, CUPSD_VARTYPE_INTEGER },
+ { "LogFilePerm", &LogFilePerm, CUPSD_VARTYPE_PERM },
{ "LPDConfigFile", &LPDConfigFile, CUPSD_VARTYPE_STRING },
{ "PageLog", &PageLog, CUPSD_VARTYPE_STRING },
{ "Printcap", &Printcap, CUPSD_VARTYPE_STRING },
@@ -166,10 +153,7 @@ static const cupsd_var_t cupsfiles_vars[] =
{ "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING },
{ "ServerBin", &ServerBin, CUPSD_VARTYPE_PATHNAME },
#ifdef HAVE_SSL
- { "ServerCertificate", &ServerCertificate, CUPSD_VARTYPE_PATHNAME },
-# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
- { "ServerKey", &ServerKey, CUPSD_VARTYPE_PATHNAME },
-# endif /* HAVE_LIBSSL || HAVE_GNUTLS */
+ { "ServerKeychain", &ServerKeychain, CUPSD_VARTYPE_PATHNAME },
#endif /* HAVE_SSL */
{ "ServerRoot", &ServerRoot, CUPSD_VARTYPE_PATHNAME },
{ "SMBConfigFile", &SMBConfigFile, CUPSD_VARTYPE_STRING },
@@ -236,7 +220,7 @@ cupsdAddAlias(cups_array_t *aliases, /* I - Array of aliases */
return;
a->namelen = namelen;
- strcpy(a->name, name); /* OK since a->name is allocated */
+ memcpy(a->name, name, namelen + 1); /* OK since a->name is allocated */
cupsArrayAdd(aliases, a);
}
@@ -250,9 +234,9 @@ int /* O - 0 on success, -1 on error, 1 on warning */
cupsdCheckPermissions(
const char *filename, /* I - File/directory name */
const char *suffix, /* I - Additional file/directory name */
- int mode, /* I - Permissions */
- int user, /* I - Owner */
- int group, /* I - Group */
+ mode_t mode, /* I - Permissions */
+ uid_t user, /* I - Owner */
+ gid_t group, /* I - Group */
int is_dir, /* I - 1 = directory, 0 = file */
int create_dir) /* I - 1 = create directory, -1 = create w/o logging, 0 = not */
{
@@ -291,8 +275,20 @@ cupsdCheckPermissions(
"Unable to create directory \"%s\" - %s", filename,
strerror(errno));
else
- syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
+ asl_release(m);
+ }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
+#else
+ syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
return (-1);
}
@@ -329,7 +325,20 @@ cupsdCheckPermissions(
if (create_dir >= 0)
cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a directory.", filename);
else
+#ifdef HAVE_ASL_H
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "\"%s\" is not a directory.", filename);
+ asl_release(m);
+ }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "\"%s\" is not a directory.", filename);
+#else
syslog(LOG_ERR, "\"%s\" is not a directory.", filename);
+#endif /* HAVE_ASL_H */
return (-1);
}
@@ -358,8 +367,20 @@ cupsdCheckPermissions(
"Unable to change ownership of \"%s\" - %s", filename,
strerror(errno));
else
- syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
+ asl_release(m);
+ }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
+#else
+ syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
return (1);
}
@@ -378,8 +399,20 @@ cupsdCheckPermissions(
"Unable to change permissions of \"%s\" - %s", filename,
strerror(errno));
else
- syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
+ asl_release(m);
+ }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
+#else
+ syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
return (1);
}
@@ -429,7 +462,7 @@ cupsdDefaultAuthType(void)
* to use it...
*/
- if (gss_init_sec_context == NULL)
+ if (&gss_init_sec_context == NULL)
return (default_auth_type = CUPSD_AUTH_BASIC);
# endif /* __APPLE__ */
@@ -589,7 +622,6 @@ cupsdReadConfiguration(void)
"%p %u %j %T %P %C %{job-billing} "
"%{job-originating-host-name} %{job-name} %{media} %{sides}");
cupsdSetString(&Printcap, CUPS_DEFAULT_PRINTCAP);
- cupsdSetString(&PrintcapGUI, "/usr/bin/glpoptions");
cupsdSetString(&FontPath, CUPS_FONTPATH);
cupsdSetString(&RemoteRoot, "remroot");
cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
@@ -614,12 +646,13 @@ cupsdReadConfiguration(void)
ClassifyOverride = 0;
#ifdef HAVE_SSL
-# ifdef HAVE_CDSASSL
- cupsdSetString(&ServerCertificate, "/Library/Keychains/System.keychain");
+# ifdef HAVE_GNUTLS
+ cupsdSetString(&ServerKeychain, "ssl");
# else
- cupsdSetString(&ServerCertificate, "ssl/server.crt");
- cupsdSetString(&ServerKey, "ssl/server.key");
-# endif /* HAVE_CDSASSL */
+ cupsdSetString(&ServerKeychain, "/Library/Keychains/System.keychain");
+# endif /* HAVE_GNUTLS */
+
+ _httpTLSSetOptions(0);
#endif /* HAVE_SSL */
language = cupsLangDefault();
@@ -709,7 +742,6 @@ cupsdReadConfiguration(void)
default_auth_type = CUPSD_AUTH_BASIC;
#ifdef HAVE_SSL
DefaultEncryption = HTTP_ENCRYPT_REQUIRED;
- SSLOptions = CUPSD_SSL_NONE;
#endif /* HAVE_SSL */
DirtyCleanInterval = DEFAULT_KEEPALIVE;
JobKillDelay = DEFAULT_TIMEOUT;
@@ -735,6 +767,7 @@ cupsdReadConfiguration(void)
NumSystemGroups = 0;
ReloadTimeout = DEFAULT_KEEPALIVE;
RootCertDuration = 300;
+ Sandboxing = CUPSD_SANDBOXING_STRICT;
StrictConformance = FALSE;
SyncOnClose = FALSE;
Timeout = DEFAULT_TIMEOUT;
@@ -779,9 +812,9 @@ cupsdReadConfiguration(void)
DefaultLeaseDuration = 86400;
MaxLeaseDuration = 0;
-#ifdef HAVE_LAUNCHD
- LaunchdTimeout = 10;
-#endif /* HAVE_LAUNCHD */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ IdleExitTimeout = 60;
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
/*
* Setup environment variables...
@@ -804,8 +837,20 @@ cupsdReadConfiguration(void)
if (TestConfigFile)
printf("\"%s\" contains errors.\n", CupsFilesFile);
else
- syslog(LOG_LPR, "Unable to read \"%s\" due to errors.",
- CupsFilesFile);
+#ifdef HAVE_ASL_H
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
+ asl_release(m);
+ }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
+#else
+ syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
+#endif /* HAVE_ASL_H */
return (0);
}
@@ -814,8 +859,20 @@ cupsdReadConfiguration(void)
cupsdLogMessage(CUPSD_LOG_INFO, "No %s, using defaults.", CupsFilesFile);
else
{
- syslog(LOG_LPR, "Unable to open \"%s\": %s", CupsFilesFile,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
+ asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
+#else
+ syslog(LOG_LPR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
+#endif /* HAVE_ASL_H */
+
return (0);
}
@@ -828,8 +885,19 @@ cupsdReadConfiguration(void)
if ((fp = cupsFileOpen(ConfigurationFile, "r")) == NULL)
{
- syslog(LOG_LPR, "Unable to open \"%s\": %s", ConfigurationFile,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
+ asl_release(m);
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
+#else
+ syslog(LOG_LPR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
+#endif /* HAVE_ASL_H */
+
return (0);
}
@@ -842,8 +910,20 @@ cupsdReadConfiguration(void)
if (TestConfigFile)
printf("\"%s\" contains errors.\n", ConfigurationFile);
else
- syslog(LOG_LPR, "Unable to read \"%s\" due to errors.",
- ConfigurationFile);
+#ifdef HAVE_ASL_H
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
+ asl_release(m);
+ }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
+#else
+ syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
+#endif /* HAVE_ASL_H */
return (0);
}
@@ -970,12 +1050,24 @@ cupsdReadConfiguration(void)
* Open the system log for cupsd if necessary...
*/
-#ifdef HAVE_VSYSLOG
+ if (!LogStderr)
+ {
+ if (!strcmp(AccessLog, "stderr"))
+ cupsdSetString(&AccessLog, "syslog");
+
+ if (!strcmp(ErrorLog, "stderr"))
+ cupsdSetString(&ErrorLog, "syslog");
+
+ if (!strcmp(PageLog, "stderr"))
+ cupsdSetString(&PageLog, "syslog");
+ }
+
+#if defined(HAVE_VSYSLOG) && !defined(HAVE_ASL_H) && !defined(HAVE_SYSTEMD_SD_JOURNAL_H)
if (!strcmp(AccessLog, "syslog") ||
!strcmp(ErrorLog, "syslog") ||
!strcmp(PageLog, "syslog"))
openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR);
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_VSYSLOG && !HAVE_ASL_H && !HAVE_SYSTEMD_SD_JOURNAL_H */
/*
* Make sure each of the log files exists and gets rotated as necessary...
@@ -1015,8 +1107,11 @@ cupsdReadConfiguration(void)
* Log the error and reset the group to a safe value...
*/
- cupsdLogMessage(CUPSD_LOG_NOTICE,
+ cupsdLogMessage(CUPSD_LOG_ERROR,
"Group and SystemGroup cannot use the same groups.");
+ if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_PERMISSIONS))
+ return (0);
+
cupsdLogMessage(CUPSD_LOG_INFO, "Resetting Group to \"nobody\"...");
group = getgrnam("nobody");
@@ -1084,24 +1179,11 @@ cupsdReadConfiguration(void)
cupsdSetStringf(&CacheDir, "%s/%s", ServerRoot, CacheDir);
#ifdef HAVE_SSL
- if (ServerCertificate[0] != '/')
- cupsdSetStringf(&ServerCertificate, "%s/%s", ServerRoot, ServerCertificate);
-
- if (!strncmp(ServerRoot, ServerCertificate, strlen(ServerRoot)) &&
- cupsdCheckPermissions(ServerCertificate, NULL, 0600, RunUser, Group,
- 0, 0) < 0 &&
- (FatalErrors & CUPSD_FATAL_PERMISSIONS))
- return (0);
+ if (ServerKeychain[0] != '/')
+ cupsdSetStringf(&ServerKeychain, "%s/%s", ServerRoot, ServerKeychain);
-# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
- if (ServerKey[0] != '/')
- cupsdSetStringf(&ServerKey, "%s/%s", ServerRoot, ServerKey);
-
- if (!strncmp(ServerRoot, ServerKey, strlen(ServerRoot)) &&
- cupsdCheckPermissions(ServerKey, NULL, 0600, RunUser, Group, 0, 0) < 0 &&
- (FatalErrors & CUPSD_FATAL_PERMISSIONS))
- return (0);
-# endif /* HAVE_LIBSSL || HAVE_GNUTLS */
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Using keychain \"%s\" for server name \"%s\".", ServerKeychain, ServerName);
+ cupsSetServerCredentials(ServerKeychain, ServerName, 1);
#endif /* HAVE_SSL */
/*
@@ -1113,7 +1195,7 @@ cupsdReadConfiguration(void)
if ((cupsdCheckPermissions(RequestRoot, NULL, 0710, RunUser,
Group, 1, 1) < 0 ||
- cupsdCheckPermissions(CacheDir, NULL, 0775, RunUser,
+ cupsdCheckPermissions(CacheDir, NULL, 0770, RunUser,
Group, 1, 1) < 0 ||
cupsdCheckPermissions(temp, NULL, 0775, RunUser,
Group, 1, 1) < 0 ||
@@ -1189,6 +1271,8 @@ cupsdReadConfiguration(void)
cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot);
}
+ setenv("TMPDIR", TempDir, 1);
+
/*
* Make sure the temporary directory has the right permissions...
*/
@@ -1212,6 +1296,19 @@ cupsdReadConfiguration(void)
cupsdUpdateEnv();
+ /*
+ * Validate the default error policy...
+ */
+
+ if (strcmp(ErrorPolicy, "retry-current-job") &&
+ strcmp(ErrorPolicy, "abort-job") &&
+ strcmp(ErrorPolicy, "retry-job") &&
+ strcmp(ErrorPolicy, "stop-printer"))
+ {
+ cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\", resetting to \"stop-printer\".", ErrorPolicy);
+ cupsdSetString(&ErrorPolicy, "stop-printer");
+ }
+
/*
* Update default paper size setting as needed...
*/
@@ -1334,6 +1431,7 @@ cupsdReadConfiguration(void)
cupsdAddString(&(p->job_attrs), "job-name");
cupsdAddString(&(p->job_attrs), "job-originating-host-name");
cupsdAddString(&(p->job_attrs), "job-originating-user-name");
+ cupsdAddString(&(p->job_attrs), "phone");
cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateAccess default");
cupsdAddString(&(p->sub_access), "@OWNER");
@@ -1542,7 +1640,7 @@ cupsdReadConfiguration(void)
if (!mimeType(MimeDatabase, "application", "octet-stream"))
NumMimeTypes ++;
- if ((MimeTypes = calloc(NumMimeTypes, sizeof(const char *))) == NULL)
+ if ((MimeTypes = calloc((size_t)NumMimeTypes, sizeof(const char *))) == NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to allocate memory for %d MIME types.",
@@ -1816,7 +1914,8 @@ get_addr_and_mask(const char *value, /* I - String from config file */
* Merge everything into a 32-bit IPv4 address in ip[3]...
*/
- ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3];
+ ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
+ (unsigned)val[2]) << 8) | (unsigned)val[3];
if (ipcount < 4)
mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
@@ -1884,7 +1983,8 @@ get_addr_and_mask(const char *value, /* I - String from config file */
* Merge everything into a 32-bit IPv4 address in ip[3]...
*/
- ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3];
+ ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
+ (unsigned)val[2]) << 8) | (unsigned)val[3];
if (ipcount < 4)
mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
@@ -1911,7 +2011,8 @@ get_addr_and_mask(const char *value, /* I - String from config file */
mask + 3) != 4)
return (0);
- mask[3] |= ((((mask[0] << 8) | mask[1]) << 8) | mask[2]) << 8;
+ mask[3] |= (((((unsigned)mask[0] << 8) | (unsigned)mask[1]) << 8) |
+ (unsigned)mask[2]) << 8;
mask[0] = mask[1] = mask[2] = 0;
}
else
@@ -2034,8 +2135,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
else if (!_cups_strcasecmp(value, "always"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Encryption value \"%s\" on line %d is invalid in this "
- "context. Using \"required\" instead.", value, linenum);
+ "Encryption value \"%s\" on line %d of %s is invalid in this "
+ "context. Using \"required\" instead.", value, linenum, ConfigurationFile);
loc->encryption = HTTP_ENCRYPT_REQUIRED;
}
@@ -2046,7 +2147,7 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
else
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown Encryption value %s on line %d.", value, linenum);
+ "Unknown Encryption value %s on line %d of %s.", value, linenum, ConfigurationFile);
return (0);
}
}
@@ -2062,8 +2163,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
loc->order_type = CUPSD_AUTH_DENY;
else
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
return (0);
}
}
@@ -2165,8 +2266,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
if (!get_addr_and_mask(value, ip, mask))
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
return (0);
}
@@ -2201,20 +2302,6 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
if (loc->level == CUPSD_AUTH_ANON)
loc->level = CUPSD_AUTH_USER;
}
- else if (!_cups_strcasecmp(value, "digest"))
- {
- loc->type = CUPSD_AUTH_DIGEST;
-
- if (loc->level == CUPSD_AUTH_ANON)
- loc->level = CUPSD_AUTH_USER;
- }
- else if (!_cups_strcasecmp(value, "basicdigest"))
- {
- loc->type = CUPSD_AUTH_BASICDIGEST;
-
- if (loc->level == CUPSD_AUTH_ANON)
- loc->level = CUPSD_AUTH_USER;
- }
else if (!_cups_strcasecmp(value, "default"))
{
loc->type = CUPSD_AUTH_DEFAULT;
@@ -2234,8 +2321,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
else
{
cupsdLogMessage(CUPSD_LOG_WARN,
- "Unknown authorization type %s on line %d.",
- value, linenum);
+ "Unknown authorization type %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
return (0);
}
}
@@ -2261,8 +2348,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
cupsdLogMessage(CUPSD_LOG_WARN,
"\"AuthClass %s\" is deprecated; consider using "
- "\"Require valid-user\" on line %d.",
- value, linenum);
+ "\"Require valid-user\" on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(value, "group"))
{
@@ -2270,8 +2357,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
cupsdLogMessage(CUPSD_LOG_WARN,
"\"AuthClass %s\" is deprecated; consider using "
- "\"Require user @groupname\" on line %d.",
- value, linenum);
+ "\"Require user @groupname\" on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(value, "system"))
{
@@ -2281,14 +2368,14 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
cupsdLogMessage(CUPSD_LOG_WARN,
"\"AuthClass %s\" is deprecated; consider using "
- "\"Require user @SYSTEM\" on line %d.",
- value, linenum);
+ "\"Require user @SYSTEM\" on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else
{
cupsdLogMessage(CUPSD_LOG_WARN,
- "Unknown authorization class %s on line %d.",
- value, linenum);
+ "Unknown authorization class %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
return (0);
}
}
@@ -2298,8 +2385,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
cupsdLogMessage(CUPSD_LOG_WARN,
"\"AuthGroupName %s\" directive is deprecated; consider "
- "using \"Require user @%s\" on line %d.",
- value, value, linenum);
+ "using \"Require user @%s\" on line %d of %s.",
+ value, value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "Require"))
{
@@ -2325,8 +2412,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
loc->level = CUPSD_AUTH_GROUP;
else
{
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
return (0);
}
@@ -2388,8 +2475,8 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
loc->satisfy = CUPSD_AUTH_SATISFY_ANY;
else
{
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
return (0);
}
}
@@ -2714,6 +2801,41 @@ parse_variable(
}
break;
+ case CUPSD_VARTYPE_PERM :
+ if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing permissions value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ else if (!isdigit(*value & 255))
+ {
+ /* TODO: Add chmod UGO syntax support */
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad permissions value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ else
+ {
+ int n = strtol(value, NULL, 8);
+ /* Permissions value */
+
+ if (n < 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad negative permissions value for %s on line %d of "
+ "%s.", line, linenum, filename);
+ return (0);
+ }
+ else
+ {
+ *((mode_t *)var->ptr) = (mode_t)n;
+ }
+ }
+ break;
+
case CUPSD_VARTYPE_TIME :
if (!value)
{
@@ -2930,15 +3052,60 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
JobRetryInterval = atoi(value);
cupsdLogMessage(CUPSD_LOG_WARN,
"FaxRetryInterval is deprecated; use "
- "JobRetryInterval on line %d.", linenum);
+ "JobRetryInterval on line %d of %s.", linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "FaxRetryLimit") && value)
{
JobRetryLimit = atoi(value);
cupsdLogMessage(CUPSD_LOG_WARN,
"FaxRetryLimit is deprecated; use "
- "JobRetryLimit on line %d.", linenum);
+ "JobRetryLimit on line %d of %s.", linenum, ConfigurationFile);
}
+#ifdef HAVE_SSL
+ else if (!_cups_strcasecmp(line, "SSLOptions"))
+ {
+ /*
+ * SSLOptions [AllowRC4] [AllowSSL3] [None]
+ */
+
+ int options = 0; /* SSL/TLS options */
+
+ if (value)
+ {
+ char *start, /* Start of option */
+ *end; /* End of option */
+
+ for (start = value; *start; start = end)
+ {
+ /*
+ * Find end of keyword...
+ */
+
+ end = start;
+ while (*end && !_cups_isspace(*end))
+ end ++;
+
+ if (*end)
+ *end++ = '\0';
+
+ /*
+ * Compare...
+ */
+
+ if (!_cups_strcasecmp(start, "AllowRC4"))
+ options |= _HTTP_TLS_ALLOW_RC4;
+ else if (!_cups_strcasecmp(start, "AllowSSL3"))
+ options |= _HTTP_TLS_ALLOW_SSL3;
+ else if (!_cups_strcasecmp(start, "None"))
+ options = 0;
+ else if (_cups_strcasecmp(start, "NoEmptyFragments"))
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown SSL option %s at line %d.", start, linenum);
+ }
+ }
+
+ _httpTLSSetOptions(options);
+ }
+#endif /* HAVE_SSL */
else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")
#ifdef HAVE_SSL
|| !_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen")
@@ -2979,14 +3146,20 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
lis;
lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
if (httpAddrEqual(&(addr->addr), &(lis->address)) &&
- _httpAddrPort(&(addr->addr)) == _httpAddrPort(&(lis->address)))
+ httpAddrPort(&(addr->addr)) == httpAddrPort(&(lis->address)))
break;
if (lis)
{
- httpAddrString(&lis->address, temp, sizeof(temp));
- cupsdLogMessage(CUPSD_LOG_WARN,
- "Duplicate listen address \"%s\" ignored.", temp);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ if (!lis->on_demand)
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+ {
+ httpAddrString(&lis->address, temp, sizeof(temp));
+ cupsdLogMessage(CUPSD_LOG_WARN,
+ "Duplicate listen address \"%s\" ignored.", temp);
+ }
+
continue;
}
@@ -3035,11 +3208,11 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else
#endif /* AF_LOCAL */
cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d (IPv%d)", temp,
- _httpAddrPort(&(lis->address)),
- _httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6);
+ httpAddrPort(&(lis->address)),
+ httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6);
if (!httpAddrLocalhost(&(lis->address)))
- RemotePort = _httpAddrPort(&(lis->address));
+ RemotePort = httpAddrPort(&(lis->address));
}
/*
@@ -3061,8 +3234,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
if (protocols < 0)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown browse protocol \"%s\" on line %d.",
- value, linenum);
+ "Unknown browse protocol \"%s\" on line %d of %s.",
+ value, linenum, ConfigurationFile);
break;
}
@@ -3078,10 +3251,6 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
default_auth_type = CUPSD_AUTH_NONE;
else if (!_cups_strcasecmp(value, "basic"))
default_auth_type = CUPSD_AUTH_BASIC;
- else if (!_cups_strcasecmp(value, "digest"))
- default_auth_type = CUPSD_AUTH_DIGEST;
- else if (!_cups_strcasecmp(value, "basicdigest"))
- default_auth_type = CUPSD_AUTH_BASICDIGEST;
#ifdef HAVE_GSSAPI
else if (!_cups_strcasecmp(value, "negotiate"))
default_auth_type = CUPSD_AUTH_NEGOTIATE;
@@ -3091,8 +3260,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else
{
cupsdLogMessage(CUPSD_LOG_WARN,
- "Unknown default authorization type %s on line %d.",
- value, linenum);
+ "Unknown default authorization type %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
@@ -3113,8 +3282,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else
{
cupsdLogMessage(CUPSD_LOG_WARN,
- "Unknown default encryption %s on line %d.",
- value, linenum);
+ "Unknown default encryption %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
@@ -3135,8 +3304,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else if (!_cups_strcasecmp(value, "double"))
HostNameLookups = 2;
else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "AccessLogLevel") && value)
{
@@ -3150,9 +3319,11 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS;
else if (!_cups_strcasecmp(value, "config"))
AccessLogLevel = CUPSD_ACCESSLOG_CONFIG;
+ else if (!_cups_strcasecmp(value, "none"))
+ AccessLogLevel = CUPSD_ACCESSLOG_NONE;
else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "LogLevel") && value)
{
@@ -3181,8 +3352,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else if (!_cups_strcasecmp(value, "none"))
LogLevel = CUPSD_LOG_NONE;
else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "LogTimeFormat") && value)
{
@@ -3195,8 +3366,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else if (!_cups_strcasecmp(value, "usecs"))
LogTimeFormat = CUPSD_TIME_USECS;
else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "ServerTokens") && value)
{
@@ -3227,8 +3398,8 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
else if (!_cups_strcasecmp(value, "None"))
cupsdClearString(&ServerHeader);
else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
}
else if (!_cups_strcasecmp(line, "PassEnv") && value)
{
@@ -3304,26 +3475,9 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
}
else
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing value for SetEnv directive on line %d.",
- linenum);
+ "Missing value for SetEnv directive on line %d of %s.",
+ linenum, ConfigurationFile);
}
-#ifdef HAVE_SSL
- else if (!_cups_strcasecmp(line, "SSLOptions"))
- {
- /*
- * SSLOptions options
- */
-
- if (!value || !_cups_strcasecmp(value, "none"))
- SSLOptions = CUPSD_SSL_NONE;
- else if (!_cups_strcasecmp(value, "noemptyfragments"))
- SSLOptions = CUPSD_SSL_NOEMPTY;
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown value \"%s\" for SSLOptions directive on "
- "line %d.", value, linenum);
- }
-#endif /* HAVE_SSL */
else if (!_cups_strcasecmp(line, "AccessLog") ||
!_cups_strcasecmp(line, "CacheDir") ||
!_cups_strcasecmp(line, "ConfigFilePerm") ||
@@ -3344,6 +3498,7 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
!_cups_strcasecmp(line, "ServerBin") ||
!_cups_strcasecmp(line, "ServerCertificate") ||
!_cups_strcasecmp(line, "ServerKey") ||
+ !_cups_strcasecmp(line, "ServerKeychain") ||
!_cups_strcasecmp(line, "ServerRoot") ||
!_cups_strcasecmp(line, "SMBConfigFile") ||
!_cups_strcasecmp(line, "StateDir") ||
@@ -3397,7 +3552,7 @@ read_cups_files_conf(cups_file_t *fp) /* I - File to read from */
*/
if (isdigit(value[0]))
- Group = atoi(value);
+ Group = (gid_t)atoi(value);
else
{
endgrent();
@@ -3436,6 +3591,30 @@ read_cups_files_conf(cups_file_t *fp) /* I - File to read from */
return (0);
}
}
+ else if (!_cups_strcasecmp(line, "Sandboxing") && value)
+ {
+ /*
+ * Level of sandboxing?
+ */
+
+ if (!_cups_strcasecmp(value, "off") && getuid())
+ {
+ Sandboxing = CUPSD_SANDBOXING_OFF;
+ cupsdLogMessage(CUPSD_LOG_WARN, "Disabling sandboxing is not recommended (line %d of %s)", linenum, CupsFilesFile);
+ }
+ else if (!_cups_strcasecmp(value, "relaxed"))
+ Sandboxing = CUPSD_SANDBOXING_RELAXED;
+ else if (!_cups_strcasecmp(value, "strict"))
+ Sandboxing = CUPSD_SANDBOXING_STRICT;
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown Sandboxing \"%s\" on line %d of %s.",
+ value, linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
+ }
else if (!_cups_strcasecmp(line, "SystemGroup") && value)
{
/*
@@ -3472,7 +3651,7 @@ read_cups_files_conf(cups_file_t *fp) /* I - File to read from */
return (0);
}
else
- User = atoi(value);
+ User = (uid_t)atoi(value);
}
else
{
@@ -3506,6 +3685,15 @@ read_cups_files_conf(cups_file_t *fp) /* I - File to read from */
}
}
}
+ else if (!_cups_strcasecmp(line, "ServerCertificate") ||
+ !_cups_strcasecmp(line, "ServerKey"))
+ {
+ cupsdLogMessage(CUPSD_LOG_INFO,
+ "The \"%s\" directive on line %d of %s is no longer "
+ "supported; this will become an error in a future "
+ "release.",
+ line, linenum, CupsFilesFile);
+ }
else if (!parse_variable(CupsFilesFile, linenum, line, value,
sizeof(cupsfiles_vars) / sizeof(cupsfiles_vars[0]),
cupsfiles_vars) &&
@@ -3535,8 +3723,8 @@ read_location(cups_file_t *fp, /* I - Configuration file */
if ((parent = cupsdFindLocation(location)) != NULL)
- cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Location %s> on line %d.",
- location, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Location %s> on line %d of %s.",
+ location, linenum, ConfigurationFile);
else if ((parent = cupsdNewLocation(location)) == NULL)
return (0);
else
@@ -3561,7 +3749,7 @@ read_location(cups_file_t *fp, /* I - Configuration file */
{
if (!value)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
else
@@ -3596,8 +3784,8 @@ read_location(cups_file_t *fp, /* I - Configuration file */
else if (!strcmp(value, "TRACE"))
loc->limit |= CUPSD_AUTH_LIMIT_TRACE;
else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d.",
- value, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d of %s.",
+ value, linenum, ConfigurationFile);
for (value = valptr; isspace(*value & 255); value ++);
}
@@ -3612,15 +3800,15 @@ read_location(cups_file_t *fp, /* I - Configuration file */
loc = parent;
else if (!value)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
else if (!parse_aaa(loc, line, value, linenum))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown Location directive %s on line %d.",
- line, linenum);
+ "Unknown Location directive %s on line %d of %s.",
+ line, linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
@@ -3659,8 +3847,8 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
*/
if ((pol = cupsdFindPolicy(policy)) != NULL)
- cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Policy %s> on line %d.",
- policy, linenum);
+ cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Policy %s> on line %d of %s.",
+ policy, linenum, ConfigurationFile);
else if ((pol = cupsdAddPolicy(policy)) == NULL)
return (0);
@@ -3681,8 +3869,8 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
{
if (op)
cupsdLogMessage(CUPSD_LOG_WARN,
- "Missing </Limit> before </Policy> on line %d.",
- linenum);
+ "Missing </Limit> before </Policy> on line %d of %s.",
+ linenum, ConfigurationFile);
set_policy_defaults(pol);
@@ -3692,7 +3880,7 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
{
if (!value)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
else
@@ -3718,15 +3906,15 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
ops[num_ops] = IPP_ANY_OPERATION;
else if ((ops[num_ops] = ippOpValue(value)) == IPP_BAD_OPERATION)
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Bad IPP operation name \"%s\" on line %d.",
- value, linenum);
+ "Bad IPP operation name \"%s\" on line %d of %s.",
+ value, linenum, ConfigurationFile);
else
num_ops ++;
}
else
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Too many operations listed on line %d.",
- linenum);
+ "Too many operations listed on line %d of %s.",
+ linenum, ConfigurationFile);
for (value = valptr; isspace(*value & 255); value ++);
}
@@ -3767,7 +3955,7 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
}
else if (!value)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
@@ -3780,7 +3968,7 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"%s directive must appear outside <Limit>...</Limit> "
- "on line %d.", line, linenum);
+ "on line %d of %s.", line, linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
@@ -3878,16 +4066,16 @@ read_policy(cups_file_t *fp, /* I - Configuration file */
else if (!op)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing <Limit ops> directive before %s on line %d.",
- line, linenum);
+ "Missing <Limit ops> directive before %s on line %d of %s.",
+ line, linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
}
else if (!parse_aaa(op, line, value, linenum))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown Policy Limit directive %s on line %d.",
- line, linenum);
+ "Unknown Policy Limit directive %s on line %d of %s.",
+ line, linenum, ConfigurationFile);
if (FatalErrors & CUPSD_FATAL_CONFIG)
return (0);
@@ -3916,121 +4104,106 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
* Verify that we have an explicit policy for Validate-Job, Cancel-Jobs,
* Cancel-My-Jobs, Close-Job, and CUPS-Get-Document, which ensures that
* upgrades do not introduce new security issues...
+ *
+ * CUPS STR #4659: Allow a lone <Limit All> policy.
*/
- if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL ||
- op->op == IPP_ANY_OPERATION)
+ if (cupsArrayCount(pol->ops) > 1)
{
- if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL &&
- op->op != IPP_ANY_OPERATION)
+ if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL ||
+ op->op == IPP_ANY_OPERATION)
{
- /*
- * Add a new limit for Validate-Job using the Print-Job limit as a
- * template...
- */
+ if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL &&
+ op->op != IPP_ANY_OPERATION)
+ {
+ /*
+ * Add a new limit for Validate-Job using the Print-Job limit as a
+ * template...
+ */
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Validate-Job defined in policy %s "
- "- using Print-Job's policy.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s - using Print-Job's policy.", pol->name);
- cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB);
+ cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB);
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s and no suitable template found.", pol->name);
}
- else
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Validate-Job defined in policy %s "
- "and no suitable template found.", pol->name);
- }
- if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL ||
- op->op == IPP_ANY_OPERATION)
- {
- if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL &&
- op->op != IPP_ANY_OPERATION)
+ if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL ||
+ op->op == IPP_ANY_OPERATION)
{
- /*
- * Add a new limit for Cancel-Jobs using the Pause-Printer limit as a
- * template...
- */
+ if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL &&
+ op->op != IPP_ANY_OPERATION)
+ {
+ /*
+ * Add a new limit for Cancel-Jobs using the Pause-Printer limit as a
+ * template...
+ */
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Cancel-Jobs defined in policy %s "
- "- using Pause-Printer's policy.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s - using Pause-Printer's policy.", pol->name);
- cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS);
+ cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS);
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s and no suitable template found.", pol->name);
}
- else
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Cancel-Jobs defined in policy %s "
- "and no suitable template found.", pol->name);
- }
- if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL ||
- op->op == IPP_ANY_OPERATION)
- {
- if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
- op->op != IPP_ANY_OPERATION)
+ if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL ||
+ op->op == IPP_ANY_OPERATION)
{
- /*
- * Add a new limit for Cancel-My-Jobs using the Send-Document limit as
- * a template...
- */
+ if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
+ op->op != IPP_ANY_OPERATION)
+ {
+ /*
+ * Add a new limit for Cancel-My-Jobs using the Send-Document limit as
+ * a template...
+ */
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Cancel-My-Jobs defined in policy %s "
- "- using Send-Document's policy.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s - using Send-Document's policy.", pol->name);
- cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS);
+ cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS);
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s and no suitable template found.", pol->name);
}
- else
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Cancel-My-Jobs defined in policy %s "
- "and no suitable template found.", pol->name);
- }
- if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL ||
- op->op == IPP_ANY_OPERATION)
- {
- if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
- op->op != IPP_ANY_OPERATION)
+ if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL ||
+ op->op == IPP_ANY_OPERATION)
{
- /*
- * Add a new limit for Close-Job using the Send-Document limit as a
- * template...
- */
+ if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
+ op->op != IPP_ANY_OPERATION)
+ {
+ /*
+ * Add a new limit for Close-Job using the Send-Document limit as a
+ * template...
+ */
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Close-Job defined in policy %s "
- "- using Send-Document's policy.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s - using Send-Document's policy.", pol->name);
- cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB);
+ cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB);
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s and no suitable template found.", pol->name);
}
- else
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for Close-Job defined in policy %s "
- "and no suitable template found.", pol->name);
- }
- if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL ||
- op->op == IPP_ANY_OPERATION)
- {
- if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
- op->op != IPP_ANY_OPERATION)
+ if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL ||
+ op->op == IPP_ANY_OPERATION)
{
- /*
- * Add a new limit for CUPS-Get-Document using the Send-Document
- * limit as a template...
- */
+ if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
+ op->op != IPP_ANY_OPERATION)
+ {
+ /*
+ * Add a new limit for CUPS-Get-Document using the Send-Document
+ * limit as a template...
+ */
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for CUPS-Get-Document defined in policy %s "
- "- using Send-Document's policy.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s - using Send-Document's policy.", pol->name);
- cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT);
+ cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT);
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s and no suitable template found.", pol->name);
}
- else
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No limit for CUPS-Get-Document defined in policy %s "
- "and no suitable template found.", pol->name);
}
/*
@@ -4040,18 +4213,14 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
if (!pol->job_access)
{
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No JobPrivateAccess defined in policy %s "
- "- using defaults.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateAccess defined in policy %s - using defaults.", pol->name);
cupsdAddString(&(pol->job_access), "@OWNER");
cupsdAddString(&(pol->job_access), "@SYSTEM");
}
if (!pol->job_attrs)
{
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No JobPrivateValues defined in policy %s "
- "- using defaults.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateValues defined in policy %s - using defaults.", pol->name);
cupsdAddString(&(pol->job_attrs), "job-name");
cupsdAddString(&(pol->job_attrs), "job-originating-host-name");
cupsdAddString(&(pol->job_attrs), "job-originating-user-name");
@@ -4060,18 +4229,14 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
if (!pol->sub_access)
{
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No SubscriptionPrivateAccess defined in policy %s "
- "- using defaults.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateAccess defined in policy %s - using defaults.", pol->name);
cupsdAddString(&(pol->sub_access), "@OWNER");
cupsdAddString(&(pol->sub_access), "@SYSTEM");
}
if (!pol->sub_attrs)
{
- cupsdLogMessage(CUPSD_LOG_WARN,
- "No SubscriptionPrivateValues defined in policy %s "
- "- using defaults.", pol->name);
+ cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateValues defined in policy %s - using defaults.", pol->name);
cupsdAddString(&(pol->sub_attrs), "notify-events");
cupsdAddString(&(pol->sub_attrs), "notify-pull-method");
cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri");
@@ -4082,5 +4247,5 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
/*
- * End of "$Id: conf.c 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: conf.c 12819 2015-07-31 13:52:00Z msweet $".
*/
diff --git a/scheduler/conf.h b/scheduler/conf.h
index 8bf0749..59cb157 100644
--- a/scheduler/conf.h
+++ b/scheduler/conf.h
@@ -1,16 +1,16 @@
/*
- * "$Id: conf.h 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: conf.h 12689 2015-06-03 19:49:54Z msweet $"
*
- * Configuration file definitions for the CUPS scheduler.
+ * Configuration file definitions for the CUPS scheduler.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
@@ -20,9 +20,10 @@
typedef enum
{
- CUPSD_LOG_PPD = -4, /* Used internally for PPD keywords */
+ CUPSD_LOG_PPD = -5, /* Used internally for PPD keywords */
CUPSD_LOG_ATTR, /* Used internally for attributes */
- CUPSD_LOG_STATE, /* Used internally for state-reasons */
+ CUPSD_LOG_STATE, /* Used internally for printer-state-reasons */
+ CUPSD_LOG_JOBSTATE, /* Used internally for job-state-reasons */
CUPSD_LOG_PAGE, /* Used internally for page logging */
CUPSD_LOG_NONE,
CUPSD_LOG_EMERG, /* Emergency issues */
@@ -38,6 +39,7 @@ typedef enum
typedef enum
{
+ CUPSD_ACCESSLOG_NONE, /* Log no requests */
CUPSD_ACCESSLOG_CONFIG, /* Log config requests */
CUPSD_ACCESSLOG_ACTIONS, /* Log config, print, and job management requests */
CUPSD_ACCESSLOG_ALL /* Log everything */
@@ -49,6 +51,13 @@ typedef enum
CUPSD_TIME_USECS /* Standard format with microseconds */
} cupsd_time_t;
+typedef enum
+{
+ CUPSD_SANDBOXING_OFF, /* No sandboxing */
+ CUPSD_SANDBOXING_RELAXED, /* Relaxed sandboxing */
+ CUPSD_SANDBOXING_STRICT /* Strict sandboxing */
+} cupsd_sandboxing_t;
+
/*
* FatalErrors flags...
@@ -73,14 +82,6 @@ typedef enum
/*
- * SSL options (bits)...
- */
-
-#define CUPSD_SSL_NONE 0 /* No special options */
-#define CUPSD_SSL_NOEMPTY 1 /* Do not insert empty fragments */
-
-
-/*
* ServerAlias data...
*/
@@ -149,38 +150,44 @@ VAR char *AccessLog VALUE(NULL),
/* Temporary directory */
*Printcap VALUE(NULL),
/* Printcap file */
- *PrintcapGUI VALUE(NULL),
- /* GUI program to use for IRIX */
*FontPath VALUE(NULL),
/* Font search path */
*RemoteRoot VALUE(NULL),
/* Remote root user */
*Classification VALUE(NULL);
/* Classification of system */
-VAR uid_t User VALUE(1);
+VAR uid_t User VALUE(1),
/* User ID for server */
+ RunUser VALUE(0);
+ /* User to run as, used for files */
VAR gid_t Group VALUE(0);
/* Group ID for server */
VAR cupsd_accesslog_t AccessLogLevel VALUE(CUPSD_ACCESSLOG_ACTIONS);
/* Access log level */
VAR int ClassifyOverride VALUE(0),
/* Allow overrides? */
- ConfigFilePerm VALUE(0640),
- /* Permissions for config files */
LogDebugHistory VALUE(200),
/* Amount of automatic debug history */
FatalErrors VALUE(CUPSD_FATAL_CONFIG),
/* Which errors are fatal? */
StrictConformance VALUE(FALSE),
/* Require strict IPP conformance? */
- SyncOnClose VALUE(FALSE),
+ SyncOnClose VALUE(FALSE);
/* Call fsync() when closing files? */
- LogFilePerm VALUE(0644);
+VAR mode_t ConfigFilePerm VALUE(0640U),
+ /* Permissions for config files */
+ LogFilePerm VALUE(0644U);
/* Permissions for log files */
VAR cupsd_loglevel_t LogLevel VALUE(CUPSD_LOG_WARN);
/* Error log level */
VAR cupsd_time_t LogTimeFormat VALUE(CUPSD_TIME_STANDARD);
/* Log file time format */
+VAR cups_file_t *LogStderr VALUE(NULL);
+ /* Stderr file, if any */
+VAR cupsd_sandboxing_t Sandboxing VALUE(CUPSD_SANDBOXING_STRICT);
+ /* Sandboxing level */
+VAR int UseSandboxing VALUE(1);
+ /* Use sandboxing for child procs? */
VAR int MaxClients VALUE(100),
/* Maximum number of clients */
MaxClientsPerHost VALUE(0),
@@ -211,8 +218,6 @@ VAR int MaxClients VALUE(100),
/* Timeout before reload from SIGHUP */
RootCertDuration VALUE(300),
/* Root certificate update interval */
- RunUser VALUE(0),
- /* User to run as, used for files */
PrintcapFormat VALUE(PRINTCAP_BSD),
/* Format of printcap file? */
DefaultShared VALUE(TRUE),
@@ -237,20 +242,14 @@ VAR const char **MimeTypes VALUE(NULL);
/* Array of MIME types */
#ifdef HAVE_SSL
-VAR char *ServerCertificate VALUE(NULL);
- /* Server certificate file */
-# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
-VAR char *ServerKey VALUE(NULL);
- /* Server key file */
-# endif /* HAVE_LIBSSL || HAVE_GNUTLS */
-VAR int SSLOptions VALUE(CUPSD_SSL_NONE);
- /* SSL/TLS options */
+VAR char *ServerKeychain VALUE(NULL);
+ /* Keychain holding cert + key */
#endif /* HAVE_SSL */
-#ifdef HAVE_LAUNCHD
-VAR int LaunchdTimeout VALUE(10);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+VAR int IdleExitTimeout VALUE(60);
/* Time after which an idle cupsd will exit */
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
#ifdef HAVE_AUTHORIZATION_H
VAR char *SystemGroupAuthKey VALUE(NULL);
@@ -273,18 +272,21 @@ gss_cred_id_t ServerCreds; /* Server's GSS credentials */
extern void cupsdAddAlias(cups_array_t *aliases, const char *name);
extern int cupsdCheckLogFile(cups_file_t **lf, const char *logname);
extern int cupsdCheckPermissions(const char *filename,
- const char *suffix, int mode,
- int user, int group, int is_dir,
+ const char *suffix, mode_t mode,
+ uid_t user, gid_t group, int is_dir,
int create_dir);
extern int cupsdCheckProgram(const char *filename, cupsd_printer_t *p);
extern int cupsdDefaultAuthType(void);
extern void cupsdFreeAliases(cups_array_t *aliases);
extern char *cupsdGetDateTime(struct timeval *t, cupsd_time_t format);
+extern int cupsdLogClient(cupsd_client_t *con, int level,
+ const char *message, ...)
+ __attribute__((__format__(__printf__, 3, 4)));
extern void cupsdLogFCMessage(void *context, _cups_fc_result_t result,
const char *message);
#ifdef HAVE_GSSAPI
-extern int cupsdLogGSSMessage(int level, int major_status,
- int minor_status,
+extern int cupsdLogGSSMessage(int level, OM_uint32 major_status,
+ OM_uint32 minor_status,
const char *message, ...);
#endif /* HAVE_GSSAPI */
extern int cupsdLogJob(cupsd_job_t *job, int level, const char *message,
@@ -298,5 +300,5 @@ extern int cupsdWriteErrorLog(int level, const char *message);
/*
- * End of "$Id: conf.h 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: conf.h 12689 2015-06-03 19:49:54Z msweet $".
*/
diff --git a/scheduler/cups-deviced.c b/scheduler/cups-deviced.c
index 7a5929f..85264ed 100644
--- a/scheduler/cups-deviced.c
+++ b/scheduler/cups-deviced.c
@@ -1,27 +1,16 @@
/*
- * "$Id: cups-deviced.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-deviced.c 11782 2014-03-28 21:03:43Z msweet $"
*
- * Device scanning mini-daemon for CUPS.
+ * Device scanning mini-daemon for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Scan for devices and return an IPP response.
- * add_device() - Add a new device to the list.
- * compare_devices() - Compare device names to eliminate duplicates.
- * get_current_time() - Get the current time as a double value in seconds.
- * get_device() - Get a device from a backend.
- * process_children() - Process all dead children...
- * sigchld_handler() - Handle 'child' signals from old processes.
- * start_backend() - Run a backend to gather the available devices.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -82,7 +71,7 @@ static cupsd_backend_t backends[MAX_BACKENDS];
static struct pollfd backend_fds[MAX_BACKENDS];
/* Array for poll() */
static cups_array_t *devices; /* Array of devices */
-static int normal_user; /* Normal user ID */
+static uid_t normal_user; /* Normal user ID */
static int device_limit; /* Maximum number of devices */
static int send_class, /* Send device-class attribute? */
send_info, /* Send device-info attribute? */
@@ -182,7 +171,7 @@ main(int argc, /* I - Number of command-line args */
return (1);
}
- normal_user = atoi(argv[4]);
+ normal_user = (uid_t)atoi(argv[4]);
if (normal_user <= 0)
{
fprintf(stderr, "ERROR: [cups-deviced] Bad user %d!\n", normal_user);
@@ -281,8 +270,7 @@ main(int argc, /* I - Number of command-line args */
* all others run as the unprivileged user...
*/
- start_backend(dent->filename,
- !(dent->fileinfo.st_mode & (S_IRWXG | S_IRWXO)));
+ start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IRWXO)));
}
cupsDirClose(dir);
@@ -309,7 +297,7 @@ main(int argc, /* I - Number of command-line args */
timeout = (int)(1000 * (end_time - current_time));
- if (poll(backend_fds, num_backends, timeout) > 0)
+ if (poll(backend_fds, (nfds_t)num_backends, timeout) > 0)
{
for (i = 0; i < num_backends; i ++)
if (backend_fds[i].revents && backends[i].pipe)
@@ -326,8 +314,7 @@ main(int argc, /* I - Number of command-line args */
break;
}
}
- while (bpipe->ptr &&
- memchr(bpipe->ptr, '\n', bpipe->end - bpipe->ptr));
+ while (bpipe->ptr && memchr(bpipe->ptr, '\n', (size_t)(bpipe->end - bpipe->ptr)));
}
}
@@ -806,5 +793,5 @@ start_backend(const char *name, /* I - Backend to run */
/*
- * End of "$Id: cups-deviced.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-deviced.c 11782 2014-03-28 21:03:43Z msweet $".
*/
diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx
index 4a3d34f..7da6572 100644
--- a/scheduler/cups-driverd.cxx
+++ b/scheduler/cups-driverd.cxx
@@ -1,48 +1,20 @@
/*
- * "$Id: cups-driverd.cxx 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-driverd.cxx 12733 2015-06-12 01:21:05Z msweet $"
*
- * PPD/driver support for CUPS.
+ * PPD/driver support for CUPS.
*
- * This program handles listing and installing static PPD files, PPD files
- * created from driver information files, and dynamically generated PPD files
- * using driver helper programs.
+ * This program handles listing and installing static PPD files, PPD files
+ * created from driver information files, and dynamically generated PPD files
+ * using driver helper programs.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Scan for drivers and return an IPP response.
- * add_ppd() - Add a PPD file.
- * cat_drv() - Generate a PPD from a driver info file.
- * cat_ppd() - Copy a PPD file to stdout.
- * copy_static() - Copy a static PPD file to stdout.
- * cat_tar() - Copy an archived PPD file to stdout.
- * compare_inodes() - Compare two inodes.
- * compare_matches() - Compare PPD match scores for sorting.
- * compare_names() - Compare PPD filenames for sorting.
- * compare_ppds() - Compare PPD file make and model names for sorting.
- * dump_ppds_dat() - Dump the contents of the ppds.dat file.
- * free_array() - Free an array of strings.
- * get_file() - Get the filename associated with a request.
- * list_ppds() - List PPD files.
- * load_drv() - Load the PPDs from a driver information file.
- * load_drivers() - Load driver-generated PPD files.
- * load_ppd() - Load a PPD file.
- * load_ppds() - Load PPD files recursively.
- * load_ppds_dat() - Load the ppds.dat file.
- * load_tar() - Load archived PPD files.
- * read_tar() - Read a file header from an archive.
- * regex_device_id() - Compile a regular expression based on the 1284 device
- * ID.
- * regex_string() - Construct a regular expression to compare a simple
- * string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -61,7 +33,7 @@
* Constants...
*/
-#define PPD_SYNC 0x50504437 /* Sync word for ppds.dat (PPD7) */
+#define PPD_SYNC 0x50504438 /* Sync word for ppds.dat (PPD8) */
#define PPD_MAX_LANG 32 /* Maximum languages */
#define PPD_MAX_PROD 32 /* Maximum products */
#define PPD_MAX_VERS 32 /* Maximum versions */
@@ -70,9 +42,12 @@
#define PPD_TYPE_PDF 1 /* PDF PPD */
#define PPD_TYPE_RASTER 2 /* CUPS raster PPD */
#define PPD_TYPE_FAX 3 /* Facsimile/MFD PPD */
-#define PPD_TYPE_UNKNOWN 4 /* Other/hybrid PPD */
-#define PPD_TYPE_DRV 5 /* Driver info file */
-#define PPD_TYPE_ARCHIVE 6 /* Archive file */
+#define PPD_TYPE_OBJECT_ANY 4 /* 3D (AMF/STL/g-code) PPD */
+#define PPD_TYPE_OBJECT_DIRECT 5 /* 3D (AMF/STL/g-code) PPD over any connection */
+#define PPD_TYPE_OBJECT_STORAGE 6 /* 3D (AMF/STL/g-code) PPD for storage to SD card, etc. */
+#define PPD_TYPE_UNKNOWN 7 /* Other/hybrid PPD */
+#define PPD_TYPE_DRV 8 /* Driver info file */
+#define PPD_TYPE_ARCHIVE 9 /* Archive file */
#define TAR_BLOCK 512 /* Number of bytes in a block */
#define TAR_BLOCKS 10 /* Blocking factor */
@@ -163,6 +138,9 @@ static const char * const PPDTypes[] = /* ppd-type values */
"pdf",
"raster",
"fax",
+ "object",
+ "object-direct",
+ "object-storage",
"unknown",
"drv",
"archive"
@@ -291,7 +269,7 @@ add_ppd(const char *filename, /* I - PPD filename */
ppd->found = 1;
ppd->record.mtime = mtime;
- ppd->record.size = size;
+ ppd->record.size = (off_t)size;
ppd->record.model_number = model_number;
ppd->record.type = type;
@@ -645,7 +623,7 @@ cat_tar(const char *name, /* I - PPD name */
*/
if ((fp = get_file(name, request_id, "model", filename, sizeof(filename),
- &ppdname)) == NULL)
+ &ppdname)) == NULL || !ppdname)
return (1);
/*
@@ -674,7 +652,7 @@ cat_tar(const char *name, /* I - PPD name */
if ((size_t)(bytes = (curinfo.st_size - total)) > sizeof(buffer))
bytes = sizeof(buffer);
- if ((bytes = cupsFileRead(fp, buffer, bytes)) < 0)
+ if ((bytes = cupsFileRead(fp, buffer, (size_t)bytes)) < 0)
{
if (errno == EINTR || errno == EAGAIN)
{
@@ -686,7 +664,7 @@ cat_tar(const char *name, /* I - PPD name */
break;
}
}
- else if (bytes > 0 && fwrite(buffer, bytes, 1, stdout) != 1)
+ else if (bytes > 0 && fwrite(buffer, (size_t)bytes, 1, stdout) != 1)
break;
}
@@ -1053,8 +1031,6 @@ list_ppds(int request_id, /* I - Request ID */
*type_str; /* ppd-type option */
int model_number, /* ppd-model-number value */
type, /* ppd-type value */
- make_and_model_len, /* Length of ppd-make-and-model */
- product_len, /* Length of ppd-product */
send_device_id, /* Send ppd-device-id? */
send_make, /* Send ppd-make? */
send_make_and_model, /* Send ppd-make-and-model? */
@@ -1065,6 +1041,8 @@ list_ppds(int request_id, /* I - Request ID */
send_psversion, /* Send ppd-psversion? */
send_type, /* Send ppd-type? */
sent_header; /* Sent the IPP header? */
+ size_t make_and_model_len, /* Length of ppd-make-and-model */
+ product_len; /* Length of ppd-product */
regex_t *device_id_re, /* Regular expression for matching device ID */
*make_and_model_re; /* Regular expression for matching make and model */
regmatch_t re_matches[6]; /* Regular expression matches */
@@ -1349,7 +1327,7 @@ list_ppds(int request_id, /* I - Request ID */
if (device_id_re &&
!regexec(device_id_re, ppd->record.device_id,
- (int)(sizeof(re_matches) / sizeof(re_matches[0])),
+ (size_t)(sizeof(re_matches) / sizeof(re_matches[0])),
re_matches, 0))
{
/*
@@ -1379,13 +1357,13 @@ list_ppds(int request_id, /* I - Request ID */
if (make_and_model_re &&
!regexec(make_and_model_re, ppd->record.make_and_model,
- (int)(sizeof(re_matches) / sizeof(re_matches[0])),
+ (size_t)(sizeof(re_matches) / sizeof(re_matches[0])),
re_matches, 0))
{
// See how much of the make-and-model string we matched...
if (re_matches[0].rm_so == 0)
{
- if (re_matches[0].rm_eo == make_and_model_len)
+ if ((size_t)re_matches[0].rm_eo == make_and_model_len)
ppd->matches += 3; // Exact match
else
ppd->matches += 2; // Prefix match
@@ -1637,8 +1615,7 @@ load_drv(const char *filename, /* I - Actual filename */
* Add a dummy entry for the file...
*/
- add_ppd(name, name, "", "", "", "", "", "", mtime, size, 0,
- PPD_TYPE_DRV, "drv");
+ add_ppd(name, name, "", "", "", "", "", "", mtime, (size_t)size, 0, PPD_TYPE_DRV, "drv");
ChangedPPD = 1;
/*
@@ -1696,14 +1673,10 @@ load_drv(const char *filename, /* I - Actual filename */
if (!strcmp(product->name->value, "Product"))
{
if (!products_found)
- ppd = add_ppd(name, uri, "en", d->manufacturer->value, make_model,
- device_id ? device_id->value->value : "",
- product->value->value,
- ps_version ? ps_version->value->value : "(3010) 0",
- mtime, size, d->model_number, type, "drv");
+ ppd = add_ppd(name, uri, "en", d->manufacturer->value, make_model, device_id ? device_id->value->value : "", product->value->value,
+ ps_version ? ps_version->value->value : "(3010) 0", mtime, (size_t)size, d->model_number, type, "drv");
else if (products_found < PPD_MAX_PROD)
- strlcpy(ppd->record.products[products_found], product->value->value,
- sizeof(ppd->record.products[0]));
+ strlcpy(ppd->record.products[products_found], product->value->value, sizeof(ppd->record.products[0]));
else
break;
@@ -1711,11 +1684,7 @@ load_drv(const char *filename, /* I - Actual filename */
}
if (!products_found)
- add_ppd(name, uri, "en", d->manufacturer->value, make_model,
- device_id ? device_id->value->value : "",
- d->model_name->value,
- ps_version ? ps_version->value->value : "(3010) 0",
- mtime, size, d->model_number, type, "drv");
+ add_ppd(name, uri, "en", d->manufacturer->value, make_model, device_id ? device_id->value->value : "", d->model_name->value, ps_version ? ps_version->value->value : "(3010) 0", mtime, (size_t)size, d->model_number, type, "drv");
}
src->release();
@@ -1810,7 +1779,7 @@ load_drivers(cups_array_t *include, /* I - Drivers to include */
scheme_end = scheme + strlen(scheme) - 1;
if ((scheme_end > scheme && *scheme_end == '*' &&
- !strncmp(scheme, dent->filename, scheme_end - scheme)) ||
+ !strncmp(scheme, dent->filename, (size_t)(scheme_end - scheme))) ||
!strcmp(scheme, dent->filename))
{
fputs("DEBUG: [cups-driverd] Yes, exclude!\n", stderr);
@@ -1837,7 +1806,7 @@ load_drivers(cups_array_t *include, /* I - Drivers to include */
scheme_end = scheme + strlen(scheme) - 1;
if ((scheme_end > scheme && *scheme_end == '*' &&
- !strncmp(scheme, dent->filename, scheme_end - scheme)) ||
+ !strncmp(scheme, dent->filename, (size_t)(scheme_end - scheme))) ||
!strcmp(scheme, dent->filename))
{
fputs("DEBUG: [cups-driverd] Yes, include!\n", stderr);
@@ -1877,7 +1846,7 @@ load_drivers(cups_array_t *include, /* I - Drivers to include */
device_id[0] = '\0';
product[0] = '\0';
psversion[0] = '\0';
- strcpy(type_str, "postscript");
+ strlcpy(type_str, "postscript", sizeof(type_str));
if (sscanf(line, "\"%511[^\"]\"%127s%*[ \t]\"%127[^\"]\""
"%*[ \t]\"%127[^\"]\"%*[ \t]\"%255[^\"]\""
@@ -2043,7 +2012,7 @@ load_ppd(const char *filename, /* I - Real filename */
manufacturer[0] = '\0';
device_id[0] = '\0';
lang_encoding[0] = '\0';
- strcpy(lang_version, "en");
+ strlcpy(lang_version, "en", sizeof(lang_version));
model_number = 0;
install_group = 0;
type = PPD_TYPE_POSTSCRIPT;
@@ -2132,12 +2101,28 @@ load_ppd(const char *filename, /* I - Real filename */
if (!_cups_strncasecmp(ptr, "true", 4))
type = PPD_TYPE_FAX;
}
- else if (!strncmp(line, "*cupsFilter:", 12) && type == PPD_TYPE_POSTSCRIPT)
+ else if ((!strncmp(line, "*cupsFilter:", 12) || !strncmp(line, "*cupsFilter2:", 13)) && type == PPD_TYPE_POSTSCRIPT)
{
if (strstr(line + 12, "application/vnd.cups-raster"))
type = PPD_TYPE_RASTER;
else if (strstr(line + 12, "application/vnd.cups-pdf"))
type = PPD_TYPE_PDF;
+ else if (strstr(line + 12, "application/amf") ||
+ strstr(line + 12, "application/g-code") ||
+ strstr(line + 12, "application/sla"))
+ type = PPD_TYPE_OBJECT_ANY;
+ }
+ else if (!strncmp(line, "*cups3DWorkflows:", 17))
+ {
+ int is_direct = strstr(line + 17, "direct") != NULL;
+ int is_storage = strstr(line + 17, "storage") != NULL;
+
+ if (is_direct && !is_storage)
+ type = PPD_TYPE_OBJECT_DIRECT;
+ if (!is_direct && is_storage)
+ type = PPD_TYPE_OBJECT_STORAGE;
+ else
+ type = PPD_TYPE_OBJECT_ANY;
}
else if (!strncmp(line, "*cupsModelNumber:", 17))
sscanf(line, "*cupsModelNumber:%d", &model_number);
@@ -2166,7 +2151,7 @@ load_ppd(const char *filename, /* I - Real filename */
cupsCharsetToUTF8((cups_utf8_t *)make_model, nick_name,
sizeof(make_model), _ppdGetEncoding(lang_encoding));
else
- strcpy(make_model, model_name);
+ strlcpy(make_model, model_name, sizeof(make_model));
while (isspace(make_model[0] & 255))
_cups_strcpy(make_model, make_model + 1);
@@ -2236,13 +2221,13 @@ load_ppd(const char *filename, /* I - Real filename */
if (*ptr && ptr > manufacturer)
*ptr = '\0';
else
- strcpy(manufacturer, "Other");
+ strlcpy(manufacturer, "Other", sizeof(manufacturer));
}
else if (!_cups_strncasecmp(manufacturer, "LHAG", 4) ||
!_cups_strncasecmp(manufacturer, "linotype", 8))
- strcpy(manufacturer, "LHAG");
+ strlcpy(manufacturer, "LHAG", sizeof(manufacturer));
else if (!_cups_strncasecmp(manufacturer, "Hewlett", 7))
- strcpy(manufacturer, "HP");
+ strlcpy(manufacturer, "HP", sizeof(manufacturer));
/*
* Fix the lang_version as needed...
@@ -2290,7 +2275,7 @@ load_ppd(const char *filename, /* I - Real filename */
* Unknown language; use "xx"...
*/
- strcpy(lang_version, "xx");
+ strlcpy(lang_version, "xx", sizeof(lang_version));
}
/*
@@ -2307,11 +2292,7 @@ load_ppd(const char *filename, /* I - Real filename */
fprintf(stderr, "DEBUG2: [cups-driverd] Adding ppd \"%s\"...\n", name);
- ppd = add_ppd(name, name, lang_version, manufacturer, make_model,
- device_id, (char *)cupsArrayFirst(products),
- (char *)cupsArrayFirst(psversions),
- fileinfo->st_mtime, fileinfo->st_size,
- model_number, type, scheme);
+ ppd = add_ppd(name, name, lang_version, manufacturer, make_model, device_id, (char *)cupsArrayFirst(products), (char *)cupsArrayFirst(psversions), fileinfo->st_mtime, (size_t)fileinfo->st_size, model_number, type, scheme);
if (!ppd)
return;
@@ -2519,8 +2500,8 @@ load_ppds(const char *d, /* I - Actual directory */
* See if this file has been scanned before...
*/
- strcpy(key.record.filename, name);
- strcpy(key.record.name, name);
+ strlcpy(key.record.filename, name, sizeof(key.record.filename));
+ strlcpy(key.record.name, name, sizeof(key.record.name));
ppd = (ppd_info_t *)cupsArrayFind(PPDsByName, &key);
@@ -2634,13 +2615,11 @@ load_ppds_dat(char *filename, /* I - Filename buffer */
unsigned ppdsync; /* Sync word */
int num_ppds; /* Number of PPDs */
- if (cupsFileRead(fp, (char *)&ppdsync, sizeof(ppdsync))
- == sizeof(ppdsync) &&
+ if (cupsFileRead(fp, (char *)&ppdsync, sizeof(ppdsync)) == sizeof(ppdsync) &&
ppdsync == PPD_SYNC &&
!stat(filename, &fileinfo) &&
- ((fileinfo.st_size - sizeof(ppdsync)) % sizeof(ppd_rec_t)) == 0 &&
- (num_ppds = (fileinfo.st_size - sizeof(ppdsync)) /
- sizeof(ppd_rec_t)) > 0)
+ (((size_t)fileinfo.st_size - sizeof(ppdsync)) % sizeof(ppd_rec_t)) == 0 &&
+ (num_ppds = ((size_t)fileinfo.st_size - sizeof(ppdsync)) / sizeof(ppd_rec_t)) > 0)
{
/*
* We have a ppds.dat file, so read it!
@@ -2702,8 +2681,7 @@ load_tar(const char *filename, /* I - Actual filename */
(void)filename;
- add_ppd(name, name, "", "", "", "", "", "", mtime, size, 0,
- PPD_TYPE_ARCHIVE, "file");
+ add_ppd(name, name, "", "", "", "", "", "", mtime, (size_t)size, 0, PPD_TYPE_ARCHIVE, "file");
ChangedPPD = 1;
/*
@@ -2947,5 +2925,5 @@ regex_string(const char *s) /* I - String to compare */
/*
- * End of "$Id: cups-driverd.cxx 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-driverd.cxx 12733 2015-06-12 01:21:05Z msweet $".
*/
diff --git a/scheduler/cups-exec.c b/scheduler/cups-exec.c
index 6d0d3d8..e63b163 100644
--- a/scheduler/cups-exec.c
+++ b/scheduler/cups-exec.c
@@ -1,23 +1,19 @@
/*
- * "$Id: cups-exec.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-exec.c 11817 2014-04-15 16:31:11Z msweet $"
*
- * Sandbox helper for CUPS.
+ * Sandbox helper for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2014 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
* Usage:
*
- * cups-exec /path/to/profile /path/to/program argv0 argv1 ... argvN
- *
- * Contents:
- *
- * main() - Apply sandbox profile and execute program.
+ * cups-exec /path/to/profile [-u UID] [-g GID] [-n NICE] /path/to/program argv0 argv1 ... argvN
*/
/*
@@ -25,7 +21,11 @@
*/
#include <cups/string-private.h>
+#include <cups/file.h>
#include <unistd.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <sys/stat.h>
#ifdef HAVE_SANDBOX_H
# include <sandbox.h>
# ifndef SANDBOX_NAMED_EXTERNAL
@@ -36,6 +36,13 @@
/*
+ * Local functions...
+ */
+
+static void usage(void) __attribute__((noreturn));
+
+
+/*
* 'main()' - Apply sandbox profile and execute program.
*/
@@ -43,67 +50,157 @@ int /* O - Exit status */
main(int argc, /* I - Number of command-line args */
char *argv[]) /* I - Command-line arguments */
{
- int i; /* Looping var */
+ int i; /* Looping var */
+ const char *opt; /* Current option character */
+ uid_t uid = getuid(); /* UID */
+ gid_t gid = getgid(); /* GID */
+ int niceval = 0; /* Nice value */
#ifdef HAVE_SANDBOX_H
- char *sandbox_error = NULL; /* Sandbox error, if any */
+ char *sandbox_error = NULL; /* Sandbox error, if any */
#endif /* HAVE_SANDBOX_H */
/*
+ * Parse command-line...
+ */
+
+ for (i = 1; i < argc; i ++)
+ {
+ if (argv[i][0] == '-')
+ {
+ for (opt = argv[i] + 1; *opt; opt ++)
+ {
+ switch (*opt)
+ {
+ case 'g' : /* -g gid */
+ i ++;
+ if (i >= argc)
+ usage();
+
+ gid = (gid_t)atoi(argv[i]);
+ break;
+
+ case 'n' : /* -n nice-value */
+ i ++;
+ if (i >= argc)
+ usage();
+
+ niceval = atoi(argv[i]);
+ break;
+
+ case 'u' : /* -g gid */
+ i ++;
+ if (i >= argc)
+ usage();
+
+ uid = (uid_t)atoi(argv[i]);
+ break;
+
+ default :
+ fprintf(stderr, "cups-exec: Unknown option '-%c'.\n", *opt);
+ usage();
+ }
+ }
+ }
+ else
+ break;
+ }
+
+ /*
* Check that we have enough arguments...
*/
- if (argc < 4)
+ if ((i + 3) > argc)
+ {
+ fputs("cups-exec: Insufficient arguments.\n", stderr);
+ usage();
+ }
+
+ /*
+ * Make sure side and back channel FDs are non-blocking...
+ */
+
+ fcntl(3, F_SETFL, O_NDELAY);
+ fcntl(4, F_SETFL, O_NDELAY);
+
+ /*
+ * Change UID, GID, and nice value...
+ */
+
+ if (uid)
+ nice(niceval);
+
+ if (!getuid())
{
- puts("Usage: cups-exec /path/to/profile /path/to/program argv0 argv1 ... "
- "argvN");
- return (1);
+ if (setgid(gid))
+ exit(errno + 100);
+
+ if (setgroups(1, &gid))
+ exit(errno + 100);
+
+ if (uid && setuid(uid))
+ exit(errno + 100);
}
+ umask(077);
+
#ifdef HAVE_SANDBOX_H
/*
* Run in a separate security profile...
*/
- if (strcmp(argv[1], "none") &&
- sandbox_init(argv[1], SANDBOX_NAMED_EXTERNAL, &sandbox_error))
+ if (strcmp(argv[i], "none") &&
+ sandbox_init(argv[i], SANDBOX_NAMED_EXTERNAL, &sandbox_error))
{
+ cups_file_t *fp; /* File */
+ char line[1024]; /* Line from file */
+ int linenum = 0; /* Line number in file */
+
fprintf(stderr, "DEBUG: sandbox_init failed: %s (%s)\n", sandbox_error,
strerror(errno));
sandbox_free_error(sandbox_error);
- return (1);
+
+ if ((fp = cupsFileOpen(argv[i], "r")) != NULL)
+ {
+ while (cupsFileGets(fp, line, sizeof(line)))
+ {
+ linenum ++;
+ fprintf(stderr, "DEBUG: %4d %s\n", linenum, line);
+ }
+ cupsFileClose(fp);
+ }
+
+ return (100 + EINVAL);
}
#endif /* HAVE_SANDBOX_H */
/*
- * Close file descriptors we don't need (insurance):
- *
- * 0 = stdin
- * 1 = stdout
- * 2 = stderr
- * 3 = back-channel
- * 4 = side-channel
- * 5-N = unused
- */
-
- for (i = 5; i < 1024; i ++)
- close(i);
-
- /*
* Execute the program...
*/
- execv(argv[2], argv + 3);
+ execv(argv[i + 1], argv + i + 2);
/*
* If we get here, execv() failed...
*/
fprintf(stderr, "DEBUG: execv failed: %s\n", strerror(errno));
- return (1);
+ return (errno + 100);
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(void)
+{
+ fputs("Usage: cups-exec [-g gid] [-n nice-value] [-u uid] /path/to/profile /path/to/program argv0 argv1 ... argvN\n", stderr);
+ exit(1);
}
/*
- * End of "$Id: cups-exec.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-exec.c 11817 2014-04-15 16:31:11Z msweet $".
*/
diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c
index bd6757b..4748ce0 100644
--- a/scheduler/cups-lpd.c
+++ b/scheduler/cups-lpd.c
@@ -1,27 +1,16 @@
/*
- * "$Id: cups-lpd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-lpd.c 12611 2015-05-06 15:30:36Z msweet $"
*
- * Line Printer Daemon interface for CUPS.
+ * Line Printer Daemon interface for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Process an incoming LPD request...
- * create_job() - Create a new print job.
- * get_printer() - Get the named printer and its options.
- * print_file() - Add a file to the current job.
- * recv_print_job() - Receive a print job from the client.
- * remove_jobs() - Cancel one or more jobs.
- * send_state() - Send the queue state.
- * smart_gets() - Get a line of text, removing the trailing CR and/or LF.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -40,6 +29,9 @@
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif /* HAVE_INTTYPES_H */
+#ifdef __APPLE__
+# include <vproc.h>
+#endif /* __APPLE__ */
/*
@@ -70,7 +62,7 @@ static int create_job(http_t *http, const char *dest, const char *title,
const char *docname, const char *user,
int num_options, cups_option_t *options);
static int get_printer(http_t *http, const char *name, char *dest,
- int destsize, cups_option_t **options,
+ size_t destsize, cups_option_t **options,
int *accepting, int *shared, ipp_pstate_t *state);
static int print_file(http_t *http, int id, const char *filename,
const char *docname, const char *user,
@@ -107,6 +99,9 @@ main(int argc, /* I - Number of command-line arguments */
hostip[256], /* IP address */
*hostfamily; /* Address family */
int hostlookups; /* Do hostname lookups? */
+#ifdef __APPLE__
+ vproc_transaction_t vtran = vproc_transaction_begin(NULL);
+#endif /* __APPLE__ */
/*
@@ -184,7 +179,7 @@ main(int argc, /* I - Number of command-line arguments */
if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen))
{
syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno));
- strcpy(hostname, "unknown");
+ strlcpy(hostname, "unknown", sizeof(hostname));
}
else
{
@@ -222,6 +217,11 @@ main(int argc, /* I - Number of command-line arguments */
syslog(LOG_ERR, "Unable to get command line from client!");
putchar(1);
+
+#ifdef __APPLE__
+ vproc_transaction_end(NULL, vtran);
+#endif /* __APPLE__ */
+
return (1);
}
@@ -230,8 +230,10 @@ main(int argc, /* I - Number of command-line arguments */
* resource list, and/or user name.
*/
- command = line[0];
- dest = line + 1;
+ if ((command = line[0]) == '\0')
+ dest = line;
+ else
+ dest = line + 1;
if (command == 0x02)
list = NULL;
@@ -268,21 +270,21 @@ main(int argc, /* I - Number of command-line arguments */
syslog(LOG_INFO, "Receive print job for %s", dest);
/* recv_print_job() sends initial status byte */
- status = recv_print_job(dest, num_defaults, defaults);
+ status = (char)recv_print_job(dest, num_defaults, defaults);
break;
case 0x03 : /* Send queue state (short) */
syslog(LOG_INFO, "Send queue state (short) for %s %s", dest, list);
/* no status byte for this command */
- status = send_state(dest, list, 0);
+ status = (char)send_state(dest, list, 0);
break;
case 0x04 : /* Send queue state (long) */
syslog(LOG_INFO, "Send queue state (long) for %s %s", dest, list);
/* no status byte for this command */
- status = send_state(dest, list, 1);
+ status = (char)send_state(dest, list, 1);
break;
case 0x05 : /* Remove jobs */
@@ -300,7 +302,7 @@ main(int argc, /* I - Number of command-line arguments */
syslog(LOG_INFO, "Remove jobs %s on %s by %s", list, dest, agent);
- status = remove_jobs(dest, agent, list);
+ status = (char)remove_jobs(dest, agent, list);
}
else
status = 1;
@@ -312,6 +314,10 @@ main(int argc, /* I - Number of command-line arguments */
syslog(LOG_INFO, "Closing connection");
closelog();
+#ifdef __APPLE__
+ vproc_transaction_end(NULL, vtran);
+#endif /* __APPLE__ */
+
return (status);
}
@@ -409,7 +415,7 @@ static int /* O - Number of options or -1 on error */
get_printer(http_t *http, /* I - HTTP connection */
const char *name, /* I - Printer name from request */
char *dest, /* I - Destination buffer */
- int destsize, /* I - Size of destination buffer */
+ size_t destsize, /* I - Size of destination buffer */
cups_option_t **options, /* O - Printer options */
int *accepting, /* O - printer-is-accepting-jobs value */
int *shared, /* O - printer-is-shared value */
@@ -744,7 +750,7 @@ print_file(http_t *http, /* I - HTTP connection */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
"document-format", NULL, format);
- ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last);
+ ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last);
/*
* Do the request...
@@ -781,7 +787,8 @@ recv_print_job(
int fd; /* Temporary file */
FILE *fp; /* File pointer */
char filename[1024]; /* Temporary filename */
- int bytes; /* Bytes received */
+ ssize_t bytes; /* Bytes received */
+ size_t total; /* Total bytes */
char line[256], /* Line from file/stdin */
command, /* Command from line */
*count, /* Number of bytes */
@@ -914,7 +921,7 @@ recv_print_job(
break;
}
- strcpy(filename, control);
+ strlcpy(filename, control, sizeof(filename));
}
break;
@@ -950,7 +957,7 @@ recv_print_job(
break;
}
- strcpy(filename, temp[num_data]);
+ strlcpy(filename, temp[num_data], sizeof(filename));
num_data ++;
break;
@@ -965,15 +972,15 @@ recv_print_job(
* Copy the data or control file from the client...
*/
- for (i = atoi(count); i > 0; i -= bytes)
+ for (total = (size_t)strtoll(count, NULL, 10); total > 0; total -= (size_t)bytes)
{
- if (i > sizeof(line))
- bytes = sizeof(line);
+ if (total > sizeof(line))
+ bytes = (ssize_t)sizeof(line);
else
- bytes = i;
+ bytes = (ssize_t)total;
- if ((bytes = fread(line, 1, bytes, stdin)) > 0)
- bytes = write(fd, line, bytes);
+ if ((bytes = (ssize_t)fread(line, 1, (size_t)bytes, stdin)) > 0)
+ bytes = write(fd, line, (size_t)bytes);
if (bytes < 1)
{
@@ -1116,7 +1123,7 @@ recv_print_job(
{
syslog(LOG_WARNING, "No username specified by client! "
"Using \"anonymous\"...");
- strcpy(user, "anonymous");
+ strlcpy(user, "anonymous", sizeof(user));
}
/*
@@ -1528,7 +1535,7 @@ send_state(const char *queue, /* I - Destination */
*/
if (jobstate == IPP_JOB_PROCESSING)
- strcpy(rankstr, "active");
+ strlcpy(rankstr, "active", sizeof(rankstr));
else
{
snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]);
@@ -1609,7 +1616,7 @@ smart_gets(char *s, /* I - Pointer to line buffer */
break;
}
else if (ptr < end)
- *ptr++ = ch;
+ *ptr++ = (char)ch;
}
*ptr = '\0';
@@ -1622,5 +1629,5 @@ smart_gets(char *s, /* I - Pointer to line buffer */
/*
- * End of "$Id: cups-lpd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-lpd.c 12611 2015-05-06 15:30:36Z msweet $".
*/
diff --git a/scheduler/cups.sh.in b/scheduler/cups.sh.in
index ff72c1c..c50e893 100644
--- a/scheduler/cups.sh.in
+++ b/scheduler/cups.sh.in
@@ -1,17 +1,17 @@
#!/bin/sh
#
-# "$Id: cups.sh.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.sh.in 11342 2013-10-18 20:36:01Z msweet $"
#
-# Startup/shutdown script for CUPS.
+# Startup/shutdown script for CUPS.
#
-# Copyright 2007-2011 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
#### OS-Dependent Information
@@ -35,18 +35,6 @@
#### OS-Dependent Configuration
case "`uname`" in
- IRIX*)
- IS_ON=/sbin/chkconfig
-
- if $IS_ON verbose; then
- ECHO=echo
- else
- ECHO=:
- fi
- ECHO_OK=:
- ECHO_ERROR=:
- ;;
-
*BSD*)
IS_ON=:
ECHO=echo
@@ -127,8 +115,7 @@ unset TMPDIR
#
# Make sure we have the standard program directories in the path
-# since some operating systems (this means YOU HP-UX!) don't
-# provide a standard path on boot-up...
+# since some operating systems don't provide a standard path on boot-up...
#
if test "x$PATH" = x; then
@@ -144,19 +131,9 @@ export PATH
#
case "`uname`" in
- HP-UX* | AIX* | SINIX*)
- pid=`ps -e | awk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'`
- ;;
- IRIX* | SunOS*)
+ SunOS*)
pid=`ps -e | nawk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'`
;;
- UnixWare*)
- pid=`ps -e | awk '{if (match($6, ".*/cupsd$") || $6 == "cupsd") print $1}'`
- . /etc/TIMEZONE
- ;;
- OSF1*)
- pid=`ps -e | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
- ;;
Linux* | *BSD* | Darwin*)
pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
;;
@@ -209,16 +186,6 @@ case $1 in
fi
;;
- start_msg)
- # HP-UX non-standard...
- echo "Starting CUPS Server"
- ;;
-
- stop_msg)
- # HP-UX non-standard...
- echo "Starting CUPS Server"
- ;;
-
*)
echo "Usage: cups {reload|restart|start|status|stop}"
exit 1
@@ -233,5 +200,5 @@ exit 0
#
-# End of "$Id: cups.sh.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.sh.in 11342 2013-10-18 20:36:01Z msweet $".
#
diff --git a/scheduler/cups.xml.in b/scheduler/cups.xml.in
index b76ad02..ac63585 100644
--- a/scheduler/cups.xml.in
+++ b/scheduler/cups.xml.in
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
- $Id: cups.xml.in 11173 2013-07-23 12:31:34Z msweet $
+ $Id: cups.xml.in 2309 2010-07-08 20:45:48Z msweet $
Service manifest for CUPS.
diff --git a/scheduler/cupsd.h b/scheduler/cupsd.h
index 48ea1d7..f8b2c11 100644
--- a/scheduler/cupsd.h
+++ b/scheduler/cupsd.h
@@ -1,16 +1,16 @@
/*
- * "$Id: cupsd.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsd.h 11717 2014-03-21 16:42:53Z msweet $"
*
- * Main header file for the CUPS scheduler.
+ * Main header file for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
@@ -144,10 +144,8 @@ typedef void (*cupsd_selfunc_t)(void *data);
* Globals...
*/
-VAR int TestConfigFile VALUE(0),
+VAR int TestConfigFile VALUE(0);
/* Test the cupsd.conf file? */
- UseProfiles VALUE(1);
- /* Use security profiles for child procs? */
VAR int MaxFDs VALUE(0);
/* Maximum number of files */
@@ -160,10 +158,10 @@ VAR int NeedReload VALUE(RELOAD_ALL),
VAR void *DefaultProfile VALUE(0);
/* Default security profile */
-#ifdef HAVE_LAUNCH_H
-VAR int Launchd VALUE(0);
- /* Running from launchd */
-#endif /* HAVE_LAUNCH_H */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+VAR int OnDemand VALUE(0);
+ /* Launched on demand */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
/*
@@ -187,6 +185,7 @@ extern cups_file_t *cupsdCreateConfFile(const char *filename, mode_t mode);
extern cups_file_t *cupsdOpenConfFile(const char *filename);
extern int cupsdOpenPipe(int *fds);
extern int cupsdRemoveFile(const char *filename);
+extern int cupsdUnlinkOrRemoveFile(const char *filename);
/* main.c */
extern int cupsdAddString(cups_array_t **a, const char *s);
@@ -202,11 +201,10 @@ extern void cupsdSetStringf(char **s, const char *f, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
/* process.c */
-extern void *cupsdCreateProfile(int job_id);
+extern void *cupsdCreateProfile(int job_id, int allow_networking);
extern void cupsdDestroyProfile(void *profile);
extern int cupsdEndProcess(int pid, int force);
-extern const char *cupsdFinishProcess(int pid, char *name, int namelen,
- int *job_id);
+extern const char *cupsdFinishProcess(int pid, char *name, size_t namelen, int *job_id);
extern int cupsdStartProcess(const char *command, char *argv[],
char *envp[], int infd, int outfd,
int errfd, int backfd, int sidefd,
@@ -230,5 +228,5 @@ extern void cupsdStopServer(void);
/*
- * End of "$Id: cupsd.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsd.h 11717 2014-03-21 16:42:53Z msweet $".
*/
diff --git a/scheduler/cupsfilter.c b/scheduler/cupsfilter.c
index 4b471d5..81e159d 100644
--- a/scheduler/cupsfilter.c
+++ b/scheduler/cupsfilter.c
@@ -1,34 +1,16 @@
/*
- * "$Id: cupsfilter.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsfilter.c 12304 2014-12-09 16:16:28Z msweet $"
*
- * Filtering program for CUPS.
+ * Filtering program for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for the test program.
- * add_printer_filter() - Add a single filters from a PPD file.
- * add_printer_filters() - Add filters from a PPD file.
- * check_cb() - Callback function for _cupsFileCheck.
- * compare_pids() - Compare two filter PIDs...
- * escape_options() - Convert an options array to a string.
- * exec_filter() - Execute a single filter.
- * exec_filters() - Execute filters for the given file and options.
- * get_job_file() - Get the specified job file.
- * open_pipe() - Create a pipe which is closed on exec.
- * read_cupsd_conf() - Read the cupsd.conf file to get the filter
- * settings.
- * set_string() - Copy and set a string.
- * sighandler() - Signal catcher for when we print from stdin...
- * usage() - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -99,7 +81,7 @@ static int exec_filters(mime_type_t *srctype,
cups_option_t *options);
static void get_job_file(const char *job);
static int open_pipe(int *fds);
-static int read_cupsd_conf(const char *filename);
+static int read_cups_files_conf(const char *filename);
static void set_string(char **s, const char *val);
static void sighandler(int sig);
static void usage(const char *opt) __attribute__((noreturn));
@@ -113,7 +95,8 @@ int /* O - Exit status */
main(int argc, /* I - Number of command-line args */
char *argv[]) /* I - Command-line arguments */
{
- int i; /* Looping vars */
+ int i, /* Looping vars */
+ list_filters = 0; /* Just list the filters? */
const char *command, /* Command name */
*opt, /* Current option */
*printer; /* Printer name */
@@ -129,7 +112,7 @@ main(int argc, /* I - Number of command-line args */
char mimedir[1024]; /* MIME directory */
char *infile, /* File to filter */
*outfile; /* File to create */
- char cupsdconf[1024]; /* cupsd.conf file */
+ char cupsfilesconf[1024]; /* cups-files.conf file */
const char *server_root; /* CUPS_SERVERROOT environment variable */
mime_type_t *src, /* Source type */
*dst; /* Destination type */
@@ -173,7 +156,7 @@ main(int argc, /* I - Number of command-line args */
if ((server_root = getenv("CUPS_SERVERROOT")) == NULL)
server_root = CUPS_SERVERROOT;
- snprintf(cupsdconf, sizeof(cupsdconf), "%s/cupsd.conf", server_root);
+ snprintf(cupsfilesconf, sizeof(cupsfilesconf), "%s/cups-files.conf", server_root);
/*
* Process command-line arguments...
@@ -182,168 +165,175 @@ main(int argc, /* I - Number of command-line args */
_cupsSetLocale(argv);
for (i = 1; i < argc; i ++)
+ {
if (argv[i][0] == '-')
{
- for (opt = argv[i] + 1; *opt; opt ++)
- switch (*opt)
+ if (!strcmp(argv[i], "--list-filters"))
+ {
+ list_filters = 1;
+ }
+ else if (!strcmp(argv[i], "--"))
+ {
+ i ++;
+ if (i < argc && !infile)
+ infile = argv[i];
+ else
+ usage(NULL);
+ }
+ else
+ {
+ for (opt = argv[i] + 1; *opt; opt ++)
{
- case '-' : /* Next argument is a filename... */
- i ++;
- if (i < argc && !infile)
- infile = argv[i];
- else
- usage(opt);
- break;
-
- case 'a' : /* Specify option... */
- i ++;
- if (i < argc)
- num_options = cupsParseOptions(argv[i], num_options, &options);
- else
- usage(opt);
- break;
-
- case 'c' : /* Specify cupsd.conf file location... */
- i ++;
- if (i < argc)
- {
- if (!strcmp(command, "convert"))
- num_options = cupsAddOption("copies", argv[i], num_options,
- &options);
+ switch (*opt)
+ {
+ case 'a' : /* Specify option... */
+ i ++;
+ if (i < argc)
+ num_options = cupsParseOptions(argv[i], num_options, &options);
else
- strlcpy(cupsdconf, argv[i], sizeof(cupsdconf));
- }
- else
- usage(opt);
- break;
-
- case 'd' : /* Specify the real printer name */
- i ++;
- if (i < argc)
- printer = argv[i];
- else
- usage(opt);
- break;
-
- case 'D' : /* Delete input file after conversion */
- removeinfile = 1;
- break;
-
- case 'e' : /* Use every filter from the PPD file */
- all_filters = 1;
- break;
-
- case 'f' : /* Specify input file... */
- i ++;
- if (i < argc && !infile)
- infile = argv[i];
- else
- usage(opt);
- break;
-
- case 'i' : /* Specify source MIME type... */
- i ++;
- if (i < argc)
- {
- if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
usage(opt);
+ break;
- srctype = argv[i];
- }
- else
- usage(opt);
- break;
+ case 'c' : /* Specify cups-files.conf file location... */
+ i ++;
+ if (i < argc)
+ {
+ if (!strcmp(command, "convert"))
+ num_options = cupsAddOption("copies", argv[i], num_options, &options);
+ else
+ strlcpy(cupsfilesconf, argv[i], sizeof(cupsfilesconf));
+ }
+ else
+ usage(opt);
+ break;
- case 'j' : /* Get job file or specify destination MIME type... */
- if (strcmp(command, "convert"))
- {
- i ++;
+ case 'd' : /* Specify the real printer name */
+ i ++;
+ if (i < argc)
+ printer = argv[i];
+ else
+ usage(opt);
+ break;
+
+ case 'D' : /* Delete input file after conversion */
+ removeinfile = 1;
+ break;
+
+ case 'e' : /* Use every filter from the PPD file */
+ all_filters = 1;
+ break;
+
+ case 'f' : /* Specify input file... */
+ i ++;
+ if (i < argc && !infile)
+ infile = argv[i];
+ else
+ usage(opt);
+ break;
+
+ case 'i' : /* Specify source MIME type... */
+ i ++;
if (i < argc)
{
- get_job_file(argv[i]);
- infile = TempFile;
+ if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
+ usage(opt);
+
+ srctype = argv[i];
}
else
usage(opt);
+ break;
+
+ case 'j' : /* Get job file or specify destination MIME type... */
+ if (strcmp(command, "convert"))
+ {
+ i ++;
+ if (i < argc)
+ {
+ get_job_file(argv[i]);
+ infile = TempFile;
+ }
+ else
+ usage(opt);
- break;
- }
+ break;
+ }
+
+ case 'm' : /* Specify destination MIME type... */
+ i ++;
+ if (i < argc)
+ {
+ if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
+ usage(opt);
- case 'm' : /* Specify destination MIME type... */
- i ++;
- if (i < argc)
- {
- if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
+ dsttype = argv[i];
+ }
+ else
usage(opt);
+ break;
- dsttype = argv[i];
- }
- else
- usage(opt);
- break;
-
- case 'n' : /* Specify number of copies... */
- i ++;
- if (i < argc)
- num_options = cupsAddOption("copies", argv[i], num_options,
- &options);
- else
- usage(opt);
- break;
-
- case 'o' : /* Specify option(s) or output filename */
- i ++;
- if (i < argc)
- {
- if (!strcmp(command, "convert"))
+ case 'n' : /* Specify number of copies... */
+ i ++;
+ if (i < argc)
+ num_options = cupsAddOption("copies", argv[i], num_options, &options);
+ else
+ usage(opt);
+ break;
+
+ case 'o' : /* Specify option(s) or output filename */
+ i ++;
+ if (i < argc)
{
- if (outfile)
- usage(NULL);
+ if (!strcmp(command, "convert"))
+ {
+ if (outfile)
+ usage(NULL);
+ else
+ outfile = argv[i];
+ }
else
- outfile = argv[i];
+ num_options = cupsParseOptions(argv[i], num_options, &options);
}
else
- num_options = cupsParseOptions(argv[i], num_options,
- &options);
- }
- else
- usage(opt);
- break;
-
- case 'p' : /* Specify PPD file... */
- case 'P' : /* Specify PPD file... */
- i ++;
- if (i < argc)
- ppdfile = argv[i];
- else
- usage(opt);
- break;
-
- case 't' : /* Specify title... */
- case 'J' : /* Specify title... */
- i ++;
- if (i < argc)
- title = argv[i];
- else
- usage(opt);
- break;
-
- case 'u' : /* Delete PPD file after conversion */
- removeppd = 1;
- break;
-
- case 'U' : /* Specify username... */
- i ++;
- if (i < argc)
- user = argv[i];
- else
- usage(opt);
- break;
-
- default : /* Something we don't understand... */
- usage(opt);
- break;
+ usage(opt);
+ break;
+
+ case 'p' : /* Specify PPD file... */
+ case 'P' : /* Specify PPD file... */
+ i ++;
+ if (i < argc)
+ ppdfile = argv[i];
+ else
+ usage(opt);
+ break;
+
+ case 't' : /* Specify title... */
+ case 'J' : /* Specify title... */
+ i ++;
+ if (i < argc)
+ title = argv[i];
+ else
+ usage(opt);
+ break;
+
+ case 'u' : /* Delete PPD file after conversion */
+ removeppd = 1;
+ break;
+
+ case 'U' : /* Specify username... */
+ i ++;
+ if (i < argc)
+ user = argv[i];
+ else
+ usage(opt);
+ break;
+
+ default : /* Something we don't understand... */
+ usage(opt);
+ break;
+ }
}
+ }
}
else if (!infile)
{
@@ -358,6 +348,7 @@ main(int argc, /* I - Number of command-line args */
_("cupsfilter: Only one filename can be specified."));
usage(NULL);
}
+ }
if (!infile && !srctype)
usage(NULL);
@@ -373,10 +364,10 @@ main(int argc, /* I - Number of command-line args */
}
/*
- * Load the cupsd.conf file and create the MIME database...
+ * Load the cups-files.conf file and create the MIME database...
*/
- if (read_cupsd_conf(cupsdconf))
+ if (read_cups_files_conf(cupsfilesconf))
return (1);
snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir);
@@ -491,12 +482,31 @@ main(int argc, /* I - Number of command-line args */
filters = prefilters;
}
- /*
- * Do it!
- */
+ if (list_filters)
+ {
+ /*
+ * List filters...
+ */
+
+ mime_filter_t *filter; /* Current filter */
- status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user,
- title, num_options, options);
+ for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+ filter;
+ filter = (mime_filter_t *)cupsArrayNext(filters))
+ if (strcmp(filter->filter, "-"))
+ _cupsLangPuts(stdout, filter->filter);
+
+ status = 0;
+ }
+ else
+ {
+ /*
+ * Run filters...
+ */
+
+ status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user,
+ title, num_options, options);
+ }
/*
* Remove files as needed, then exit...
@@ -576,7 +586,7 @@ add_printer_filter(
{
char *ptr; /* Pointer into maxsize(nnnn) program */
- maxsize = strtoll(program + 8, &ptr, 10);
+ maxsize = (size_t)strtoll(program + 8, &ptr, 10);
if (*ptr != ')')
{
@@ -745,7 +755,7 @@ escape_options(
{
int i; /* Looping var */
cups_option_t *option; /* Current option */
- int bytes; /* Number of bytes needed */
+ size_t bytes; /* Number of bytes needed */
char *s, /* Option string */
*sptr, /* Pointer into string */
*vptr; /* Pointer into value */
@@ -773,7 +783,7 @@ escape_options(
if (sptr > s)
*sptr++ = ' ';
- strcpy(sptr, option->name);
+ strlcpy(sptr, option->name, bytes - (size_t)(sptr - s));
sptr += strlen(sptr);
*sptr++ = '=';
@@ -917,7 +927,7 @@ exec_filters(mime_type_t *srctype, /* I - Source type */
{
int i; /* Looping var */
const char *argv[8], /* Command-line arguments */
- *envp[16], /* Environment variables */
+ *envp[17], /* Environment variables */
*temp; /* Temporary string */
char *optstr, /* Filter options */
content_type[1024], /* CONTENT_TYPE */
@@ -925,6 +935,8 @@ exec_filters(mime_type_t *srctype, /* I - Source type */
cups_fontpath[1024], /* CUPS_FONTPATH */
cups_serverbin[1024], /* CUPS_SERVERBIN */
cups_serverroot[1024], /* CUPS_SERVERROOT */
+ final_content_type[1024] = "",
+ /* FINAL_CONTENT_TYPE */
lang[1024], /* LANG */
path[1024], /* PATH */
ppd[1024], /* PPD */
@@ -948,6 +960,39 @@ exec_filters(mime_type_t *srctype, /* I - Source type */
/*
+ * Figure out the final content type...
+ */
+
+ for (filter = (mime_filter_t *)cupsArrayLast(filters);
+ filter && filter->dst;
+ filter = (mime_filter_t *)cupsArrayPrev(filters))
+ if (strcmp(filter->dst->super, "printer"))
+ break;
+
+ if (filter && filter->dst)
+ {
+ const char *ptr; /* Pointer in type name */
+
+ if ((ptr = strchr(filter->dst->type, '/')) != NULL)
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=%s", ptr + 1);
+ else
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=%s/%s", filter->dst->super,
+ filter->dst->type);
+ }
+
+ /*
+ * Remove NULL ("-") filters...
+ */
+
+ for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+ filter;
+ filter = (mime_filter_t *)cupsArrayNext(filters))
+ if (!strcmp(filter->filter, "-"))
+ cupsArrayRemove(filters, filter);
+
+ /*
* Setup the filter environment and command-line...
*/
@@ -1041,7 +1086,13 @@ exec_filters(mime_type_t *srctype, /* I - Source type */
envp[12] = rip_max_cache;
envp[13] = userenv;
envp[14] = "CHARSET=utf-8";
- envp[15] = NULL;
+ if (final_content_type[0])
+ {
+ envp[15] = final_content_type;
+ envp[16] = NULL;
+ }
+ else
+ envp[15] = NULL;
for (i = 0; argv[i]; i ++)
fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]);
@@ -1313,13 +1364,14 @@ open_pipe(int *fds) /* O - Pipe file descriptors (2) */
/*
- * 'read_cupsd_conf()' - Read the cupsd.conf file to get the filter settings.
+ * 'read_cups_files_conf()' - Read the cups-files.conf file to get the filter settings.
*/
static int /* O - 0 on success, 1 on error */
-read_cupsd_conf(const char *filename) /* I - File to read */
+read_cups_files_conf(
+ const char *filename) /* I - File to read */
{
- cups_file_t *fp; /* cupsd.conf file */
+ cups_file_t *fp; /* cups-files.conf file */
const char *temp; /* Temporary string */
char line[1024], /* Line from file */
*ptr; /* Pointer into line */
@@ -1372,9 +1424,7 @@ read_cupsd_conf(const char *filename) /* I - File to read */
cupsFileClose(fp);
}
- snprintf(line, sizeof(line),
- "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin",
- ServerBin);
+ snprintf(line, sizeof(line), "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin);
set_string(&Path, line);
return (0);
@@ -1426,38 +1476,30 @@ static void
usage(const char *opt) /* I - Incorrect option, if any */
{
if (opt)
- _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), "cupsfilter",
- *opt);
+ _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), "cupsfilter", *opt);
- _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] filename"));
+ _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] [ -- ] filename"));
_cupsLangPuts(stdout, _("Options:"));
- _cupsLangPuts(stdout, _(" -D Remove the input file "
- "when finished."));
+ _cupsLangPuts(stdout, _(" --list-filters List filters that will be used."));
+ _cupsLangPuts(stdout, _(" -D Remove the input file when finished."));
_cupsLangPuts(stdout, _(" -P filename.ppd Set PPD file."));
_cupsLangPuts(stdout, _(" -U username Specify username."));
- _cupsLangPuts(stdout, _(" -c cupsd.conf Set cupsd.conf file to "
- "use."));
- _cupsLangPuts(stdout, _(" -d printer Use the named "
- "printer."));
- _cupsLangPuts(stdout, _(" -e Use every filter from "
- "the PPD file."));
- _cupsLangPuts(stdout, _(" -i mime/type Set input MIME type "
- "(otherwise auto-typed)."));
- _cupsLangPuts(stdout, _(" -j job-id[,N] Filter file N from the "
- "specified job (default is file 1)."));
- _cupsLangPuts(stdout, _(" -m mime/type Set output MIME type "
- "(otherwise application/pdf)."));
+ _cupsLangPuts(stdout, _(" -c cups-files.conf Set cups-files.conf file to use."));
+ _cupsLangPuts(stdout, _(" -d printer Use the named printer."));
+ _cupsLangPuts(stdout, _(" -e Use every filter from the PPD file."));
+ _cupsLangPuts(stdout, _(" -i mime/type Set input MIME type (otherwise auto-typed)."));
+ _cupsLangPuts(stdout, _(" -j job-id[,N] Filter file N from the specified job (default is file 1)."));
+ _cupsLangPuts(stdout, _(" -m mime/type Set output MIME type (otherwise application/pdf)."));
_cupsLangPuts(stdout, _(" -n copies Set number of copies."));
_cupsLangPuts(stdout, _(" -o name=value Set option(s)."));
_cupsLangPuts(stdout, _(" -p filename.ppd Set PPD file."));
_cupsLangPuts(stdout, _(" -t title Set title."));
- _cupsLangPuts(stdout, _(" -u Remove the PPD file "
- "when finished."));
+ _cupsLangPuts(stdout, _(" -u Remove the PPD file when finished."));
exit(1);
}
/*
- * End of "$Id: cupsfilter.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsfilter.c 12304 2014-12-09 16:16:28Z msweet $".
*/
diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c
index bce0d64..54a08e2 100644
--- a/scheduler/dirsvc.c
+++ b/scheduler/dirsvc.c
@@ -1,46 +1,16 @@
/*
- * "$Id: dirsvc.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dirsvc.c 12458 2015-01-30 16:15:53Z msweet $"
*
- * Directory services routines for the CUPS scheduler.
+ * Directory services routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdDeregisterPrinter() - Stop sending broadcast information for a local
- * printer and remove any pending references to
- * remote printers.
- * cupsdRegisterPrinter() - Start sending broadcast information for a
- * printer or update the broadcast contents.
- * cupsdStartBrowsing() - Start sending and receiving broadcast
- * information.
- * cupsdStopBrowsing() - Stop sending and receiving broadcast
- * information.
- * cupsdUpdateDNSSDName() - Update the computer name we use for
- * browsing...
- * dnssdAddAlias() - Add a DNS-SD alias name.
- * dnssdBuildTxtRecord() - Build a TXT record from printer info.
- * dnssdDeregisterInstance() - Deregister a DNS-SD service instance.
- * dnssdDeregisterPrinter() - Deregister all services for a printer.
- * dnssdErrorString() - Return an error string for an error code.
- * dnssdRegisterCallback() - Free a TXT record.
- * dnssdRegisterCallback() - DNSServiceRegister callback.
- * dnssdRegisterInstance() - Register an instance of a printer service.
- * dnssdRegisterPrinter() - Start sending broadcast information for a
- * printer or update the broadcast contents.
- * dnssdStop() - Stop all DNS-SD registrations.
- * dnssdUpdate() - Handle DNS-SD queries.
- * get_auth_info_required() - Get the auth-info-required value to advertise.
- * get_hostconfig() - Get an /etc/hostconfig service setting.
- * update_lpd() - Update the LPD configuration as needed.
- * update_smb() - Update the SMB configuration as needed.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -58,6 +28,15 @@
/*
+ * Local globals...
+ */
+
+#ifdef HAVE_AVAHI
+static int avahi_running = 0;
+#endif /* HAVE_AVAHI */
+
+
+/*
* Local functions...
*/
@@ -78,11 +57,15 @@ static void dnssdAddAlias(const void *key, const void *value,
void *context);
# endif /* __APPLE__ */
static cupsd_txt_t dnssdBuildTxtRecord(cupsd_printer_t *p, int for_lpd);
-static void dnssdDeregisterInstance(cupsd_srv_t *srv);
-static void dnssdDeregisterPrinter(cupsd_printer_t *p,
- int clear_name);
+# ifdef HAVE_AVAHI
+static void dnssdClientCallback(AvahiClient *c, AvahiClientState state, void *userdata);
+# endif /* HAVE_AVAHI */
+static void dnssdDeregisterAllPrinters(int from_callback);
+static void dnssdDeregisterInstance(cupsd_srv_t *srv, int from_callback);
+static void dnssdDeregisterPrinter(cupsd_printer_t *p, int clear_name, int from_callback);
static const char *dnssdErrorString(int error);
static void dnssdFreeTxtRecord(cupsd_txt_t *txt);
+static void dnssdRegisterAllPrinters(int from_callback);
# ifdef HAVE_DNSSD
static void dnssdRegisterCallback(DNSServiceRef sdRef,
DNSServiceFlags flags,
@@ -96,16 +79,13 @@ static void dnssdRegisterCallback(AvahiEntryGroup *p,
AvahiEntryGroupState state,
void *context);
# endif /* HAVE_DNSSD */
-static int dnssdRegisterInstance(cupsd_srv_t *srv,
- cupsd_printer_t *p,
- char *name, const char *type,
- const char *subtypes, int port,
- cupsd_txt_t *txt, int commit);
-static void dnssdRegisterPrinter(cupsd_printer_t *p);
+static int dnssdRegisterInstance(cupsd_srv_t *srv, cupsd_printer_t *p, char *name, const char *type, const char *subtypes, int port, cupsd_txt_t *txt, int commit, int from_callback);
+static void dnssdRegisterPrinter(cupsd_printer_t *p, int from_callback);
static void dnssdStop(void);
# ifdef HAVE_DNSSD
static void dnssdUpdate(void);
# endif /* HAVE_DNSSD */
+static void dnssdUpdateDNSSDName(int from_callback);
#endif /* HAVE_DNSSD || HAVE_AVAHI */
@@ -138,7 +118,7 @@ cupsdDeregisterPrinter(
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster)
- dnssdDeregisterPrinter(p, 1);
+ dnssdDeregisterPrinter(p, 1, 0);
#endif /* HAVE_DNSSD || HAVE_AVAHI */
}
@@ -160,7 +140,7 @@ cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster)
- dnssdRegisterPrinter(p);
+ dnssdRegisterPrinter(p, 0);
#endif /* HAVE_DNSSD || HAVE_AVAHI */
}
@@ -172,16 +152,12 @@ cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
void
cupsdStartBrowsing(void)
{
- cupsd_printer_t *p; /* Current printer */
-
-
if (!Browsing || !BrowseLocalProtocols)
return;
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
if (BrowseLocalProtocols & BROWSE_DNSSD)
{
- cupsd_listener_t *lis; /* Current listening socket */
# ifdef HAVE_DNSSD
DNSServiceErrorType error; /* Error from service creation */
@@ -211,6 +187,13 @@ cupsdStartBrowsing(void)
cupsdAddSelect(fd, (cupsd_selfunc_t)dnssdUpdate, NULL, NULL);
}
+ /*
+ * Set the computer name and register the web interface...
+ */
+
+ DNSSDPort = 0;
+ cupsdUpdateDNSSDName();
+
# else /* HAVE_AVAHI */
if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL)
{
@@ -223,8 +206,7 @@ cupsdStartBrowsing(void)
{
int error; /* Error code, if any */
- DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), 0,
- NULL, NULL, &error);
+ DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
if (DNSSDClient == NULL)
{
@@ -242,31 +224,6 @@ cupsdStartBrowsing(void)
avahi_threaded_poll_start(DNSSDMaster);
}
# endif /* HAVE_DNSSD */
-
- /*
- * Then get the port we use for registrations. If we are not listening
- * on any non-local ports, there is no sense sharing local printers via
- * Bonjour...
- */
-
- DNSSDPort = 0;
-
- for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
- lis;
- lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
- {
- if (httpAddrLocalhost(&(lis->address)))
- continue;
-
- DNSSDPort = _httpAddrPort(&(lis->address));
- break;
- }
-
- /*
- * Set the computer name and register the web interface...
- */
-
- cupsdUpdateDNSSDName();
}
#endif /* HAVE_DNSSD || HAVE_AVAHI */
@@ -280,15 +237,13 @@ cupsdStartBrowsing(void)
if (BrowseLocalProtocols & BROWSE_SMB)
update_smb(1);
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
/*
* Register the individual printers
*/
- for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
- p;
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
- cupsdRegisterPrinter(p);
+ dnssdRegisterAllPrinters(0);
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
}
@@ -299,27 +254,20 @@ cupsdStartBrowsing(void)
void
cupsdStopBrowsing(void)
{
- cupsd_printer_t *p; /* Current printer */
-
-
if (!Browsing || !BrowseLocalProtocols)
return;
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
/*
* De-register the individual printers
*/
- for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
- p;
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
- cupsdDeregisterPrinter(p, 1);
+ dnssdDeregisterAllPrinters(0);
/*
* Shut down browsing sockets...
*/
-#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster)
dnssdStop();
#endif /* HAVE_DNSSD || HAVE_AVAHI */
@@ -344,161 +292,7 @@ cupsdStopBrowsing(void)
void
cupsdUpdateDNSSDName(void)
{
- char webif[1024]; /* Web interface share name */
-# ifdef __APPLE__
- SCDynamicStoreRef sc; /* Context for dynamic store */
- CFDictionaryRef btmm; /* Back-to-My-Mac domains */
- CFStringEncoding nameEncoding; /* Encoding of computer name */
- CFStringRef nameRef; /* Host name CFString */
- char nameBuffer[1024]; /* C-string buffer */
-# endif /* __APPLE__ */
-
-
- /*
- * Only share the web interface and printers when non-local listening is
- * enabled...
- */
-
- if (!DNSSDPort)
- return;
-
- /*
- * Get the computer name as a c-string...
- */
-
-# ifdef __APPLE__
- sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), NULL, NULL);
-
- if (sc)
- {
- /*
- * Get the computer name from the dynamic store...
- */
-
- cupsdClearString(&DNSSDComputerName);
-
- if ((nameRef = SCDynamicStoreCopyComputerName(sc, &nameEncoding)) != NULL)
- {
- if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
- kCFStringEncodingUTF8))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Dynamic store computer name is \"%s\".", nameBuffer);
- cupsdSetString(&DNSSDComputerName, nameBuffer);
- }
-
- CFRelease(nameRef);
- }
-
- if (!DNSSDComputerName)
- {
- /*
- * Use the ServerName instead...
- */
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Using ServerName \"%s\" as computer name.", ServerName);
- cupsdSetString(&DNSSDComputerName, ServerName);
- }
-
- /*
- * Get the local hostname from the dynamic store...
- */
-
- cupsdClearString(&DNSSDHostName);
-
- if ((nameRef = SCDynamicStoreCopyLocalHostName(sc)) != NULL)
- {
- if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
- kCFStringEncodingUTF8))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Dynamic store host name is \"%s\".", nameBuffer);
- cupsdSetString(&DNSSDHostName, nameBuffer);
- }
-
- CFRelease(nameRef);
- }
-
- if (!DNSSDHostName)
- {
- /*
- * Use the ServerName instead...
- */
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Using ServerName \"%s\" as host name.", ServerName);
- cupsdSetString(&DNSSDHostName, ServerName);
- }
-
- /*
- * Get any Back-to-My-Mac domains and add them as aliases...
- */
-
- cupsdFreeAliases(DNSSDAlias);
- DNSSDAlias = NULL;
-
- btmm = SCDynamicStoreCopyValue(sc, CFSTR("Setup:/Network/BackToMyMac"));
- if (btmm && CFGetTypeID(btmm) == CFDictionaryGetTypeID())
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG, "%d Back to My Mac aliases to add.",
- (int)CFDictionaryGetCount(btmm));
- CFDictionaryApplyFunction(btmm, dnssdAddAlias, NULL);
- }
- else if (btmm)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Bad Back to My Mac data in dynamic store!");
- else
- cupsdLogMessage(CUPSD_LOG_DEBUG, "No Back to My Mac aliases to add.");
-
- if (btmm)
- CFRelease(btmm);
-
- CFRelease(sc);
- }
- else
-# endif /* __APPLE__ */
-# ifdef HAVE_AVAHI
- if (DNSSDClient)
- {
- const char *host_name = avahi_client_get_host_name(DNSSDClient);
- const char *host_fqdn = avahi_client_get_host_name_fqdn(DNSSDClient);
-
- cupsdSetString(&DNSSDComputerName, host_name ? host_name : ServerName);
-
- if (host_fqdn)
- cupsdSetString(&DNSSDHostName, host_fqdn);
- else if (strchr(ServerName, '.'))
- cupsdSetString(&DNSSDHostName, ServerName);
- else
- cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
- }
- else
-# endif /* HAVE_AVAHI */
- {
- cupsdSetString(&DNSSDComputerName, ServerName);
-
- if (strchr(ServerName, '.'))
- cupsdSetString(&DNSSDHostName, ServerName);
- else
- cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
- }
-
- /*
- * Then (re)register the web interface if enabled...
- */
-
- if (BrowseWebIF)
- {
- if (DNSSDComputerName)
- snprintf(webif, sizeof(webif), "CUPS @ %s", DNSSDComputerName);
- else
- strlcpy(webif, "CUPS", sizeof(webif));
-
- dnssdDeregisterInstance(&WebIFSrv);
- dnssdRegisterInstance(&WebIFSrv, NULL, webif, "_http._tcp", "_printer",
- DNSSDPort, NULL, 1);
- }
+ dnssdUpdateDNSSDName(0);
}
@@ -639,7 +433,9 @@ dnssdBuildTxtRecord(
if (p->type & CUPS_PRINTER_FAX)
{
keyvalue[count ][0] = "Fax";
- keyvalue[count++][1] = (p->type & CUPS_PRINTER_FAX) ? "T" : "F";
+ keyvalue[count++][1] = "T";
+ keyvalue[count ][0] = "rfo";
+ keyvalue[count++][1] = rp_str;
}
if (p->type & CUPS_PRINTER_COLOR)
@@ -731,24 +527,158 @@ dnssdBuildTxtRecord(
}
+# ifdef HAVE_AVAHI
+/*
+ * 'dnssdClientCallback()' - Client callback for Avahi.
+ *
+ * Called whenever the client or server state changes...
+ */
+
+static void
+dnssdClientCallback(
+ AvahiClient *c, /* I - Client */
+ AvahiClientState state, /* I - Current state */
+ void *userdata) /* I - User data (unused) */
+{
+ int error; /* Error code, if any */
+
+
+ (void)userdata;
+
+ if (!c)
+ return;
+
+ /*
+ * Make sure DNSSDClient is already set also if this callback function is
+ * already running before avahi_client_new() in dnssdStartBrowsing()
+ * finishes.
+ */
+
+ if (!DNSSDClient)
+ DNSSDClient = c;
+
+ switch (state)
+ {
+ case AVAHI_CLIENT_S_REGISTERING:
+ case AVAHI_CLIENT_S_RUNNING:
+ case AVAHI_CLIENT_S_COLLISION:
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Avahi server connection now available, registering printers for Bonjour broadcasting.");
+
+ /*
+ * Mark that Avahi server is running...
+ */
+
+ avahi_running = 1;
+
+ /*
+ * Set the computer name and register the web interface...
+ */
+
+ DNSSDPort = 0;
+ dnssdUpdateDNSSDName(1);
+
+ /*
+ * Register the individual printers
+ */
+
+ dnssdRegisterAllPrinters(1);
+ break;
+
+ case AVAHI_CLIENT_FAILURE:
+ if (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Avahi server disappeared, unregistering printers for Bonjour broadcasting.");
+
+ /*
+ * Unregister everything and close the client...
+ */
+
+ dnssdDeregisterAllPrinters(1);
+ dnssdDeregisterInstance(&WebIFSrv, 1);
+ avahi_client_free(DNSSDClient);
+ DNSSDClient = NULL;
+
+ /*
+ * Mark that Avahi server is not running...
+ */
+
+ avahi_running = 0;
+
+ /*
+ * Renew Avahi client...
+ */
+
+ DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
+
+ if (!DNSSDClient)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to communicate with avahi-daemon: %s", dnssdErrorString(error));
+ if (FatalErrors & CUPSD_FATAL_BROWSE)
+ cupsdEndProcess(getpid(), 0);
+ }
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Communication with avahi-daemon has failed: %s", avahi_strerror(avahi_client_errno(c)));
+ if (FatalErrors & CUPSD_FATAL_BROWSE)
+ cupsdEndProcess(getpid(), 0);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+# endif /* HAVE_AVAHI */
+
+
+/*
+ * 'dnssdDeregisterAllPrinters()' - Deregister all printers.
+ */
+
+static void
+dnssdDeregisterAllPrinters(
+ int from_callback) /* I - Deregistering because of callback? */
+{
+ cupsd_printer_t *p; /* Current printer */
+
+
+ if (!DNSSDMaster)
+ return;
+
+ for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+ p;
+ p = (cupsd_printer_t *)cupsArrayNext(Printers))
+ if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
+ dnssdDeregisterPrinter(p, 1, from_callback);
+}
+
+
/*
* 'dnssdDeregisterInstance()' - Deregister a DNS-SD service instance.
*/
static void
dnssdDeregisterInstance(
- cupsd_srv_t *srv) /* I - Service */
+ cupsd_srv_t *srv, /* I - Service */
+ int from_callback) /* I - Called from callback? */
{
if (!srv || !*srv)
return;
# ifdef HAVE_DNSSD
+ (void)from_callback;
+
DNSServiceRefDeallocate(*srv);
# else /* HAVE_AVAHI */
- avahi_threaded_poll_lock(DNSSDMaster);
+ if (!from_callback)
+ avahi_threaded_poll_lock(DNSSDMaster);
+
avahi_entry_group_free(*srv);
- avahi_threaded_poll_unlock(DNSSDMaster);
+
+ if (!from_callback)
+ avahi_threaded_poll_unlock(DNSSDMaster);
# endif /* HAVE_DNSSD */
*srv = NULL;
@@ -762,7 +692,8 @@ dnssdDeregisterInstance(
static void
dnssdDeregisterPrinter(
cupsd_printer_t *p, /* I - Printer */
- int clear_name) /* I - Clear the name? */
+ int clear_name, /* I - Clear the name? */
+ int from_callback) /* I - Called from callback? */
{
cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -771,13 +702,13 @@ dnssdDeregisterPrinter(
if (p->ipp_srv)
{
- dnssdDeregisterInstance(&p->ipp_srv);
+ dnssdDeregisterInstance(&p->ipp_srv, from_callback);
# ifdef HAVE_DNSSD
# ifdef HAVE_SSL
- dnssdDeregisterInstance(&p->ipps_srv);
+ dnssdDeregisterInstance(&p->ipps_srv, from_callback);
# endif /* HAVE_SSL */
- dnssdDeregisterInstance(&p->printer_srv);
+ dnssdDeregisterInstance(&p->printer_srv, from_callback);
# endif /* HAVE_DNSSD */
}
@@ -929,6 +860,27 @@ dnssdFreeTxtRecord(cupsd_txt_t *txt) /* I - TXT record */
/*
+ * 'dnssdRegisterAllPrinters()' - Register all printers.
+ */
+
+static void
+dnssdRegisterAllPrinters(int from_callback) /* I - Called from callback? */
+{
+ cupsd_printer_t *p; /* Current printer */
+
+
+ if (!DNSSDMaster)
+ return;
+
+ for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+ p;
+ p = (cupsd_printer_t *)cupsArrayNext(Printers))
+ if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
+ dnssdRegisterPrinter(p, from_callback);
+}
+
+
+/*
* 'dnssdRegisterCallback()' - DNSServiceRegister callback.
*/
@@ -1008,15 +960,19 @@ dnssdRegisterInstance(
const char *subtypes, /* I - Subtypes to register or NULL */
int port, /* I - Port number or 0 */
cupsd_txt_t *txt, /* I - TXT record */
- int commit) /* I - Commit registration? */
+ int commit, /* I - Commit registration? */
+ int from_callback) /* I - Called from callback? */
{
char temp[256], /* Temporary string */
*ptr; /* Pointer into string */
int error; /* Any error */
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Registering \"%s\" with DNS-SD type \"%s\".", name, type);
+# ifdef HAVE_DNSSD
+ (void)from_callback;
+# endif /* HAVE_DNSSD */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Registering \"%s\" with DNS-SD type \"%s\".", name, type);
if (p && !srv)
{
@@ -1043,13 +999,15 @@ dnssdRegisterInstance(
(void)commit;
# else /* HAVE_AVAHI */
- avahi_threaded_poll_lock(DNSSDMaster);
+ if (!from_callback)
+ avahi_threaded_poll_lock(DNSSDMaster);
if (!*srv)
*srv = avahi_entry_group_new(DNSSDClient, dnssdRegisterCallback, NULL);
if (!*srv)
{
- avahi_threaded_poll_unlock(DNSSDMaster);
+ if (!from_callback)
+ avahi_threaded_poll_unlock(DNSSDMaster);
cupsdLogMessage(CUPSD_LOG_WARN, "DNS-SD registration of \"%s\" failed: %s",
name, dnssdErrorString(avahi_client_errno(DNSSDClient)));
@@ -1166,7 +1124,8 @@ dnssdRegisterInstance(
name);
}
- avahi_threaded_poll_unlock(DNSSDMaster);
+ if (!from_callback)
+ avahi_threaded_poll_unlock(DNSSDMaster);
# endif /* HAVE_DNSSD */
if (error)
@@ -1188,7 +1147,9 @@ dnssdRegisterInstance(
*/
static void
-dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
+dnssdRegisterPrinter(
+ cupsd_printer_t *p, /* I - Printer */
+ int from_callback) /* I - Called from callback? */
{
char name[256]; /* Service name */
int printer_port; /* LPD port number */
@@ -1196,15 +1157,21 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
cupsd_txt_t ipp_txt, /* IPP(S) TXT record */
printer_txt; /* LPD TXT record */
+
cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name,
!p->ipp_srv ? "new" : "update");
+# ifdef HAVE_AVAHI
+ if (!avahi_running)
+ return;
+# endif /* HAVE_AVAHI */
+
/*
* Remove the current registrations if we have them and then return if
* per-printer sharing was just disabled...
*/
- dnssdDeregisterPrinter(p, 0);
+ dnssdDeregisterPrinter(p, 0, from_callback);
if (!p->shared)
return;
@@ -1247,13 +1214,11 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
else
printer_port = 0;
- status = dnssdRegisterInstance(NULL, p, name, "_printer._tcp", NULL,
- printer_port, &printer_txt, 0);
+ status = dnssdRegisterInstance(NULL, p, name, "_printer._tcp", NULL, printer_port, &printer_txt, 0, from_callback);
# ifdef HAVE_SSL
if (status)
- dnssdRegisterInstance(NULL, p, name, "_ipps._tcp", DNSSDSubTypes,
- DNSSDPort, &ipp_txt, 0);
+ dnssdRegisterInstance(NULL, p, name, "_ipps._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 0, from_callback);
# endif /* HAVE_SSL */
if (status)
@@ -1263,11 +1228,9 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
*/
if (p->type & CUPS_PRINTER_FAX)
- status = dnssdRegisterInstance(NULL, p, name, "_fax-ipp._tcp",
- DNSSDSubTypes, DNSSDPort, &ipp_txt, 1);
+ status = dnssdRegisterInstance(NULL, p, name, "_fax-ipp._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 1, from_callback);
else
- status = dnssdRegisterInstance(NULL, p, name, "_ipp._tcp", DNSSDSubTypes,
- DNSSDPort, &ipp_txt, 1);
+ status = dnssdRegisterInstance(NULL, p, name, "_ipp._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 1, from_callback);
}
dnssdFreeTxtRecord(&ipp_txt);
@@ -1289,13 +1252,13 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
* Registration failed for this printer...
*/
- dnssdDeregisterInstance(&p->ipp_srv);
+ dnssdDeregisterInstance(&p->ipp_srv, from_callback);
# ifdef HAVE_DNSSD
# ifdef HAVE_SSL
- dnssdDeregisterInstance(&p->ipps_srv);
+ dnssdDeregisterInstance(&p->ipps_srv, from_callback);
# endif /* HAVE_SSL */
- dnssdDeregisterInstance(&p->printer_srv);
+ dnssdDeregisterInstance(&p->printer_srv, from_callback);
# endif /* HAVE_DNSSD */
}
}
@@ -1318,13 +1281,13 @@ dnssdStop(void)
for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
p;
p = (cupsd_printer_t *)cupsArrayNext(Printers))
- dnssdDeregisterPrinter(p, 1);
+ dnssdDeregisterPrinter(p, 1, 0);
/*
* Shutdown the rest of the service refs...
*/
- dnssdDeregisterInstance(&WebIFSrv);
+ dnssdDeregisterInstance(&WebIFSrv, 0);
# ifdef HAVE_DNSSD
cupsdRemoveSelect(DNSServiceRefSockFD(DNSSDMaster));
@@ -1333,11 +1296,20 @@ dnssdStop(void)
DNSSDMaster = NULL;
# else /* HAVE_AVAHI */
- avahi_client_free(DNSSDClient);
- DNSSDClient = NULL;
+ if (DNSSDMaster)
+ avahi_threaded_poll_stop(DNSSDMaster);
- avahi_threaded_poll_free(DNSSDMaster);
- DNSSDMaster = NULL;
+ if (DNSSDClient)
+ {
+ avahi_client_free(DNSSDClient);
+ DNSSDClient = NULL;
+ }
+
+ if (DNSSDMaster)
+ {
+ avahi_threaded_poll_free(DNSSDMaster);
+ DNSSDMaster = NULL;
+ }
# endif /* HAVE_DNSSD */
cupsArrayDelete(DNSSDPrinters);
@@ -1370,6 +1342,191 @@ dnssdUpdate(void)
/*
+ * 'dnssdUpdateDNSSDName()' - Update the listen port, computer name, and web interface registration.
+ */
+
+static void
+dnssdUpdateDNSSDName(int from_callback) /* I - Called from callback? */
+{
+ char webif[1024]; /* Web interface share name */
+# ifdef __APPLE__
+ SCDynamicStoreRef sc; /* Context for dynamic store */
+ CFDictionaryRef btmm; /* Back-to-My-Mac domains */
+ CFStringEncoding nameEncoding; /* Encoding of computer name */
+ CFStringRef nameRef; /* Host name CFString */
+ char nameBuffer[1024]; /* C-string buffer */
+# endif /* __APPLE__ */
+
+
+ /*
+ * Only share the web interface and printers when non-local listening is
+ * enabled...
+ */
+
+ if (!DNSSDPort)
+ {
+ /*
+ * Get the port we use for registrations. If we are not listening on any
+ * non-local ports, there is no sense sharing local printers via Bonjour...
+ */
+
+ cupsd_listener_t *lis; /* Current listening socket */
+
+ for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+ lis;
+ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+ {
+ if (httpAddrLocalhost(&(lis->address)))
+ continue;
+
+ DNSSDPort = httpAddrPort(&(lis->address));
+ break;
+ }
+ }
+
+ if (!DNSSDPort)
+ return;
+
+ /*
+ * Get the computer name as a c-string...
+ */
+
+# ifdef __APPLE__
+ sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), NULL, NULL);
+
+ if (sc)
+ {
+ /*
+ * Get the computer name from the dynamic store...
+ */
+
+ cupsdClearString(&DNSSDComputerName);
+
+ if ((nameRef = SCDynamicStoreCopyComputerName(sc, &nameEncoding)) != NULL)
+ {
+ if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
+ kCFStringEncodingUTF8))
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Dynamic store computer name is \"%s\".", nameBuffer);
+ cupsdSetString(&DNSSDComputerName, nameBuffer);
+ }
+
+ CFRelease(nameRef);
+ }
+
+ if (!DNSSDComputerName)
+ {
+ /*
+ * Use the ServerName instead...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Using ServerName \"%s\" as computer name.", ServerName);
+ cupsdSetString(&DNSSDComputerName, ServerName);
+ }
+
+ /*
+ * Get the local hostname from the dynamic store...
+ */
+
+ cupsdClearString(&DNSSDHostName);
+
+ if ((nameRef = SCDynamicStoreCopyLocalHostName(sc)) != NULL)
+ {
+ if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
+ kCFStringEncodingUTF8))
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Dynamic store host name is \"%s\".", nameBuffer);
+ cupsdSetString(&DNSSDHostName, nameBuffer);
+ }
+
+ CFRelease(nameRef);
+ }
+
+ if (!DNSSDHostName)
+ {
+ /*
+ * Use the ServerName instead...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Using ServerName \"%s\" as host name.", ServerName);
+ cupsdSetString(&DNSSDHostName, ServerName);
+ }
+
+ /*
+ * Get any Back-to-My-Mac domains and add them as aliases...
+ */
+
+ cupsdFreeAliases(DNSSDAlias);
+ DNSSDAlias = NULL;
+
+ btmm = SCDynamicStoreCopyValue(sc, CFSTR("Setup:/Network/BackToMyMac"));
+ if (btmm && CFGetTypeID(btmm) == CFDictionaryGetTypeID())
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "%d Back to My Mac aliases to add.",
+ (int)CFDictionaryGetCount(btmm));
+ CFDictionaryApplyFunction(btmm, dnssdAddAlias, NULL);
+ }
+ else if (btmm)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad Back to My Mac data in dynamic store!");
+ else
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "No Back to My Mac aliases to add.");
+
+ if (btmm)
+ CFRelease(btmm);
+
+ CFRelease(sc);
+ }
+ else
+# endif /* __APPLE__ */
+# ifdef HAVE_AVAHI
+ if (DNSSDClient)
+ {
+ const char *host_name = avahi_client_get_host_name(DNSSDClient);
+ const char *host_fqdn = avahi_client_get_host_name_fqdn(DNSSDClient);
+
+ cupsdSetString(&DNSSDComputerName, host_name ? host_name : ServerName);
+
+ if (host_fqdn)
+ cupsdSetString(&DNSSDHostName, host_fqdn);
+ else if (strchr(ServerName, '.'))
+ cupsdSetString(&DNSSDHostName, ServerName);
+ else
+ cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
+ }
+ else
+# endif /* HAVE_AVAHI */
+ {
+ cupsdSetString(&DNSSDComputerName, ServerName);
+
+ if (strchr(ServerName, '.'))
+ cupsdSetString(&DNSSDHostName, ServerName);
+ else
+ cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
+ }
+
+ /*
+ * Then (re)register the web interface if enabled...
+ */
+
+ if (BrowseWebIF)
+ {
+ if (DNSSDComputerName)
+ snprintf(webif, sizeof(webif), "CUPS @ %s", DNSSDComputerName);
+ else
+ strlcpy(webif, "CUPS", sizeof(webif));
+
+ dnssdDeregisterInstance(&WebIFSrv, from_callback);
+ dnssdRegisterInstance(&WebIFSrv, NULL, webif, "_http._tcp", "_printer", DNSSDPort, NULL, 1, from_callback);
+ }
+}
+
+
+/*
* 'get_auth_info_required()' - Get the auth-info-required value to advertise.
*/
@@ -1400,7 +1557,7 @@ get_auth_info_required(
if (i)
*bufptr++ = ',';
- strlcpy(bufptr, p->auth_info_required[i], bufsize - (bufptr - buffer));
+ strlcpy(bufptr, p->auth_info_required[i], bufsize - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
}
@@ -1666,5 +1823,5 @@ update_smb(int onoff) /* I - 1 = turn on, 0 = turn off */
/*
- * End of "$Id: dirsvc.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dirsvc.c 12458 2015-01-30 16:15:53Z msweet $".
*/
diff --git a/scheduler/dirsvc.h b/scheduler/dirsvc.h
index edc5ad3..1326f8a 100644
--- a/scheduler/dirsvc.h
+++ b/scheduler/dirsvc.h
@@ -1,5 +1,5 @@
/*
- * "$Id: dirsvc.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dirsvc.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Directory services definitions for the CUPS scheduler.
*
@@ -80,5 +80,5 @@ extern void cupsdUpdateDNSSDName(void);
/*
- * End of "$Id: dirsvc.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dirsvc.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/env.c b/scheduler/env.c
index ba11aad..59eab27 100644
--- a/scheduler/env.c
+++ b/scheduler/env.c
@@ -1,27 +1,16 @@
/*
- * "$Id: env.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: env.c 12700 2015-06-08 18:32:35Z msweet $"
*
- * Environment management routines for the CUPS scheduler.
+ * Environment management routines for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdInitEnv() - Initialize the current environment with standard
- * variables.
- * cupsdLoadEnv() - Copy common environment variables into an array.
- * cupsdSetEnv() - Set a common environment variable.
- * cupsdSetEnvf() - Set a formatted common environment variable.
- * cupsdUpdateEnv() - Update the environment for the configured directories.
- * clear_env() - Clear common environment variables.
- * find_env() - Find a common environment variable.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -131,6 +120,13 @@ cupsdSetEnv(const char *name, /* I - Name of variable */
return;
/*
+ * Do not allow dynamic linker variables when running as root...
+ */
+
+ if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3)))
+ return;
+
+ /*
* See if this variable has already been defined...
*/
@@ -269,5 +265,5 @@ find_env(const char *name) /* I - Variable name */
/*
- * End of "$Id: env.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: env.c 12700 2015-06-08 18:32:35Z msweet $".
*/
diff --git a/scheduler/file.c b/scheduler/file.c
index 84ceef1..ae91b9e 100644
--- a/scheduler/file.c
+++ b/scheduler/file.c
@@ -1,28 +1,16 @@
/*
- * "$Id: file.c 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: file.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * File functions for the CUPS scheduler.
+ * File functions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdCleanFiles() - Clean out old files.
- * cupsdCloseCreatedConfFile() - Close a created configuration file and move
- * into place.
- * cupsdClosePipe() - Close a pipe as necessary.
- * cupsdCreateConfFile() - Create a configuration file safely.
- * cupsdOpenConfFile() - Open a configuration file.
- * cupsdOpenPipe() - Create a pipe which is closed on exec.
- * cupsdRemoveFile() - Remove a file using the 7-pass US DoD method.
- * overwrite_data() - Overwrite the data in a file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -43,7 +31,7 @@ static int overwrite_data(int fd, const char *buffer, int bufsize,
/*
* 'cupsdCleanFiles()' - Clean out old files.
*/
-
+
void
cupsdCleanFiles(const char *path, /* I - Directory to clean */
const char *pattern) /* I - Filename pattern or NULL */
@@ -65,7 +53,7 @@ cupsdCleanFiles(const char *path, /* I - Directory to clean */
return;
}
- cupsdLogMessage(CUPSD_LOG_INFO, "Cleaning out old files in \"%s\"...", path);
+ cupsdLogMessage(CUPSD_LOG_INFO, "Cleaning out old files in \"%s\".", path);
while ((dent = cupsDirRead(dir)) != NULL)
{
@@ -81,13 +69,11 @@ cupsdCleanFiles(const char *path, /* I - Directory to clean */
status = rmdir(filename);
}
else
- status = unlink(filename);
+ status = cupsdUnlinkOrRemoveFile(filename);
if (status)
cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove \"%s\" - %s", filename,
strerror(errno));
- else
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Removed \"%s\"...", filename);
}
cupsDirClose(dir);
@@ -146,7 +132,7 @@ cupsdCloseCreatedConfFile(
snprintf(newfile, sizeof(newfile), "%s.N", filename);
snprintf(oldfile, sizeof(oldfile), "%s.O", filename);
- if ((cupsdRemoveFile(oldfile) && errno != ENOENT) ||
+ if ((cupsdUnlinkOrRemoveFile(oldfile) && errno != ENOENT) ||
(rename(filename, oldfile) && errno != ENOENT) ||
rename(newfile, filename))
{
@@ -308,14 +294,27 @@ cupsdOpenPipe(int *fds) /* O - Pipe file descriptors (2) */
/*
- * 'cupsdRemoveFile()' - Remove a file using the 7-pass US DoD method.
+ * 'cupsdRemoveFile()' - Remove a file securely.
*/
int /* O - 0 on success, -1 on error */
cupsdRemoveFile(const char *filename) /* I - File to remove */
{
#ifdef HAVE_REMOVEFILE
- return (removefile(filename, NULL, REMOVEFILE_SECURE_7_PASS));
+ /*
+ * See if the file exists...
+ */
+
+ if (access(filename, 0))
+ return (0);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Securely removing \"%s\".", filename);
+
+ /*
+ * Remove the file...
+ */
+
+ return (removefile(filename, NULL, REMOVEFILE_SECURE_1_PASS));
#else
int fd; /* File descriptor */
@@ -325,6 +324,15 @@ cupsdRemoveFile(const char *filename) /* I - File to remove */
/*
+ * See if the file exists...
+ */
+
+ if (access(filename, 0))
+ return (0);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Securely removing \"%s\".", filename);
+
+ /*
* First open the file for writing in exclusive mode.
*/
@@ -353,31 +361,9 @@ cupsdRemoveFile(const char *filename) /* I - File to remove */
}
/*
- * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF,
- * and more random data.
+ * Overwrite the file with random data.
*/
- memset(buffer, 0xF6, sizeof(buffer));
- if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
- {
- close(fd);
- return (-1);
- }
-
- memset(buffer, 0x00, sizeof(buffer));
- if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
- {
- close(fd);
- return (-1);
- }
-
- memset(buffer, 0xFF, sizeof(buffer));
- if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
- {
- close(fd);
- return (-1);
- }
-
CUPS_SRAND(time(NULL));
for (i = 0; i < sizeof(buffer); i ++)
@@ -388,39 +374,31 @@ cupsdRemoveFile(const char *filename) /* I - File to remove */
return (-1);
}
- memset(buffer, 0x00, sizeof(buffer));
- if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
- {
- close(fd);
- return (-1);
- }
-
- memset(buffer, 0xFF, sizeof(buffer));
- if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
- {
- close(fd);
- return (-1);
- }
-
- for (i = 0; i < sizeof(buffer); i ++)
- buffer[i] = CUPS_RAND();
- if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
- {
- close(fd);
- return (-1);
- }
-
/*
- * Whew! Close the file (which will lead to the actual deletion) and
- * return success...
+ * Close the file, which will lead to the actual deletion, and return...
*/
- close(fd);
- return (0);
+ return (close(fd));
#endif /* HAVE_REMOVEFILE */
}
+/*
+ * 'cupsdUnlinkOrRemoveFile()' - Unlink or securely remove a file depending
+ * on the configuration.
+ */
+
+int /* O - 0 on success, -1 on error */
+cupsdUnlinkOrRemoveFile(
+ const char *filename) /* I - Filename */
+{
+ if (Classification)
+ return (cupsdRemoveFile(filename));
+ else
+ return (unlink(filename));
+}
+
+
#ifndef HAVE_REMOVEFILE
/*
* 'overwrite_data()' - Overwrite the data in a file.
@@ -453,7 +431,7 @@ overwrite_data(int fd, /* I - File descriptor */
else
bytes = filesize;
- if ((bytes = write(fd, buffer, bytes)) < 0)
+ if ((bytes = write(fd, buffer, (size_t)bytes)) < 0)
return (-1);
filesize -= bytes;
@@ -469,5 +447,5 @@ overwrite_data(int fd, /* I - File descriptor */
/*
- * End of "$Id: file.c 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: file.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/scheduler/filter.c b/scheduler/filter.c
index 6979b5c..eec9611 100644
--- a/scheduler/filter.c
+++ b/scheduler/filter.c
@@ -1,5 +1,5 @@
/*
- * "$Id: filter.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: filter.c 10996 2013-05-29 11:51:34Z msweet $"
*
* File type conversion routines for CUPS.
*
@@ -500,5 +500,5 @@ mime_find_filters(
/*
- * End of "$Id: filter.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: filter.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/ipp.c b/scheduler/ipp.c
index 6968cd5..763dc96 100644
--- a/scheduler/ipp.c
+++ b/scheduler/ipp.c
@@ -1,102 +1,19 @@
/*
- * "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp.c 12978 2015-11-17 19:29:52Z msweet $"
*
- * IPP routines for the CUPS scheduler.
+ * IPP routines for the CUPS scheduler.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * This file contains Kerberos support code, copyright 2006 by
- * Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdProcessIPPRequest() - Process an incoming IPP request.
- * cupsdTimeoutJob() - Timeout a job waiting on job files.
- * accept_jobs() - Accept print jobs to a printer.
- * add_class() - Add a class to the system.
- * add_file() - Add a file to a job.
- * add_job() - Add a job to a print queue.
- * add_job_subscriptions() - Add any subscriptions for a job.
- * add_job_uuid() - Add job-uuid attribute to a job.
- * add_printer() - Add a printer to the system.
- * add_printer_state_reasons() - Add the "printer-state-reasons" attribute
- * based upon the printer state...
- * add_queued_job_count() - Add the "queued-job-count" attribute for the
- * specified printer or class.
- * apply_printer_defaults() - Apply printer default options to a job.
- * authenticate_job() - Set job authentication info.
- * cancel_all_jobs() - Cancel all or selected print jobs.
- * cancel_job() - Cancel a print job.
- * cancel_subscription() - Cancel a subscription.
- * check_rss_recipient() - Check that we do not have a duplicate RSS
- * feed URI.
- * check_quotas() - Check quotas for a printer and user.
- * close_job() - Close a multi-file job.
- * copy_attrs() - Copy attributes from one request to another.
- * copy_banner() - Copy a banner file to the requests directory
- * for the specified job.
- * copy_file() - Copy a PPD file or interface script...
- * copy_model() - Copy a PPD model file, substituting default
- * values as needed...
- * copy_job_attrs() - Copy job attributes.
- * copy_printer_attrs() - Copy printer attributes.
- * copy_subscription_attrs() - Copy subscription attributes.
- * create_job() - Print a file to a printer or class.
- * create_requested_array() - Create an array for the requested-attributes.
- * create_subscription() - Create a notification subscription.
- * delete_printer() - Remove a printer or class from the system.
- * get_default() - Get the default destination.
- * get_devices() - Get the list of available devices on the
- * local system.
- * get_document() - Get a copy of a job file.
- * get_job_attrs() - Get job attributes.
- * get_jobs() - Get a list of jobs for the specified printer.
- * get_notifications() - Get events for a subscription.
- * get_ppd() - Get a named PPD from the local system.
- * get_ppds() - Get the list of PPD files on the local
- * system.
- * get_printer_attrs() - Get printer attributes.
- * get_printer_supported() - Get printer supported values.
- * get_printers() - Get a list of printers or classes.
- * get_subscription_attrs() - Get subscription attributes.
- * get_subscriptions() - Get subscriptions.
- * get_username() - Get the username associated with a request.
- * hold_job() - Hold a print job.
- * hold_new_jobs() - Hold pending/new jobs on a printer or class.
- * move_job() - Move a job to a new destination.
- * ppd_parse_line() - Parse a PPD default line.
- * print_job() - Print a file to a printer or class.
- * read_job_ticket() - Read a job ticket embedded in a print file.
- * reject_jobs() - Reject print jobs to a printer.
- * release_held_new_jobs() - Release pending/new jobs on a printer or
- * class.
- * release_job() - Release a held print job.
- * renew_subscription() - Renew an existing subscription...
- * restart_job() - Restart an old print job.
- * save_auth_info() - Save authentication information for a job.
- * send_document() - Send a file to a printer or class.
- * send_http_error() - Send a HTTP error back to the IPP client.
- * send_ipp_status() - Send a status back to the IPP client.
- * set_default() - Set the default destination...
- * set_job_attrs() - Set job attributes.
- * set_printer_attrs() - Set printer attributes.
- * 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.
- * url_encode_string() - URL-encode a string.
- * 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
- * valid chars.
- * validate_user() - Validate the user for the request.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -153,7 +70,7 @@ static void copy_attrs(ipp_t *to, ipp_t *from, cups_array_t *ra,
cups_array_t *exclude);
static int copy_banner(cupsd_client_t *con, cupsd_job_t *job,
const char *name);
-static int copy_file(const char *from, const char *to);
+static int copy_file(const char *from, const char *to, mode_t mode);
static int copy_model(cupsd_client_t *con, const char *from,
const char *to);
static void copy_job_attrs(cupsd_client_t *con,
@@ -168,7 +85,7 @@ static void copy_subscription_attrs(cupsd_client_t *con,
cups_array_t *exclude);
static void create_job(cupsd_client_t *con, ipp_attribute_t *uri);
static cups_array_t *create_requested_array(ipp_t *request);
-static void create_subscription(cupsd_client_t *con, ipp_attribute_t *uri);
+static void create_subscriptions(cupsd_client_t *con, ipp_attribute_t *uri);
static void delete_printer(cupsd_client_t *con, ipp_attribute_t *uri);
static void get_default(cupsd_client_t *con);
static void get_devices(cupsd_client_t *con);
@@ -212,15 +129,12 @@ 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 char *url_encode_string(const char *s, char *buffer, int bufsize);
+static void url_encode_attr(ipp_attribute_t *attr, char *buffer, size_t bufsize);
+static char *url_encode_string(const char *s, char *buffer, size_t 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);
-static int validate_user(cupsd_job_t *job, cupsd_client_t *con,
- const char *owner, char *username,
- int userlen);
+static int validate_user(cupsd_job_t *job, cupsd_client_t *con, const char *owner, char *username, size_t userlen);
/*
@@ -242,7 +156,7 @@ cupsdProcessIPPRequest(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdProcessIPPRequest(%p[%d]): operation_id = %04x",
- con, con->http.fd, con->request->request.op.operation_id);
+ con, con->number, con->request->request.op.operation_id);
/*
* First build an empty response message for this request...
@@ -270,7 +184,7 @@ cupsdProcessIPPRequest(
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Bad request version number %d.%d",
- IPP_VERSION_NOT_SUPPORTED, con->http.hostname,
+ IPP_VERSION_NOT_SUPPORTED, con->http->hostname,
con->request->request.any.version[0],
con->request->request.any.version[1]);
@@ -287,7 +201,7 @@ cupsdProcessIPPRequest(
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Bad request ID %d",
- IPP_BAD_REQUEST, con->http.hostname,
+ IPP_BAD_REQUEST, con->http->hostname,
con->request->request.any.request_id);
send_ipp_status(con, IPP_BAD_REQUEST, _("Bad request ID %d."),
@@ -297,7 +211,7 @@ cupsdProcessIPPRequest(
{
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s No attributes in request",
- IPP_BAD_REQUEST, con->http.hostname);
+ IPP_BAD_REQUEST, con->http->hostname);
send_ipp_status(con, IPP_BAD_REQUEST, _("No attributes in request."));
}
@@ -319,7 +233,7 @@ cupsdProcessIPPRequest(
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Attribute groups are out of order",
- IPP_BAD_REQUEST, con->http.hostname);
+ IPP_BAD_REQUEST, con->http->hostname);
send_ipp_status(con, IPP_BAD_REQUEST,
_("Attribute groups are out of order (%x < %x)."),
@@ -353,7 +267,20 @@ cupsdProcessIPPRequest(
if (attr && attr->name &&
!strcmp(attr->name, "attributes-natural-language") &&
(attr->value_tag & IPP_TAG_MASK) == IPP_TAG_LANGUAGE)
+ {
language = attr;
+
+ /*
+ * Reset language for this request if different from Accept-Language.
+ */
+
+ if (!con->language ||
+ strcmp(attr->values[0].string.text, con->language->language))
+ {
+ cupsLangFree(con->language);
+ con->language = cupsLangGet(attr->values[0].string.text);
+ }
+ }
else
language = NULL;
@@ -396,7 +323,7 @@ cupsdProcessIPPRequest(
charset->values[0].string.text);
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Unsupported attributes-charset value \"%s\"",
- IPP_CHARSET, con->http.hostname,
+ IPP_CHARSET, con->http->hostname,
charset->values[0].string.text);
send_ipp_status(con, IPP_BAD_REQUEST,
_("Unsupported character set \"%s\"."),
@@ -423,7 +350,7 @@ cupsdProcessIPPRequest(
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Missing attributes-charset attribute",
- IPP_BAD_REQUEST, con->http.hostname);
+ IPP_BAD_REQUEST, con->http->hostname);
}
if (!language)
@@ -433,7 +360,7 @@ cupsdProcessIPPRequest(
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Missing attributes-natural-language attribute",
- IPP_BAD_REQUEST, con->http.hostname);
+ IPP_BAD_REQUEST, con->http->hostname);
}
if (!uri)
@@ -444,7 +371,7 @@ cupsdProcessIPPRequest(
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Missing printer-uri, job-uri, or ppd-name "
- "attribute", IPP_BAD_REQUEST, con->http.hostname);
+ "attribute", IPP_BAD_REQUEST, con->http->hostname);
}
cupsdLogMessage(CUPSD_LOG_DEBUG, "Request attributes follow...");
@@ -475,15 +402,14 @@ cupsdProcessIPPRequest(
*/
if (!strcmp(username->values[0].string.text, "root") &&
- _cups_strcasecmp(con->http.hostname, "localhost") &&
+ _cups_strcasecmp(con->http->hostname, "localhost") &&
strcmp(con->username, "root"))
{
/*
* Remote unauthenticated user masquerading as local root...
*/
- _cupsStrFree(username->values[0].string.text);
- username->values[0].string.text = _cupsStrAlloc(RemoteRoot);
+ ippSetString(con->request, &username, 0, RemoteRoot);
}
}
@@ -507,183 +433,183 @@ cupsdProcessIPPRequest(
switch (con->request->request.op.operation_id)
{
- case IPP_PRINT_JOB :
+ case IPP_OP_PRINT_JOB :
print_job(con, uri);
break;
- case IPP_VALIDATE_JOB :
+ case IPP_OP_VALIDATE_JOB :
validate_job(con, uri);
break;
- case IPP_CREATE_JOB :
+ case IPP_OP_CREATE_JOB :
create_job(con, uri);
break;
- case IPP_SEND_DOCUMENT :
+ case IPP_OP_SEND_DOCUMENT :
send_document(con, uri);
break;
- case IPP_CANCEL_JOB :
+ case IPP_OP_CANCEL_JOB :
cancel_job(con, uri);
break;
- case IPP_GET_JOB_ATTRIBUTES :
+ case IPP_OP_GET_JOB_ATTRIBUTES :
get_job_attrs(con, uri);
break;
- case IPP_GET_JOBS :
+ case IPP_OP_GET_JOBS :
get_jobs(con, uri);
break;
- case IPP_GET_PRINTER_ATTRIBUTES :
+ case IPP_OP_GET_PRINTER_ATTRIBUTES :
get_printer_attrs(con, uri);
break;
- case IPP_GET_PRINTER_SUPPORTED_VALUES :
+ case IPP_OP_GET_PRINTER_SUPPORTED_VALUES :
get_printer_supported(con, uri);
break;
- case IPP_HOLD_JOB :
+ case IPP_OP_HOLD_JOB :
hold_job(con, uri);
break;
- case IPP_RELEASE_JOB :
+ case IPP_OP_RELEASE_JOB :
release_job(con, uri);
break;
- case IPP_RESTART_JOB :
+ case IPP_OP_RESTART_JOB :
restart_job(con, uri);
break;
- case IPP_PAUSE_PRINTER :
+ case IPP_OP_PAUSE_PRINTER :
stop_printer(con, uri);
break;
- case IPP_RESUME_PRINTER :
+ case IPP_OP_RESUME_PRINTER :
start_printer(con, uri);
break;
- case IPP_PURGE_JOBS :
- case IPP_CANCEL_JOBS :
- case IPP_CANCEL_MY_JOBS :
+ case IPP_OP_PURGE_JOBS :
+ case IPP_OP_CANCEL_JOBS :
+ case IPP_OP_CANCEL_MY_JOBS :
cancel_all_jobs(con, uri);
break;
- case IPP_SET_JOB_ATTRIBUTES :
+ case IPP_OP_SET_JOB_ATTRIBUTES :
set_job_attrs(con, uri);
break;
- case IPP_SET_PRINTER_ATTRIBUTES :
+ case IPP_OP_SET_PRINTER_ATTRIBUTES :
set_printer_attrs(con, uri);
break;
- case IPP_HOLD_NEW_JOBS :
+ case IPP_OP_HOLD_NEW_JOBS :
hold_new_jobs(con, uri);
break;
- case IPP_RELEASE_HELD_NEW_JOBS :
+ case IPP_OP_RELEASE_HELD_NEW_JOBS :
release_held_new_jobs(con, uri);
break;
- case IPP_CLOSE_JOB :
+ case IPP_OP_CLOSE_JOB :
close_job(con, uri);
break;
- case CUPS_GET_DEFAULT :
+ case IPP_OP_CUPS_GET_DEFAULT :
get_default(con);
break;
- case CUPS_GET_PRINTERS :
+ case IPP_OP_CUPS_GET_PRINTERS :
get_printers(con, 0);
break;
- case CUPS_GET_CLASSES :
+ case IPP_OP_CUPS_GET_CLASSES :
get_printers(con, CUPS_PRINTER_CLASS);
break;
- case CUPS_ADD_PRINTER :
+ case IPP_OP_CUPS_ADD_MODIFY_PRINTER :
add_printer(con, uri);
break;
- case CUPS_DELETE_PRINTER :
+ case IPP_OP_CUPS_DELETE_PRINTER :
delete_printer(con, uri);
break;
- case CUPS_ADD_CLASS :
+ case IPP_OP_CUPS_ADD_MODIFY_CLASS :
add_class(con, uri);
break;
- case CUPS_DELETE_CLASS :
+ case IPP_OP_CUPS_DELETE_CLASS :
delete_printer(con, uri);
break;
- case CUPS_ACCEPT_JOBS :
- case IPP_ENABLE_PRINTER :
+ case IPP_OP_CUPS_ACCEPT_JOBS :
+ case IPP_OP_ENABLE_PRINTER :
accept_jobs(con, uri);
break;
- case CUPS_REJECT_JOBS :
- case IPP_DISABLE_PRINTER :
+ case IPP_OP_CUPS_REJECT_JOBS :
+ case IPP_OP_DISABLE_PRINTER :
reject_jobs(con, uri);
break;
- case CUPS_SET_DEFAULT :
+ case IPP_OP_CUPS_SET_DEFAULT :
set_default(con, uri);
break;
- case CUPS_GET_DEVICES :
+ case IPP_OP_CUPS_GET_DEVICES :
get_devices(con);
break;
- case CUPS_GET_DOCUMENT :
+ case IPP_OP_CUPS_GET_DOCUMENT :
get_document(con, uri);
break;
- case CUPS_GET_PPD :
+ case IPP_OP_CUPS_GET_PPD :
get_ppd(con, uri);
break;
- case CUPS_GET_PPDS :
+ case IPP_OP_CUPS_GET_PPDS :
get_ppds(con);
break;
- case CUPS_MOVE_JOB :
+ case IPP_OP_CUPS_MOVE_JOB :
move_job(con, uri);
break;
- case CUPS_AUTHENTICATE_JOB :
+ case IPP_OP_CUPS_AUTHENTICATE_JOB :
authenticate_job(con, uri);
break;
- case IPP_CREATE_PRINTER_SUBSCRIPTION :
- case IPP_CREATE_JOB_SUBSCRIPTION :
- create_subscription(con, uri);
+ case IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS :
+ case IPP_OP_CREATE_JOB_SUBSCRIPTIONS :
+ create_subscriptions(con, uri);
break;
- case IPP_GET_SUBSCRIPTION_ATTRIBUTES :
+ case IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES :
get_subscription_attrs(con, sub_id);
break;
- case IPP_GET_SUBSCRIPTIONS :
+ case IPP_OP_GET_SUBSCRIPTIONS :
get_subscriptions(con, uri);
break;
- case IPP_RENEW_SUBSCRIPTION :
+ case IPP_OP_RENEW_SUBSCRIPTION :
renew_subscription(con, sub_id);
break;
- case IPP_CANCEL_SUBSCRIPTION :
+ case IPP_OP_CANCEL_SUBSCRIPTION :
cancel_subscription(con, sub_id);
break;
- case IPP_GET_NOTIFICATIONS :
+ case IPP_OP_GET_NOTIFICATIONS :
get_notifications(con);
break;
default :
cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
"%04X %s Operation %04X (%s) not supported",
- IPP_OPERATION_NOT_SUPPORTED, con->http.hostname,
+ IPP_OPERATION_NOT_SUPPORTED, con->http->hostname,
con->request->request.op.operation_id,
ippOpString(con->request->request.op.operation_id));
@@ -707,78 +633,63 @@ cupsdProcessIPPRequest(
>= IPP_BAD_REQUEST &&
con->response->request.status.status_code
!= IPP_NOT_FOUND ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG,
- "Returning IPP %s for %s (%s) from %s",
+ "[Client %d] Returning IPP %s for %s (%s) from %s",
+ con->number,
ippErrorString(con->response->request.status.status_code),
ippOpString(con->request->request.op.operation_id),
uri ? uri->values[0].string.text : "no URI",
- con->http.hostname);
+ con->http->hostname);
- if (LogLevel == CUPSD_LOG_DEBUG2)
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdProcessIPPRequest: ippLength(response)=%ld",
- (long)ippLength(con->response));
+ httpClearFields(con->http);
- if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE))
- {
#ifdef CUPSD_USE_CHUNKING
- /*
- * Because older versions of CUPS (1.1.17 and older) and some IPP
- * clients do not implement chunking properly, we cannot use
- * chunking by default. This may become the default in future
- * CUPS releases, or we might add a configuration directive for
- * it.
- */
-
- if (con->http.version == HTTP_1_1)
- {
- if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n\r\n") < 0)
- return (0);
+ /*
+ * Because older versions of CUPS (1.1.17 and older) and some IPP
+ * clients do not implement chunking properly, we cannot use
+ * chunking by default. This may become the default in future
+ * CUPS releases, or we might add a configuration directive for
+ * it.
+ */
- if (cupsdFlushHeader(con) < 0)
- return (0);
+ if (con->http->version == HTTP_1_1)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "[Client %d] Transfer-Encoding: chunked",
+ con->number);
- con->http.data_encoding = HTTP_ENCODE_CHUNKED;
- }
- else
+ cupsdSetLength(con->http, 0);
+ }
+ else
#endif /* CUPSD_USE_CHUNKING */
- {
- size_t length; /* Length of response */
-
-
- length = ippLength(con->response);
-
- if (con->file >= 0 && !con->pipe_pid)
- {
- struct stat fileinfo; /* File information */
-
-
- if (!fstat(con->file, &fileinfo))
- length += fileinfo.st_size;
- }
+ {
+ size_t length; /* Length of response */
- if (httpPrintf(HTTP(con), "Content-Length: " CUPS_LLFMT "\r\n\r\n",
- CUPS_LLCAST length) < 0)
- return (0);
- if (cupsdFlushHeader(con) < 0)
- return (0);
+ length = ippLength(con->response);
- con->http.data_encoding = HTTP_ENCODE_LENGTH;
- con->http.data_remaining = length;
+ if (con->file >= 0 && !con->pipe_pid)
+ {
+ struct stat fileinfo; /* File information */
- if (con->http.data_remaining <= INT_MAX)
- con->http._data_remaining = con->http.data_remaining;
- else
- con->http._data_remaining = INT_MAX;
+ if (!fstat(con->file, &fileinfo))
+ length += (size_t)fileinfo.st_size;
}
- cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient,
- (cupsd_selfunc_t)cupsdWriteClient, con);
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "[Client %d] Content-Length: " CUPS_LLFMT,
+ con->number, CUPS_LLCAST length);
+ httpSetLength(con->http, length);
+ }
+ if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE))
+ {
/*
* Tell the caller the response header was sent successfully...
*/
+ cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient,
+ (cupsd_selfunc_t)cupsdWriteClient, con);
+
return (1);
}
else
@@ -860,7 +771,7 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -945,7 +856,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Do we have a valid URI?
@@ -1034,10 +945,18 @@ add_class(cupsd_client_t *con, /* I - Client connection */
need_restart_job = 0;
- if ((attr = ippFindAttribute(con->request, "printer-location",
- IPP_TAG_TEXT)) != NULL)
+ if ((attr = ippFindAttribute(con->request, "printer-location", IPP_TAG_TEXT)) != NULL)
cupsdSetString(&pclass->location, attr->values[0].string.text);
+ if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strncmp(attr->values[0].string.text, "geo:", 4))
+ cupsdSetString(&pclass->geo_location, attr->values[0].string.text);
+
+ if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL)
+ cupsdSetString(&pclass->organization, attr->values[0].string.text);
+
+ if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL)
+ cupsdSetString(&pclass->organizational_unit, attr->values[0].string.text);
+
if ((attr = ippFindAttribute(con->request, "printer-info",
IPP_TAG_TEXT)) != NULL)
cupsdSetString(&pclass->info, attr->values[0].string.text);
@@ -1059,6 +978,16 @@ add_class(cupsd_client_t *con, /* I - Client connection */
if ((attr = ippFindAttribute(con->request, "printer-is-shared",
IPP_TAG_BOOLEAN)) != NULL)
{
+ if (pclass->type & CUPS_PRINTER_REMOTE)
+ {
+ /*
+ * Cannot re-share remote printers.
+ */
+
+ send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues."));
+ return;
+ }
+
if (pclass->shared && !attr->values[0].boolean)
cupsdDeregisterPrinter(pclass, 1);
@@ -1157,6 +1086,8 @@ add_class(cupsd_client_t *con, /* I - Client connection */
IPP_TAG_KEYWORD)) != NULL)
cupsdSetAuthInfoRequired(pclass, NULL, attr);
+ pclass->config_time = time(NULL);
+
/*
* Update the printer class attributes and return...
*/
@@ -1215,7 +1146,7 @@ add_file(cupsd_client_t *con, /* I - Connection to client */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"add_file(con=%p[%d], job=%d, filetype=%s/%s, "
- "compression=%d)", con, con ? con->http.fd : -1, job->id,
+ "compression=%d)", con, con ? con->number : -1, job->id,
filetype->super, filetype->type, compression);
/*
@@ -1230,12 +1161,18 @@ add_file(cupsd_client_t *con, /* I - Connection to client */
else
{
compressions = (int *)realloc(job->compressions,
- (job->num_files + 1) * sizeof(int));
+ (size_t)(job->num_files + 1) * sizeof(int));
filetypes = (mime_type_t **)realloc(job->filetypes,
- (job->num_files + 1) *
+ (size_t)(job->num_files + 1) *
sizeof(mime_type_t *));
}
+ if (compressions)
+ job->compressions = compressions;
+
+ if (filetypes)
+ job->filetypes = filetypes;
+
if (!compressions || !filetypes)
{
cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE,
@@ -1248,9 +1185,7 @@ add_file(cupsd_client_t *con, /* I - Connection to client */
return (-1);
}
- job->compressions = compressions;
job->compressions[job->num_files] = compression;
- job->filetypes = filetypes;
job->filetypes[job->num_files] = filetype;
job->num_files ++;
@@ -1274,6 +1209,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
http_status_t status; /* Policy status */
ipp_attribute_t *attr, /* Current attribute */
*auth_info; /* auth-info attribute */
+ const char *mandatory; /* Current mandatory job attribute */
const char *val; /* Default option value */
int priority; /* Job priority */
cupsd_job_t *job; /* Current job */
@@ -1287,15 +1223,25 @@ add_job(cupsd_client_t *con, /* I - Client connection */
ipp_t *unsup_col; /* media-col in unsupported response */
static const char * const readonly[] =/* List of read-only attributes */
{
+ "date-time-at-completed",
+ "date-time-at-creation",
+ "date-time-at-processing",
+ "job-detailed-status-messages",
+ "job-document-access-errors",
"job-id",
- "job-k-octets",
- /*"job-impressions",*/ /* For now we allow this since cupsd can't count */
"job-impressions-completed",
- "job-media-sheets",
+ "job-k-octets-completed",
"job-media-sheets-completed",
+ "job-pages-completed",
+ "job-printer-up-time",
+ "job-printer-uri",
"job-state",
"job-state-message",
"job-state-reasons",
+ "job-uri",
+ "number-of-documents",
+ "number-of-intervening-jobs",
+ "output-device-assigned",
"time-at-completed",
"time-at-creation",
"time-at-processing"
@@ -1303,7 +1249,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))",
- con, con->http.fd, printer, printer->name,
+ con, con->number, printer, printer->name,
filetype, filetype ? filetype->super : "none",
filetype ? filetype->type : "none");
@@ -1312,8 +1258,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */
*/
if (!printer->shared &&
- _cups_strcasecmp(con->http.hostname, "localhost") &&
- _cups_strcasecmp(con->http.hostname, ServerName))
+ _cups_strcasecmp(con->http->hostname, "localhost") &&
+ _cups_strcasecmp(con->http->hostname, ServerName))
{
send_ipp_status(con, IPP_NOT_AUTHORIZED,
_("The printer or class is not shared."));
@@ -1339,8 +1285,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */
return (NULL);
}
#ifdef HAVE_SSL
- else if (auth_info && !con->http.tls &&
- !httpAddrLocalhost(con->http.hostaddr))
+ else if (auth_info && !con->http->tls &&
+ !httpAddrLocalhost(con->http->hostaddr))
{
/*
* Require encryption of auth-info over non-local connections...
@@ -1365,27 +1311,43 @@ add_job(cupsd_client_t *con, /* I - Client connection */
/*
* Validate job template attributes; for now just document-format,
- * copies, number-up, and page-ranges...
+ * copies, job-sheets, number-up, page-ranges, mandatory attributes, and
+ * media...
*/
for (i = 0; i < (int)(sizeof(readonly) / sizeof(readonly[0])); i ++)
{
- if ((attr = ippFindAttribute(con->request, readonly[i],
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(con->request, readonly[i], IPP_TAG_ZERO)) != NULL)
{
ippDeleteAttribute(con->request, attr);
if (StrictConformance)
{
- send_ipp_status(con, IPP_BAD_REQUEST,
- _("The '%s' Job Description attribute cannot be "
- "supplied in a job creation request."), readonly[i]);
+ send_ipp_status(con, IPP_BAD_REQUEST, _("The '%s' Job Status attribute cannot be supplied in a job creation request."), readonly[i]);
return (NULL);
}
- cupsdLogMessage(CUPSD_LOG_WARN,
- "Unexpected '%s' Job Description attribute in a job "
- "creation request.", readonly[i]);
+ cupsdLogMessage(CUPSD_LOG_INFO, "Unexpected '%s' Job Status attribute in a job creation request.", readonly[i]);
+ }
+ }
+
+ if (printer->pc)
+ {
+ for (mandatory = (char *)cupsArrayFirst(printer->pc->mandatory);
+ mandatory;
+ mandatory = (char *)cupsArrayNext(printer->pc->mandatory))
+ {
+ if (!ippFindAttribute(con->request, mandatory, IPP_TAG_ZERO))
+ {
+ /*
+ * Missing a required attribute...
+ */
+
+ send_ipp_status(con, IPP_CONFLICT,
+ _("The \"%s\" attribute is required for print jobs."),
+ mandatory);
+ return (NULL);
+ }
}
}
@@ -1575,8 +1537,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
}
if ((attr = ippFindAttribute(con->request, "job-name", IPP_TAG_ZERO)) == NULL)
- ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL,
- "Untitled");
+ ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled");
else if ((attr->value_tag != IPP_TAG_NAME &&
attr->value_tag != IPP_TAG_NAMELANG) ||
attr->num_values != 1)
@@ -1587,57 +1548,13 @@ add_job(cupsd_client_t *con, /* I - Client connection */
attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP;
return (NULL);
}
- else
+ else if (!ippValidateAttribute(attr))
{
- const char *ptr; /* Pointer into string */
-
- for (ptr = attr->values[0].string.text; *ptr; ptr ++)
- {
- if ((*ptr & 0xe0) == 0xc0)
- {
- ptr ++;
- if ((*ptr & 0xc0) != 0x80)
- break;
- }
- else if ((*ptr & 0xf0) == 0xe0)
- {
- ptr ++;
- if ((*ptr & 0xc0) != 0x80)
- break;
- ptr ++;
- if ((*ptr & 0xc0) != 0x80)
- break;
- }
- else if ((*ptr & 0xf8) == 0xf0)
- {
- ptr ++;
- if ((*ptr & 0xc0) != 0x80)
- break;
- ptr ++;
- if ((*ptr & 0xc0) != 0x80)
- break;
- ptr ++;
- if ((*ptr & 0xc0) != 0x80)
- break;
- }
- else if (*ptr & 0x80)
- break;
- }
-
- if (*ptr || (ptr - attr->values[0].string.text) > (IPP_MAX_NAME - 1))
- {
- if (*ptr)
- send_ipp_status(con, IPP_ATTRIBUTES,
- _("Bad job-name value: Bad UTF-8 sequence."));
- else
- send_ipp_status(con, IPP_ATTRIBUTES,
- _("Bad job-name value: Name too long."));
-
- if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL)
- attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP;
-
- return (NULL);
- }
+ send_ipp_status(con, IPP_ATTRIBUTES, _("Bad job-name value: %s"),
+ cupsLastErrorString());
+ if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL)
+ attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP;
+ return (NULL);
}
if ((job = cupsdAddJob(priority, printer->name)) == NULL)
@@ -1665,7 +1582,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
cupsdSetString(&job->username, con->username);
if (attr)
- cupsdSetString(&attr->values[0].string.text, con->username);
+ ippSetString(job->attrs, &attr, 0, con->username);
}
else if (attr)
{
@@ -1683,9 +1600,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */
"job-originating-user-name", NULL, job->username);
else
{
- attr->group_tag = IPP_TAG_JOB;
- _cupsStrFree(attr->name);
- attr->name = _cupsStrAlloc("job-originating-user-name");
+ ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB);
+ ippSetName(job->attrs, &attr, "job-originating-user-name");
}
if (con->username[0] || auth_info)
@@ -1700,6 +1616,9 @@ add_job(cupsd_client_t *con, /* I - Client connection */
ippDeleteAttribute(job->attrs, auth_info);
}
+ if ((attr = ippFindAttribute(con->request, "job-name", IPP_TAG_NAME)) != NULL)
+ cupsdSetString(&(job->name), attr->values[0].string.text);
+
if ((attr = ippFindAttribute(job->attrs, "job-originating-host-name",
IPP_TAG_ZERO)) != NULL)
{
@@ -1709,55 +1628,18 @@ add_job(cupsd_client_t *con, /* I - Client connection */
if (attr->value_tag != IPP_TAG_NAME ||
attr->num_values != 1 ||
- strcmp(con->http.hostname, "localhost"))
+ strcmp(con->http->hostname, "localhost"))
{
/*
* Can't override the value if we aren't connected via localhost.
* Also, we can only have 1 value and it must be a name value.
*/
- switch (attr->value_tag)
- {
- case IPP_TAG_STRING :
- case IPP_TAG_TEXTLANG :
- case IPP_TAG_NAMELANG :
- case IPP_TAG_TEXT :
- case IPP_TAG_NAME :
- case IPP_TAG_KEYWORD :
- case IPP_TAG_URI :
- case IPP_TAG_URISCHEME :
- case IPP_TAG_CHARSET :
- case IPP_TAG_LANGUAGE :
- case IPP_TAG_MIMETYPE :
- /*
- * Free old strings...
- */
-
- for (i = 0; i < attr->num_values; i ++)
- {
- _cupsStrFree(attr->values[i].string.text);
- attr->values[i].string.text = NULL;
- if (attr->values[i].string.language)
- {
- _cupsStrFree(attr->values[i].string.language);
- attr->values[i].string.language = NULL;
- }
- }
-
- default :
- break;
- }
-
- /*
- * Use the default connection hostname instead...
- */
-
- attr->value_tag = IPP_TAG_NAME;
- attr->num_values = 1;
- attr->values[0].string.text = _cupsStrAlloc(con->http.hostname);
+ ippDeleteAttribute(job->attrs, attr);
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-host-name", NULL, con->http->hostname);
}
-
- attr->group_tag = IPP_TAG_JOB;
+ else
+ ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB);
}
else
{
@@ -1767,17 +1649,15 @@ add_job(cupsd_client_t *con, /* I - Client connection */
*/
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME,
- "job-originating-host-name", NULL, con->http.hostname);
+ "job-originating-host-name", NULL, con->http->hostname);
}
- ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation",
- time(NULL));
- attr = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER,
- "time-at-processing", 0);
- attr->value_tag = IPP_TAG_NOVALUE;
- attr = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER,
- "time-at-completed", 0);
- attr->value_tag = IPP_TAG_NOVALUE;
+ ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed");
+ ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(NULL)));
+ ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing");
+ ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "time-at-completed");
+ ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", time(NULL));
+ ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "time-at-processing");
/*
* Add remaining job attributes...
@@ -1789,13 +1669,13 @@ add_job(cupsd_client_t *con, /* I - Client connection */
job->state_value = (ipp_jstate_t)job->state->values[0].integer;
job->reasons = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
"job-state-reasons", NULL, "job-incoming");
+ job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", 0);
job->sheets = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER,
"job-media-sheets-completed", 0);
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL,
printer->uri);
- if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
- IPP_TAG_INTEGER)) != NULL)
+ if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
attr->values[0].integer = 0;
else
ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", 0);
@@ -1854,8 +1734,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */
attr = ippAddStrings(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-sheets",
2, NULL, NULL);
- attr->values[0].string.text = _cupsStrRetain(printer->job_sheets[0]);
- attr->values[1].string.text = _cupsStrRetain(printer->job_sheets[1]);
+ ippSetString(job->attrs, &attr, 0, printer->job_sheets[0]);
+ ippSetString(job->attrs, &attr, 1, printer->job_sheets[1]);
}
job->job_sheets = attr;
@@ -1881,7 +1761,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
* Force the leading banner to have the classification on it...
*/
- cupsdSetString(&attr->values[0].string.text, Classification);
+ ippSetString(job->attrs, &attr, 0, Classification);
cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED "
"job-sheets=\"%s,none\", "
@@ -1898,7 +1778,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
* Can't put two different security markings on the same document!
*/
- cupsdSetString(&attr->values[1].string.text, attr->values[0].string.text);
+ ippSetString(job->attrs, &attr, 1, attr->values[0].string.text);
cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED "
"job-sheets=\"%s,%s\", "
@@ -1938,18 +1818,18 @@ add_job(cupsd_client_t *con, /* I - Client connection */
if (attr->num_values > 1 &&
!strcmp(attr->values[0].string.text, attr->values[1].string.text))
{
- cupsdSetString(&(attr->values[0].string.text), Classification);
- cupsdSetString(&(attr->values[1].string.text), Classification);
+ ippSetString(job->attrs, &attr, 0, Classification);
+ ippSetString(job->attrs, &attr, 1, Classification);
}
else
{
if (attr->num_values == 1 ||
strcmp(attr->values[0].string.text, "none"))
- cupsdSetString(&(attr->values[0].string.text), Classification);
+ ippSetString(job->attrs, &attr, 0, Classification);
if (attr->num_values > 1 &&
strcmp(attr->values[1].string.text, "none"))
- cupsdSetString(&(attr->values[1].string.text), Classification);
+ ippSetString(job->attrs, &attr, 1, Classification);
}
if (attr->num_values > 1)
@@ -1997,7 +1877,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
*/
httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
- con->servername, con->serverport, "/jobs/%d", job->id);
+ con->clientname, con->clientport, "/jobs/%d", job->id);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL,
job_uri);
@@ -2005,6 +1885,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state",
job->state_value);
+ ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, "");
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons",
NULL, job->reasons->values[0].string.text);
@@ -2220,7 +2101,7 @@ add_job_subscriptions(
{
sub->user_data_len = user_data->values[0].unknown.length;
memcpy(sub->user_data, user_data->values[0].unknown.data,
- sub->user_data_len);
+ (size_t)sub->user_data_len);
}
ippAddSeparator(con->response);
@@ -2289,8 +2170,8 @@ add_job_uuid(cupsd_job_t *job) /* I - Job */
if (!ippFindAttribute(job->attrs, "job-uuid", IPP_TAG_URI))
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL,
- _httpAssembleUUID(ServerName, RemotePort, job->dest, job->id,
- uuid, sizeof(uuid)));
+ httpAssembleUUID(ServerName, RemotePort, job->dest, job->id,
+ uuid, sizeof(uuid)));
}
@@ -2323,7 +2204,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Do we have a valid URI?
@@ -2416,6 +2297,15 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
IPP_TAG_TEXT)) != NULL)
cupsdSetString(&printer->location, attr->values[0].string.text);
+ if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strncmp(attr->values[0].string.text, "geo:", 4))
+ cupsdSetString(&printer->geo_location, attr->values[0].string.text);
+
+ if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL)
+ cupsdSetString(&printer->organization, attr->values[0].string.text);
+
+ if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL)
+ cupsdSetString(&printer->organizational_unit, attr->values[0].string.text);
+
if ((attr = ippFindAttribute(con->request, "printer-info",
IPP_TAG_TEXT)) != NULL)
cupsdSetString(&printer->info, attr->values[0].string.text);
@@ -2460,7 +2350,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG,
"%s device-uri: %s", printer->name,
- uri_status_strings[uri_status - HTTP_URI_OVERFLOW]);
+ uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
if (uri_status < HTTP_URI_OK)
{
@@ -2591,6 +2481,16 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
return;
}
+ if (printer->type & CUPS_PRINTER_REMOTE)
+ {
+ /*
+ * Cannot re-share remote printers.
+ */
+
+ send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues."));
+ return;
+ }
+
if (printer->shared && !attr->values[0].boolean)
cupsdDeregisterPrinter(printer, 1);
@@ -2735,7 +2635,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
* interfaces directory and make it executable...
*/
- if (copy_file(srcfile, dstfile))
+ if (copy_file(srcfile, dstfile, ConfigFilePerm | 0110))
{
send_ipp_status(con, IPP_INTERNAL_ERROR,
_("Unable to copy interface script - %s"),
@@ -2745,7 +2645,6 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG,
"Copied interface script successfully");
- chmod(dstfile, 0755);
}
snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot,
@@ -2758,7 +2657,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
* ppd directory and make it readable by all...
*/
- if (copy_file(srcfile, dstfile))
+ if (copy_file(srcfile, dstfile, ConfigFilePerm))
{
send_ipp_status(con, IPP_INTERNAL_ERROR,
_("Unable to copy PPD file - %s"),
@@ -2768,7 +2667,6 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG,
"Copied PPD file successfully");
- chmod(dstfile, 0644);
}
else
{
@@ -2822,7 +2720,6 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG,
"Copied PPD file successfully");
- chmod(dstfile, 0644);
}
}
@@ -2890,6 +2787,8 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
}
}
+ printer->config_time = time(NULL);
+
/*
* Update the printer attributes and return...
*/
@@ -2944,7 +2843,7 @@ add_printer_state_reasons(
{
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"add_printer_state_reasons(%p[%d], %p[%s])",
- con, con->http.fd, p, p->name);
+ con, con->number, p, p->name);
if (p->num_reasons == 0)
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
@@ -2970,7 +2869,7 @@ add_queued_job_count(
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_queued_job_count(%p[%d], %p[%s])",
- con, con->http.fd, p, p->name);
+ con, con->number, p, p->name);
count = cupsdGetPrinterJobCount(p->name);
@@ -3042,7 +2941,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "authenticate_job(%p[%d], %s)",
- con, con->http.fd, uri->values[0].string.text);
+ con, con->number, uri->values[0].string.text);
/*
* Start with "everything is OK" status...
@@ -3177,8 +3076,8 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */
if (attr)
{
- attr->value_tag = IPP_TAG_KEYWORD;
- cupsdSetString(&(attr->values[0].string.text), "no-hold");
+ ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD);
+ ippSetString(job->attrs, &attr, 0, "no-hold");
}
/*
@@ -3221,7 +3120,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Get the jobs to cancel/purge...
@@ -3328,8 +3227,12 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
{
for (i = 0; i < job_ids->num_values; i ++)
{
- if (!cupsdFindJob(job_ids->values[i].integer))
+ if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL)
break;
+
+ if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS &&
+ _cups_strcasecmp(job->username, username))
+ break;
}
if (i < job_ids->num_values)
@@ -3385,6 +3288,10 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL ||
_cups_strcasecmp(job->dest, printer->name))
break;
+
+ if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS &&
+ _cups_strcasecmp(job->username, username))
+ break;
}
if (i < job_ids->num_values)
@@ -3423,6 +3330,8 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
}
con->response->request.status.status_code = IPP_OK;
+
+ cupsdCheckJobs();
}
@@ -3448,7 +3357,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -3648,7 +3557,7 @@ cancel_subscription(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cancel_subscription(con=%p[%d], sub_id=%d)",
- con, con->http.fd, sub_id);
+ con, con->number, sub_id);
/*
* Is the subscription ID valid?
@@ -3754,7 +3663,7 @@ check_quotas(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "check_quotas(%p[%d], %p[%s])",
- con, con->http.fd, p, p->name);
+ con, con->number, p, p->name);
/*
* Figure out who is printing...
@@ -3977,7 +3886,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -4061,7 +3970,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */
*/
httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
- con->servername, con->serverport, "/jobs/%d", job->id);
+ con->clientname, con->clientport, "/jobs/%d", job->id);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL,
job_uri);
@@ -4112,7 +4021,11 @@ copy_attrs(ipp_t *to, /* I - Destination request */
fromattr->group_tag != IPP_TAG_ZERO) || !fromattr->name)
continue;
- if (!strcmp(fromattr->name, "job-printer-uri"))
+ if (!strcmp(fromattr->name, "document-password") ||
+ !strcmp(fromattr->name, "job-authorization-uri") ||
+ !strcmp(fromattr->name, "job-password") ||
+ !strcmp(fromattr->name, "job-password-encryption") ||
+ !strcmp(fromattr->name, "job-printer-uri"))
continue;
if (exclude &&
@@ -4177,7 +4090,7 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"copy_banner(con=%p[%d], job=%p[%d], name=\"%s\")",
- con, con ? con->http.fd : -1, job, job->id,
+ con, con ? con->number : -1, job, job->id,
name ? name : "(null)");
/*
@@ -4222,8 +4135,8 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */
*/
attrname[2] = '_';
- attrname[3] = toupper(attrname[3] & 255);
- attrname[4] = toupper(attrname[4] & 255);
+ attrname[3] = (char)toupper(attrname[3] & 255);
+ attrname[4] = (char)toupper(attrname[4] & 255);
}
snprintf(filename, sizeof(filename), "%s/banners/%s/%s", DataDir,
@@ -4277,7 +4190,7 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */
if (!isalpha(ch & 255) && ch != '-' && ch != '?')
break;
else if (s < (attrname + sizeof(attrname) - 1))
- *s++ = ch;
+ *s++ = (char)ch;
else
break;
@@ -4424,8 +4337,9 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */
kbytes = (cupsFileTell(out) + 1023) / 1024;
- if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
- IPP_TAG_INTEGER)) != NULL)
+ job->koctets += kbytes;
+
+ if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
attr->values[0].integer += kbytes;
cupsFileClose(out);
@@ -4440,7 +4354,8 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */
static int /* O - 0 = success, -1 = error */
copy_file(const char *from, /* I - Source file */
- const char *to) /* I - Destination file */
+ const char *to, /* I - Destination file */
+ mode_t mode) /* I - Permissions */
{
cups_file_t *src, /* Source file */
*dst; /* Destination file */
@@ -4457,7 +4372,7 @@ copy_file(const char *from, /* I - Source file */
if ((src = cupsFileOpen(from, "rb")) == NULL)
return (-1);
- if ((dst = cupsFileOpen(to, "wb")) == NULL)
+ if ((dst = cupsdCreateConfFile(to, mode)) == NULL)
{
cupsFileClose(src);
return (-1);
@@ -4468,7 +4383,7 @@ copy_file(const char *from, /* I - Source file */
*/
while ((bytes = cupsFileRead(src, buffer, sizeof(buffer))) > 0)
- if (cupsFileWrite(dst, buffer, bytes) < bytes)
+ if (cupsFileWrite(dst, buffer, (size_t)bytes) < bytes)
{
cupsFileClose(src);
cupsFileClose(dst);
@@ -4481,7 +4396,7 @@ copy_file(const char *from, /* I - Source file */
cupsFileClose(src);
- return (cupsFileClose(dst));
+ return (cupsdCloseCreatedConfFile(dst, to));
}
@@ -4536,7 +4451,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */
cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0])));
snprintf(buffer, sizeof(buffer), "%s/daemon/cups-driverd", ServerBin);
- snprintf(tempfile, sizeof(tempfile), "%s/%d.ppd", TempDir, con->http.fd);
+ snprintf(tempfile, sizeof(tempfile), "%s/%d.ppd", TempDir, con->number);
tempfd = open(tempfile, O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (tempfd < 0 || cupsdOpenPipe(temppipe))
return (-1);
@@ -4603,7 +4518,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */
if ((bytes = read(temppipe[0], buffer, sizeof(buffer))) > 0)
{
- if (write(tempfd, buffer, bytes) < bytes)
+ if (write(tempfd, buffer, (size_t)bytes) < bytes)
break;
total += bytes;
@@ -4717,7 +4632,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */
* Open the destination file for a copy...
*/
- if ((dst = cupsFileOpen(to, "wb")) == NULL)
+ if ((dst = cupsdCreateConfFile(to, ConfigFilePerm)) == NULL)
{
cupsFreeOptions(num_defaults, defaults);
cupsFileClose(src);
@@ -4772,7 +4687,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */
unlink(tempfile);
- return (cupsFileClose(dst));
+ return (cupsdCloseCreatedConfFile(dst, to));
}
@@ -4809,7 +4724,7 @@ copy_job_attrs(cupsd_client_t *con, /* I - Client connection */
(!ra || cupsArrayFind(ra, "job-more-info")))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "http",
- NULL, con->servername, con->serverport, "/jobs/%d",
+ NULL, con->clientname, con->clientport, "/jobs/%d",
job->id);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI,
"job-more-info", NULL, job_uri);
@@ -4830,7 +4745,7 @@ copy_job_attrs(cupsd_client_t *con, /* I - Client connection */
if (!ra || cupsArrayFind(ra, "job-printer-uri"))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
- con->servername, con->serverport,
+ con->clientname, con->clientport,
(job->dtype & CUPS_PRINTER_CLASS) ? "/classes/%s" :
"/printers/%s",
job->dest);
@@ -4841,13 +4756,67 @@ copy_job_attrs(cupsd_client_t *con, /* I - Client connection */
if (!ra || cupsArrayFind(ra, "job-uri"))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
- con->servername, con->serverport, "/jobs/%d",
+ con->clientname, con->clientport, "/jobs/%d",
job->id);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI,
"job-uri", NULL, job_uri);
}
- copy_attrs(con->response, job->attrs, ra, IPP_TAG_JOB, 0, exclude);
+ if (job->attrs)
+ {
+ copy_attrs(con->response, job->attrs, ra, IPP_TAG_JOB, 0, exclude);
+ }
+ else
+ {
+ /*
+ * Generate attributes from the job structure...
+ */
+
+ if (job->completed_time && (!ra || cupsArrayFind(ra, "date-time-at-completed")))
+ ippAddDate(con->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed_time));
+
+ if (job->creation_time && (!ra || cupsArrayFind(ra, "date-time-at-creation")))
+ ippAddDate(con->response, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(job->creation_time));
+
+ if (!ra || cupsArrayFind(ra, "job-id"))
+ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id);
+
+ if (!ra || cupsArrayFind(ra, "job-k-octets"))
+ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", job->koctets);
+
+ if (job->name && (!ra || cupsArrayFind(ra, "job-name")))
+ ippAddString(con->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_NAME), "job-name", NULL, job->name);
+
+ if (job->username && (!ra || cupsArrayFind(ra, "job-originating-user-name")))
+ ippAddString(con->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_NAME), "job-originating-user-name", NULL, job->username);
+
+ if (!ra || cupsArrayFind(ra, "job-state"))
+ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value);
+
+ if (!ra || cupsArrayFind(ra, "job-state-reasons"))
+ {
+ switch (job->state_value)
+ {
+ default : /* Should never get here for processing, pending, held, or stopped jobs since they don't get unloaded... */
+ break;
+ case IPP_JSTATE_ABORTED :
+ ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-aborted-by-system");
+ break;
+ case IPP_JSTATE_CANCELED :
+ ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-canceled-by-user");
+ break;
+ case IPP_JSTATE_COMPLETED :
+ ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-completed-successfully");
+ break;
+ }
+ }
+
+ if (job->completed_time && (!ra || cupsArrayFind(ra, "time-at-completed")))
+ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-completed", (int)job->completed_time);
+
+ if (job->creation_time && (!ra || cupsArrayFind(ra, "time-at-creation")))
+ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)job->creation_time);
+ }
}
@@ -4904,8 +4873,8 @@ copy_printer_attrs(
else
{
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri,
- sizeof(printer_uri), "ipp", NULL, con->servername,
- con->serverport,
+ sizeof(printer_uri), "ipp", NULL, con->clientname,
+ con->clientport,
(p2->type & CUPS_PRINTER_CLASS) ?
"/classes/%s" : "/printers/%s", p2->name);
member_uris->values[i].string.text = _cupsStrAlloc(printer_uri);
@@ -4924,6 +4893,13 @@ copy_printer_attrs(
"printer-alert-description", NULL,
printer->alert_description);
+ if (!ra || cupsArrayFind(ra, "printer-config-change-date-time"))
+ ippAddDate(con->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-config-change-time"))
+ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "printer-config-change-time", printer->config_time);
+
if (!ra || cupsArrayFind(ra, "printer-current-time"))
ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time",
ippTimeToDate(curtime));
@@ -4966,7 +4942,7 @@ copy_printer_attrs(
if (!ra || cupsArrayFind(ra, "printer-icons"))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_icons, sizeof(printer_icons),
- "http", NULL, con->servername, con->serverport,
+ "http", NULL, con->clientname, con->clientport,
"/icons/%s.png", printer->name);
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons",
NULL, printer_icons);
@@ -4974,17 +4950,15 @@ copy_printer_attrs(
}
if (!ra || cupsArrayFind(ra, "printer-is-accepting-jobs"))
- ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs",
- printer->accepting);
+ ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", (char)printer->accepting);
if (!ra || cupsArrayFind(ra, "printer-is-shared"))
- ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-shared",
- printer->shared);
+ ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-shared", (char)printer->shared);
if (!ra || cupsArrayFind(ra, "printer-more-info"))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
- "http", NULL, con->servername, con->serverport,
+ "http", NULL, con->clientname, con->clientport,
(printer->type & CUPS_PRINTER_CLASS) ?
"/classes/%s" : "/printers/%s", printer->name);
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI,
@@ -4999,6 +4973,9 @@ copy_printer_attrs(
ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state",
printer->state);
+ if (!ra || cupsArrayFind(ra, "printer-state-change-date-time"))
+ ippAddDate(con->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer->state_time));
+
if (!ra || cupsArrayFind(ra, "printer-state-change-time"))
ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
"printer-state-change-time", printer->state_time);
@@ -5012,7 +4989,7 @@ copy_printer_attrs(
if (!ra || cupsArrayFind(ra, "printer-type"))
{
- int type; /* printer-type value */
+ cups_ptype_t type; /* printer-type value */
/*
* Add the CUPS-specific printer-type attribute...
@@ -5029,8 +5006,7 @@ copy_printer_attrs(
if (!printer->shared)
type |= CUPS_PRINTER_NOT_SHARED;
- ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-type",
- type);
+ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-type", (int)type);
}
if (!ra || cupsArrayFind(ra, "printer-up-time"))
@@ -5040,7 +5016,7 @@ copy_printer_attrs(
if (!ra || cupsArrayFind(ra, "printer-uri-supported"))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
- "ipp", NULL, con->servername, con->serverport,
+ "ipp", NULL, con->clientname, con->clientport,
(printer->type & CUPS_PRINTER_CLASS) ?
"/classes/%s" : "/printers/%s", printer->name);
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI,
@@ -5167,7 +5143,7 @@ copy_subscription_attrs(
if (sub->dest && (!ra || cupsArrayFind(ra, "notify-printer-uri")))
{
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
- "ipp", NULL, con->servername, con->serverport,
+ "ipp", NULL, con->clientname, con->clientport,
"/printers/%s", sub->dest->name);
ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI,
"notify-printer-uri", NULL, printer_uri);
@@ -5200,7 +5176,7 @@ create_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -5265,251 +5241,34 @@ create_job(cupsd_client_t *con, /* I - Client connection */
static cups_array_t * /* O - Array of attributes or NULL */
create_requested_array(ipp_t *request) /* I - IPP request */
{
- int i; /* Looping var */
- ipp_attribute_t *requested; /* requested-attributes attribute */
cups_array_t *ra; /* Requested attributes array */
- char *value; /* Current value */
/*
- * Get the requested-attributes attribute, and return NULL if we don't
- * have one...
+ * Create the array for standard attributes...
*/
- if ((requested = ippFindAttribute(request, "requested-attributes",
- IPP_TAG_KEYWORD)) == NULL)
- return (NULL);
+ ra = ippCreateRequestedArray(request);
/*
- * If the attribute contains a single "all" keyword, return NULL...
+ * Add CUPS defaults as needed...
*/
- if (requested->num_values == 1 &&
- !strcmp(requested->values[0].string.text, "all"))
- return (NULL);
+ if (cupsArrayFind(ra, "printer-defaults"))
+ {
+ /*
+ * Include user-set defaults...
+ */
- /*
- * Create an array using "strcmp" as the comparison function...
- */
-
- ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-
- for (i = 0; i < requested->num_values; i ++)
- {
- value = requested->values[i].string.text;
-
- if (!strcmp(value, "job-template"))
- {
- /* Only includes the set of Job Template attributes supported by CUPS */
- cupsArrayAdd(ra, "copies");
- cupsArrayAdd(ra, "copies-default");
- cupsArrayAdd(ra, "copies-supported");
- cupsArrayAdd(ra, "finishings");
- cupsArrayAdd(ra, "finishings-default");
- cupsArrayAdd(ra, "finishings-supported");
- cupsArrayAdd(ra, "job-hold-until");
- cupsArrayAdd(ra, "job-hold-until-default");
- cupsArrayAdd(ra, "job-hold-until-supported");
- cupsArrayAdd(ra, "job-priority");
- cupsArrayAdd(ra, "job-priority-default");
- cupsArrayAdd(ra, "job-priority-supported");
- cupsArrayAdd(ra, "job-sheets");
- cupsArrayAdd(ra, "job-sheets-default");
- cupsArrayAdd(ra, "job-sheets-supported");
- cupsArrayAdd(ra, "media");
- cupsArrayAdd(ra, "media-col");
- cupsArrayAdd(ra, "media-col-default");
- cupsArrayAdd(ra, "media-default");
- cupsArrayAdd(ra, "media-supported");
- cupsArrayAdd(ra, "multiple-document-handling");
- cupsArrayAdd(ra, "multiple-document-handling-default");
- cupsArrayAdd(ra, "multiple-document-handling-supported");
- cupsArrayAdd(ra, "number-up");
- cupsArrayAdd(ra, "number-up-default");
- cupsArrayAdd(ra, "number-up-layout");
- cupsArrayAdd(ra, "number-up-layout-default");
- cupsArrayAdd(ra, "number-up-layout-supported");
- cupsArrayAdd(ra, "number-up-supported");
- cupsArrayAdd(ra, "orientation-requested");
- cupsArrayAdd(ra, "orientation-requested-default");
- cupsArrayAdd(ra, "orientation-requested-supported");
- cupsArrayAdd(ra, "output-bin");
- cupsArrayAdd(ra, "output-bin-default");
- cupsArrayAdd(ra, "output-bin-supported");
- cupsArrayAdd(ra, "page-delivery");
- cupsArrayAdd(ra, "page-delivery-default");
- cupsArrayAdd(ra, "page-delivery-supported");
- cupsArrayAdd(ra, "page-order-received");
- cupsArrayAdd(ra, "page-order-received-default");
- cupsArrayAdd(ra, "page-order-received-supported");
- cupsArrayAdd(ra, "page-ranges");
- cupsArrayAdd(ra, "page-ranges-supported");
- cupsArrayAdd(ra, "presentation-direction-number-up");
- cupsArrayAdd(ra, "presentation-direction-number-up-default");
- cupsArrayAdd(ra, "presentation-direction-number-up-supported");
- cupsArrayAdd(ra, "print-color-mode");
- cupsArrayAdd(ra, "print-color-mode-default");
- cupsArrayAdd(ra, "print-color-mode-supported");
- cupsArrayAdd(ra, "print-content-optimize");
- cupsArrayAdd(ra, "print-content-optimize-default");
- cupsArrayAdd(ra, "print-content-optimize-supported");
- cupsArrayAdd(ra, "print-quality");
- cupsArrayAdd(ra, "print-quality-default");
- cupsArrayAdd(ra, "print-quality-supported");
- cupsArrayAdd(ra, "printer-resolution");
- cupsArrayAdd(ra, "printer-resolution-default");
- cupsArrayAdd(ra, "printer-resolution-supported");
- cupsArrayAdd(ra, "sheet-collate");
- cupsArrayAdd(ra, "sheet-collate-default");
- cupsArrayAdd(ra, "sheet-collate-supported");
- cupsArrayAdd(ra, "sides");
- cupsArrayAdd(ra, "sides-default");
- cupsArrayAdd(ra, "sides-supported");
- }
- else if (!strcmp(value, "job-description"))
- {
- /* Only includes the set of Job Description attributes supported by CUPS */
- cupsArrayAdd(ra, "date-time-at-completed");
- cupsArrayAdd(ra, "date-time-at-creation");
- cupsArrayAdd(ra, "date-time-at-processing");
- cupsArrayAdd(ra, "job-detailed-status-message");
- cupsArrayAdd(ra, "job-document-access-errors");
- cupsArrayAdd(ra, "job-id");
- cupsArrayAdd(ra, "job-impressions");
- cupsArrayAdd(ra, "job-impressions-completed");
- cupsArrayAdd(ra, "job-k-octets");
- cupsArrayAdd(ra, "job-k-octets-processed");
- cupsArrayAdd(ra, "job-mandatory-attributes");
- cupsArrayAdd(ra, "job-media-progress");
- cupsArrayAdd(ra, "job-media-sheets");
- cupsArrayAdd(ra, "job-media-sheets-completed");
- cupsArrayAdd(ra, "job-message-from-operator");
- cupsArrayAdd(ra, "job-more-info");
- cupsArrayAdd(ra, "job-name");
- cupsArrayAdd(ra, "job-originating-user-name");
- cupsArrayAdd(ra, "job-printer-up-time");
- cupsArrayAdd(ra, "job-printer-uri");
- cupsArrayAdd(ra, "job-state");
- cupsArrayAdd(ra, "job-state-message");
- cupsArrayAdd(ra, "job-state-reasons");
- cupsArrayAdd(ra, "job-uri");
- cupsArrayAdd(ra, "number-of-documents");
- cupsArrayAdd(ra, "number-of-intervening-jobs");
- cupsArrayAdd(ra, "output-device-assigned");
- cupsArrayAdd(ra, "time-at-completed");
- cupsArrayAdd(ra, "time-at-creation");
- cupsArrayAdd(ra, "time-at-processing");
- }
- else if (!strcmp(value, "printer-description"))
- {
- /* Only includes the set of Printer Description attributes supported by CUPS */
- cupsArrayAdd(ra, "charset-configured");
- cupsArrayAdd(ra, "charset-supported");
- cupsArrayAdd(ra, "color-supported");
- cupsArrayAdd(ra, "compression-supported");
- cupsArrayAdd(ra, "document-format-default");
- cupsArrayAdd(ra, "document-format-supported");
- cupsArrayAdd(ra, "generated-natural-language-supported");
- cupsArrayAdd(ra, "ipp-versions-supported");
- cupsArrayAdd(ra, "job-creation-attributes-supported");
- cupsArrayAdd(ra, "job-ids-supported");
- cupsArrayAdd(ra, "job-impressions-supported");
- cupsArrayAdd(ra, "job-k-octets-supported");
- cupsArrayAdd(ra, "job-media-sheets-supported");
- cupsArrayAdd(ra, "job-settable-attributes-supported");
- cupsArrayAdd(ra, "jpeg-k-octets-supported");
- cupsArrayAdd(ra, "jpeg-x-dimension-supported");
- cupsArrayAdd(ra, "jpeg-y-dimension-supported");
- cupsArrayAdd(ra, "media-bottom-margin-supported");
- cupsArrayAdd(ra, "media-col-supported");
- cupsArrayAdd(ra, "media-key-supported");
- cupsArrayAdd(ra, "media-left-margin-supported");
- cupsArrayAdd(ra, "media-right-margin-supported");
- cupsArrayAdd(ra, "media-size-supported");
- cupsArrayAdd(ra, "media-source-supported");
- cupsArrayAdd(ra, "media-top-margin-supported");
- cupsArrayAdd(ra, "media-type-supported");
- cupsArrayAdd(ra, "multiple-document-jobs-supported");
- cupsArrayAdd(ra, "multiple-operation-time-out");
- cupsArrayAdd(ra, "natural-language-configured");
- cupsArrayAdd(ra, "notify-max-events-supported");
- cupsArrayAdd(ra, "notify-schemes-supported");
- cupsArrayAdd(ra, "operations-supported");
- cupsArrayAdd(ra, "pages-per-minute");
- cupsArrayAdd(ra, "pages-per-minute-color");
- cupsArrayAdd(ra, "pdf-k-octets-supported");
- cupsArrayAdd(ra, "pdl-override-supported");
- cupsArrayAdd(ra, "printer-alert");
- cupsArrayAdd(ra, "printer-alert-description");
- cupsArrayAdd(ra, "printer-commands");
- cupsArrayAdd(ra, "printer-current-time");
- cupsArrayAdd(ra, "printer-dns-sd-name");
- cupsArrayAdd(ra, "printer-info");
- cupsArrayAdd(ra, "printer-is-accepting-jobs");
- cupsArrayAdd(ra, "printer-is-shared");
- cupsArrayAdd(ra, "printer-location");
- cupsArrayAdd(ra, "printer-make-and-model");
- cupsArrayAdd(ra, "printer-message-from-operator");
- cupsArrayAdd(ra, "printer-more-info");
- cupsArrayAdd(ra, "printer-more-info-manufacturer");
- cupsArrayAdd(ra, "printer-name");
- cupsArrayAdd(ra, "printer-settable-attributes-supported");
- cupsArrayAdd(ra, "printer-state");
- cupsArrayAdd(ra, "printer-state-change-date-time");
- cupsArrayAdd(ra, "printer-state-change-time");
- cupsArrayAdd(ra, "printer-state-message");
- cupsArrayAdd(ra, "printer-state-reasons");
- cupsArrayAdd(ra, "printer-type");
- cupsArrayAdd(ra, "printer-up-time");
- cupsArrayAdd(ra, "printer-uri-supported");
- cupsArrayAdd(ra, "queued-job-count");
- cupsArrayAdd(ra, "reference-uri-schemes-supported");
- cupsArrayAdd(ra, "uri-authentication-supported");
- cupsArrayAdd(ra, "uri-security-supported");
- cupsArrayAdd(ra, "which-jobs-supported");
- }
- else if (!strcmp(value, "printer-defaults"))
- {
- char *name; /* Option name */
-
-
- for (name = (char *)cupsArrayFirst(CommonDefaults);
- name;
- name = (char *)cupsArrayNext(CommonDefaults))
+ char *name; /* Option name */
+
+ cupsArrayRemove(ra, "printer-defaults");
+
+ for (name = (char *)cupsArrayFirst(CommonDefaults);
+ name;
+ name = (char *)cupsArrayNext(CommonDefaults))
+ if (!cupsArrayFind(ra, name))
cupsArrayAdd(ra, name);
- }
- else if (!strcmp(value, "subscription-description"))
- {
- /* Only includes the set of Subscription Description attributes supported by CUPS */
- cupsArrayAdd(ra, "notify-job-id");
- cupsArrayAdd(ra, "notify-lease-expiration-time");
- cupsArrayAdd(ra, "notify-printer-up-time");
- cupsArrayAdd(ra, "notify-printer-uri");
- cupsArrayAdd(ra, "notify-sequence-number");
- cupsArrayAdd(ra, "notify-subscriber-user-name");
- cupsArrayAdd(ra, "notify-subscription-id");
- }
- else if (!strcmp(value, "subscription-template"))
- {
- /* Only includes the set of Subscription Template attributes supported by CUPS */
- cupsArrayAdd(ra, "notify-attributes");
- cupsArrayAdd(ra, "notify-attributes-supported");
- cupsArrayAdd(ra, "notify-charset");
- cupsArrayAdd(ra, "notify-events");
- cupsArrayAdd(ra, "notify-events-default");
- cupsArrayAdd(ra, "notify-events-supported");
- cupsArrayAdd(ra, "notify-lease-duration");
- cupsArrayAdd(ra, "notify-lease-duration-default");
- cupsArrayAdd(ra, "notify-lease-duration-supported");
- cupsArrayAdd(ra, "notify-natural-language");
- cupsArrayAdd(ra, "notify-pull-method");
- cupsArrayAdd(ra, "notify-pull-method-supported");
- cupsArrayAdd(ra, "notify-recipient-uri");
- cupsArrayAdd(ra, "notify-time-interval");
- cupsArrayAdd(ra, "notify-user-data");
- }
- else
- cupsArrayAdd(ra, value);
}
return (ra);
@@ -5517,11 +5276,11 @@ create_requested_array(ipp_t *request) /* I - IPP request */
/*
- * 'create_subscription()' - Create a notification subscription.
+ * 'create_subscriptions()' - Create one or more notification subscriptions.
*/
static void
-create_subscription(
+create_subscriptions(
cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
@@ -5569,9 +5328,7 @@ create_subscription(
* Is the destination valid?
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "cupsdCreateSubscription(con=%p(%d), uri=\"%s\")",
- con, con->http.fd, uri->values[0].string.text);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", con, con->number, uri->values[0].string.text);
httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
sizeof(scheme), userpass, sizeof(userpass), host,
@@ -5822,7 +5579,7 @@ create_subscription(
if (MaxLeaseDuration && (lease == 0 || lease > MaxLeaseDuration))
{
cupsdLogMessage(CUPSD_LOG_INFO,
- "create_subscription: Limiting notify-lease-duration to "
+ "create_subscriptions: Limiting notify-lease-duration to "
"%d seconds.",
MaxLeaseDuration);
lease = MaxLeaseDuration;
@@ -5868,7 +5625,7 @@ create_subscription(
{
sub->user_data_len = user_data->values[0].unknown.length;
memcpy(sub->user_data, user_data->values[0].unknown.data,
- sub->user_data_len);
+ (size_t)sub->user_data_len);
}
ippAddSeparator(con->response);
@@ -5900,7 +5657,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Do we have a valid URI?
@@ -5951,10 +5708,16 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
snprintf(filename, sizeof(filename), "%s/interfaces/%s", ServerRoot,
printer->name);
unlink(filename);
+ snprintf(filename, sizeof(filename), "%s/interfaces/%s.O", ServerRoot,
+ printer->name);
+ unlink(filename);
snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot,
printer->name);
unlink(filename);
+ snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd.O", ServerRoot,
+ printer->name);
+ unlink(filename);
snprintf(filename, sizeof(filename), "%s/%s.png", CacheDir, printer->name);
unlink(filename);
@@ -6008,7 +5771,7 @@ get_default(cupsd_client_t *con) /* I - Client connection */
cups_array_t *ra; /* Requested attributes array */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->http.fd);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->number);
/*
* Check policy...
@@ -6058,7 +5821,7 @@ get_devices(cupsd_client_t *con) /* I - Client connection */
/* String for included schemes */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->http.fd);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->number);
/*
* Check policy...
@@ -6152,7 +5915,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -6299,7 +6062,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -6413,19 +6176,24 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
int port; /* Port portion of URI */
int job_comparison; /* Job comparison */
ipp_jstate_t job_state; /* job-state value */
- int first_job_id; /* First job ID */
- int limit; /* Maximum number of jobs to return */
+ int first_job_id = 1, /* First job ID */
+ first_index = 1, /* First index */
+ current_index = 0; /* Current index */
+ int limit = 0; /* Maximum number of jobs to return */
int count; /* Number of jobs that match */
+ int need_load_job = 0; /* Do we need to load the job? */
+ const char *job_attr; /* Job attribute requested */
ipp_attribute_t *job_ids; /* job-ids attribute */
cupsd_job_t *job; /* Current job pointer */
cupsd_printer_t *printer; /* Printer */
cups_array_t *list; /* Which job list... */
+ int delete_list = 0; /* Delete the list afterwards? */
cups_array_t *ra, /* Requested attributes array */
*exclude; /* Private attributes array */
cupsd_policy_t *policy; /* Current policy */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->http.fd,
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->number,
uri->values[0].string.text);
/*
@@ -6513,19 +6281,21 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
{
job_comparison = -1;
job_state = IPP_JOB_STOPPED;
- list = Jobs;
+ list = ActiveJobs;
}
else if (!strcmp(attr->values[0].string.text, "completed"))
{
job_comparison = 1;
job_state = IPP_JOB_CANCELED;
- list = Jobs;
+ list = cupsdGetCompletedJobs(printer);
+ delete_list = 1;
}
else if (!strcmp(attr->values[0].string.text, "aborted"))
{
job_comparison = 0;
job_state = IPP_JOB_ABORTED;
- list = Jobs;
+ list = cupsdGetCompletedJobs(printer);
+ delete_list = 1;
}
else if (!strcmp(attr->values[0].string.text, "all"))
{
@@ -6537,7 +6307,8 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
{
job_comparison = 0;
job_state = IPP_JOB_CANCELED;
- list = Jobs;
+ list = cupsdGetCompletedJobs(printer);
+ delete_list = 1;
}
else if (!strcmp(attr->values[0].string.text, "pending"))
{
@@ -6577,8 +6348,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
* See if they want to limit the number of jobs reported...
*/
- if ((attr = ippFindAttribute(con->request, "limit",
- IPP_TAG_INTEGER)) != NULL)
+ if ((attr = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER)) != NULL)
{
if (job_ids)
{
@@ -6590,11 +6360,20 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
limit = attr->values[0].integer;
}
- else
- limit = 0;
- if ((attr = ippFindAttribute(con->request, "first-job-id",
- IPP_TAG_INTEGER)) != NULL)
+ if ((attr = ippFindAttribute(con->request, "first-index", IPP_TAG_INTEGER)) != NULL)
+ {
+ if (job_ids)
+ {
+ send_ipp_status(con, IPP_CONFLICT,
+ _("The %s attribute cannot be provided with job-ids."),
+ "first-index");
+ return;
+ }
+
+ first_index = attr->values[0].integer;
+ }
+ else if ((attr = ippFindAttribute(con->request, "first-job-id", IPP_TAG_INTEGER)) != NULL)
{
if (job_ids)
{
@@ -6606,15 +6385,12 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
first_job_id = attr->values[0].integer;
}
- else
- first_job_id = 1;
/*
* See if we only want to see jobs for a specific user...
*/
- if ((attr = ippFindAttribute(con->request, "my-jobs",
- IPP_TAG_BOOLEAN)) != NULL && job_ids)
+ if ((attr = ippFindAttribute(con->request, "my-jobs", IPP_TAG_BOOLEAN)) != NULL && job_ids)
{
send_ipp_status(con, IPP_CONFLICT,
_("The %s attribute cannot be provided with job-ids."),
@@ -6626,17 +6402,42 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
else
username[0] = '\0';
- if ((ra = create_requested_array(con->request)) == NULL &&
- !ippFindAttribute(con->request, "requested-attributes", IPP_TAG_KEYWORD))
+ ra = create_requested_array(con->request);
+ for (job_attr = (char *)cupsArrayFirst(ra); job_attr; job_attr = (char *)cupsArrayNext(ra))
+ if (strcmp(job_attr, "job-id") &&
+ strcmp(job_attr, "job-k-octets") &&
+ strcmp(job_attr, "job-media-progress") &&
+ strcmp(job_attr, "job-more-info") &&
+ strcmp(job_attr, "job-name") &&
+ strcmp(job_attr, "job-originating-user-name") &&
+ strcmp(job_attr, "job-preserved") &&
+ strcmp(job_attr, "job-printer-up-time") &&
+ strcmp(job_attr, "job-printer-uri") &&
+ strcmp(job_attr, "job-state") &&
+ strcmp(job_attr, "job-state-reasons") &&
+ strcmp(job_attr, "job-uri") &&
+ strcmp(job_attr, "time-at-completed") &&
+ strcmp(job_attr, "time-at-creation") &&
+ strcmp(job_attr, "number-of-documents"))
+ {
+ need_load_job = 1;
+ break;
+ }
+
+ if (need_load_job && (limit == 0 || limit > 500) && (list == Jobs || delete_list))
{
/*
- * IPP conformance - Get-Jobs has a default requested-attributes value of
- * "job-id" and "job-uri".
+ * Limit expensive Get-Jobs for job history to 500 jobs...
*/
- ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
- cupsArrayAdd(ra, "job-id");
- cupsArrayAdd(ra, "job-uri");
+ ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "limit", 500);
+
+ if (limit)
+ ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "limit", limit);
+
+ limit = 500;
+
+ cupsdLogClient(con, CUPSD_LOG_INFO, "Limiting Get-Jobs response to %d jobs.", limit);
}
/*
@@ -6664,13 +6465,15 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
{
job = cupsdFindJob(job_ids->values[i].integer);
- cupsdLoadJob(job);
-
- if (!job->attrs)
+ if (need_load_job && !job->attrs)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d",
- job->id);
- continue;
+ cupsdLoadJob(job);
+
+ if (!job->attrs)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", job->id);
+ continue;
+ }
}
if (i > 0)
@@ -6720,13 +6523,19 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
if (job->id < first_job_id)
continue;
- cupsdLoadJob(job);
+ current_index ++;
+ if (current_index < first_index)
+ continue;
- if (!job->attrs)
+ if (need_load_job && !job->attrs)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d",
- job->id);
- continue;
+ cupsdLoadJob(job);
+
+ if (!job->attrs)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", job->id);
+ continue;
+ }
}
if (username[0] && _cups_strcasecmp(username, job->username))
@@ -6750,6 +6559,9 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
cupsArrayDelete(ra);
+ if (delete_list)
+ cupsArrayDelete(list);
+
con->response->request.status.status_code = IPP_OK;
}
@@ -6771,7 +6583,7 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_notifications(con=%p[%d])",
- con, con->http.fd);
+ con, con->number);
/*
* Get subscription attributes...
@@ -6905,7 +6717,7 @@ get_ppd(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", con,
- con->http.fd, uri, uri->name, uri->values[0].string.text);
+ con->number, uri, uri->name, uri->values[0].string.text);
if (!strcmp(uri->name, "ppd-name"))
{
@@ -7078,7 +6890,7 @@ get_ppds(cupsd_client_t *con) /* I - Client connection */
/* String for included schemes */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->http.fd);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->number);
/*
* Check policy...
@@ -7223,7 +7035,7 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -7279,7 +7091,7 @@ get_printer_supported(
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -7311,9 +7123,15 @@ get_printer_supported(
*/
ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
+ "printer-geo-location", 0);
+ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
"printer-info", 0);
ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
"printer-location", 0);
+ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
+ "printer-organization", 0);
+ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
+ "printer-organizational-unit", 0);
con->response->request.status.status_code = IPP_OK;
}
@@ -7332,7 +7150,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */
int limit; /* Max number of printers to return */
int count; /* Number of printers that match */
cupsd_printer_t *printer; /* Current printer pointer */
- int printer_type, /* printer-type attribute */
+ cups_ptype_t printer_type, /* printer-type attribute */
printer_mask; /* printer-type-mask attribute */
char *location; /* Location string */
const char *username; /* Current user */
@@ -7342,7 +7160,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", con,
- con->http.fd, type);
+ con->number, type);
/*
* Check policy...
@@ -7386,15 +7204,15 @@ get_printers(cupsd_client_t *con, /* I - Client connection */
if ((attr = ippFindAttribute(con->request, "printer-type",
IPP_TAG_ENUM)) != NULL)
- printer_type = attr->values[0].integer;
+ printer_type = (cups_ptype_t)attr->values[0].integer;
else
- printer_type = 0;
+ printer_type = (cups_ptype_t)0;
if ((attr = ippFindAttribute(con->request, "printer-type-mask",
IPP_TAG_ENUM)) != NULL)
- printer_mask = attr->values[0].integer;
+ printer_mask = (cups_ptype_t)attr->values[0].integer;
else
- printer_mask = 0;
+ printer_mask = (cups_ptype_t)0;
local = httpAddrLocalhost(&(con->clientaddr));
@@ -7488,7 +7306,7 @@ get_subscription_attrs(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"get_subscription_attrs(con=%p[%d], sub_id=%d)",
- con, con->http.fd, sub_id);
+ con, con->number, sub_id);
/*
* Is the subscription ID valid?
@@ -7569,7 +7387,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"get_subscriptions(con=%p[%d], uri=%s)",
- con, con->http.fd, uri->values[0].string.text);
+ con, con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -7730,7 +7548,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */
cupsd_job_t *job; /* Job information */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->http.fd,
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->number,
uri->values[0].string.text);
/*
@@ -7859,7 +7677,7 @@ hold_new_jobs(cupsd_client_t *con, /* I - Connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -7935,7 +7753,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */
*dprinter; /* Destination printer */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->http.fd,
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->number,
uri->values[0].string.text);
/*
@@ -8248,6 +8066,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
ipp_attribute_t *attr; /* Current attribute */
+ ipp_attribute_t *doc_name; /* document-name attribute */
ipp_attribute_t *format; /* Document-format attribute */
const char *default_format; /* document-format-default value */
cupsd_job_t *job; /* New job */
@@ -8263,7 +8082,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */
int compression; /* Document compression */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->http.fd,
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->number,
uri->values[0].string.text);
/*
@@ -8325,6 +8144,10 @@ print_job(cupsd_client_t *con, /* I - Client connection */
* Is it a format we support?
*/
+ doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME);
+ if (doc_name)
+ ippSetName(con->request, &doc_name, "document-name-supplied");
+
if ((format = ippFindAttribute(con->request, "document-format",
IPP_TAG_MIMETYPE)) != NULL)
{
@@ -8340,6 +8163,8 @@ print_job(cupsd_client_t *con, /* I - Client connection */
format->values[0].string.text);
return;
}
+
+ ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, ippGetString(format, 0, NULL));
}
else if ((default_format = cupsGetOption("document-format",
printer->num_options,
@@ -8363,8 +8188,8 @@ print_job(cupsd_client_t *con, /* I - Client connection */
* Auto-type it!
*/
- strcpy(super, "application");
- strcpy(type, "octet-stream");
+ strlcpy(super, "application", sizeof(super));
+ strlcpy(type, "octet-stream", sizeof(type));
}
if (!strcmp(super, "application") && !strcmp(type, "octet-stream"))
@@ -8373,12 +8198,9 @@ print_job(cupsd_client_t *con, /* I - Client connection */
* Auto-type the file...
*/
- ipp_attribute_t *doc_name; /* document-name attribute */
-
-
cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job ???] Auto-typing file...");
- doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME);
+
filetype = mimeFileType(MimeDatabase, con->filename,
doc_name ? doc_name->values[0].string.text : NULL,
&compression);
@@ -8388,6 +8210,9 @@ print_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_INFO, "[Job ???] Request file type is %s/%s.",
filetype->super, filetype->type);
+
+ snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type);
+ ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, mimetype);
}
else
filetype = mimeType(MimeDatabase, super, type);
@@ -8405,11 +8230,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */
filetype->type);
if (format)
- {
- _cupsStrFree(format->values[0].string.text);
-
- format->values[0].string.text = _cupsStrAlloc(mimetype);
- }
+ ippSetString(con->request, &format, 0, mimetype);
else
ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
"document-format", NULL, mimetype);
@@ -8457,8 +8278,9 @@ print_job(cupsd_client_t *con, /* I - Client connection */
cupsdUpdateQuota(printer, job->username, 0, kbytes);
- if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
- IPP_TAG_INTEGER)) != NULL)
+ job->koctets += kbytes;
+
+ if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
attr->values[0].integer += kbytes;
/*
@@ -8468,9 +8290,15 @@ print_job(cupsd_client_t *con, /* I - Client connection */
if (add_file(con, job, filetype, compression))
return;
- snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id,
- job->num_files);
- rename(con->filename, filename);
+ snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, job->num_files);
+ if (rename(con->filename, filename))
+ {
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strerror(errno));
+
+ send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file."));
+ return;
+ }
+
cupsdClearString(&con->filename);
/*
@@ -8629,12 +8457,17 @@ read_job_ticket(cupsd_client_t *con) /* I - Client connection */
if (attr->group_tag != IPP_TAG_JOB || !attr->name)
continue;
- if (!strcmp(attr->name, "job-originating-host-name") ||
- !strcmp(attr->name, "job-originating-user-name") ||
+ if (!strncmp(attr->name, "date-time-at-", 13) ||
+ !strcmp(attr->name, "job-impressions-completed") ||
!strcmp(attr->name, "job-media-sheets-completed") ||
- !strcmp(attr->name, "job-k-octets") ||
+ !strncmp(attr->name, "job-k-octets", 12) ||
!strcmp(attr->name, "job-id") ||
+ !strcmp(attr->name, "job-originating-host-name") ||
+ !strcmp(attr->name, "job-originating-user-name") ||
+ !strcmp(attr->name, "job-pages-completed") ||
+ !strcmp(attr->name, "job-printer-uri") ||
!strncmp(attr->name, "job-state", 9) ||
+ !strcmp(attr->name, "job-uri") ||
!strncmp(attr->name, "time-at-", 8))
continue; /* Read-only attrs */
@@ -8697,7 +8530,7 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -8732,7 +8565,8 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */
if ((attr = ippFindAttribute(con->request, "printer-state-message",
IPP_TAG_TEXT)) == NULL)
- strcpy(printer->state_message, "Rejecting Jobs");
+ strlcpy(printer->state_message, "Rejecting Jobs",
+ sizeof(printer->state_message));
else
strlcpy(printer->state_message, attr->values[0].string.text,
sizeof(printer->state_message));
@@ -8778,7 +8612,7 @@ release_held_new_jobs(
cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -8849,7 +8683,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -8944,10 +8778,8 @@ release_job(cupsd_client_t *con, /* I - Client connection */
if (attr)
{
- _cupsStrFree(attr->values[0].string.text);
-
- attr->value_tag = IPP_TAG_KEYWORD;
- attr->values[0].string.text = _cupsStrAlloc("no-hold");
+ ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD);
+ ippSetString(job->attrs, &attr, 0, "no-hold");
cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job,
"Job job-hold-until value changed by user.");
@@ -8987,7 +8819,7 @@ renew_subscription(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"renew_subscription(con=%p[%d], sub_id=%d)",
- con, con->http.fd, sub_id);
+ con, con->number, sub_id);
/*
* Is the subscription ID valid?
@@ -9075,7 +8907,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -9299,8 +9131,7 @@ save_auth_info(
{
if (strcmp(dest->auth_info_required[i], "negotiate"))
{
- httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text,
- strlen(auth_info->values[i].string.text));
+ httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text, (int)strlen(auth_info->values[i].string.text));
cupsFilePutConf(fp, dest->auth_info_required[i], line);
}
else
@@ -9331,15 +9162,13 @@ save_auth_info(
* Allow fallback to username+password for Kerberized queues...
*/
- httpEncode64_2(line, sizeof(line), auth_info->values[0].string.text,
- strlen(auth_info->values[0].string.text));
+ httpEncode64_2(line, sizeof(line), auth_info->values[0].string.text, (int)strlen(auth_info->values[0].string.text));
cupsFilePutConf(fp, "username", line);
cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s",
auth_info->values[0].string.text);
- httpEncode64_2(line, sizeof(line), auth_info->values[1].string.text,
- strlen(auth_info->values[1].string.text));
+ httpEncode64_2(line, sizeof(line), auth_info->values[1].string.text, (int)strlen(auth_info->values[1].string.text));
cupsFilePutConf(fp, "password", line);
cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s",
@@ -9351,7 +9180,7 @@ save_auth_info(
* Write the authenticated username...
*/
- httpEncode64_2(line, sizeof(line), con->username, strlen(con->username));
+ httpEncode64_2(line, sizeof(line), con->username, (int)strlen(con->username));
cupsFilePutConf(fp, "username", line);
cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s", con->username);
@@ -9360,7 +9189,7 @@ save_auth_info(
* Write the authenticated password...
*/
- httpEncode64_2(line, sizeof(line), con->password, strlen(con->password));
+ httpEncode64_2(line, sizeof(line), con->password, (int)strlen(con->password));
cupsFilePutConf(fp, "password", line);
cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s", con->password);
@@ -9430,7 +9259,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* See if we have a job URI or a printer URI...
@@ -9562,6 +9391,8 @@ send_document(cupsd_client_t *con, /* I - Client connection */
* Is it a format we support?
*/
+ cupsdLoadJob(job);
+
if ((format = ippFindAttribute(con->request, "document-format",
IPP_TAG_MIMETYPE)) != NULL)
{
@@ -9576,6 +9407,8 @@ send_document(cupsd_client_t *con, /* I - Client connection */
format->values[0].string.text);
return;
}
+
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, ippGetString(format, 0, NULL));
}
else if ((default_format = cupsGetOption("document-format",
printer->num_options,
@@ -9598,8 +9431,8 @@ send_document(cupsd_client_t *con, /* I - Client connection */
* No document format attribute? Auto-type it!
*/
- strcpy(super, "application");
- strcpy(type, "octet-stream");
+ strlcpy(super, "application", sizeof(super));
+ strlcpy(type, "octet-stream", sizeof(type));
}
if (!strcmp(super, "application") && !strcmp(type, "octet-stream"))
@@ -9624,6 +9457,9 @@ send_document(cupsd_client_t *con, /* I - Client connection */
if (filetype)
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Request file type is %s/%s.",
filetype->super, filetype->type);
+
+ snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type);
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, mimetype);
}
else
filetype = mimeType(MimeDatabase, super, type);
@@ -9640,11 +9476,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */
if ((jformat = ippFindAttribute(job->attrs, "document-format",
IPP_TAG_MIMETYPE)) != NULL)
- {
- _cupsStrFree(jformat->values[0].string.text);
-
- jformat->values[0].string.text = _cupsStrAlloc(mimetype);
- }
+ ippSetString(job->attrs, &jformat, 0, mimetype);
else
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
"document-format", NULL, mimetype);
@@ -9681,11 +9513,12 @@ send_document(cupsd_client_t *con, /* I - Client connection */
* Add the file to the job...
*/
- cupsdLoadJob(job);
-
if (add_file(con, job, filetype, compression))
return;
+ if ((attr = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME)) != NULL)
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL));
+
if (stat(con->filename, &fileinfo))
kbytes = 0;
else
@@ -9693,13 +9526,19 @@ send_document(cupsd_client_t *con, /* I - Client connection */
cupsdUpdateQuota(printer, job->username, 0, kbytes);
- if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
- IPP_TAG_INTEGER)) != NULL)
+ job->koctets += kbytes;
+
+ if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
attr->values[0].integer += kbytes;
- snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id,
- job->num_files);
- rename(con->filename, filename);
+ snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, job->num_files);
+ if (rename(con->filename, filename))
+ {
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strerror(errno));
+
+ send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file."));
+ return;
+ }
cupsdClearString(&con->filename);
@@ -9778,7 +9617,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */
*/
httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
- con->servername, con->serverport, "/jobs/%d", jobid);
+ con->clientname, con->clientport, "/jobs/%d", jobid);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL,
job_uri);
@@ -9818,13 +9657,13 @@ send_http_error(
uri = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI);
cupsdLogMessage(status == HTTP_FORBIDDEN ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG,
- "Returning HTTP %s for %s (%s) from %s",
- httpStatus(status),
+ "[Client %d] Returning HTTP %s for %s (%s) from %s",
+ con->number, httpStatus(status),
con->request ?
ippOpString(con->request->request.op.operation_id) :
"no operation-id",
uri ? uri->values[0].string.text : "no URI",
- con->http.hostname);
+ con->http->hostname);
if (printer)
{
@@ -9945,7 +9784,7 @@ set_default(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -10027,7 +9866,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Start with "everything is OK" status...
@@ -10135,15 +9974,18 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */
if (!strcmp(attr->name, "attributes-charset") ||
!strcmp(attr->name, "attributes-natural-language") ||
- !strcmp(attr->name, "document-compression") ||
- !strcmp(attr->name, "document-format") ||
+ !strncmp(attr->name, "date-time-at-", 13) ||
+ !strncmp(attr->name, "document-compression", 20) ||
+ !strncmp(attr->name, "document-format", 15) ||
!strcmp(attr->name, "job-detailed-status-messages") ||
!strcmp(attr->name, "job-document-access-errors") ||
!strcmp(attr->name, "job-id") ||
!strcmp(attr->name, "job-impressions-completed") ||
- !strcmp(attr->name, "job-k-octets") ||
+ !strcmp(attr->name, "job-k-octets-completed") ||
+ !strcmp(attr->name, "job-media-sheets-completed") ||
!strcmp(attr->name, "job-originating-host-name") ||
!strcmp(attr->name, "job-originating-user-name") ||
+ !strcmp(attr->name, "job-pages-completed") ||
!strcmp(attr->name, "job-printer-up-time") ||
!strcmp(attr->name, "job-printer-uri") ||
!strcmp(attr->name, "job-sheets") ||
@@ -10153,9 +9995,6 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */
!strcmp(attr->name, "number-of-documents") ||
!strcmp(attr->name, "number-of-intervening-jobs") ||
!strcmp(attr->name, "output-device-assigned") ||
- !strncmp(attr->name, "date-time-at-", 13) ||
- !strncmp(attr->name, "job-k-octets", 12) ||
- !strncmp(attr->name, "job-media-sheets", 16) ||
!strncmp(attr->name, "time-at-", 8))
{
/*
@@ -10229,9 +10068,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */
{
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d",
attr->values[0].integer);
- cupsdSetJobState(job, attr->values[0].integer,
- CUPSD_JOB_DEFAULT,
- "Job state changed by \"%s\"", username);
+ cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer, CUPSD_JOB_DEFAULT, "Job state changed by \"%s\"", username);
check_jobs = 1;
}
break;
@@ -10399,7 +10236,7 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -10437,6 +10274,24 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */
changed = 1;
}
+ if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strncmp(attr->values[0].string.text, "geo:", 4))
+ {
+ cupsdSetString(&printer->geo_location, attr->values[0].string.text);
+ changed = 1;
+ }
+
+ if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL)
+ {
+ cupsdSetString(&printer->organization, attr->values[0].string.text);
+ changed = 1;
+ }
+
+ if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL)
+ {
+ cupsdSetString(&printer->organizational_unit, attr->values[0].string.text);
+ changed = 1;
+ }
+
if ((attr = ippFindAttribute(con->request, "printer-info",
IPP_TAG_TEXT)) != NULL)
{
@@ -10450,6 +10305,8 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */
if (changed)
{
+ printer->config_time = time(NULL);
+
cupsdSetPrinterAttrs(printer);
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
@@ -10477,7 +10334,7 @@ set_printer_defaults(
{
int i; /* Looping var */
ipp_attribute_t *attr; /* Current attribute */
- int namelen; /* Length of attribute name */
+ size_t namelen; /* Length of attribute name */
char name[256], /* New attribute name */
value[256]; /* String version of integer attrs */
@@ -10652,6 +10509,7 @@ set_printer_defaults(
break;
case IPP_TAG_NAME :
+ case IPP_TAG_TEXT :
case IPP_TAG_KEYWORD :
case IPP_TAG_URI :
printer->num_options = cupsAddOption(name,
@@ -10729,7 +10587,7 @@ start_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -10811,7 +10669,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@@ -10844,7 +10702,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
if ((attr = ippFindAttribute(con->request, "printer-state-message",
IPP_TAG_TEXT)) == NULL)
- strcpy(printer->state_message, "Paused");
+ strlcpy(printer->state_message, "Paused", sizeof(printer->state_message));
else
{
strlcpy(printer->state_message, attr->values[0].string.text,
@@ -10875,7 +10733,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
static void
url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */
char *buffer,/* I - String buffer */
- int bufsize)/* I - Size of buffer */
+ size_t bufsize)/* I - Size of buffer */
{
int i; /* Looping var */
char *bufptr, /* Pointer into buffer */
@@ -10901,8 +10759,7 @@ url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */
*bufptr++ = '\'';
- bufptr = url_encode_string(attr->values[i].string.text,
- bufptr, bufend - bufptr + 1);
+ bufptr = url_encode_string(attr->values[i].string.text, bufptr, (size_t)(bufend - bufptr + 1));
if (bufptr >= bufend)
break;
@@ -10921,7 +10778,7 @@ url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */
static char * /* O - End of string */
url_encode_string(const char *s, /* I - String */
char *buffer, /* I - String buffer */
- int bufsize) /* I - Size of buffer */
+ size_t bufsize) /* I - Size of buffer */
{
char *bufptr, /* Pointer into buffer */
*bufend; /* End of buffer */
@@ -11039,8 +10896,10 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
http_status_t status; /* Policy status */
- ipp_attribute_t *attr, /* Current attribute */
- *auth_info; /* auth-info attribute */
+ ipp_attribute_t *attr; /* Current attribute */
+#ifdef HAVE_SSL
+ ipp_attribute_t *auth_info; /* auth-info attribute */
+#endif /* HAVE_SSL */
ipp_attribute_t *format, /* Document-format attribute */
*name; /* Job-name attribute */
cups_ptype_t dtype; /* Destination type (printer/class) */
@@ -11052,7 +10911,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", con,
- con->http.fd, uri->values[0].string.text);
+ con->number, uri->values[0].string.text);
/*
* OK, see if the client is sending the document compressed - CUPS
@@ -11206,7 +11065,9 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
* Check policy...
*/
+#ifdef HAVE_SSL
auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT);
+#endif /* HAVE_SSL */
if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK)
{
@@ -11221,8 +11082,8 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
return;
}
#ifdef HAVE_SSL
- else if (auth_info && !con->http.tls &&
- !httpAddrLocalhost(con->http.hostaddr))
+ else if (auth_info && !con->http->tls &&
+ !httpAddrLocalhost(con->http->hostaddr))
{
/*
* Require encryption of auth-info over non-local connections...
@@ -11276,16 +11137,12 @@ validate_user(cupsd_job_t *job, /* I - Job */
cupsd_client_t *con, /* I - Client connection */
const char *owner, /* I - Owner of job/resource */
char *username, /* O - Authenticated username */
- int userlen) /* I - Length of username */
+ size_t userlen) /* I - Length of username */
{
cupsd_printer_t *printer; /* Printer for job */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, "
- "userlen=%d)",
- job->id, con ? con->http.fd : 0,
- owner ? owner : "(null)", username, userlen);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")", job->id, con ? con->number : 0, owner ? owner : "(null)", username, CUPS_LLCAST userlen);
/*
* Validate input...
@@ -11312,5 +11169,5 @@ validate_user(cupsd_job_t *job, /* I - Job */
/*
- * End of "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp.c 12978 2015-11-17 19:29:52Z msweet $".
*/
diff --git a/scheduler/job.c b/scheduler/job.c
index d8f56b5..54ee4ed 100644
--- a/scheduler/job.c
+++ b/scheduler/job.c
@@ -1,71 +1,16 @@
/*
- * "$Id: job.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: job.c 12856 2015-08-31 14:27:39Z msweet $"
*
- * Job management routines for the CUPS scheduler.
+ * Job management routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddJob() - Add a new job to the job queue.
- * cupsdCancelJobs() - Cancel all jobs for the given
- * destination/user.
- * cupsdCheckJobs() - Check the pending jobs and start any if the
- * destination is available.
- * cupsdCleanJobs() - Clean out old jobs.
- * cupsdContinueJob() - Continue printing with the next file in a
- * job.
- * cupsdDeleteJob() - Free all memory used by a job.
- * cupsdFreeAllJobs() - Free all jobs from memory.
- * cupsdFindJob() - Find the specified job.
- * cupsdGetPrinterJobCount() - Get the number of pending, processing, or
- * held jobs in a printer or class.
- * cupsdGetUserJobCount() - Get the number of pending, processing, or
- * held jobs for a user.
- * cupsdLoadAllJobs() - Load all jobs from disk.
- * cupsdLoadJob() - Load a single job.
- * cupsdMoveJob() - Move the specified job to a different
- * destination.
- * cupsdReleaseJob() - Release the specified job.
- * cupsdRestartJob() - Restart the specified job.
- * cupsdSaveAllJobs() - Save a summary of all jobs to disk.
- * cupsdSaveJob() - Save a job to disk.
- * cupsdSetJobHoldUntil() - Set the hold time for a job.
- * cupsdSetJobPriority() - Set the priority of a job, moving it up/down
- * in the list as needed.
- * cupsdSetJobState() - Set the state of the specified print job.
- * cupsdStopAllJobs() - Stop all print jobs.
- * cupsdUnloadCompletedJobs() - Flush completed job history from memory.
- * cupsdUpdateJobs() - Update the history/file files for all jobs.
- * compare_active_jobs() - Compare the job IDs and priorities of two
- * jobs.
- * compare_jobs() - Compare the job IDs of two jobs.
- * dump_job_history() - Dump any debug messages for a job.
- * free_job_history() - Free any log history.
- * finalize_job() - Cleanup after job filter processes and
- * support data.
- * get_options() - Get a string containing the job options.
- * ipp_length() - Compute the size of the buffer needed to hold
- * the textual IPP attributes.
- * load_job_cache() - Load jobs from the job.cache file.
- * load_next_job_id() - Load the NextJobId value from the job.cache
- * file.
- * load_request_root() - Load jobs from the RequestRoot directory.
- * remove_job_files() - Remove the document files for a job.
- * remove_job_history() - Remove the control file for a job.
- * set_time() - Set one of the "time-at-xyz" attributes.
- * start_job() - Start a print job.
- * stop_job() - Stop a print job.
- * unload_job() - Unload a job from memory.
- * update_job() - Read a status update from a job's filters.
- * update_job_attrs() - Update the job-printer-* attributes.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -174,6 +119,7 @@ static mime_filter_t gziptoany_filter =
*/
static int compare_active_jobs(void *first, void *second, void *data);
+static int compare_completed_jobs(void *first, void *second, void *data);
static int compare_jobs(void *first, void *second, void *data);
static void dump_job_history(cupsd_job_t *job);
static void finalize_job(cupsd_job_t *job, int set_job_state);
@@ -267,8 +213,6 @@ cupsdCancelJobs(const char *dest, /* I - Destination to cancel */
"Job canceled by user.");
}
}
-
- cupsdCheckJobs();
}
@@ -289,10 +233,7 @@ cupsdCheckJobs(void)
curtime = time(NULL);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCheckJobs: %d active jobs, sleeping=%d, reload=%d, "
- "curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping,
- NeedReload, (long)curtime);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: %d active jobs, sleeping=%d, ac-power=%d, reload=%d, curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping, ACPower, NeedReload, (long)curtime);
for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
job;
@@ -312,8 +253,8 @@ cupsdCheckJobs(void)
if (job->kill_time && job->kill_time <= curtime)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Stopping unresponsive job.",
- job->id);
+ if (!job->completed)
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Stopping unresponsive job.");
stop_job(job, CUPSD_JOB_FORCE);
continue;
@@ -325,8 +266,15 @@ cupsdCheckJobs(void)
if (job->cancel_time && job->cancel_time <= curtime)
{
- cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT,
- "Canceling stuck job after %d seconds.", MaxJobTime);
+ int cancel_after; /* job-cancel-after value */
+
+ attr = ippFindAttribute(job->attrs, "job-cancel-after", IPP_TAG_INTEGER);
+ cancel_after = attr ? ippGetInteger(attr, 0) : MaxJobTime;
+
+ if (job->completed)
+ cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_FORCE, "Marking stuck job as completed after %d seconds.", cancel_after);
+ else
+ cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, "Canceling stuck job after %d seconds.", cancel_after);
continue;
}
@@ -379,10 +327,7 @@ cupsdCheckJobs(void)
*/
if (job->state_value == IPP_JOB_PENDING && !NeedReload &&
-#ifndef kIOPMAssertionTypeDenySystemSleep
- !Sleeping &&
-#endif /* !kIOPMAssertionTypeDenySystemSleep */
- !DoingShutdown && !job->printer)
+ (!Sleeping || ACPower) && !DoingShutdown && !job->printer)
{
printer = cupsdFindDest(job->dest);
pclass = NULL;
@@ -430,7 +375,7 @@ cupsdCheckJobs(void)
if ((attr = ippFindAttribute(job->attrs, "job-actual-printer-uri",
IPP_TAG_URI)) != NULL)
- cupsdSetString(&attr->values[0].string.text, printer->uri);
+ ippSetString(job->attrs, &attr, 0, printer->uri);
else
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI,
"job-actual-printer-uri", NULL, printer->uri);
@@ -445,7 +390,9 @@ cupsdCheckJobs(void)
* Start the job...
*/
+ cupsArraySave(ActiveJobs);
start_job(job, printer);
+ cupsArrayRestore(ActiveJobs);
}
}
}
@@ -495,6 +442,8 @@ cupsdCleanJobs(void)
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Removing document files.");
remove_job_files(job);
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+
if (job->history_time < JobHistoryUpdate || !JobHistoryUpdate)
JobHistoryUpdate = job->history_time;
}
@@ -542,6 +491,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
/* Pipes used between filters */
int envc; /* Number of environment variables */
struct stat fileinfo; /* Job file information */
+ int argc = 0; /* Number of arguments */
char **argv = NULL, /* Filter command-line arguments */
filename[1024], /* Job filename */
command[1024], /* Full path to command */
@@ -598,7 +548,6 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
memset(job->filters, 0, sizeof(job->filters));
-
if (job->printer->raw)
{
/*
@@ -614,14 +563,37 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
* Local jobs get filtered...
*/
+ mime_type_t *dst = job->printer->filetype;
+ /* Destination file type */
+
snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
job->id, job->current_file + 1);
if (stat(filename, &fileinfo))
fileinfo.st_size = 0;
- filters = mimeFilter2(MimeDatabase, job->filetypes[job->current_file],
- fileinfo.st_size, job->printer->filetype,
- &(job->cost));
+ if (job->retry_as_raster)
+ {
+ /*
+ * Need to figure out whether the printer supports image/pwg-raster or
+ * image/urf, and use the corresponding type...
+ */
+
+ char type[MIME_MAX_TYPE]; /* MIME media type for printer */
+
+ snprintf(type, sizeof(type), "%s/image/urf", job->printer->name);
+ if ((dst = mimeType(MimeDatabase, "printer", type)) == NULL)
+ {
+ snprintf(type, sizeof(type), "%s/image/pwg-raster", job->printer->name);
+ dst = mimeType(MimeDatabase, "printer", type);
+ }
+
+ if (dst)
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Retrying job as \"%s\".", strchr(dst->type, '/') + 1);
+ else
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to retry job using a supported raster format.");
+ }
+
+ filters = mimeFilter2(MimeDatabase, job->filetypes[job->current_file], (size_t)fileinfo.st_size, dst, &(job->cost));
if (!filters)
{
@@ -672,6 +644,9 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
"FINAL_CONTENT_TYPE=%s/%s", filter->dst->super,
filter->dst->type);
}
+ else
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=printer/%s", job->printer->name);
}
/*
@@ -757,9 +732,8 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
* Add decompression/raw filter as needed...
*/
- if ((!job->printer->raw && job->compressions[job->current_file]) ||
- (!filters && !job->printer->remote &&
- (job->num_files > 1 || !strncmp(job->printer->device_uri, "file:", 5))))
+ if (job->compressions[job->current_file] &&
+ (!job->printer->remote || job->num_files == 1))
{
/*
* Add gziptoany filter to the front of the list...
@@ -891,11 +865,11 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
*/
if (job->printer->remote)
- argv = calloc(7 + job->num_files, sizeof(char *));
+ argc = 6 + job->num_files;
else
- argv = calloc(8, sizeof(char *));
+ argc = 7;
- if (!argv)
+ if ((argv = calloc((size_t)argc + 1, sizeof(char *))) == NULL)
{
cupsdLogMessage(CUPSD_LOG_DEBUG, "Unable to allocate argument array - %s",
strerror(errno));
@@ -927,7 +901,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
{
snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
job->id, job->current_file + 1);
- argv[6] = filename;
+ argv[6] = strdup(filename);
}
for (i = 0; argv[i]; i ++)
@@ -941,7 +915,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
IPP_TAG_LANGUAGE);
#ifdef __APPLE__
- strcpy(apple_language, "APPLE_LANGUAGE=");
+ strlcpy(apple_language, "APPLE_LANGUAGE=", sizeof(apple_language));
_cupsAppleLanguage(attr->values[0].string.text,
apple_language + 15, sizeof(apple_language) - 15);
#endif /* __APPLE__ */
@@ -954,7 +928,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
* the POSIX locale...
*/
- strcpy(lang, "LANG=C");
+ strlcpy(lang, "LANG=C", sizeof(lang));
break;
case 2 :
@@ -1012,14 +986,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
* All of these strcpy's are safe because we allocated the psr string...
*/
- strcpy(printer_state_reasons, "PRINTER_STATE_REASONS=");
+ strlcpy(printer_state_reasons, "PRINTER_STATE_REASONS=", psrlen);
for (psrptr = printer_state_reasons + 22, i = 0;
i < job->printer->num_reasons;
i ++)
{
if (i)
*psrptr++ = ',';
- strcpy(psrptr, job->printer->reasons[i]);
+ strlcpy(psrptr, job->printer->reasons[i], psrlen - (size_t)(psrptr - printer_state_reasons));
psrptr += strlen(psrptr);
}
}
@@ -1131,9 +1105,6 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
* Now create processes for all of the filters...
*/
- cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
- "cups-insecure-filter-warning");
-
for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
filter;
i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
@@ -1229,8 +1200,13 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command,
pid);
- argv[6] = NULL;
- slot = !slot;
+ if (argv[6])
+ {
+ free(argv[6]);
+ argv[6] = NULL;
+ }
+
+ slot = !slot;
}
cupsArrayDelete(filters);
@@ -1257,7 +1233,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
else if (stat(command, &backinfo))
backroot = 0;
else
- backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO));
+ backroot = !(backinfo.st_mode & (S_IWGRP | S_IRWXO));
argv[0] = job->printer->sanitized_device_uri;
@@ -1267,7 +1243,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[1], job->side_pipes[1],
- backroot, job->profile, job, &(job->backend));
+ backroot, job->bprofile, job, &(job->backend));
if (pid == 0)
{
@@ -1314,13 +1290,12 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
cupsdClosePipe(filterfds[slot]);
- if (job->printer->remote && job->num_files > 1)
- {
- for (i = 0; i < job->num_files; i ++)
- free(argv[i + 6]);
- }
+ for (i = 6; i < argc; i ++)
+ if (argv[i])
+ free(argv[i]);
free(argv);
+
if (printer_state_reasons)
free(printer_state_reasons);
@@ -1350,13 +1325,9 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
if (argv)
{
- if (job->printer->remote && job->num_files > 1)
- {
- for (i = 0; i < job->num_files; i ++)
- free(argv[i + 6]);
- }
-
- free(argv);
+ for (i = 6; i < argc; i ++)
+ if (argv[i])
+ free(argv[i]);
}
if (printer_state_reasons)
@@ -1485,6 +1456,30 @@ cupsdFindJob(int id) /* I - Job ID */
/*
+ * 'cupsdGetCompletedJobs()'- Generate a completed jobs list.
+ */
+
+cups_array_t * /* O - Array of jobs */
+cupsdGetCompletedJobs(
+ cupsd_printer_t *p) /* I - Printer */
+{
+ cups_array_t *list; /* Array of jobs */
+ cupsd_job_t *job; /* Current job */
+
+
+ list = cupsArrayNew(compare_completed_jobs, NULL);
+
+ for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(Jobs))
+ if ((!p || !_cups_strcasecmp(p->name, job->dest)) && job->state_value >= IPP_JOB_STOPPED && job->completed_time)
+ cupsArrayAdd(list, job);
+
+ return (list);
+}
+
+
+/*
* 'cupsdGetPrinterJobCount()' - Get the number of pending, processing,
* or held jobs in a printer or class.
*/
@@ -1538,9 +1533,10 @@ void
cupsdLoadAllJobs(void)
{
char filename[1024]; /* Full filename of job.cache file */
- struct stat fileinfo, /* Information on job.cache file */
- dirinfo; /* Information on RequestRoot dir */
-
+ struct stat fileinfo; /* Information on job.cache file */
+ cups_dir_t *dir; /* RequestRoot dir */
+ cups_dentry_t *dent; /* Entry in RequestRoot */
+ int load_cache = 1; /* Load the job.cache file? */
/*
@@ -1564,36 +1560,65 @@ cupsdLoadAllJobs(void)
if (stat(filename, &fileinfo))
{
- fileinfo.st_mtime = 0;
+ /*
+ * No job.cache file...
+ */
+
+ load_cache = 0;
if (errno != ENOENT)
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to get file information for \"%s\" - %s",
filename, strerror(errno));
}
+ else if ((dir = cupsDirOpen(RequestRoot)) == NULL)
+ {
+ /*
+ * No spool directory...
+ */
- if (stat(RequestRoot, &dirinfo))
+ load_cache = 0;
+ }
+ else
{
- dirinfo.st_mtime = 0;
+ while ((dent = cupsDirRead(dir)) != NULL)
+ {
+ if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c' && dent->fileinfo.st_mtime > fileinfo.st_mtime)
+ {
+ /*
+ * Job history file is newer than job.cache file...
+ */
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to get directory information for \"%s\" - %s",
- RequestRoot, strerror(errno));
+ load_cache = 0;
+ break;
+ }
+ }
+
+ cupsDirClose(dir);
}
/*
* Load the most recent source for job data...
*/
- if (dirinfo.st_mtime > fileinfo.st_mtime)
+ if (load_cache)
{
+ /*
+ * Load the job.cache file...
+ */
+
+ load_job_cache(filename);
+ }
+ else
+ {
+ /*
+ * Load the job history files...
+ */
+
load_request_root();
load_next_job_id(filename);
}
- else
- load_job_cache(filename);
/*
* Clean out old jobs as needed...
@@ -1640,7 +1665,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
* Load job attributes...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Loading attributes...");
snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id);
if ((fp = cupsdOpenConfFile(jobfile)) == NULL)
@@ -1648,9 +1673,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to read job control file \"%s\".", job->id,
- jobfile);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to read job control file \"%s\".", jobfile);
cupsFileClose(fp);
goto error;
}
@@ -1663,18 +1687,16 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad time-at-creation attribute in "
- "control file.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Missing or bad time-at-creation attribute in control file.");
goto error;
}
if ((job->state = ippFindAttribute(job->attrs, "job-state",
IPP_TAG_ENUM)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad job-state attribute in control "
- "file.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Missing or bad job-state attribute in control file.");
goto error;
}
@@ -1682,10 +1704,13 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
job->file_time = 0;
job->history_time = 0;
- if (job->state_value >= IPP_JOB_CANCELED &&
- (attr = ippFindAttribute(job->attrs, "time-at-completed",
- IPP_TAG_INTEGER)) != NULL)
+ if ((attr = ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) != NULL)
+ job->creation_time = attr->values[0].integer;
+
+ if (job->state_value >= IPP_JOB_CANCELED && (attr = ippFindAttribute(job->attrs, "time-at-completed", IPP_TAG_INTEGER)) != NULL)
{
+ job->completed_time = attr->values[0].integer;
+
if (JobHistory < INT_MAX)
job->history_time = attr->values[0].integer + JobHistory;
else
@@ -1714,18 +1739,17 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
IPP_TAG_URI)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] No job-printer-uri attribute in control file.",
- job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "No job-printer-uri attribute in control file.");
goto error;
}
if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype),
&destptr)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to queue job for destination \"%s\".",
- job->id, attr->values[0].string.text);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to queue job for destination \"%s\".",
+ attr->values[0].string.text);
goto error;
}
@@ -1733,9 +1757,9 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
}
else if ((destptr = cupsdFindDest(job->dest)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to queue job for destination \"%s\".",
- job->id, job->dest);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to queue job for destination \"%s\".",
+ job->dest);
goto error;
}
@@ -1744,9 +1768,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
{
const char *reason; /* job-state-reason keyword */
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Job %d] Adding missing job-state-reasons attribute to "
- " control file.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Adding missing job-state-reasons attribute to control file.");
switch (job->state_value)
{
@@ -1802,18 +1825,20 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
ippSetString(job->attrs, &job->reasons, 0, "none");
}
- job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed",
- IPP_TAG_INTEGER);
- job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
+ job->impressions = ippFindAttribute(job->attrs, "job-impressions-completed", IPP_TAG_INTEGER);
+ job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed", IPP_TAG_INTEGER);
+ job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
+
+ if (!job->impressions)
+ job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", 0);
if (!job->priority)
{
if ((attr = ippFindAttribute(job->attrs, "job-priority",
IPP_TAG_INTEGER)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad job-priority attribute in "
- "control file.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Missing or bad job-priority attribute in control file.");
goto error;
}
@@ -1825,15 +1850,21 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name",
IPP_TAG_NAME)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad job-originating-user-name "
- "attribute in control file.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Missing or bad job-originating-user-name "
+ "attribute in control file.");
goto error;
}
cupsdSetString(&job->username, attr->values[0].string.text);
}
+ if (!job->name)
+ {
+ if ((attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL)
+ cupsdSetString(&job->name, attr->values[0].string.text);
+ }
+
/*
* Set the job hold-until time and state...
*/
@@ -1858,6 +1889,9 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
job->state_value = IPP_JOB_PENDING;
}
+ if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
+ job->koctets = attr->values[0].integer;
+
if (!job->num_files)
{
/*
@@ -1872,41 +1906,36 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
if (access(jobfile, 0))
break;
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Job %d] Auto-typing document file \"%s\"...", job->id,
- jobfile);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Auto-typing document file \"%s\"...", jobfile);
if (fileid > job->num_files)
{
if (job->num_files == 0)
{
- compressions = (int *)calloc(fileid, sizeof(int));
- filetypes = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *));
+ compressions = (int *)calloc((size_t)fileid, sizeof(int));
+ filetypes = (mime_type_t **)calloc((size_t)fileid, sizeof(mime_type_t *));
}
else
{
- compressions = (int *)realloc(job->compressions,
- sizeof(int) * fileid);
- filetypes = (mime_type_t **)realloc(job->filetypes,
- sizeof(mime_type_t *) *
- fileid);
+ compressions = (int *)realloc(job->compressions, sizeof(int) * (size_t)fileid);
+ filetypes = (mime_type_t **)realloc(job->filetypes, sizeof(mime_type_t *) * (size_t)fileid);
}
+ if (compressions)
+ job->compressions = compressions;
+
+ if (filetypes)
+ job->filetypes = filetypes;
+
if (!compressions || !filetypes)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Ran out of memory for job file types.",
- job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Ran out of memory for job file types.");
ippDelete(job->attrs);
job->attrs = NULL;
- if (compressions)
- free(compressions);
-
- if (filetypes)
- free(filetypes);
-
if (job->compressions)
{
free(job->compressions);
@@ -1923,9 +1952,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */
return (0);
}
- job->compressions = compressions;
- job->filetypes = filetypes;
- job->num_files = fileid;
+ job->num_files = fileid;
}
job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL,
@@ -2074,7 +2101,7 @@ cupsdMoveJob(cupsd_job_t *job, /* I - Job */
if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
IPP_TAG_URI)) != NULL)
- cupsdSetString(&(attr->values[0].string.text), p->uri);
+ ippSetString(job->attrs, &attr, 0, p->uri);
cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job,
"Job #%d moved from %s to %s.", job->id, olddest,
@@ -2170,11 +2197,18 @@ cupsdSaveAllJobs(void)
{
cupsFilePrintf(fp, "<Job %d>\n", job->id);
cupsFilePrintf(fp, "State %d\n", job->state_value);
+ cupsFilePrintf(fp, "Created %ld\n", (long)job->creation_time);
+ if (job->completed_time)
+ cupsFilePrintf(fp, "Completed %ld\n", (long)job->completed_time);
cupsFilePrintf(fp, "Priority %d\n", job->priority);
- cupsFilePrintf(fp, "HoldUntil %d\n", (int)job->hold_until);
+ if (job->hold_until)
+ cupsFilePrintf(fp, "HoldUntil %ld\n", (long)job->hold_until);
cupsFilePrintf(fp, "Username %s\n", job->username);
+ if (job->name)
+ cupsFilePutConf(fp, "Name", job->name);
cupsFilePrintf(fp, "Destination %s\n", job->dest);
cupsFilePrintf(fp, "DestType %d\n", job->dtype);
+ cupsFilePrintf(fp, "KOctets %d\n", job->koctets);
cupsFilePrintf(fp, "NumFiles %d\n", job->num_files);
for (i = 0; i < job->num_files; i ++)
cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super,
@@ -2212,8 +2246,7 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */
if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
job->attrs) != IPP_DATA)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to write job control file.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to write job control file.");
cupsFileClose(fp);
return;
}
@@ -2265,7 +2298,7 @@ cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */
attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
if (attr)
- cupsdSetString(&(attr->values[0].string.text), when);
+ ippSetString(job->attrs, &attr, 0, when);
else
attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
"job-hold-until", NULL, when);
@@ -2281,9 +2314,10 @@ cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */
cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
- ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified");
}
+ ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified");
+
/*
* Update the hold time...
*/
@@ -2519,8 +2553,8 @@ cupsdSetJobState(
if (attr)
{
- attr->value_tag = IPP_TAG_KEYWORD;
- cupsdSetString(&(attr->values[0].string.text), "no-hold");
+ ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD);
+ ippSetString(job->attrs, &attr, 0, "no-hold");
}
default :
@@ -2715,10 +2749,17 @@ cupsdStopAllJobs(
job;
job = (cupsd_job_t *)cupsArrayNext(PrintingJobs))
{
- if (kill_delay)
- job->kill_time = time(NULL) + kill_delay;
+ if (job->completed)
+ {
+ cupsdSetJobState(job, IPP_JOB_COMPLETED, CUPSD_JOB_FORCE, NULL);
+ }
+ else
+ {
+ if (kill_delay)
+ job->kill_time = time(NULL) + kill_delay;
- cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL);
+ cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL);
+ }
}
}
@@ -2829,6 +2870,28 @@ compare_active_jobs(void *first, /* I - First job */
/*
+ * 'compare_completed_jobs()' - Compare the job IDs and completion times of two jobs.
+ */
+
+static int /* O - Difference */
+compare_completed_jobs(void *first, /* I - First job */
+ void *second, /* I - Second job */
+ void *data) /* I - App data (not used) */
+{
+ int diff; /* Difference */
+
+
+ (void)data;
+
+ if ((diff = ((cupsd_job_t *)second)->completed_time -
+ ((cupsd_job_t *)first)->completed_time) != 0)
+ return (diff);
+ else
+ return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id);
+}
+
+
+/*
* 'compare_jobs()' - Compare the job IDs of two jobs.
*/
@@ -2923,7 +2986,7 @@ dump_job_history(cupsd_job_t *job) /* I - Job */
snprintf(temp, sizeof(temp), "[Job %d] printer-state-reasons=", job->id);
ptr = temp + strlen(temp);
if (printer->num_reasons == 0)
- strlcpy(ptr, "none", sizeof(temp) - (ptr - temp));
+ strlcpy(ptr, "none", sizeof(temp) - (size_t)(ptr - temp));
else
{
for (i = 0;
@@ -2933,7 +2996,7 @@ dump_job_history(cupsd_job_t *job) /* I - Job */
if (i)
*ptr++ = ',';
- strlcpy(ptr, printer->reasons[i], sizeof(temp) - (ptr - temp));
+ strlcpy(ptr, printer->reasons[i], sizeof(temp) - (size_t)(ptr - temp));
ptr += strlen(ptr);
}
}
@@ -2994,11 +3057,13 @@ finalize_job(cupsd_job_t *job, /* I - Job */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id);
/*
- * Clear the "connecting-to-device" reason, which is only valid when a printer
- * is processing, along with any remote printing job state...
+ * Clear the "connecting-to-device" and "cups-waiting-for-job-completed"
+ * reasons, which are only valid when a printer is processing, along with any
+ * remote printing job state...
*/
cupsdSetPrinterReasons(job->printer, "-connecting-to-device,"
+ "cups-waiting-for-job-completed,"
"cups-remote-pending,"
"cups-remote-pending-held,"
"cups-remote-processing,"
@@ -3022,6 +3087,8 @@ finalize_job(cupsd_job_t *job, /* I - Job */
cupsdDestroyProfile(job->profile);
job->profile = NULL;
+ cupsdDestroyProfile(job->bprofile);
+ job->bprofile = NULL;
/*
* Clear the unresponsive job watchdog timers...
@@ -3068,8 +3135,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */
job_state = IPP_JOB_COMPLETED;
message = "Job completed.";
- ippSetString(job->attrs, &job->reasons, 0,
- "job-completed-successfully");
+ if (!job->status)
+ ippSetString(job->attrs, &job->reasons, 0,
+ "job-completed-successfully");
break;
case IPP_JOB_STOPPED :
@@ -3255,13 +3323,48 @@ finalize_job(cupsd_job_t *job, /* I - Job */
* Hold the job...
*/
- cupsdSetJobHoldUntil(job, "indefinite", 1);
- ippSetString(job->attrs, &job->reasons, 0,
- "job-hold-until-specified");
+ const char *reason = ippGetString(job->reasons, 0, NULL);
- job_state = IPP_JOB_HELD;
- message = "Job held indefinitely due to backend errors; please "
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-state-reasons=\"%s\"",
+ reason);
+
+ if (!reason || strncmp(reason, "account-", 8))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 1);
+
+ ippSetString(job->attrs, &job->reasons, 0,
+ "job-hold-until-specified");
+ message = "Job held indefinitely due to backend errors; please "
"consult the error_log file for details.";
+ }
+ else if (!strcmp(reason, "account-info-needed"))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account information is "
+ "required.";
+ }
+ else if (!strcmp(reason, "account-closed"))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account has been closed.";
+ }
+ else if (!strcmp(reason, "account-limit-reached"))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account limit has been "
+ "reached.";
+ }
+ else
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account authorization failed.";
+ }
+
+ job_state = IPP_JOB_HELD;
}
break;
@@ -3295,8 +3398,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */
job_state = IPP_JOB_HELD;
message = "Job held for authentication.";
- ippSetString(job->attrs, &job->reasons, 0,
- "cups-held-for-authentication");
+ if (strncmp(job->reasons->values[0].string.text, "account-", 8))
+ ippSetString(job->attrs, &job->reasons, 0,
+ "cups-held-for-authentication");
}
break;
@@ -3422,13 +3526,6 @@ finalize_job(cupsd_job_t *job, /* I - Job */
job->printer->job = NULL;
job->printer = NULL;
-
- /*
- * Try printing another job...
- */
-
- if (printer_state != IPP_PRINTER_STOPPED)
- cupsdCheckJobs();
}
@@ -3480,19 +3577,16 @@ get_options(cupsd_job_t *job, /* I - Job */
"com.apple.print.DocumentTicket.PMSpoolFormat",
IPP_TAG_ZERO) &&
!ippFindAttribute(job->attrs, "APPrinterPreset", IPP_TAG_ZERO) &&
- (ippFindAttribute(job->attrs, "output-mode", IPP_TAG_ZERO) ||
- ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) ||
+ (ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) ||
ippFindAttribute(job->attrs, "print-quality", IPP_TAG_ZERO)))
{
/*
- * Map output-mode and print-quality to a preset...
+ * Map print-color-mode and print-quality to a preset...
*/
if ((attr = ippFindAttribute(job->attrs, "print-color-mode",
- IPP_TAG_KEYWORD)) == NULL)
- attr = ippFindAttribute(job->attrs, "output-mode", IPP_TAG_KEYWORD);
-
- if (attr && !strcmp(attr->values[0].string.text, "monochrome"))
+ IPP_TAG_KEYWORD)) != NULL &&
+ !strcmp(attr->values[0].string.text, "monochrome"))
print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME;
else
print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR;
@@ -3679,7 +3773,8 @@ get_options(cupsd_job_t *job, /* I - Job */
attr->value_tag == IPP_TAG_MIMETYPE ||
attr->value_tag == IPP_TAG_NAMELANG ||
attr->value_tag == IPP_TAG_TEXTLANG ||
- (attr->value_tag == IPP_TAG_URI && strcmp(attr->name, "job-uuid")) ||
+ (attr->value_tag == IPP_TAG_URI && strcmp(attr->name, "job-uuid") &&
+ strcmp(attr->name, "job-authorization-uri")) ||
attr->value_tag == IPP_TAG_URISCHEME ||
attr->value_tag == IPP_TAG_BEGIN_COLLECTION) /* Not yet supported */
continue;
@@ -3694,9 +3789,14 @@ get_options(cupsd_job_t *job, /* I - Job */
continue;
if (!strncmp(attr->name, "job-", 4) &&
+ strcmp(attr->name, "job-account-id") &&
+ strcmp(attr->name, "job-accounting-user-id") &&
+ strcmp(attr->name, "job-authorization-uri") &&
strcmp(attr->name, "job-billing") &&
strcmp(attr->name, "job-impressions") &&
strcmp(attr->name, "job-originating-host-name") &&
+ strcmp(attr->name, "job-password") &&
+ strcmp(attr->name, "job-password-encryption") &&
strcmp(attr->name, "job-uuid") &&
!(job->printer->type & CUPS_PRINTER_REMOTE))
continue;
@@ -3721,18 +3821,18 @@ get_options(cupsd_job_t *job, /* I - Job */
*/
if (optptr > options)
- strlcat(optptr, " ", optlength - (optptr - options));
+ strlcat(optptr, " ", optlength - (size_t)(optptr - options));
if (attr->value_tag != IPP_TAG_BOOLEAN)
{
- strlcat(optptr, attr->name, optlength - (optptr - options));
- strlcat(optptr, "=", optlength - (optptr - options));
+ strlcat(optptr, attr->name, optlength - (size_t)(optptr - options));
+ strlcat(optptr, "=", optlength - (size_t)(optptr - options));
}
for (i = 0; i < attr->num_values; i ++)
{
if (i)
- strlcat(optptr, ",", optlength - (optptr - options));
+ strlcat(optptr, ",", optlength - (size_t)(optptr - options));
optptr += strlen(optptr);
@@ -3740,30 +3840,29 @@ get_options(cupsd_job_t *job, /* I - Job */
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- snprintf(optptr, optlength - (optptr - options),
+ snprintf(optptr, optlength - (size_t)(optptr - options),
"%d", attr->values[i].integer);
break;
case IPP_TAG_BOOLEAN :
if (!attr->values[i].boolean)
- strlcat(optptr, "no", optlength - (optptr - options));
+ strlcat(optptr, "no", optlength - (size_t)(optptr - options));
- strlcat(optptr, attr->name,
- optlength - (optptr - options));
+ strlcat(optptr, attr->name, optlength - (size_t)(optptr - options));
break;
case IPP_TAG_RANGE :
if (attr->values[i].range.lower == attr->values[i].range.upper)
- snprintf(optptr, optlength - (optptr - options) - 1,
+ snprintf(optptr, optlength - (size_t)(optptr - options) - 1,
"%d", attr->values[i].range.lower);
else
- snprintf(optptr, optlength - (optptr - options) - 1,
+ snprintf(optptr, optlength - (size_t)(optptr - options) - 1,
"%d-%d", attr->values[i].range.lower,
attr->values[i].range.upper);
break;
case IPP_TAG_RESOLUTION :
- snprintf(optptr, optlength - (optptr - options) - 1,
+ snprintf(optptr, optlength - (size_t)(optptr - options) - 1,
"%dx%d%s", attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units == IPP_RES_PER_INCH ?
@@ -3803,10 +3902,10 @@ get_options(cupsd_job_t *job, /* I - Job */
for (i = num_pwgppds, pwgppd = pwgppds; i > 0; i --, pwgppd ++)
{
*optptr++ = ' ';
- strcpy(optptr, pwgppd->name);
+ strlcpy(optptr, pwgppd->name, optlength - (size_t)(optptr - options));
optptr += strlen(optptr);
*optptr++ = '=';
- strcpy(optptr, pwgppd->value);
+ strlcpy(optptr, pwgppd->value, optlength - (size_t)(optptr - options));
optptr += strlen(optptr);
}
@@ -3860,7 +3959,7 @@ ipp_length(ipp_t *ipp) /* I - IPP request */
*/
bytes ++; /* " " separator */
- bytes += attr->num_values; /* "," separators */
+ bytes += (size_t)attr->num_values; /* "," separators */
/*
* Boolean attributes appear as "foo,nofoo,foo,nofoo", while
@@ -3870,7 +3969,7 @@ ipp_length(ipp_t *ipp) /* I - IPP request */
if (attr->value_tag != IPP_TAG_BOOLEAN)
bytes += strlen(attr->name);
else
- bytes += attr->num_values * strlen(attr->name);
+ bytes += (size_t)attr->num_values * strlen(attr->name);
/*
* Now add the size required for each value in the attribute...
@@ -3884,7 +3983,7 @@ ipp_length(ipp_t *ipp) /* I - IPP request */
* Minimum value of a signed integer is -2147483647, or 11 digits.
*/
- bytes += attr->num_values * 11;
+ bytes += (size_t)attr->num_values * 11;
break;
case IPP_TAG_BOOLEAN :
@@ -3903,7 +4002,7 @@ ipp_length(ipp_t *ipp) /* I - IPP request */
* 23 characters max.
*/
- bytes += attr->num_values * 23;
+ bytes += (size_t)attr->num_values * 23;
break;
case IPP_TAG_RESOLUTION :
@@ -3912,7 +4011,7 @@ ipp_length(ipp_t *ipp) /* I - IPP request */
* suffixed by the units, or 26 characters max.
*/
- bytes += attr->num_values * 26;
+ bytes += (size_t)attr->num_values * 26;
break;
case IPP_TAG_STRING :
@@ -3988,14 +4087,13 @@ load_job_cache(const char *filename) /* I - job.cache filename */
{
if (job)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing </Job> directive on line %d.",
- linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing </Job> directive on line %d of %s.", linenum, filename);
continue;
}
if (!value)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d of %s.", linenum, filename);
continue;
}
@@ -4003,8 +4101,7 @@ load_job_cache(const char *filename) /* I - job.cache filename */
if (jobid < 1)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d.", jobid,
- linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d of %s.", jobid, linenum, filename);
continue;
}
@@ -4038,13 +4135,12 @@ load_job_cache(const char *filename) /* I - job.cache filename */
job->status_pipes[0] = -1;
job->status_pipes[1] = -1;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...",
- job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Loading from cache...");
}
else if (!job)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing <Job #> directive on line %d.", linenum);
+ "Missing <Job #> directive on line %d of %s.", linenum, filename);
continue;
}
else if (!_cups_strcasecmp(line, "</Job>"))
@@ -4053,12 +4149,20 @@ load_job_cache(const char *filename) /* I - job.cache filename */
if (job->state_value <= IPP_JOB_STOPPED && cupsdLoadJob(job))
cupsArrayAdd(ActiveJobs, job);
+ else if (job->state_value > IPP_JOB_STOPPED)
+ {
+ if (!job->completed_time || !job->creation_time || !job->name || !job->koctets)
+ {
+ cupsdLoadJob(job);
+ unload_job(job);
+ }
+ }
job = NULL;
}
else if (!value)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, filename);
continue;
}
else if (!_cups_strcasecmp(line, "State"))
@@ -4070,9 +4174,21 @@ load_job_cache(const char *filename) /* I - job.cache filename */
else if (job->state_value > IPP_JOB_COMPLETED)
job->state_value = IPP_JOB_COMPLETED;
}
+ else if (!_cups_strcasecmp(line, "Name"))
+ {
+ cupsdSetString(&(job->name), value);
+ }
+ else if (!_cups_strcasecmp(line, "Created"))
+ {
+ job->creation_time = strtol(value, NULL, 10);
+ }
+ else if (!_cups_strcasecmp(line, "Completed"))
+ {
+ job->completed_time = strtol(value, NULL, 10);
+ }
else if (!_cups_strcasecmp(line, "HoldUntil"))
{
- job->hold_until = atoi(value);
+ job->hold_until = strtol(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "Priority"))
{
@@ -4090,14 +4206,17 @@ load_job_cache(const char *filename) /* I - job.cache filename */
{
job->dtype = (cups_ptype_t)atoi(value);
}
+ else if (!_cups_strcasecmp(line, "KOctets"))
+ {
+ job->koctets = atoi(value);
+ }
else if (!_cups_strcasecmp(line, "NumFiles"))
{
job->num_files = atoi(value);
if (job->num_files < 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d.",
- job->num_files, linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d of %s.", job->num_files, linenum, filename);
job->num_files = 0;
continue;
}
@@ -4108,20 +4227,19 @@ load_job_cache(const char *filename) /* I - job.cache filename */
job->id);
if (access(jobfile, 0))
{
- cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away.",
- job->id);
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Data files have gone away.");
job->num_files = 0;
continue;
}
- job->filetypes = calloc(job->num_files, sizeof(mime_type_t *));
- job->compressions = calloc(job->num_files, sizeof(int));
+ job->filetypes = calloc((size_t)job->num_files, sizeof(mime_type_t *));
+ job->compressions = calloc((size_t)job->num_files, sizeof(int));
if (!job->filetypes || !job->compressions)
{
- cupsdLogMessage(CUPSD_LOG_EMERG,
- "[Job %d] Unable to allocate memory for %d files.",
- job->id, job->num_files);
+ cupsdLogJob(job, CUPSD_LOG_EMERG,
+ "Unable to allocate memory for %d files.",
+ job->num_files);
break;
}
}
@@ -4137,14 +4255,13 @@ load_job_cache(const char *filename) /* I - job.cache filename */
if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type,
&compression) != 4)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d of %s.", linenum, filename);
continue;
}
if (number < 1 || number > job->num_files)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d.",
- number, linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d of %s.", number, linenum, filename);
continue;
}
@@ -4159,9 +4276,9 @@ load_job_cache(const char *filename) /* I - job.cache filename */
* If the original MIME type is unknown, auto-type it!
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unknown MIME type %s/%s for file %d.",
- job->id, super, type, number + 1);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unknown MIME type %s/%s for file %d.",
+ super, type, number + 1);
snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
job->id, number + 1);
@@ -4178,8 +4295,14 @@ load_job_cache(const char *filename) /* I - job.cache filename */
}
}
else
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d.",
- line, linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d of %s.", line, linenum, filename);
+ }
+
+ if (job)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing </Job> directive on line %d of %s.", linenum, filename);
+ cupsdDeleteJob(job, CUPSD_JOB_PURGE);
}
cupsFileClose(fp);
@@ -4343,10 +4466,7 @@ remove_job_files(cupsd_job_t *job) /* I - Job */
{
snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
job->id, i);
- if (Classification)
- cupsdRemoveFile(filename);
- else
- unlink(filename);
+ cupsdUnlinkOrRemoveFile(filename);
}
free(job->filetypes);
@@ -4377,10 +4497,7 @@ remove_job_history(cupsd_job_t *job) /* I - Job */
snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot,
job->id);
- if (Classification)
- cupsdRemoveFile(filename);
- else
- unlink(filename);
+ cupsdUnlinkOrRemoveFile(filename);
LastEvent |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
}
@@ -4394,6 +4511,7 @@ static void
set_time(cupsd_job_t *job, /* I - Job to update */
const char *name) /* I - Name of attribute */
{
+ char date_name[128]; /* date-time-at-xxx */
ipp_attribute_t *attr; /* Time attribute */
time_t curtime; /* Current time */
@@ -4408,8 +4526,18 @@ set_time(cupsd_job_t *job, /* I - Job to update */
attr->values[0].integer = curtime;
}
+ snprintf(date_name, sizeof(date_name), "date-%s", name);
+
+ if ((attr = ippFindAttribute(job->attrs, date_name, IPP_TAG_ZERO)) != NULL)
+ {
+ attr->value_tag = IPP_TAG_DATE;
+ ippSetDate(job->attrs, &attr, 0, ippTimeToDate(curtime));
+ }
+
if (!strcmp(name, "time-at-completed"))
{
+ job->completed_time = curtime;
+
if (JobHistory < INT_MAX && attr)
job->history_time = attr->values[0].integer + JobHistory;
else
@@ -4440,6 +4568,13 @@ static void
start_job(cupsd_job_t *job, /* I - Job ID */
cupsd_printer_t *printer) /* I - Printer to print job */
{
+ const char *filename; /* Support filename */
+ ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
+ "job-cancel-after",
+ IPP_TAG_INTEGER);
+ /* job-cancel-after attribute */
+
+
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))",
job, job->id, printer, printer->name);
@@ -4467,7 +4602,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */
"job-printer-state-message",
IPP_TAG_TEXT);
if (job->printer_message)
- cupsdSetString(&(job->printer_message->values[0].string.text), "");
+ ippSetString(job->attrs, &job->printer_message, 0, "");
ippSetString(job->attrs, &job->reasons, 0, "job-printing");
cupsdSetJobState(job, IPP_JOB_PROCESSING, CUPSD_JOB_DEFAULT, NULL);
@@ -4488,17 +4623,39 @@ start_job(cupsd_job_t *job, /* I - Job ID */
job->printer = printer;
printer->job = job;
- if (MaxJobTime > 0)
+ if (cancel_after)
+ job->cancel_time = time(NULL) + ippGetInteger(cancel_after, 0);
+ else if (MaxJobTime > 0)
job->cancel_time = time(NULL) + MaxJobTime;
else
job->cancel_time = 0;
/*
+ * Check for support files...
+ */
+
+ cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
+ "cups-insecure-filter-warning");
+
+ if (printer->pc)
+ {
+ for (filename = (const char *)cupsArrayFirst(printer->pc->support_files);
+ filename;
+ filename = (const char *)cupsArrayNext(printer->pc->support_files))
+ {
+ if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_FILE, !RunUser,
+ cupsdLogFCMessage, printer))
+ break;
+ }
+ }
+
+ /*
* Setup the last exit status and security profiles...
*/
- job->status = 0;
- job->profile = cupsdCreateProfile(job->id);
+ job->status = 0;
+ job->profile = cupsdCreateProfile(job->id, 0);
+ job->bprofile = cupsdCreateProfile(job->id, 1);
/*
* Create the status pipes and buffer...
@@ -4515,6 +4672,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */
cupsdDestroyProfile(job->profile);
job->profile = NULL;
+ cupsdDestroyProfile(job->bprofile);
+ job->bprofile = NULL;
return;
}
@@ -4540,6 +4699,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */
cupsdDestroyProfile(job->profile);
job->profile = NULL;
+ cupsdDestroyProfile(job->bprofile);
+ job->bprofile = NULL;
return;
}
@@ -4569,6 +4730,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */
cupsdDestroyProfile(job->profile);
job->profile = NULL;
+ cupsdDestroyProfile(job->bprofile);
+ job->bprofile = NULL;
return;
}
@@ -4607,7 +4770,7 @@ stop_job(cupsd_job_t *job, /* I - Job */
FilterLevel -= job->cost;
job->cost = 0;
- if (action == CUPSD_JOB_DEFAULT && !job->kill_time)
+ if (action == CUPSD_JOB_DEFAULT && !job->kill_time && job->backend > 0)
job->kill_time = time(NULL) + JobKillDelay;
else if (action >= CUPSD_JOB_FORCE)
job->kill_time = 0;
@@ -4650,13 +4813,14 @@ unload_job(cupsd_job_t *job) /* I - Job */
if (!job->attrs)
return;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Unloading...", job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unloading...");
ippDelete(job->attrs);
job->attrs = NULL;
job->state = NULL;
job->reasons = NULL;
+ job->impressions = NULL;
job->sheets = NULL;
job->job_sheets = NULL;
job->printer_message = NULL;
@@ -4678,6 +4842,8 @@ update_job(cupsd_job_t *job) /* I - Job to check */
*ptr; /* Pointer update... */
int loglevel, /* Log level for message */
event = 0; /* Events? */
+ cupsd_printer_t *printer = job->printer;
+ /* Printer */
static const char * const levels[] = /* Log levels */
{
"NONE",
@@ -4715,6 +4881,25 @@ update_job(cupsd_job_t *job) /* I - Job to check */
cupsdLogJob(job, CUPSD_LOG_DEBUG, "PAGE: %s", message);
+ if (job->impressions)
+ {
+ if (!_cups_strncasecmp(message, "total ", 6))
+ {
+ /*
+ * Got a total count of pages from a backend or filter...
+ */
+
+ copies = atoi(message + 6);
+ copies -= ippGetInteger(job->impressions, 0); /* Just track the delta */
+ }
+ else if (!sscanf(message, "%*d%d", &copies))
+ copies = 1;
+
+ ippSetInteger(job->attrs, &job->impressions, 0, ippGetInteger(job->impressions, 0) + copies);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ }
+
if (job->sheets)
{
if (!_cups_strncasecmp(message, "total ", 6))
@@ -4724,12 +4909,14 @@ update_job(cupsd_job_t *job) /* I - Job to check */
*/
copies = atoi(message + 6);
- copies -= job->sheets->values[0].integer; /* Just track the delta */
+ copies -= ippGetInteger(job->sheets, 0); /* Just track the delta */
}
else if (!sscanf(message, "%*d%d", &copies))
copies = 1;
- job->sheets->values[0].integer += copies;
+ ippSetInteger(job->attrs, &job->sheets, 0, ippGetInteger(job->sheets, 0) + copies);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
if (job->printer->page_limit)
cupsdUpdateQuota(job->printer, job->username, copies, 0);
@@ -4738,8 +4925,21 @@ update_job(cupsd_job_t *job) /* I - Job to check */
cupsdLogPage(job, message);
if (job->sheets)
- cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
- "Printed %d page(s).", job->sheets->values[0].integer);
+ cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", ippGetInteger(job->sheets, 0));
+ }
+ else if (loglevel == CUPSD_LOG_JOBSTATE)
+ {
+ /*
+ * Support "keyword" to set job-state-reasons to the specified keyword.
+ * This is sufficient for the current paid printing stuff.
+ */
+
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "JOBSTATE: %s", message);
+
+ if (!strcmp(message, "cups-retry-as-raster"))
+ job->retry_as_raster = 1;
+ else
+ ippSetString(job->attrs, &job->reasons, 0, message);
}
else if (loglevel == CUPSD_LOG_STATE)
{
@@ -4754,7 +4954,7 @@ update_job(cupsd_job_t *job) /* I - Job to check */
{
event |= CUPSD_EVENT_PRINTER_STATE;
- if (MaxJobTime > 0 && strstr(message, "connecting-to-device") != NULL)
+ if (MaxJobTime > 0)
{
/*
* Reset cancel time after connecting to the device...
@@ -4765,7 +4965,17 @@ update_job(cupsd_job_t *job) /* I - Job to check */
break;
if (i >= job->printer->num_reasons)
- job->cancel_time = time(NULL) + MaxJobTime;
+ {
+ ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
+ "job-cancel-after",
+ IPP_TAG_INTEGER);
+ /* job-cancel-after attribute */
+
+ if (cancel_after)
+ job->cancel_time = time(NULL) + ippGetInteger(cancel_after, 0);
+ else
+ job->cancel_time = time(NULL) + MaxJobTime;
+ }
}
}
@@ -4781,11 +4991,21 @@ update_job(cupsd_job_t *job) /* I - Job to check */
cups_option_t *attrs; /* Attributes */
const char *attr; /* Attribute */
-
cupsdLogJob(job, CUPSD_LOG_DEBUG, "ATTR: %s", message);
num_attrs = cupsParseOptions(message, 0, &attrs);
+ if ((attr = cupsGetOption("auth-info-default", num_attrs,
+ attrs)) != NULL)
+ {
+ job->printer->num_options = cupsAddOption("auth-info", attr,
+ job->printer->num_options,
+ &(job->printer->options));
+ cupsdSetPrinterAttrs(job->printer);
+
+ cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
+ }
+
if ((attr = cupsGetOption("auth-info-required", num_attrs,
attrs)) != NULL)
{
@@ -4997,10 +5217,11 @@ update_job(cupsd_job_t *job) /* I - Job to check */
finalize_job(job, 1);
/*
- * Check for new jobs...
+ * Try printing another job...
*/
- cupsdCheckJobs();
+ if (printer->state != IPP_PRINTER_STOPPED)
+ cupsdCheckJobs();
}
}
@@ -5045,15 +5266,14 @@ update_job_attrs(cupsd_job_t *job, /* I - Job to update */
if (job->state_value != IPP_JOB_PROCESSING &&
job->status_level == CUPSD_LOG_INFO)
{
- cupsdSetString(&(job->printer_message->values[0].string.text), "");
+ ippSetString(job->attrs, &job->printer_message, 0, "");
job->dirty = 1;
cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
else if (job->printer->state_message[0] && do_message)
{
- cupsdSetString(&(job->printer_message->values[0].string.text),
- job->printer->state_message);
+ ippSetString(job->attrs, &job->printer_message, 0, job->printer->state_message);
job->dirty = 1;
cupsdMarkDirty(CUPSD_DIRTY_JOBS);
@@ -5121,5 +5341,5 @@ update_job_attrs(cupsd_job_t *job, /* I - Job to update */
/*
- * End of "$Id: job.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: job.c 12856 2015-08-31 14:27:39Z msweet $".
*/
diff --git a/scheduler/job.h b/scheduler/job.h
index 6fb5ab8..2e3edc8 100644
--- a/scheduler/job.h
+++ b/scheduler/job.h
@@ -1,16 +1,16 @@
/*
- * "$Id: job.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: job.h 12668 2015-05-27 19:30:32Z msweet $"
*
- * Print job definitions for the CUPS scheduler.
+ * Print job definitions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -39,14 +39,19 @@ struct cupsd_job_s /**** Job request ****/
* waiting on files */
char *username; /* Printing user */
char *dest; /* Destination printer or class */
+ char *name; /* Job name/title */
+ int koctets; /* job-k-octets */
cups_ptype_t dtype; /* Destination type */
cupsd_printer_t *printer; /* Printer this job is assigned to */
int num_files; /* Number of files in job */
mime_type_t **filetypes; /* File types */
int *compressions; /* Compression status of each file */
- ipp_attribute_t *sheets; /* job-media-sheets-completed */
+ ipp_attribute_t *impressions, /* job-impressions-completed */
+ *sheets; /* job-media-sheets-completed */
time_t access_time, /* Last access time */
cancel_time, /* When to cancel/send SIGTERM */
+ creation_time, /* When job was created */
+ completed_time, /* When job was completed (0 if not) */
file_time, /* Job file retain time */
history_time, /* Job history retain time */
hold_until, /* Hold expiration date/time */
@@ -74,10 +79,13 @@ struct cupsd_job_s /**** Job request ****/
int backend; /* Backend process ID */
int status; /* Status code from filters */
int tries; /* Number of tries for this job */
+ int completed; /* cups-waiting-for-job-completed seen */
+ int retry_as_raster;/* Need to retry the job as raster */
char *auth_env[3], /* AUTH_xxx environment variables,
* if any */
*auth_uid; /* AUTH_UID environment variable */
- void *profile; /* Security profile */
+ void *profile, /* Security profile for filters */
+ *bprofile; /* Security profile for backend */
cups_array_t *history; /* Debug log history */
int progress; /* Printing progress */
int num_keywords; /* Number of PPD keywords */
@@ -145,6 +153,7 @@ extern void cupsdDeleteJob(cupsd_job_t *job,
cupsd_jobaction_t action);
extern cupsd_job_t *cupsdFindJob(int id);
extern void cupsdFreeAllJobs(void);
+extern cups_array_t *cupsdGetCompletedJobs(cupsd_printer_t *p);
extern int cupsdGetPrinterJobCount(const char *dest);
extern int cupsdGetUserJobCount(const char *username);
extern void cupsdLoadAllJobs(void);
@@ -171,5 +180,5 @@ extern void cupsdUpdateJobs(void);
/*
- * End of "$Id: job.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: job.h 12668 2015-05-27 19:30:32Z msweet $".
*/
diff --git a/scheduler/listen.c b/scheduler/listen.c
index a4c19c0..9fcc631 100644
--- a/scheduler/listen.c
+++ b/scheduler/listen.c
@@ -1,24 +1,16 @@
/*
- * "$Id: listen.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: listen.c 12178 2014-09-30 18:56:48Z msweet $"
*
- * Server listening routines for the CUPS scheduler.
+ * Server listening routines for the CUPS scheduler.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdDeleteAllListeners() - Delete all listeners.
- * cupsdPauseListening() - Clear input polling on all listening sockets...
- * cupsdResumeListening() - Set input polling on all listening sockets...
- * cupsdStartListening() - Create all listening sockets...
- * cupsdStopListening() - Close all listening sockets...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -51,10 +43,19 @@ cupsdDeleteAllListeners(void)
for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
lis;
lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
- free(lis);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ if (!lis->on_demand)
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+ {
+ cupsArrayRemove(Listeners, lis);
+ free(lis);
+ }
- cupsArrayDelete(Listeners);
- Listeners = NULL;
+ if (cupsArrayCount(Listeners) == 0)
+ {
+ cupsArrayDelete(Listeners);
+ Listeners = NULL;
+ }
}
@@ -123,9 +124,7 @@ cupsdResumeListening(void)
void
cupsdStartListening(void)
{
- int status; /* Bind result */
- int p, /* Port number */
- val; /* Parameter value */
+ int p; /* Port number */
cupsd_listener_t *lis; /* Current listening socket */
char s[256]; /* String addresss */
const char *have_domain; /* Have a domain socket? */
@@ -151,7 +150,7 @@ cupsdStartListening(void)
lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
{
httpAddrString(&(lis->address), s, sizeof(s));
- p = _httpAddrPort(&(lis->address));
+ p = httpAddrPort(&(lis->address));
/*
* If needed, create a socket for listening...
@@ -163,7 +162,7 @@ cupsdStartListening(void)
* Create a socket for listening...
*/
- lis->fd = socket(lis->address.addr.sa_family, SOCK_STREAM, 0);
+ lis->fd = httpAddrListen(&(lis->address), p);
if (lis->fd == -1)
{
@@ -186,132 +185,15 @@ cupsdStartListening(void)
continue;
}
-
- /*
- * Set things up to reuse the local address for this port.
- */
-
- val = 1;
-#ifdef __sun
- setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
-#else
- setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
-#endif /* __sun */
-
- /*
- * Bind to the port we found...
- */
-
-#ifdef AF_INET6
- if (lis->address.addr.sa_family == AF_INET6)
- {
-# ifdef IPV6_V6ONLY
- /*
- * Accept only IPv6 connections on this socket, to avoid
- * potential security issues and to make all platforms behave
- * the same.
- */
-
- val = 1;
-# ifdef __sun
- setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&val, sizeof(val));
-# else
- setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
-# endif /* __sun */
-# endif /* IPV6_V6ONLY */
-
- status = bind(lis->fd, (struct sockaddr *)&(lis->address),
- httpAddrLength(&(lis->address)));
- }
- else
-#endif /* AF_INET6 */
-#ifdef AF_LOCAL
- if (lis->address.addr.sa_family == AF_LOCAL)
- {
- mode_t mask; /* Umask setting */
-
-
- /*
- * Remove any existing domain socket file...
- */
-
- unlink(lis->address.un.sun_path);
-
- /*
- * Save the current umask and set it to 0 so that all users can access
- * the domain socket...
- */
-
- mask = umask(0);
-
- /*
- * Bind the domain socket...
- */
-
- status = bind(lis->fd, (struct sockaddr *)&(lis->address),
- httpAddrLength(&(lis->address)));
-
- /*
- * Restore the umask...
- */
-
- umask(mask);
- }
- else
-#endif /* AF_LOCAL */
- status = bind(lis->fd, (struct sockaddr *)&(lis->address),
- sizeof(lis->address.ipv4));
-
- if (status < 0)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to bind socket for address %s:%d - %s.",
- s, p, strerror(errno));
- close(lis->fd);
- lis->fd = -1;
-
- if (FatalErrors & CUPSD_FATAL_LISTEN)
- cupsdEndProcess(getpid(), 0);
-
- continue;
- }
-
- /*
- * Listen for new clients.
- */
-
- if (listen(lis->fd, ListenBackLog) < 0)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to listen for clients on address %s:%d - %s.",
- s, p, strerror(errno));
-
- close(lis->fd);
- lis->fd = -1;
-
- if (FatalErrors & CUPSD_FATAL_LISTEN)
- cupsdEndProcess(getpid(), 0);
-
- continue;
- }
}
- fcntl(lis->fd, F_SETFD, fcntl(lis->fd, F_GETFD) | FD_CLOEXEC);
-
if (p)
cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d on fd %d...",
s, p, lis->fd);
else
- {
cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s on fd %d...",
s, lis->fd);
- if (chmod(s, 0140777))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to change permisssions on domain socket "
- "\"%s\" - %s", s, strerror(errno));
- }
-
/*
* Save the first port that is bound to the local loopback or
* "any" address...
@@ -339,7 +221,7 @@ cupsdStartListening(void)
{
cupsdLogMessage(CUPSD_LOG_EMERG,
"No Listen or Port lines were found to allow access via "
- "localhost!");
+ "localhost.");
if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_LISTEN))
cupsdEndProcess(getpid(), 0);
@@ -401,31 +283,24 @@ cupsdStopListening(void)
lis;
lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
{
- if (lis->fd != -1)
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ if (!lis->on_demand && lis->fd != -1)
{
-#ifdef WIN32
- closesocket(lis->fd);
-#else
- close(lis->fd);
-#endif /* WIN32 */
-
-#ifdef AF_LOCAL
- /*
- * Remove domain sockets...
- */
+ httpAddrClose(&(lis->address), lis->fd);
+ lis->fd = -1;
+ }
-# ifdef HAVE_LAUNCH_H
- if (lis->address.addr.sa_family == AF_LOCAL && !Launchd)
-# else
- if (lis->address.addr.sa_family == AF_LOCAL)
-# endif /* HAVE_LAUNCH_H */
- unlink(lis->address.un.sun_path);
-#endif /* AF_LOCAL */
+#else
+ if (lis->fd != -1)
+ {
+ httpAddrClose(&(lis->address), lis->fd);
+ lis->fd = -1;
}
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
}
}
/*
- * End of "$Id: listen.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: listen.c 12178 2014-09-30 18:56:48Z msweet $".
*/
diff --git a/scheduler/log.c b/scheduler/log.c
index d739b58..55e8036 100644
--- a/scheduler/log.c
+++ b/scheduler/log.c
@@ -1,28 +1,16 @@
/*
- * "$Id: log.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: log.c 12928 2015-10-23 21:31:58Z msweet $"
*
- * Log file routines for the CUPS scheduler.
+ * Log file routines for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdCheckLogFile() - Open/rotate a log file if it needs it.
- * cupsdGetDateTime() - Returns a pointer to a date/time string.
- * cupsdLogGSSMessage() - Log a GSSAPI error...
- * cupsdLogJob() - Log a job message.
- * cupsdLogMessage() - Log a message to the error log file.
- * cupsdLogPage() - Log a page to the page log file.
- * cupsdLogRequest() - Log an HTTP request in Common Log Format.
- * cupsdWriteErrorLog() - Write a line to the ErrorLog.
- * format_log_line() - Format a line for a log file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -31,18 +19,68 @@
#include "cupsd.h"
#include <stdarg.h>
+#ifdef HAVE_ASL_H
+# include <asl.h>
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+# define SD_JOURNAL_SUPPRESS_LOCATION
+# include <systemd/sd-journal.h>
+#endif /* HAVE_ASL_H */
#include <syslog.h>
/*
+ * Constants for log keys from PWG 5110.3 (PWG Common Log Format)...
+ */
+
+#define PWG_DeviceUUID "DUU"
+#define PWG_Event "E"
+#define PWG_LogNaturalLanguage "NL"
+#define PWG_Status "S"
+#define PWG_ServiceURI "URI"
+#define PWG_UserHost "UH"
+#define PWG_UserName "UN"
+#define PWG_UserURI "UU"
+#define PWG_ServiceIsAcceptingJobs "IAJ"
+#define PWG_ServiceState "ST"
+#define PWG_ServiceStateReasons "SR"
+#define PWG_ServiceUUID "SUU"
+#define PWG_JobID "JID"
+#define PWG_JobUUID "JUU"
+#define PWG_JobImagesCompleted "JIM"
+#define PWG_JobImpressionsCompleted "JIC"
+#define PWG_JobDestinationURI "JD"
+#define PWG_JobState "JS"
+#define PWG_JobStateReasons "JR"
+#define PWG_JobAccountingID "JA"
+#define PWG_JobAcountingUserName "JAUN"
+#define PWG_JobAccountingUserURI "JAUU"
+
+
+/*
* Local globals...
*/
-static int log_linesize = 0; /* Size of line for output file */
+static _cups_mutex_t log_mutex = _CUPS_MUTEX_INITIALIZER;
+ /* Mutex for logging */
+static size_t log_linesize = 0; /* Size of line for output file */
static char *log_line = NULL; /* Line for output file */
-#ifdef HAVE_VSYSLOG
-static const int syslevels[] = /* SYSLOG levels... */
+#ifdef HAVE_ASL_H
+static const int log_levels[] = /* ASL levels... */
+ {
+ ASL_LEVEL_EMERG,
+ ASL_LEVEL_EMERG,
+ ASL_LEVEL_ALERT,
+ ASL_LEVEL_CRIT,
+ ASL_LEVEL_ERR,
+ ASL_LEVEL_WARNING,
+ ASL_LEVEL_NOTICE,
+ ASL_LEVEL_INFO,
+ ASL_LEVEL_DEBUG,
+ ASL_LEVEL_DEBUG
+ };
+#elif defined(HAVE_VSYSLOG) || defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+static const int log_levels[] = /* SYSLOG levels... */
{
0,
LOG_EMERG,
@@ -55,7 +93,7 @@ static const int syslevels[] = /* SYSLOG levels... */
LOG_DEBUG,
LOG_DEBUG
};
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
/*
@@ -87,6 +125,16 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
return (1);
/*
+ * Handle logging to stderr...
+ */
+
+ if (!strcmp(logname, "stderr"))
+ {
+ *lf = LogStderr;
+ return (1);
+ }
+
+ /*
* Format the filename as needed...
*/
@@ -124,7 +172,7 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
* Insert the server name...
*/
- strlcpy(ptr, ServerName, sizeof(filename) - (ptr - filename));
+ strlcpy(ptr, ServerName, sizeof(filename) - (size_t)(ptr - filename));
ptr += strlen(ptr);
}
else
@@ -165,23 +213,34 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
* the log file permissions as a basis...
*/
- int log_dir_perm = 0300 | LogFilePerm;
+ mode_t log_dir_perm = (mode_t)(0300 | LogFilePerm);
/* LogFilePerm + owner write/search */
if (log_dir_perm & 0040)
log_dir_perm |= 0010; /* Add group search */
if (log_dir_perm & 0004)
log_dir_perm |= 0001; /* Add other search */
- cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group,
- 1, -1);
+ cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group, 1, -1);
*lf = cupsFileOpen(filename, "a");
}
if (*lf == NULL)
{
- syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+ asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+
+#else
+ syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
if (FatalErrors & CUPSD_FATAL_LOG)
cupsdEndProcess(getpid(), 0);
@@ -214,7 +273,7 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
cupsFileClose(*lf);
- strcpy(backname, filename);
+ strlcpy(backname, filename, sizeof(backname));
strlcat(backname, ".O", sizeof(backname));
unlink(backname);
@@ -222,8 +281,20 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
if ((*lf = cupsFileOpen(filename, "a")) == NULL)
{
- syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
- strerror(errno));
+#ifdef HAVE_ASL_H
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+ asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+
+#else
+ syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
if (FatalErrors & CUPSD_FATAL_LOG)
cupsdEndProcess(getpid(), 0);
@@ -382,8 +453,8 @@ cupsdLogFCMessage(
int /* O - 1 on success, 0 on error */
cupsdLogGSSMessage(
int level, /* I - Log level */
- int major_status, /* I - Major GSSAPI status */
- int minor_status, /* I - Minor GSSAPI status */
+ OM_uint32 major_status, /* I - Major GSSAPI status */
+ OM_uint32 minor_status, /* I - Minor GSSAPI status */
const char *message, /* I - printf-style message string */
...) /* I - Additional args as needed */
{
@@ -437,6 +508,61 @@ cupsdLogGSSMessage(
/*
+ * 'cupsdLogClient()' - Log a client message.
+ */
+
+int /* O - 1 on success, 0 on error */
+cupsdLogClient(cupsd_client_t *con, /* I - Client connection */
+ int level, /* I - Log level */
+ const char *message, /* I - Printf-style message string */
+ ...) /* I - Additional arguments as needed */
+{
+ va_list ap, ap2; /* Argument pointers */
+ char clientmsg[1024];/* Format string for client message */
+ int status; /* Formatting status */
+
+
+ /*
+ * See if we want to log this message...
+ */
+
+ if (TestConfigFile || !ErrorLog)
+ return (1);
+
+ if (level > LogLevel)
+ return (1);
+
+ /*
+ * Format and write the log message...
+ */
+
+ if (con)
+ snprintf(clientmsg, sizeof(clientmsg), "[Client %d] %s", con->number,
+ message);
+ else
+ strlcpy(clientmsg, message, sizeof(clientmsg));
+
+ va_start(ap, message);
+
+ do
+ {
+ va_copy(ap2, ap);
+ status = format_log_line(clientmsg, ap2);
+ va_end(ap2);
+ }
+ while (status == 0);
+
+ va_end(ap);
+
+ if (status > 0)
+ return (cupsdWriteErrorLog(level, log_line));
+ else
+ return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
+ "Unable to allocate memory for log line."));
+}
+
+
+/*
* 'cupsdLogJob()' - Log a job message.
*/
@@ -463,6 +589,96 @@ cupsdLogJob(cupsd_job_t *job, /* I - Job */
LogDebugHistory <= 0)
return (1);
+#ifdef HAVE_ASL_H
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ asl_object_t m; /* Log message */
+ char job_id[32], /* job-id string */
+ completed[32]; /* job-impressions-completed string */
+ cupsd_printer_t *printer = job ? (job->printer ? job->printer : (job->dest ? cupsdFindDest(job->dest) : NULL)) : NULL;
+ static const char * const job_states[] =
+ { /* job-state strings */
+ "Pending",
+ "PendingHeld",
+ "Processing",
+ "ProcessingStopped",
+ "Canceled",
+ "Aborted",
+ "Completed"
+ };
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ if (printer)
+ asl_set(m, PWG_ServiceURI, printer->uri);
+ if (job)
+ {
+ snprintf(job_id, sizeof(job_id), "%d", job->id);
+
+ asl_set(m, PWG_Event, "JobStateChanged");
+ asl_set(m, PWG_JobID, job_id);
+ asl_set(m, PWG_JobState, job->state_value < IPP_JSTATE_PENDING ? "" : job_states[job->state_value - IPP_JSTATE_PENDING]);
+
+ if (job->impressions)
+ {
+ snprintf(completed, sizeof(completed), "%d", ippGetInteger(job->impressions, 0));
+ asl_set(m, PWG_JobImpressionsCompleted, completed);
+ }
+ }
+
+ va_start(ap, message);
+ asl_vlog(NULL, m, log_levels[level], message, ap);
+ va_end(ap);
+
+ asl_release(m);
+ return (1);
+ }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ cupsd_printer_t *printer = job ? (job->printer ? job->printer : (job->dest ? cupsdFindDest(job->dest) : NULL)) : NULL;
+ static const char * const job_states[] =
+ { /* job-state strings */
+ "Pending",
+ "PendingHeld",
+ "Processing",
+ "ProcessingStopped",
+ "Canceled",
+ "Aborted",
+ "Completed"
+ };
+
+ va_start(ap, message);
+
+ do
+ {
+ va_copy(ap2, ap);
+ status = format_log_line(message, ap2);
+ va_end(ap2);
+ }
+ while (status == 0);
+
+ va_end(ap);
+
+ if (job)
+ sd_journal_send("MESSAGE=%s", log_line,
+ "PRIORITY=%i", log_levels[level],
+ PWG_Event"=JobStateChanged",
+ PWG_ServiceURI"=%s", printer ? printer->uri : "",
+ PWG_JobID"=%d", job->id,
+ PWG_JobState"=%s", job->state_value < IPP_JSTATE_PENDING ? "" : job_states[job->state_value - IPP_JSTATE_PENDING],
+ PWG_JobImpressionsCompleted"=%d", ippGetInteger(job->impressions, 0),
+ NULL);
+ else
+ sd_journal_send("MESSAGE=%s", log_line,
+ "PRIORITY=%i", log_levels[level],
+ NULL);
+
+ return (1);
+ }
+#endif /* HAVE_ASL_H */
+
/*
* Format and write the log message...
*/
@@ -496,12 +712,13 @@ cupsdLogJob(cupsd_job_t *job, /* I - Job */
*/
cupsd_joblog_t *temp; /* Copy of log message */
+ size_t log_len = strlen(log_line);
+ /* Length of log message */
-
- if ((temp = malloc(sizeof(cupsd_joblog_t) + strlen(log_line))) != NULL)
+ if ((temp = malloc(sizeof(cupsd_joblog_t) + log_len)) != NULL)
{
temp->time = time(NULL);
- strcpy(temp->message, log_line);
+ memcpy(temp->message, log_line, log_len + 1);
}
if (!job->history)
@@ -535,7 +752,7 @@ cupsdLogJob(cupsd_job_t *job, /* I - Job */
}
else
return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
- "Unable to allocate memory for log line!"));
+ "Unable to allocate memory for log line."));
}
@@ -559,12 +776,26 @@ cupsdLogMessage(int level, /* I - Log level */
if ((TestConfigFile || !ErrorLog) && level <= CUPSD_LOG_WARN)
{
va_start(ap, message);
-#ifdef HAVE_VSYSLOG
- vsyslog(LOG_LPR | syslevels[level], message, ap);
+
+#ifdef HAVE_ASL_H
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_vlog(NULL, m, log_levels[level], message, ap);
+ asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_printv(log_levels[level], message, ap);
+
+#elif defined(HAVE_VSYSLOG)
+ vsyslog(LOG_LPR | log_levels[level], message, ap);
+
#else
vfprintf(stderr, message, ap);
putc('\n', stderr);
#endif /* HAVE_VSYSLOG */
+
va_end(ap);
return (1);
@@ -573,6 +804,32 @@ cupsdLogMessage(int level, /* I - Log level */
if (level > LogLevel || !ErrorLog)
return (1);
+#ifdef HAVE_ASL_H
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+
+ va_start(ap, message);
+ asl_vlog(NULL, m, log_levels[level], message, ap);
+ va_end(ap);
+
+ asl_release(m);
+ return (1);
+ }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ va_start(ap, message);
+ sd_journal_printv(log_levels[level], message, ap);
+ va_end(ap);
+ return (1);
+ }
+#endif /* HAVE_ASL_H */
+
/*
* Format and write the log message...
*/
@@ -623,7 +880,7 @@ cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
if (!PageLogFormat)
return (1);
- strcpy(number, "1");
+ strlcpy(number, "1", sizeof(number));
copies = 1;
sscanf(page, "%255s%d", number, &copies);
@@ -641,53 +898,68 @@ cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
break;
case 'p' : /* Printer name */
- strlcpy(bufptr, job->printer->name,
- sizeof(buffer) - (bufptr - buffer));
+ strlcpy(bufptr, job->dest, sizeof(buffer) - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
break;
case 'j' : /* Job ID */
- snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", job->id);
+ snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", job->id);
bufptr += strlen(bufptr);
break;
case 'u' : /* Username */
- strlcpy(bufptr, job->username ? job->username : "-",
- sizeof(buffer) - (bufptr - buffer));
+ strlcpy(bufptr, job->username ? job->username : "-", sizeof(buffer) - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
break;
case 'T' : /* Date and time */
- strlcpy(bufptr, cupsdGetDateTime(NULL, LogTimeFormat),
- sizeof(buffer) - (bufptr - buffer));
+ strlcpy(bufptr, cupsdGetDateTime(NULL, LogTimeFormat), sizeof(buffer) - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
break;
case 'P' : /* Page number */
- strlcpy(bufptr, number, sizeof(buffer) - (bufptr - buffer));
+ strlcpy(bufptr, number, sizeof(buffer) - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
break;
case 'C' : /* Number of copies */
- snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", copies);
+ snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", copies);
bufptr += strlen(bufptr);
break;
case '{' : /* {attribute} */
- if ((nameend = strchr(format, '}')) != NULL &&
- (nameend - format - 2) < (sizeof(name) - 1))
+ if ((nameend = strchr(format, '}')) != NULL && (size_t)(nameend - format - 2) < (sizeof(name) - 1))
{
/*
* Pull the name from inside the brackets...
*/
- memcpy(name, format + 1, nameend - format - 1);
+ memcpy(name, format + 1, (size_t)(nameend - format - 1));
name[nameend - format - 1] = '\0';
format = nameend;
- if ((attr = ippFindAttribute(job->attrs, name,
- IPP_TAG_ZERO)) != NULL)
+ attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO);
+ if (!attr && !strcmp(name, "job-billing"))
+ {
+ /*
+ * Handle alias "job-account-id" (which was standardized after
+ * "job-billing" was defined for CUPS...
+ */
+
+ attr = ippFindAttribute(job->attrs, "job-account-id", IPP_TAG_ZERO);
+ }
+ else if (!attr && !strcmp(name, "media"))
+ {
+ /*
+ * Handle alias "media-col" which uses dimensions instead of
+ * names...
+ */
+
+ attr = ippFindAttribute(job->attrs, "media-col/media-size", IPP_TAG_BEGIN_COLLECTION);
+ }
+
+ if (attr)
{
/*
* Add the attribute value...
@@ -705,14 +977,12 @@ cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- snprintf(bufptr, sizeof(buffer) - (bufptr - buffer),
- "%d", attr->values[i].integer);
+ snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", attr->values[i].integer);
bufptr += strlen(bufptr);
break;
case IPP_TAG_BOOLEAN :
- snprintf(bufptr, sizeof(buffer) - (bufptr - buffer),
- "%d", attr->values[i].boolean);
+ snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", attr->values[i].boolean);
bufptr += strlen(bufptr);
break;
@@ -726,14 +996,28 @@ cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
case IPP_TAG_CHARSET :
case IPP_TAG_LANGUAGE :
case IPP_TAG_MIMETYPE :
- strlcpy(bufptr, attr->values[i].string.text,
- sizeof(buffer) - (bufptr - buffer));
+ strlcpy(bufptr, attr->values[i].string.text, sizeof(buffer) - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
break;
+ case IPP_TAG_BEGIN_COLLECTION :
+ if (!strcmp(attr->name, "media-size"))
+ {
+ ipp_attribute_t *x_dimension = ippFindAttribute(ippGetCollection(attr, 0), "x-dimension", IPP_TAG_INTEGER);
+ ipp_attribute_t *y_dimension = ippFindAttribute(ippGetCollection(attr, 0), "y-dimension", IPP_TAG_INTEGER);
+ /* Media dimensions */
+
+ if (x_dimension && y_dimension)
+ {
+ pwg_media_t *pwg = pwgMediaForSize(ippGetInteger(x_dimension, 0), ippGetInteger(y_dimension, 0));
+ /* PWG media name */
+ strlcpy(bufptr, pwg->pwg, sizeof(buffer) - (size_t)(bufptr - buffer));
+ break;
+ }
+ }
+
default :
- strlcpy(bufptr, "???",
- sizeof(buffer) - (bufptr - buffer));
+ strlcpy(bufptr, "???", sizeof(buffer) - (size_t)(bufptr - buffer));
bufptr += strlen(bufptr);
break;
}
@@ -759,7 +1043,70 @@ cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
*bufptr = '\0';
-#ifdef HAVE_VSYSLOG
+#ifdef HAVE_ASL_H
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ asl_object_t m; /* Log message */
+ char job_id[32], /* job-id string */
+ completed[32]; /* job-impressions-completed string */
+ static const char * const job_states[] =
+ { /* job-state strings */
+ "Pending",
+ "PendingHeld",
+ "Processing",
+ "ProcessingStopped",
+ "Canceled",
+ "Aborted",
+ "Completed"
+ };
+
+ snprintf(job_id, sizeof(job_id), "%d", job->id);
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_set(m, PWG_Event, "JobStateChanged");
+ asl_set(m, PWG_ServiceURI, job->printer->uri);
+ asl_set(m, PWG_JobID, job_id);
+ asl_set(m, PWG_JobState, job_states[job->state_value - IPP_JSTATE_PENDING]);
+
+ if (job->impressions)
+ {
+ snprintf(completed, sizeof(completed), "%d", ippGetInteger(job->impressions, 0));
+ asl_set(m, PWG_JobImpressionsCompleted, completed);
+ }
+
+ asl_log(NULL, m, ASL_LEVEL_INFO, "%s", buffer);
+
+ asl_release(m);
+ return (1);
+ }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ static const char * const job_states[] =
+ { /* job-state strings */
+ "Pending",
+ "PendingHeld",
+ "Processing",
+ "ProcessingStopped",
+ "Canceled",
+ "Aborted",
+ "Completed"
+ };
+
+ sd_journal_send("MESSAGE=%s", buffer,
+ "PRIORITY=%i", LOG_INFO,
+ PWG_Event"=JobStateChanged",
+ PWG_ServiceURI"=%s", job->printer->uri,
+ PWG_JobID"=%d", job->id,
+ PWG_JobState"=%s", job_states[job->state_value - IPP_JSTATE_PENDING],
+ PWG_JobImpressionsCompleted"=%d", ippGetInteger(job->impressions, 0),
+ NULL);
+ return (1);
+ }
+
+#elif defined(HAVE_VSYSLOG)
/*
* See if we are logging pages via syslog...
*/
@@ -770,7 +1117,7 @@ cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
return (1);
}
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
/*
* Not using syslog; check the log file...
@@ -825,7 +1172,9 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */
* Filter requests as needed...
*/
- if (AccessLogLevel < CUPSD_ACCESSLOG_ALL)
+ if (AccessLogLevel == CUPSD_ACCESSLOG_NONE)
+ return (1);
+ else if (AccessLogLevel < CUPSD_ACCESSLOG_ALL)
{
/*
* Eliminate simple GET, POST, and PUT requests...
@@ -929,7 +1278,36 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */
}
}
-#ifdef HAVE_VSYSLOG
+#ifdef HAVE_ASL_H
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+
+ asl_log(NULL, m, ASL_LEVEL_INFO, "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
+ con->http->hostname, con->username[0] != '\0' ? con->username : "-",
+ states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)),
+ con->http->version / 100, con->http->version % 100,
+ code, CUPS_LLCAST con->bytes,
+ con->request ?
+ ippOpString(con->request->request.op.operation_id) : "-",
+ con->response ?
+ ippErrorString(con->response->request.status.status_code) : "-");
+
+ asl_release(m);
+ return (1);
+ }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ sd_journal_print(LOG_INFO, "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s", con->http->hostname, con->username[0] != '\0' ? con->username : "-", states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)), con->http->version / 100, con->http->version % 100, code, CUPS_LLCAST con->bytes, con->request ? ippOpString(con->request->request.op.operation_id) : "-", con->response ? ippErrorString(con->response->request.status.status_code) : "-");
+ return (1);
+ }
+
+#elif defined(HAVE_VSYSLOG)
/*
* See if we are logging accesses via syslog...
*/
@@ -938,9 +1316,9 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */
{
syslog(LOG_INFO,
"REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
- con->http.hostname, con->username[0] != '\0' ? con->username : "-",
+ con->http->hostname, con->username[0] != '\0' ? con->username : "-",
states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)),
- con->http.version / 100, con->http.version % 100,
+ con->http->version / 100, con->http->version % 100,
code, CUPS_LLCAST con->bytes,
con->request ?
ippOpString(con->request->request.op.operation_id) : "-",
@@ -949,7 +1327,7 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */
return (1);
}
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
/*
* Not using syslog; check the log file...
@@ -964,12 +1342,12 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */
cupsFilePrintf(AccessFile,
"%s - %s %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
- con->http.hostname,
+ con->http->hostname,
con->username[0] != '\0' ? con->username : "-",
cupsdGetDateTime(&(con->start), LogTimeFormat),
states[con->operation],
_httpEncodeURI(temp, con->uri, sizeof(temp)),
- con->http.version / 100, con->http.version % 100,
+ con->http->version / 100, con->http->version % 100,
code, CUPS_LLCAST con->bytes,
con->request ?
ippOpString(con->request->request.op.operation_id) : "-",
@@ -991,6 +1369,7 @@ int /* O - 1 on success, 0 on failure */
cupsdWriteErrorLog(int level, /* I - Log level */
const char *message) /* I - Message string */
{
+ int ret = 1; /* Return value */
static const char levels[] = /* Log levels... */
{
' ',
@@ -1006,34 +1385,62 @@ cupsdWriteErrorLog(int level, /* I - Log level */
};
-#ifdef HAVE_VSYSLOG
+#ifdef HAVE_ASL_H
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_INFO, "%s", message);
+
+ asl_release(m);
+ return (1);
+ }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ if (!strcmp(ErrorLog, "syslog"))
+ {
+ sd_journal_print(log_levels[level], "%s", message);
+ return (1);
+ }
+
+#elif defined(HAVE_VSYSLOG)
/*
* See if we are logging errors via syslog...
*/
if (!strcmp(ErrorLog, "syslog"))
{
- syslog(syslevels[level], "%s", message);
+ syslog(log_levels[level], "%s", message);
return (1);
}
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
/*
* Not using syslog; check the log file...
*/
+ _cupsMutexLock(&log_mutex);
+
if (!cupsdCheckLogFile(&ErrorFile, ErrorLog))
- return (0);
+ {
+ ret = 0;
+ }
+ else
+ {
+ /*
+ * Write the log message...
+ */
- /*
- * Write the log message...
- */
+ cupsFilePrintf(ErrorFile, "%c %s %s\n", levels[level],
+ cupsdGetDateTime(NULL, LogTimeFormat), message);
+ cupsFileFlush(ErrorFile);
+ }
- cupsFilePrintf(ErrorFile, "%c %s %s\n", levels[level],
- cupsdGetDateTime(NULL, LogTimeFormat), message);
- cupsFileFlush(ErrorFile);
+ _cupsMutexUnlock(&log_mutex);
- return (1);
+ return (ret);
}
@@ -1049,7 +1456,7 @@ static int /* O - -1 for fatal, 0 for retry, 1 for success */
format_log_line(const char *message, /* I - Printf-style format string */
va_list ap) /* I - Argument list */
{
- int len; /* Length of formatted line */
+ ssize_t len; /* Length of formatted line */
/*
@@ -1069,17 +1476,16 @@ format_log_line(const char *message, /* I - Printf-style format string */
* Format the log message...
*/
- len = vsnprintf(log_line, log_linesize, message, ap);
+ len = _cups_safe_vsnprintf(log_line, log_linesize, message, ap);
/*
* Resize the buffer as needed...
*/
- if (len >= log_linesize && log_linesize < 65536)
+ if ((size_t)len >= log_linesize && log_linesize < 65536)
{
char *temp; /* Temporary string pointer */
-
len ++;
if (len < 8192)
@@ -1087,12 +1493,12 @@ format_log_line(const char *message, /* I - Printf-style format string */
else if (len > 65536)
len = 65536;
- temp = realloc(log_line, len);
+ temp = realloc(log_line, (size_t)len);
if (temp)
{
log_line = temp;
- log_linesize = len;
+ log_linesize = (size_t)len;
return (0);
}
@@ -1103,5 +1509,5 @@ format_log_line(const char *message, /* I - Printf-style format string */
/*
- * End of "$Id: log.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: log.c 12928 2015-10-23 21:31:58Z msweet $".
*/
diff --git a/scheduler/main.c b/scheduler/main.c
index 11eae52..b1aa503 100644
--- a/scheduler/main.c
+++ b/scheduler/main.c
@@ -1,39 +1,16 @@
/*
- * "$Id: main.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: main.c 12700 2015-06-08 18:32:35Z msweet $"
*
- * Main loop for the CUPS scheduler.
+ * Main loop for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for the CUPS scheduler.
- * cupsdAddString() - Copy and add a string to an array.
- * cupsdCheckProcess() - Tell the main loop to check for dead children.
- * cupsdClearString() - Clear a string.
- * cupsdFreeStrings() - Free an array of strings.
- * cupsdHoldSignals() - Hold child and termination signals.
- * cupsdReleaseSignals() - Release signals for delivery.
- * cupsdSetString() - Set a string value.
- * cupsdSetStringf() - Set a formatted string value.
- * launchd_checkin() - Check-in with launchd and collect the listening
- * fds.
- * launchd_checkout() - Update the launchd KeepAlive file as needed.
- * parent_handler() - Catch USR1/CHLD signals...
- * process_children() - Process all dead children...
- * select_timeout() - Calculate the select timeout value.
- * sigchld_handler() - Handle 'child' signals from old processes.
- * sighup_handler() - Handle 'hangup' signals to reconfigure the
- * scheduler.
- * sigterm_handler() - Handle 'terminate' signals that stop the scheduler.
- * usage() - Show scheduler usage.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -43,6 +20,12 @@
#define _MAIN_C_
#include "cupsd.h"
#include <sys/resource.h>
+#ifdef HAVE_ASL_H
+# include <asl.h>
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+# define SD_JOURNAL_SUPPRESS_LOCATION
+# include <systemd/sd-journal.h>
+#endif /* HAVE_ASL_H */
#include <syslog.h>
#include <grp.h>
@@ -51,17 +34,18 @@
# include <libgen.h>
# define CUPS_KEEPALIVE CUPS_CACHEDIR "/org.cups.cupsd"
/* Name of the launchd KeepAlive file */
-# ifndef LAUNCH_JOBKEY_KEEPALIVE
-# define LAUNCH_JOBKEY_KEEPALIVE "KeepAlive"
-# endif /* !LAUNCH_JOBKEY_KEEPALIVE */
-# ifndef LAUNCH_JOBKEY_PATHSTATE
-# define LAUNCH_JOBKEY_PATHSTATE "PathState"
-# endif /* !LAUNCH_JOBKEY_PATHSTATE */
-# ifndef LAUNCH_JOBKEY_SERVICEIPC
-# define LAUNCH_JOBKEY_SERVICEIPC "ServiceIPC"
-# endif /* !LAUNCH_JOBKEY_SERVICEIPC */
+# ifdef HAVE_LAUNCH_ACTIVATE_SOCKET
+/* Update when we have a public header we can include */
+extern int launch_activate_socket(const char *name, int **fds, size_t *cnt);
+# endif /* HAVE_LAUNCH_ACTIVATE_SOCKET */
#endif /* HAVE_LAUNCH_H */
+#ifdef HAVE_SYSTEMD
+# include <systemd/sd-daemon.h>
+# define CUPS_KEEPALIVE CUPS_CACHEDIR "/org.cups.cupsd"
+ /* Name of the systemd path file */
+#endif /* HAVE_SYSTEMD */
+
#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
# include <malloc.h>
#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
@@ -70,6 +54,10 @@
# include <notify.h>
#endif /* HAVE_NOTIFY_H */
+#ifdef HAVE_DBUS
+# include <dbus/dbus.h>
+#endif /* HAVE_DBUS */
+
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */
@@ -79,16 +67,16 @@
* Local functions...
*/
-#ifdef HAVE_LAUNCHD
-static void launchd_checkin(void);
-static void launchd_checkout(void);
-#endif /* HAVE_LAUNCHD */
static void parent_handler(int sig);
static void process_children(void);
static void sigchld_handler(int sig);
static void sighup_handler(int sig);
static void sigterm_handler(int sig);
static long select_timeout(int fds);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+static void service_checkin(void);
+static void service_checkout(void);
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
static void usage(int status) __attribute__((noreturn));
@@ -118,7 +106,11 @@ main(int argc, /* I - Number of command-line args */
{
int i; /* Looping var */
char *opt; /* Option character */
- int fg; /* Run in the foreground */
+ int close_all = 1, /* Close all file descriptors? */
+ disconnect = 1, /* Disconnect from controlling terminal? */
+ fg = 0, /* Run in foreground? */
+ run_as_child = 0;
+ /* Running as child process? */
int fds; /* Number of ready descriptors */
cupsd_client_t *con; /* Current client */
cupsd_job_t *job; /* Current job */
@@ -134,22 +126,15 @@ main(int argc, /* I - Number of command-line args */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
-#ifdef __sgi
- cups_file_t *fp; /* Fake lpsched lock file */
- struct stat statbuf; /* Needed for checking lpsched FIFO */
-#endif /* __sgi */
- int run_as_child = 0;
- /* Needed for background fork/exec */
#ifdef __APPLE__
- int use_sysman = !getuid();
- /* Use system management functions? */
+ int use_sysman = 1; /* Use system management functions? */
#else
time_t netif_time = 0; /* Time since last network update */
#endif /* __APPLE__ */
-#if HAVE_LAUNCHD
- int launchd_idle_exit;
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ int service_idle_exit;
/* Idle exit on select timeout? */
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
#ifdef HAVE_GETEUID
@@ -159,7 +144,7 @@ main(int argc, /* I - Number of command-line args */
if (getuid() != geteuid())
{
- fputs("cupsd: Cannot run as a setuid program\n", stderr);
+ fputs("cupsd: Cannot run as a setuid program.\n", stderr);
return (1);
}
#endif /* HAVE_GETEUID */
@@ -173,8 +158,10 @@ main(int argc, /* I - Number of command-line args */
#ifdef HAVE_LAUNCHD
if (getenv("CUPSD_LAUNCHD"))
{
- Launchd = 1;
- fg = 1;
+ OnDemand = 1;
+ fg = 1;
+ close_all = 0;
+ disconnect = 0;
}
#endif /* HAVE_LAUNCHD */
@@ -185,7 +172,8 @@ main(int argc, /* I - Number of command-line args */
{
case 'C' : /* Run as child with config file */
run_as_child = 1;
- fg = -1;
+ fg = 1;
+ close_all = 0;
case 'c' : /* Configuration file */
i ++;
@@ -240,26 +228,33 @@ main(int argc, /* I - Number of command-line args */
break;
case 'f' : /* Run in foreground... */
- fg = 1;
+ fg = 1;
+ disconnect = 0;
+ close_all = 0;
break;
case 'F' : /* Run in foreground, but disconnect from terminal... */
- fg = -1;
+ fg = 1;
+ close_all = 0;
break;
case 'h' : /* Show usage/help */
usage(0);
break;
- case 'l' : /* Started by launchd... */
-#ifdef HAVE_LAUNCHD
- Launchd = 1;
- fg = 1;
+ case 'l' : /* Started by launchd/systemd... */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ OnDemand = 1;
+ fg = 1;
+ close_all = 0;
+ disconnect = 0;
#else
- _cupsLangPuts(stderr, _("cupsd: launchd(8) support not compiled "
+ _cupsLangPuts(stderr, _("cupsd: On-demand support not compiled "
"in, running in normal mode."));
- fg = 0;
-#endif /* HAVE_LAUNCHD */
+ fg = 0;
+ disconnect = 1;
+ close_all = 1;
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
break;
case 'p' : /* Stop immediately for profiling */
@@ -267,12 +262,13 @@ main(int argc, /* I - Number of command-line args */
"use only!\n", stderr);
stop_scheduler = 1;
fg = 1;
+ disconnect = 0;
+ close_all = 0;
break;
case 'P' : /* Disable security profiles */
- fputs("cupsd: -P (disable security profiles) is for internal "
- "testing use only!\n", stderr);
- UseProfiles = 0;
+ fputs("cupsd: -P (disable sandboxing) is for internal testing use only.\n", stderr);
+ UseSandboxing = 0;
break;
case 's' : /* Set cups-files.conf location */
@@ -309,6 +305,8 @@ main(int argc, /* I - Number of command-line args */
case 't' : /* Test the cupsd.conf file... */
TestConfigFile = 1;
fg = 1;
+ disconnect = 0;
+ close_all = 0;
break;
default : /* Unknown option */
@@ -325,10 +323,7 @@ main(int argc, /* I - Number of command-line args */
}
if (!ConfigurationFile)
- {
cupsdSetString(&ConfigurationFile, CUPS_SERVERROOT "/cupsd.conf");
- cupsdSetString(&CupsFilesFile, CUPS_SERVERROOT "/cups-files.conf");
- }
if (!CupsFilesFile)
{
@@ -354,13 +349,64 @@ main(int argc, /* I - Number of command-line args */
return (1);
}
- strlcpy(slash, "/cups-files.conf", len - (slash - filename));
+ strlcpy(slash, "/cups-files.conf", len - (size_t)(slash - filename));
cupsdSetString(&CupsFilesFile, filename);
free(filename);
}
+ if (disconnect)
+ {
+ /*
+ * Make sure we aren't tying up any filesystems...
+ */
+
+ chdir("/");
+
+ /*
+ * Disconnect from the controlling terminal...
+ */
+
+ setsid();
+ }
+
+ if (close_all)
+ {
+ /*
+ * Close all open files...
+ */
+
+ getrlimit(RLIMIT_NOFILE, &limit);
+
+ for (i = 0; i < (int)limit.rlim_cur && i < 1024; i ++)
+ close(i);
+
+ /*
+ * Redirect stdin/out/err to /dev/null...
+ */
+
+ if ((i = open("/dev/null", O_RDONLY)) != 0)
+ {
+ dup2(i, 0);
+ close(i);
+ }
+
+ if ((i = open("/dev/null", O_WRONLY)) != 1)
+ {
+ dup2(i, 1);
+ close(i);
+ }
+
+ if ((i = open("/dev/null", O_WRONLY)) != 2)
+ {
+ dup2(i, 2);
+ close(i);
+ }
+ }
+ else
+ LogStderr = cupsFileStderr();
+
/*
- * If the user hasn't specified "-f", run in the background...
+ * Run in the background as needed...
*/
if (!fg)
@@ -435,74 +481,17 @@ main(int argc, /* I - Number of command-line args */
#endif /* __OpenBSD__ && OpenBSD < 201211 */
/*
- * Since CoreFoundation and DBUS both create fork-unsafe data on execution of
- * a program, and since this kind of really unfriendly behavior seems to be
- * more common these days in system libraries, we need to re-execute the
- * background cupsd with the "-C" option to avoid problems. Unfortunately,
- * we also have to assume that argv[0] contains the name of the cupsd
- * executable - there is no portable way to get the real pathname...
+ * Since many system libraries create fork-unsafe data on execution of a
+ * program, we need to re-execute the background cupsd with the "-C" and "-s"
+ * options to avoid problems. Unfortunately, we also have to assume that
+ * argv[0] contains the name of the cupsd executable - there is no portable
+ * way to get the real pathname...
*/
- execlp(argv[0], argv[0], "-C", ConfigurationFile, (char *)0);
+ execlp(argv[0], argv[0], "-C", ConfigurationFile, "-s", CupsFilesFile, (char *)0);
exit(errno);
}
- if (fg < 1)
- {
- /*
- * Make sure we aren't tying up any filesystems...
- */
-
- chdir("/");
-
-#ifndef DEBUG
- /*
- * Disable core dumps...
- */
-
- getrlimit(RLIMIT_CORE, &limit);
- limit.rlim_cur = 0;
- setrlimit(RLIMIT_CORE, &limit);
-
- /*
- * Disconnect from the controlling terminal...
- */
-
- setsid();
-
- /*
- * Close all open files...
- */
-
- getrlimit(RLIMIT_NOFILE, &limit);
-
- for (i = 0; i < limit.rlim_cur && i < 1024; i ++)
- close(i);
-
- /*
- * Redirect stdin/out/err to /dev/null...
- */
-
- if ((i = open("/dev/null", O_RDONLY)) != 0)
- {
- dup2(i, 0);
- close(i);
- }
-
- if ((i = open("/dev/null", O_WRONLY)) != 1)
- {
- dup2(i, 1);
- close(i);
- }
-
- if ((i = open("/dev/null", O_WRONLY)) != 2)
- {
- dup2(i, 2);
- close(i);
- }
-#endif /* DEBUG */
- }
-
/*
* Set the timezone info...
*/
@@ -513,6 +502,14 @@ main(int argc, /* I - Number of command-line args */
setlocale(LC_TIME, "");
#endif /* LC_TIME */
+#ifdef HAVE_DBUS_THREADS_INIT
+ /*
+ * Enable threading support for D-BUS...
+ */
+
+ dbus_threads_init_default();
+#endif /* HAVE_DBUS_THREADS_INIT */
+
/*
* Set the maximum number of files...
*/
@@ -531,7 +528,7 @@ main(int argc, /* I - Number of command-line args */
#endif /* RLIM_INFINITY */
MaxFDs = limit.rlim_max;
- limit.rlim_cur = MaxFDs;
+ limit.rlim_cur = (rlim_t)MaxFDs;
setrlimit(RLIMIT_NOFILE, &limit);
@@ -559,17 +556,18 @@ main(int argc, /* I - Number of command-line args */
cupsdCleanFiles(CacheDir, "*.ipp");
-#if HAVE_LAUNCHD
- if (Launchd)
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ if (OnDemand)
{
/*
- * If we were started by launchd get the listen sockets file descriptors...
+ * If we were started on demand by launchd or systemd get the listen sockets
+ * file descriptors...
*/
- launchd_checkin();
- launchd_checkout();
+ service_checkin();
+ service_checkout();
}
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
/*
* Startup the server...
@@ -618,28 +616,6 @@ main(int argc, /* I - Number of command-line args */
signal(SIGTERM, sigterm_handler);
#endif /* HAVE_SIGSET */
-#ifdef __sgi
- /*
- * Try to create a fake lpsched lock file if one is not already there.
- * Some Adobe applications need it under IRIX in order to enable
- * printing...
- */
-
- if ((fp = cupsFileOpen("/var/spool/lp/SCHEDLOCK", "w")) == NULL)
- {
- syslog(LOG_LPR, "Unable to create fake lpsched lock file "
- "\"/var/spool/lp/SCHEDLOCK\"\' - %s!",
- strerror(errno));
- }
- else
- {
- fchmod(cupsFileNumber(fp), 0644);
- fchown(cupsFileNumber(fp), User, Group);
-
- cupsFileClose(fp);
- }
-#endif /* __sgi */
-
/*
* Initialize authentication certificates...
*/
@@ -678,18 +654,15 @@ main(int argc, /* I - Number of command-line args */
* Send server-started event...
*/
-#ifdef HAVE_LAUNCHD
- if (Launchd)
- cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL,
- "Scheduler started via launchd.");
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+ if (OnDemand)
+ cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started on demand.");
else
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
if (fg)
- cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL,
- "Scheduler started in foreground.");
+ cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in foreground.");
else
- cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL,
- "Scheduler started in background.");
+ cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in background.");
/*
* Start any pending print jobs...
@@ -732,10 +705,10 @@ main(int argc, /* I - Number of command-line args */
for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
con;
con = (cupsd_client_t *)cupsArrayNext(Clients))
- if (con->http.state == HTTP_WAITING)
+ if (httpGetState(con->http) == HTTP_WAITING)
cupsdCloseClient(con);
else
- con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+ con->http->keep_alive = HTTP_KEEPALIVE_OFF;
cupsdPauseListening();
}
@@ -763,23 +736,21 @@ main(int argc, /* I - Number of command-line args */
if (!cupsdReadConfiguration())
{
- syslog(LOG_LPR, "Unable to read configuration file \'%s\' - exiting!",
- ConfigurationFile);
- break;
- }
-
-#if HAVE_LAUNCHD
- if (Launchd)
- {
- /*
- * If we were started by launchd, get the listen socket file
- * descriptors...
- */
+#ifdef HAVE_ASL_H
+ asl_object_t m; /* Log message */
+
+ m = asl_new(ASL_TYPE_MSG);
+ asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+ asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to read configuration file \"%s\" - exiting.", ConfigurationFile);
+ asl_release(m);
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+ sd_journal_print(LOG_ERR, "Unable to read configuration file \"%s\" - exiting.", ConfigurationFile);
+#else
+ syslog(LOG_LPR, "Unable to read configuration file \'%s\' - exiting.", ConfigurationFile);
+#endif /* HAVE_ASL_H */
- launchd_checkin();
- launchd_checkout();
+ break;
}
-#endif /* HAVE_LAUNCHD */
/*
* Startup the server...
@@ -810,23 +781,26 @@ main(int argc, /* I - Number of command-line args */
if ((timeout = select_timeout(fds)) > 1 && LastEvent)
timeout = 1;
-#if HAVE_LAUNCHD
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
/*
* If no other work is scheduled and we're being controlled by
* launchd then timeout after 'LaunchdTimeout' seconds of
* inactivity...
*/
- if (timeout == 86400 && Launchd && LaunchdTimeout &&
+ if (timeout == 86400 && OnDemand && IdleExitTimeout &&
!cupsArrayCount(ActiveJobs) &&
+# ifdef HAVE_SYSTEMD
+ !WebInterface &&
+# endif /* HAVE_SYSTEMD */
(!Browsing || !BrowseLocalProtocols || !cupsArrayCount(Printers)))
{
- timeout = LaunchdTimeout;
- launchd_idle_exit = 1;
+ timeout = IdleExitTimeout;
+ service_idle_exit = 1;
}
else
- launchd_idle_exit = 0;
-#endif /* HAVE_LAUNCHD */
+ service_idle_exit = 0;
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
if ((fds = cupsdDoSelect(timeout)) < 0)
{
@@ -854,7 +828,7 @@ main(int argc, /* I - Number of command-line args */
i ++, con = (cupsd_client_t *)cupsArrayNext(Clients))
cupsdLogMessage(CUPSD_LOG_EMERG,
"Clients[%d] = %d, file = %d, state = %d",
- i, con->http.fd, con->file, con->http.state);
+ i, con->number, con->file, httpGetState(con->http));
for (i = 0, lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
lis;
@@ -923,13 +897,13 @@ main(int argc, /* I - Number of command-line args */
}
#endif /* !__APPLE__ */
-#if HAVE_LAUNCHD
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
/*
* If no other work was scheduled and we're being controlled by launchd
* then timeout after 'LaunchdTimeout' seconds of inactivity...
*/
- if (!fds && launchd_idle_exit)
+ if (!fds && service_idle_exit)
{
cupsdLogMessage(CUPSD_LOG_INFO,
"Printer sharing is off and there are no jobs pending, "
@@ -937,7 +911,7 @@ main(int argc, /* I - Number of command-line args */
stop_scheduler = 1;
break;
}
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
/*
* Resume listening for new connections as needed...
@@ -991,7 +965,7 @@ main(int argc, /* I - Number of command-line args */
* Process pending data in the input buffer...
*/
- if (con->http.used)
+ if (httpGetReady(con->http))
{
cupsdReadClient(con);
continue;
@@ -1002,11 +976,9 @@ main(int argc, /* I - Number of command-line args */
*/
activity = current_time - Timeout;
- if (con->http.activity < activity && !con->pipe_pid)
+ if (httpGetActivity(con->http) < activity && !con->pipe_pid)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Closing client %d after %d seconds of inactivity...",
- con->http.fd, Timeout);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Closing client %d after %d seconds of inactivity.", con->number, Timeout);
cupsdCloseClient(con);
continue;
@@ -1143,14 +1115,14 @@ main(int argc, /* I - Number of command-line args */
cupsdStopServer();
-#ifdef HAVE_LAUNCHD
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
/*
- * Update the launchd KeepAlive file as needed...
+ * Update the keep-alive file as needed...
*/
- if (Launchd)
- launchd_checkout();
-#endif /* HAVE_LAUNCHD */
+ if (OnDemand)
+ service_checkout();
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
/*
* Stop all jobs...
@@ -1167,18 +1139,6 @@ main(int argc, /* I - Number of command-line args */
cupsdStopSystemMonitor();
#endif /* __APPLE__ */
-#ifdef __sgi
- /*
- * Remove the fake IRIX lpsched lock file, but only if the existing
- * file is not a FIFO which indicates that the real IRIX lpsched is
- * running...
- */
-
- if (!stat("/var/spool/lp/FIFO", &statbuf))
- if (!S_ISFIFO(statbuf.st_mode))
- unlink("/var/spool/lp/SCHEDLOCK");
-#endif /* __sgi */
-
cupsdStopSelect();
return (!stop_scheduler);
@@ -1196,8 +1156,8 @@ cupsdAddString(cups_array_t **a, /* IO - String array */
if (!*a)
*a = cupsArrayNew3((cups_array_func_t)strcmp, NULL,
(cups_ahash_func_t)NULL, 0,
- (cups_acopy_func_t)_cupsStrAlloc,
- (cups_afree_func_t)_cupsStrFree);
+ (cups_acopy_func_t)strdup,
+ (cups_afree_func_t)free);
return (cupsArrayAdd(*a, (char *)s));
}
@@ -1227,7 +1187,7 @@ cupsdClearString(char **s) /* O - String value */
{
if (s && *s)
{
- _cupsStrFree(*s);
+ free(*s);
*s = NULL;
}
}
@@ -1308,10 +1268,10 @@ cupsdSetString(char **s, /* O - New string */
return;
if (*s)
- _cupsStrFree(*s);
+ free(*s);
if (v)
- *s = _cupsStrAlloc(v);
+ *s = strdup(v);
else
*s = NULL;
}
@@ -1342,207 +1302,16 @@ cupsdSetStringf(char **s, /* O - New string */
vsnprintf(v, sizeof(v), f, ap);
va_end(ap);
- *s = _cupsStrAlloc(v);
+ *s = strdup(v);
}
else
*s = NULL;
if (olds)
- _cupsStrFree(olds);
+ free(olds);
}
-#ifdef HAVE_LAUNCHD
-/*
- * 'launchd_checkin()' - Check-in with launchd and collect the listening fds.
- */
-
-static void
-launchd_checkin(void)
-{
- size_t i, /* Looping var */
- count; /* Number of listeners */
- launch_data_t ld_msg, /* Launch data message */
- ld_resp, /* Launch data response */
- ld_array, /* Launch data array */
- ld_sockets, /* Launch data sockets dictionary */
- tmp; /* Launch data */
- cupsd_listener_t *lis; /* Listeners array */
- http_addr_t addr; /* Address variable */
- socklen_t addrlen; /* Length of address */
- int fd; /* File descriptor */
- char s[256]; /* String addresss */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "launchd_checkin: pid=%d", (int)getpid());
-
- /*
- * Check-in with launchd...
- */
-
- ld_msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
- if ((ld_resp = launch_msg(ld_msg)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "launchd_checkin: launch_msg(\"" LAUNCH_KEY_CHECKIN
- "\") IPC failure");
- exit(EXIT_FAILURE);
- return; /* anti-compiler-warning */
- }
-
- if (launch_data_get_type(ld_resp) == LAUNCH_DATA_ERRNO)
- {
- errno = launch_data_get_errno(ld_resp);
- cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_checkin: Check-in failed: %s",
- strerror(errno));
- exit(EXIT_FAILURE);
- return; /* anti-compiler-warning */
- }
-
- /*
- * Get the sockets dictionary...
- */
-
- if ((ld_sockets = launch_data_dict_lookup(ld_resp, LAUNCH_JOBKEY_SOCKETS))
- == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "launchd_checkin: No sockets found to answer requests on!");
- exit(EXIT_FAILURE);
- return; /* anti-compiler-warning */
- }
-
- /*
- * Get the array of listener sockets...
- */
-
- if ((ld_array = launch_data_dict_lookup(ld_sockets, "Listeners")) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "launchd_checkin: No sockets found to answer requests on!");
- exit(EXIT_FAILURE);
- return; /* anti-compiler-warning */
- }
-
- /*
- * Add listening fd(s) to the Listener array...
- */
-
- if (launch_data_get_type(ld_array) == LAUNCH_DATA_ARRAY)
- {
- count = launch_data_array_get_count(ld_array);
-
- for (i = 0; i < count; i ++)
- {
- /*
- * Get the launchd file descriptor and address...
- */
-
- if ((tmp = launch_data_array_get_index(ld_array, i)) != NULL)
- {
- fd = launch_data_get_fd(tmp);
- addrlen = sizeof(addr);
-
- if (getsockname(fd, (struct sockaddr *)&addr, &addrlen))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "launchd_checkin: Unable to get local address - %s",
- strerror(errno));
- continue;
- }
-
- /*
- * Try to match the launchd socket address to one of the listeners...
- */
-
- for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
- lis;
- lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
- if (httpAddrEqual(&lis->address, &addr))
- break;
-
- /*
- * Add a new listener If there's no match...
- */
-
- if (lis)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "launchd_checkin: Matched existing listener %s with fd %d...",
- httpAddrString(&(lis->address), s, sizeof(s)), fd);
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "launchd_checkin: Adding new listener %s with fd %d...",
- httpAddrString(&addr, s, sizeof(s)), fd);
-
- if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "launchd_checkin: Unable to allocate listener - "
- "%s.", strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- cupsArrayAdd(Listeners, lis);
-
- memcpy(&lis->address, &addr, sizeof(lis->address));
- }
-
- lis->fd = fd;
-
-# ifdef HAVE_SSL
- if (_httpAddrPort(&(lis->address)) == 443)
- lis->encryption = HTTP_ENCRYPT_ALWAYS;
-# endif /* HAVE_SSL */
- }
- }
- }
-
- launch_data_free(ld_msg);
- launch_data_free(ld_resp);
-}
-
-
-/*
- * 'launchd_checkout()' - Update the launchd KeepAlive file as needed.
- */
-
-static void
-launchd_checkout(void)
-{
- int fd; /* File descriptor */
-
-
- /*
- * Create or remove the launchd KeepAlive file based on whether
- * there are active jobs, polling, browsing for remote printers or
- * shared printers to advertise...
- */
-
- if (cupsArrayCount(ActiveJobs) ||
- (Browsing && BrowseLocalProtocols && cupsArrayCount(Printers)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Creating launchd keepalive file \"" CUPS_KEEPALIVE
- "\"...");
-
- if ((fd = open(CUPS_KEEPALIVE, O_RDONLY | O_CREAT | O_EXCL, S_IRUSR)) >= 0)
- close(fd);
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Removing launchd keepalive file \"" CUPS_KEEPALIVE
- "\"...");
-
- unlink(CUPS_KEEPALIVE);
- }
-}
-#endif /* HAVE_LAUNCHD */
-
-
/*
* 'parent_handler()' - Catch USR1/CHLD signals...
*/
@@ -1699,8 +1468,7 @@ process_children(void)
}
if (job->printer_message)
- cupsdSetString(&(job->printer_message->values[0].string.text),
- message);
+ ippSetString(job->attrs, &job->printer_message, 0, message);
}
}
@@ -1820,7 +1588,7 @@ select_timeout(int fds) /* I - Number of descriptors returned */
for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
con;
con = (cupsd_client_t *)cupsArrayNext(Clients))
- if (con->http.used > 0)
+ if (httpGetReady(con->http))
return (0);
/*
@@ -1874,9 +1642,9 @@ select_timeout(int fds) /* I - Number of descriptors returned */
for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
con;
con = (cupsd_client_t *)cupsArrayNext(Clients))
- if ((con->http.activity + Timeout) < timeout)
+ if ((httpGetActivity(con->http) + Timeout) < timeout)
{
- timeout = con->http.activity + Timeout;
+ timeout = httpGetActivity(con->http) + Timeout;
why = "timeout a client connection";
}
@@ -2040,6 +1808,361 @@ sigterm_handler(int sig) /* I - Signal number */
}
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+/*
+ * 'service_checkin()' - Check-in with launchd and collect the listening fds.
+ */
+
+static void
+service_checkin(void)
+{
+# ifdef HAVE_LAUNCH_ACTIVATE_SOCKET
+ int error; /* Check-in error, if any */
+ size_t i, /* Looping var */
+ count; /* Number of listeners */
+ int *ld_sockets; /* Listener sockets */
+ cupsd_listener_t *lis; /* Listeners array */
+ http_addr_t addr; /* Address variable */
+ socklen_t addrlen; /* Length of address */
+ char s[256]; /* String addresss */
+
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid());
+
+ /*
+ * Check-in with launchd...
+ */
+
+ if ((error = launch_activate_socket("Listeners", &ld_sockets, &count)) != 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(error));
+ exit(EXIT_FAILURE);
+ return; /* anti-compiler-warning */
+ }
+
+ /*
+ * Try to match the launchd sockets to the cupsd listeners...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", (int)count);
+
+ for (i = 0; i < count; i ++)
+ {
+ /*
+ * Get the launchd socket address...
+ */
+
+ addrlen = sizeof(addr);
+
+ if (getsockname(ld_sockets[i], (struct sockaddr *)&addr, &addrlen))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get local address for listener #%d: %s", (int)i + 1, strerror(errno));
+ continue;
+ }
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Listener #%d at fd %d, \"%s\".", (int)i + 1, ld_sockets[i], httpAddrString(&addr, s, sizeof(s)));
+
+ for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+ lis;
+ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+ if (httpAddrEqual(&lis->address, &addr))
+ break;
+
+ /*
+ * Add a new listener if there's no match...
+ */
+
+ if (lis)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Matched existing listener #%d to %s.", (int)i + 1, httpAddrString(&(lis->address), s, sizeof(s)));
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Adding new listener #%d for %s.", (int)i + 1, httpAddrString(&addr, s, sizeof(s)));
+
+ if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to allocate listener: %s", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ cupsArrayAdd(Listeners, lis);
+
+ memcpy(&lis->address, &addr, sizeof(lis->address));
+ }
+
+ lis->fd = ld_sockets[i];
+ lis->on_demand = 1;
+
+# ifdef HAVE_SSL
+ if (httpAddrPort(&(lis->address)) == 443)
+ lis->encryption = HTTP_ENCRYPT_ALWAYS;
+# endif /* HAVE_SSL */
+ }
+
+ free(ld_sockets);
+
+# elif defined(HAVE_LAUNCHD)
+ size_t i, /* Looping var */
+ count; /* Number of listeners */
+ launch_data_t ld_msg, /* Launch data message */
+ ld_resp, /* Launch data response */
+ ld_array, /* Launch data array */
+ ld_sockets, /* Launch data sockets dictionary */
+ tmp; /* Launch data */
+ cupsd_listener_t *lis; /* Listeners array */
+ http_addr_t addr; /* Address variable */
+ socklen_t addrlen; /* Length of address */
+ int fd; /* File descriptor */
+ char s[256]; /* String addresss */
+
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid());
+
+ /*
+ * Check-in with launchd...
+ */
+
+ ld_msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
+ if ((ld_resp = launch_msg(ld_msg)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "service_checkin: launch_msg(\"" LAUNCH_KEY_CHECKIN
+ "\") IPC failure");
+ exit(EXIT_FAILURE);
+ return; /* anti-compiler-warning */
+ }
+
+ if (launch_data_get_type(ld_resp) == LAUNCH_DATA_ERRNO)
+ {
+ errno = launch_data_get_errno(ld_resp);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Check-in failed: %s",
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ return; /* anti-compiler-warning */
+ }
+
+ /*
+ * Get the sockets dictionary...
+ */
+
+ if ((ld_sockets = launch_data_dict_lookup(ld_resp, LAUNCH_JOBKEY_SOCKETS))
+ == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "service_checkin: No sockets found to answer requests on.");
+ exit(EXIT_FAILURE);
+ return; /* anti-compiler-warning */
+ }
+
+ /*
+ * Get the array of listener sockets...
+ */
+
+ if ((ld_array = launch_data_dict_lookup(ld_sockets, "Listeners")) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "service_checkin: No sockets found to answer requests on.");
+ exit(EXIT_FAILURE);
+ return; /* anti-compiler-warning */
+ }
+
+ /*
+ * Add listening fd(s) to the Listener array...
+ */
+
+ if (launch_data_get_type(ld_array) == LAUNCH_DATA_ARRAY)
+ {
+ count = launch_data_array_get_count(ld_array);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", (int)count);
+
+ for (i = 0; i < count; i ++)
+ {
+ /*
+ * Get the launchd file descriptor and address...
+ */
+
+ if ((tmp = launch_data_array_get_index(ld_array, i)) != NULL)
+ {
+ fd = launch_data_get_fd(tmp);
+ addrlen = sizeof(addr);
+
+ if (getsockname(fd, (struct sockaddr *)&addr, &addrlen))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get local address for listener #%d: %s", (int)i + 1, strerror(errno));
+ continue;
+ }
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Listener #%d at fd %d, \"%s\".", (int)i + 1, fd, httpAddrString(&addr, s, sizeof(s)));
+
+ /*
+ * Try to match the launchd socket address to one of the listeners...
+ */
+
+ for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+ lis;
+ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+ if (httpAddrEqual(&lis->address, &addr))
+ break;
+
+ /*
+ * Add a new listener If there's no match...
+ */
+
+ if (lis)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Matched existing listener #%d to %s.", (int)i + 1, httpAddrString(&(lis->address), s, sizeof(s)));
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Adding new listener #%d for %s.", (int)i + 1, httpAddrString(&addr, s, sizeof(s)));
+
+ if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to allocate listener: %s.", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ cupsArrayAdd(Listeners, lis);
+
+ memcpy(&lis->address, &addr, sizeof(lis->address));
+ }
+
+ lis->fd = fd;
+ lis->on_demand = 1;
+
+# ifdef HAVE_SSL
+ if (httpAddrPort(&(lis->address)) == 443)
+ lis->encryption = HTTP_ENCRYPT_ALWAYS;
+# endif /* HAVE_SSL */
+ }
+ }
+ }
+
+ launch_data_free(ld_msg);
+ launch_data_free(ld_resp);
+
+# else /* HAVE_SYSTEMD */
+ int i, /* Looping var */
+ count; /* Number of listeners */
+ cupsd_listener_t *lis; /* Listeners array */
+ http_addr_t addr; /* Address variable */
+ socklen_t addrlen; /* Length of address */
+ char s[256]; /* String addresss */
+
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid());
+
+ /*
+ * Check-in with systemd...
+ */
+
+ if ((count = sd_listen_fds(0)) < 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(-count));
+ exit(EXIT_FAILURE);
+ return; /* anti-compiler-warning */
+ }
+
+ /*
+ * Try to match the systemd sockets to the cupsd listeners...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", count);
+
+ for (i = 0; i < count; i ++)
+ {
+ /*
+ * Get the launchd socket address...
+ */
+
+ addrlen = sizeof(addr);
+
+ if (getsockname(SD_LISTEN_FDS_START + i, (struct sockaddr *)&addr, &addrlen))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get local address for listener #%d: %s", (int)i + 1, strerror(errno));
+ continue;
+ }
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Listener #%d at fd %d, \"%s\".", (int)i + 1, SD_LISTEN_FDS_START + i, httpAddrString(&addr, s, sizeof(s)));
+
+ for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+ lis;
+ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+ if (httpAddrEqual(&lis->address, &addr))
+ break;
+
+ /*
+ * Add a new listener if there's no match...
+ */
+
+ if (lis)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Matched existing listener #%d to %s.", (int)i + 1, httpAddrString(&(lis->address), s, sizeof(s)));
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Adding new listener #%d for %s.", (int)i + 1, httpAddrString(&addr, s, sizeof(s)));
+
+ if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to allocate listener: %s", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ cupsArrayAdd(Listeners, lis);
+
+ memcpy(&lis->address, &addr, sizeof(lis->address));
+ }
+
+ lis->fd = SD_LISTEN_FDS_START + i;
+ lis->on_demand = 1;
+
+# ifdef HAVE_SSL
+ if (httpAddrPort(&(lis->address)) == 443)
+ lis->encryption = HTTP_ENCRYPT_ALWAYS;
+# endif /* HAVE_SSL */
+ }
+# endif /* HAVE_LAUNCH_ACTIVATE_SOCKET */
+}
+
+
+/*
+ * 'service_checkout()' - Update the CUPS_KEEPALIVE file as needed.
+ */
+
+static void
+service_checkout(void)
+{
+ int fd; /* File descriptor */
+
+
+ /*
+ * Create or remove the "keep-alive" file based on whether there are active
+ * jobs or shared printers to advertise...
+ */
+
+ if (cupsArrayCount(ActiveJobs) || /* Active jobs */
+ WebInterface || /* Web interface enabled */
+ (Browsing && BrowseLocalProtocols && cupsArrayCount(Printers)))
+ /* Printers being shared */
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Creating keep-alive file \"" CUPS_KEEPALIVE "\".");
+
+ if ((fd = open(CUPS_KEEPALIVE, O_RDONLY | O_CREAT | O_EXCL, S_IRUSR)) >= 0)
+ close(fd);
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Removing keep-alive file \"" CUPS_KEEPALIVE "\".");
+
+ unlink(CUPS_KEEPALIVE);
+ }
+}
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+
+
/*
* 'usage()' - Show scheduler usage.
*/
@@ -2057,7 +2180,7 @@ usage(int status) /* O - Exit status */
_cupsLangPuts(fp, _(" -F Run in the foreground but "
"detach from console."));
_cupsLangPuts(fp, _(" -h Show this usage message."));
- _cupsLangPuts(fp, _(" -l Run cupsd from launchd(8)."));
+ _cupsLangPuts(fp, _(" -l Run cupsd on demand."));
_cupsLangPuts(fp, _(" -t Test the configuration "
"file."));
@@ -2066,5 +2189,5 @@ usage(int status) /* O - Exit status */
/*
- * End of "$Id: main.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: main.c 12700 2015-06-08 18:32:35Z msweet $".
*/
diff --git a/scheduler/mime-private.h b/scheduler/mime-private.h
index f984548..078953d 100644
--- a/scheduler/mime-private.h
+++ b/scheduler/mime-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: mime-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mime-private.h 3411 2011-09-07 22:31:27Z msweet $"
*
* Private MIME type/conversion database definitions for CUPS.
*
@@ -41,5 +41,5 @@ extern void _mimeError(mime_t *mime, const char *format, ...)
#endif /* !_CUPS_MIME_PRIVATE_H_ */
/*
- * End of "$Id: mime-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mime-private.h 3411 2011-09-07 22:31:27Z msweet $".
*/
diff --git a/scheduler/mime.c b/scheduler/mime.c
index 412c9e0..29d3ebc 100644
--- a/scheduler/mime.c
+++ b/scheduler/mime.c
@@ -1,40 +1,16 @@
/*
- * "$Id: mime.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mime.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * MIME database file routines for CUPS.
+ * MIME database file routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * mimeDelete() - Delete (free) a MIME database.
- * mimeDeleteFilter() - Delete a filter from the MIME database.
- * mimeDeleteType() - Delete a type from the MIME database.
- * _mimeError() - Show an error message.
- * mimeFirstFilter() - Get the first filter in the MIME database.
- * mimeFirstType() - Get the first type in the MIME database.
- * mimeLoad() - Create a new MIME database from disk.
- * mimeLoadFilters() - Load filter definitions from disk.
- * mimeLoadTypes() - Load type definitions from disk.
- * mimeNew() - Create a new, empty MIME database.
- * mimeNextFilter() - Get the next filter in the MIME database.
- * mimeNextType() - Get the next type in the MIME database.
- * mimeNumFilters() - Get the number of filters in a MIME database.
- * mimeNumTypes() - Get the number of types in a MIME database.
- * mimeSetErrorCallback() - Set the callback for error messages.
- * mime_add_fcache() - Add a filter to the filter cache.
- * mime_compare_fcache() - Compare two filter cache entries.
- * mime_delete_fcache() - Free all memory used by the filter cache.
- * mime_delete_rules() - Free all memory for the given rule tree.
- * mime_load_convs() - Load a xyz.convs file.
- * mime_load_types() - Load a xyz.types file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -134,7 +110,7 @@ mimeDeleteFilter(mime_t *mime, /* I - MIME database */
filter ? filter->dst->super : "???",
filter ? filter->cost : -1,
filter ? CUPS_LLCAST filter->maxsize : CUPS_LLCAST -1));
-
+
if (!mime || !filter)
return;
@@ -659,6 +635,9 @@ mime_delete_rules(mime_magic_t *rules) /* I - Rules to free */
if (rules->child != NULL)
mime_delete_rules(rules->child);
+ if (rules->op == MIME_MAGIC_REGEX)
+ regfree(&(rules->value.rev));
+
free(rules);
rules = next;
}
@@ -741,7 +720,7 @@ mime_load_convs(
while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
(temp - super + 1) < MIME_MAX_SUPER)
- *temp++ = tolower(*lineptr++ & 255);
+ *temp++ = (char)tolower(*lineptr++ & 255);
*temp = '\0';
@@ -753,7 +732,7 @@ mime_load_convs(
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
*lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
- *temp++ = tolower(*lineptr++ & 255);
+ *temp++ = (char)tolower(*lineptr++ & 255);
*temp = '\0';
@@ -798,7 +777,7 @@ mime_load_convs(
if (!mime_add_fcache(filtercache, filter, filterpath))
{
DEBUG_printf(("mime_load_convs: Filter %s not found in %s.", filter,
- filterpath));
+ filterpath));
_mimeError(mime, "Filter \"%s\" not found.", filter);
continue;
}
@@ -814,7 +793,7 @@ mime_load_convs(
while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
(temp - super + 1) < MIME_MAX_SUPER)
- *temp++ = tolower(*lineptr++ & 255);
+ *temp++ = (char)tolower(*lineptr++ & 255);
*temp = '\0';
@@ -826,7 +805,7 @@ mime_load_convs(
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
*lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
- *temp++ = tolower(*lineptr++ & 255);
+ *temp++ = (char)tolower(*lineptr++ & 255);
*temp = '\0';
@@ -836,8 +815,8 @@ mime_load_convs(
* Force * / * to be "application/octet-stream"...
*/
- strcpy(super, "application");
- strcpy(type, "octet-stream");
+ strlcpy(super, "application", sizeof(super));
+ strlcpy(type, "octet-stream", sizeof(type));
}
/*
@@ -865,7 +844,7 @@ mime_load_types(mime_t *mime, /* I - MIME database */
const char *filename) /* I - Types file to load */
{
cups_file_t *fp; /* Types file */
- int linelen; /* Length of line */
+ size_t linelen; /* Length of line */
char line[32768], /* Input line from file */
*lineptr, /* Current position in line */
super[MIME_MAX_SUPER], /* Super-type name */
@@ -927,7 +906,7 @@ mime_load_types(mime_t *mime, /* I - MIME database */
while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
(temp - super + 1) < MIME_MAX_SUPER)
- *temp++ = tolower(*lineptr++ & 255);
+ *temp++ = (char)tolower(*lineptr++ & 255);
*temp = '\0';
@@ -939,7 +918,7 @@ mime_load_types(mime_t *mime, /* I - MIME database */
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
*lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
- *temp++ = tolower(*lineptr++ & 255);
+ *temp++ = (char)tolower(*lineptr++ & 255);
*temp = '\0';
@@ -956,5 +935,5 @@ mime_load_types(mime_t *mime, /* I - MIME database */
/*
- * End of "$Id: mime.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mime.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/scheduler/mime.h b/scheduler/mime.h
index 51d7a29..ddd3283 100644
--- a/scheduler/mime.h
+++ b/scheduler/mime.h
@@ -1,9 +1,9 @@
/*
- * "$Id: mime.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mime.h 11272 2013-09-10 19:15:36Z msweet $"
*
* MIME type/conversion database definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -19,6 +19,7 @@
# include <cups/array.h>
# include <cups/ipp.h>
# include <cups/file.h>
+# include <regex.h>
/*
@@ -58,7 +59,8 @@ typedef enum
MIME_MAGIC_INT, /* Integer/32-bit word matches */
MIME_MAGIC_LOCALE, /* Current locale matches string */
MIME_MAGIC_CONTAINS, /* File contains a string */
- MIME_MAGIC_ISTRING /* Case-insensitive string matches */
+ MIME_MAGIC_ISTRING, /* Case-insensitive string matches */
+ MIME_MAGIC_REGEX /* Regular expression matches */
} mime_op_t;
typedef struct _mime_magic_s /**** MIME Magic Data ****/
@@ -80,6 +82,7 @@ typedef struct _mime_magic_s /**** MIME Magic Data ****/
unsigned char charv; /* Byte value */
unsigned short shortv; /* Short value */
unsigned intv; /* Integer value */
+ regex_t rev; /* Regular expression value */
} value;
} mime_magic_t;
@@ -158,5 +161,5 @@ extern void mimeSetErrorCallback(mime_t *mime, mime_error_cb_t cb,
#endif /* !_CUPS_MIME_H_ */
/*
- * End of "$Id: mime.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mime.h 11272 2013-09-10 19:15:36Z msweet $".
*/
diff --git a/scheduler/network.c b/scheduler/network.c
index 07b5265..18f9b7c 100644
--- a/scheduler/network.c
+++ b/scheduler/network.c
@@ -1,23 +1,16 @@
/*
- * "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: network.c 11497 2014-01-06 21:59:35Z msweet $"
*
- * Network interface functions for the CUPS scheduler.
+ * Network interface functions for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdNetIFFind() - Find a network interface.
- * cupsdNetIFFree() - Free the current network interface list.
- * cupsdNetIFUpdate() - Update the network interface list as needed...
- * compare_netif() - Compare two network interfaces.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -133,7 +126,10 @@ cupsdNetIFUpdate(void)
*/
if (getifaddrs(&addrs) < 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: Unable to get interface list - %s", strerror(errno));
return;
+ }
for (addr = addrs; addr != NULL; addr = addr->ifa_next)
{
@@ -148,7 +144,10 @@ cupsdNetIFUpdate(void)
#endif
) ||
addr->ifa_netmask == NULL || addr->ifa_name == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: Ignoring \"%s\".", addr->ifa_name);
continue;
+ }
/*
* Try looking up the hostname for the address as needed...
@@ -178,7 +177,10 @@ cupsdNetIFUpdate(void)
hostlen = strlen(hostname);
if ((temp = calloc(1, sizeof(cupsd_netif_t) + hostlen)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: Unable to allocate memory for interface.");
break;
+ }
/*
* Copy all of the information...
@@ -264,7 +266,7 @@ cupsdNetIFUpdate(void)
if (match)
{
- temp->port = _httpAddrPort(&(lis->address));
+ temp->port = httpAddrPort(&(lis->address));
break;
}
}
@@ -296,5 +298,5 @@ compare_netif(cupsd_netif_t *a, /* I - First network interface */
/*
- * End of "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: network.c 11497 2014-01-06 21:59:35Z msweet $".
*/
diff --git a/scheduler/network.h b/scheduler/network.h
index 0570975..411a6d2 100644
--- a/scheduler/network.h
+++ b/scheduler/network.h
@@ -1,5 +1,5 @@
/*
- * "$Id: network.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: network.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Network interface definitions for the CUPS scheduler.
*
@@ -48,5 +48,5 @@ extern void cupsdNetIFUpdate(void);
/*
- * End of "$Id: network.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: network.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/org.cups.cups-lpd.plist.in b/scheduler/org.cups.cups-lpd.plist.in
index 32067ef..76eb2ee 100644
--- a/scheduler/org.cups.cups-lpd.plist.in
+++ b/scheduler/org.cups.cups-lpd.plist.in
@@ -6,6 +6,12 @@
<true/>
<key>Label</key>
<string>org.cups.cups-lpd</string>
+ <key>ProcessType</key>
+ <string>Background</string>
+ <key>EnableTransactions</key>
+ <true/>
+ <key>EnablePressuredExit</key>
+ <true/>
<key>ProgramArguments</key>
<array>
<string>/usr/libexec/cups/daemon/cups-lpd</string>
diff --git a/scheduler/org.cups.cups-lpd.socket b/scheduler/org.cups.cups-lpd.socket
new file mode 100644
index 0000000..dd5288c
--- /dev/null
+++ b/scheduler/org.cups.cups-lpd.socket
@@ -0,0 +1,9 @@
+[Unit]
+Description=CUPS LPD Server Socket
+
+[Socket]
+ListenStream=515
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/scheduler/org.cups.cups-lpdAT.service.in b/scheduler/org.cups.cups-lpdAT.service.in
new file mode 100644
index 0000000..5c78273
--- /dev/null
+++ b/scheduler/org.cups.cups-lpdAT.service.in
@@ -0,0 +1,9 @@
+[Unit]
+Description=CUPS LPD server
+Documentation=man:cups-lpd(8)
+
+[Service]
+ExecStart=-@CUPS_SERVERBIN@/daemon/cups-lpd
+StandardInput=socket
+User=@CUPS_USER@
+
diff --git a/scheduler/org.cups.cupsd.path.in b/scheduler/org.cups.cupsd.path.in
new file mode 100644
index 0000000..1bccc6f
--- /dev/null
+++ b/scheduler/org.cups.cupsd.path.in
@@ -0,0 +1,8 @@
+[Unit]
+Description=CUPS Scheduler
+
+[Path]
+PathExists=@CUPS_CACHEDIR@/org.cups.cupsd
+
+[Install]
+WantedBy=multi-user.target
diff --git a/scheduler/org.cups.cupsd.plist b/scheduler/org.cups.cupsd.plist
index ccc861d..c0755c4 100644
--- a/scheduler/org.cups.cupsd.plist
+++ b/scheduler/org.cups.cupsd.plist
@@ -4,8 +4,12 @@
<dict>
<key>Label</key>
<string>org.cups.cupsd</string>
+ <key>ProcessType</key>
+ <string>Background</string>
<key>EnableTransactions</key>
<true/>
+ <key>EnablePressuredExit</key>
+ <true/>
<key>ExitTimeOut</key>
<integer>60</integer>
<key>KeepAlive</key>
@@ -21,8 +25,7 @@
<string>/usr/sbin/cupsd</string>
<string>-l</string>
</array>
- <!-- These environment variables are only used when CUPS is compiled
- with --enable-debug-printfs -->
+ <!-- These environment variables are only used when CUPS is compiled with debug-printfs support -->
<key>EnvironmentVariables</key>
<dict>
<key>CUPS_DEBUG_LOG</key>
@@ -30,27 +33,13 @@
<key>CUPS_DEBUG_LEVEL</key>
<string>3</string>
<key>CUPS_DEBUG_FILTER</key>
- <string>^(http|_http|ipp|_ipp|mime).*</string>
+ <string>^(cupsDo|cupsGet|cupsMake|cupsSet|http|_http|ipp|_ipp|mime).*</string>
</dict>
- <key>ServiceIPC</key>
- <true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<array>
<dict>
- <key>SockNodeName</key>
- <string>::1</string>
- <key>SockServiceName</key>
- <string>ipp</string>
- </dict>
- <dict>
- <key>SockNodeName</key>
- <string>127.0.0.1</string>
- <key>SockServiceName</key>
- <string>ipp</string>
- </dict>
- <dict>
<key>SockPathMode</key>
<integer>49663</integer>
<key>SockPathName</key>
diff --git a/scheduler/org.cups.cupsd.service.in b/scheduler/org.cups.cupsd.service.in
new file mode 100644
index 0000000..0a27c76
--- /dev/null
+++ b/scheduler/org.cups.cupsd.service.in
@@ -0,0 +1,11 @@
+[Unit]
+Description=CUPS Scheduler
+Documentation=man:cupsd(8)
+
+[Service]
+ExecStart=@sbindir@/cupsd -l
+Type=simple
+
+[Install]
+Also=org.cups.cupsd.socket org.cups.cupsd.path
+WantedBy=printer.target
diff --git a/scheduler/org.cups.cupsd.socket.in b/scheduler/org.cups.cupsd.socket.in
new file mode 100644
index 0000000..b0928c5
--- /dev/null
+++ b/scheduler/org.cups.cupsd.socket.in
@@ -0,0 +1,8 @@
+[Unit]
+Description=CUPS Scheduler
+
+[Socket]
+ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@
+
+[Install]
+WantedBy=sockets.target
diff --git a/scheduler/policy.c b/scheduler/policy.c
index 75b5983..b9883d4 100644
--- a/scheduler/policy.c
+++ b/scheduler/policy.c
@@ -1,32 +1,16 @@
/*
- * "$Id: policy.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: policy.c 11681 2014-03-05 19:07:24Z msweet $"
*
- * Policy routines for the CUPS scheduler.
+ * Policy routines for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2011, 2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * AddPolicy() - Add a policy to the system.
- * cupsdAddPolicyOp() - Add an operation to a policy.
- * cupsdCheckPolicy() - Check the IPP operation and username against a
- * policy.
- * cupsdDeleteAllPolicies() - Delete all policies in memory.
- * cupsdFindPolicy() - Find a named policy.
- * cupsdFindPolicyOp() - Find a policy operation.
- * cupsdGetPrivateAttrs() - Get the private attributes for the current
- * request.
- * compare_ops() - Compare two operations.
- * compare_policies() - Compare two policies.
- * free_policy() - Free the memory used by a policy.
- * hash_op() - Generate a lookup hash for the operation.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -48,7 +32,7 @@ static int hash_op(cupsd_location_t *op);
/*
- * 'AddPolicy()' - Add a policy to the system.
+ * 'cupsdAddPolicy()' - Add a policy to the system.
*/
cupsd_policy_t * /* O - Policy */
@@ -136,7 +120,7 @@ cupsdCheckPolicy(cupsd_policy_t *p, /* I - Policy */
if (!p || !con)
{
- cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p!", p, con);
+ cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p.", p, con);
return ((http_status_t)0);
}
@@ -147,7 +131,7 @@ cupsdCheckPolicy(cupsd_policy_t *p, /* I - Policy */
if ((po = cupsdFindPolicyOp(p, con->request->request.op.operation_id)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckPolicy: No matching operation, returning 0!");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckPolicy: No matching operation, returning 0.");
return ((http_status_t)0);
}
@@ -263,7 +247,7 @@ cupsdFindPolicyOp(cupsd_policy_t *p, /* I - Policy */
return (po);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp: No match found!");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp: No match found.");
return (NULL);
}
@@ -293,9 +277,15 @@ cupsdGetPrivateAttrs(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdGetPrivateAttrs(policy=%p(%s), con=%p(%d), "
"printer=%p(%s), owner=\"%s\")", policy, policy->name, con,
- con->http.fd, printer, printer ? printer->name : "", owner);
+ con->number, printer, printer ? printer->name : "", owner);
#endif /* DEBUG */
+ if (!policy)
+ {
+ cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdGetPrivateAttrs: policy=%p, con=%p, printer=%p, owner=\"%s\", DefaultPolicyPtr=%p: This should never happen, please report a bug.", policy, con, printer, owner, DefaultPolicyPtr);
+ policy = DefaultPolicyPtr;
+ }
+
/*
* Get the access and attributes lists that correspond to the request...
*/
@@ -513,5 +503,5 @@ hash_op(cupsd_location_t *op) /* I - Operation */
/*
- * End of "$Id: policy.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: policy.c 11681 2014-03-05 19:07:24Z msweet $".
*/
diff --git a/scheduler/policy.h b/scheduler/policy.h
index df17a11..8af88f5 100644
--- a/scheduler/policy.h
+++ b/scheduler/policy.h
@@ -1,5 +1,5 @@
/*
- * "$Id: policy.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: policy.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Policy definitions for the CUPS scheduler.
*
@@ -59,5 +59,5 @@ extern cups_array_t *cupsdGetPrivateAttrs(cupsd_policy_t *p,
/*
- * End of "$Id: policy.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: policy.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/printers.c b/scheduler/printers.c
index 48c4a82..61956b7 100644
--- a/scheduler/printers.c
+++ b/scheduler/printers.c
@@ -1,59 +1,16 @@
/*
- * "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: printers.c 12733 2015-06-12 01:21:05Z msweet $"
*
- * Printer routines for the CUPS scheduler.
+ * Printer routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddPrinter() - Add a printer to the system.
- * cupsdCreateCommonData() - Create the common printer data.
- * cupsdDeleteAllPrinters() - Delete all printers from the system.
- * cupsdDeletePrinter() - Delete a printer from the system.
- * cupsdFindDest() - Find a destination in the list.
- * cupsdFindPrinter() - Find a printer in the list.
- * cupsdLoadAllPrinters() - Load printers from the printers.conf file.
- * cupsdRenamePrinter() - Rename a printer.
- * cupsdSaveAllPrinters() - Save all printer definitions to the
- * printers.conf file.
- * cupsdSetAuthInfoRequired() - Set the required authentication info.
- * cupsdSetDeviceURI() - Set the device URI for a printer.
- * cupsdSetPrinterAttr() - Set a printer attribute.
- * cupsdSetPrinterAttrs() - Set printer attributes based upon the PPD
- * file.
- * cupsdSetPrinterReasons() - Set/update the reasons strings.
- * cupsdSetPrinterState() - Update the current state of a printer.
- * cupsdStopPrinter() - Stop a printer from printing any jobs...
- * cupsdUpdatePrinterPPD() - Update keywords in a printer's PPD file.
- * cupsdUpdatePrinters() - Update printers after a partial reload.
- * cupsdValidateDest() - Validate a printer/class destination.
- * cupsdWritePrintcap() - Write a pseudo-printcap file for older
- * applications that need it...
- * add_printer_defaults() - Add name-default attributes to the printer
- * attributes.
- * add_printer_filter() - Add a MIME filter for a printer.
- * add_printer_formats() - Add document-format-supported values for a
- * printer.
- * compare_printers() - Compare two printers.
- * delete_printer_filters() - Delete all MIME filters for a printer.
- * dirty_printer() - Mark config and state files dirty for the
- * specified printer.
- * load_ppd() - Load a cached PPD file, updating the cache as
- * needed.
- * new_media_col() - Create a media-col collection value.
- * write_irix_config() - Update the config files used by the IRIX
- * desktop tools.
- * write_irix_state() - Update the status files used by IRIX printing
- * desktop tools.
- * write_xml_string() - Write a string with XML escaping.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -93,13 +50,8 @@ static int compare_printers(void *first, void *second, void *data);
static void delete_printer_filters(cupsd_printer_t *p);
static void dirty_printer(cupsd_printer_t *p);
static void load_ppd(cupsd_printer_t *p);
-static void log_ipp_conformance(cupsd_printer_t *p, const char *reason);
static ipp_t *new_media_col(_pwg_size_t *size, const char *source,
const char *type);
-#ifdef __sgi
-static void write_irix_config(cupsd_printer_t *p);
-static void write_irix_state(cupsd_printer_t *p);
-#endif /* __sgi */
static void write_xml_string(cups_file_t *fp, const char *s);
@@ -139,15 +91,16 @@ cupsdAddPrinter(const char *name) /* I - Name of printer */
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
ServerName, RemotePort, "/printers/%s", name);
cupsdSetString(&p->uri, uri);
- cupsdSetString(&p->uuid, _httpAssembleUUID(ServerName, RemotePort, name, 0,
- uuid, sizeof(uuid)));
+ cupsdSetString(&p->uuid, httpAssembleUUID(ServerName, RemotePort, name, 0,
+ uuid, sizeof(uuid)));
cupsdSetDeviceURI(p, "file:///dev/null");
- p->state = IPP_PRINTER_STOPPED;
- p->state_time = time(NULL);
- p->accepting = 0;
- p->shared = DefaultShared;
- p->filetype = mimeAddType(MimeDatabase, "printer", name);
+ p->config_time = time(NULL);
+ p->state = IPP_PRINTER_STOPPED;
+ p->state_time = time(NULL);
+ p->accepting = 0;
+ p->shared = DefaultShared;
+ p->filetype = mimeAddType(MimeDatabase, "printer", name);
cupsdSetString(&p->job_sheets[0], "none");
cupsdSetString(&p->job_sheets[1], "none");
@@ -219,6 +172,10 @@ cupsdCreateCommonData(void)
"third-shift",
"weekend"
};
+ static const char * const features[] =/* ipp-features-supported values */
+ {
+ "subscription-object"
+ };
static const char * const versions[] =/* ipp-versions-supported values */
{
"1.0",
@@ -228,54 +185,53 @@ cupsdCreateCommonData(void)
};
static const int ops[] = /* operations-supported values */
{
- IPP_PRINT_JOB,
- IPP_VALIDATE_JOB,
- IPP_CREATE_JOB,
- IPP_SEND_DOCUMENT,
- IPP_CANCEL_JOB,
- IPP_GET_JOB_ATTRIBUTES,
- IPP_GET_JOBS,
- IPP_GET_PRINTER_ATTRIBUTES,
- IPP_HOLD_JOB,
- IPP_RELEASE_JOB,
- IPP_RESTART_JOB,
- IPP_PAUSE_PRINTER,
- IPP_RESUME_PRINTER,
- IPP_PURGE_JOBS,
- IPP_SET_PRINTER_ATTRIBUTES,
- IPP_SET_JOB_ATTRIBUTES,
- IPP_GET_PRINTER_SUPPORTED_VALUES,
- IPP_CREATE_PRINTER_SUBSCRIPTION,
- IPP_CREATE_JOB_SUBSCRIPTION,
- IPP_GET_SUBSCRIPTION_ATTRIBUTES,
- IPP_GET_SUBSCRIPTIONS,
- IPP_RENEW_SUBSCRIPTION,
- IPP_CANCEL_SUBSCRIPTION,
- IPP_GET_NOTIFICATIONS,
- IPP_ENABLE_PRINTER,
- IPP_DISABLE_PRINTER,
- IPP_HOLD_NEW_JOBS,
- IPP_RELEASE_HELD_NEW_JOBS,
- IPP_CANCEL_JOBS,
- IPP_CANCEL_MY_JOBS,
- IPP_CLOSE_JOB,
- CUPS_GET_DEFAULT,
- CUPS_GET_PRINTERS,
- CUPS_ADD_PRINTER,
- CUPS_DELETE_PRINTER,
- CUPS_GET_CLASSES,
- CUPS_ADD_CLASS,
- CUPS_DELETE_CLASS,
- CUPS_ACCEPT_JOBS,
- CUPS_REJECT_JOBS,
- CUPS_SET_DEFAULT,
- CUPS_GET_DEVICES,
- CUPS_GET_PPDS,
- CUPS_MOVE_JOB,
- CUPS_AUTHENTICATE_JOB,
- CUPS_GET_PPD,
- CUPS_GET_DOCUMENT,
- IPP_RESTART_JOB
+ IPP_OP_PRINT_JOB,
+ IPP_OP_VALIDATE_JOB,
+ IPP_OP_CREATE_JOB,
+ IPP_OP_SEND_DOCUMENT,
+ IPP_OP_CANCEL_JOB,
+ IPP_OP_GET_JOB_ATTRIBUTES,
+ IPP_OP_GET_JOBS,
+ IPP_OP_GET_PRINTER_ATTRIBUTES,
+ IPP_OP_HOLD_JOB,
+ IPP_OP_RELEASE_JOB,
+ IPP_OP_PAUSE_PRINTER,
+ IPP_OP_RESUME_PRINTER,
+ IPP_OP_PURGE_JOBS,
+ IPP_OP_SET_PRINTER_ATTRIBUTES,
+ IPP_OP_SET_JOB_ATTRIBUTES,
+ IPP_OP_GET_PRINTER_SUPPORTED_VALUES,
+ IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
+ IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
+ IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,
+ IPP_OP_GET_SUBSCRIPTIONS,
+ IPP_OP_RENEW_SUBSCRIPTION,
+ IPP_OP_CANCEL_SUBSCRIPTION,
+ IPP_OP_GET_NOTIFICATIONS,
+ IPP_OP_ENABLE_PRINTER,
+ IPP_OP_DISABLE_PRINTER,
+ IPP_OP_HOLD_NEW_JOBS,
+ IPP_OP_RELEASE_HELD_NEW_JOBS,
+ IPP_OP_CANCEL_JOBS,
+ IPP_OP_CANCEL_MY_JOBS,
+ IPP_OP_CLOSE_JOB,
+ IPP_OP_CUPS_GET_DEFAULT,
+ IPP_OP_CUPS_GET_PRINTERS,
+ IPP_OP_CUPS_ADD_MODIFY_PRINTER,
+ IPP_OP_CUPS_DELETE_PRINTER,
+ IPP_OP_CUPS_GET_CLASSES,
+ IPP_OP_CUPS_ADD_MODIFY_CLASS,
+ IPP_OP_CUPS_DELETE_CLASS,
+ IPP_OP_CUPS_ACCEPT_JOBS,
+ IPP_OP_CUPS_REJECT_JOBS,
+ IPP_OP_CUPS_SET_DEFAULT,
+ IPP_OP_CUPS_GET_DEVICES,
+ IPP_OP_CUPS_GET_PPDS,
+ IPP_OP_CUPS_MOVE_JOB,
+ IPP_OP_CUPS_AUTHENTICATE_JOB,
+ IPP_OP_CUPS_GET_PPD,
+ IPP_OP_CUPS_GET_DOCUMENT,
+ IPP_OP_RESTART_JOB
};
static const char * const charsets[] =/* charset-supported values */
{
@@ -348,9 +304,9 @@ cupsdCreateCommonData(void)
"multiple-document-handling",
"number-up",
"output-bin",
- "output-mode",
"orientation-requested",
"page-ranges",
+ "print-color-mode",
"print-quality",
"printer-resolution",
"sides"
@@ -367,9 +323,9 @@ cupsdCreateCommonData(void)
"multiple-document-handling",
"number-up",
"output-bin",
- "output-mode",
"orientation-requested",
"page-ranges",
+ "print-color-mode",
"print-quality",
"printer-resolution",
"sides"
@@ -388,8 +344,11 @@ cupsdCreateCommonData(void)
};
static const char * const printer_settable[] =
{ /* printer-settable-attributes-supported */
+ "printer-geo-location",
"printer-info",
- "printer-location"
+ "printer-location",
+ "printer-organization",
+ "printer-organizational-unit"
};
static const char * const which_jobs[] =
{ /* which-jobs-supported values */
@@ -469,6 +428,9 @@ cupsdCreateCommonData(void)
ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE,
"generated-natural-language-supported", NULL, DefaultLanguage);
+ /* ipp-features-supported */
+ ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features);
+
/* ipp-versions-supported */
ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
"ipp-versions-supported", sizeof(versions) / sizeof(versions[0]),
@@ -478,6 +440,10 @@ cupsdCreateCommonData(void)
ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
"ippget-event-life", 15);
+ /* job-cancel-after-supported */
+ ippAddRange(CommonData, IPP_TAG_PRINTER, "job-cancel-after-supported",
+ 0, INT_MAX);
+
/* job-creation-attributes-supported */
ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
"job-creation-attributes-supported",
@@ -578,6 +544,9 @@ cupsdCreateCommonData(void)
ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
"multiple-operation-time-out", MultipleOperationTimeout);
+ /* multiple-operation-time-out-action */
+ ippAddString(CommonData, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "process-job");
+
/* natural-language-configured (no IPP_TAG_COPY) */
ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE,
"natural-language-configured", NULL, DefaultLanguage);
@@ -663,6 +632,9 @@ cupsdCreateCommonData(void)
ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
"pdl-override-supported", NULL, "attempted");
+ /* printer-get-attributes-supported */
+ ippAddString(CommonData, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format");
+
/* printer-op-policy-supported */
attr = ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
"printer-op-policy-supported", cupsArrayCount(Policies),
@@ -720,9 +692,6 @@ cupsdDeletePrinter(
{
int i, /* Looping var */
changed = 0; /* Class changed? */
-#ifdef __sgi
- char filename[1024]; /* Interface script filename */
-#endif /* __sgi */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeletePrinter(p=%p(%s), update=%d)",
@@ -756,31 +725,6 @@ cupsdDeletePrinter(
cupsArrayRemove(Printers, p);
/*
- * Remove the dummy interface/icon/option files under IRIX...
- */
-
-#ifdef __sgi
- snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name);
- unlink(filename);
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui",
- p->name);
- unlink(filename);
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name);
- unlink(filename);
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name);
- unlink(filename);
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name);
- unlink(filename);
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name);
- unlink(filename);
-#endif /* __sgi */
-
- /*
* If p is the default printer, assign a different one...
*/
@@ -824,6 +768,7 @@ cupsdDeletePrinter(
cupsdClearString(&p->hostname);
cupsdClearString(&p->name);
cupsdClearString(&p->location);
+ cupsdClearString(&p->geo_location);
cupsdClearString(&p->make_model);
cupsdClearString(&p->info);
cupsdClearString(&p->job_sheets[0]);
@@ -957,7 +902,7 @@ cupsdLoadAllPrinters(void)
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of printers.conf.", linenum);
}
- else if (!_cups_strcasecmp(line, "</Printer>"))
+ else if (!_cups_strcasecmp(line, "</Printer>") || !_cups_strcasecmp(line, "</DefaultPrinter>"))
{
if (p != NULL)
{
@@ -1033,6 +978,21 @@ cupsdLoadAllPrinters(void)
if (value)
cupsdSetString(&p->location, value);
}
+ else if (!_cups_strcasecmp(line, "GeoLocation"))
+ {
+ if (value)
+ cupsdSetString(&p->geo_location, value);
+ }
+ else if (!_cups_strcasecmp(line, "Organization"))
+ {
+ if (value)
+ cupsdSetString(&p->organization, value);
+ }
+ else if (!_cups_strcasecmp(line, "OrganizationalUnit"))
+ {
+ if (value)
+ cupsdSetString(&p->organizational_unit, value);
+ }
else if (!_cups_strcasecmp(line, "DeviceURI"))
{
if (value)
@@ -1137,6 +1097,15 @@ cupsdLoadAllPrinters(void)
if (value)
p->state_time = atoi(value);
}
+ else if (!_cups_strcasecmp(line, "ConfigTime"))
+ {
+ /*
+ * Set the config time...
+ */
+
+ if (value)
+ p->config_time = atoi(value);
+ }
else if (!_cups_strcasecmp(line, "Accepting"))
{
/*
@@ -1160,7 +1129,7 @@ cupsdLoadAllPrinters(void)
else if (!_cups_strcasecmp(line, "Type"))
{
if (value)
- p->type = atoi(value);
+ p->type = (cups_ptype_t)atoi(value);
else
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of printers.conf.", linenum);
@@ -1287,10 +1256,17 @@ cupsdLoadAllPrinters(void)
else if (!_cups_strcasecmp(line, "ErrorPolicy"))
{
if (value)
- cupsdSetString(&p->error_policy, value);
+ {
+ if (strcmp(value, "retry-current-job") &&
+ strcmp(value, "abort-job") &&
+ strcmp(value, "retry-job") &&
+ strcmp(value, "stop-printer"))
+ cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\" on line %d or printers.conf.", ErrorPolicy, linenum);
+ else
+ cupsdSetString(&p->error_policy, value);
+ }
else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Syntax error on line %d of printers.conf.", linenum);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of printers.conf.", linenum);
}
else if (!_cups_strcasecmp(line, "Attribute") && value)
{
@@ -1486,9 +1462,18 @@ cupsdSaveAllPrinters(void)
if (printer->location)
cupsFilePutConf(fp, "Location", printer->location);
+ if (printer->geo_location)
+ cupsFilePutConf(fp, "GeoLocation", printer->geo_location);
+
if (printer->make_model)
cupsFilePutConf(fp, "MakeModel", printer->make_model);
+ if (printer->organization)
+ cupsFilePutConf(fp, "Organization", printer->organization);
+
+ if (printer->organizational_unit)
+ cupsFilePutConf(fp, "OrganizationalUnit", printer->organizational_unit);
+
cupsFilePutConf(fp, "DeviceURI", printer->device_uri);
if (printer->port_monitor)
@@ -1498,13 +1483,14 @@ cupsdSaveAllPrinters(void)
{
cupsFilePuts(fp, "State Stopped\n");
- if (printer->state_message)
+ if (printer->state_message[0])
cupsFilePutConf(fp, "StateMessage", printer->state_message);
}
else
cupsFilePuts(fp, "State Idle\n");
cupsFilePrintf(fp, "StateTime %d\n", (int)printer->state_time);
+ cupsFilePrintf(fp, "ConfigTime %d\n", (int)printer->config_time);
for (i = 0; i < printer->num_reasons; i ++)
if (strcmp(printer->reasons[i], "connecting-to-device") &&
@@ -1562,8 +1548,7 @@ cupsdSaveAllPrinters(void)
if (i)
*ptr++ = ',';
- strlcpy(ptr, marker->values[i].string.text,
- value + sizeof(value) - ptr);
+ strlcpy(ptr, marker->values[i].string.text, (size_t)(value + sizeof(value) - ptr));
ptr += strlen(ptr);
}
@@ -1622,8 +1607,7 @@ cupsdSaveAllPrinters(void)
if (i)
*ptr++ = ',';
- strlcpy(ptr, marker->values[i].string.text,
- value + sizeof(value) - ptr);
+ strlcpy(ptr, marker->values[i].string.text, (size_t)(value + sizeof(value) - ptr));
ptr += strlen(ptr);
}
@@ -1643,8 +1627,7 @@ cupsdSaveAllPrinters(void)
if (i)
*ptr++ = ',';
- strlcpy(ptr, marker->values[i].string.text,
- value + sizeof(value) - ptr);
+ strlcpy(ptr, marker->values[i].string.text, (size_t)(value + sizeof(value) - ptr));
ptr += strlen(ptr);
}
@@ -1656,15 +1639,10 @@ cupsdSaveAllPrinters(void)
cupsFilePrintf(fp, "Attribute marker-change-time %ld\n",
(long)printer->marker_time);
- cupsFilePuts(fp, "</Printer>\n");
-
-#ifdef __sgi
- /*
- * Make IRIX desktop & printer status happy
- */
-
- write_irix_state(printer);
-#endif /* __sgi */
+ if (printer == DefaultPrinter)
+ cupsFilePuts(fp, "</DefaultPrinter>\n");
+ else
+ cupsFilePuts(fp, "</Printer>\n");
}
cupsdCloseCreatedConfFile(fp, filename);
@@ -1767,7 +1745,7 @@ cupsdSetAuthInfoRequired(
strcmp(p->auth_info_required[0], "none"))
p->type |= CUPS_PRINTER_AUTHENTICATED;
else
- p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+ p->type &= (cups_ptype_t)~CUPS_PRINTER_AUTHENTICATED;
return (1);
}
@@ -1910,12 +1888,13 @@ void
cupsdSetPrinterAttr(
cupsd_printer_t *p, /* I - Printer */
const char *name, /* I - Attribute name */
- char *value) /* I - Attribute value string */
+ const char *value) /* I - Attribute value string */
{
ipp_attribute_t *attr; /* Attribute */
int i, /* Looping var */
count; /* Number of values */
- char *ptr, /* Pointer into value */
+ char *temp, /* Temporary copy of value string */
+ *ptr, /* Pointer into value */
*start, /* Start of value */
quote; /* Quote character */
ipp_tag_t value_tag; /* Value tag for this attribute */
@@ -1932,10 +1911,21 @@ cupsdSetPrinterAttr(
}
/*
+ * Copy the value string so we can do what we want with it...
+ */
+
+ if ((temp = strdup(value)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to duplicate value for \"%s\" attribute.", name);
+ return;
+ }
+
+ /*
* Count the number of values...
*/
- for (count = 1, quote = '\0', ptr = value;
+ for (count = 1, quote = '\0', ptr = temp;
*ptr;
ptr ++)
{
@@ -1977,21 +1967,22 @@ cupsdSetPrinterAttr(
if (!attr)
{
+ free(temp);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to allocate memory for printer attribute "
"(%d values)", count);
return;
}
- for (i = 0; i < count; i ++)
+ for (i = 0, start = temp; i < count; i ++)
{
- if ((ptr = strchr(value, ',')) != NULL)
+ if ((ptr = strchr(start, ',')) != NULL)
*ptr++ = '\0';
- attr->values[i].integer = strtol(value, NULL, 10);
+ attr->values[i].integer = strtol(start, NULL, 10);
if (ptr)
- value = ptr;
+ start = ptr;
}
}
else
@@ -2027,13 +2018,14 @@ cupsdSetPrinterAttr(
if (!attr)
{
+ free(temp);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to allocate memory for printer attribute "
"(%d values)", count);
return;
}
- for (i = 0, quote = '\0', ptr = value; i < count; i ++)
+ for (i = 0, quote = '\0', ptr = temp; i < count; i ++)
{
for (start = ptr; *ptr; ptr ++)
{
@@ -2062,6 +2054,79 @@ cupsdSetPrinterAttr(
attr->values[i].string.text = _cupsStrAlloc(start);
}
}
+
+ free(temp);
+
+ /*
+ * Update the printer-supply and printer-supply-description, as needed...
+ */
+
+ if (!strcmp(name, "marker-names"))
+ {
+ ipp_attribute_t *supply_desc = ippFindAttribute(p->attrs, "printer-supply-description", IPP_TAG_TEXT);
+ /* printer-supply-description attribute */
+
+ if (supply_desc != NULL)
+ ippDeleteAttribute(p->attrs, supply_desc);
+
+ supply_desc = ippCopyAttribute(p->attrs, attr, 0);
+ ippSetName(p->attrs, &supply_desc, "printer-supply-description");
+ ippSetValueTag(p->attrs, &supply_desc, IPP_TAG_TEXT);
+ }
+ else if (!strcmp(name, "marker-colors") || !strcmp(name, "marker-levels") || !strcmp(name, "marker-types"))
+ {
+ char buffer[256], /* printer-supply values */
+ pstype[64], /* printer-supply type value */
+ *psptr; /* Pointer into type */
+ const char *color, /* marker-colors value */
+ *type; /* marker-types value */
+ int level; /* marker-levels value */
+ ipp_attribute_t *colors = ippFindAttribute(p->attrs, "marker-colors", IPP_TAG_NAME);
+ /* marker-colors attribute */
+ ipp_attribute_t *levels = ippFindAttribute(p->attrs, "marker-levels", IPP_TAG_INTEGER);
+ /* marker-levels attribute */
+ ipp_attribute_t *types = ippFindAttribute(p->attrs, "marker-types", IPP_TAG_KEYWORD);
+ /* marker-types attribute */
+ ipp_attribute_t *supply = ippFindAttribute(p->attrs, "printer-supply", IPP_TAG_STRING);
+ /* printer-supply attribute */
+
+ if (supply != NULL)
+ {
+ ippDeleteAttribute(p->attrs, supply);
+ supply = NULL;
+ }
+
+ if (!colors || !levels || !types)
+ return;
+
+ count = ippGetCount(colors);
+ if (count != ippGetCount(levels) || count != ippGetCount(types))
+ return;
+
+ for (i = 0; i < count; i ++)
+ {
+ color = ippGetString(colors, i, NULL);
+ level = ippGetInteger(levels, i);
+ type = ippGetString(types, i, NULL);
+
+ for (psptr = pstype; *type && psptr < (pstype + sizeof(pstype) - 1); type ++)
+ if (*type == '-')
+ {
+ type ++;
+ *psptr++ = (char)toupper(*type & 255);
+ }
+ else
+ *psptr++ = *type;
+ *psptr = '\0';
+
+ snprintf(buffer, sizeof(buffer), "index=%d;class=%s;type=%s;unit=percent;maxcapacity=100;level=%d;colorantname=%s;", i + 1, strncmp(pstype, "waste", 5) ? "supplyThatIsConsumed" : "receptacleThatIsFilled", pstype, level, color);
+
+ if (!i)
+ supply = ippAddOctetString(p->attrs, IPP_TAG_PRINTER, "printer-supply", buffer, (int)strlen(buffer));
+ else
+ ippSetOctetString(p->attrs, &supply, i, buffer, (int)strlen(buffer));
+ }
+ }
}
@@ -2121,10 +2186,8 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
if ((auth_type = auth->type) == CUPSD_AUTH_DEFAULT)
auth_type = cupsdDefaultAuthType();
- if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST)
+ if (auth_type == CUPSD_AUTH_BASIC)
auth_supported = "basic";
- else if (auth_type == CUPSD_AUTH_DIGEST)
- auth_supported = "digest";
#ifdef HAVE_GSSAPI
else if (auth_type == CUPSD_AUTH_NEGOTIATE)
auth_supported = "negotiate";
@@ -2133,10 +2196,10 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
if (auth_type != CUPSD_AUTH_NONE)
p->type |= CUPS_PRINTER_AUTHENTICATED;
else
- p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+ p->type &= (cups_ptype_t)~CUPS_PRINTER_AUTHENTICATED;
}
else
- p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+ p->type &= (cups_ptype_t)~CUPS_PRINTER_AUTHENTICATED;
/*
* Create the required IPP attributes for a printer...
@@ -2153,10 +2216,15 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
p->name);
ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location",
NULL, p->location ? p->location : "");
+ if (p->geo_location)
+ ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-geo-location", NULL, p->geo_location);
+ else
+ ippAddOutOfBand(p->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location");
ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info",
NULL, p->info ? p->info : "");
- ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL,
- p->uuid);
+ ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-organization", NULL, p->organization ? p->organization : "");
+ ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-organizational-unit", NULL, p->organizational_unit ? p->organizational_unit : "");
+ ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, p->uuid);
if (cupsArrayCount(p->users) > 0)
{
@@ -2172,7 +2240,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
for (i = 0, name = (char *)cupsArrayFirst(p->users);
name;
i ++, name = (char *)cupsArrayNext(p->users))
- attr->values[i].string.text = _cupsStrRetain(name);
+ attr->values[i].string.text = _cupsStrAlloc(name);
}
ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -2215,7 +2283,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
if (p->type & CUPS_PRINTER_CLASS)
{
p->raw = 1;
- p->type &= ~CUPS_PRINTER_OPTIONS;
+ p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS;
/*
* Add class-specific attributes...
@@ -2239,9 +2307,9 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
for (i = 0; i < p->num_printers; i ++)
{
if (attr != NULL)
- attr->values[i].string.text = _cupsStrRetain(p->printers[i]->name);
+ attr->values[i].string.text = _cupsStrAlloc(p->printers[i]->name);
- p->type &= ~CUPS_PRINTER_OPTIONS | p->printers[i]->type;
+ p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS | p->printers[i]->type;
}
}
}
@@ -2339,7 +2407,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
{
for (i = 0; i < oldattr->num_values; i ++)
attr->values[i].string.text =
- _cupsStrRetain(oldattr->values[i].string.text);
+ _cupsStrAlloc(oldattr->values[i].string.text);
}
}
@@ -2393,7 +2461,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
{
for (i = 0; i < oldattr->num_values; i ++)
attr->values[i].string.text =
- _cupsStrRetain(oldattr->values[i].string.text);
+ _cupsStrAlloc(oldattr->values[i].string.text);
}
}
@@ -2406,7 +2474,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
{
for (i = 0; i < oldattr->num_values; i ++)
attr->values[i].string.text =
- _cupsStrRetain(oldattr->values[i].string.text);
+ _cupsStrAlloc(oldattr->values[i].string.text);
}
}
@@ -2435,15 +2503,6 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
add_printer_defaults(p);
-#ifdef __sgi
- /*
- * Write the IRIX printer config and status files...
- */
-
- write_irix_config(p);
- write_irix_state(p);
-#endif /* __sgi */
-
/*
* Let the browse protocols reflect the change
*/
@@ -2539,14 +2598,17 @@ cupsdSetPrinterReasons(
_cupsStrFree(p->reasons[i]);
if (i < p->num_reasons)
- memmove(p->reasons + i, p->reasons + i + 1,
- (p->num_reasons - i) * sizeof(char *));
+ memmove(p->reasons + i, p->reasons + i + 1, (size_t)(p->num_reasons - i) * sizeof(char *));
if (!strcmp(reason, "paused") && p->state == IPP_PRINTER_STOPPED)
cupsdSetPrinterState(p, IPP_PRINTER_IDLE, 1);
+ if (!strcmp(reason, "cups-waiting-for-job-completed") && p->job)
+ p->job->completed = 0;
+
if (strcmp(reason, "connecting-to-device"))
dirty_printer(p);
+
break;
}
}
@@ -2562,10 +2624,6 @@ cupsdSetPrinterReasons(
if (i >= p->num_reasons)
{
- if (!strncmp(reason, "cups-ipp-missing-", 17) ||
- !strncmp(reason, "cups-ipp-wrong-", 15))
- log_ipp_conformance(p, reason);
-
if (i >= (int)(sizeof(p->reasons) / sizeof(p->reasons[0])))
{
cupsdLogMessage(CUPSD_LOG_ALERT,
@@ -2581,6 +2639,9 @@ cupsdSetPrinterReasons(
if (!strcmp(reason, "paused") && p->state != IPP_PRINTER_STOPPED)
cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, 1);
+ if (!strcmp(reason, "cups-waiting-for-job-completed") && p->job)
+ p->job->completed = 1;
+
if (strcmp(reason, "connecting-to-device"))
dirty_printer(p);
}
@@ -2631,10 +2692,6 @@ cupsdSetPrinterState(
*/
p->state_time = time(NULL);
-
-#ifdef __sgi
- write_irix_state(p);
-#endif /* __sgi */
}
/*
@@ -3023,16 +3080,6 @@ cupsdWritePrintcap(void)
cupsd_printer_t *p; /* Current printer */
-#ifdef __sgi
- /*
- * Update the IRIX printer state for the default printer; if
- * no printers remain, then the default printer file will be
- * removed...
- */
-
- write_irix_state(DefaultPrinter);
-#endif /* __sgi */
-
/*
* See if we have a printcap file; if not, don't bother writing it.
*/
@@ -3226,6 +3273,10 @@ add_printer_defaults(cupsd_printer_t *p)/* I - Printer */
cupsArrayAdd(CommonDefaults, _cupsStrAlloc("copies-default"));
cupsArrayAdd(CommonDefaults, _cupsStrAlloc("document-format-default"));
cupsArrayAdd(CommonDefaults, _cupsStrAlloc("finishings-default"));
+ cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-account-id-default"));
+ cupsArrayAdd(CommonDefaults,
+ _cupsStrAlloc("job-accounting-user-id-default"));
+ cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-cancel-after-default"));
cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-hold-until-default"));
cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-priority-default"));
cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-sheets-default"));
@@ -3274,6 +3325,10 @@ add_printer_defaults(cupsd_printer_t *p)/* I - Printer */
ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE,
"document-format-default", NULL, "application/octet-stream");
+ if (!cupsGetOption("job-cancel-after", p->num_options, p->options))
+ ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "job-cancel-after-default", MaxJobTime);
+
if (!cupsGetOption("job-hold-until", p->num_options, p->options))
ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
"job-hold-until-default", NULL, "no-hold");
@@ -3377,7 +3432,7 @@ add_printer_filter(
{
char *ptr; /* Pointer into maxsize(nnnn) program */
- maxsize = strtoll(program + 8, &ptr, 10);
+ maxsize = (size_t)strtoll(program + 8, &ptr, 10);
if (*ptr != ')')
{
@@ -3565,8 +3620,7 @@ add_printer_formats(cupsd_printer_t *p) /* I - Printer */
filter;
filter = (mime_filter_t *)cupsArrayNext(MimeDatabase->filters))
{
- if (filter->dst == p->filetype && filter->filter &&
- strstr(filter->filter, "PrintJobMgr"))
+ if (filter->dst == p->filetype && strstr(filter->filter, "PrintJobMgr"))
break;
}
@@ -3731,7 +3785,8 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
qualities[3]; /* print-quality values */
int num_margins, /* Number of media-*-margin-supported values */
margins[16]; /* media-*-margin-supported values */
- const char *filter; /* Current filter */
+ const char *filter, /* Current filter */
+ *mandatory; /* Current mandatory attribute */
static const char * const sides[3] = /* sides-supported values */
{
"one-sided",
@@ -3787,7 +3842,9 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Loading %s...", ppd_name);
- p->type &= ~CUPS_PRINTER_OPTIONS;
+ cupsdClearString(&(p->make_model));
+
+ p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS;
p->type |= CUPS_PRINTER_BW;
finishings[0] = IPP_FINISHINGS_NONE;
@@ -3803,6 +3860,10 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
p->pc = _ppdCacheCreateWithPPD(ppd);
+ if (!p->pc)
+ cupsdLogMessage(CUPSD_LOG_WARN, "Unable to create cache of \"%s\": %s",
+ ppd_name, cupsLastErrorString());
+
ppdMarkDefaults(ppd);
if (ppd->color_device)
@@ -3815,8 +3876,28 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
if (ppd_attr->value && !_cups_strcasecmp(ppd_attr->value, "true"))
p->type |= CUPS_PRINTER_FAX;
- ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "color-supported",
- ppd->color_device);
+ ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "color-supported", (char)ppd->color_device);
+
+ if (p->pc && p->pc->charge_info_uri)
+ ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
+ "printer-charge-info-uri", NULL, p->pc->charge_info_uri);
+
+ if (p->pc && p->pc->account_id)
+ ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "job-account-id-supported",
+ 1);
+
+ if (p->pc && p->pc->accounting_user_id)
+ ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER,
+ "job-accounting-user-id-supported", 1);
+
+ if (p->pc && p->pc->password)
+ {
+ ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+ "job-password-encryption-supported", NULL, "none");
+ ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "job-password-supported", (int)strlen(p->pc->password));
+ }
+
if (ppd->throughput)
{
ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -3838,6 +3919,9 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
"pages-per-minute-color", 1);
}
+ if ((ppd_attr = ppdFindAttr(ppd, "1284DeviceId", NULL)) != NULL)
+ ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, ppd_attr->value);
+
num_qualities = 0;
if ((output_mode = ppdFindOption(ppd, "OutputMode")) != NULL)
@@ -3906,10 +3990,10 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
if (ppd->num_sizes == 0 || !p->pc)
{
- if (!ppdFindAttr(ppd, "APScannerOnly", NULL))
+ if (!ppdFindAttr(ppd, "APScannerOnly", NULL) && !ppdFindAttr(ppd, "cups3D", NULL))
cupsdLogMessage(CUPSD_LOG_CRIT,
"The PPD file for printer %s contains no media "
- "options and is therefore invalid!", p->name);
+ "options and is therefore invalid.", p->name);
ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
"media-default", NULL, "unknown");
@@ -3973,13 +4057,13 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
for (i = p->pc->num_sizes, pwgsize = p->pc->sizes;
i > 0;
i --, pwgsize ++, val ++)
- val->string.text = _cupsStrRetain(pwgsize->map.pwg);
+ val->string.text = _cupsStrAlloc(pwgsize->map.pwg);
if (p->pc->custom_min_keyword)
{
- val->string.text = _cupsStrRetain(p->pc->custom_min_keyword);
+ val->string.text = _cupsStrAlloc(p->pc->custom_min_keyword);
val ++;
- val->string.text = _cupsStrRetain(p->pc->custom_max_keyword);
+ val->string.text = _cupsStrAlloc(p->pc->custom_max_keyword);
}
}
@@ -4031,7 +4115,7 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
val = attr->values;
i > 0;
i --, pwgsource ++, val ++)
- val->string.text = _cupsStrRetain(pwgsource->pwg);
+ val->string.text = _cupsStrAlloc(pwgsource->pwg);
}
/*
@@ -4047,7 +4131,7 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
val = attr->values;
i > 0;
i --, pwgtype ++, val ++)
- val->string.text = _cupsStrRetain(pwgtype->pwg);
+ val->string.text = _cupsStrAlloc(pwgtype->pwg);
}
/*
@@ -4292,41 +4376,51 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
}
/*
- * output-mode and print-color-mode...
+ * print-color-mode...
*/
if (ppd->color_device)
{
- static const char * const output_modes[] =
+ static const char * const color_modes[] =
{
"monochrome",
"color"
};
ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
- "output-mode-supported", 2, NULL, output_modes);
- ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
- "output-mode-default", NULL, "color");
-
- ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
- "print-color-mode-supported", 2, NULL, output_modes);
+ "print-color-mode-supported", 2, NULL, color_modes);
ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
"print-color-mode-default", NULL, "color");
}
else
{
ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
- "output-mode-supported", NULL, "monochrome");
- ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
- "output-mode-default", NULL, "monochrome");
-
- ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
"print-color-mode-supported", NULL, "monochrome");
ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
"print-color-mode-default", NULL, "monochrome");
}
/*
+ * Mandatory job attributes, if any...
+ */
+
+ if (p->pc && cupsArrayCount(p->pc->mandatory) > 0)
+ {
+ int count = cupsArrayCount(p->pc->mandatory);
+ /* Number of mandatory attributes */
+
+ attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+ "printer-mandatory-job-attributes", count, NULL,
+ NULL);
+
+ for (val = attr->values,
+ mandatory = (char *)cupsArrayFirst(p->pc->mandatory);
+ mandatory;
+ val ++, mandatory = (char *)cupsArrayNext(p->pc->mandatory))
+ val->string.text = _cupsStrAlloc(mandatory);
+ }
+
+ /*
* Printer resolutions...
*/
@@ -4589,6 +4683,13 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
}
/*
+ * 3D printer support...
+ */
+
+ if (ppdFindAttr(ppd, "cups3D", NULL))
+ p->type |= CUPS_PRINTER_3D;
+
+ /*
* Show current and available port monitors for this printer...
*/
@@ -4654,22 +4755,16 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
CGContextRef context; /* The CG context used for resizing */
snprintf(outPath, sizeof(outPath), "%s/%s.png", CacheDir, p->name);
- outUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
- (UInt8 *)outPath,
- strlen(outPath),
- FALSE);
- icnsFileUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
- (UInt8 *)ppd_attr->value,
- strlen(ppd_attr->value),
- FALSE);
+ outUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)outPath, (CFIndex)strlen(outPath), FALSE);
+ icnsFileUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)ppd_attr->value, (CFIndex)strlen(ppd_attr->value), FALSE);
if (outUrl && icnsFileUrl)
{
sourceRef = CGImageSourceCreateWithURL(icnsFileUrl, NULL);
if (sourceRef)
{
- for (i = 0; i < CGImageSourceGetCount(sourceRef); i ++)
+ for (i = 0; i < (int)CGImageSourceGetCount(sourceRef); i ++)
{
- imageRef = CGImageSourceCreateImageAtIndex(sourceRef, i, NULL);
+ imageRef = CGImageSourceCreateImageAtIndex(sourceRef, (size_t)i, NULL);
if (!imageRef)
continue;
@@ -4773,14 +4868,12 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
pstatus = ppdLastError(&pline);
- cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded!",
- p->name);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded.", p->name);
if (pstatus <= PPD_ALLOC_ERROR)
- cupsdLogMessage(CUPSD_LOG_ERROR, "%s", strerror(errno));
+ cupsdLogMessage(CUPSD_LOG_ERROR, "%s: %s", ppd_name, strerror(errno));
else
- cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d.",
- ppdErrorString(pstatus), pline);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d of %s.", ppdErrorString(pstatus), pline, ppd_name);
cupsdLogMessage(CUPSD_LOG_INFO,
"Hint: Run \"cupstestppd %s\" and fix any errors.",
@@ -4902,83 +4995,6 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
/*
- * 'log_ipp_conformance()' - Log an IPP conformance issue with a printer.
- */
-
-static void
-log_ipp_conformance(
- cupsd_printer_t *p, /* I - Printer */
- const char *reason) /* I - Printer state reason */
-{
- const char *message; /* Message to log */
-#ifdef __APPLE__
- aslmsg aslm; /* Apple System Log message */
-#endif /* __APPLE__ */
-
-
- /*
- * Strip the leading "cups-ipp-" from the reason and create a log message for
- * it...
- */
-
- reason += 9;
- if (!strcmp(reason, "missing-cancel-job"))
- message = "Printer does not support REQUIRED Cancel-Job operation.";
- else if (!strcmp(reason, "missing-get-job-attributes"))
- message = "Printer does not support REQUIRED Get-Job-Attributes operation.";
- else if (!strcmp(reason, "missing-print-job"))
- message = "Printer does not support REQUIRED Print-Job operation.";
- else if (!strcmp(reason, "missing-validate-job"))
- message = "Printer does not support REQUIRED Validate-Job operation.";
- else if (!strcmp(reason, "missing-get-printer-attributes"))
- message = "Printer does not support REQUIRED Get-Printer-Attributes operation.";
- else if (!strcmp(reason, "missing-send-document"))
- message = "Printer supports Create-Job but not Send-Document operation.";
- else if (!strcmp(reason, "missing-job-history"))
- message = "Printer does not provide REQUIRED job history.";
- else if (!strcmp(reason, "missing-job-id"))
- message = "Printer does not provide REQUIRED job-id attribute.";
- else if (!strcmp(reason, "missing-job-state"))
- message = "Printer does not provide REQUIRED job-state attribute.";
- else if (!strcmp(reason, "missing-operations-supported"))
- message = "Printer does not provide REQUIRED operations-supported "
- "attribute.";
- else if (!strcmp(reason, "missing-printer-is-accepting-jobs"))
- message = "Printer does not provide REQUIRED printer-is-accepting-jobs "
- "attribute.";
- else if (!strcmp(reason, "missing-printer-state-reasons"))
- message = "Printer does not provide REQUIRED printer-state-reasons "
- "attribute.";
- else if (!strcmp(reason, "wrong-http-version"))
- message = "Printer does not use REQUIRED HTTP/1.1 transport.";
- else
- message = "Unknown IPP conformance failure.";
-
- cupsdLogMessage(CUPSD_LOG_WARN, "%s: %s", p->name, message);
-
-#ifdef __APPLE__
- /*
- * Report the failure information to Apple if the user opts into providing
- * feedback to Apple...
- */
-
- aslm = asl_new(ASL_TYPE_MSG);
- if (aslm)
- {
- asl_set(aslm, "com.apple.message.domain", "com.apple.printing.ipp.conformance");
- asl_set(aslm, "com.apple.message.domain_scope", "com.apple.printing.ipp.conformance");
- asl_set(aslm, "com.apple.message.signature", reason);
- asl_set(aslm, "com.apple.message.signature2",
- p->make_model ? p->make_model : "Unknown");
- asl_log(NULL, aslm, ASL_LEVEL_NOTICE, "%s: %s",
- p->make_model ? p->make_model : "Unknown", message);
- asl_free(aslm);
- }
-#endif /* __APPLE__ */
-}
-
-
-/*
* 'new_media_col()' - Create a media-col collection value.
*/
@@ -5022,261 +5038,6 @@ new_media_col(_pwg_size_t *size, /* I - media-size/margin values */
}
-#ifdef __sgi
-/*
- * 'write_irix_config()' - Update the config files used by the IRIX
- * desktop tools.
- */
-
-static void
-write_irix_config(cupsd_printer_t *p) /* I - Printer to update */
-{
- char filename[1024]; /* Interface script filename */
- cups_file_t *fp; /* Interface script file */
- ipp_attribute_t *attr; /* Attribute data */
-
-
- /*
- * Add dummy interface and GUI scripts to fool SGI's "challenged" printing
- * tools. First the interface script that tells the tools what kind of
- * printer we have...
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name);
-
- if (p->type & CUPS_PRINTER_CLASS)
- unlink(filename);
- else if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- cupsFilePuts(fp, "#!/bin/sh\n");
-
- if ((attr = ippFindAttribute(p->attrs, "printer-make-and-model",
- IPP_TAG_TEXT)) != NULL)
- cupsFilePrintf(fp, "NAME=\"%s\"\n", attr->values[0].string.text);
- else if (p->type & CUPS_PRINTER_CLASS)
- cupsFilePuts(fp, "NAME=\"Printer Class\"\n");
- else
- cupsFilePuts(fp, "NAME=\"Remote Destination\"\n");
-
- if (p->type & CUPS_PRINTER_COLOR)
- cupsFilePuts(fp, "TYPE=ColorPostScript\n");
- else
- cupsFilePuts(fp, "TYPE=MonoPostScript\n");
-
- cupsFilePrintf(fp, "HOSTNAME=%s\n", ServerName);
- cupsFilePrintf(fp, "HOSTPRINTER=%s\n", p->name);
-
- cupsFileClose(fp);
-
- chmod(filename, 0755);
- chown(filename, User, Group);
- }
-
- /*
- * Then the member file that tells which device file the queue is connected
- * to... Networked printers use "/dev/null" in this file, so that's what
- * we use (the actual device URI can confuse some apps...)
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name);
-
- if (p->type & CUPS_PRINTER_CLASS)
- unlink(filename);
- else if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- cupsFilePuts(fp, "/dev/null\n");
-
- cupsFileClose(fp);
-
- chmod(filename, 0644);
- chown(filename, User, Group);
- }
-
- /*
- * The gui_interface file is a script or program that launches a GUI
- * option panel for the printer, using options specified on the
- * command-line in the third argument. The option panel must send
- * any printing options to stdout on a single line when the user
- * accepts them, or nothing if the user cancels the dialog.
- *
- * The default options panel program is /usr/bin/glpoptions, from
- * the ESP Print Pro software. You can select another using the
- * PrintcapGUI option.
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui", p->name);
-
- if (p->type & CUPS_PRINTER_CLASS)
- unlink(filename);
- else if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- cupsFilePuts(fp, "#!/bin/sh\n");
- cupsFilePrintf(fp, "%s -d %s -o \"$3\"\n", PrintcapGUI, p->name);
-
- cupsFileClose(fp);
-
- chmod(filename, 0755);
- chown(filename, User, Group);
- }
-
- /*
- * The POD config file is needed by the printstatus command to show
- * the printer location and device.
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name);
-
- if (p->type & CUPS_PRINTER_CLASS)
- unlink(filename);
- else if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- cupsFilePrintf(fp, "Printer Class | %s\n",
- (p->type & CUPS_PRINTER_COLOR) ? "ColorPostScript" : "MonoPostScript");
- cupsFilePrintf(fp, "Printer Model | %s\n", p->make_model ? p->make_model : "");
- cupsFilePrintf(fp, "Location Code | %s\n", p->location ? p->location : "");
- cupsFilePrintf(fp, "Physical Location | %s\n", p->info ? p->info : "");
- cupsFilePrintf(fp, "Port Path | %s\n", p->device_uri);
- cupsFilePrintf(fp, "Config Path | /var/spool/lp/pod/%s.config\n", p->name);
- cupsFilePrintf(fp, "Active Status Path | /var/spool/lp/pod/%s.status\n", p->name);
- cupsFilePuts(fp, "Status Update Wait | 10 seconds\n");
-
- cupsFileClose(fp);
-
- chmod(filename, 0664);
- chown(filename, User, Group);
- }
-}
-
-
-/*
- * 'write_irix_state()' - Update the status files used by IRIX printing
- * desktop tools.
- */
-
-static void
-write_irix_state(cupsd_printer_t *p) /* I - Printer to update */
-{
- char filename[1024]; /* Interface script filename */
- cups_file_t *fp; /* Interface script file */
- int tag; /* Status tag value */
-
-
- if (p)
- {
- /*
- * The POD status file is needed for the printstatus window to
- * provide the current status of the printer.
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name);
-
- if (p->type & CUPS_PRINTER_CLASS)
- unlink(filename);
- else if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- cupsFilePrintf(fp, "Operational Status | %s\n",
- (p->state == IPP_PRINTER_IDLE) ? "Idle" :
- (p->state == IPP_PRINTER_PROCESSING) ? "Busy" :
- "Faulted");
- cupsFilePrintf(fp, "Information | 01 00 00 | %s\n", CUPS_SVERSION);
- cupsFilePrintf(fp, "Information | 02 00 00 | Device URI: %s\n",
- p->device_uri);
- cupsFilePrintf(fp, "Information | 03 00 00 | %s jobs\n",
- p->accepting ? "Accepting" : "Not accepting");
- cupsFilePrintf(fp, "Information | 04 00 00 | %s\n", p->state_message);
-
- cupsFileClose(fp);
-
- chmod(filename, 0664);
- chown(filename, User, Group);
- }
-
- /*
- * The activeicons file is needed to provide desktop icons for printers:
- *
- * [ quoted from /usr/lib/print/tagit ]
- *
- * --- Type of printer tags (base values)
- *
- * Dumb=66048 # 0x10200
- * DumbColor=66080 # 0x10220
- * Raster=66112 # 0x10240
- * ColorRaster=66144 # 0x10260
- * Plotter=66176 # 0x10280
- * PostScript=66208 # 0x102A0
- * ColorPostScript=66240 # 0x102C0
- * MonoPostScript=66272 # 0x102E0
- *
- * --- Printer state modifiers for local printers
- *
- * Idle=0 # 0x0
- * Busy=1 # 0x1
- * Faulted=2 # 0x2
- * Unknown=3 # 0x3 (Faulted due to unknown reason)
- *
- * --- Printer state modifiers for network printers
- *
- * NetIdle=8 # 0x8
- * NetBusy=9 # 0x9
- * NetFaulted=10 # 0xA
- * NetUnknown=11 # 0xB (Faulted due to unknown reason)
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name);
-
- if (p->type & CUPS_PRINTER_CLASS)
- unlink(filename);
- else if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- if (p->type & CUPS_PRINTER_COLOR)
- tag = 66240;
- else
- tag = 66272;
-
- if (p->type & CUPS_PRINTER_REMOTE)
- tag |= 8;
-
- if (p->state == IPP_PRINTER_PROCESSING)
- tag |= 1;
-
- else if (p->state == IPP_PRINTER_STOPPED)
- tag |= 2;
-
- cupsFilePuts(fp, "#!/bin/sh\n");
- cupsFilePrintf(fp, "#Tag %d\n", tag);
-
- cupsFileClose(fp);
-
- chmod(filename, 0755);
- chown(filename, User, Group);
- }
- }
-
- /*
- * The default file is needed by the printers window to show
- * the default printer.
- */
-
- snprintf(filename, sizeof(filename), "/var/spool/lp/default");
-
- if (DefaultPrinter != NULL)
- {
- if ((fp = cupsFileOpen(filename, "w")) != NULL)
- {
- cupsFilePrintf(fp, "%s\n", DefaultPrinter->name);
-
- cupsFileClose(fp);
-
- chmod(filename, 0644);
- chown(filename, User, Group);
- }
- }
- else
- unlink(filename);
-}
-#endif /* __sgi */
-
-
/*
* 'write_xml_string()' - Write a string with XML escaping.
*/
@@ -5296,7 +5057,7 @@ write_xml_string(cups_file_t *fp, /* I - File to write to */
if (*s == '&')
{
if (s > start)
- cupsFileWrite(fp, start, s - start);
+ cupsFileWrite(fp, start, (size_t)(s - start));
cupsFilePuts(fp, "&amp;");
start = s + 1;
@@ -5304,7 +5065,7 @@ write_xml_string(cups_file_t *fp, /* I - File to write to */
else if (*s == '<')
{
if (s > start)
- cupsFileWrite(fp, start, s - start);
+ cupsFileWrite(fp, start, (size_t)(s - start));
cupsFilePuts(fp, "&lt;");
start = s + 1;
@@ -5317,5 +5078,5 @@ write_xml_string(cups_file_t *fp, /* I - File to write to */
/*
- * End of "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: printers.c 12733 2015-06-12 01:21:05Z msweet $".
*/
diff --git a/scheduler/printers.h b/scheduler/printers.h
index ad89d70..27db750 100644
--- a/scheduler/printers.h
+++ b/scheduler/printers.h
@@ -1,16 +1,16 @@
/*
- * "$Id: printers.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: printers.h 12666 2015-05-25 19:38:09Z msweet $"
*
- * Printer definitions for the CUPS scheduler.
+ * Printer definitions for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#ifdef HAVE_DNSSD
@@ -63,9 +63,12 @@ struct cupsd_printer_s
*uuid, /* Printer UUID */
*hostname, /* Host printer resides on */
*name, /* Printer name */
- *location, /* Location code */
+ *location, /* Location string */
+ *geo_location, /* Geographic location URI */
*make_model, /* Make and model */
*info, /* Description */
+ *organization, /* Organization name */
+ *organizational_unit, /* Organizational unit (department, etc.) */
*op_policy, /* Operation policy name */
*error_policy; /* Error policy */
cupsd_policy_t *op_policy_ptr; /* Pointer to operation policy */
@@ -77,7 +80,8 @@ struct cupsd_printer_s
char state_message[1024]; /* Printer state message */
int num_reasons; /* Number of printer-state-reasons */
char *reasons[64]; /* printer-state-reasons strings */
- time_t state_time; /* Time at this state */
+ time_t config_time, /* Time at this configuration */
+ state_time; /* Time at this state */
char *job_sheets[2]; /* Banners/job sheets */
cups_ptype_t type; /* Printer type (color, small, etc.) */
char *device_uri; /* Device URI */
@@ -166,7 +170,8 @@ extern int cupsdSetAuthInfoRequired(cupsd_printer_t *p,
ipp_attribute_t *attr);
extern void cupsdSetDeviceURI(cupsd_printer_t *p, const char *uri);
extern void cupsdSetPrinterAttr(cupsd_printer_t *p,
- const char *name, char *value);
+ const char *name,
+ const char *value);
extern void cupsdSetPrinterAttrs(cupsd_printer_t *p);
extern int cupsdSetPrinterReasons(cupsd_printer_t *p,
const char *s);
@@ -189,5 +194,5 @@ extern void cupsdWritePrintcap(void);
/*
- * End of "$Id: printers.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: printers.h 12666 2015-05-25 19:38:09Z msweet $".
*/
diff --git a/scheduler/process.c b/scheduler/process.c
index a706ac2..19c7472 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -1,26 +1,16 @@
/*
- * "$Id: process.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: process.c 12521 2015-02-17 20:00:17Z msweet $"
*
- * Process management routines for the CUPS scheduler.
+ * Process management routines for the CUPS scheduler.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdCreateProfile() - Create an execution profile for a subprocess.
- * cupsdDestroyProfile() - Delete an execution profile.
- * cupsdEndProcess() - End a process.
- * cupsdFinishProcess() - Finish a process and get its name.
- * cupsdStartProcess() - Start a process.
- * compare_procs() - Compare two processes.
- * cupsd_requote() - Make a regular-expression version of a string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -32,6 +22,19 @@
#ifdef __APPLE__
# include <libgen.h>
#endif /* __APPLE__ */
+#ifdef HAVE_POSIX_SPAWN
+# include <spawn.h>
+extern char **environ;
+#endif /* HAVE_POSIX_SPAWN */
+#ifdef HAVE_POSIX_SPAWN
+# if !defined(__OpenBSD__) || OpenBSD >= 201505
+# define USE_POSIX_SPAWN 1
+# else
+# define USE_POSIX_SPAWN 0
+# endif /* !__OpenBSD__ || */
+#else
+# define USE_POSIX_SPAWN 0
+#endif /* HAVE_POSIX_SPAWN */
/*
@@ -68,34 +71,37 @@ static char *cupsd_requote(char *dst, const char *src, size_t dstsize);
*/
void * /* O - Profile or NULL on error */
-cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */
+cupsdCreateProfile(int job_id, /* I - Job ID or 0 for none */
+ int allow_networking)/* I - Allow networking off machine? */
{
#ifdef HAVE_SANDBOX_H
- cups_file_t *fp; /* File pointer */
- char profile[1024], /* File containing the profile */
- cache[1024], /* Quoted CacheDir */
- request[1024], /* Quoted RequestRoot */
- root[1024], /* Quoted ServerRoot */
- temp[1024]; /* Quoted TempDir */
- const char *nodebug; /* " (with no-log)" for no debug */
-
-
- if (!UseProfiles)
+ cups_file_t *fp; /* File pointer */
+ char profile[1024], /* File containing the profile */
+ bin[1024], /* Quoted ServerBin */
+ cache[1024], /* Quoted CacheDir */
+ domain[1024], /* Domain socket, if any */
+ request[1024], /* Quoted RequestRoot */
+ root[1024], /* Quoted ServerRoot */
+ state[1024], /* Quoted StateDir */
+ temp[1024]; /* Quoted TempDir */
+ const char *nodebug; /* " (with no-log)" for no debug */
+ cupsd_listener_t *lis; /* Current listening socket */
+
+
+ if (!UseSandboxing || Sandboxing == CUPSD_SANDBOXING_OFF)
{
/*
* Only use sandbox profiles as root...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
- job_id);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d, allow_networking=%d) = NULL", job_id, allow_networking);
return (NULL);
}
if ((fp = cupsTempFile2(profile, sizeof(profile))) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
- job_id);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d, allow_networking=%d) = NULL", job_id, allow_networking);
cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create security profile: %s",
strerror(errno));
return (NULL);
@@ -104,22 +110,29 @@ cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */
fchown(cupsFileNumber(fp), RunUser, Group);
fchmod(cupsFileNumber(fp), 0640);
+ cupsd_requote(bin, ServerBin, sizeof(bin));
cupsd_requote(cache, CacheDir, sizeof(cache));
cupsd_requote(request, RequestRoot, sizeof(request));
cupsd_requote(root, ServerRoot, sizeof(root));
+ cupsd_requote(state, StateDir, sizeof(state));
cupsd_requote(temp, TempDir, sizeof(temp));
nodebug = LogLevel < CUPSD_LOG_DEBUG ? " (with no-log)" : "";
cupsFilePuts(fp, "(version 1)\n");
- cupsFilePuts(fp, "(allow default)\n");
- cupsFilePrintf(fp,
- "(deny file-write* file-read-data file-read-metadata\n"
- " (regex"
- " #\"^%s$\"" /* RequestRoot */
- " #\"^%s/\"" /* RequestRoot/... */
- ")%s)\n",
- request, request, nodebug);
+ if (Sandboxing == CUPSD_SANDBOXING_STRICT)
+ cupsFilePuts(fp, "(deny default)\n");
+ else
+ cupsFilePuts(fp, "(allow default)\n");
+ if (LogLevel >= CUPSD_LOG_DEBUG)
+ cupsFilePuts(fp, "(debug deny)\n");
+ cupsFilePuts(fp, "(import \"system.sb\")\n");
+ cupsFilePuts(fp, "(system-network)\n");
+ cupsFilePuts(fp, "(allow mach-per-user-lookup)\n");
+ cupsFilePuts(fp, "(allow ipc-posix-sem)\n");
+ cupsFilePuts(fp, "(allow ipc-posix-shm)\n");
+ cupsFilePuts(fp, "(allow ipc-sysv-shm)\n");
+ cupsFilePuts(fp, "(allow mach-lookup)\n");
if (!RunUser)
cupsFilePrintf(fp,
"(deny file-write* file-read-data file-read-metadata\n"
@@ -142,13 +155,43 @@ cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */
" #\"^/System/\""
")%s)\n",
root, root, nodebug);
- /* Specifically allow applications to stat RequestRoot */
+ /* Specifically allow applications to stat RequestRoot and some other system folders */
cupsFilePrintf(fp,
"(allow file-read-metadata\n"
" (regex"
+ " #\"^/$\"" /* / */
+ " #\"^/usr$\"" /* /usr */
+ " #\"^/Library$\"" /* /Library */
+ " #\"^/Library/Printers$\"" /* /Library/Printers */
" #\"^%s$\"" /* RequestRoot */
"))\n",
request);
+ /* Read and write TempDir, CacheDir, and other common folders */
+ cupsFilePuts(fp,
+ "(allow file-write* file-read-data file-read-metadata\n"
+ " (regex"
+ " #\"^/private/var/db/\""
+ " #\"^/private/var/folders/\""
+ " #\"^/private/var/lib/\""
+ " #\"^/private/var/log/\""
+ " #\"^/private/var/mysql/\""
+ " #\"^/private/var/run/\""
+ " #\"^/private/var/spool/\""
+ " #\"^/Library/Application Support/\""
+ " #\"^/Library/Caches/\""
+ " #\"^/Library/Logs/\""
+ " #\"^/Library/Preferences/\""
+ " #\"^/Library/WebServer/\""
+ " #\"^/Users/Shared/\""
+ "))\n");
+ cupsFilePrintf(fp,
+ "(deny file-write*\n"
+ " (regex #\"^%s$\")%s)\n",
+ request, nodebug);
+ cupsFilePrintf(fp,
+ "(deny file-write* file-read-data file-read-metadata\n"
+ " (regex #\"^%s/\")%s)\n",
+ request, nodebug);
cupsFilePrintf(fp,
"(allow file-write* file-read-data file-read-metadata\n"
" (regex"
@@ -156,56 +199,160 @@ cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */
" #\"^%s/\"" /* TempDir/... */
" #\"^%s$\"" /* CacheDir */
" #\"^%s/\"" /* CacheDir/... */
+ " #\"^%s$\"" /* StateDir */
+ " #\"^%s/\"" /* StateDir/... */
+ "))\n",
+ temp, temp, cache, cache, state, state);
+ /* Read common folders */
+ cupsFilePrintf(fp,
+ "(allow file-read-data file-read-metadata\n"
+ " (regex"
+ " #\"^/AppleInternal$\""
+ " #\"^/AppleInternal/\""
+ " #\"^/bin$\"" /* /bin */
+ " #\"^/bin/\"" /* /bin/... */
+ " #\"^/private$\""
+ " #\"^/private/etc$\""
+ " #\"^/private/etc/\""
+ " #\"^/private/tmp$\""
+ " #\"^/private/tmp/\""
+ " #\"^/private/var$\""
+ " #\"^/private/var/db$\""
+ " #\"^/private/var/folders$\""
+ " #\"^/private/var/lib$\""
+ " #\"^/private/var/log$\""
+ " #\"^/private/var/mysql$\""
+ " #\"^/private/var/run$\""
+ " #\"^/private/var/spool$\""
+ " #\"^/private/var/tmp$\""
+ " #\"^/private/var/tmp/\""
+ " #\"^/usr/bin$\"" /* /usr/bin */
+ " #\"^/usr/bin/\"" /* /usr/bin/... */
+ " #\"^/usr/libexec/cups$\"" /* /usr/libexec/cups */
+ " #\"^/usr/libexec/cups/\"" /* /usr/libexec/cups/... */
+ " #\"^/usr/libexec/fax$\"" /* /usr/libexec/fax */
+ " #\"^/usr/libexec/fax/\"" /* /usr/libexec/fax/... */
+ " #\"^/usr/sbin$\"" /* /usr/sbin */
+ " #\"^/usr/sbin/\"" /* /usr/sbin/... */
+ " #\"^/Library$\"" /* /Library */
+ " #\"^/Library/\"" /* /Library/... */
+ " #\"^/System$\"" /* /System */
+ " #\"^/System/\"" /* /System/... */
" #\"^%s/Library$\"" /* RequestRoot/Library */
" #\"^%s/Library/\"" /* RequestRoot/Library/... */
- " #\"^/Library/Application Support/\""
- " #\"^/Library/Caches/\""
- " #\"^/Library/Preferences/\""
- " #\"^/Library/Printers/.*/\""
- " #\"^/Users/Shared/\""
+ " #\"^%s$\"" /* ServerBin */
+ " #\"^%s/\"" /* ServerBin/... */
+ " #\"^%s$\"" /* ServerRoot */
+ " #\"^%s/\"" /* ServerRoot/... */
"))\n",
- temp, temp, cache, cache, request, request);
- cupsFilePrintf(fp,
- "(deny file-write*\n"
+ request, request, bin, bin, root, root);
+ if (Sandboxing == CUPSD_SANDBOXING_RELAXED)
+ {
+ /* Limited write access to /Library/Printers/... */
+ cupsFilePuts(fp,
+ "(allow file-write*\n"
" (regex"
- " #\"^/Library/Printers/PPDs$\""
- " #\"^/Library/Printers/PPDs/\""
- " #\"^/Library/Printers/PPD Plugins$\""
- " #\"^/Library/Printers/PPD Plugins/\""
- ")%s)\n", nodebug);
- if (job_id)
+ " #\"^/Library/Printers/.*/\""
+ "))\n");
+ cupsFilePrintf(fp,
+ "(deny file-write*\n"
+ " (regex"
+ " #\"^/Library/Printers/PPDs$\""
+ " #\"^/Library/Printers/PPDs/\""
+ " #\"^/Library/Printers/PPD Plugins$\""
+ " #\"^/Library/Printers/PPD Plugins/\""
+ ")%s)\n", nodebug);
+ }
+ /* Allow execution of child processes as long as the programs are not in a user directory */
+ cupsFilePuts(fp, "(allow process*)\n");
+ cupsFilePuts(fp, "(deny process-exec (regex #\"^/Users/\"))\n");
+ if (RunUser && getenv("CUPS_TESTROOT"))
{
- /*
- * Allow job filters to read the spool file(s)...
- */
+ /* Allow source directory access in "make test" environment */
+ char testroot[1024]; /* Root directory of test files */
+
+ cupsd_requote(testroot, getenv("CUPS_TESTROOT"), sizeof(testroot));
cupsFilePrintf(fp,
+ "(allow file-write* file-read-data file-read-metadata\n"
+ " (regex"
+ " #\"^%s$\"" /* CUPS_TESTROOT */
+ " #\"^%s/\"" /* CUPS_TESTROOT/... */
+ "))\n",
+ testroot, testroot);
+ cupsFilePrintf(fp,
+ "(allow process-exec\n"
+ " (regex"
+ " #\"^%s/\"" /* CUPS_TESTROOT/... */
+ "))\n",
+ testroot);
+ cupsFilePrintf(fp, "(allow sysctl*)\n");
+ }
+ if (job_id)
+ {
+ /* Allow job filters to read the current job files... */
+ cupsFilePrintf(fp,
"(allow file-read-data file-read-metadata\n"
- " (regex #\"^%s/([ac]%05d|d%05d-[0-9][0-9][0-9])$\"))\n",
+ " (regex #\"^%s/([ac]%05d|d%05d-[0-9][0-9][0-9])$\"))\n",
request, job_id, job_id);
}
else
{
- /*
- * Allow email notifications from notifiers...
- */
-
+ /* Allow email notifications from notifiers... */
cupsFilePuts(fp,
"(allow process-exec\n"
" (literal \"/usr/sbin/sendmail\")\n"
- " (with no-sandbox)\n"
- ")\n");
+ " (with no-sandbox))\n");
+ }
+ /* Allow access to Bluetooth, USB, and notify_post. */
+ cupsFilePuts(fp, "(allow iokit*)\n");
+ cupsFilePuts(fp, "(allow distributed-notification-post)\n");
+ /* Allow outbound networking to local services */
+ cupsFilePuts(fp, "(allow network-outbound"
+ "\n (regex #\"^/private/var/run/\" #\"^/private/tmp/\" #\"^/private/var/tmp/\")");
+ for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+ lis;
+ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+ {
+ if (httpAddrFamily(&(lis->address)) == AF_LOCAL)
+ {
+ httpAddrString(&(lis->address), domain, sizeof(domain));
+ cupsFilePrintf(fp, "\n (literal \"%s\")", domain);
+ }
+ }
+ if (allow_networking)
+ {
+ /* Allow TCP and UDP networking off the machine... */
+ cupsFilePuts(fp, "\n (remote tcp))\n");
+ cupsFilePuts(fp, "(allow network-bind)\n"); /* for LPD resvport */
+ cupsFilePuts(fp, "(allow network*\n"
+ " (local udp \"*:*\")\n"
+ " (remote udp \"*:*\"))\n");
+
+ /* Also allow access to device files... */
+ cupsFilePuts(fp, "(allow file-write* file-read-data file-read-metadata file-ioctl\n"
+ " (regex #\"^/dev/\"))\n");
+
+ /* And allow kernel extensions to be loaded, e.g., SMB */
+ cupsFilePuts(fp, "(allow system-kext-load)\n");
+ }
+ else
+ {
+ /* Only allow SNMP (UDP) and LPD (TCP) off the machine... */
+ cupsFilePuts(fp, ")\n");
+ cupsFilePuts(fp, "(allow network-outbound\n"
+ " (remote udp \"*:161\")"
+ " (remote tcp \"*:515\"))\n");
+ cupsFilePuts(fp, "(allow network-inbound\n"
+ " (local udp \"localhost:*\"))\n");
}
-
cupsFileClose(fp);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = \"%s\"",
- job_id, profile);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d,allow_networking=%d) = \"%s\"", job_id, allow_networking, profile);
return ((void *)strdup(profile));
#else
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
- job_id);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d, allow_networking=%d) = NULL", job_id, allow_networking);
return (NULL);
#endif /* HAVE_SANDBOX_H */
@@ -268,10 +415,10 @@ cupsdEndProcess(int pid, /* I - Process ID */
*/
const char * /* O - Process name */
-cupsdFinishProcess(int pid, /* I - Process ID */
- char *name, /* I - Name buffer */
- int namelen, /* I - Size of name buffer */
- int *job_id) /* O - Job ID pointer or NULL */
+cupsdFinishProcess(int pid, /* I - Process ID */
+ char *name, /* I - Name buffer */
+ size_t namelen, /* I - Size of name buffer */
+ int *job_id) /* O - Job ID pointer or NULL */
{
cupsd_proc_t key, /* Search key */
*proc; /* Matching process */
@@ -296,10 +443,7 @@ cupsdFinishProcess(int pid, /* I - Process ID */
strlcpy(name, "unknown", namelen);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdFinishProcess(pid=%d, name=%p, namelen=%d, "
- "job_id=%p(%d)) = \"%s\"", pid, name, namelen, job_id,
- job_id ? *job_id : 0, name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFinishProcess(pid=%d, name=%p, namelen=" CUPS_LLFMT ", job_id=%p(%d)) = \"%s\"", pid, name, CUPS_LLCAST namelen, job_id, job_id ? *job_id : 0, name);
return (name);
}
@@ -326,13 +470,20 @@ cupsdStartProcess(
{
int i; /* Looping var */
const char *exec_path = command; /* Command to be exec'd */
- char *real_argv[103], /* Real command-line arguments */
- cups_exec[1024]; /* Path to "cups-exec" program */
- int user; /* Command UID */
+ char *real_argv[110], /* Real command-line arguments */
+ cups_exec[1024], /* Path to "cups-exec" program */
+ user_str[16], /* User string */
+ group_str[16], /* Group string */
+ nice_str[16]; /* FilterNice string */
+ uid_t user; /* Command UID */
cupsd_proc_t *proc; /* New process record */
-#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+#if USE_POSIX_SPAWN
+ posix_spawn_file_actions_t actions; /* Spawn file actions */
+ posix_spawnattr_t attrs; /* Spawn attributes */
+ sigset_t defsignals; /* Default signals */
+#elif defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* POSIX signal handler */
-#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+#endif /* USE_POSIX_SPAWN */
#if defined(__APPLE__)
char processPath[1024], /* CFProcessPath environment variable */
linkpath[1024]; /* Link path for symlinks... */
@@ -396,25 +547,107 @@ cupsdStartProcess(
* Use helper program when we have a sandbox profile...
*/
+#if !USE_POSIX_SPAWN
if (profile)
+#endif /* !USE_POSIX_SPAWN */
{
snprintf(cups_exec, sizeof(cups_exec), "%s/daemon/cups-exec", ServerBin);
+ snprintf(user_str, sizeof(user_str), "%d", user);
+ snprintf(group_str, sizeof(group_str), "%d", Group);
+ snprintf(nice_str, sizeof(nice_str), "%d", FilterNice);
real_argv[0] = cups_exec;
- real_argv[1] = profile;
- real_argv[2] = (char *)command;
+ real_argv[1] = (char *)"-g";
+ real_argv[2] = group_str;
+ real_argv[3] = (char *)"-n";
+ real_argv[4] = nice_str;
+ real_argv[5] = (char *)"-u";
+ real_argv[6] = user_str;
+ real_argv[7] = profile ? profile : "none";
+ real_argv[8] = (char *)command;
for (i = 0;
- i < (int)(sizeof(real_argv) / sizeof(real_argv[0]) - 4) && argv[i];
+ i < (int)(sizeof(real_argv) / sizeof(real_argv[0]) - 10) && argv[i];
i ++)
- real_argv[i + 3] = argv[i];
+ real_argv[i + 9] = argv[i];
- real_argv[i + 3] = NULL;
+ real_argv[i + 9] = NULL;
argv = real_argv;
exec_path = cups_exec;
}
+ if (LogLevel == CUPSD_LOG_DEBUG2)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Preparing to start \"%s\", arguments:", command);
+
+ for (i = 0; argv[i]; i ++)
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: argv[%d] = \"%s\"", i, argv[i]);
+ }
+
+#if USE_POSIX_SPAWN
+ /*
+ * Setup attributes and file actions for the spawn...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Setting spawn attributes.");
+ sigemptyset(&defsignals);
+ sigaddset(&defsignals, SIGTERM);
+ sigaddset(&defsignals, SIGCHLD);
+ sigaddset(&defsignals, SIGPIPE);
+
+ posix_spawnattr_init(&attrs);
+ posix_spawnattr_setflags(&attrs, POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_SETSIGDEF);
+ posix_spawnattr_setpgroup(&attrs, 0);
+ posix_spawnattr_setsigdefault(&attrs, &defsignals);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Setting file actions.");
+ posix_spawn_file_actions_init(&actions);
+ if (infd != 0)
+ {
+ if (infd < 0)
+ posix_spawn_file_actions_addopen(&actions, 0, "/dev/null", O_RDONLY, 0);
+ else
+ posix_spawn_file_actions_adddup2(&actions, infd, 0);
+ }
+
+ if (outfd != 1)
+ {
+ if (outfd < 0)
+ posix_spawn_file_actions_addopen(&actions, 1, "/dev/null", O_WRONLY, 0);
+ else
+ posix_spawn_file_actions_adddup2(&actions, outfd, 1);
+ }
+
+ if (errfd != 2)
+ {
+ if (errfd < 0)
+ posix_spawn_file_actions_addopen(&actions, 2, "/dev/null", O_WRONLY, 0);
+ else
+ posix_spawn_file_actions_adddup2(&actions, errfd, 2);
+ }
+
+ if (backfd != 3 && backfd >= 0)
+ posix_spawn_file_actions_adddup2(&actions, backfd, 3);
+
+ if (sidefd != 4 && sidefd >= 0)
+ posix_spawn_file_actions_adddup2(&actions, sidefd, 4);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Calling posix_spawn.");
+
+ if (posix_spawn(pid, exec_path, &actions, &attrs, argv, envp ? envp : environ))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to fork %s - %s.", command, strerror(errno));
+
+ *pid = 0;
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: pid=%d", (int)*pid);
+
+ posix_spawn_file_actions_destroy(&actions);
+ posix_spawnattr_destroy(&attrs);
+
+#else
/*
* Block signals before forking...
*/
@@ -444,13 +677,13 @@ cupsdStartProcess(
* processes it creates.
*/
-#ifdef HAVE_SETPGID
+# ifdef HAVE_SETPGID
if (!RunUser && setpgid(0, 0))
exit(errno + 100);
-#else
+# else
if (!RunUser && setpgrp())
exit(errno + 100);
-#endif /* HAVE_SETPGID */
+# endif /* HAVE_SETPGID */
/*
* Update the remaining file descriptors as needed...
@@ -529,11 +762,11 @@ cupsdStartProcess(
* Unblock signals before doing the exec...
*/
-#ifdef HAVE_SIGSET
+# ifdef HAVE_SIGSET
sigset(SIGTERM, SIG_DFL);
sigset(SIGCHLD, SIG_DFL);
sigset(SIGPIPE, SIG_DFL);
-#elif defined(HAVE_SIGACTION)
+# elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
@@ -542,11 +775,11 @@ cupsdStartProcess(
sigaction(SIGTERM, &action, NULL);
sigaction(SIGCHLD, &action, NULL);
sigaction(SIGPIPE, &action, NULL);
-#else
+# else
signal(SIGTERM, SIG_DFL);
signal(SIGCHLD, SIG_DFL);
signal(SIGPIPE, SIG_DFL);
-#endif /* HAVE_SIGSET */
+# endif /* HAVE_SIGSET */
cupsdReleaseSignals();
@@ -573,7 +806,11 @@ cupsdStartProcess(
*pid = 0;
}
- else
+
+ cupsdReleaseSignals();
+#endif /* USE_POSIX_SPAWN */
+
+ if (*pid)
{
if (!process_array)
process_array = cupsArrayNew((cups_array_func_t)compare_procs, NULL);
@@ -591,8 +828,6 @@ cupsdStartProcess(
}
}
- cupsdReleaseSignals();
-
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, "
"infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, "
@@ -638,10 +873,13 @@ cupsd_requote(char *dst, /* I - Destination buffer */
{
ch = *src++;
+ if (ch == '/' && !*src)
+ break; /* Don't add trailing slash */
+
if (strchr(".?*()[]^$\\", ch))
*dstptr++ = '\\';
- *dstptr++ = ch;
+ *dstptr++ = (char)ch;
}
*dstptr = '\0';
@@ -652,5 +890,5 @@ cupsd_requote(char *dst, /* I - Destination buffer */
/*
- * End of "$Id: process.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: process.c 12521 2015-02-17 20:00:17Z msweet $".
*/
diff --git a/scheduler/quotas.c b/scheduler/quotas.c
index 3ebfd8d..ae8b88f 100644
--- a/scheduler/quotas.c
+++ b/scheduler/quotas.c
@@ -1,5 +1,5 @@
/*
- * "$Id: quotas.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: quotas.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Quota routines for the CUPS scheduler.
*
@@ -240,5 +240,5 @@ compare_quotas(const cupsd_quota_t *q1, /* I - First quota record */
/*
- * End of "$Id: quotas.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: quotas.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/select.c b/scheduler/select.c
index e2f40d8..357cc40 100644
--- a/scheduler/select.c
+++ b/scheduler/select.c
@@ -1,28 +1,16 @@
/*
- * "$Id: select.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: select.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * Select abstraction functions for the CUPS scheduler.
+ * Select abstraction functions for the CUPS scheduler.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddSelect() - Add a file descriptor to the list.
- * cupsdDoSelect() - Do a select-like operation.
- * cupsdIsSelecting() - Determine whether we are monitoring a file
- * descriptor.
- * cupsdRemoveSelect() - Remove a file descriptor from the list.
- * cupsdStartSelect() - Initialize the file polling engine.
- * cupsdStopSelect() - Shutdown the file polling engine.
- * compare_fds() - Compare file descriptors.
- * find_fd() - Find an existing file descriptor record.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -39,8 +27,6 @@
# include <sys/time.h>
#elif defined(HAVE_POLL)
# include <poll.h>
-#elif defined(__hpux)
-# include <sys/time.h>
#else
# include <sys/select.h>
#endif /* HAVE_EPOLL */
@@ -49,15 +35,14 @@
/*
* Design Notes for Poll/Select API in CUPSD
* -----------------------------------------
- *
+ *
* SUPPORTED APIS
- *
+ *
* OS select poll epoll kqueue /dev/poll
* -------------- ------ ------ ------ ------ ---------
* AIX YES YES NO NO NO
* FreeBSD YES YES NO YES NO
* HP-UX YES YES NO NO NO
- * IRIX YES YES NO NO NO
* Linux YES YES YES NO NO
* MacOS X YES YES NO YES NO
* NetBSD YES YES NO YES NO
@@ -65,22 +50,22 @@
* Solaris YES YES NO NO YES
* Tru64 YES YES NO NO NO
* Windows YES NO NO NO NO
- *
- *
+ *
+ *
* HIGH-LEVEL API
- *
+ *
* typedef void (*cupsd_selfunc_t)(void *data);
- *
+ *
* void cupsdStartSelect(void);
* void cupsdStopSelect(void);
* void cupsdAddSelect(int fd, cupsd_selfunc_t read_cb,
* cupsd_selfunc_t write_cb, void *data);
* void cupsdRemoveSelect(int fd);
* int cupsdDoSelect(int timeout);
- *
- *
+ *
+ *
* IMPLEMENTATION STRATEGY
- *
+ *
* 0. Common Stuff
* a. CUPS array of file descriptor to callback functions
* and data + temporary array of removed fd's.
@@ -103,7 +88,7 @@
* working sets.
* d. cupsdStopSelect() frees all of the memory used by the
* CUPS array and fd_set's.
- *
+ *
* 2. poll() - O(n log n)
* a. Regular array of pollfd, sorted the same as the CUPS
* array.
@@ -117,7 +102,7 @@
* e. cupsdRemoveSelect() flags the pollfd array as invalid.
* f. cupsdStopSelect() frees all of the memory used by the
* CUPS array and pollfd array.
- *
+ *
* 3. epoll() - O(n)
* a. cupsdStartSelect() creates epoll file descriptor using
* epoll_create() with the maximum fd count, and
@@ -133,7 +118,7 @@
* the callback record.
* d. cupsdStopSelect() closes the epoll file descriptor and
* frees all of the memory used by the event buffer.
- *
+ *
* 4. kqueue() - O(n)
* b. cupsdStartSelect() creates kqueue file descriptor
* using kqueue() function and allocates a global event
@@ -146,7 +131,7 @@
* find the callback record.
* e. cupsdStopSelect() closes the kqueue() file descriptor
* and frees all of the memory used by the event buffer.
- *
+ *
* 5. /dev/poll - O(n log n) - NOT YET IMPLEMENTED
* a. cupsdStartSelect() opens /dev/poll and allocates an
* array of pollfd structs; on failure to open /dev/poll,
@@ -533,15 +518,13 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */
if (cupsd_pollfds)
- pfd = realloc(cupsd_pollfds, allocfds * sizeof(struct pollfd));
+ pfd = realloc(cupsd_pollfds, (size_t)allocfds * sizeof(struct pollfd));
else
- pfd = malloc(allocfds * sizeof(struct pollfd));
+ pfd = malloc((size_t)allocfds * sizeof(struct pollfd));
if (!pfd)
{
- cupsdLogMessage(CUPSD_LOG_EMERG,
- "Unable to allocate %d bytes for polling!",
- (int)(allocfds * sizeof(struct pollfd)));
+ cupsdLogMessage(CUPSD_LOG_EMERG, "Unable to allocate %d bytes for polling.", (int)((size_t)allocfds * sizeof(struct pollfd)));
return (-1);
}
@@ -570,9 +553,9 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */
}
if (timeout >= 0 && timeout < 86400)
- nfds = poll(cupsd_pollfds, count, timeout * 1000);
+ nfds = poll(cupsd_pollfds, (nfds_t)count, timeout * 1000);
else
- nfds = poll(cupsd_pollfds, count, -1);
+ nfds = poll(cupsd_pollfds, (nfds_t)count, -1);
if (nfds > 0)
{
@@ -813,7 +796,7 @@ cupsdRemoveSelect(int fd) /* I - File descriptor */
void
cupsdStartSelect(void)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSelect()");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdStartSelect()");
cupsd_fds = cupsArrayNew((cups_array_func_t)compare_fds, NULL);
@@ -823,13 +806,13 @@ cupsdStartSelect(void)
#ifdef HAVE_EPOLL
cupsd_epoll_fd = epoll_create(MaxFDs);
- cupsd_epoll_events = calloc(MaxFDs, sizeof(struct epoll_event));
+ cupsd_epoll_events = calloc((size_t)MaxFDs, sizeof(struct epoll_event));
cupsd_update_pollfds = 0;
#elif defined(HAVE_KQUEUE)
cupsd_kqueue_fd = kqueue();
cupsd_kqueue_changes = 0;
- cupsd_kqueue_events = calloc(MaxFDs, sizeof(struct kevent));
+ cupsd_kqueue_events = calloc((size_t)MaxFDs, sizeof(struct kevent));
#elif defined(HAVE_POLL)
cupsd_update_pollfds = 0;
@@ -851,7 +834,7 @@ cupsdStopSelect(void)
_cupsd_fd_t *fdptr; /* Current file descriptor */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSelect()");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdStopSelect()");
for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds);
fdptr;
@@ -947,5 +930,5 @@ find_fd(int fd) /* I - File descriptor */
/*
- * End of "$Id: select.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: select.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/scheduler/server.c b/scheduler/server.c
index 7e511c4..37001de 100644
--- a/scheduler/server.c
+++ b/scheduler/server.c
@@ -1,5 +1,5 @@
/*
- * "$Id: server.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: server.c 12689 2015-06-03 19:49:54Z msweet $"
*
* Server start/stop routines for the CUPS scheduler.
*
@@ -54,7 +54,7 @@ cupsdStartServer(void)
* Create the default security profile...
*/
- DefaultProfile = cupsdCreateProfile(0);
+ DefaultProfile = cupsdCreateProfile(0, 1);
/*
* Startup all the networking stuff...
@@ -142,21 +142,24 @@ cupsdStopServer(void)
if (AccessFile != NULL)
{
- cupsFileClose(AccessFile);
+ if (AccessFile != LogStderr)
+ cupsFileClose(AccessFile);
AccessFile = NULL;
}
if (ErrorFile != NULL)
{
- cupsFileClose(ErrorFile);
+ if (ErrorFile != LogStderr)
+ cupsFileClose(ErrorFile);
ErrorFile = NULL;
}
if (PageFile != NULL)
{
- cupsFileClose(PageFile);
+ if (PageFile != LogStderr)
+ cupsFileClose(PageFile);
PageFile = NULL;
}
@@ -180,5 +183,5 @@ cupsdStopServer(void)
/*
- * End of "$Id: server.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: server.c 12689 2015-06-03 19:49:54Z msweet $".
*/
diff --git a/scheduler/statbuf.c b/scheduler/statbuf.c
index 7f99149..b608b15 100644
--- a/scheduler/statbuf.c
+++ b/scheduler/statbuf.c
@@ -1,22 +1,16 @@
/*
- * "$Id: statbuf.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: statbuf.c 11594 2014-02-14 20:09:01Z msweet $"
*
- * Status buffer routines for the CUPS scheduler.
+ * Status buffer routines for the CUPS scheduler.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdStatBufDelete() - Destroy a status buffer.
- * cupsdStatBufNew() - Create a new status buffer.
- * cupsdStatBufUpdate() - Update the status buffer.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -119,7 +113,7 @@ cupsdStatBufNew(int fd, /* I - File descriptor of pipe */
char * /* O - Line from buffer, "", or NULL */
cupsdStatBufUpdate(
cupsd_statbuf_t *sb, /* I - Status buffer */
- int *loglevel, /* O - Log level */
+ int *loglevel, /* O - Log level */
char *line, /* I - Line buffer */
int linelen) /* I - Size of line buffer */
{
@@ -138,8 +132,7 @@ cupsdStatBufUpdate(
* No, read more data...
*/
- if ((bytes = read(sb->fd, sb->buffer + sb->bufused,
- CUPSD_SB_BUFFER_SIZE - sb->bufused - 1)) > 0)
+ if ((bytes = read(sb->fd, sb->buffer + sb->bufused, (size_t)(CUPSD_SB_BUFFER_SIZE - sb->bufused - 1))) > 0)
{
sb->bufused += bytes;
sb->buffer[sb->bufused] = '\0';
@@ -258,6 +251,11 @@ cupsdStatBufUpdate(
*loglevel = CUPSD_LOG_STATE;
message = sb->buffer + 6;
}
+ else if (!strncmp(sb->buffer, "JOBSTATE:", 9))
+ {
+ *loglevel = CUPSD_LOG_JOBSTATE;
+ message = sb->buffer + 9;
+ }
else if (!strncmp(sb->buffer, "ATTR:", 5))
{
*loglevel = CUPSD_LOG_ATTR;
@@ -307,7 +305,7 @@ cupsdStatBufUpdate(
* Copy the message to the line buffer...
*/
- strlcpy(line, message, linelen);
+ strlcpy(line, message, (size_t)linelen);
/*
* Copy over the buffer data we've used up...
@@ -326,5 +324,5 @@ cupsdStatBufUpdate(
/*
- * End of "$Id: statbuf.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: statbuf.c 11594 2014-02-14 20:09:01Z msweet $".
*/
diff --git a/scheduler/statbuf.h b/scheduler/statbuf.h
index 91564d0..68bf206 100644
--- a/scheduler/statbuf.h
+++ b/scheduler/statbuf.h
@@ -1,5 +1,5 @@
/*
- * "$Id: statbuf.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: statbuf.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Status buffer definitions for the CUPS scheduler.
*
@@ -45,5 +45,5 @@ extern char *cupsdStatBufUpdate(cupsd_statbuf_t *sb, int *loglevel,
/*
- * End of "$Id: statbuf.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: statbuf.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c
index 0b9c452..5d0e822 100644
--- a/scheduler/subscriptions.c
+++ b/scheduler/subscriptions.c
@@ -1,37 +1,16 @@
/*
- * "$Id: subscriptions.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: subscriptions.c 12978 2015-11-17 19:29:52Z msweet $"
*
- * Subscription routines for the CUPS scheduler.
+ * Subscription routines for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdAddEvent() - Add an event to the global event cache.
- * cupsdAddSubscription() - Add a new subscription object.
- * cupsdDeleteAllSubscriptions() - Delete all subscriptions.
- * cupsdDeleteSubscription() - Delete a subscription object.
- * cupsdEventName() - Return a single event name.
- * cupsdEventValue() - Return the event mask value for a name.
- * cupsdExpireSubscriptions() - Expire old subscription objects.
- * cupsdFindSubscription() - Find a subscription by ID.
- * cupsdLoadAllSubscriptions() - Load all subscriptions from the .conf file.
- * cupsdSaveAllSubscriptions() - Save all subscriptions to the .conf file.
- * cupsdStopAllNotifiers() - Stop all notifier processes.
- * cupsd_compare_subscriptions() - Compare two subscriptions.
- * cupsd_delete_event() - Delete a single event...
- * cupsd_send_dbus() - Send a DBUS notification...
- * cupsd_send_notification() - Send a notification for the specified
- * event.
- * cupsd_start_notifier() - Start a notifier subprocess...
- * cupsd_update_notifier() - Read messages from notifiers.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -126,9 +105,7 @@ cupsdAddEvent(
* Check if this subscription requires this event...
*/
- if ((sub->mask & event) != 0 &&
- (sub->dest == dest || !sub->dest) &&
- (sub->job == job || !sub->job))
+ if ((sub->mask & event) != 0 && (sub->dest == dest || !sub->dest || sub->job == job))
{
/*
* Need this event, so create a new event record...
@@ -212,7 +189,7 @@ cupsdAddEvent(
(const char * const *)dest->reasons);
ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
- "printer-is-accepting-jobs", dest->accepting);
+ "printer-is-accepting-jobs", (char)dest->accepting);
}
if (job)
@@ -945,9 +922,9 @@ cupsdLoadAllSubscriptions(void)
if (isxdigit(valueptr[0]) && isxdigit(valueptr[1]))
{
if (isdigit(valueptr[0]))
- sub->user_data[i] = (valueptr[0] - '0') << 4;
+ sub->user_data[i] = (unsigned char)((valueptr[0] - '0') << 4);
else
- sub->user_data[i] = (tolower(valueptr[0]) - 'a' + 10) << 4;
+ sub->user_data[i] = (unsigned char)((tolower(valueptr[0]) - 'a' + 10) << 4);
if (isdigit(valueptr[1]))
sub->user_data[i] |= valueptr[1] - '0';
@@ -966,7 +943,7 @@ cupsdLoadAllSubscriptions(void)
break;
}
else
- sub->user_data[i] = *valueptr++;
+ sub->user_data[i] = (unsigned char)*valueptr++;
}
if (*valueptr)
@@ -1638,5 +1615,5 @@ cupsd_update_notifier(void)
/*
- * End of "$Id: subscriptions.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: subscriptions.c 12978 2015-11-17 19:29:52Z msweet $".
*/
diff --git a/scheduler/subscriptions.h b/scheduler/subscriptions.h
index 1a786ae..867a1c6 100644
--- a/scheduler/subscriptions.h
+++ b/scheduler/subscriptions.h
@@ -1,5 +1,5 @@
/*
- * "$Id: subscriptions.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: subscriptions.h 10996 2013-05-29 11:51:34Z msweet $"
*
* Subscription definitions for the CUPS scheduler.
*
@@ -162,5 +162,5 @@ extern void cupsdStopAllNotifiers(void);
/*
- * End of "$Id: subscriptions.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: subscriptions.h 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/scheduler/sysman.c b/scheduler/sysman.c
index d5f82c1..63b51a9 100644
--- a/scheduler/sysman.c
+++ b/scheduler/sysman.c
@@ -1,34 +1,16 @@
/*
- * "$Id: sysman.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sysman.c 12236 2014-11-03 04:08:41Z msweet $"
*
- * System management functions for the CUPS scheduler.
+ * System management functions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdCleanDirty() - Write dirty config and state files.
- * cupsdMarkDirty() - Mark config or state files as needing a
- * write.
- * cupsdSetBusyState() - Let the system know when we are busy
- * doing something.
- * cupsdAllowSleep() - Tell the OS it is now OK to sleep.
- * cupsdStartSystemMonitor() - Start monitoring for system change.
- * cupsdStopSystemMonitor() - Stop monitoring for system change.
- * sysEventThreadEntry() - A thread to receive power and computer
- * name change notifications.
- * sysEventPowerNotifier() - Handle power notification events.
- * sysEventConfigurationNotifier() - Computer name changed notification
- * callback.
- * sysEventTimerNotifier() - Handle delayed event notifications.
- * sysUpdate() - Update the current system state.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
@@ -37,42 +19,28 @@
*/
#include "cupsd.h"
-#ifdef HAVE_VPROC_TRANSACTION_BEGIN
-# include <vproc.h>
-#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
#ifdef __APPLE__
+# include <vproc.h>
# include <IOKit/pwr_mgt/IOPMLib.h>
-# ifdef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H
-# include <IOKit/pwr_mgt/IOPMLibPrivate.h>
-# endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
#endif /* __APPLE__ */
/*
* The system management functions cover disk and power management which
- * are primarily used on portable computers.
+ * are primarily used for portable computers.
*
* Disk management involves delaying the write of certain configuration
* and state files to minimize the number of times the disk has to spin
- * up.
+ * up or flash to be written to.
*
- * Power management support is currently only implemented on MacOS X, but
+ * Power management support is currently only implemented on OS X, but
* essentially we use four functions to let the OS know when it is OK to
* put the system to sleep, typically when we are not in the middle of
- * printing a job.
- *
- * Once put to sleep, we invalidate all remote printers since it is common
- * to wake up in a new location/on a new wireless network.
+ * printing a job. And on OS X we can also "sleep print" - basically the
+ * system only wakes up long enough to service network requests and process
+ * print jobs.
*/
-/*
- * Local globals...
- */
-
-#ifdef kIOPMAssertionTypeDenySystemSleep
-static IOPMAssertionID dark_wake = 0; /* "Dark wake" assertion for sharing */
-#endif /* kIOPMAssertionTypeDenySystemSleep */
-
/*
* 'cupsdCleanDirty()' - Write dirty config and state files.
@@ -162,9 +130,10 @@ cupsdSetBusyState(void)
"Active clients and printing jobs",
"Active clients, printing jobs, and dirty files"
};
-#ifdef HAVE_VPROC_TRANSACTION_BEGIN
+#ifdef __APPLE__
static vproc_transaction_t vtran = 0; /* Current busy transaction */
-#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
+ static IOPMAssertionID keep_awake = 0;/* Keep the system awake while printing */
+#endif /* __APPLE__ */
/*
@@ -204,7 +173,7 @@ cupsdSetBusyState(void)
{
busy = newbusy;
-#ifdef HAVE_VPROC_TRANSACTION_BEGIN
+#ifdef __APPLE__
if (busy && !vtran)
vtran = vproc_transaction_begin(NULL);
else if (!busy && vtran)
@@ -212,24 +181,25 @@ cupsdSetBusyState(void)
vproc_transaction_end(NULL, vtran);
vtran = 0;
}
-#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
+#endif /* __APPLE__ */
}
-#ifdef kIOPMAssertionTypeDenySystemSleep
- if (cupsArrayCount(PrintingJobs) > 0 && !dark_wake)
+#ifdef __APPLE__
+ if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake.");
- IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting NetworkClientActive.");
+
+ IOPMAssertionCreateWithName(kIOPMAssertNetworkClientActive,
kIOPMAssertionLevelOn,
- CFSTR("org.cups.cupsd"), &dark_wake);
+ CFSTR("org.cups.cupsd"), &keep_awake);
}
- else if (cupsArrayCount(PrintingJobs) == 0 && dark_wake)
+ else if (cupsArrayCount(PrintingJobs) == 0 && keep_awake)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion.");
- IOPMAssertionRelease(dark_wake);
- dark_wake = 0;
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing power assertion.");
+ IOPMAssertionRelease(keep_awake);
+ keep_awake = 0;
}
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+#endif /* __APPLE__ */
}
@@ -244,8 +214,10 @@ cupsdSetBusyState(void)
* Include MacOS-specific headers...
*/
+# include <notify.h>
# include <IOKit/IOKitLib.h>
# include <IOKit/IOMessage.h>
+# include <IOKit/ps/IOPowerSources.h>
# include <IOKit/pwr_mgt/IOPMLib.h>
# include <SystemConfiguration/SystemConfiguration.h>
# include <pthread.h>
@@ -310,6 +282,8 @@ static CFStringRef ComputerNameKey = NULL,
NetworkInterfaceKeyIPv6 = NULL;
/* Netowrk interface key */
static cupsd_sysevent_t LastSysEvent; /* Last system event (for delayed sleep) */
+static int NameChanged = 0;/* Did we get a 'name changed' event during sleep? */
+static int PSToken = 0; /* Power source notifications */
/*
@@ -325,6 +299,7 @@ static void sysEventConfigurationNotifier(SCDynamicStoreRef store,
void *context);
static void sysEventTimerNotifier(CFRunLoopTimerRef timer, void *context);
static void sysUpdate(void);
+static void sysUpdateNames(void);
/*
@@ -336,6 +311,7 @@ cupsdAllowSleep(void)
{
cupsdCleanDirty();
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Allowing system sleep.");
IOAllowPowerChange(LastSysEvent.powerKernelPort,
LastSysEvent.powerNotificationID);
}
@@ -351,6 +327,8 @@ cupsdStartSystemMonitor(void)
int flags; /* fcntl flags on pipe */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSystemMonitor()");
+
if (cupsdOpenPipe(SysEventPipes))
{
cupsdLogMessage(CUPSD_LOG_ERROR, "System event monitor pipe() failed - %s!",
@@ -375,6 +353,15 @@ cupsdStartSystemMonitor(void)
pthread_mutex_init(&SysEventThreadMutex, NULL);
pthread_cond_init(&SysEventThreadCond, NULL);
pthread_create(&SysEventThread, NULL, (void *(*)())sysEventThreadEntry, NULL);
+
+ /*
+ * Monitor for power source changes via dispatch queue...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSystemMonitor: IOPSGetTimeRemainingEstimate=%f", IOPSGetTimeRemainingEstimate());
+ ACPower = IOPSGetTimeRemainingEstimate() == kIOPSTimeRemainingUnlimited;
+ notify_register_dispatch(kIOPSNotifyPowerSource, &PSToken, dispatch_get_main_queue(), ^(int t) { (void)t;
+ ACPower = IOPSGetTimeRemainingEstimate() == kIOPSTimeRemainingUnlimited; });
}
@@ -388,6 +375,8 @@ cupsdStopSystemMonitor(void)
CFRunLoopRef rl; /* The event handler runloop */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSystemMonitor()");
+
if (SysEventThread)
{
/*
@@ -418,6 +407,12 @@ cupsdStopSystemMonitor(void)
cupsdRemoveSelect(SysEventPipes[0]);
cupsdClosePipe(SysEventPipes);
}
+
+ if (PSToken != 0)
+ {
+ notify_cancel(PSToken);
+ PSToken = 0;
+ }
}
@@ -658,18 +653,19 @@ sysEventPowerNotifier(
switch (messageType)
{
- case kIOMessageCanSystemPowerOff:
- case kIOMessageCanSystemSleep:
+ case kIOMessageCanSystemPowerOff :
+ case kIOMessageCanSystemSleep :
threadData->sysevent.event |= SYSEVENT_CANSLEEP;
break;
- case kIOMessageSystemWillRestart:
- case kIOMessageSystemWillPowerOff:
- case kIOMessageSystemWillSleep:
+ case kIOMessageSystemWillRestart :
+ case kIOMessageSystemWillPowerOff :
+ case kIOMessageSystemWillSleep :
threadData->sysevent.event |= SYSEVENT_WILLSLEEP;
+ threadData->sysevent.event &= ~SYSEVENT_WOKE;
break;
- case kIOMessageSystemHasPoweredOn:
+ case kIOMessageSystemHasPoweredOn :
/*
* Because powered on is followed by a net-changed event, delay
* before sending it.
@@ -679,16 +675,62 @@ sysEventPowerNotifier(
threadData->sysevent.event |= SYSEVENT_WOKE;
break;
- case kIOMessageSystemWillNotPowerOff:
- case kIOMessageSystemWillNotSleep:
+ case kIOMessageSystemWillNotPowerOff :
+ case kIOMessageSystemWillNotSleep :
# ifdef kIOMessageSystemWillPowerOn
- case kIOMessageSystemWillPowerOn:
+ case kIOMessageSystemWillPowerOn :
# endif /* kIOMessageSystemWillPowerOn */
default:
sendit = 0;
break;
}
+ switch (messageType)
+ {
+ case kIOMessageCanSystemPowerOff :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageCanSystemPowerOff message.");
+ break;
+ case kIOMessageCanSystemSleep :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageCannSystemSleep message.");
+ break;
+ case kIOMessageSystemWillRestart :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemWillRestart message.");
+ break;
+ case kIOMessageSystemWillPowerOff :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemWillPowerOff message.");
+ break;
+ case kIOMessageSystemWillSleep :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemWillSleep message.");
+ break;
+ case kIOMessageSystemHasPoweredOn :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemHasPoweredOn message.");
+ break;
+ case kIOMessageSystemWillNotPowerOff :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemWillNotPowerOff message.");
+ break;
+ case kIOMessageSystemWillNotSleep :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemWillNotSleep message.");
+ break;
+# ifdef kIOMessageSystemWillPowerOn
+ case kIOMessageSystemWillPowerOn :
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Got kIOMessageSystemWillPowerOn message.");
+ break;
+# endif /* kIOMessageSystemWillPowerOn */
+ default:
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Got unknown power message %d.",
+ (int)messageType);
+ break;
+ }
+
if (sendit == 0)
IOAllowPowerChange(threadData->sysevent.powerKernelPort,
(long)messageArgument);
@@ -816,8 +858,9 @@ sysUpdate(void)
{
/*
* If there are active printers that don't have the connecting-to-device
- * printer-state-reason then cancel the sleep request (i.e. this reason
- * indicates a job that is not yet connected to the printer)...
+ * or cups-waiting-for-job-completed printer-state-reason then cancel the
+ * sleep request, i.e., these reasons indicate a job that is not actively
+ * doing anything...
*/
for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
@@ -827,7 +870,8 @@ sysUpdate(void)
if (p->job)
{
for (i = 0; i < p->num_reasons; i ++)
- if (!strcmp(p->reasons[i], "connecting-to-device"))
+ if (!strcmp(p->reasons[i], "connecting-to-device") ||
+ !strcmp(p->reasons[i], "cups-waiting-for-job-completed"))
break;
if (!p->num_reasons || i >= p->num_reasons)
@@ -838,14 +882,14 @@ sysUpdate(void)
if (p)
{
cupsdLogMessage(CUPSD_LOG_INFO,
- "System sleep canceled because printer %s is active",
+ "System sleep canceled because printer %s is active.",
p->name);
IOCancelPowerChange(sysevent.powerKernelPort,
sysevent.powerNotificationID);
}
else
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "System wants to sleep");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "System wants to sleep.");
IOAllowPowerChange(sysevent.powerKernelPort,
sysevent.powerNotificationID);
}
@@ -853,50 +897,30 @@ sysUpdate(void)
if (sysevent.event & SYSEVENT_WILLSLEEP)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "System going to sleep");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "System going to sleep.");
Sleeping = 1;
- for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
- p;
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Deregistering local printer \"%s\"", p->name);
- cupsdDeregisterPrinter(p, 0);
- }
-
cupsdCleanDirty();
-#ifdef kIOPMAssertionTypeDenySystemSleep
- /*
- * Remove our assertion as needed since the user wants the system to
- * sleep (different than idle sleep)...
- */
-
- if (dark_wake)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion.");
- IOPMAssertionRelease(dark_wake);
- dark_wake = 0;
- }
-#endif /* kIOPMAssertionTypeDenySystemSleep */
-
/*
* If we have no printing jobs, allow the power change immediately.
- * Otherwise set the SleepJobs time to 15 seconds in the future when
+ * Otherwise set the SleepJobs time to 10 seconds in the future when
* we'll take more drastic measures...
*/
if (cupsArrayCount(PrintingJobs) == 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Allowing system sleep.");
IOAllowPowerChange(sysevent.powerKernelPort,
sysevent.powerNotificationID);
+ }
else
{
/*
* If there are active printers that don't have the connecting-to-device
- * printer-state-reason then delay the sleep request (i.e. this reason
- * indicates a job that is not yet connected to the printer)...
+ * or cups-waiting-for-job-completed printer-state-reasons then delay the
+ * sleep request, i.e., these reasons indicate a job is active...
*/
for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
@@ -906,7 +930,8 @@ sysUpdate(void)
if (p->job)
{
for (i = 0; i < p->num_reasons; i ++)
- if (!strcmp(p->reasons[i], "connecting-to-device"))
+ if (!strcmp(p->reasons[i], "connecting-to-device") ||
+ !strcmp(p->reasons[i], "cups-waiting-for-job-completed"))
break;
if (!p->num_reasons || i >= p->num_reasons)
@@ -916,11 +941,16 @@ sysUpdate(void)
if (p)
{
+ cupsdLogMessage(CUPSD_LOG_INFO,
+ "System sleep delayed because printer %s is active.",
+ p->name);
+
LastSysEvent = sysevent;
SleepJobs = time(NULL) + 10;
}
else
{
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Allowing system sleep.");
IOAllowPowerChange(sysevent.powerKernelPort,
sysevent.powerNotificationID);
}
@@ -929,78 +959,118 @@ sysUpdate(void)
if (sysevent.event & SYSEVENT_WOKE)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "System woke from sleep");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "System woke from sleep.");
IOAllowPowerChange(sysevent.powerKernelPort,
sysevent.powerNotificationID);
Sleeping = 0;
-#ifdef kIOPMAssertionTypeDenySystemSleep
- if (cupsArrayCount(PrintingJobs) > 0 && !dark_wake)
+ /*
+ * Make sure jobs that were queued prior to the system going to sleep don't
+ * get canceled right away...
+ */
+
+ if (MaxJobTime > 0)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake.");
- IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
- kIOPMAssertionLevelOn,
- CFSTR("org.cups.cupsd"), &dark_wake);
+ cupsd_job_t *job; /* Current job */
+
+ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
+ {
+ if (job->cancel_time)
+ {
+ ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
+ "job-cancel-after",
+ IPP_TAG_INTEGER);
+
+ if (cancel_after)
+ job->cancel_time = time(NULL) + ippGetInteger(cancel_after, 0);
+ else
+ job->cancel_time = time(NULL) + MaxJobTime;
+ }
+ }
}
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+
+ if (NameChanged)
+ sysUpdateNames();
cupsdCheckJobs();
}
if (sysevent.event & SYSEVENT_NETCHANGED)
{
- if (!Sleeping)
+ if (Sleeping)
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "System network configuration changed");
+ "System network configuration changed - "
+ "ignored while sleeping.");
else
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "System network configuration changed; "
- "ignored while sleeping");
+ "System network configuration changed.");
}
if (sysevent.event & SYSEVENT_NAMECHANGED)
{
- if (!Sleeping)
+ if (Sleeping)
+ {
+ NameChanged = 1;
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Computer name or BTMM domains changed - ignored while "
+ "sleeping.");
+ }
+ else
{
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Computer name or BTMM domains changed");
+ "Computer name or BTMM domains changed.");
- /*
- * De-register the individual printers...
- */
+ sysUpdateNames();
+ }
+ }
+ }
+}
- for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
- p;
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- cupsdDeregisterPrinter(p, 1);
+
+/*
+ * 'sysUpdateNames()' - Update computer and/or BTMM domains.
+ */
+
+static void
+sysUpdateNames(void)
+{
+ cupsd_printer_t *p; /* Current printer */
+
+
+ NameChanged = 0;
+
+ /*
+ * De-register the individual printers...
+ */
+
+ for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+ p;
+ p = (cupsd_printer_t *)cupsArrayNext(Printers))
+ cupsdDeregisterPrinter(p, 1);
# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- /*
- * Update the computer name and BTMM domain list...
- */
+ /*
+ * Update the computer name and BTMM domain list...
+ */
- cupsdUpdateDNSSDName();
+ cupsdUpdateDNSSDName();
# endif /* HAVE_DNSSD || HAVE_AVAHI */
- /*
- * Now re-register them...
- */
+ /*
+ * Now re-register them...
+ */
- for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
- p;
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- cupsdRegisterPrinter(p);
- }
- else
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Computer name or BTMM domains changed; ignored while "
- "sleeping");
- }
- }
+ for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+ p;
+ p = (cupsd_printer_t *)cupsArrayNext(Printers))
+ cupsdRegisterPrinter(p);
}
#endif /* __APPLE__ */
/*
- * End of "$Id: sysman.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sysman.c 12236 2014-11-03 04:08:41Z msweet $".
*/
diff --git a/scheduler/sysman.h b/scheduler/sysman.h
index d603178..9da386d 100644
--- a/scheduler/sysman.h
+++ b/scheduler/sysman.h
@@ -1,16 +1,16 @@
/*
- * "$Id: sysman.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sysman.h 12140 2014-08-30 01:51:22Z msweet $"
*
- * System management definitions for the CUPS scheduler.
+ * System management definitions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -35,7 +35,9 @@ VAR int DirtyFiles VALUE(CUPSD_DIRTY_NONE),
/* How often do we write dirty files? */
VAR time_t DirtyCleanTime VALUE(0);
/* When to clean dirty files next */
-VAR int Sleeping VALUE(0);
+VAR int ACPower VALUE(-1),
+ /* Is the system on AC power? */
+ Sleeping VALUE(0);
/* Non-zero if machine is entering or *
* in a sleep state... */
VAR time_t SleepJobs VALUE(0);
@@ -60,5 +62,5 @@ extern void cupsdStopSystemMonitor(void);
/*
- * End of "$Id: sysman.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sysman.h 12140 2014-08-30 01:51:22Z msweet $".
*/
diff --git a/scheduler/testlpd.c b/scheduler/testlpd.c
index 3ff483e..a614ec4 100644
--- a/scheduler/testlpd.c
+++ b/scheduler/testlpd.c
@@ -1,27 +1,16 @@
/*
- * "$Id: testlpd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testlpd.c 12644 2015-05-19 21:22:35Z msweet $"
*
- * cups-lpd test program for CUPS.
+ * cups-lpd test program for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Simulate an LPD client.
- * do_command() - Send the LPD command and wait for a response.
- * print_job() - Submit a file for printing.
- * print_waiting() - Print waiting jobs.
- * remove_job() - Cancel a print job.
- * status_long() - Show the long printer status.
- * status_short() - Show the short printer status.
- * usage() - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -42,11 +31,11 @@
*/
static int do_command(int outfd, int infd, const char *command);
-static int print_job(int outfd, int infd, char *dest, char **args);
+static int print_job(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
static int print_waiting(int outfd, int infd, char *dest);
-static int remove_job(int outfd, int infd, char *dest, char **args);
-static int status_long(int outfd, int infd, char *dest, char **args);
-static int status_short(int outfd, int infd, char *dest, char **args);
+static int remove_job(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
+static int status_long(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
+static int status_short(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
static void usage(void) __attribute__((noreturn));
@@ -76,7 +65,7 @@ main(int argc, /* I - Number of command-line arguments */
*/
op = NULL;
- opargs = NULL;
+ opargs = argv + argc;
dest = NULL;
cupslpd_argc = 1;
cupslpd_argv[0] = (char *)"cups-lpd";
@@ -210,15 +199,15 @@ do_command(int outfd, /* I - Command file descriptor */
int infd, /* I - Response file descriptor */
const char *command) /* I - Command line to send */
{
- int len; /* Length of command line */
- char status; /* Status byte */
+ size_t len; /* Length of command line */
+ char status; /* Status byte */
printf("COMMAND: %02X %s", command[0], command + 1);
len = strlen(command);
- if (write(outfd, command, len) < len)
+ if ((size_t)write(outfd, command, len) < len)
{
puts(" Write failed!");
return (-1);
@@ -251,7 +240,7 @@ print_job(int outfd, /* I - Command file descriptor */
struct stat fileinfo; /* File information */
char *jobname; /* Job name */
int sequence; /* Sequence number */
- int bytes; /* Bytes read/written */
+ ssize_t bytes; /* Bytes read/written */
/*
@@ -305,10 +294,10 @@ print_job(int outfd, /* I - Command file descriptor */
* Send the control file...
*/
- bytes = strlen(control);
+ bytes = (ssize_t)strlen(control);
snprintf(command, sizeof(command), "\002%d cfA%03dlocalhost\n",
- bytes, sequence);
+ (int)bytes, sequence);
if ((status = do_command(outfd, infd, command)) != 0)
{
@@ -318,14 +307,14 @@ print_job(int outfd, /* I - Command file descriptor */
bytes ++;
- if (write(outfd, control, bytes) < bytes)
+ if (write(outfd, control, (size_t)bytes) < bytes)
{
- printf("CONTROL: Unable to write %d bytes!\n", bytes);
+ printf("CONTROL: Unable to write %d bytes!\n", (int)bytes);
close(fd);
return (-1);
}
- printf("CONTROL: Wrote %d bytes.\n", bytes);
+ printf("CONTROL: Wrote %d bytes.\n", (int)bytes);
if (read(infd, command, 1) < 1)
{
@@ -355,9 +344,9 @@ print_job(int outfd, /* I - Command file descriptor */
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
{
- if (write(outfd, buffer, bytes) < bytes)
+ if (write(outfd, buffer, (size_t)bytes) < bytes)
{
- printf("DATA: Unable to write %d bytes!\n", bytes);
+ printf("DATA: Unable to write %d bytes!\n", (int)bytes);
close(fd);
return (-1);
}
@@ -451,21 +440,21 @@ status_long(int outfd, /* I - Command file descriptor */
{
char command[1024], /* Command buffer */
buffer[8192]; /* Status buffer */
- int bytes; /* Bytes read/written */
+ ssize_t bytes; /* Bytes read/written */
/*
* Send the "send short status" command...
*/
- if (args)
+ if (args[0])
snprintf(command, sizeof(command), "\004%s %s\n", dest, args[0]);
else
snprintf(command, sizeof(command), "\004%s\n", dest);
- bytes = strlen(command);
+ bytes = (ssize_t)strlen(command);
- if (write(outfd, command, bytes) < bytes)
+ if (write(outfd, command, (size_t)bytes) < bytes)
return (-1);
/*
@@ -474,7 +463,7 @@ status_long(int outfd, /* I - Command file descriptor */
while ((bytes = read(infd, buffer, sizeof(buffer))) > 0)
{
- fwrite(buffer, 1, bytes, stdout);
+ fwrite(buffer, 1, (size_t)bytes, stdout);
fflush(stdout);
}
@@ -494,21 +483,21 @@ status_short(int outfd, /* I - Command file descriptor */
{
char command[1024], /* Command buffer */
buffer[8192]; /* Status buffer */
- int bytes; /* Bytes read/written */
+ ssize_t bytes; /* Bytes read/written */
/*
* Send the "send short status" command...
*/
- if (args)
+ if (args[0])
snprintf(command, sizeof(command), "\003%s %s\n", dest, args[0]);
else
snprintf(command, sizeof(command), "\003%s\n", dest);
- bytes = strlen(command);
+ bytes = (ssize_t)strlen(command);
- if (write(outfd, command, bytes) < bytes)
+ if (write(outfd, command, (size_t)bytes) < bytes)
return (-1);
/*
@@ -517,7 +506,7 @@ status_short(int outfd, /* I - Command file descriptor */
while ((bytes = read(infd, buffer, sizeof(buffer))) > 0)
{
- fwrite(buffer, 1, bytes, stdout);
+ fwrite(buffer, 1, (size_t)bytes, stdout);
fflush(stdout);
}
@@ -546,5 +535,5 @@ usage(void)
/*
- * End of "$Id: testlpd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testlpd.c 12644 2015-05-19 21:22:35Z msweet $".
*/
diff --git a/scheduler/testmime.c b/scheduler/testmime.c
index 5a71ea9..0271309 100644
--- a/scheduler/testmime.c
+++ b/scheduler/testmime.c
@@ -1,24 +1,16 @@
/*
- * "$Id: testmime.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testmime.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * MIME test program for CUPS.
+ * MIME test program for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry for the test program.
- * add_ppd_filter() - Add a printer filter from a PPD.
- * add_ppd_filters() - Add all filters from a PPD.
- * print_rules() - Print the rules for a file type...
- * type_dir() - Show the MIME types for a given directory.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -135,7 +127,7 @@ main(int argc, /* I - Number of command-line args */
sscanf(argv[i], "%15[^/]/%255s", super, type);
dst = mimeType(mime, super, type);
- filters = mimeFilter2(mime, src, srcinfo.st_size, dst, &cost);
+ filters = mimeFilter2(mime, src, (size_t)srcinfo.st_size, dst, &cost);
if (!filters)
{
@@ -264,7 +256,7 @@ add_ppd_filter(mime_t *mime, /* I - MIME database */
{
char *ptr; /* Pointer into maxsize(nnnn) program */
- maxsize = strtoll(program + 8, &ptr, 10);
+ maxsize = (size_t)strtoll(program + 8, &ptr, 10);
if (*ptr != ')')
{
@@ -527,5 +519,5 @@ type_dir(mime_t *mime, /* I - MIME database */
/*
- * End of "$Id: testmime.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testmime.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/scheduler/testspeed.c b/scheduler/testspeed.c
index 425f471..9b443cb 100644
--- a/scheduler/testspeed.c
+++ b/scheduler/testspeed.c
@@ -1,23 +1,16 @@
/*
- * "$Id: testspeed.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testspeed.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Scheduler speed test for CUPS.
+ * Scheduler speed test for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Send multiple IPP requests and report on the average response
- * time.
- * do_test() - Run a test on a specific host...
- * usage() - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -39,7 +32,7 @@
static int do_test(const char *server, int port,
http_encryption_t encryption, int requests,
- int verbose);
+ const char *opstring, int verbose);
static void usage(void) __attribute__((noreturn));
@@ -66,6 +59,7 @@ main(int argc, /* I - Number of command-line arguments */
end; /* End time */
double elapsed; /* Elapsed time */
int verbose; /* Verbosity */
+ const char *opstring; /* Operation name */
/*
@@ -78,6 +72,7 @@ main(int argc, /* I - Number of command-line arguments */
port = ippPort();
encryption = HTTP_ENCRYPT_IF_REQUESTED;
verbose = 0;
+ opstring = NULL;
for (i = 1; i < argc; i ++)
if (argv[i][0] == '-')
@@ -85,6 +80,10 @@ main(int argc, /* I - Number of command-line arguments */
for (ptr = argv[i] + 1; *ptr; ptr ++)
switch (*ptr)
{
+ case 'E' : /* Enable encryption */
+ encryption = HTTP_ENCRYPT_REQUIRED;
+ break;
+
case 'c' : /* Number of children */
i ++;
if (i >= argc)
@@ -93,16 +92,20 @@ main(int argc, /* I - Number of command-line arguments */
children = atoi(argv[i]);
break;
- case 'r' : /* Number of requests */
+ case 'o' : /* Operation */
i ++;
if (i >= argc)
usage();
- requests = atoi(argv[i]);
+ opstring = argv[i];
break;
- case 'E' : /* Enable encryption */
- encryption = HTTP_ENCRYPT_REQUIRED;
+ case 'r' : /* Number of requests */
+ i ++;
+ if (i >= argc)
+ usage();
+
+ requests = atoi(argv[i]);
break;
case 'v' : /* Verbose logging */
@@ -139,9 +142,10 @@ main(int argc, /* I - Number of command-line arguments */
start = time(NULL);
if (children < 1)
- return (do_test(server, port, encryption, requests, verbose));
+ return (do_test(server, port, encryption, requests, opstring, verbose));
else if (children == 1)
- good_children = do_test(server, port, encryption, requests, verbose) ? 0 : 1;
+ good_children = do_test(server, port, encryption, requests, opstring,
+ verbose) ? 0 : 1;
else
{
char options[255], /* Command-line options for child */
@@ -174,7 +178,12 @@ main(int argc, /* I - Number of command-line arguments */
* Child goes here...
*/
- execlp(argv[0], argv[0], options, "0", reqstr, serverstr, (char *)NULL);
+ if (opstring)
+ execlp(argv[0], argv[0], options, "0", reqstr, "-o", opstring,
+ serverstr, (char *)NULL);
+ else
+ execlp(argv[0], argv[0], options, "0", reqstr, serverstr, (char *)NULL);
+
exit(errno);
}
else if (pid < 0)
@@ -237,6 +246,7 @@ do_test(const char *server, /* I - Server to use */
int port, /* I - Port number to use */
http_encryption_t encryption, /* I - Encryption to use */
int requests, /* I - Number of requests to send */
+ const char *opstring, /* I - Operation string */
int verbose) /* I - Verbose output? */
{
int i; /* Looping var */
@@ -247,9 +257,10 @@ do_test(const char *server, /* I - Server to use */
double reqtime, /* Time for this request */
elapsed; /* Elapsed time */
int op; /* Current operation */
- static ipp_op_t ops[4] = /* Operations to test... */
+ static ipp_op_t ops[5] = /* Operations to test... */
{
IPP_PRINT_JOB,
+ CUPS_GET_DEFAULT,
CUPS_GET_PRINTERS,
CUPS_GET_CLASSES,
IPP_GET_JOBS
@@ -282,7 +293,11 @@ do_test(const char *server, /* I - Server to use */
* In addition, IPP_GET_JOBS needs a printer-uri attribute.
*/
- op = ops[i & 3];
+ if (opstring)
+ op = ippOpValue(opstring);
+ else
+ op = ops[i % (int)(sizeof(ops) / sizeof(ops[0]))];
+
request = ippNewRequest(op);
gettimeofday(&start, NULL);
@@ -353,13 +368,13 @@ do_test(const char *server, /* I - Server to use */
static void
usage(void)
{
- puts("Usage: testspeed [-c children] [-h] [-r requests] [-v] [-E] "
- "hostname[:port]");
+ puts("Usage: testspeed [-c children] [-h] [-o operation] [-r requests] [-v] "
+ "[-E] hostname[:port]");
exit(0);
}
/*
- * End of "$Id: testspeed.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testspeed.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/scheduler/testsub.c b/scheduler/testsub.c
index 66801af..97a3a83 100644
--- a/scheduler/testsub.c
+++ b/scheduler/testsub.c
@@ -1,23 +1,16 @@
/*
- * "$Id: testsub.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testsub.c 11889 2014-05-22 13:54:15Z msweet $"
*
- * Scheduler notification tester for CUPS.
+ * Scheduler notification tester for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 2006-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Subscribe to the .
- * print_attributes() - Print the attributes in a request...
- * sigterm_handler() - Flag when the user hits CTRL-C...
- * usage() - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -251,7 +244,7 @@ main(int argc, /* I - Number of command-line arguments */
interval = 5;
ippDelete(response);
- sleep(interval);
+ sleep((unsigned)interval);
}
/*
@@ -435,17 +428,10 @@ print_attributes(ipp_t *ipp, /* I - IPP request */
case IPP_TAG_DATE :
{
- time_t vtime; /* Date/Time value */
- struct tm *vdate; /* Date info */
char vstring[256]; /* Formatted time */
for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++)
- {
- vtime = ippDateToTime(val->date);
- vdate = localtime(&vtime);
- strftime(vstring, sizeof(vstring), "%c", vdate);
- printf(" (%s)", vstring);
- }
+ printf(" (%s)", _cupsStrDate(vstring, sizeof(vstring), ippDateToTime(val->date)));
}
putchar('\n');
break;
@@ -519,5 +505,5 @@ usage(void)
/*
- * End of "$Id: testsub.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testsub.c 11889 2014-05-22 13:54:15Z msweet $".
*/
diff --git a/scheduler/tls-darwin.c b/scheduler/tls-darwin.c
deleted file mode 100644
index bb6998b..0000000
--- a/scheduler/tls-darwin.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * "$Id: tls-darwin.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * TLS support code for the CUPS scheduler on OS X.
- *
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdEndTLS() - Shutdown a secure session with the client.
- * cupsdStartTLS() - Start a secure session with the client.
- * copy_cdsa_certificate() - Copy a SSL/TLS certificate from the System
- * keychain.
- * make_certificate() - Make a self-signed SSL/TLS certificate.
- */
-
-
-/*
- * Local functions...
- */
-
-static CFArrayRef copy_cdsa_certificate(cupsd_client_t *con);
-static int make_certificate(cupsd_client_t *con);
-
-
-/*
- * 'cupsdEndTLS()' - Shutdown a secure session with the client.
- */
-
-int /* O - 1 on success, 0 on error */
-cupsdEndTLS(cupsd_client_t *con) /* I - Client connection */
-{
- while (SSLClose(con->http.tls) == errSSLWouldBlock)
- usleep(1000);
-
- SSLDisposeContext(con->http.tls);
- con->http.tls = NULL;
-
- if (con->http.tls_credentials)
- CFRelease(con->http.tls_credentials);
-
- return (1);
-}
-
-
-/*
- * 'cupsdStartTLS()' - Start a secure session with the client.
- */
-
-int /* O - 1 on success, 0 on error */
-cupsdStartTLS(cupsd_client_t *con) /* I - Client connection */
-{
- OSStatus error = 0; /* Error code */
- CFArrayRef peerCerts; /* Peer certificates */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Encrypting connection.",
- con->http.fd);
-
- con->http.tls_credentials = copy_cdsa_certificate(con);
-
- if (!con->http.tls_credentials)
- {
- /*
- * No keychain (yet), make a self-signed certificate...
- */
-
- if (make_certificate(con))
- con->http.tls_credentials = copy_cdsa_certificate(con);
- }
-
- if (!con->http.tls_credentials)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Could not find signing key in keychain \"%s\"",
- ServerCertificate);
- error = errSSLBadConfiguration;
- }
-
- if (!error)
- error = SSLNewContext(true, &con->http.tls);
-
- if (!error)
- error = SSLSetIOFuncs(con->http.tls, _httpReadCDSA, _httpWriteCDSA);
-
- if (!error)
- error = SSLSetConnection(con->http.tls, HTTP(con));
-
- if (!error)
- error = SSLSetAllowsExpiredCerts(con->http.tls, true);
-
- if (!error)
- error = SSLSetAllowsAnyRoot(con->http.tls, true);
-
- if (!error)
- error = SSLSetCertificate(con->http.tls, con->http.tls_credentials);
-
- if (!error)
- {
- /*
- * Perform SSL/TLS handshake
- */
-
- while ((error = SSLHandshake(con->http.tls)) == errSSLWouldBlock)
- usleep(1000);
- }
-
- if (error)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to encrypt connection from %s - %s (%d)",
- con->http.hostname, cssmErrorString(error), (int)error);
-
- con->http.error = error;
- con->http.status = HTTP_ERROR;
-
- if (con->http.tls)
- {
- SSLDisposeContext(con->http.tls);
- con->http.tls = NULL;
- }
-
- if (con->http.tls_credentials)
- {
- CFRelease(con->http.tls_credentials);
- con->http.tls_credentials = NULL;
- }
-
- return (0);
- }
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
- con->http.hostname);
-
- if (!SSLCopyPeerCertificates(con->http.tls, &peerCerts) && peerCerts)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Received %d peer certificates!",
- (int)CFArrayGetCount(peerCerts));
- CFRelease(peerCerts);
- }
- else
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Received NO peer certificates!");
-
- return (1);
-}
-
-
-/*
- * 'copy_cdsa_certificate()' - Copy a SSL/TLS certificate from the System
- * keychain.
- */
-
-static CFArrayRef /* O - Array of certificates */
-copy_cdsa_certificate(
- cupsd_client_t *con) /* I - Client connection */
-{
- OSStatus err; /* Error info */
- SecKeychainRef keychain = NULL;/* Keychain reference */
- SecIdentitySearchRef search = NULL; /* Search reference */
- SecIdentityRef identity = NULL;/* Identity */
- CFArrayRef certificates = NULL;
- /* Certificate array */
-# if HAVE_SECPOLICYCREATESSL
- SecPolicyRef policy = NULL; /* Policy ref */
- CFStringRef servername = NULL;
- /* Server name */
- CFMutableDictionaryRef query = NULL; /* Query qualifiers */
- CFArrayRef list = NULL; /* Keychain list */
-# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- char localname[1024];/* Local hostname */
-# endif /* HAVE_DNSSD || HAVE_AVAHI */
-# elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
- SecPolicyRef policy = NULL; /* Policy ref */
- SecPolicySearchRef policy_search = NULL;
- /* Policy search ref */
- CSSM_DATA options; /* Policy options */
- CSSM_APPLE_TP_SSL_OPTIONS
- ssl_options; /* SSL Option for hostname */
- char localname[1024];/* Local hostname */
-# endif /* HAVE_SECPOLICYCREATESSL */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "copy_cdsa_certificate: Looking for certs for \"%s\"...",
- con->servername);
-
- if ((err = SecKeychainOpen(ServerCertificate, &keychain)))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\" - %s (%d)",
- ServerCertificate, cssmErrorString(err), (int)err);
- goto cleanup;
- }
-
-# if HAVE_SECPOLICYCREATESSL
- servername = CFStringCreateWithCString(kCFAllocatorDefault, con->servername,
- kCFStringEncodingUTF8);
-
- policy = SecPolicyCreateSSL(1, servername);
-
- if (servername)
- CFRelease(servername);
-
- if (!policy)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create ssl policy reference");
- goto cleanup;
- }
-
- if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks)))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create query dictionary");
- goto cleanup;
- }
-
- list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1,
- &kCFTypeArrayCallBacks);
-
- CFDictionaryAddValue(query, kSecClass, kSecClassIdentity);
- CFDictionaryAddValue(query, kSecMatchPolicy, policy);
- CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue);
- CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne);
- CFDictionaryAddValue(query, kSecMatchSearchList, list);
-
- CFRelease(list);
-
- err = SecItemCopyMatching(query, (CFTypeRef *)&identity);
-
-# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- if (err && DNSSDHostName)
- {
- /*
- * Search for the connection server name failed; try the DNS-SD .local
- * hostname instead...
- */
-
- snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName);
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "copy_cdsa_certificate: Looking for certs for \"%s\"...",
- localname);
-
- servername = CFStringCreateWithCString(kCFAllocatorDefault, localname,
- kCFStringEncodingUTF8);
-
- CFRelease(policy);
-
- policy = SecPolicyCreateSSL(1, servername);
-
- if (servername)
- CFRelease(servername);
-
- if (!policy)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create ssl policy reference");
- goto cleanup;
- }
-
- CFDictionarySetValue(query, kSecMatchPolicy, policy);
-
- err = SecItemCopyMatching(query, (CFTypeRef *)&identity);
- }
-# endif /* HAVE_DNSSD || HAVE_AVAHI */
-
- if (err)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Cannot find signing key in keychain \"%s\": %s (%d)",
- ServerCertificate, cssmErrorString(err), (int)err);
- goto cleanup;
- }
-
-# elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
- /*
- * Use a policy to search for valid certificates whose common name matches the
- * servername...
- */
-
- if (SecPolicySearchCreate(CSSM_CERT_X_509v3, &CSSMOID_APPLE_TP_SSL,
- NULL, &policy_search))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create a policy search reference");
- goto cleanup;
- }
-
- if (SecPolicySearchCopyNext(policy_search, &policy))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Cannot find a policy to use for searching");
- goto cleanup;
- }
-
- memset(&ssl_options, 0, sizeof(ssl_options));
- ssl_options.Version = CSSM_APPLE_TP_SSL_OPTS_VERSION;
- ssl_options.ServerName = con->servername;
- ssl_options.ServerNameLen = strlen(con->servername);
-
- options.Data = (uint8 *)&ssl_options;
- options.Length = sizeof(ssl_options);
-
- if (SecPolicySetValue(policy, &options))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Cannot set policy value to use for searching");
- goto cleanup;
- }
-
- if ((err = SecIdentitySearchCreateWithPolicy(policy, NULL, CSSM_KEYUSE_SIGN,
- keychain, FALSE, &search)))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Cannot create identity search reference: %s (%d)",
- cssmErrorString(err), (int)err);
- goto cleanup;
- }
-
- err = SecIdentitySearchCopyNext(search, &identity);
-
-# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- if (err && DNSSDHostName)
- {
- /*
- * Search for the connection server name failed; try the DNS-SD .local
- * hostname instead...
- */
-
- snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName);
-
- ssl_options.ServerName = localname;
- ssl_options.ServerNameLen = strlen(localname);
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "copy_cdsa_certificate: Looking for certs for \"%s\"...",
- localname);
-
- if (SecPolicySetValue(policy, &options))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Cannot set policy value to use for searching");
- goto cleanup;
- }
-
- CFRelease(search);
- search = NULL;
- if ((err = SecIdentitySearchCreateWithPolicy(policy, NULL, CSSM_KEYUSE_SIGN,
- keychain, FALSE, &search)))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Cannot create identity search reference: %s (%d)",
- cssmErrorString(err), (int)err);
- goto cleanup;
- }
-
- err = SecIdentitySearchCopyNext(search, &identity);
-
- }
-# endif /* HAVE_DNSSD || HAVE_AVAHI */
-
- if (err)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Cannot find signing key in keychain \"%s\": %s (%d)",
- ServerCertificate, cssmErrorString(err), (int)err);
- goto cleanup;
- }
-
-# else
- /*
- * Assume there is exactly one SecIdentity in the keychain...
- */
-
- if ((err = SecIdentitySearchCreate(keychain, CSSM_KEYUSE_SIGN, &search)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Cannot create identity search reference (%d)", (int)err);
- goto cleanup;
- }
-
- if ((err = SecIdentitySearchCopyNext(search, &identity)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Cannot find signing key in keychain \"%s\": %s (%d)",
- ServerCertificate, cssmErrorString(err), (int)err);
- goto cleanup;
- }
-# endif /* HAVE_SECPOLICYCREATESSL */
-
- if (CFGetTypeID(identity) != SecIdentityGetTypeID())
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "SecIdentity CFTypeID failure!");
- goto cleanup;
- }
-
- if ((certificates = CFArrayCreate(NULL, (const void **)&identity,
- 1, &kCFTypeArrayCallBacks)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create certificate array");
- goto cleanup;
- }
-
- cleanup :
-
- if (keychain)
- CFRelease(keychain);
- if (search)
- CFRelease(search);
- if (identity)
- CFRelease(identity);
-
-# if HAVE_SECPOLICYCREATESSL
- if (policy)
- CFRelease(policy);
- if (query)
- CFRelease(query);
-# elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
- if (policy)
- CFRelease(policy);
- if (policy_search)
- CFRelease(policy_search);
-# endif /* HAVE_SECPOLICYCREATESSL */
-
- return (certificates);
-}
-
-
-/*
- * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
- */
-
-static int /* O - 1 on success, 0 on failure */
-make_certificate(cupsd_client_t *con) /* I - Client connection */
-{
- int pid, /* Process ID of command */
- status; /* Status of command */
- char command[1024], /* Command */
- *argv[4], /* Command-line arguments */
- *envp[MAX_ENV + 1], /* Environment variables */
- keychain[1024], /* Keychain argument */
- infofile[1024], /* Type-in information for cert */
-# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- localname[1024], /* Local hostname */
-# endif /* HAVE_DNSSD || HAVE_AVAHI */
- *servername; /* Name of server in cert */
- cups_file_t *fp; /* Seed/info file */
- int infofd; /* Info file descriptor */
-
-
-# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- if (con->servername && isdigit(con->servername[0] & 255) && DNSSDHostName)
- {
- snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName);
- servername = localname;
- }
- else
-# endif /* HAVE_DNSSD || HAVE_AVAHI */
- servername = con->servername;
-
- /*
- * Run the "certtool" command to generate a self-signed certificate...
- */
-
- if (!cupsFileFind("certtool", getenv("PATH"), 1, command, sizeof(command)))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "No SSL certificate and certtool command not found!");
- return (0);
- }
-
- /*
- * Create a file with the certificate information fields...
- *
- * Note: This assumes that the default questions are asked by the certtool
- * command...
- */
-
- if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create certificate information file %s - %s",
- infofile, strerror(errno));
- return (0);
- }
-
- cupsFilePrintf(fp,
- "%s\n" /* Enter key and certificate label */
- "r\n" /* Generate RSA key pair */
- "2048\n" /* Key size in bits */
- "y\n" /* OK (y = yes) */
- "b\n" /* Usage (b=signing/encryption) */
- "s\n" /* Sign with SHA1 */
- "y\n" /* OK (y = yes) */
- "%s\n" /* Common name */
- "\n" /* Country (default) */
- "\n" /* Organization (default) */
- "\n" /* Organizational unit (default) */
- "\n" /* State/Province (default) */
- "%s\n" /* Email address */
- "y\n", /* OK (y = yes) */
- servername, servername, ServerAdmin);
- cupsFileClose(fp);
-
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Generating SSL server key and certificate...");
-
- snprintf(keychain, sizeof(keychain), "k=%s", ServerCertificate);
-
- argv[0] = "certtool";
- argv[1] = "c";
- argv[2] = keychain;
- argv[3] = NULL;
-
- cupsdLoadEnv(envp, MAX_ENV);
-
- infofd = open(infofile, O_RDONLY);
-
- if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
- NULL, &pid))
- {
- close(infofd);
- unlink(infofile);
- return (0);
- }
-
- close(infofd);
- unlink(infofile);
-
- while (waitpid(pid, &status, 0) < 0)
- if (errno != EINTR)
- {
- status = 1;
- break;
- }
-
- cupsdFinishProcess(pid, command, sizeof(command), NULL);
-
- if (status)
- {
- if (WIFEXITED(status))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create SSL server key and certificate - "
- "the certtool command stopped with status %d!",
- WEXITSTATUS(status));
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create SSL server key and certificate - "
- "the certtool command crashed on signal %d!",
- WTERMSIG(status));
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Created SSL server certificate file \"%s\"...",
- ServerCertificate);
- }
-
- return (!status);
-}
-
-
-/*
- * End of "$Id: tls-darwin.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/tls-gnutls.c b/scheduler/tls-gnutls.c
deleted file mode 100644
index c2d7032..0000000
--- a/scheduler/tls-gnutls.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * "$Id: tls-gnutls.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * TLS support code for the CUPS scheduler using GNU TLS.
- *
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdEndTLS() - Shutdown a secure session with the client.
- * cupsdStartTLS() - Start a secure session with the client.
- * make_certificate() - Make a self-signed SSL/TLS certificate.
- */
-
-
-/*
- * Local functions...
- */
-
-static int make_certificate(cupsd_client_t *con);
-
-
-/*
- * 'cupsdEndTLS()' - Shutdown a secure session with the client.
- */
-
-int /* O - 1 on success, 0 on error */
-cupsdEndTLS(cupsd_client_t *con) /* I - Client connection */
-{
- int error; /* Error code */
- gnutls_certificate_server_credentials *credentials;
- /* TLS credentials */
-
-
- credentials = (gnutls_certificate_server_credentials *)
- (con->http.tls_credentials);
-
- error = gnutls_bye(con->http.tls, GNUTLS_SHUT_WR);
- switch (error)
- {
- case GNUTLS_E_SUCCESS:
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "SSL shutdown successful!");
- break;
- default:
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "SSL shutdown failed: %s", gnutls_strerror(error));
- break;
- }
-
- gnutls_deinit(con->http.tls);
- con->http.tls = NULL;
-
- gnutls_certificate_free_credentials(*credentials);
- free(credentials);
-
- return (1);
-}
-
-
-/*
- * 'cupsdStartTLS()' - Start a secure session with the client.
- */
-
-int /* O - 1 on success, 0 on error */
-cupsdStartTLS(cupsd_client_t *con) /* I - Client connection */
-{
- int status; /* Error code */
- gnutls_certificate_server_credentials *credentials;
- /* TLS credentials */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Encrypting connection.",
- con->http.fd);
-
- /*
- * Verify that we have a certificate...
- */
-
- if (access(ServerKey, 0) || access(ServerCertificate, 0))
- {
- /*
- * Nope, make a self-signed certificate...
- */
-
- if (!make_certificate(con))
- return (0);
- }
-
- /*
- * Create the SSL object and perform the SSL handshake...
- */
-
- credentials = (gnutls_certificate_server_credentials *)
- malloc(sizeof(gnutls_certificate_server_credentials));
- if (credentials == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to encrypt connection from %s - %s",
- con->http.hostname, strerror(errno));
-
- return (0);
- }
-
- gnutls_certificate_allocate_credentials(credentials);
- gnutls_certificate_set_x509_key_file(*credentials, ServerCertificate,
- ServerKey, GNUTLS_X509_FMT_PEM);
-
- gnutls_init(&con->http.tls, GNUTLS_SERVER);
- gnutls_set_default_priority(con->http.tls);
-
- gnutls_credentials_set(con->http.tls, GNUTLS_CRD_CERTIFICATE, *credentials);
- gnutls_transport_set_ptr(con->http.tls, (gnutls_transport_ptr)HTTP(con));
- gnutls_transport_set_pull_function(con->http.tls, _httpReadGNUTLS);
- gnutls_transport_set_push_function(con->http.tls, _httpWriteGNUTLS);
-
- while ((status = gnutls_handshake(con->http.tls)) != GNUTLS_E_SUCCESS)
- {
- if (gnutls_error_is_fatal(status))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to encrypt connection from %s - %s",
- con->http.hostname, gnutls_strerror(status));
-
- gnutls_deinit(con->http.tls);
- gnutls_certificate_free_credentials(*credentials);
- con->http.tls = NULL;
- free(credentials);
- return (0);
- }
- }
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
- con->http.hostname);
-
- con->http.tls_credentials = credentials;
- return (1);
-}
-
-
-/*
- * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
- */
-
-static int /* O - 1 on success, 0 on failure */
-make_certificate(cupsd_client_t *con) /* I - Client connection */
-{
- gnutls_x509_crt crt; /* Self-signed certificate */
- gnutls_x509_privkey key; /* Encryption key */
- cups_lang_t *language; /* Default language info */
- cups_file_t *fp; /* Key/cert file */
- unsigned char buffer[8192]; /* Buffer for x509 data */
- size_t bytes; /* Number of bytes of data */
- unsigned char serial[4]; /* Serial number buffer */
- time_t curtime; /* Current time */
- int result; /* Result of GNU TLS calls */
-
-
- /*
- * Create the encryption key...
- */
-
- cupsdLogMessage(CUPSD_LOG_INFO, "Generating SSL server key...");
-
- gnutls_x509_privkey_init(&key);
- gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, 2048, 0);
-
- /*
- * Save it...
- */
-
- bytes = sizeof(buffer);
-
- if ((result = gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM,
- buffer, &bytes)) < 0)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to export SSL server key - %s",
- gnutls_strerror(result));
- gnutls_x509_privkey_deinit(key);
- return (0);
- }
- else if ((fp = cupsFileOpen(ServerKey, "w")) != NULL)
- {
- cupsFileWrite(fp, (char *)buffer, bytes);
- cupsFileClose(fp);
-
- cupsdLogMessage(CUPSD_LOG_INFO, "Created SSL server key file \"%s\"...",
- ServerKey);
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create SSL server key file \"%s\" - %s",
- ServerKey, strerror(errno));
- gnutls_x509_privkey_deinit(key);
- return (0);
- }
-
- /*
- * Create the self-signed certificate...
- */
-
- cupsdLogMessage(CUPSD_LOG_INFO, "Generating self-signed SSL certificate...");
-
- language = cupsLangDefault();
- curtime = time(NULL);
- serial[0] = curtime >> 24;
- serial[1] = curtime >> 16;
- serial[2] = curtime >> 8;
- serial[3] = curtime;
-
- gnutls_x509_crt_init(&crt);
- if (strlen(language->language) == 5)
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0,
- language->language + 3, 2);
- else
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0,
- "US", 2);
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COMMON_NAME, 0,
- ServerName, strlen(ServerName));
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATION_NAME, 0,
- ServerName, strlen(ServerName));
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME,
- 0, "Unknown", 7);
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0,
- "Unknown", 7);
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_LOCALITY_NAME, 0,
- "Unknown", 7);
- gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_PKCS9_EMAIL, 0,
- ServerAdmin, strlen(ServerAdmin));
- gnutls_x509_crt_set_key(crt, key);
- gnutls_x509_crt_set_serial(crt, serial, sizeof(serial));
- gnutls_x509_crt_set_activation_time(crt, curtime);
- gnutls_x509_crt_set_expiration_time(crt, curtime + 10 * 365 * 86400);
- gnutls_x509_crt_set_ca_status(crt, 0);
- gnutls_x509_crt_set_subject_alternative_name(crt, GNUTLS_SAN_DNSNAME,
- ServerName);
- gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0);
- gnutls_x509_crt_set_key_usage(crt, GNUTLS_KEY_KEY_ENCIPHERMENT);
- gnutls_x509_crt_set_version(crt, 3);
-
- bytes = sizeof(buffer);
- if (gnutls_x509_crt_get_key_id(crt, 0, buffer, &bytes) >= 0)
- gnutls_x509_crt_set_subject_key_id(crt, buffer, bytes);
-
- gnutls_x509_crt_sign(crt, crt, key);
-
- /*
- * Save it...
- */
-
- bytes = sizeof(buffer);
- if ((result = gnutls_x509_crt_export(crt, GNUTLS_X509_FMT_PEM,
- buffer, &bytes)) < 0)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to export SSL server certificate - %s",
- gnutls_strerror(result));
- else if ((fp = cupsFileOpen(ServerCertificate, "w")) != NULL)
- {
- cupsFileWrite(fp, (char *)buffer, bytes);
- cupsFileClose(fp);
-
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Created SSL server certificate file \"%s\"...",
- ServerCertificate);
- }
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create SSL server certificate file \"%s\" - %s",
- ServerCertificate, strerror(errno));
-
- /*
- * Cleanup...
- */
-
- gnutls_x509_crt_deinit(crt);
- gnutls_x509_privkey_deinit(key);
-
- return (1);
-}
-
-
-/*
- * End of "$Id: tls-gnutls.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/tls-openssl.c b/scheduler/tls-openssl.c
deleted file mode 100644
index f123d28..0000000
--- a/scheduler/tls-openssl.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * "$Id: tls-openssl.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * TLS support code for the CUPS scheduler using OpenSSL.
- *
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdEndTLS() - Shutdown a secure session with the client.
- * cupsdStartTLS() - Start a secure session with the client.
- * make_certificate() - Make a self-signed SSL/TLS certificate.
- */
-
-
-/*
- * Local functions...
- */
-
-static int make_certificate(cupsd_client_t *con);
-
-
-/*
- * 'cupsdEndTLS()' - Shutdown a secure session with the client.
- */
-
-int /* O - 1 on success, 0 on error */
-cupsdEndTLS(cupsd_client_t *con) /* I - Client connection */
-{
- SSL_CTX *context; /* Context for encryption */
- unsigned long error; /* Error code */
- int status; /* Return status */
-
-
- context = SSL_get_SSL_CTX(con->http.tls);
-
- switch (SSL_shutdown(con->http.tls))
- {
- case 1 :
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "SSL shutdown successful!");
- status = 1;
- break;
-
- case -1 :
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Fatal error during SSL shutdown!");
-
- default :
- while ((error = ERR_get_error()) != 0)
- cupsdLogMessage(CUPSD_LOG_ERROR, "SSL shutdown failed: %s",
- ERR_error_string(error, NULL));
- status = 0;
- break;
- }
-
- SSL_CTX_free(context);
- SSL_free(con->http.tls);
- con->http.tls = NULL;
-
- return (status);
-}
-
-
-/*
- * 'cupsdStartTLS()' - Start a secure session with the client.
- */
-
-int /* O - 1 on success, 0 on error */
-cupsdStartTLS(cupsd_client_t *con) /* I - Client connection */
-{
- SSL_CTX *context; /* Context for encryption */
- BIO *bio; /* BIO data */
- unsigned long error; /* Error code */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Encrypting connection.",
- con->http.fd);
-
- /*
- * Verify that we have a certificate...
- */
-
- if (access(ServerKey, 0) || access(ServerCertificate, 0))
- {
- /*
- * Nope, make a self-signed certificate...
- */
-
- if (!make_certificate(con))
- return (0);
- }
-
- /*
- * Create the SSL context and accept the connection...
- */
-
- context = SSL_CTX_new(SSLv23_server_method());
-
- SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */
- if (SSLOptions & CUPSD_SSL_NOEMPTY)
- SSL_CTX_set_options(context, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
- SSL_CTX_use_PrivateKey_file(context, ServerKey, SSL_FILETYPE_PEM);
- SSL_CTX_use_certificate_chain_file(context, ServerCertificate);
-
- bio = BIO_new(_httpBIOMethods());
- BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)HTTP(con));
-
- con->http.tls = SSL_new(context);
- SSL_set_bio(con->http.tls, bio, bio);
-
- if (SSL_accept(con->http.tls) != 1)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to encrypt connection from %s.",
- con->http.hostname);
-
- while ((error = ERR_get_error()) != 0)
- cupsdLogMessage(CUPSD_LOG_ERROR, "%s", ERR_error_string(error, NULL));
-
- SSL_CTX_free(context);
- SSL_free(con->http.tls);
- con->http.tls = NULL;
- return (0);
- }
-
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
- con->http.hostname);
-
- return (1);
-}
-
-
-/*
- * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
- */
-
-static int /* O - 1 on success, 0 on failure */
-make_certificate(cupsd_client_t *con) /* I - Client connection */
-{
-#ifdef HAVE_WAITPID
- int pid, /* Process ID of command */
- status; /* Status of command */
- char command[1024], /* Command */
- *argv[12], /* Command-line arguments */
- *envp[MAX_ENV + 1], /* Environment variables */
- infofile[1024], /* Type-in information for cert */
- seedfile[1024]; /* Random number seed file */
- int envc, /* Number of environment variables */
- bytes; /* Bytes written */
- cups_file_t *fp; /* Seed/info file */
- int infofd; /* Info file descriptor */
-
-
- /*
- * Run the "openssl" command to seed the random number generator and
- * generate a self-signed certificate that is good for 10 years:
- *
- * openssl rand -rand seedfile 1
- *
- * openssl req -new -x509 -keyout ServerKey \
- * -out ServerCertificate -days 3650 -nodes
- *
- * The seeding step is crucial in ensuring that the openssl command
- * does not block on systems without sufficient entropy...
- */
-
- if (!cupsFileFind("openssl", getenv("PATH"), 1, command, sizeof(command)))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "No SSL certificate and openssl command not found!");
- return (0);
- }
-
- if (access("/dev/urandom", 0))
- {
- /*
- * If the system doesn't provide /dev/urandom, then any random source
- * will probably be blocking-style, so generate some random data to
- * use as a seed for the certificate. Note that we have already
- * seeded the random number generator in cupsdInitCerts()...
- */
-
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Seeding the random number generator...");
-
- /*
- * Write the seed file...
- */
-
- if ((fp = cupsTempFile2(seedfile, sizeof(seedfile))) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create seed file %s - %s",
- seedfile, strerror(errno));
- return (0);
- }
-
- for (bytes = 0; bytes < 262144; bytes ++)
- cupsFilePutChar(fp, CUPS_RAND());
-
- cupsFileClose(fp);
-
- /*
- * Run the openssl command to seed its random number generator...
- */
-
- argv[0] = "openssl";
- argv[1] = "rand";
- argv[2] = "-rand";
- argv[3] = seedfile;
- argv[4] = "1";
- argv[5] = NULL;
-
- envc = cupsdLoadEnv(envp, MAX_ENV);
- envp[envc] = NULL;
-
- if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL,
- NULL, &pid))
- {
- unlink(seedfile);
- return (0);
- }
-
- while (waitpid(pid, &status, 0) < 0)
- if (errno != EINTR)
- {
- status = 1;
- break;
- }
-
- cupsdFinishProcess(pid, command, sizeof(command), NULL);
-
- /*
- * Remove the seed file, as it is no longer needed...
- */
-
- unlink(seedfile);
-
- if (status)
- {
- if (WIFEXITED(status))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to seed random number generator - "
- "the openssl command stopped with status %d!",
- WEXITSTATUS(status));
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to seed random number generator - "
- "the openssl command crashed on signal %d!",
- WTERMSIG(status));
-
- return (0);
- }
- }
-
- /*
- * Create a file with the certificate information fields...
- *
- * Note: This assumes that the default questions are asked by the openssl
- * command...
- */
-
- if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create certificate information file %s - %s",
- infofile, strerror(errno));
- return (0);
- }
-
- cupsFilePrintf(fp, ".\n.\n.\n%s\n.\n%s\n%s\n",
- ServerName, ServerName, ServerAdmin);
- cupsFileClose(fp);
-
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Generating SSL server key and certificate...");
-
- argv[0] = "openssl";
- argv[1] = "req";
- argv[2] = "-new";
- argv[3] = "-x509";
- argv[4] = "-keyout";
- argv[5] = ServerKey;
- argv[6] = "-out";
- argv[7] = ServerCertificate;
- argv[8] = "-days";
- argv[9] = "3650";
- argv[10] = "-nodes";
- argv[11] = NULL;
-
- cupsdLoadEnv(envp, MAX_ENV);
-
- infofd = open(infofile, O_RDONLY);
-
- if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
- NULL, &pid))
- {
- close(infofd);
- unlink(infofile);
- return (0);
- }
-
- close(infofd);
- unlink(infofile);
-
- while (waitpid(pid, &status, 0) < 0)
- if (errno != EINTR)
- {
- status = 1;
- break;
- }
-
- cupsdFinishProcess(pid, command, sizeof(command), NULL);
-
- if (status)
- {
- if (WIFEXITED(status))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create SSL server key and certificate - "
- "the openssl command stopped with status %d!",
- WEXITSTATUS(status));
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create SSL server key and certificate - "
- "the openssl command crashed on signal %d!",
- WTERMSIG(status));
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_INFO, "Created SSL server key file \"%s\"...",
- ServerKey);
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Created SSL server certificate file \"%s\"...",
- ServerCertificate);
- }
-
- return (!status);
-
-#else
- return (0);
-#endif /* HAVE_WAITPID */
-}
-
-
-/*
- * End of "$Id: tls-openssl.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/tls.c b/scheduler/tls.c
deleted file mode 100644
index bd18263..0000000
--- a/scheduler/tls.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * "$Id: tls.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * TLS support code for the CUPS scheduler.
- *
- * Copyright 2012 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- */
-
-#include "cupsd.h"
-
-#ifdef HAVE_SSL
-# ifdef HAVE_CDSASSL
-# include "tls-darwin.c"
-# elif defined(HAVE_GNUTLS)
-# include "tls-gnutls.c"
-# elif defined(HAVE_LIBSSL)
-# include "tls-openssl.c"
-# endif /* HAVE_CDSASSL */
-#endif /* HAVE_SSL */
-
-
-/*
- * End of "$Id: tls.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/type.c b/scheduler/type.c
index bf014be..68ed07e 100644
--- a/scheduler/type.c
+++ b/scheduler/type.c
@@ -1,26 +1,16 @@
/*
- * "$Id: type.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: type.c 12577 2015-03-30 19:07:17Z msweet $"
*
- * MIME typing routines for CUPS.
+ * MIME typing routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * mimeAddType() - Add a MIME type to a database.
- * mimeAddTypeRule() - Add a detection rule for a file type.
- * mimeFileType() - Determine the type of a file.
- * mimeType() - Lookup a file type.
- * mime_compare_types() - Compare two MIME super/type names.
- * mime_check_rules() - Check each rule in a list.
- * mime_patmatch() - Pattern matching.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -319,7 +309,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
*/
ptr = name;
- while (isalnum(*rule & 255) && (ptr - name) < (sizeof(name) - 1))
+ while (isalnum(*rule & 255) && (size_t)(ptr - name) < (sizeof(name) - 1))
*ptr++ = *rule++;
*ptr = '\0';
@@ -332,12 +322,12 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
rule ++;
for (num_values = 0;
- num_values < (sizeof(value) / sizeof(value[0]));
+ num_values < (int)(sizeof(value) / sizeof(value[0]));
num_values ++)
{
ptr = value[num_values];
- while ((ptr - value[num_values]) < (sizeof(value[0]) - 1) &&
+ while ((size_t)(ptr - value[num_values]) < (sizeof(value[0]) - 1) &&
*rule != '\0' && *rule != ',' && *rule != ')')
{
if (isspace(*rule & 255))
@@ -358,7 +348,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
quote = *rule++;
while (*rule != '\0' && *rule != quote &&
- (ptr - value[num_values]) < (sizeof(value[0]) - 1))
+ (size_t)(ptr - value[num_values]) < (sizeof(value[0]) - 1))
*ptr++ = *rule++;
if (*rule == quote)
@@ -371,14 +361,14 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
rule ++;
while (*rule != '>' && *rule != '\0' &&
- (ptr - value[num_values]) < (sizeof(value[0]) - 1))
+ (size_t)(ptr - value[num_values]) < (sizeof(value[0]) - 1))
{
if (isxdigit(rule[0] & 255) && isxdigit(rule[1] & 255))
{
if (isdigit(*rule))
- *ptr = (*rule++ - '0') << 4;
+ *ptr = (char)((*rule++ - '0') << 4);
else
- *ptr = (tolower(*rule++) - 'a' + 10) << 4;
+ *ptr = (char)((tolower(*rule++) - 'a' + 10) << 4);
if (isdigit(*rule))
*ptr++ |= *rule++ - '0';
@@ -425,6 +415,8 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
op = MIME_MAGIC_ASCII;
else if (!strcmp(name, "printable"))
op = MIME_MAGIC_PRINTABLE;
+ else if (!strcmp(name, "regex"))
+ op = MIME_MAGIC_REGEX;
else if (!strcmp(name, "string"))
op = MIME_MAGIC_STRING;
else if (!strcmp(name, "istring"))
@@ -454,7 +446,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
*/
snprintf(value[0], sizeof(value[0]), "*.%s", name);
- length[0] = strlen(value[0]);
+ length[0] = (int)strlen(value[0]);
op = MIME_MAGIC_MATCH;
}
@@ -465,7 +457,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL)
return (-1);
- temp->invert = invert;
+ temp->invert = (short)invert;
if (current != NULL)
{
temp->parent = current->parent;
@@ -507,15 +499,15 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
*/
current = temp;
- temp->op = op;
+ temp->op = (short)op;
invert = 0;
switch (op)
{
case MIME_MAGIC_MATCH :
- if (length[0] > (sizeof(temp->value.matchv) - 1))
+ if ((size_t)length[0] > (sizeof(temp->value.matchv) - 1))
return (-1);
- strcpy(temp->value.matchv, value[0]);
+ strlcpy(temp->value.matchv, value[0], sizeof(temp->value.matchv));
break;
case MIME_MAGIC_ASCII :
case MIME_MAGIC_PRINTABLE :
@@ -524,18 +516,24 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
if (temp->length > MIME_MAX_BUFFER)
temp->length = MIME_MAX_BUFFER;
break;
+ case MIME_MAGIC_REGEX :
+ temp->offset = strtol(value[0], NULL, 0);
+ temp->length = MIME_MAX_BUFFER;
+ if (regcomp(&(temp->value.rev), value[1], REG_NOSUB | REG_EXTENDED))
+ return (-1);
+ break;
case MIME_MAGIC_STRING :
case MIME_MAGIC_ISTRING :
temp->offset = strtol(value[0], NULL, 0);
- if (length[1] > sizeof(temp->value.stringv))
+ if ((size_t)length[1] > sizeof(temp->value.stringv))
return (-1);
temp->length = length[1];
- memcpy(temp->value.stringv, value[1], length[1]);
+ memcpy(temp->value.stringv, value[1], (size_t)length[1]);
break;
case MIME_MAGIC_CHAR :
temp->offset = strtol(value[0], NULL, 0);
if (length[1] == 1)
- temp->value.charv = value[1][0];
+ temp->value.charv = (unsigned char)value[1][0];
else
temp->value.charv = (unsigned char)strtol(value[1], NULL, 0);
@@ -551,18 +549,18 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
temp->value.intv = (unsigned)strtol(value[1], NULL, 0);
break;
case MIME_MAGIC_LOCALE :
- if (length[0] > (sizeof(temp->value.localev) - 1))
+ if ((size_t)length[0] > (sizeof(temp->value.localev) - 1))
return (-1);
- strcpy(temp->value.localev, value[0]);
+ strlcpy(temp->value.localev, value[0], sizeof(temp->value.localev));
break;
case MIME_MAGIC_CONTAINS :
temp->offset = strtol(value[0], NULL, 0);
temp->region = strtol(value[1], NULL, 0);
- if (length[2] > sizeof(temp->value.stringv))
+ if ((size_t)length[2] > sizeof(temp->value.stringv))
return (-1);
temp->length = length[2];
- memcpy(temp->value.stringv, value[2], length[2]);
+ memcpy(temp->value.stringv, value[2], (size_t)length[2]);
break;
}
}
@@ -615,8 +613,23 @@ mimeFileType(mime_t *mime, /* I - MIME database */
return (NULL);
}
- fb.offset = -1;
- fb.length = 0;
+ /*
+ * Then preload the first MIME_MAX_BUFFER bytes of the file into the file
+ * buffer, returning an error if we can't read anything...
+ */
+
+ fb.offset = 0;
+ fb.length = (int)cupsFileRead(fb.fp, (char *)fb.buffer, MIME_MAX_BUFFER);
+
+ if (fb.length <= 0)
+ {
+ DEBUG_printf(("1mimeFileType: Unable to read from \"%s\": %s", pathname, strerror(errno)));
+ DEBUG_puts("1mimeFileType: Returning NULL.");
+
+ cupsFileClose(fb.fp);
+
+ return (NULL);
+ }
/*
* Figure out the base filename (without directory portion)...
@@ -735,8 +748,8 @@ mime_check_rules(
int n; /* Looping var */
int region; /* Region to look at */
int logic, /* Logic to apply */
- result, /* Result of test */
- intv; /* Integer value */
+ result; /* Result of test */
+ unsigned intv; /* Integer value */
short shortv; /* Short value */
unsigned char *bufptr; /* Pointer into buffer */
@@ -782,6 +795,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_ASCII fb->length=%d", fb->length));
}
/*
@@ -824,6 +839,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_PRINTABLE fb->length=%d", fb->length));
}
/*
@@ -852,6 +869,52 @@ mime_check_rules(
result = (n == 0);
break;
+ case MIME_MAGIC_REGEX :
+ DEBUG_printf(("5mime_check_rules: regex(%d, \"%s\")", rules->offset,
+ rules->value.stringv));
+
+ /*
+ * Load the buffer if necessary...
+ */
+
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + rules->length) > (fb->offset + fb->length))
+ {
+ /*
+ * Reload file buffer...
+ */
+
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_REGEX fb->length=%d", fb->length));
+
+ DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts "
+ "with \"%c%c%c%c\".",
+ fb->length, fb->offset, fb->buffer[0], fb->buffer[1],
+ fb->buffer[2], fb->buffer[3]));
+ }
+
+ /*
+ * Compare the buffer against the string. If the file is too
+ * short then don't compare - it can't match...
+ */
+
+ if (fb->length > 0)
+ {
+ char temp[MIME_MAX_BUFFER + 1];
+ /* Temporary buffer */
+
+ memcpy(temp, fb->buffer, (size_t)fb->length);
+ temp[fb->length] = '\0';
+ result = !regexec(&(rules->value.rev), temp, 0, NULL, 0);
+ }
+
+ DEBUG_printf(("5mime_check_rules: result=%d", result));
+ break;
+
case MIME_MAGIC_STRING :
DEBUG_printf(("5mime_check_rules: string(%d, \"%s\")", rules->offset,
rules->value.stringv));
@@ -872,6 +935,8 @@ mime_check_rules(
sizeof(fb->buffer));
fb->offset = rules->offset;
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_STRING fb->length=%d", fb->length));
+
DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts "
"with \"%c%c%c%c\".",
fb->length, fb->offset, fb->buffer[0], fb->buffer[1],
@@ -886,8 +951,7 @@ mime_check_rules(
if ((rules->offset + rules->length) > (fb->offset + fb->length))
result = 0;
else
- result = (memcmp(fb->buffer + rules->offset - fb->offset,
- rules->value.stringv, rules->length) == 0);
+ result = !memcmp(fb->buffer + rules->offset - fb->offset, rules->value.stringv, (size_t)rules->length);
DEBUG_printf(("5mime_check_rules: result=%d", result));
break;
@@ -907,6 +971,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_ISTRING fb->length=%d", fb->length));
}
/*
@@ -917,9 +983,7 @@ mime_check_rules(
if ((rules->offset + rules->length) > (fb->offset + fb->length))
result = 0;
else
- result = (_cups_strncasecmp((char *)fb->buffer + rules->offset -
- fb->offset,
- rules->value.stringv, rules->length) == 0);
+ result = !_cups_strncasecmp((char *)fb->buffer + rules->offset - fb->offset, rules->value.stringv, (size_t)rules->length);
break;
case MIME_MAGIC_CHAR :
@@ -937,6 +1001,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_CHAR fb->length=%d", fb->length));
}
/*
@@ -967,6 +1033,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_SHORT fb->length=%d", fb->length));
}
/*
@@ -979,7 +1047,7 @@ mime_check_rules(
else
{
bufptr = fb->buffer + rules->offset - fb->offset;
- shortv = (bufptr[0] << 8) | bufptr[1];
+ shortv = (short)((bufptr[0] << 8) | bufptr[1]);
result = (shortv == rules->value.shortv);
}
break;
@@ -1000,6 +1068,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_INT fb->length=%d", fb->length));
}
/*
@@ -1012,19 +1082,16 @@ mime_check_rules(
else
{
bufptr = fb->buffer + rules->offset - fb->offset;
- intv = (((((bufptr[0] << 8) | bufptr[1]) << 8) |
- bufptr[2]) << 8) | bufptr[3];
+ intv = (unsigned)((((((bufptr[0] << 8) | bufptr[1]) << 8) | bufptr[2]) << 8) | bufptr[3]);
result = (intv == rules->value.intv);
}
break;
case MIME_MAGIC_LOCALE :
#if defined(WIN32) || defined(__EMX__) || defined(__APPLE__)
- result = (strcmp(rules->value.localev,
- setlocale(LC_ALL, "")) == 0);
+ result = !strcmp(rules->value.localev, setlocale(LC_ALL, ""));
#else
- result = (strcmp(rules->value.localev,
- setlocale(LC_MESSAGES, "")) == 0);
+ result = !strcmp(rules->value.localev, setlocale(LC_MESSAGES, ""));
#endif /* __APPLE__ */
break;
@@ -1044,6 +1111,8 @@ mime_check_rules(
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;
+
+ DEBUG_printf(("4mime_check_rules: MIME_MAGIC_CONTAINS fb->length=%d", fb->length));
}
/*
@@ -1061,9 +1130,7 @@ mime_check_rules(
region = fb->length - rules->length;
for (n = 0; n < region; n ++)
- if ((result = (memcmp(fb->buffer + rules->offset - fb->offset + n,
- rules->value.stringv,
- rules->length) == 0)) != 0)
+ if ((result = (memcmp(fb->buffer + rules->offset - fb->offset + n, rules->value.stringv, (size_t)rules->length) == 0)) != 0)
break;
}
break;
@@ -1212,5 +1279,5 @@ mime_patmatch(const char *s, /* I - String to match against */
/*
- * End of "$Id: type.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: type.c 12577 2015-03-30 19:07:17Z msweet $".
*/
diff --git a/scheduler/util.c b/scheduler/util.c
index 74dd9ff..a31be2e 100644
--- a/scheduler/util.c
+++ b/scheduler/util.c
@@ -1,28 +1,16 @@
/*
- * "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: util.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Mini-daemon utility functions for CUPS.
+ * Mini-daemon utility functions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * cupsdCompareNames() - Compare two names.
- * cupsdCreateStringsArray() - Create a CUPS array of strings.
- * cupsdExec() - Run a program with the correct environment.
- * cupsdPipeCommand() - Read output from a command.
- * cupsdSendIPPGroup() - Send a group tag.
- * cupsdSendIPPHeader() - Send the IPP response header.
- * cupsdSendIPPInteger() - Send an integer attribute.
- * cupsdSendIPPString() - Send a string attribute.
- * cupsdSendIPPTrailer() - Send the end-of-message tag.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -163,7 +151,7 @@ cupsdCreateStringsArray(const char *s) /* I - Comma-delimited strings */
if (!s || !*s)
return (NULL);
else
- return (_cupsArrayNewStrings(s));
+ return (_cupsArrayNewStrings(s, ','));
}
@@ -251,7 +239,7 @@ cups_file_t * /* O - CUPS file or NULL on error */
cupsdPipeCommand(int *pid, /* O - Process ID or 0 on error */
const char *command, /* I - Command to run */
char **argv, /* I - Arguments to pass to command */
- int user) /* I - User to run as or 0 for current */
+ uid_t user) /* I - User to run as or 0 for current */
{
int fd, /* Temporary file descriptor */
fds[2]; /* Pipe file descriptors */
@@ -404,8 +392,8 @@ cupsdSendIPPInteger(
putchar(value_tag);
len = strlen(name);
- putchar(len >> 8);
- putchar(len);
+ putchar((int)(len >> 8));
+ putchar((int)len);
fputs(name, stdout);
@@ -441,14 +429,14 @@ cupsdSendIPPString(
putchar(value_tag);
len = strlen(name);
- putchar(len >> 8);
- putchar(len);
+ putchar((int)(len >> 8));
+ putchar((int)len);
fputs(name, stdout);
len = strlen(value);
- putchar(len >> 8);
- putchar(len);
+ putchar((int)(len >> 8));
+ putchar((int)len);
fputs(value, stdout);
}
@@ -467,5 +455,5 @@ cupsdSendIPPTrailer(void)
/*
- * End of "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: util.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/scheduler/util.h b/scheduler/util.h
index cf5ae0d..08b495c 100644
--- a/scheduler/util.h
+++ b/scheduler/util.h
@@ -1,16 +1,16 @@
/*
- * "$Id: util.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: util.h 11558 2014-02-06 18:33:34Z msweet $"
*
- * Mini-daemon utility definitions for CUPS.
+ * Mini-daemon utility definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#ifndef _CUPSD_UTIL_H_
@@ -49,7 +49,7 @@ extern int cupsdCompareNames(const char *s, const char *t);
extern cups_array_t *cupsdCreateStringsArray(const char *s);
extern int cupsdExec(const char *command, char **argv);
extern cups_file_t *cupsdPipeCommand(int *pid, const char *command,
- char **argv, int user);
+ char **argv, uid_t user);
extern void cupsdSendIPPGroup(ipp_tag_t group_tag);
extern void cupsdSendIPPHeader(ipp_status_t status_code,
int request_id);
@@ -67,5 +67,5 @@ extern void cupsdSendIPPTrailer(void);
#endif /* !_CUPSD_UTIL_H_ */
/*
- * End of "$Id: util.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: util.h 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/systemv/Dependencies b/systemv/Dependencies
index 84fc07b..effbf99 100644
--- a/systemv/Dependencies
+++ b/systemv/Dependencies
@@ -1,93 +1,89 @@
cancel.o: cancel.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
cupsaccept.o: cupsaccept.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
cupsaddsmb.o: cupsaddsmb.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/adminutil.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/adminutil.h
cupsctl.o: cupsctl.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/adminutil.h
cupstestdsc.o: cupstestdsc.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
cupstestppd.o: cupstestppd.c ../cups/cups-private.h \
../cups/string-private.h ../config.h ../cups/debug-private.h \
- ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
- ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
- ../cups/dir.h ../cups/raster.h
+ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+ ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h ../cups/dir.h ../cups/raster.h
lp.o: lp.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
- ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
- ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
- ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
- ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+ ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+ ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+ ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+ ../cups/ppd.h ../cups/thread-private.h
lpadmin.o: lpadmin.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
lpinfo.o: lpinfo.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
lpmove.o: lpmove.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
lpoptions.o: lpoptions.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
- ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
-lppasswd.o: lppasswd.c ../cups/cups-private.h ../cups/string-private.h \
- ../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
lpstat.o: lpstat.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
diff --git a/systemv/Makefile b/systemv/Makefile
index c034255..62b9da7 100644
--- a/systemv/Makefile
+++ b/systemv/Makefile
@@ -1,25 +1,25 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11776 2014-03-28 19:16:05Z msweet $"
#
-# System V commands makefile for CUPS.
+# System V commands makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2006 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2006 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
TARGETS = cancel cupsaccept cupsaddsmb cupsctl cupstestdsc cupstestppd \
- lp lpadmin lpinfo lpmove lpoptions lppasswd lpstat
+ lp lpadmin lpinfo lpmove lpoptions lpstat
OBJS = cancel.o cupsaccept.o cupsaddsmb.o cupsctl.o cupstestdsc.o \
cupstestppd.o lp.o lpadmin.o lpinfo.o lpmove.o lpoptions.o \
- lppasswd.o lpstat.o
+ lpstat.o
#
@@ -105,11 +105,11 @@ install-exec:
$(INSTALL_BIN) lp $(BINDIR)
$(INSTALL_BIN) lpoptions $(BINDIR)
$(INSTALL_BIN) lpstat $(BINDIR)
- $(INSTALL_BIN) lppasswd $(BINDIR)
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
for file in $(TARGETS); do \
cp $$file $(SYMROOT); \
+ dsymutil $(SYMROOT)/$$file; \
done \
fi
@@ -138,7 +138,6 @@ uninstall:
$(RM) $(BINDIR)/cupstestppd
$(RM) $(BINDIR)/lp
$(RM) $(BINDIR)/lpoptions
- $(RM) $(BINDIR)/lppasswd
$(RM) $(BINDIR)/lpstat
-$(RMDIR) $(BINDIR)
$(RM) $(SBINDIR)/accept
@@ -264,15 +263,6 @@ lpoptions: lpoptions.o ../cups/$(LIBCUPS)
#
-# lppasswd
-#
-
-lppasswd: lppasswd.o ../cups/$(LIBCUPS)
- echo Linking $@...
- $(CC) $(LDFLAGS) -o lppasswd lppasswd.o $(LIBZ) $(LIBS)
-
-
-#
# lpstat
#
@@ -289,5 +279,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 11776 2014-03-28 19:16:05Z msweet $".
#
diff --git a/systemv/cancel.c b/systemv/cancel.c
index 678903f..3881102 100644
--- a/systemv/cancel.c
+++ b/systemv/cancel.c
@@ -1,9 +1,9 @@
/*
- * "$Id: cancel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cancel.c 12247 2014-11-12 16:23:39Z msweet $"
*
* "cancel" command for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -68,6 +68,7 @@ main(int argc, /* I - Number of command-line arguments */
for (i = 1; i < argc; i ++)
if (argv[i][0] == '-' && argv[i][1])
+ {
switch (argv[i][1])
{
case 'E' : /* Encrypt */
@@ -101,8 +102,7 @@ main(int argc, /* I - Number of command-line arguments */
break;
case 'a' : /* Cancel all jobs */
- purge = 1;
- op = IPP_PURGE_JOBS;
+ op = purge ? IPP_PURGE_JOBS : IPP_CANCEL_JOBS;
break;
case 'h' : /* Connect to host */
@@ -131,7 +131,7 @@ main(int argc, /* I - Number of command-line arguments */
break;
case 'u' : /* Username */
- op = IPP_PURGE_JOBS;
+ op = IPP_CANCEL_MY_JOBS;
if (argv[i][2] != '\0')
user = argv[i] + 2;
@@ -151,12 +151,20 @@ main(int argc, /* I - Number of command-line arguments */
}
break;
+ case 'x' : /* Purge job(s) */
+ purge = 1;
+
+ if (op == IPP_CANCEL_JOBS)
+ op = IPP_PURGE_JOBS;
+ break;
+
default :
_cupsLangPrintf(stderr,
_("%s: Error - unknown option \"%c\"."),
argv[0], argv[i][1]);
return (1);
}
+ }
else
{
/*
@@ -271,19 +279,22 @@ main(int argc, /* I - Number of command-line arguments */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, user);
ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
+
+ if (op == IPP_CANCEL_JOBS)
+ op = IPP_CANCEL_MY_JOBS;
}
else
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, cupsUser());
- if (op == IPP_PURGE_JOBS)
+ if (purge)
ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", purge);
/*
* Do the request and get back a response...
*/
- if (op == IPP_PURGE_JOBS && (!user || _cups_strcasecmp(user, cupsUser())))
+ if (op == IPP_CANCEL_JOBS && (!user || _cups_strcasecmp(user, cupsUser())))
response = cupsDoRequest(http, request, "/admin/");
else
response = cupsDoRequest(http, request, "/jobs/");
@@ -304,7 +315,7 @@ main(int argc, /* I - Number of command-line arguments */
ippDelete(response);
}
- if (num_dests == 0 && op == IPP_PURGE_JOBS)
+ if (num_dests == 0 && op != IPP_CANCEL_JOB)
{
/*
* Open a connection to the server...
@@ -372,5 +383,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: cancel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cancel.c 12247 2014-11-12 16:23:39Z msweet $".
*/
diff --git a/systemv/cupsaccept.c b/systemv/cupsaccept.c
index 0ba756c..67a682c 100644
--- a/systemv/cupsaccept.c
+++ b/systemv/cupsaccept.c
@@ -1,5 +1,5 @@
/*
- * "$Id: cupsaccept.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsaccept.c 2873 2010-11-30 03:16:24Z msweet $"
*
* "cupsaccept", "cupsdisable", "cupsenable", and "cupsreject" commands for
* CUPS.
@@ -235,5 +235,5 @@ main(int argc, /* I - Number of command-line arguments */
/*
- * End of "$Id: cupsaccept.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsaccept.c 2873 2010-11-30 03:16:24Z msweet $".
*/
diff --git a/systemv/cupsaddsmb.c b/systemv/cupsaddsmb.c
index e1a82f7..48c99ae 100644
--- a/systemv/cupsaddsmb.c
+++ b/systemv/cupsaddsmb.c
@@ -1,5 +1,5 @@
/*
- * "$Id: cupsaddsmb.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsaddsmb.c 10996 2013-05-29 11:51:34Z msweet $"
*
* "cupsaddsmb" command for CUPS.
*
@@ -295,5 +295,5 @@ usage(void)
/*
- * End of "$Id: cupsaddsmb.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsaddsmb.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/systemv/cupsctl.c b/systemv/cupsctl.c
index 4c5a9f1..09d66ea 100644
--- a/systemv/cupsctl.c
+++ b/systemv/cupsctl.c
@@ -1,5 +1,5 @@
/*
- * "$Id: cupsctl.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsctl.c 10996 2013-05-29 11:51:34Z msweet $"
*
* Scheduler control program for CUPS.
*
@@ -223,5 +223,5 @@ usage(const char *opt) /* I - Option character/string */
/*
- * End of "$Id: cupsctl.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsctl.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/systemv/cupstestdsc.c b/systemv/cupstestdsc.c
index 96ff9a3..5e2c809 100644
--- a/systemv/cupstestdsc.c
+++ b/systemv/cupstestdsc.c
@@ -1,5 +1,5 @@
/*
- * "$Id: cupstestdsc.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupstestdsc.c 10996 2013-05-29 11:51:34Z msweet $"
*
* DSC test program for CUPS.
*
@@ -438,5 +438,5 @@ usage(void)
/*
- * End of "$Id: cupstestdsc.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupstestdsc.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c
index dfa5300..9c6be59 100644
--- a/systemv/cupstestppd.c
+++ b/systemv/cupstestppd.c
@@ -1,9 +1,9 @@
/*
- * "$Id: cupstestppd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupstestppd.c 12583 2015-04-03 00:33:05Z msweet $"
*
* PPD test program for CUPS.
*
- * Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -15,26 +15,6 @@
* PostScript is a trademark of Adobe Systems, Inc.
*
* This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry for test program.
- * check_basics() - Check for CR LF, mixed line endings, and blank
- * lines.
- * check_constraints() - Check UIConstraints in the PPD file.
- * check_case() - Check that there are no duplicate groups, options,
- * or choices that differ only by case.
- * check_defaults() - Check default option keywords in the PPD file.
- * check_duplex() - Check duplex keywords in the PPD file.
- * check_filters() - Check filters in the PPD file.
- * check_profiles() - Check ICC color profiles in the PPD file.
- * check_sizes() - Check media sizes in the PPD file.
- * check_translations() - Check translations in the PPD file.
- * show_conflicts() - Show option conflicts in a PPD file.
- * test_raster() - Test PostScript commands for raster printers.
- * usage() - Show program usage.
- * valid_path() - Check whether a path has the correct capitalization.
- * valid_utf8() - Check whether a string contains valid UTF-8 text.
*/
/*
@@ -144,7 +124,7 @@ main(int argc, /* I - Number of command-line args */
char *argv[]) /* I - Command-line arguments */
{
int i, j, k, m, n; /* Looping vars */
- int len; /* Length of option name */
+ size_t len; /* Length of option name */
char *opt; /* Option character */
const char *ptr; /* Pointer into string */
cups_file_t *fp; /* PPD file */
@@ -1470,7 +1450,7 @@ main(int argc, /* I - Number of command-line args */
k < group->num_options;
k ++, option ++)
{
- len = (int)strlen(option->keyword);
+ len = strlen(option->keyword);
for (m = 0, group2 = ppd->groups;
m < ppd->num_groups;
@@ -1479,7 +1459,7 @@ main(int argc, /* I - Number of command-line args */
n < group2->num_options;
n ++, option2 ++)
if (option != option2 &&
- len < (int)strlen(option2->keyword) &&
+ len < strlen(option2->keyword) &&
!strncmp(option->keyword, option2->keyword, len))
{
_cupsLangPrintf(stdout,
@@ -1880,7 +1860,7 @@ check_constraints(ppd_file_t *ppd, /* I - PPD file */
if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True"))
{
_cups_strcpy(option, option + 6);
- strcpy(choice, "Custom");
+ strlcpy(choice, "Custom", sizeof(choice));
}
if ((o = ppdFindOption(ppd, option)) == NULL)
@@ -1981,13 +1961,13 @@ check_constraints(ppd_file_t *ppd, /* I - PPD file */
if (!_cups_strncasecmp(c->option1, "Custom", 6) &&
!_cups_strcasecmp(c->choice1, "True"))
{
- strcpy(option, c->option1 + 6);
- strcpy(choice, "Custom");
+ strlcpy(option, c->option1 + 6, sizeof(option));
+ strlcpy(choice, "Custom", sizeof(choice));
}
else
{
- strcpy(option, c->option1);
- strcpy(choice, c->choice1);
+ strlcpy(option, c->option1, sizeof(option));
+ strlcpy(choice, c->choice1, sizeof(choice));
}
if ((o = ppdFindOption(ppd, option)) == NULL)
@@ -2022,13 +2002,13 @@ check_constraints(ppd_file_t *ppd, /* I - PPD file */
if (!_cups_strncasecmp(c->option2, "Custom", 6) &&
!_cups_strcasecmp(c->choice2, "True"))
{
- strcpy(option, c->option2 + 6);
- strcpy(choice, "Custom");
+ strlcpy(option, c->option2 + 6, sizeof(option));
+ strlcpy(choice, "Custom", sizeof(choice));
}
else
{
- strcpy(option, c->option2);
- strcpy(choice, c->choice2);
+ strlcpy(option, c->option2, sizeof(option));
+ strlcpy(choice, c->choice2, sizeof(choice));
}
if ((o = ppdFindOption(ppd, option)) == NULL)
@@ -2391,8 +2371,40 @@ check_filters(ppd_file_t *ppd, /* I - PPD file */
if (!warn)
errors ++;
+
+ continue;
}
- else if (strcmp(program, "-"))
+
+ if (!strncmp(program, "maxsize(", 8))
+ {
+ char *mptr; /* Pointer into maxsize(nnnn) program */
+
+ strtoll(program + 8, &mptr, 10);
+
+ if (*mptr != ')')
+ {
+ if (!warn && !errors && !verbose)
+ _cupsLangPuts(stdout, _(" FAIL"));
+
+ if (verbose >= 0)
+ _cupsLangPrintf(stdout,
+ _(" %s Bad cupsFilter value \"%s\"."),
+ prefix, attr->value);
+
+ if (!warn)
+ errors ++;
+
+ continue;
+ }
+
+ mptr ++;
+ while (_cups_isspace(*mptr))
+ mptr ++;
+
+ _cups_strcpy(program, mptr);
+ }
+
+ if (strcmp(program, "-"))
{
if (program[0] == '/')
snprintf(pathprog, sizeof(pathprog), "%s%s", root, program);
@@ -2477,8 +2489,40 @@ check_filters(ppd_file_t *ppd, /* I - PPD file */
if (!warn)
errors ++;
+
+ continue;
}
- else if (strcmp(program, "-"))
+
+ if (!strncmp(program, "maxsize(", 8))
+ {
+ char *mptr; /* Pointer into maxsize(nnnn) program */
+
+ strtoll(program + 8, &mptr, 10);
+
+ if (*mptr != ')')
+ {
+ if (!warn && !errors && !verbose)
+ _cupsLangPuts(stdout, _(" FAIL"));
+
+ if (verbose >= 0)
+ _cupsLangPrintf(stdout,
+ _(" %s Bad cupsFilter2 value \"%s\"."),
+ prefix, attr->value);
+
+ if (!warn)
+ errors ++;
+
+ continue;
+ }
+
+ mptr ++;
+ while (_cups_isspace(*mptr))
+ mptr ++;
+
+ _cups_strcpy(program, mptr);
+ }
+
+ if (strcmp(program, "-"))
{
if (strncmp(program, "maxsize(", 8) &&
(ptr = strchr(program + 8, ')')) != NULL)
@@ -3080,8 +3124,8 @@ check_sizes(ppd_file_t *ppd, /* I - PPD file */
const char *prefix; /* WARN/FAIL prefix */
ppd_option_t *page_size, /* PageSize option */
*page_region; /* PageRegion option */
- _pwg_media_t *pwg_media; /* PWG media */
- char buf[1024]; /* PapeSize name that is supposed to be */
+ _pwg_media_t *pwg_media; /* PWG media */
+ char buf[PPD_MAX_NAME]; /* PapeSize name that is supposed to be */
const char *ptr; /* Pointer into string */
int width_2540ths, /* PageSize width in 2540ths */
length_2540ths; /* PageSize length in 2540ths */
@@ -3210,14 +3254,20 @@ check_sizes(ppd_file_t *ppd, /* I - PPD file */
{
is_ok = 1;
width_2540ths = (size->length > size->width) ?
- _PWG_FROMPTS(size->width) :
- _PWG_FROMPTS(size->length);
+ PWG_FROM_POINTS(size->width) :
+ PWG_FROM_POINTS(size->length);
length_2540ths = (size->length > size->width) ?
- _PWG_FROMPTS(size->length) :
- _PWG_FROMPTS(size->width);
- pwg_media = _pwgMediaForSize(width_2540ths, length_2540ths);
+ PWG_FROM_POINTS(size->length) :
+ PWG_FROM_POINTS(size->width);
+ pwg_media = pwgMediaForSize(width_2540ths, length_2540ths);
- if (pwg_media && pwg_media->ppd && (pwg_media->ppd[0] < 'a' || pwg_media->ppd[0] > 'z'))
+ if (pwg_media &&
+ (abs(pwg_media->width - width_2540ths) > 34 ||
+ abs(pwg_media->length - length_2540ths) > 34))
+ pwg_media = NULL; /* Only flag matches within a point */
+
+ if (pwg_media && pwg_media->ppd &&
+ (pwg_media->ppd[0] < 'a' || pwg_media->ppd[0] > 'z'))
{
size_t ppdlen = strlen(pwg_media->ppd);
/* Length of standard PPD name */
@@ -3232,6 +3282,8 @@ check_sizes(ppd_file_t *ppd, /* I - PPD file */
snprintf(buf, sizeof(buf), "%s.Transverse", pwg_media->ppd);
else
snprintf(buf, sizeof(buf), "%sRotated", pwg_media->ppd);
+
+ ppdlen = strlen(buf);
}
if (size->left == 0 && size->bottom == 0 &&
@@ -3300,7 +3352,7 @@ check_sizes(ppd_file_t *ppd, /* I - PPD file */
length_tmp = (fabs(size->length - ceil(size->length)) < 0.1) ?
ceil(size->length) : size->length;
- if (fmod(width_tmp, 18.0) == 0.0 || fmod(length_tmp, 18.0) == 0.0)
+ if (fmod(width_tmp, 9.0) == 0.0 && fmod(length_tmp, 9.0) == 0.0)
{
width_inch = width_tmp / 72.0;
length_inch = length_tmp / 72.0;
@@ -3323,14 +3375,26 @@ check_sizes(ppd_file_t *ppd, /* I - PPD file */
if (_cups_strcasecmp(size->name, buf))
{
- size_t buflen = strlen(buf); /* Length of proposed name */
+ size_t buflen = strlen(buf);
+ /* Length of proposed name */
if (_cups_strncasecmp(size->name, buf, buflen) ||
(strcmp(size->name + buflen, "in") &&
size->name[buflen] != '.'))
- _cupsLangPrintf(stdout,
- _(" %s Size \"%s\" should be \"%s\"."),
- prefix, size->name, buf);
+ {
+ char altbuf[PPD_MAX_NAME];
+ /* Alternate "wNNNhNNN" name */
+ size_t altlen; /* Length of alternate name */
+
+ snprintf(altbuf, sizeof(altbuf), "w%.0fh%.0f", size->width,
+ size->length);
+ altlen = strlen(altbuf);
+ if (_cups_strncasecmp(size->name, altbuf, altlen) ||
+ (size->name[altlen] && size->name[altlen] != '.'))
+ _cupsLangPrintf(stdout,
+ _(" %s Size \"%s\" should be \"%s\"."),
+ prefix, size->name, buf);
+ }
}
}
}
@@ -3972,5 +4036,5 @@ valid_utf8(const char *s) /* I - String to check */
/*
- * End of "$Id: cupstestppd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupstestppd.c 12583 2015-04-03 00:33:05Z msweet $".
*/
diff --git a/systemv/lp.c b/systemv/lp.c
index 830ff04..e6eb028 100644
--- a/systemv/lp.c
+++ b/systemv/lp.c
@@ -1,22 +1,16 @@
/*
- * "$Id: lp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lp.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * "lp" command for CUPS.
+ * "lp" command for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and send files for printing.
- * restart_job() - Restart a job.
- * set_job_attrs() - Set job attributes.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -156,8 +150,8 @@ main(int argc, /* I - Number of command-line arguments */
dest->options[j].value,
num_options, &options);
}
- else if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -576,8 +570,8 @@ main(int argc, /* I - Number of command-line arguments */
dest->options[j].value,
num_options, &options);
}
- else if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -640,7 +634,7 @@ main(int argc, /* I - Number of command-line arguments */
while (status == HTTP_CONTINUE &&
(bytes = read(0, buffer, sizeof(buffer))) > 0)
- status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes);
+ status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes);
if (status != HTTP_CONTINUE)
{
@@ -696,8 +690,8 @@ restart_job(const char *command, /* I - Command name */
ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -745,8 +739,8 @@ set_job_attrs(const char *command, /* I - Command name */
ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -764,5 +758,5 @@ set_job_attrs(const char *command, /* I - Command name */
/*
- * End of "$Id: lp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lp.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/systemv/lpadmin.c b/systemv/lpadmin.c
index 25ec642..c181d2b 100644
--- a/systemv/lpadmin.c
+++ b/systemv/lpadmin.c
@@ -1,36 +1,24 @@
/*
- * "$Id: lpadmin.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpadmin.c 12603 2015-05-06 01:42:51Z msweet $"
*
- * "lpadmin" command for CUPS.
+ * "lpadmin" command for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and configure the scheduler.
- * add_printer_to_class() - Add a printer to a class.
- * default_printer() - Set the default printing destination.
- * delete_printer() - Delete a printer from the system.
- * delete_printer_from_class() - Delete a printer from a class.
- * delete_printer_option() - Delete a printer option.
- * enable_printer() - Enable a printer.
- * get_printer_type() - Determine the printer type and URI.
- * set_printer_options() - Set the printer options and/or file.
- * validate_name() - Make sure the printer name only contains
- * valid chars.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
* Include necessary headers...
*/
+#define _CUPS_NO_DEPRECATED
+#define _PPD_DEPRECATED
#include <cups/cups-private.h>
@@ -46,6 +34,7 @@ static int delete_printer_from_class(http_t *http, char *printer,
static int delete_printer_option(http_t *http, char *printer,
char *option);
static int enable_printer(http_t *http, char *printer);
+static char *get_printer_ppd(const char *uri, char *buffer, size_t bufsize);
static cups_ptype_t get_printer_type(http_t *http, char *printer, char *uri,
size_t urisize);
static int set_printer_options(http_t *http, char *printer,
@@ -69,7 +58,11 @@ main(int argc, /* I - Number of command-line arguments */
*val; /* Pointer to allow/deny value */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
- char *file; /* New PPD file/interface script */
+ char *file, /* New PPD file/interface script */
+ evefile[1024] = "";
+ /* IPP Everywhere PPD */
+ const char *ppd_name, /* ppd-name value */
+ *device_uri; /* device-uri value */
_cupsSetLocale(argv);
@@ -87,8 +80,7 @@ main(int argc, /* I - Number of command-line arguments */
case 'c' : /* Add printer to class */
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -140,8 +132,7 @@ main(int argc, /* I - Number of command-line arguments */
case 'd' : /* Set as default destination */
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -231,10 +222,10 @@ main(int argc, /* I - Number of command-line arguments */
if (printer == NULL)
{
#ifdef HAVE_SSL
- cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
+ cupsSetEncryption(HTTP_ENCRYPTION_REQUIRED);
if (http)
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
#else
_cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
argv[0]);
@@ -244,8 +235,7 @@ main(int argc, /* I - Number of command-line arguments */
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -330,8 +320,7 @@ main(int argc, /* I - Number of command-line arguments */
case 'r' : /* Remove printer from class */
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -384,8 +373,7 @@ main(int argc, /* I - Number of command-line arguments */
case 'R' : /* Remove option */
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -501,8 +489,7 @@ main(int argc, /* I - Number of command-line arguments */
case 'x' : /* Delete a printer */
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -635,11 +622,19 @@ main(int argc, /* I - Number of command-line arguments */
* Set options as needed...
*/
+ if ((ppd_name = cupsGetOption("ppd-name", num_options, options)) != NULL && !strcmp(ppd_name, "everywhere") && (device_uri = cupsGetOption("device-uri", num_options, options)) != NULL)
+ {
+ if ((file = get_printer_ppd(device_uri, evefile, sizeof(evefile))) == NULL)
+ return (1);
+
+ num_options = cupsRemoveOption("ppd-name", num_options, &options);
+ }
+
if (num_options || file)
{
if (!http)
{
- http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
if (http == NULL)
{
@@ -662,6 +657,9 @@ main(int argc, /* I - Number of command-line arguments */
return (1);
}
+ if (evefile[0])
+ unlink(evefile);
+
if (printer == NULL)
{
_cupsLangPuts(stdout,
@@ -706,7 +704,7 @@ add_printer_to_class(http_t *http, /* I - Server connection */
printer, pclass));
/*
- * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
+ * Build an IPP_OP_GET_PRINTER_ATTRIBUTES request, which requires the following
* attributes:
*
* attributes-charset
@@ -715,7 +713,7 @@ add_printer_to_class(http_t *http, /* I - Server connection */
* requesting-user-name
*/
- request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", 0, "/classes/%s", pclass);
@@ -731,7 +729,7 @@ add_printer_to_class(http_t *http, /* I - Server connection */
response = cupsDoRequest(http, request, "/");
/*
- * Build a CUPS_ADD_MODIFY_CLASS request, which requires the following
+ * Build a CUPS-Add-Modify-Class request, which requires the following
* attributes:
*
* attributes-charset
@@ -741,7 +739,7 @@ add_printer_to_class(http_t *http, /* I - Server connection */
* member-uris
*/
- request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -800,7 +798,7 @@ add_printer_to_class(http_t *http, /* I - Server connection */
ippDelete(response);
ippDelete(cupsDoRequest(http, request, "/admin/"));
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -826,7 +824,7 @@ default_printer(http_t *http, /* I - Server connection */
DEBUG_printf(("default_printer(%p, \"%s\")\n", http, printer));
/*
- * Build a CUPS_SET_DEFAULT request, which requires the following
+ * Build a CUPS-Set-Default request, which requires the following
* attributes:
*
* attributes-charset
@@ -838,7 +836,7 @@ default_printer(http_t *http, /* I - Server connection */
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", 0, "/printers/%s", printer);
- request = ippNewRequest(CUPS_SET_DEFAULT);
+ request = ippNewRequest(IPP_OP_CUPS_SET_DEFAULT);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -851,7 +849,7 @@ default_printer(http_t *http, /* I - Server connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -877,7 +875,7 @@ delete_printer(http_t *http, /* I - Server connection */
DEBUG_printf(("delete_printer(%p, \"%s\")\n", http, printer));
/*
- * Build a CUPS_DELETE_PRINTER request, which requires the following
+ * Build a CUPS-Delete-Printer request, which requires the following
* attributes:
*
* attributes-charset
@@ -886,7 +884,7 @@ delete_printer(http_t *http, /* I - Server connection */
* requesting-user-name
*/
- request = ippNewRequest(CUPS_DELETE_PRINTER);
+ request = ippNewRequest(IPP_OP_CUPS_DELETE_PRINTER);
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", 0, "/printers/%s", printer);
@@ -901,7 +899,7 @@ delete_printer(http_t *http, /* I - Server connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -934,7 +932,7 @@ delete_printer_from_class(
printer, pclass));
/*
- * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
+ * Build an IPP_OP_GET_PRINTER_ATTRIBUTES request, which requires the following
* attributes:
*
* attributes-charset
@@ -943,7 +941,7 @@ delete_printer_from_class(
* requesting-user-name
*/
- request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", 0, "/classes/%s", pclass);
@@ -957,7 +955,7 @@ delete_printer_from_class(
*/
if ((response = cupsDoRequest(http, request, "/classes/")) == NULL ||
- response->request.status.status_code == IPP_NOT_FOUND)
+ response->request.status.status_code == IPP_STATUS_ERROR_NOT_FOUND)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -997,7 +995,7 @@ delete_printer_from_class(
if (members->num_values == 1)
{
/*
- * Build a CUPS_DELETE_CLASS request, which requires the following
+ * Build a CUPS-Delete-Class request, which requires the following
* attributes:
*
* attributes-charset
@@ -1006,7 +1004,7 @@ delete_printer_from_class(
* requesting-user-name
*/
- request = ippNewRequest(CUPS_DELETE_CLASS);
+ request = ippNewRequest(IPP_OP_CUPS_DELETE_CLASS);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -1016,7 +1014,7 @@ delete_printer_from_class(
else
{
/*
- * Build a CUPS_ADD_MODIFY_CLASS request, which requires the following
+ * Build a IPP_OP_CUPS_ADD_MODIFY_CLASS request, which requires the following
* attributes:
*
* attributes-charset
@@ -1026,7 +1024,7 @@ delete_printer_from_class(
* member-uris
*/
- request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -1055,7 +1053,7 @@ delete_printer_from_class(
ippDelete(cupsDoRequest(http, request, "/admin/"));
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -1080,7 +1078,7 @@ delete_printer_option(http_t *http, /* I - Server connection */
/*
- * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which
+ * Build a IPP_OP_CUPS_ADD_MODIFY_PRINTER or IPP_OP_CUPS_ADD_MODIFY_CLASS request, which
* requires the following attributes:
*
* attributes-charset
@@ -1091,9 +1089,9 @@ delete_printer_option(http_t *http, /* I - Server connection */
*/
if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
- request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
else
- request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -1107,7 +1105,7 @@ delete_printer_option(http_t *http, /* I - Server connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -1133,7 +1131,7 @@ enable_printer(http_t *http, /* I - Server connection */
DEBUG_printf(("enable_printer(%p, \"%s\")\n", http, printer));
/*
- * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which
+ * Build a IPP_OP_CUPS_ADD_MODIFY_PRINTER or IPP_OP_CUPS_ADD_MODIFY_CLASS request, which
* require the following attributes:
*
* attributes-charset
@@ -1145,16 +1143,16 @@ enable_printer(http_t *http, /* I - Server connection */
*/
if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
- request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
else
- request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, cupsUser());
ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state",
- IPP_PRINTER_IDLE);
+ IPP_PSTATE_IDLE);
ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
/*
@@ -1163,7 +1161,7 @@ enable_printer(http_t *http, /* I - Server connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -1175,6 +1173,79 @@ enable_printer(http_t *http, /* I - Server connection */
/*
+ * 'get_printer_ppd()' - Get an IPP Everywhere PPD file for the given URI.
+ */
+
+static char * /* O - Filename or NULL */
+get_printer_ppd(const char *uri, /* I - Printer URI */
+ char *buffer, /* I - Filename buffer */
+ size_t bufsize) /* I - Size of filename buffer */
+{
+ http_t *http; /* Connection to printer */
+ ipp_t *request, /* Get-Printer-Attributes request */
+ *response; /* Get-Printer-Attributes response */
+ char resolved[1024], /* Resolved URI */
+ scheme[32], /* URI scheme */
+ userpass[256], /* Username:password */
+ host[256], /* Hostname */
+ resource[256]; /* Resource path */
+ int port; /* Port number */
+
+
+ /*
+ * Connect to the printer...
+ */
+
+ if (strstr(uri, "._tcp"))
+ {
+ /*
+ * Resolve URI...
+ */
+
+ if (!_httpResolveURI(uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
+ {
+ _cupsLangPrintf(stderr, _("%s: Unable to resolve \"%s\"."), "lpadmin", uri);
+ return (NULL);
+ }
+
+ uri = resolved;
+ }
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ {
+ _cupsLangPrintf(stderr, _("%s: Bad printer URI \"%s\"."), "lpadmin", uri);
+ return (NULL);
+ }
+
+ http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
+ if (!http)
+ {
+ _cupsLangPrintf(stderr, _("%s: Unable to connect to \"%s:%d\": %s"), "lpadmin", host, port, cupsLastErrorString());
+ return (NULL);
+ }
+
+ /*
+ * Send a Get-Printer-Attributes request...
+ */
+
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+ response = cupsDoRequest(http, request, resource);
+
+ if (!_ppdCreateFromIPP(buffer, bufsize, response))
+ _cupsLangPrintf(stderr, _("%s: Unable to create PPD file: %s"), "lpadmin", strerror(errno));
+
+ ippDelete(response);
+ httpClose(http);
+
+ if (buffer[0])
+ return (buffer);
+ else
+ return (NULL);
+}
+
+
+/*
* 'get_printer_type()' - Determine the printer type and URI.
*/
@@ -1201,10 +1272,9 @@ get_printer_type(http_t *http, /* I - Server connection */
* requesting-user-name
*/
- httpAssembleURIf(HTTP_URI_CODING_ALL, uri, urisize, "ipp", NULL, "localhost",
- ippPort(), "/printers/%s", printer);
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, (int)urisize, "ipp", NULL, "localhost", ippPort(), "/printers/%s", printer);
- request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
@@ -1223,8 +1293,7 @@ get_printer_type(http_t *http, /* I - Server connection */
type = (cups_ptype_t)attr->values[0].integer;
if (type & CUPS_PRINTER_CLASS)
- httpAssembleURIf(HTTP_URI_CODING_ALL, uri, urisize, "ipp", NULL,
- "localhost", ippPort(), "/classes/%s", printer);
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, (int)urisize, "ipp", NULL, "localhost", ippPort(), "/classes/%s", printer);
}
else
type = CUPS_PRINTER_LOCAL;
@@ -1249,7 +1318,7 @@ set_printer_options(
{
ipp_t *request; /* IPP Request */
const char *ppdfile; /* PPD filename */
- int ppdchanged; /* PPD changed? */
+ int ppdchanged = 0; /* PPD changed? */
ppd_file_t *ppd; /* PPD file */
ppd_choice_t *choice; /* Marked choice */
char uri[HTTP_MAX_URI], /* URI for printer/class */
@@ -1259,11 +1328,13 @@ set_printer_options(
tempfile[1024]; /* Temporary filename */
cups_file_t *in, /* PPD file */
*out; /* Temporary file */
- const char *protocol, /* Old protocol option */
+ const char *ppdname, /* ppd-name value */
+ *protocol, /* Old protocol option */
*customval, /* Custom option value */
*boolval; /* Boolean value */
int wrote_ipp_supplies = 0, /* Wrote cupsIPPSupplies keyword? */
- wrote_snmp_supplies = 0;/* Wrote cupsSNMPSupplies keyword? */
+ wrote_snmp_supplies = 0,/* Wrote cupsSNMPSupplies keyword? */
+ copied_options = 0; /* Copied options? */
DEBUG_printf(("set_printer_options(http=%p, printer=\"%s\", num_options=%d, "
@@ -1271,8 +1342,8 @@ set_printer_options(
options, file));
/*
- * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which
- * requires the following attributes:
+ * Build a CUPS-Add-Modify-Printer or CUPS-Add-Modify-Class request,
+ * which requires the following attributes:
*
* attributes-charset
* attributes-natural-language
@@ -1282,19 +1353,45 @@ set_printer_options(
*/
if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
- request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
else
- request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
+ request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
- "printer-uri", NULL, uri);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
- "requesting-user-name", NULL, cupsUser());
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
/*
* Add the options...
*/
+ if (file)
+ ppdfile = file;
+ else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "raw") && num_options > 1)
+ {
+ if ((ppdfile = cupsGetServerPPD(http, ppdname)) != NULL)
+ {
+ /*
+ * Copy options array and remove ppd-name from it...
+ */
+
+ cups_option_t *temp = NULL, *optr;
+ int i, num_temp = 0;
+ for (i = num_options, optr = options; i > 0; i --, optr ++)
+ if (strcmp(optr->name, "ppd-name"))
+ num_temp = cupsAddOption(optr->name, optr->value, num_temp, &temp);
+
+ copied_options = 1;
+ ppdchanged = 1;
+ num_options = num_temp;
+ options = temp;
+ }
+ }
+ else if (request->request.op.operation_id == IPP_OP_CUPS_ADD_MODIFY_PRINTER)
+ ppdfile = cupsGetPPD(printer);
+ else
+ ppdfile = NULL;
+
+ cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER);
if ((protocol = cupsGetOption("protocol", num_options, options)) != NULL)
@@ -1307,20 +1404,21 @@ set_printer_options(
NULL, "tbcp");
}
- if (file)
- ppdfile = file;
- else if (request->request.op.operation_id == CUPS_ADD_MODIFY_PRINTER)
- ppdfile = cupsGetPPD(printer);
- else
- ppdfile = NULL;
-
- if (ppdfile != NULL)
+ if (ppdfile)
{
/*
* Set default options in the PPD file...
*/
- ppd = ppdOpenFile(ppdfile);
+ if ((ppd = ppdOpenFile(ppdfile)) == NULL)
+ {
+ int linenum; /* Line number of error */
+ ppd_status_t status = ppdLastError(&linenum);
+ /* Status code */
+
+ _cupsLangPrintf(stderr, _("lpadmin: Unable to open PPD \"%s\": %s on line %d."), ppdfile, ppdErrorString(status), linenum);
+ }
+
ppdMarkDefaults(ppd);
cupsMarkOptions(ppd, num_options, options);
@@ -1330,6 +1428,8 @@ set_printer_options(
ippDelete(request);
if (ppdfile != file)
unlink(ppdfile);
+ if (copied_options)
+ cupsFreeOptions(num_options, options);
return (1);
}
@@ -1341,13 +1441,13 @@ set_printer_options(
ippDelete(request);
if (ppdfile != file)
unlink(ppdfile);
+ if (copied_options)
+ cupsFreeOptions(num_options, options);
cupsFileClose(out);
unlink(tempfile);
return (1);
}
- ppdchanged = 0;
-
while (cupsFileGets(in, line, sizeof(line)))
{
if (!strncmp(line, "*cupsIPPSupplies:", 17) &&
@@ -1469,11 +1569,14 @@ set_printer_options(
ippDelete(cupsDoRequest(http, request, "/admin/"));
}
+ if (copied_options)
+ cupsFreeOptions(num_options, options);
+
/*
* Check the response...
*/
- if (cupsLastError() > IPP_OK_CONFLICT)
+ if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
@@ -1514,5 +1617,5 @@ validate_name(const char *name) /* I - Name to check */
/*
- * End of "$Id: lpadmin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpadmin.c 12603 2015-05-06 01:42:51Z msweet $".
*/
diff --git a/systemv/lpinfo.c b/systemv/lpinfo.c
index 1043548..6816615 100644
--- a/systemv/lpinfo.c
+++ b/systemv/lpinfo.c
@@ -1,5 +1,5 @@
/*
- * "$Id: lpinfo.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpinfo.c 10996 2013-05-29 11:51:34Z msweet $"
*
* "lpinfo" command for CUPS.
*
@@ -494,5 +494,5 @@ show_models(
/*
- * End of "$Id: lpinfo.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpinfo.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/systemv/lpmove.c b/systemv/lpmove.c
index d9adfd8..aff9d6d 100644
--- a/systemv/lpmove.c
+++ b/systemv/lpmove.c
@@ -1,5 +1,5 @@
/*
- * "$Id: lpmove.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpmove.c 10996 2013-05-29 11:51:34Z msweet $"
*
* "lpmove" command for CUPS.
*
@@ -209,5 +209,5 @@ move_job(http_t *http, /* I - HTTP connection to server */
/*
- * End of "$Id: lpmove.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpmove.c 10996 2013-05-29 11:51:34Z msweet $".
*/
diff --git a/systemv/lpoptions.c b/systemv/lpoptions.c
index 31a367c..1ddff29 100644
--- a/systemv/lpoptions.c
+++ b/systemv/lpoptions.c
@@ -1,23 +1,16 @@
/*
- * "$Id: lpoptions.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpoptions.c 11558 2014-02-06 18:33:34Z msweet $"
*
- * Printer option program for CUPS.
+ * Printer option program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Main entry.
- * list_group() - List printer-specific options from the PPD group.
- * list_options() - List printer-specific options from the PPD file.
- * usage() - Show program usage and exit.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -274,8 +267,7 @@ main(int argc, /* I - Number of command-line arguments */
num_options --;
if (j < num_options)
- memcpy(options + j, options + j + 1,
- sizeof(cups_option_t) * (num_options - j));
+ memmove(options + j, options + j + 1, sizeof(cups_option_t) * (size_t)(num_options - j));
break;
}
@@ -322,7 +314,7 @@ main(int argc, /* I - Number of command-line arguments */
j = dest - dests;
if (j < num_dests)
- memcpy(dest, dest + 1, (num_dests - j) * sizeof(cups_dest_t));
+ memmove(dest, dest + 1, (size_t)(num_dests - j) * sizeof(cups_dest_t));
}
}
@@ -385,14 +377,12 @@ main(int argc, /* I - Number of command-line arguments */
*ptr++ = ' ';
if (!options[i].value[0])
- strlcpy(ptr, options[i].name, sizeof(buffer) - (ptr - buffer));
+ strlcpy(ptr, options[i].name, sizeof(buffer) - (size_t)(ptr - buffer));
else if (strchr(options[i].value, ' ') != NULL ||
strchr(options[i].value, '\t') != NULL)
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s=\'%s\'",
- options[i].name, options[i].value);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s=\'%s\'", options[i].name, options[i].value);
else
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s=%s",
- options[i].name, options[i].value);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s=%s", options[i].name, options[i].value);
ptr += strlen(ptr);
}
@@ -450,19 +440,16 @@ list_group(ppd_file_t *ppd, /* I - PPD file */
if ((coption = ppdFindCustomOption(ppd, option->keyword)) == NULL ||
cupsArrayCount(coption->params) == 0)
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %sCustom",
- choice->marked ? "*" : "");
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom", choice->marked ? "*" : "");
else if (!_cups_strcasecmp(option->keyword, "PageSize") ||
!_cups_strcasecmp(option->keyword, "PageRegion"))
- snprintf(ptr, sizeof(buffer) - (ptr - buffer),
- " %sCustom.WIDTHxHEIGHT", choice->marked ? "*" : "");
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom.WIDTHxHEIGHT", choice->marked ? "*" : "");
else
{
cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
if (cupsArrayCount(coption->params) == 1)
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %sCustom.%s",
- choice->marked ? "*" : "", types[cparam->type]);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom.%s", choice->marked ? "*" : "", types[cparam->type]);
else
{
const char *prefix; /* Prefix string */
@@ -475,22 +462,21 @@ list_group(ppd_file_t *ppd, /* I - PPD file */
while (cparam)
{
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s%s=%s", prefix,
- cparam->name, types[cparam->type]);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s%s=%s", prefix, cparam->name, types[cparam->type]);
cparam = (ppd_cparam_t *)cupsArrayNext(coption->params);
prefix = " ";
ptr += strlen(ptr);
}
if (ptr < (buffer + sizeof(buffer) - 1))
- strlcpy(ptr, "}", sizeof(buffer) - (ptr - buffer));
+ strlcpy(ptr, "}", sizeof(buffer) - (size_t)(ptr - buffer));
}
}
}
else if (choice->marked)
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), " *%s", choice->choice);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " *%s", choice->choice);
else
- snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %s", choice->choice);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %s", choice->choice);
ptr += strlen(ptr);
}
@@ -561,5 +547,5 @@ usage(void)
/*
- * End of "$Id: lpoptions.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpoptions.c 11558 2014-02-06 18:33:34Z msweet $".
*/
diff --git a/systemv/lppasswd.c b/systemv/lppasswd.c
deleted file mode 100644
index 9e559b4..0000000
--- a/systemv/lppasswd.c
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * "$Id: lppasswd.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- * MD5 password program for CUPS.
- *
- * Copyright 2007-2011 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Add, change, or delete passwords from the MD5 password file.
- * usage() - Show program usage.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include <cups/cups-private.h>
-#include <cups/md5-private.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifndef WIN32
-# include <unistd.h>
-# include <signal.h>
-#endif /* !WIN32 */
-
-
-/*
- * Operations...
- */
-
-#define ADD 0
-#define CHANGE 1
-#define DELETE 2
-
-
-/*
- * Local functions...
- */
-
-static void usage(FILE *fp) __attribute__((noreturn));
-
-
-/*
- * 'main()' - Add, change, or delete passwords from the MD5 password file.
- */
-
-int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
-{
- int i; /* Looping var */
- char *opt; /* Option pointer */
- const char *username; /* Pointer to username */
- const char *groupname; /* Pointer to group name */
- int op; /* Operation (add, change, delete) */
- const char *passwd; /* Password string */
- FILE *infile, /* Input file */
- *outfile; /* Output file */
- char line[256], /* Line from file */
- userline[17], /* User from line */
- groupline[17], /* Group from line */
- md5line[33], /* MD5-sum from line */
- md5new[33]; /* New MD5 sum */
- char passwdmd5[1024], /* passwd.md5 file */
- passwdold[1024], /* passwd.old file */
- passwdnew[1024]; /* passwd.tmp file */
- char *newpass, /* new password */
- *oldpass; /* old password */
- int flag; /* Password check flags... */
- int fd; /* Password file descriptor */
- int error; /* Write error */
- _cups_globals_t *cg = _cupsGlobals(); /* Global data */
- cups_lang_t *lang; /* Language info */
-#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
- struct sigaction action; /* Signal action */
-#endif /* HAVE_SIGACTION && !HAVE_SIGSET*/
-
-
- _cupsSetLocale(argv);
- lang = cupsLangDefault();
-
- /*
- * Check to see if stdin, stdout, and stderr are still open...
- */
-
- if (fcntl(0, F_GETFD, &i) ||
- fcntl(1, F_GETFD, &i) ||
- fcntl(2, F_GETFD, &i))
- {
- /*
- * No, return exit status 2 and don't try to send any output since
- * someone is trying to bypass the security on the server.
- */
-
- return (2);
- }
-
- /*
- * Find the server directory...
- */
-
- snprintf(passwdmd5, sizeof(passwdmd5), "%s/passwd.md5", cg->cups_serverroot);
- snprintf(passwdold, sizeof(passwdold), "%s/passwd.old", cg->cups_serverroot);
- snprintf(passwdnew, sizeof(passwdnew), "%s/passwd.new", cg->cups_serverroot);
-
- /*
- * Find the default system group...
- */
-
- if (getgrnam(CUPS_DEFAULT_GROUP))
- groupname = CUPS_DEFAULT_GROUP;
- else
- groupname = "unknown";
-
- endgrent();
-
- username = NULL;
- op = CHANGE;
-
- /*
- * Parse command-line options...
- */
-
- for (i = 1; i < argc; i ++)
- if (argv[i][0] == '-')
- for (opt = argv[i] + 1; *opt; opt ++)
- switch (*opt)
- {
- case 'a' : /* Add */
- op = ADD;
- break;
- case 'x' : /* Delete */
- op = DELETE;
- break;
- case 'g' : /* Group */
- i ++;
- if (i >= argc)
- usage(stderr);
-
- groupname = argv[i];
- break;
- case 'h' : /* Help */
- usage(stdout);
- break;
- default : /* Bad option */
- usage(stderr);
- break;
- }
- else if (!username)
- username = argv[i];
- else
- usage(stderr);
-
- /*
- * See if we are trying to add or delete a password when we aren't logged in
- * as root...
- */
-
- if (getuid() && getuid() != geteuid() && (op != CHANGE || username))
- {
- _cupsLangPuts(stderr,
- _("lppasswd: Only root can add or delete passwords."));
- return (1);
- }
-
- /*
- * Fill in missing info...
- */
-
- if (!username)
- username = cupsUser();
-
- oldpass = newpass = NULL;
-
- /*
- * Obtain old and new password _before_ locking the database
- * to keep users from locking the file indefinitely.
- */
-
- if (op == CHANGE && getuid())
- {
- if ((passwd = cupsGetPassword(_("Enter old password:"))) == NULL)
- return (1);
-
- if ((oldpass = strdup(passwd)) == NULL)
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: Unable to copy password string: %s"),
- strerror(errno));
- return (1);
- }
- }
-
- /*
- * Now get the new password, if necessary...
- */
-
- if (op != DELETE)
- {
- if ((passwd = cupsGetPassword(
- _cupsLangString(lang, _("Enter password:")))) == NULL)
- return (1);
-
- if ((newpass = strdup(passwd)) == NULL)
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: Unable to copy password string: %s"),
- strerror(errno));
- return (1);
- }
-
- if ((passwd = cupsGetPassword(
- _cupsLangString(lang, _("Enter password again:")))) == NULL)
- return (1);
-
- if (strcmp(passwd, newpass) != 0)
- {
- _cupsLangPuts(stderr,
- _("lppasswd: Sorry, passwords don't match."));
- return (1);
- }
-
- /*
- * Check that the password contains at least one letter and number.
- */
-
- flag = 0;
-
- for (passwd = newpass; *passwd; passwd ++)
- if (isdigit(*passwd & 255))
- flag |= 1;
- else if (isalpha(*passwd & 255))
- flag |= 2;
-
- /*
- * Only allow passwords that are at least 6 chars, have a letter and
- * a number, and don't contain the username.
- */
-
- if (strlen(newpass) < 6 || strstr(newpass, username) != NULL || flag != 3)
- {
- _cupsLangPuts(stderr, _("lppasswd: Sorry, password rejected."));
- _cupsLangPuts(stderr, _("Your password must be at least 6 characters "
- "long, cannot contain your username, and must "
- "contain at least one letter and number."));
- return (1);
- }
- }
-
- /*
- * Ignore SIGHUP, SIGINT, SIGTERM, and SIGXFSZ (if defined) for the
- * remainder of the time so that we won't end up with bogus password
- * files...
- */
-
-#ifndef WIN32
-# if defined(HAVE_SIGSET)
- sigset(SIGHUP, SIG_IGN);
- sigset(SIGINT, SIG_IGN);
- sigset(SIGTERM, SIG_IGN);
-# ifdef SIGXFSZ
- sigset(SIGXFSZ, SIG_IGN);
-# endif /* SIGXFSZ */
-# elif defined(HAVE_SIGACTION)
- memset(&action, 0, sizeof(action));
- action.sa_handler = SIG_IGN;
-
- sigaction(SIGHUP, &action, NULL);
- sigaction(SIGINT, &action, NULL);
- sigaction(SIGTERM, &action, NULL);
-# ifdef SIGXFSZ
- sigaction(SIGXFSZ, &action, NULL);
-# endif /* SIGXFSZ */
-# else
- signal(SIGHUP, SIG_IGN);
- signal(SIGINT, SIG_IGN);
- signal(SIGTERM, SIG_IGN);
-# ifdef SIGXFSZ
- signal(SIGXFSZ, SIG_IGN);
-# endif /* SIGXFSZ */
-# endif
-#endif /* !WIN32 */
-
- /*
- * Open the output file.
- */
-
- if ((fd = open(passwdnew, O_WRONLY | O_CREAT | O_EXCL, 0400)) < 0)
- {
- if (errno == EEXIST)
- _cupsLangPuts(stderr, _("lppasswd: Password file busy."));
- else
- _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"),
- strerror(errno));
-
- return (1);
- }
-
- if ((outfile = fdopen(fd, "w")) == NULL)
- {
- _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"),
- strerror(errno));
-
- unlink(passwdnew);
-
- return (1);
- }
-
- setbuf(outfile, NULL);
-
- /*
- * Open the existing password file and create a new one...
- */
-
- infile = fopen(passwdmd5, "r");
- if (infile == NULL && errno != ENOENT && op != ADD)
- {
- _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"),
- strerror(errno));
-
- fclose(outfile);
-
- unlink(passwdnew);
-
- return (1);
- }
-
- /*
- * Read lines from the password file; the format is:
- *
- * username:group:MD5-sum
- */
-
- error = 0;
- userline[0] = '\0';
- groupline[0] = '\0';
- md5line[0] = '\0';
-
- if (infile)
- {
- while (fgets(line, sizeof(line), infile) != NULL)
- {
- if (sscanf(line, "%16[^:]:%16[^:]:%32s", userline, groupline, md5line) != 3)
- continue;
-
- if (strcmp(username, userline) == 0 &&
- strcmp(groupname, groupline) == 0)
- break;
-
- if (fputs(line, outfile) == EOF)
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: Unable to write to password file: %s"),
- strerror(errno));
- error = 1;
- break;
- }
- }
-
- if (!error)
- {
- while (fgets(line, sizeof(line), infile) != NULL)
- if (fputs(line, outfile) == EOF)
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: Unable to write to password file: %s"),
- strerror(errno));
- error = 1;
- break;
- }
- }
- }
-
- if (op == CHANGE &&
- (strcmp(username, userline) || strcmp(groupname, groupline)))
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: user \"%s\" and group \"%s\" do not exist."),
- username, groupname);
- error = 1;
- }
- else if (op != DELETE)
- {
- if (oldpass &&
- strcmp(httpMD5(username, "CUPS", oldpass, md5new), md5line) != 0)
- {
- _cupsLangPuts(stderr, _("lppasswd: Sorry, password doesn't match."));
- error = 1;
- }
- else
- {
- snprintf(line, sizeof(line), "%s:%s:%s\n", username, groupname,
- httpMD5(username, "CUPS", newpass, md5new));
- if (fputs(line, outfile) == EOF)
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: Unable to write to password file: %s"),
- strerror(errno));
- error = 1;
- }
- }
- }
-
- /*
- * Close the files...
- */
-
- if (infile)
- fclose(infile);
-
- if (fclose(outfile) == EOF)
- error = 1;
-
- /*
- * Error out gracefully as needed...
- */
-
- if (error)
- {
- _cupsLangPuts(stderr, _("lppasswd: Password file not updated."));
-
- unlink(passwdnew);
-
- return (1);
- }
-
- /*
- * Save old passwd file
- */
-
- unlink(passwdold);
- if (link(passwdmd5, passwdold) && errno != ENOENT)
- {
- _cupsLangPrintf(stderr,
- _("lppasswd: failed to backup old password file: %s"),
- strerror(errno));
- unlink(passwdnew);
- return (1);
- }
-
- /*
- * Install new password file
- */
-
- if (rename(passwdnew, passwdmd5) < 0)
- {
- _cupsLangPrintf(stderr, _("lppasswd: failed to rename password file: %s"),
- strerror(errno));
- unlink(passwdnew);
- return (1);
- }
-
- return (0);
-}
-
-
-/*
- * 'usage()' - Show program usage.
- */
-
-static void
-usage(FILE *fp) /* I - File to send usage to */
-{
- if (getuid())
- _cupsLangPuts(fp, _("Usage: lppasswd [-g groupname]"));
- else
- _cupsLangPuts(fp,
- _("Usage: lppasswd [-g groupname] [username]\n"
- " lppasswd [-g groupname] -a [username]\n"
- " lppasswd [-g groupname] -x [username]"));
-
- exit(1);
-}
-
-
-/*
- * End of "$Id: lppasswd.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/systemv/lpstat.c b/systemv/lpstat.c
index acb88b6..9c076cb 100644
--- a/systemv/lpstat.c
+++ b/systemv/lpstat.c
@@ -1,30 +1,16 @@
/*
- * "$Id: lpstat.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpstat.c 12124 2014-08-28 15:37:22Z msweet $"
*
- * "lpstat" command for CUPS.
+ * "lpstat" command for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and show status information.
- * check_dest() - Verify that the named destination(s) exists.
- * match_list() - Match a name from a list of comma or space-separated
- * names.
- * show_accepting() - Show acceptance status.
- * show_classes() - Show printer classes.
- * show_default() - Show default destination.
- * show_devices() - Show printer devices.
- * show_jobs() - Show active print jobs.
- * show_printers() - Show printers.
- * show_scheduler() - Show scheduler status.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -109,6 +95,7 @@ main(int argc, /* I - Number of command-line arguments */
_cupsLangPuts(stdout, cupsServer());
else
_cupsLangPrintf(stdout, "%s:%d", cupsServer(), ippPort());
+ op = 'H';
break;
case 'P' : /* Show paper types */
@@ -201,8 +188,8 @@ main(int argc, /* I - Number of command-line arguments */
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
- (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+ (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -215,38 +202,6 @@ main(int argc, /* I - Number of command-line arguments */
}
break;
-#ifdef __sgi
- case 'b' : /* Show both the local and remote status */
- op = 'b';
-
- if (argv[i][2])
- {
- /*
- * The local and remote status are separated by a blank line;
- * since all CUPS jobs are networked, we only output the
- * second list for now... In the future, we might further
- * emulate this by listing the remote server's queue, but
- * for now this is enough to make the SGI printstatus program
- * happy...
- */
-
- check_dest(argv[0], argv[i] + 2, &num_dests, &dests);
-
- puts("");
- status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which);
- }
- else
- {
- _cupsLangPrintf(stderr,
- _("%s: Error - expected destination after "
- "\"-b\" option."),
- argv[0]);
-
- return (1);
- }
- break;
-#endif /* __sgi */
-
case 'c' : /* Show classes and members */
op = 'c';
@@ -279,8 +234,8 @@ main(int argc, /* I - Number of command-line arguments */
num_dests = dests ? 1 : 0;
if (num_dests == 0 &&
- (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+ (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -319,18 +274,7 @@ main(int argc, /* I - Number of command-line arguments */
break;
case 'l' : /* Long status or long job status */
-#ifdef __sgi
- op = 'l';
-
- if (argv[i][2])
- {
- check_dest(argv[0], argv[i] + 2, &num_dests, &dests);
-
- status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which);
- }
- else
-#endif /* __sgi */
- long_status = 2;
+ long_status = 2;
break;
case 'o' : /* Show jobs by destination */
@@ -381,8 +325,8 @@ main(int argc, /* I - Number of command-line arguments */
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
- (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+ (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -410,8 +354,8 @@ main(int argc, /* I - Number of command-line arguments */
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
- (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+ (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -434,8 +378,8 @@ main(int argc, /* I - Number of command-line arguments */
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
- (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+ (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -493,8 +437,8 @@ main(int argc, /* I - Number of command-line arguments */
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
- (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+ (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server "
@@ -560,8 +504,8 @@ check_dest(const char *command, /* I - Command name */
if ((*dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, pptr)) == NULL)
{
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
command);
@@ -621,8 +565,8 @@ check_dest(const char *command, /* I - Command name */
if (!cupsGetDest(printer, NULL, *num_dests, *dests))
{
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
command);
@@ -705,7 +649,6 @@ show_accepting(const char *printers, /* I - Destinations */
*message; /* Printer device URI */
int accepting; /* Accepting requests? */
time_t ptime; /* Printer state time */
- struct tm *pdate; /* Printer state date & time */
char printer_state_time[255];/* Printer state time */
static const char *pattrs[] = /* Attributes we need for printers... */
{
@@ -746,8 +689,8 @@ show_accepting(const char *printers, /* I - Destinations */
response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
@@ -755,7 +698,7 @@ show_accepting(const char *printers, /* I - Destinations */
ippDelete(response);
return (1);
}
- else if (cupsLastError() > IPP_OK_CONFLICT)
+ else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
ippDelete(response);
@@ -828,8 +771,7 @@ show_accepting(const char *printers, /* I - Destinations */
if (match_list(printers, printer))
{
- pdate = localtime(&ptime);
- strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate);
+ _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
if (accepting)
_cupsLangPrintf(stdout, _("%s accepting requests since %s"),
@@ -931,8 +873,8 @@ show_classes(const char *dests) /* I - Destinations */
response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
@@ -940,7 +882,7 @@ show_classes(const char *dests) /* I - Destinations */
ippDelete(response);
return (1);
}
- else if (cupsLastError() > IPP_OK_CONFLICT)
+ else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
ippDelete(response);
@@ -1192,8 +1134,8 @@ show_devices(const char *printers, /* I - Destinations */
response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
@@ -1201,7 +1143,7 @@ show_devices(const char *printers, /* I - Destinations */
ippDelete(response);
return (1);
}
- else if (cupsLastError() > IPP_OK_CONFLICT)
+ else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
ippDelete(response);
@@ -1272,52 +1214,6 @@ show_devices(const char *printers, /* I - Destinations */
if (match_list(printers, printer))
{
-#ifdef __osf__ /* Compaq/Digital like to do it their own way... */
- char scheme[HTTP_MAX_URI], /* Components of printer URI */
- username[HTTP_MAX_URI],
- hostname[HTTP_MAX_URI],
- resource[HTTP_MAX_URI];
- int port;
-
-
- if (device == NULL)
- {
- httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
- username, sizeof(username), hostname,
- sizeof(hostname), &port, resource, sizeof(resource));
- _cupsLangPrintf(stdout,
- _("Output for printer %s is sent to remote "
- "printer %s on %s"),
- printer, strrchr(resource, '/') + 1, hostname);
- }
- else if (!strncmp(device, "file:", 5))
- _cupsLangPrintf(stdout,
- _("Output for printer %s is sent to %s"),
- printer, device + 5);
- else
- _cupsLangPrintf(stdout,
- _("Output for printer %s is sent to %s"),
- printer, device);
-
- for (i = 0; i < num_dests; i ++)
- if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance)
- {
- if (device == NULL)
- _cupsLangPrintf(stdout,
- _("Output for printer %s/%s is sent to "
- "remote printer %s on %s"),
- printer, dests[i].instance,
- strrchr(resource, '/') + 1, hostname);
- else if (!strncmp(device, "file:", 5))
- _cupsLangPrintf(stdout,
- _("Output for printer %s/%s is sent to %s"),
- printer, dests[i].instance, device + 5);
- else
- _cupsLangPrintf(stdout,
- _("Output for printer %s/%s is sent to %s"),
- printer, dests[i].instance, device);
- }
-#else
if (device == NULL)
_cupsLangPrintf(stdout, _("device for %s: %s"),
printer, uri);
@@ -1329,6 +1225,7 @@ show_devices(const char *printers, /* I - Destinations */
printer, device);
for (i = 0; i < num_dests; i ++)
+ {
if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance)
{
if (device == NULL)
@@ -1341,7 +1238,7 @@ show_devices(const char *printers, /* I - Destinations */
_cupsLangPrintf(stdout, _("device for %s/%s: %s"),
printer, dests[i].instance, device);
}
-#endif /* __osf__ */
+ }
}
if (attr == NULL)
@@ -1373,13 +1270,12 @@ show_jobs(const char *dests, /* I - Destinations */
*reasons; /* Job state reasons attribute */
const char *dest, /* Pointer into job-printer-uri */
*username, /* Pointer to job-originating-user-name */
- *title, /* Pointer to job-name */
- *message; /* Pointer to job-printer-state-message */
+ *message, /* Pointer to job-printer-state-message */
+ *time_at; /* time-at-xxx attribute name to use */
int rank, /* Rank in queue */
jobid, /* job-id */
size; /* job-k-octets */
time_t jobtime; /* time-at-creation */
- struct tm *jobdate; /* Date & time */
char temp[255], /* Temporary buffer */
date[255]; /* Date buffer */
static const char *jattrs[] = /* Attributes we need for jobs... */
@@ -1391,7 +1287,8 @@ show_jobs(const char *dests, /* I - Destinations */
"job-printer-state-message",
"job-printer-uri",
"job-state-reasons",
- "time-at-creation"
+ "time-at-creation",
+ "time-at-completed"
};
@@ -1435,8 +1332,8 @@ show_jobs(const char *dests, /* I - Destinations */
response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
@@ -1444,7 +1341,7 @@ show_jobs(const char *dests, /* I - Destinations */
ippDelete(response);
return (1);
}
- else if (cupsLastError() > IPP_OK_CONFLICT)
+ else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
ippDelete(response);
@@ -1457,6 +1354,13 @@ show_jobs(const char *dests, /* I - Destinations */
* Loop through the job list and display them...
*/
+ if (!strcmp(which, "aborted") ||
+ !strcmp(which, "canceled") ||
+ !strcmp(which, "completed"))
+ time_at = "time-at-completed";
+ else
+ time_at = "time-at-creation";
+
rank = -1;
for (attr = response->attrs; attr != NULL; attr = attr->next)
@@ -1480,7 +1384,6 @@ show_jobs(const char *dests, /* I - Destinations */
username = NULL;
dest = NULL;
jobtime = 0;
- title = "no title";
message = NULL;
reasons = NULL;
@@ -1492,8 +1395,7 @@ show_jobs(const char *dests, /* I - Destinations */
else if (!strcmp(attr->name, "job-k-octets") &&
attr->value_tag == IPP_TAG_INTEGER)
size = attr->values[0].integer;
- else if (!strcmp(attr->name, "time-at-creation") &&
- attr->value_tag == IPP_TAG_INTEGER)
+ else if (!strcmp(attr->name, time_at) && attr->value_tag == IPP_TAG_INTEGER)
jobtime = attr->values[0].integer;
else if (!strcmp(attr->name, "job-printer-state-message") &&
attr->value_tag == IPP_TAG_TEXT)
@@ -1507,9 +1409,6 @@ show_jobs(const char *dests, /* I - Destinations */
else if (!strcmp(attr->name, "job-originating-user-name") &&
attr->value_tag == IPP_TAG_NAME)
username = attr->values[0].string.text;
- else if (!strcmp(attr->name, "job-name") &&
- attr->value_tag == IPP_TAG_NAME)
- title = attr->values[0].string.text;
else if (!strcmp(attr->name, "job-state-reasons") &&
attr->value_tag == IPP_TAG_KEYWORD)
reasons = attr;
@@ -1537,62 +1436,42 @@ show_jobs(const char *dests, /* I - Destinations */
if (match_list(dests, dest) && match_list(users, username))
{
- jobdate = localtime(&jobtime);
snprintf(temp, sizeof(temp), "%s-%d", dest, jobid);
- if (long_status == 3)
- {
- /*
- * Show the consolidated output format for the SGI tools...
- */
-
- if (!strftime(date, sizeof(date), "%b %d %H:%M", jobdate))
- strcpy(date, "Unknown");
+ _cupsStrDate(date, sizeof(date), jobtime);
- _cupsLangPrintf(stdout, "%s;%s;%d;%s;%s",
- temp, username ? username : "unknown",
- size, title ? title : "unknown", date);
- }
+ if (ranking)
+ _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
+ rank, temp, username ? username : "unknown",
+ 1024.0 * size, date);
else
+ _cupsLangPrintf(stdout, "%-23s %-13s %8.0f %s",
+ temp, username ? username : "unknown",
+ 1024.0 * size, date);
+ if (long_status)
{
- if (!strftime(date, sizeof(date), "%c", jobdate))
- strcpy(date, "Unknown");
-
- if (ranking)
- _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
- rank, temp, username ? username : "unknown",
- 1024.0 * size, date);
- else
- _cupsLangPrintf(stdout, "%-23s %-13s %8.0f %s",
- temp, username ? username : "unknown",
- 1024.0 * size, date);
- if (long_status)
- {
- if (message)
- _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
-
- if (reasons)
- {
- char alerts[1024], /* Alerts string */
- *aptr; /* Pointer into alerts string */
+ if (message)
+ _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
- for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
- {
- if (i)
- snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s",
- reasons->values[i].string.text);
- else
- strlcpy(alerts, reasons->values[i].string.text,
- sizeof(alerts));
-
- aptr += strlen(aptr);
- }
+ if (reasons)
+ {
+ char alerts[1024], /* Alerts string */
+ *aptr; /* Pointer into alerts string */
- _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
+ for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
+ {
+ if (i)
+ snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
+ else
+ strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
+
+ aptr += strlen(aptr);
}
- _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
+ _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
}
+
+ _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
}
}
@@ -1635,7 +1514,6 @@ show_printers(const char *printers, /* I - Destinations */
ipp_pstate_t pstate; /* Printer state */
cups_ptype_t ptype; /* Printer type */
time_t ptime; /* Printer state time */
- struct tm *pdate; /* Printer state date & time */
int jobid; /* Job ID of current job */
char printer_uri[HTTP_MAX_URI],
/* Printer URI */
@@ -1694,8 +1572,8 @@ show_printers(const char *printers, /* I - Destinations */
response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
- if (cupsLastError() == IPP_BAD_REQUEST ||
- cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
_cupsLangPrintf(stderr,
_("%s: Error - add '/version=1.1' to server name."),
@@ -1703,7 +1581,7 @@ show_printers(const char *printers, /* I - Destinations */
ippDelete(response);
return (1);
}
- else if (cupsLastError() > IPP_OK_CONFLICT)
+ else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
{
_cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
ippDelete(response);
@@ -1865,7 +1743,7 @@ show_printers(const char *printers, /* I - Destinations */
jobid = jobattr->values[0].integer;
else if (!strcmp(jobattr->name, "job-state") &&
jobattr->value_tag == IPP_TAG_ENUM)
- jobstate = jobattr->values[0].integer;
+ jobstate = (ipp_jstate_t)jobattr->values[0].integer;
}
if (jobstate != IPP_JOB_PROCESSING)
@@ -1879,8 +1757,7 @@ show_printers(const char *printers, /* I - Destinations */
* Display it...
*/
- pdate = localtime(&ptime);
- strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate);
+ _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
switch (pstate)
{
@@ -1930,11 +1807,9 @@ show_printers(const char *printers, /* I - Destinations */
for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
{
if (i)
- snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s",
- reasons->values[i].string.text);
+ snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
else
- strlcpy(alerts, reasons->values[i].string.text,
- sizeof(alerts));
+ strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
aptr += strlen(aptr);
}
@@ -2056,11 +1931,9 @@ show_printers(const char *printers, /* I - Destinations */
for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
{
if (i)
- snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s",
- reasons->values[i].string.text);
+ snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
else
- strlcpy(alerts, reasons->values[i].string.text,
- sizeof(alerts));
+ strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
aptr += strlen(aptr);
}
@@ -2161,5 +2034,5 @@ show_scheduler(void)
/*
- * End of "$Id: lpstat.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpstat.c 12124 2014-08-28 15:37:22Z msweet $".
*/
diff --git a/templates/Makefile b/templates/Makefile
index 678bddd..77732b7 100644
--- a/templates/Makefile
+++ b/templates/Makefile
@@ -1,16 +1,16 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11928 2014-06-13 00:08:32Z msweet $"
#
-# Template makefile for CUPS.
+# Template makefile for CUPS.
#
-# Copyright 2007-2011 by Apple Inc.
-# Copyright 1993-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1993-2007 by Easy Software Products.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
include ../Makedefs
@@ -67,13 +67,13 @@ FILES = \
printer.tmpl \
printer-accept.tmpl \
printer-added.tmpl \
+ printer-cancel-jobs.tmpl \
printer-configured.tmpl \
printer-confirm.tmpl \
printer-default.tmpl \
printer-deleted.tmpl \
printer-jobs-header.tmpl \
printer-modified.tmpl \
- printer-purge.tmpl \
printer-reject.tmpl \
printer-start.tmpl \
printer-stop.tmpl \
@@ -200,5 +200,5 @@ uninstall-langbundle:
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 11928 2014-06-13 00:08:32Z msweet $".
#
diff --git a/templates/add-class.tmpl b/templates/add-class.tmpl
index eaf52d7..3deaf26 100644
--- a/templates/add-class.tmpl
+++ b/templates/add-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Add Class</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -37,4 +35,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/add-printer.tmpl b/templates/add-printer.tmpl
index 361958b..14d4eb6 100644
--- a/templates/add-printer.tmpl
+++ b/templates/add-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Add Printer</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -44,4 +42,3 @@ Share This Printer</TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/admin.tmpl b/templates/admin.tmpl
index ee6b5af..101f960 100644
--- a/templates/admin.tmpl
+++ b/templates/admin.tmpl
@@ -1,102 +1,97 @@
-<TABLE CLASS="indent" SUMMARY="Administration Tasks">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Printers</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Add Printer"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Find New Printers"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Printers"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Export Printers to Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Classes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Add Class"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Classes"></FORM>
-</P>
-
-<H2 CLASS="title">Jobs</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Jobs"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Server</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Edit Configuration File"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Access Log"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Error Log"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Page Log"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Server Settings\:</B></P>
-
-<P><A HREF="/admin/">Advanced <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max clients\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Advertise web interface<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preserve job history<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximum jobs (0 for no limit)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Metadata\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Documents\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max log file size\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Server Settings:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Advanced <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Change Settings"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">RSS Subscriptions</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Add RSS Subscription"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
-<THEAD><TR><TH>Name</TH><TH>Events</TH><TH>Queue Name</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancel RSS Subscription"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+ <div class="halves">
+ <H2 CLASS="title">Printers</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Add Printer"></FORM>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Find New Printers"></FORM>
+ <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Printers"></FORM>
+ {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Export Printers to Samba"></FORM>:}
+ </P>
+
+ <H2 CLASS="title">Classes</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Add Class"></FORM>
+ <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Classes"></FORM>
+ </P>
+
+ <H2 CLASS="title">Jobs</H2>
+
+ <P>
+ <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Jobs"></FORM>
+ </P>
+ </div>
+ <div class="halves">
+ <H2 CLASS="title">Server</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Edit Configuration File"></FORM>
+ <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Access Log"></FORM>
+ <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Error Log"></FORM>
+ <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Page Log"></FORM>
+ </P>
+
+ {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+ <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+ <FORM METHOD="POST" ACTION="/admin">
+ <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+ {ADVANCEDSETTINGS?<P><B>Server Settings\:</B></P>
+
+ <P><A HREF="/admin/">Advanced <SMALL>&#x25bc;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max clients\:
+ <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Advertise web interface<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preserve job history<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximum jobs (0 for no limit)\:
+ <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Metadata\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Documents\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max log file size\:
+ <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+ :<P><B>Server Settings:</B></P>
+
+ <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Advanced <SMALL>&#x25b6;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting</P>
+
+ }
+ <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Change Settings"></P>
+
+ </FORM>}
+ </div>
+</div>
+
+<div class="row">
+ <H2 CLASS="title">RSS Subscriptions</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Add RSS Subscription"></FORM>
+ </P>
+
+ {notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
+ <THEAD><TR><TH>Name</TH><TH>Events</TH><TH>Queue Name</TH></TR></THEAD>
+ <TBODY>{[notify_subscription_id]
+ <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancel RSS Subscription"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
+ </TBODY>
+ </TABLE>:}
+</div> \ No newline at end of file
diff --git a/templates/ca/add-class.tmpl b/templates/ca/add-class.tmpl
deleted file mode 100644
index 8af7a7d..0000000
--- a/templates/ca/add-class.tmpl
+++ /dev/null
@@ -1,40 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegeix una classe</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Pot contenir qualsevol car&agrave;cter excepte &laquo;/&raquo;, &laquo;#&raquo;, i espai)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una descripci&oacute; com ara &laquo;HP LaserJet de doble cara&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una ubicaci&oacute; com ara &laquo;Laboratori 1&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</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="SUBMIT" VALUE="Afegeix"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/add-printer.tmpl b/templates/ca/add-printer.tmpl
deleted file mode 100644
index f266a0b..0000000
--- a/templates/ca/add-printer.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegir una impressora</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<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}">
-{?current_make!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE" VALUE="{current_make}">:}
-{?current_make_and_model!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{current_make_and_model}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
-<SMALL>(Pot contenir qualsevol car&agrave;cter excepte &laquo;/&raquo;, &laquo;#&raquo;, i espai)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>(Una descripci&oacute; com ara &laquo;HP LaserJet de doble cara&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>(Una ubicaci&oacute; com ara &laquo;Laboratori 1&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Compartir:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Comparteix aquesta impressora</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/add-rss-subscription.tmpl b/templates/ca/add-rss-subscription.tmpl
deleted file mode 100644
index b195ac6..0000000
--- a/templates/ca/add-rss-subscription.tmpl
+++ /dev/null
@@ -1,44 +0,0 @@
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
-
-<H2 CLASS="title">Afegir una subscripci&oacute; RSS</H2>
-
-<TABLE SUMMARY="Add RSS Subscription form">
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
-<SMALL>(Pot contenir qualsevol car&agrave;cter excepte espai &laquo;/&raquo;, &laquo;?&raquo; i &laquo;#&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Cua:</TH>
-<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Totes</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
-</TR>
-<TR VALIGN="TOP">
-<TH CLASS="label">Esdeveniments:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Creaci&oacute; de tasca<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Tasca completada<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Tasca aturada<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Modificaci&oacute; de les opcions de la tasca</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Cua aturada<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Cua afegida<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Modificaci&oacute; de la cua<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Eliminaci&oacute; de la cua</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Inicialitzaci&oacute; del servidor<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Aturada del servidor<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Servidor iniciat de nou<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Auditoria de seguretat del servidor</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nombre m&agrave;xims d'esdeveniments al canal:</TH>
-<TD COLSPAN="5"><INPUT TYPE="NUMBER" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="Afegeix"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/ca/admin.tmpl b/templates/ca/admin.tmpl
deleted file mode 100644
index ea3fc1e..0000000
--- a/templates/ca/admin.tmpl
+++ /dev/null
@@ -1,102 +0,0 @@
-<TABLE CLASS="indent" SUMMARY="Administration Tasks">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Impressores</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Afegeix una impressora"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Busca m&eacute;s impressores"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Gestiona les impressores"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exporta les impressores al Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Classes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Afegeix una classe"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Gestiona les classes"></FORM>
-</P>
-
-<H2 CLASS="title">Tasques</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Gestiona les tasques"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Servidor</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Edita el fitxer de configuraci&oacute;"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra el registre d'acc&eacute;s"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra el registre d'errors"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra la p&agrave;gina de registres"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Configuraci&oacute; del servidor\:</B></P>
-
-<P><A HREF="/admin/">Avan&ccedil;at <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Comparteix les impressores connectades a aquest sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre m&agrave;xim de clients\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permet imprimir des d'Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Anuncia la interf&iacute;cie web<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permet l'administraci&oacute; remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Fes servir l'autenticaci&oacute; Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">PMF</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permet als usuaris cancel&middot;lar qualsevol tasca (no nom&eacute;s les pr&ograve;pies)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Conserva l'historial de tasques<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre màxim de tasques (0 per ilimitat)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserva les metadades\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserva els documents\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Desa la informaci&oacute; de depuraci&oacute; per la resoluci&oacute; de problemes<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mida m&agrave;xima de fitxer de registre\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Configuraci&oacute; del servidor:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avan&ccedil;at <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Comparteix les impressores connectades a aquest sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permet imprimir des d'Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permet l'administraci&oacute; remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Fes servir l'autenticaci&oacute; Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">PMF</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permet als usuaris cancel&middot;lar qualsevol tasca (no nom&eacute;s les pr&ograve;pies)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Desa la informaci&oacute; de depuraci&oacute; per la resoluci&oacute; de problemes<BR>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Envia els canvis"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Subscripcions RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Afegeix una subscripci&oacute; RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
-<THEAD><TR><TH>Nom</TH><TH>Esdeveniments</TH><TH>Nom de la cua</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancel&middot;la la subscripci&oacute; RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
-</TBODY>
-</TABLE>:}
diff --git a/templates/ca/choose-model.tmpl b/templates/ca/choose-model.tmpl
deleted file mode 100644
index d2adeb8..0000000
--- a/templates/ca/choose-model.tmpl
+++ /dev/null
@@ -1,60 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<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}">
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Connecci&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Compartida:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Comparteix aquesta impressora</TD>
-</TR>
-<TR>
-<TH CLASS="label">Fabricant:</TH>
-<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Seleccioneu un altre fabricant"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Model:</TH>
-<TD>
-<SELECT NAME="PPD_NAME" SIZE="10">
-{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Current Driver - {current_make_and_model}</OPTION>:}
-{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
-}</SELECT>
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">O indica un fitxer 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="SUBMIT" VALUE="{op=add-printer?Add Printer:Modifica la impressora}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/choose-serial.tmpl b/templates/ca/choose-serial.tmpl
deleted file mode 100644
index e86f5a8..0000000
--- a/templates/ca/choose-serial.tmpl
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Velocitat:</TH>
-<TD><SELECT NAME="BAUDRATE">
-{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Paritat:</TH>
-<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Cap
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Parell
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Senar
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Bits de dades:</TH>
-<TD><SELECT NAME="BITS">
-<OPTION {?bits=8?SELECTED:}>8
-<OPTION {?bits=7?SELECTED:}>7
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Control de flux:</TH>
-<TD><SELECT NAME="FLOW">
-<OPTION VALUE="none" {?flow=none?SELECTED:}>Cap
-<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Programari)
-<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Maquinari)
-<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Maquinari)
-</SELECT></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/choose-uri.tmpl b/templates/ca/choose-uri.tmpl
deleted file mode 100644
index 630b1d3..0000000
--- a/templates/ca/choose-uri.tmpl
+++ /dev/null
@@ -1,43 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="URL" SIZE="60" MAXLENGTH="1023" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>Exemples:
-<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>Llegiu <A HREF="/help/network.html" TARGET="_blank">"Impressores de xarxa"</A> per saber quin URI heu de fer servir amb la vostre impressora.</P>
-
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/class-added.tmpl b/templates/ca/class-added.tmpl
deleted file mode 100644
index 8e8347c..0000000
--- a/templates/ca/class-added.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegeix una classe</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> s'ha afegit correctament.
-
-</DIV>
diff --git a/templates/ca/class-confirm.tmpl b/templates/ca/class-confirm.tmpl
deleted file mode 100644
index 905ac6f..0000000
--- a/templates/ca/class-confirm.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Esborra la classe {printer_name}</H2>
-
-<P><B>Av&iacute;s:</B> Esteu segur que voleu esborrar la classe
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Esborra la classe"></FORM></P>
-
-</DIV>
diff --git a/templates/ca/class-deleted.tmpl b/templates/ca/class-deleted.tmpl
deleted file mode 100644
index 3f0035f..0000000
--- a/templates/ca/class-deleted.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Esborra la classe {printer_name}</H2>
-
-<P>La classe {printer_name} s'ha esborrat correctament.
-
-</DIV>
diff --git a/templates/ca/class-jobs-header.tmpl b/templates/ca/class-jobs-header.tmpl
deleted file mode 100644
index 90e640e..0000000
--- a/templates/ca/class-jobs-header.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Tasques</H3>
-</DIV>
diff --git a/templates/ca/class-modified.tmpl b/templates/ca/class-modified.tmpl
deleted file mode 100644
index 6152ffa..0000000
--- a/templates/ca/class-modified.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica la classe {printer_name}</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> s'ha modificat correctament.
-
-</DIV>
diff --git a/templates/ca/class.tmpl b/templates/ca/class.tmpl
deleted file mode 100644
index 6b39168..0000000
--- a/templates/ca/class.tmpl
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Inactiva:{printer_state=4?Processing:Paused}},
-{printer_is_accepting_jobs=0?No accepta tasques:Accepta tasques},
-{server_is_sharing_printers=0?No:{printer_is_shared=0?Not:}} Compartida{default_name={printer_name}?, Servidor per defecte:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Manteniment</OPTION>
-<OPTION VALUE="print-test-page">Imprimeix una p&agrave;gina de prova</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">Resume Class</OPTION>:<OPTION VALUE="stop-class">Pausa la classe</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepta Tasques</OPTION>:<OPTION VALUE="reject-jobs">No acceptis tasques</OPTION>}
-<OPTION VALUE="move-jobs">Mou totes les tasques</OPTION>
-<OPTION VALUE="purge-jobs">Cancel&middot;a totes les tasques</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administraci&oacute;</OPTION>
-<OPTION VALUE="modify-class">Modifica la classe</OPTION>
-<OPTION VALUE="delete-class">Esborra la classe</OPTION>
-<OPTION VALUE="set-class-options">Aplica les opcions per defecte</OPTION>
-<OPTION VALUE="set-as-default">Configura com a servidor per defecte</OPTION>
-<OPTION VALUE="set-allowed-users">Gestiona els permisos dels usuaris</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Membres:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Per defecte:</TH><TD>plantilles={job_sheets_default}
-mitj&agrave;={media_default?{media_default}:unknown}
-{sides_default?laterals={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/ca/classes-header.tmpl b/templates/ca/classes-header.tmpl
deleted file mode 100644
index 47ad5ce..0000000
--- a/templates/ca/classes-header.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?No hi ha cap classe:Es mostr{total=1?a:en} {#printer_name} classe{total=1?:s} de {total}}.</P>
diff --git a/templates/ca/command.tmpl b/templates/ca/command.tmpl
deleted file mode 100644
index 5cfd89f..0000000
--- a/templates/ca/command.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{title} a {printer_name}</H2>
-
-<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Comanda de tasca de la impressora
-{job_state=3?pendent:{job_state=4?pausat:
-{job_state=5?processant:{job_state=6?aturat:
-{job_state=7?cancel·lat:{job_state=8?abortat:completat}}}}}}{job_state=9?:{job_printer_state_message?,
-<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/ca/edit-config.tmpl b/templates/ca/edit-config.tmpl
deleted file mode 100644
index e6e08f1..0000000
--- a/templates/ca/edit-config.tmpl
+++ /dev/null
@@ -1,24 +0,0 @@
-<SCRIPT TYPE="text/javascript">
-function reset_config()
-{
- document.cups.CUPSDCONF.value = "{?cupsdconf_default}";
-}
-</SCRIPT>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Edita el fitxer de configuraci&oacute;</H2>
-
-<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-
-<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
-
-<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Desa els canvis">
-<INPUT TYPE="BUTTON" VALUE="Fes servir el fitxer de configuaci&oacute; per defecte"
-onClick="reset_config();"></P>
-
-</FORM>
-
-</DIV>
diff --git a/templates/ca/error-op.tmpl b/templates/ca/error-op.tmpl
deleted file mode 100644
index 064e8b4..0000000
--- a/templates/ca/error-op.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{?title} {?printer_name} Error</H2>
-
-<P>Error:</P>
-
-<BLOCKQUOTE>Operaci&oacute; desconeguda "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ca/header.tmpl.in b/templates/ca/header.tmpl.in
deleted file mode 100644
index 988d6bf..0000000
--- a/templates/ca/header.tmpl.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Inici&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administraci&oacute;&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Ajuda&nbsp;en&nbsp;l&iacute;nia&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Tasques&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Impressores&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
diff --git a/templates/ca/help-header.tmpl b/templates/ca/help-header.tmpl
deleted file mode 100644
index 54f2d22..0000000
--- a/templates/ca/help-header.tmpl
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
-{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
-
-<P ALIGN="CENTER"><B>Cerca a
-{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:tots els documents}}:</B> <INPUT
-TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
-AUTOSAVE="org.cups.help" RESULTS="20">
-<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Cerca">
-<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Esborra"></P>
-
-</FORM>
-
-<!-- Bookmarks -->
-<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Contents">
-<TR><TD>
-
-<H3 CLASS="title">Documents d'ajuda en l&iacute;nia</H3>
-
-<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Tots els documents</A></P>
-<HR>
-
-{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
-}
-</TD></TR>
-</TABLE></DIV>
-
-{QUERY?<P>Resultats de la cerca a {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:tots els documents}}\:</P>
-{QTEXT?<UL>
-{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
-{QTEXT?</UL>:}
-:<P>No s'ha trobat cap coincid&egrave;ncia.</P>}
-<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Mostra una versi&oacute; per imprimir"></FORM>:
-
-<H1>Ajuda en l&iacute;nia</H1>
-
-<P>Aquesta &eacute;s la interf&iacute;cie d'ajuda en l&iacute;nia de CUPS.
-Introdu&iuml;u les paraules que vulgueu cercar aqu&iacute; dalt o feu clic als
-enlla&ccedil;os de la documentaci&oacute; per mostrar la informaci&oacute; de
-l'ajuda en l&iacute;nia.</P>
-
-<P>Si sou nou a CUPS, llegiu la p&agrave;gina &laquo;<a
-href="/help/overview.html">Descripci&oacute; general de CUPS</a>&raquo;. Els
-usuaris veterans haurien de llegir la p&agrave;gina &laquo;<a
-href="/help/whatsnew.html">Que hi ha de nou a CUPS 1.6</a>&raquo;.</P>
-
-<P>La <A HREF="http://www.cups.org/">p&agrave;gina web de CUPS</A> tamb&eacute;
-dona cont&eacute; molts recursos que inclouen f&ograve;rums, respostes a les preguntes m&eacute;s
-freq&uuml;ents, i un formulari per enviar informes d'errors i demanar noves
-caracter&iacute;stiques.</P>}
diff --git a/templates/ca/help-trailer.tmpl b/templates/ca/help-trailer.tmpl
deleted file mode 100644
index 4c1ebed..0000000
--- a/templates/ca/help-trailer.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/ca/job-cancel.tmpl b/templates/ca/job-cancel.tmpl
deleted file mode 100644
index a53ca2f..0000000
--- a/templates/ca/job-cancel.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Cancel&middot;la la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha cancel&middot;lat.
-
-</DIV>
diff --git a/templates/ca/job-hold.tmpl b/templates/ca/job-hold.tmpl
deleted file mode 100644
index e89b97f..0000000
--- a/templates/ca/job-hold.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pausa la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha posat en pausa.
-
-</DIV>
diff --git a/templates/ca/job-move.tmpl b/templates/ca/job-move.tmpl
deleted file mode 100644
index 1bca282..0000000
--- a/templates/ca/job-move.tmpl
+++ /dev/null
@@ -1,27 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
-
-<H2 CLASS="title">{job_id?Mou la tasca {job_id}:Mou totes les tasques}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nova destinaci&oacute;:</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="SUBMIT" VALUE="{job_id?Mou la tasca:Mou les tasques}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-
-</DIV>
diff --git a/templates/ca/job-moved.tmpl b/templates/ca/job-moved.tmpl
deleted file mode 100644
index 1e538f9..0000000
--- a/templates/ca/job-moved.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{job_id?Mou la tasca {job_id}:Mou totes les tasques}</H2>
-
-<P>{job_id?<A HREF="/jobs/{job_id}">La tasca s'ha {job_id}</A>:Totes les tasques s'han} mogut a
-<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/ca/job-release.tmpl b/templates/ca/job-release.tmpl
deleted file mode 100644
index db13e1d..0000000
--- a/templates/ca/job-release.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Allibera la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha alliberat.
-
-</DIV>
diff --git a/templates/ca/job-restart.tmpl b/templates/ca/job-restart.tmpl
deleted file mode 100644
index d40c1c2..0000000
--- a/templates/ca/job-restart.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Torna a imprimir la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha tornat a imprimir.
-
-</DIV>
diff --git a/templates/ca/jobs-header.tmpl b/templates/ca/jobs-header.tmpl
deleted file mode 100644
index 3f785d5..0000000
--- a/templates/ca/jobs-header.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra les tasques actives"></FORM>}
-{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Mostra les tasques completades"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Mostra totes les tasques"></FORM>}</DIV>
-
-<P ALIGN="CENTER">{total=0?No hi ha cap tasca:Es mostren {#job_id} tas{total=1?ca:ques} de {total} {?which_jobs=?active:{which_jobs=all?:completed}}}.</P>
diff --git a/templates/ca/modify-class.tmpl b/templates/ca/modify-class.tmpl
deleted file mode 100644
index 26a6284..0000000
--- a/templates/ca/modify-class.tmpl
+++ /dev/null
@@ -1,34 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica la classe {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</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="SUBMIT" VALUE="Modifica la classe"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/modify-printer.tmpl b/templates/ca/modify-printer.tmpl
deleted file mode 100644
index 3843016..0000000
--- a/templates/ca/modify-printer.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<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}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una descripci&oacute; com ara &laquo;HP LaserJet de doble cara&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una ubicaci&oacute; com ara &laquo;Laboratori 1&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Compartir:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Comparteix aquesta impressora</TD>
-</TR>
-<TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/norestart.tmpl b/templates/ca/norestart.tmpl
deleted file mode 100644
index 5cdb7c4..0000000
--- a/templates/ca/norestart.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Canvis en la configuraci&oacute;</H2>
-
-<P>El servidor no s'ha tornat a iniciar per que no hi ha canvis
-a la configuraci&oacute;...</P>
-
-</DIV>
diff --git a/templates/ca/option-conflict.tmpl b/templates/ca/option-conflict.tmpl
deleted file mode 100644
index 59b63e9..0000000
--- a/templates/ca/option-conflict.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<P><B>Error:</B> Les seg&uuml;ents opcions entren en conflicte:</P>
-
-<UL>
-{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
-}</UL>
-
-<P>Canvieu algunes de les opcions per resoldre els conflictes.</P>
diff --git a/templates/ca/option-pickone.tmpl b/templates/ca/option-pickone.tmpl
deleted file mode 100644
index 1b3c271..0000000
--- a/templates/ca/option-pickone.tmpl
+++ /dev/null
@@ -1,18 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" ID="select-{keyword}" ONCHANGE="update_paramtable('{keyword}')">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT>
-{iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
-<TR><TH CLASS="sublabel">{paramtext}:</TH>
-<TD>{params=Units?<SELECT NAME="{keyword-1}.{params}">
-<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Punts</OPTION>
-<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Mil&middot;l&iacute;metres</OPTION>
-<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Cent&iacute;metres</OPTION>
-<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Polzades</OPTION>
-<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Peus</OPTION>
-<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Metres</OPTION>
-</SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword-1}.{params}" VALUE="{paramvalue}">}</TD></TR>
-}</TABLE>
-</TD>:}
-</TR>
diff --git a/templates/ca/option-trailer.tmpl b/templates/ca/option-trailer.tmpl
deleted file mode 100644
index 11c4011..0000000
--- a/templates/ca/option-trailer.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-</TABLE>
-
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Configura els par&agrave;metres per defecte"></P>
-
-</DIV>
diff --git a/templates/ca/printer-accept.tmpl b/templates/ca/printer-accept.tmpl
deleted file mode 100644
index 0bd2a57..0000000
--- a/templates/ca/printer-accept.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Accepta tasques a {is_class?la classe: la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:La impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ara accepta tasques.</P>
-
-</DIV>
diff --git a/templates/ca/printer-added.tmpl b/templates/ca/printer-added.tmpl
deleted file mode 100644
index b5850aa..0000000
--- a/templates/ca/printer-added.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegeix una impressora</H2>
-
-<P>La impressora <A HREF="/printers/{printer_name}">{printer_name}</A> s'ha afegit
-correctament.
-
-</DIV>
diff --git a/templates/ca/printer-configured.tmpl b/templates/ca/printer-configured.tmpl
deleted file mode 100644
index 20880da..0000000
--- a/templates/ca/printer-configured.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">S'ha aplicat la configuraci&oacute; per defecte a {printer_name}</H2>
-
-<P>Les opcions per defecte de la {OP=set-class-options?classe <A HREF="/classes/{printer_name}">:impressora <A HREF="/printers/{printer_name}">}{printer_name}</A> s'han establert correctament.
-</DIV>
diff --git a/templates/ca/printer-default.tmpl b/templates/ca/printer-default.tmpl
deleted file mode 100644
index 76f7ddf..0000000
--- a/templates/ca/printer-default.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Estableix {is_class?Class:Printer} {printer_name} com a predeterminada</H2>
-
-<P>{is_class?Class:Printer} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-s'ha establert com a impressora predeterminada.</P>
-
-<BLOCKQUOTE><B>Nota:</B> Qualsevol usuari que hagi estat establert mitjan&ccedil;ant
-la comanda <TT>lpoptions</TT> sobreescriur&agrave; aquesta configuraci&oacute; predeterminada.</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ca/printer-deleted.tmpl b/templates/ca/printer-deleted.tmpl
deleted file mode 100644
index 695ab67..0000000
--- a/templates/ca/printer-deleted.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Elimina la impressora {printer_name}</H2>
-
-<P>La impressora {printer_name} s'ha eliminat correctament.
-
-</DIV>
diff --git a/templates/ca/printer-jobs-header.tmpl b/templates/ca/printer-jobs-header.tmpl
deleted file mode 100644
index 90e640e..0000000
--- a/templates/ca/printer-jobs-header.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Tasques</H3>
-</DIV>
diff --git a/templates/ca/printer-modified.tmpl b/templates/ca/printer-modified.tmpl
deleted file mode 100644
index efbbc3b..0000000
--- a/templates/ca/printer-modified.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica la impressora {printer_name}</H2>
-
-<P>La impressora <A HREF="/printers/{printer_name}">{printer_name}</A> s'ha
-modificat correctament.
-
-</DIV>
diff --git a/templates/ca/printer-purge.tmpl b/templates/ca/printer-purge.tmpl
deleted file mode 100644
index 980d883..0000000
--- a/templates/ca/printer-purge.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Cancel&middot;la les tasques de {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>S'han cancel&middot;lat totes les tasques de{is_class?la classe:la impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/ca/printer-reject.tmpl b/templates/ca/printer-reject.tmpl
deleted file mode 100644
index 6269cf2..0000000
--- a/templates/ca/printer-reject.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Refusa les tasques a {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:la impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-no accepta tasques a partir d'ara.</P>
-
-</DIV>
diff --git a/templates/ca/printer-start.tmpl b/templates/ca/printer-start.tmpl
deleted file mode 100644
index 6986fd4..0000000
--- a/templates/ca/printer-start.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Repr&egrave;n {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:La impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ha repr&egrave;s les tasques.</P>
-
-</DIV>
diff --git a/templates/ca/printer-stop.tmpl b/templates/ca/printer-stop.tmpl
deleted file mode 100644
index af89331..0000000
--- a/templates/ca/printer-stop.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pausa {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:La impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-s'ha posat en pausa.</P>
-
-</DIV>
diff --git a/templates/ca/printer.tmpl b/templates/ca/printer.tmpl
deleted file mode 100644
index 2500001..0000000
--- a/templates/ca/printer.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Inactiva:{printer_state=4?Processant:En pausa}},
-{printer_is_accepting_jobs=0?Refusa les tasques:Accepta tasques},
-{server_is_sharing_printers=0?No:{printer_is_shared=0?No:}} Compartida{default_name={printer_name}?, Servidor per defecte:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Manteniment</OPTION>
-<OPTION VALUE="print-test-page">Imprimeix una p&agrave;gina de prova</OPTION>
-{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Neteja els cap&ccedil;als</OPTION>:}
-{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Imprimeix la p&agrave;gina de prova pr&ograve;pia</OPTION>:}
-{printer_state=5?<OPTION VALUE="start-printer">Repr&egrave;n la impressora</OPTION>:<OPTION VALUE="stop-printer">Pausa la impressora</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepta tasques</OPTION>:<OPTION VALUE="reject-jobs">Refusa les tasques</OPTION>}
-<OPTION VALUE="move-jobs">Mou totes les tasques</OPTION>
-<OPTION VALUE="purge-jobs">Cancel&middot;la totes les tasques</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administraci&oacute;</OPTION>
-<OPTION VALUE="modify-printer">Modifica la impressora</OPTION>
-<OPTION VALUE="delete-printer">Elimina la impressora</OPTION>
-<OPTION VALUE="set-printer-options">Torna a les opcions per defecte</OPTION>
-<OPTION VALUE="set-as-default">Configura com a servidor per defecte</OPTION>
-<OPTION VALUE="set-allowed-users">Configura els permisos dels usuaris</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute;:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grisos}{sides_supported?, impressió a doble cara:})<BR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Connexi&oacute;:</TH><TD>{device_uri}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Configuraci&oacute; per defecte:</TH><TD>Fulls de tasques={job_sheets_default}
-safata={media_default?{media_default}:desconeguda}
-{sides_default?cares={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/ca/printers-header.tmpl b/templates/ca/printers-header.tmpl
deleted file mode 100644
index 52eaa2f..0000000
--- a/templates/ca/printers-header.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Cap impressora:Es mostr{#printer_name=1?a:en} {#printer_name} de {total} impressor{total=1?a:es}}.</P>
diff --git a/templates/ca/printers.tmpl b/templates/ca/printers.tmpl
deleted file mode 100644
index d978c17..0000000
--- a/templates/ca/printers.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Printer List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Descripci&oacute;</TH><TH>Ubicaci&oacute</TH><TH>Marca i model</TH><TH>Estat</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Preparada:{printer_state=4?Processant:En pausa}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/ca/restart.tmpl b/templates/ca/restart.tmpl
deleted file mode 100644
index 4e3983f..0000000
--- a/templates/ca/restart.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Canvis en la configuraci&oacute;</H2>
-
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Espereu mentre es torna a iniciar el servidor...</P>
-
-</DIV>
diff --git a/templates/ca/samba-export.tmpl b/templates/ca/samba-export.tmpl
deleted file mode 100644
index 2b16e1e..0000000
--- a/templates/ca/samba-export.tmpl
+++ /dev/null
@@ -1,55 +0,0 @@
-<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="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
-
-<H2 CLASS="title">Exporta les impressores al Samba</H2>
-
-{error?<P>No es pot exportar les impressores al Samba\:</P>
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-<P>Consulteu el fitxer <A HREF="/admin/log/error_log"
-TARGET="_blank">error_log</A> per obtenir m&eacute;s informaci&oacute;.</P>:
-<P>Aquesta p&agrave;gina us permet exportar les impressores al Samba per tal que
-els clients de Windows puguin accedir-hi a trav&eacute;s de les icones <VAR>Xarxa
-ve&iuml;na</VAR> o <VAR>Llocs de la xarxa</VAR> del seu
-escriptori. Abans heu d'instal&middot;lar el controlador d'impressores Windows PostScript
-tal i com s'explica a la p&agrave;gina del manual <A
-HREF="/help/man-cupsaddsmb.html"
-TARGET="_blank">cupsaddsmb(8)</A>.</P>}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Impressores:</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()"> Exporta totes les impressores
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nom de l'usuari del Samba:</TH>
-<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (necessari)</TD>
-</TR>
-<TR>
-<TH CLASS="label">Contrasenya del Samba:</TH>
-<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (necess&agrave;ria)</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Exporta les impressores al Samba"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/ca/samba-exported.tmpl b/templates/ca/samba-exported.tmpl
deleted file mode 100644
index 7ea9857..0000000
--- a/templates/ca/samba-exported.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P>Les impressores s'han exportat correctament al Samba.</P>
diff --git a/templates/ca/set-printer-options-header.tmpl b/templates/ca/set-printer-options-header.tmpl
deleted file mode 100644
index b4a4a4e..0000000
--- a/templates/ca/set-printer-options-header.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Aplica les opcions per defecte a {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Demana a la impressora les opcions per defecte">:}
-
-<SCRIPT TYPE="text/javascript"><!--
-function update_paramtable(option)
-{
- var cb = document.getElementById("select-" + option)
- var paramstable = document.getElementById(option + "-params");
- if (cb.value == "Custom")
- paramstable.style.display = "table";
- else
- paramstable.style.display = "none";
-}
---></SCRIPT>
-
-<H3 CLASS="title">{[group_id]
-<A HREF="#{group_id}">{group}</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</H3>
-
-<DIV CLASS="tabs">
diff --git a/templates/ca/set-printer-options-trailer.tmpl b/templates/ca/set-printer-options-trailer.tmpl
deleted file mode 100644
index 11adc70..0000000
--- a/templates/ca/set-printer-options-trailer.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-</DIV>
-
-<SCRIPT TYPE="text/javascript"><!--
-// Hide custom options parameters for browsers that understand Javascript
-var paramtables = document.getElementsByName("paramtable");
-for (var i = 0; i < paramtables.length; i++)
-{
- var opt = paramtables[i].id.substr(0, paramtables[i].id.lastIndexOf("-"));
- var cb = document.getElementById("select-" + opt);
- if (cb.value != "Custom")
- paramtables[i].style.display = "none";
-}
---></SCRIPT>
-</FORM>
-
-</DIV>
diff --git a/templates/ca/subscription-added.tmpl b/templates/ca/subscription-added.tmpl
deleted file mode 100644
index 067132f..0000000
--- a/templates/ca/subscription-added.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>La subscripci&oacute; {subscription_name} s'ha afegit correctament.</P>
-
-</DIV>
diff --git a/templates/ca/subscription-canceled.tmpl b/templates/ca/subscription-canceled.tmpl
deleted file mode 100644
index 8a93b4c..0000000
--- a/templates/ca/subscription-canceled.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>La subscripci&oacute; #{notify_subscription_id} s'ha cancel&middot;lat.</P>
-
-</DIV>
diff --git a/templates/ca/test-page.tmpl b/templates/ca/test-page.tmpl
deleted file mode 100644
index 2a4b776..0000000
--- a/templates/ca/test-page.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Imprimeix una p&agrave;gina de prova a {printer_name}</H2>
-
-<P>S'ha enviat la p&agrave;gina de prova; l'ID de la tasca &eacute;s <A HREF="/{SECTION}/{printer_name}">
-{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/ca/trailer.tmpl b/templates/ca/trailer.tmpl
deleted file mode 100644
index f75af72..0000000
--- a/templates/ca/trailer.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS i el logotip de CUPS s&oacute;n marques registrades per
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS t&eacute; copyright 2007-2013 Apple
-Inc. Tots els drets reservats.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/templates/choose-device.tmpl b/templates/choose-device.tmpl
index c5ab251..5f46939 100644
--- a/templates/choose-device.tmpl
+++ b/templates/choose-device.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
@@ -49,5 +47,3 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
ALT="Busy Indicator"> Looking for printers...</P>}
-
-</DIV>
diff --git a/templates/choose-make.tmpl b/templates/choose-make.tmpl
index 65096ad..a5c80aa 100644
--- a/templates/choose-make.tmpl
+++ b/templates/choose-make.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/choose-model.tmpl b/templates/choose-model.tmpl
index 992cd01..ee9338c 100644
--- a/templates/choose-model.tmpl
+++ b/templates/choose-model.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/choose-serial.tmpl b/templates/choose-serial.tmpl
index 56a14a4..89a5eaf 100644
--- a/templates/choose-serial.tmpl
+++ b/templates/choose-serial.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -49,4 +47,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/choose-uri.tmpl b/templates/choose-uri.tmpl
index 45d84de..0c7f454 100644
--- a/templates/choose-uri.tmpl
+++ b/templates/choose-uri.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -41,4 +39,3 @@ Printers"</A> for the correct URI to use with your printer.</P>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/class-added.tmpl b/templates/class-added.tmpl
index c062a16..6afd302 100644
--- a/templates/class-added.tmpl
+++ b/templates/class-added.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Add Class</H2>
<P>Class <A HREF="/classes/{printer_name}">{printer_name}</A> has been added
successfully.
-
-</DIV>
diff --git a/templates/class-confirm.tmpl b/templates/class-confirm.tmpl
index 5f0277c..e564379 100644
--- a/templates/class-confirm.tmpl
+++ b/templates/class-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Delete Class {printer_name}</H2>
<P><B>Warning:</B> Are you sure you want to delete class
{printer_name}?</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Delete Class"></FORM></P>
-
-</DIV>
diff --git a/templates/class-deleted.tmpl b/templates/class-deleted.tmpl
index a4ad46a..6c44468 100644
--- a/templates/class-deleted.tmpl
+++ b/templates/class-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Delete Class {printer_name}</H2>
<P>Class {printer_name} has been deleted successfully.
-
-</DIV> \ No newline at end of file
diff --git a/templates/class-jobs-header.tmpl b/templates/class-jobs-header.tmpl
index ba46f10..61e5151 100644
--- a/templates/class-jobs-header.tmpl
+++ b/templates/class-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">Jobs</H3>
-</DIV>
diff --git a/templates/class-modified.tmpl b/templates/class-modified.tmpl
index fe42c90..02b9895 100644
--- a/templates/class-modified.tmpl
+++ b/templates/class-modified.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modify Class {printer_name}</H2>
<P>Class <A HREF="/classes/{printer_name}">{printer_name}</A> has been
modified successfully.
-
-</DIV> \ No newline at end of file
diff --git a/templates/class.tmpl b/templates/class.tmpl
index 477e0e8..0afb0d3 100644
--- a/templates/class.tmpl
+++ b/templates/class.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
({printer_state=3?Idle:{printer_state=4?Processing:Paused}},
{printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs},
@@ -40,5 +39,3 @@
media={media_default?{media_default}:unknown}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV>
diff --git a/templates/command.tmpl b/templates/command.tmpl
index 9a87439..a8dc6ff 100644
--- a/templates/command.tmpl
+++ b/templates/command.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{title} On {printer_name}</H2>
<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
@@ -8,5 +6,3 @@ ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Printer command job
{job_state=5?processing:{job_state=6?stopped:
{job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?,
<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/cs/admin.tmpl b/templates/cs/admin.tmpl
deleted file mode 100644
index 247a10f..0000000
--- a/templates/cs/admin.tmpl
+++ /dev/null
@@ -1,102 +0,0 @@
-<TABLE CLASS="indent" SUMMARY="Administration Tasks">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Tiskárny</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Přidat tiskárnu"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Hledat nové tiskárny"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Správa tiskáren"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Export tiskáren do Samby"></FORM>:}
-</P>
-
-<H2 CLASS="title">Třídy</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Přidat třídu"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Správa tříd"></FORM>
-</P>
-
-<H2 CLASS="title">Úlohy</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Správa úloh"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Server</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Úprava konfiguraÄního souboru"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Prohlížení Access Log"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Prohlížení Error Log"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Prohlížení Page Log"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Nastavení serveru\:</B></P>
-
-<P><A HREF="/admin/">Skrýt rozšířené nastavení <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Sdílet tiskárny připojené k tomuto systému<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximální poÄet klientů\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Povolit tisk z internetu<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Nabízet webové rozhraní<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Povolit vzdálenou správu<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Používat ověřování Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">Äasté dotazy</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Povolit uživatelům zrušit jakoukoliv úlohu (nejen vlastní)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Zachovat historii úloh<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximální poÄet úloh (0 bez omezení)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Zachovat metadata\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Zachovat dokumenty\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Uložit informace o ladění pro řešení problémů<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximální velikost log souboru\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Nastavení serveru:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Zobrazit rozšířené nastavení <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Sdílet tiskárny připojené k tomuto systému<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Povolit tisk z internetu<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Povolit vzdálenou správu<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Používat ověřování Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">Äasté dotazy</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Povolit uživatelům zrušit jakoukoliv úlohu (nejen vlastní)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Uložit informace o ladění pro řešení problémů</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Změnit nastavení"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">RSS předplatné</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Přidat RSS předplatné"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
-<THEAD><TR><TH>Název</TH><TH>Události</TH><TH>Název fronty</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Zrušit RSS předplatné"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Všechny fronty}</TD></TR>}
-</TBODY>
-</TABLE>:}
diff --git a/templates/cs/choose-device.tmpl b/templates/cs/choose-device.tmpl
deleted file mode 100644
index aa8a649..0000000
--- a/templates/cs/choose-device.tmpl
+++ /dev/null
@@ -1,53 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
-
-{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-{op=add-printer?:<TR>
-<TH CLASS="label">Aktuální připojení\:</TH>
-<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
-{current_device_uri}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Místní tiskárny\:</TH>
-<TD>
-{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}}
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nalezené síťové tiskárny\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}:}}
-</TD>
-</TR>
-<TR>
-<TR>
-<TH CLASS="label">Ostatní síťové tiskárny\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-}:}}
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="PokraÄovat"></TD>
-</TR>
-</TABLE>
-
-</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Hledání tiskáren ...</P>}
-
-</DIV>
diff --git a/templates/cs/choose-make.tmpl b/templates/cs/choose-make.tmpl
deleted file mode 100644
index f018f0e..0000000
--- a/templates/cs/choose-make.tmpl
+++ /dev/null
@@ -1,64 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<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}">
-
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Název:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Popis:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Umístění:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Připojení:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Sdílení:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?ne:{?printer_is_shared=0?ne:}}sdílená</TD>
-</TR>
-<TR>
-<TH CLASS="label">Výrobce:</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="SUBMIT" VALUE="PokraÄovat"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>&nbsp;</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nebo vybrat soubor 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="SUBMIT" VALUE="{op=add-printer?Přidat tiskárnu:Upravit tiskárnu}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/cs/choose-serial.tmpl b/templates/cs/choose-serial.tmpl
deleted file mode 100644
index 593bcdd..0000000
--- a/templates/cs/choose-serial.tmpl
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Připojení:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Přenosová rychlost:</TH>
-<TD><SELECT NAME="BAUDRATE">
-{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Parita:</TH>
-<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Žádná
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Sudá
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Lichá
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Datových bitů:</TH>
-<TD><SELECT NAME="BITS">
-<OPTION {?bits=8?SELECTED:}>8
-<OPTION {?bits=7?SELECTED:}>7
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Řízení toku dat:</TH>
-<TD><SELECT NAME="FLOW">
-<OPTION VALUE="none" {?flow=none?SELECTED:}>Žádné
-<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (software)
-<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (hardware)
-<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (hardware)
-</SELECT></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="PokraÄovat"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/cs/class-added.tmpl b/templates/cs/class-added.tmpl
deleted file mode 100644
index d644303..0000000
--- a/templates/cs/class-added.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat třídu</H2>
-
-<P>Třída <A HREF="/classes/{printer_name}">{printer_name}</A> byla úspěšně přidána.
-
-</DIV>
diff --git a/templates/cs/class-deleted.tmpl b/templates/cs/class-deleted.tmpl
deleted file mode 100644
index e2fb7f8..0000000
--- a/templates/cs/class-deleted.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz třídy {printer_name}</H2>
-
-<P>Třída {printer_name} byla úspěšně vymazána.
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/class-jobs-header.tmpl b/templates/cs/class-jobs-header.tmpl
deleted file mode 100644
index d8142d1..0000000
--- a/templates/cs/class-jobs-header.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Úlohy</H3>
-</DIV>
diff --git a/templates/cs/class-modified.tmpl b/templates/cs/class-modified.tmpl
deleted file mode 100644
index 131fd08..0000000
--- a/templates/cs/class-modified.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava třídy {printer_name}</H2>
-
-<P>Třída <A HREF="/classes/{printer_name}">{printer_name}</A> byla úspěšně upravena.
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/class.tmpl b/templates/cs/class.tmpl
deleted file mode 100644
index 39f72bf..0000000
--- a/templates/cs/class.tmpl
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Äeká:{printer_state=4?tiskne:pauza}},
-{printer_is_accepting_jobs=0?ne:}přijímá úlohy,
-{server_is_sharing_printers=0?není:{printer_is_shared=0?není:}} sdílení{default_name={printer_name}?, výchozí server:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Údržba</OPTION>
-<OPTION VALUE="print-test-page">Tisk zkušební stránky</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">Obnovení třídy</OPTION>:<OPTION VALUE="stop-class">Pozastavení třídy</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Příjem úloh</OPTION>:<OPTION VALUE="reject-jobs">Odmítnutí úloh</OPTION>}
-<OPTION VALUE="move-jobs">Přesun všech úloh</OPTION>
-<OPTION VALUE="purge-jobs">Výmaz všech úloh</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administrace</OPTION>
-<OPTION VALUE="modify-class">Úprava třídy</OPTION>
-<OPTION VALUE="delete-class">Výmaz třídy</OPTION>
-<OPTION VALUE="set-class-options">Nastavení parametrů</OPTION>
-<OPTION VALUE="set-as-default">Nastavení jako výchozí na serveru</OPTION>
-<OPTION VALUE="set-allowed-users">Nastavení přístupu uživatelů</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Popis:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Umístění:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Členové:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Nastavení:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:unknown}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/cs/classes-header.tmpl b/templates/cs/classes-header.tmpl
deleted file mode 100644
index 5bfeeee..0000000
--- a/templates/cs/classes-header.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Žádné třídy:Zobrazení {#printer_name} z {total} tříd{total=1?y:}}.</P>
diff --git a/templates/cs/classes.tmpl b/templates/cs/classes.tmpl
deleted file mode 100644
index 02d32a6..0000000
--- a/templates/cs/classes.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Class List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Název fromty <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Název fronty <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Popis</TH><TH>Umístění</TH><TH>Členové</TH><TH>Stav</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A
-HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Žádný:{member_uris}}</TD><TD>{printer_state=3?Čeká:{printer_state=4?Tiskne:Pauza}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/cs/command.tmpl b/templates/cs/command.tmpl
deleted file mode 100644
index b2a4fd4..0000000
--- a/templates/cs/command.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{title} u {printer_name}</H2>
-
-<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Stav úlohy
-{job_state=3?Äeká:{job_state=4?pozastaveno:
-{job_state=5?zpracováváno:{job_state=6?zastaveno:
-{job_state=7?zruÅ¡eno:{job_state=8?zruÅ¡eno:dokonÄeno}}}}}}{job_state=9?:{job_printer_state_message?,
-<EM>"{job_printer_state_message}"</EM>:}}.</P>
-
-</DIV>
diff --git a/templates/cs/error-op.tmpl b/templates/cs/error-op.tmpl
deleted file mode 100644
index 636edc2..0000000
--- a/templates/cs/error-op.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Chyba {?title} u {?printer_name}</H2>
-
-<P>Chyba:</P>
-
-<BLOCKQUOTE>Neznámá operace "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/cs/error.tmpl b/templates/cs/error.tmpl
deleted file mode 100644
index 7ee1926..0000000
--- a/templates/cs/error.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Chyba {?title} u {?printer_name}</H2>
-
-<P>{?message?{message}:Chyba}:</P>
-
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/cs/header.tmpl.in b/templates/cs/header.tmpl.in
deleted file mode 100644
index 739e51d..0000000
--- a/templates/cs/header.tmpl.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//CZ" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Hlavní strana&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administrace&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Třídy tiskáren&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Nápověda&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Úlohy&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Tiskárny&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Hledat"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
diff --git a/templates/cs/help-header.tmpl b/templates/cs/help-header.tmpl
deleted file mode 100644
index fe8dca8..0000000
--- a/templates/cs/help-header.tmpl
+++ /dev/null
@@ -1,48 +0,0 @@
-<DIV CLASS="indent">
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
-{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
-
-<P ALIGN="CENTER"><B>Hledat v{HELPTITLE? {HELPTITLE}:{TOPIC? {TOPIC}:e všech dokumentech}}:</B> <INPUT
-TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
-AUTOSAVE="org.cups.help" RESULTS="20">
-<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Hledat">
-<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Smazat"></P>
-
-</FORM>
-
-<!-- Bookmarks -->
-<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Contents">
-<TR><TD>
-
-<H3 CLASS="title">Dokumenty nápovědy</H3>
-
-<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">VÅ¡echny dokumenty</A></P>
-<HR>
-
-{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
-}
-</TD></TR>
-</TABLE></DIV>
-
-{QUERY?<P>Výsledky hledání v{HELPFILE? {HELPTITLE}:{TOPIC? {TOPIC}:e všech dokumentech}}\:</P>
-{QTEXT?<UL>
-{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (v <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
-{QTEXT?</UL>:}
-:<P>Nebyl nalezen záznam.</P>}
-<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Zobrazit verzi pro tisk"></FORM>:
-
-<H1>Nápověda</H1>
-
-<P>Toto je rozhraní nápovědy CUPS. Zadejte hledané slovo nebo klikněte na
-některý z odkazů dokumentace k zobrazení nápovědy.</P>
-
-<P>Pokud jste nový uživatel programu CUPS, pÅ™eÄtÄ›te si stránku "<a
-href="/help/overview.html">Popis programu CUPS</a>". Zkušení uživatelé by
-si mÄ›li pÅ™eÄíst stránku "<a href="/help/whatsnew.html">Co je nového v CUPS 1.6</a>".</P>
-
-<P><A HREF="http://www.cups.org/">Hlavní strana programu CUPS</A> také
-poskytuje mnoho zdrojů, vÄetnÄ› uživatelského diskuzního fóra, odpovÄ›dí
-na Äasto kladené otázky a formuláře pro odesílání zpráv o chybách a
-požadavky na nové funkce.</P>}
diff --git a/templates/cs/help-printable.tmpl b/templates/cs/help-printable.tmpl
deleted file mode 100644
index 763a98b..0000000
--- a/templates/cs/help-printable.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//CS" "http://www.w3.org/TR/html4/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="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
diff --git a/templates/cs/help-trailer.tmpl b/templates/cs/help-trailer.tmpl
deleted file mode 100644
index 4c1ebed..0000000
--- a/templates/cs/help-trailer.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/cs/job-cancel.tmpl b/templates/cs/job-cancel.tmpl
deleted file mode 100644
index 31f50ea..0000000
--- a/templates/cs/job-cancel.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Zrušit úlohu {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla zrušena.
-
-</DIV>
diff --git a/templates/cs/job-hold.tmpl b/templates/cs/job-hold.tmpl
deleted file mode 100644
index f0e7b63..0000000
--- a/templates/cs/job-hold.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pozastavení úlohy {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla pozastavena.
-
-</DIV>
diff --git a/templates/cs/job-moved.tmpl b/templates/cs/job-moved.tmpl
deleted file mode 100644
index 40e5eef..0000000
--- a/templates/cs/job-moved.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{job_id?Přesun úlohy {job_id}:Přesun všech úloh}</H2>
-
-<P>{job_id?<A HREF="/jobs/{job_id}">Úloha přesunuta {job_id}</A>:Všechny úlohy přesunuty} na tiskárnu
-<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/cs/job-release.tmpl b/templates/cs/job-release.tmpl
deleted file mode 100644
index 199c798..0000000
--- a/templates/cs/job-release.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Uvolnit úlohu {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla uvolněna k tisku.
-
-</DIV>
diff --git a/templates/cs/job-restart.tmpl b/templates/cs/job-restart.tmpl
deleted file mode 100644
index 56c113a..0000000
--- a/templates/cs/job-restart.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Opakovaný tisk úlohy {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla znovu spuštěna.
-
-</DIV>
diff --git a/templates/cs/jobs-header.tmpl b/templates/cs/jobs-header.tmpl
deleted file mode 100644
index 591d4ce..0000000
--- a/templates/cs/jobs-header.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aktivní úlohy"></FORM>}
-{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="DokonÄené úlohy"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Všechny úlohy"></FORM>}</DIV>
-
-<P ALIGN="CENTER">{total=0?Žádné úlohy:Zobrazení {#job_id} z {total} {?which_jobs=?aktivních:{which_jobs=all?:dokonÄených}} {total=1?úloha:úloh}}.</P>
diff --git a/templates/cs/jobs.tmpl b/templates/cs/jobs.tmpl
deleted file mode 100644
index 75b483a..0000000
--- a/templates/cs/jobs.tmpl
+++ /dev/null
@@ -1,37 +0,0 @@
-{#job_id=0?:
-<TABLE CLASS="list" SUMMARY="Job List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Jméno</TH><TH>Uživatel</TH><TH>Velikost</TH><TH>PoÄet stran</TH><TH>Stav</TH><TH>Řízení</TH></TR>
-</THEAD>
-<TBODY>
-{[job_id]
-<TR VALIGN="TOP">
-<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}{?phone? ({phone}):}&nbsp;</TD>
-<TD>{?job_name=?Neznámý:{job_name}}&nbsp;</TD>
-<TD>{?job_originating_user_name=?Neznámý:{job_originating_user_name}}&nbsp;</TD>
-<TD>{job_k_octets} k&nbsp;</TD>
-<TD>{job_media_sheets_completed=0?Neznámý:{?job_media_sheets_completed}}&nbsp;</TD>
-<TD>{job_state=3?Čeká od<BR>{time_at_creation}:{job_state=4?Pozastaveno od<BR>{time_at_creation}:
-{job_state=5?Zpracováváno od<BR>{time_at_processing}:{job_state=6?Zastaveno:
-{job_state=7?ZruÅ¡eno v<BR>{time_at_completed}:{job_state=8?ZruÅ¡eno:DokonÄeno v<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
-<EM>"{job_printer_state_message}"</EM>:}</TD>
-<TD>
-{job_preserved>0?{job_state>5?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}"><INPUT TYPE="SUBMIT"
-VALUE="Opakovat tisk"></FORM>:}:}
-{job_state=4?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Uvolnit"></FORM>:}
-{job_state=3?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Pozastavit"></FORM>:}
-{job_state<7?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Zrušit"></FORM>
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Přesunout"></FORM>:}
-&nbsp;</TD>
-</TR>
-}
-</TBODY>
-</TABLE>
-}
diff --git a/templates/cs/list-available-printers.tmpl b/templates/cs/list-available-printers.tmpl
deleted file mode 100644
index 8c01b27..0000000
--- a/templates/cs/list-available-printers.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Dostupné tiskárny</H2>
-
-{#device_uri=0?<P>Žádné tiskárny nenalezeny.</P>
-:<UL>{[device_uri]
-<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE=""><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Přidat tiskárnu"></FORM>
-{device_make_and_model} ({device_info})</LI>
-}</UL>}
-
-</DIV>
diff --git a/templates/cs/norestart.tmpl b/templates/cs/norestart.tmpl
deleted file mode 100644
index 4f09e8b..0000000
--- a/templates/cs/norestart.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Změna nastavení</H2>
-
-<P>Server nebyl dosud restartován, protože nebyly provedeny žádné změny v
-konfiguraci ...</P>
-
-</DIV>
diff --git a/templates/cs/option-boolean.tmpl b/templates/cs/option-boolean.tmpl
deleted file mode 100644
index e832ee1..0000000
--- a/templates/cs/option-boolean.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD>
-{[choices]<INPUT TYPE="RADIO" NAME="{keyword-1}" {choices={defchoice-1}?CHECKED:} VALUE="{choices}">{text}}
-</TD>
-</TR>
diff --git a/templates/cs/option-conflict.tmpl b/templates/cs/option-conflict.tmpl
deleted file mode 100644
index 8c68326..0000000
--- a/templates/cs/option-conflict.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<P><B>Chyba:</B> Následující parametry jsou v rozporu:</P>
-
-<UL>
-{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
-}</UL>
-
-<P>Prosím změňte jeden nebo více parametrů pro vyřešení problému.</P>
diff --git a/templates/cs/option-header.tmpl b/templates/cs/option-header.tmpl
deleted file mode 100644
index 464726a..0000000
--- a/templates/cs/option-header.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="tab" ID="{group_id}">
-
-<H3 ALIGN="CENTER">{group}</H3>
-
-<TABLE WIDTH="100%">
diff --git a/templates/cs/option-pickmany.tmpl b/templates/cs/option-pickmany.tmpl
deleted file mode 100644
index 0da75e5..0000000
--- a/templates/cs/option-pickmany.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT></TD>
-</TR>
diff --git a/templates/cs/option-trailer.tmpl b/templates/cs/option-trailer.tmpl
deleted file mode 100644
index 916de2f..0000000
--- a/templates/cs/option-trailer.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-</TABLE>
-
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Nastavit parametry"></P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/pager.tmpl b/templates/cs/pager.tmpl
deleted file mode 100644
index 35a7a92..0000000
--- a/templates/cs/pager.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<TABLE CLASS="inset" SUMMARY="Paging Bar">
-<TR>
- <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Předchozí"></FORM>:&nbsp;}</TD>
- <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Další &#x25b6;"></FORM>:&nbsp;}</TD>
-</TR>
-</TABLE>
diff --git a/templates/cs/printer-accept.tmpl b/templates/cs/printer-accept.tmpl
deleted file mode 100644
index c81faef..0000000
--- a/templates/cs/printer-accept.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Příjem úloh u {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-nyní přijímá úlohy.</P>
-
-</DIV>
diff --git a/templates/cs/printer-added.tmpl b/templates/cs/printer-added.tmpl
deleted file mode 100644
index ac59405..0000000
--- a/templates/cs/printer-added.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat tiskárnu</H2>
-
-<P>Tiskárna <A HREF="/printers/{printer_name}">{printer_name}</A> byla úspěšně přidána.
-
-</DIV>
diff --git a/templates/cs/printer-configured.tmpl b/templates/cs/printer-configured.tmpl
deleted file mode 100644
index c002232..0000000
--- a/templates/cs/printer-configured.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Nastavení parametrů u {printer_name}</H2>
-
-<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:Tiskárna <A HREF="/printers/{printer_name}">}{printer_name}</A>
-byla úspěšně nastavena.
-
-</DIV>
diff --git a/templates/cs/printer-confirm.tmpl b/templates/cs/printer-confirm.tmpl
deleted file mode 100644
index 5ace8a6..0000000
--- a/templates/cs/printer-confirm.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz tiskárny {printer_name}</H2>
-
-<P><B>Varování:</B> Opravdu chcete vymazat tiskárnu
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Vymazat tiskárnu"></FORM></P>
-
-</DIV>
diff --git a/templates/cs/printer-default.tmpl b/templates/cs/printer-default.tmpl
deleted file mode 100644
index d066cc0..0000000
--- a/templates/cs/printer-default.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Nastavení {is_class?třídy:tiskárny} {printer_name} jako výchozí</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byla nastavena jako výchozí na serveru.</P>
-
-<BLOCKQUOTE><B>Pozn.</B> libovolný uživatel může pomocí příkazu <TT>lpoptions</TT> přepsat toto nastavení.</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/cs/printer-deleted.tmpl b/templates/cs/printer-deleted.tmpl
deleted file mode 100644
index 76c8b22..0000000
--- a/templates/cs/printer-deleted.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz tiskárny {printer_name}</H2>
-
-<P>Tiskárna {printer_name} byla úspěšně vymazána.
-
-</DIV>
diff --git a/templates/cs/printer-jobs-header.tmpl b/templates/cs/printer-jobs-header.tmpl
deleted file mode 100644
index d8142d1..0000000
--- a/templates/cs/printer-jobs-header.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Úlohy</H3>
-</DIV>
diff --git a/templates/cs/printer-modified.tmpl b/templates/cs/printer-modified.tmpl
deleted file mode 100644
index 3dd91d2..0000000
--- a/templates/cs/printer-modified.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava tiskárny {printer_name}</H2>
-
-<P>Tiskárna <A HREF="/printers/{printer_name}">{printer_name}</A> byla
-úspěšně upravena.
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/printer-purge.tmpl b/templates/cs/printer-purge.tmpl
deleted file mode 100644
index b85195f..0000000
--- a/templates/cs/printer-purge.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz úloh u {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>U {is_class?třídy:tiskárny} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byly vymazány všechny úlohy.</P>
-
-</DIV>
-
diff --git a/templates/cs/printer-reject.tmpl b/templates/cs/printer-reject.tmpl
deleted file mode 100644
index 6ce184b..0000000
--- a/templates/cs/printer-reject.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Odmítnutí úloh u {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-už nepřijímá úlohy.</P>
-
-</DIV>
diff --git a/templates/cs/printer-start.tmpl b/templates/cs/printer-start.tmpl
deleted file mode 100644
index cc9f3eb..0000000
--- a/templates/cs/printer-start.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Obnovení {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byla obnovena.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/printer-stop.tmpl b/templates/cs/printer-stop.tmpl
deleted file mode 100644
index cfecaa0..0000000
--- a/templates/cs/printer-stop.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pozastavení {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byla pozastavena.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/printer.tmpl b/templates/cs/printer.tmpl
deleted file mode 100644
index 3cddce2..0000000
--- a/templates/cs/printer.tmpl
+++ /dev/null
@@ -1,48 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Äeká:{printer_state=4?tiskne:pauza}},
-{printer_is_accepting_jobs=0?ne:}přijímá úlohy,
-{server_is_sharing_printers=0?není:{printer_is_shared=0?není:}} sdílení{default_name={printer_name}?, výchozí server:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Údržba</OPTION>
-<OPTION VALUE="print-test-page">Tisk zkušební stránky</OPTION>
-{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">VyÄiÅ¡tÄ›ní tiskových hlav</OPTION>:}
-{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Tisk self-test stránky</OPTION>:}
-{printer_state=5?<OPTION VALUE="start-printer">Obnovení tiskárny</OPTION>:<OPTION VALUE="stop-printer">Pozastavení tiskárny</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Příjem úloh</OPTION>:<OPTION VALUE="reject-jobs">Odmítnutí úloh</OPTION>}
-<OPTION VALUE="move-jobs">Přesun všech úloh</OPTION>
-<OPTION VALUE="purge-jobs">Výmaz všech úloh</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administrace</OPTION>
-<OPTION VALUE="modify-printer">Úprava tiskárny</OPTION>
-<OPTION VALUE="delete-printer">Výmaz tiskárny</OPTION>
-<OPTION VALUE="set-printer-options">Nastavení parametrů</OPTION>
-<OPTION VALUE="set-as-default">Nastavení jako výchozí na serveru</OPTION>
-<OPTION VALUE="set-allowed-users">Nastavení přístupu uživatelů</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Popis:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Umístění:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Výrobce a model:</TH><TD>{printer_make_and_model}
-({color_supported=1?barevná:Äernobílá}{sides_supported?, oboustranný tisk:})<BR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Připojení:</TH><TD>{device_uri}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Nastavení:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:unknown}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV> \ No newline at end of file
diff --git a/templates/cs/printers-header.tmpl b/templates/cs/printers-header.tmpl
deleted file mode 100644
index 4755aff..0000000
--- a/templates/cs/printers-header.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Žádné tiskárny:Zobrazení {#printer_name} z {total} tiskár{total=1?ny:en}}.</P>
diff --git a/templates/cs/printers.tmpl b/templates/cs/printers.tmpl
deleted file mode 100644
index 3861ac3..0000000
--- a/templates/cs/printers.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Printers List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Název fronty <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Název fronty <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Popis</TH><TH>Umístění</TH><TH>Výrobce a model</TH><TH>Stav</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Čeká:{printer_state=4?Tiskne:Pauza}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/cs/restart.tmpl b/templates/cs/restart.tmpl
deleted file mode 100644
index 1c68b05..0000000
--- a/templates/cs/restart.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Změna nastavení</H2>
-
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Prosím Äekejte, probíhá restart serveru ...</P>
-
-</DIV>
diff --git a/templates/cs/samba-export.tmpl b/templates/cs/samba-export.tmpl
deleted file mode 100644
index afc0bea..0000000
--- a/templates/cs/samba-export.tmpl
+++ /dev/null
@@ -1,55 +0,0 @@
-<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="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
-
-<H2 CLASS="title">Export tiskáren do Samby</H2>
-
-{error?<P>Nelze exportovat tiskárny do Samby\:</P>
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-<P>Nahlédnout do <A HREF="/admin/log/error_log"
-TARGET="_blank">error_log</A> souboru pro více informací.</P>:
-
-<P>Tato stránka umožňuje export tiskáren do Samby, aby k nim klienti
-systému Windows mohli pÅ™istupovat pomocí ikon <VAR>Okolní poÄítaÄe</VAR>
-nebo <VAR>Místa v síti</VAR> na své pracovní ploše. Musíte předem
-nainstalovat ovladaÄe OS Windows pro postScriptové tiskárny, jak je popsáno v
- <A HREF="/help/man-cupsaddsmb.html" TARGET="_blank">cupsaddsmb(8)</A>
-manuálové stránky.</P>}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Tiskárny:</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 všech tiskáren
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Uživatel Samby:</TH>
-<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (povinný údaj)</TD>
-</TR>
-<TR>
-<TH CLASS="label">Heslo uživatele:</TH>
-<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (povinný údaj)</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Export tiskáren"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/cs/samba-exported.tmpl b/templates/cs/samba-exported.tmpl
deleted file mode 100644
index 121fe48..0000000
--- a/templates/cs/samba-exported.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P>Export tiskáren do Samby byl úspěšně proveden.</P>
diff --git a/templates/cs/search.tmpl b/templates/cs/search.tmpl
deleted file mode 100644
index cad77ca..0000000
--- a/templates/cs/search.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<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>Hledat v
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?třídách:{SECTION=jobs?úlohách:tiskárnách}}}:</B>
-<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
-TYPE="SUBMIT" VALUE="Hledat"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Smazat"></P>
-
-</FORM>
diff --git a/templates/cs/set-printer-options-trailer.tmpl b/templates/cs/set-printer-options-trailer.tmpl
deleted file mode 100644
index 11adc70..0000000
--- a/templates/cs/set-printer-options-trailer.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-</DIV>
-
-<SCRIPT TYPE="text/javascript"><!--
-// Hide custom options parameters for browsers that understand Javascript
-var paramtables = document.getElementsByName("paramtable");
-for (var i = 0; i < paramtables.length; i++)
-{
- var opt = paramtables[i].id.substr(0, paramtables[i].id.lastIndexOf("-"));
- var cb = document.getElementById("select-" + opt);
- if (cb.value != "Custom")
- paramtables[i].style.display = "none";
-}
---></SCRIPT>
-</FORM>
-
-</DIV>
diff --git a/templates/cs/subscription-added.tmpl b/templates/cs/subscription-added.tmpl
deleted file mode 100644
index 926d796..0000000
--- a/templates/cs/subscription-added.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>Předplatné {subscription_name} bylo úspěšně přidáno.</P>
-
-</DIV>
diff --git a/templates/cs/subscription-canceled.tmpl b/templates/cs/subscription-canceled.tmpl
deleted file mode 100644
index 0e25268..0000000
--- a/templates/cs/subscription-canceled.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>Předplatné #{notify_subscription_id} bylo zrušeno.</P>
-
-</DIV>
diff --git a/templates/cs/test-page.tmpl b/templates/cs/test-page.tmpl
deleted file mode 100644
index d1a1d9d..0000000
--- a/templates/cs/test-page.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Tisk zkušební stránky na {printer_name}</H2>
-
-<P>Zkušební stránka odeslána; ID úlohy je <A HREF="/{SECTION}/{printer_name}">
-{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/cs/trailer.tmpl b/templates/cs/trailer.tmpl
deleted file mode 100644
index 44f358b..0000000
--- a/templates/cs/trailer.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS a logo CUPS jsou ochranné známky spoleÄnosti
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS je chráněn autorskými
-právy 2007-2013 Apple Inc. Všechna práva vyhrazena.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/templates/cs/users.tmpl b/templates/cs/users.tmpl
deleted file mode 100644
index ff39cc3..0000000
--- a/templates/cs/users.tmpl
+++ /dev/null
@@ -1,30 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<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">Nastavení přístupu uživatelů u {printer_name}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Uživatelé:</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:}>Povolit uživatelům tisknout
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Zakázat uživatelům tisknout
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>
-<INPUT TYPE="SUBMIT" VALUE="Nastavení přístupů">
-</TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/cs/add-class.tmpl b/templates/de/add-class.tmpl
index 06bb9ad..4b1fb3e 100644
--- a/templates/cs/add-class.tmpl
+++ b/templates/de/add-class.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat třídu</H2>
+<H2 CLASS="title">Klasse hinzufügen</H2>
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -8,22 +6,22 @@
<TABLE>
<TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Může obsahovat libovolné tisknutelné znaky kromě "/", "#" a mezery)</SMALL></TD>
+<SMALL>(Darf alle druckbaren Zeichen ausser "/", "#", und Leerzeichen enthalten)</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis)</SMALL></TD>
+<SMALL>(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis umístění)</SMALL></TD>
+<SMALL>(Für Menschen lesbarer Ort wie "Lab 1")</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Älenové:</TH>
+<TH CLASS="label">Mitglieder:</TH>
<TD>
<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
@@ -32,9 +30,8 @@
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Přidat třídu"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Klasse hinzufügen"></TD>
</TR>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/cs/add-printer.tmpl b/templates/de/add-printer.tmpl
index 1e557d2..8cc2b17 100644
--- a/templates/cs/add-printer.tmpl
+++ b/templates/de/add-printer.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat tiskárnu</H2>
+<H2 CLASS="title">Drucker hinzufügen (Schritt 3/5)</H2>
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -14,34 +12,33 @@
<TABLE>
<TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
-<SMALL>(Může obsahovat libovolné tisknutelné znaky kromě "/", "#" a mezery)</SMALL></TD>
+<SMALL>(Darf druckbare Zeichen enthalten ausser "/", "#", und Leerzeichen)</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>(Srozumitelný popis)</SMALL></TD>
+<SMALL>(Menschenlesbare Beschreibung wie etwa "HP LaserJet mit Duplexer")</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>(Srozumitelný popis umístění)</SMALL></TD>
+<SMALL>(Menschenlesbarer Ort wie etwa "Labor 1")</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Verbindung:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
</TR>
<TR>
-<TH CLASS="label">Sdílení:</TH>
+<TH CLASS="label">Freigabe:</TH>
<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-sdílet tuto tiskárnu</TD>
+Gebe diesen Drucker frei</TD>
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="PokraÄovat"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
</TR>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/cs/add-rss-subscription.tmpl b/templates/de/add-rss-subscription.tmpl
index d1568f7..4097e33 100644
--- a/templates/cs/add-rss-subscription.tmpl
+++ b/templates/de/add-rss-subscription.tmpl
@@ -2,42 +2,42 @@
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
-<H2 CLASS="title">Přidat RSS předplatné</H2>
+<H2 CLASS="title">RSS Subskription hinzufügen</H2>
-<TABLE SUMMARY="Add RSS Subscription form">
+<TABLE SUMMARY="Forumlar zum Hinzufügen einer RSS Subskription">
<TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
-<SMALL>(Může obsahovat libovolné tisknutelné znaky s výjimkou mezery, "/", "?" a "#")</SMALL></TD>
+<SMALL>(Darf alle druckbaren Zeichen ausser Leerzeichen, "/", "?", und "#" enthalten)</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Fronta:</TH>
-<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>VÅ¡echny fronty</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
+<TH CLASS="label">Warteschlange:</TH>
+<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Alle Warteschlangen</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
</TR>
<TR VALIGN="TOP">
-<TH CLASS="label">Události:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Vytvoření úlohy<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>DokonÄení úlohy<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Zastavení úlohy<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Změna parametrů úlohy</TD>
+<TH CLASS="label">Ereignisse:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Auftrag erstellt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Auftrag abgeschlossen<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Auftrag angehalten<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Auftrags Parameter Geändert</TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Zastavení fronty<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Přidání fronty<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Změna fronty<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Vymazání fronty</TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Warteschlange angehalten<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Warteschlange hinzugefügt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Warteschlange geändert<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Warteschlange gelöscht</TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Start serveru<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Zastavení serveru<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Restart serveru<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Audit bezpeÄnosti serveru</TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Server gestartet<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Server angehalten<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Server neu gestartet<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Server Sicherheits Prüfung</TD>
</TR>
<TR>
-<TH CLASS="label">Maximální poÄet zobrazených událostí:</TH>
+<TH CLASS="label">Maximale Ereignisse in Durchführung:</TH>
<TD COLSPAN="5"><INPUT TYPE="NUMBER" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
</TR>
<TR>
<TD></TD>
-<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="Přidat RSS předplatné"></TD>
+<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription hinzufügen"></TD>
</TR>
</TABLE>
diff --git a/templates/de/admin.tmpl b/templates/de/admin.tmpl
new file mode 100644
index 0000000..965d072
--- /dev/null
+++ b/templates/de/admin.tmpl
@@ -0,0 +1,97 @@
+<div class="row">
+ <div class="halves">
+ <H2 CLASS="title">Drucker</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Füge Drucker hinzu"></FORM>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Finde neue Drucker"></FORM>
+ <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Drucker"></FORM>
+ {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exportiere Drucker nach Samba"></FORM>:}
+ </P>
+
+ <H2 CLASS="title">Klassen</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Klasse hinzufügen"></FORM>
+ <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Klasse managen"></FORM>
+ </P>
+
+ <H2 CLASS="title">Aufträge</H2>
+
+ <P>
+ <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aufträge managen"></FORM>
+ </P>
+ </div>
+ <div class="halves">
+ <H2 CLASS="title">Server</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Konfigurationsdatei bearbeiten"></FORM>
+ <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Zugriffs-Log zeigen"></FORM>
+ <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Fehler-Log zeigen"></FORM>
+ <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Seiten-Log zeigen"></FORM>
+ </P>
+
+ {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+ <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+ <FORM METHOD="POST" ACTION="/admin">
+ <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+ {ADVANCEDSETTINGS?<P><B>Server-Einstellungen\:</B></P>
+
+ <P><A HREF="/admin/">Erweitert <SMALL>&#x25bc;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Drucker dieses Systems im Netz freigeben<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max clients\:
+ <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Erlaube Druck aus dem Internet<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Mache die Web-Schnittstelle bekannt<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Erlaube Fernwartung<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Benutze Kerberos-Authentifizierung (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Erlaube Benutzern beliebige Aufträge abzubrechen (nicht nur die Eigenen)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Behalte die Auftragshistorie<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximale Auftragsanzehl (0 für unbegrenzt)\:
+ <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Behalte Metadaten\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Behalte Dokumente\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximale logDateigrösse\:
+ <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+ :<P><B>Server Einstellungen:</B></P>
+
+ <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Erweitert <SMALL>&#x25b6;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Drucker dieses Systems im Netz freigeben<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Erlaube den Druck aus dem Internet<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Erlaube Fernwartung<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Benutze Kerberos Authentifizierung (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Erlaube Benutzern alle Aufträge zu löschen (nicht nur die eigenen)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Speichere debugging Information zur Fehlersuche</P>
+
+ }
+ <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Ändere Eintellungen"></P>
+
+ </FORM>}
+ </div>
+</div>
+
+<div class="row">
+ <H2 CLASS="title">RSS Subskriptionen</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription hinzufügen"></FORM>
+ </P>
+
+ {notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subskriptionen">
+ <THEAD><TR><TH>Name</TH><TH>Ereignisse</TH><TH>Queue Name</TH></TR></THEAD>
+ <TBODY>{[notify_subscription_id]
+ <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription kündigen"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
+ </TBODY>
+ </TABLE>:}
+</div> \ No newline at end of file
diff --git a/templates/ca/choose-device.tmpl b/templates/de/choose-device.tmpl
index a28cc92..4aaf8ea 100644
--- a/templates/ca/choose-device.tmpl
+++ b/templates/de/choose-device.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 1/5)}</H2>
{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -9,31 +7,31 @@
<TABLE>
{op=add-printer?:<TR>
-<TH CLASS="label">Connexi&oacute; actual\:</TH>
+<TH CLASS="label">Aktuelle Verbindung\:</TH>
<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
{current_device_uri}</TD>
</TR>}
<TR>
-<TH CLASS="label">Impressores locals\:</TH>
+<TH CLASS="label">Lokale Drucker\:</TH>
<TD>
{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
:}}
</TD>
</TR>
<TR>
-<TH CLASS="label">Impressores de xarxa descobertes\:</TH>
+<TH CLASS="label">Entdeckte Netzwerkdrucker\:</TH>
<TD>
{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
:}:}}
</TD>
</TR>
<TR>
<TR>
-<TH CLASS="label">Altres impressores de xarxa\:</TH>
+<TH CLASS="label">Andere Netzwerkdrucker\:</TH>
<TD>
{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
@@ -43,11 +41,9 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
</TR>
</TABLE>
</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Buscant impressores...</P>}
-
-</DIV>
+ALT="Busy Indicator"> Suche nach Druckern...</P>}
diff --git a/templates/ca/choose-make.tmpl b/templates/de/choose-make.tmpl
index 01bc654..194453c 100644
--- a/templates/ca/choose-make.tmpl
+++ b/templates/de/choose-make.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt4/5)}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -13,28 +11,28 @@
<TABLE>
{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
+<TH CLASS="label">Name:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
</TR>}
<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
+<TH CLASS="label">Beschreibung:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
</TR>
<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
+<TH CLASS="label">Ort:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
</TR>
<TR>
-<TH CLASS="label">Connecci&oacute;:</TH>
+<TH CLASS="label">Verbindung:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
</TR>
<TR>
-<TH CLASS="label">Compartida:</TH>
+<TH CLASS="label">Freigabe:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Comparteix aquesta impressora</TD>
+Diesen Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} im Netz freigeben</TD>
</TR>
<TR>
-<TH CLASS="label">Fabricant:</TH>
+<TH CLASS="label">Marke:</TH>
<TD>
<SELECT NAME="PPD_MAKE" SIZE="10">
{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
@@ -43,22 +41,21 @@
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
</TR>
<TR>
<TD></TD>
<TD>&nbsp;</TD>
</TR>
<TR>
-<TH CLASS="label">O indica un fitxer PPD:</TH>
+<TH CLASS="label">Or Provide a PPD File:</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="SUBMIT" VALUE="{op=add-printer?Add Printer:Modifica la impressora}"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Add Printer:Modify Printer}"></TD>
</TR>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/cs/choose-model.tmpl b/templates/de/choose-model.tmpl
index 75fc46f..174b9c6 100644
--- a/templates/cs/choose-model.tmpl
+++ b/templates/de/choose-model.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 5/5)}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -12,49 +10,48 @@
<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
<TABLE>
{op=modify-printer?:<TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
</TR>}
<TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
</TR>
<TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
</TR>
<TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Verbindung:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
</TR>
<TR>
-<TH CLASS="label">Sdílení:</TH>
+<TH CLASS="label">Freigabe:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?ne:{?printer_is_shared=0?ne:}}sdílená</TD>
+Dieser Drucker ist {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} im Netz freigeben</TD>
</TR>
<TR>
-<TH CLASS="label">Výrobce:</TH>
-<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Vybrat jiného výrobce"></TD>
+<TH CLASS="label">Hersteller:</TH>
+<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Anderen Hersteller/Marke wählen"></TD>
</TR>
<TR>
-<TH CLASS="label">Model:</TH>
+<TH CLASS="label">Modell:</TH>
<TD>
<SELECT NAME="PPD_NAME" SIZE="10">
-{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Aktuální: {current_make_and_model}</OPTION>:}
+{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Aktueller Treiber - {current_make_and_model}</OPTION>:}
{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
}</SELECT>
</TD>
</TR>
<TR>
-<TH CLASS="label">Nebo vybrat soubor PPD:</TH>
+<TH CLASS="label">Oder stelle eine PPD Datei zur Verfügung:</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="SUBMIT" VALUE="{op=add-printer?Přidat tiskárnu:Upravit tiskárnu}"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Drucker hinzufügen:Drucker ändern}"></TD>
</TR>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/de/choose-serial.tmpl b/templates/de/choose-serial.tmpl
new file mode 100644
index 0000000..d410884
--- /dev/null
+++ b/templates/de/choose-serial.tmpl
@@ -0,0 +1,49 @@
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Baud Rate:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Parität:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Keine
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Gerade
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Ungerade
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Daten Bits:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Flusskontrolle:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>None
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Software)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Hardware)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Hardware)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/cs/choose-uri.tmpl b/templates/de/choose-uri.tmpl
index ad919b7..bbdc5e4 100644
--- a/templates/cs/choose-uri.tmpl
+++ b/templates/de/choose-uri.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt2/5)}</H2>
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -10,12 +8,12 @@
<TABLE>
<TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Verbindung-URI:</TH>
<TD><INPUT TYPE="URL" SIZE="60" MAXLENGTH="1023" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
</TR>
<TR>
<TD></TD>
-<TD>Příklady:
+<TD>Beispiele:
<PRE>
http://hostname:631/ipp/
http://hostname:631/ipp/port1
@@ -29,16 +27,14 @@
socket://hostname:9100
</PRE>
-<P>Viz. <A HREF="/help/network.html" TARGET="_blank">"Síťové tiskárny"</A> pro zadání správného URI tiskárny.</P>
+<P>See <A HREF="/help/network.html" TARGET="_blank">"Netzwerkdrucker"</A> für die korrekte URI ihres Druckers.</P>
</TD>
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="PokraÄovat"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
</TR>
</TABLE>
</FORM>
-</DIV>
-
diff --git a/templates/de/class-added.tmpl b/templates/de/class-added.tmpl
new file mode 100644
index 0000000..85027e9
--- /dev/null
+++ b/templates/de/class-added.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Klasse hinzufügen</H2>
+
+<P>Die Klasse <A HREF="/classes/{printer_name}">{printer_name}</A> wurde erfolgreich hinzugefügt.
diff --git a/templates/cs/class-confirm.tmpl b/templates/de/class-confirm.tmpl
index 87c1614..0cbdd78 100644
--- a/templates/cs/class-confirm.tmpl
+++ b/templates/de/class-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
+<H2 CLASS="title">Klasse {printer_name} löschen</H2>
-<H2 CLASS="title">Výmaz třídy {printer_name}</H2>
+<P><B>Warnung:</B> Sind sie sicher dass sie die Klasse
+{printer_name} löschen wollen?</P>
-<P><B>Varování:</B> Opravdu chcete vymazat třídu
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Vymazat třídu"></FORM></P>
-
-</DIV>
+<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Klasse löschen"></FORM></P>
diff --git a/templates/de/class-deleted.tmpl b/templates/de/class-deleted.tmpl
new file mode 100644
index 0000000..6d09f98
--- /dev/null
+++ b/templates/de/class-deleted.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Klasse {printer_name} löschen</H2>
+
+<P>Die Klasse {printer_name} wurde erfolgreich gelöscht.
diff --git a/templates/de/class-jobs-header.tmpl b/templates/de/class-jobs-header.tmpl
new file mode 100644
index 0000000..0834c9c
--- /dev/null
+++ b/templates/de/class-jobs-header.tmpl
@@ -0,0 +1 @@
+<H3 CLASS="title">Aufträge</H3>
diff --git a/templates/de/class-modified.tmpl b/templates/de/class-modified.tmpl
new file mode 100644
index 0000000..658defa
--- /dev/null
+++ b/templates/de/class-modified.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Klasse {printer_name} ändern</H2>
+
+<P>Class <A HREF="/classes/{printer_name}">{printer_name}</A> wurde
+erfolgreich geändert.
diff --git a/templates/de/class.tmpl b/templates/de/class.tmpl
new file mode 100644
index 0000000..c0d9a95
--- /dev/null
+++ b/templates/de/class.tmpl
@@ -0,0 +1,41 @@
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}},
+{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert},
+{server_is_sharing_printers=0?Keine (Server):{printer_is_shared=0?Keine:}} Netzfreigabe{default_name={printer_name}?, Standarddrucker:})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Wartung</OPTION>
+<OPTION VALUE="print-test-page">Drucke Testseite</OPTION>
+{printer_state=5?<OPTION VALUE="start-class">Klasse starten</OPTION>:<OPTION VALUE="stop-class">Klasse stoppen</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aufträge akzeptieren</OPTION>:<OPTION VALUE="reject-jobs">Aufträge ablehnen</OPTION>}
+<OPTION VALUE="move-jobs">Alle Aufträge verschieben</OPTION>
+<OPTION VALUE="purge-jobs">Alle Aufträge abbrechen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
+<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
+<OPTION VALUE="">Verwaltung</OPTION>
+<OPTION VALUE="modify-class">Klasse ändern</OPTION>
+<OPTION VALUE="delete-class">Klasse löschen</OPTION>
+<OPTION VALUE="set-class-options">Standardeinstellungen festlegen</OPTION>
+<OPTION VALUE="set-as-default">Als Standard festlegen</OPTION>
+<OPTION VALUE="set-allowed-users">Erlaubte Benutzer festlegen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Beschreibung:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ort:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Mitglieder:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Standardeinstellungen:</TH><TD>job-sheets={job_sheets_default}
+media={media_default?{media_default}:unbekannt}
+{sides_default?sides={sides_default}:}</TD></TR>
+</TABLE>
diff --git a/templates/de/classes-header.tmpl b/templates/de/classes-header.tmpl
new file mode 100644
index 0000000..5fa4d4a
--- /dev/null
+++ b/templates/de/classes-header.tmpl
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Keine Klassen:Zeige {#printer_name} von {total} Klasse{total=1?:n}}.</P>
diff --git a/templates/ca/classes.tmpl b/templates/de/classes.tmpl
index bb5acf5..c04d02b 100644
--- a/templates/ca/classes.tmpl
+++ b/templates/de/classes.tmpl
@@ -1,11 +1,11 @@
{#printer_name=0?:
<TABLE CLASS="list" SUMMARY="Class List">
<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom de la cua <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom de la cua <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Descripci&oacute;</TH><TH>Ubicaci&oacute;</TH><TH>Membres</TH><TH>Estat</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Wartweschlange <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Warteschlange <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Beschreibung</TH><TH>Ort</TH><TH>Mitglieder</TH><TH>Status</TH></TR>
</THEAD>
<TBODY>
{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?None:{member_uris}}</TD><TD>{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Keine:{member_uris}}</TD><TD>{printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
}
</TBODY>
</TABLE></DIV>}
diff --git a/templates/de/command.tmpl b/templates/de/command.tmpl
new file mode 100644
index 0000000..126389b
--- /dev/null
+++ b/templates/de/command.tmpl
@@ -0,0 +1,8 @@
+<H2 CLASS="title">{title} auf {printer_name}</H2>
+
+<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
+ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Drucker Befehlsauftrag
+{job_state=3?unerledigt:{job_state=4?gehalten:
+{job_state=5?verarbeite:{job_state=6?gestoppt:
+{job_state=7?gelöscht:{job_state=8?abgebrochen:beendet}}}}}}{job_state=9?:{job_printer_state_message?,
+<EM>"{job_printer_state_message}"</EM>:}}</P>
diff --git a/templates/cs/edit-config.tmpl b/templates/de/edit-config.tmpl
index ab3bf65..5c289cb 100644
--- a/templates/cs/edit-config.tmpl
+++ b/templates/de/edit-config.tmpl
@@ -5,9 +5,7 @@ function reset_config()
}
</SCRIPT>
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava konfiguraÄního souboru</H2>
+<H2 CLASS="title">Konfigurationsdatei bearbeiten</H2>
<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -15,10 +13,8 @@ function reset_config()
<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
-<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Uložit změny">
-<INPUT TYPE="BUTTON" VALUE="Použít výchozí konfiguraÄní soubor"
+<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Änderungen speichern">
+<INPUT TYPE="BUTTON" VALUE="Standard Konfigurationsdatei verwenden"
onClick="reset_config();"></P>
</FORM>
-
-</DIV>
diff --git a/templates/de/error-op.tmpl b/templates/de/error-op.tmpl
new file mode 100644
index 0000000..698ee97
--- /dev/null
+++ b/templates/de/error-op.tmpl
@@ -0,0 +1,6 @@
+<H2 CLASS="title">{?title} {?printer_name} Error</H2>
+
+<P>Fehler:</P>
+
+<BLOCKQUOTE>Unbekannte Operation "{op}"!</BLOCKQUOTE>
+
diff --git a/templates/ca/error.tmpl b/templates/de/error.tmpl
index f04f03a..42d0f19 100644
--- a/templates/ca/error.tmpl
+++ b/templates/de/error.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} Error</H2>
-<P>{?message?{message}:Error}</P>
+<P>{?message?{message}:Fehler:}</P>
<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/de/header.tmpl.in b/templates/de/header.tmpl.in
new file mode 100644
index 0000000..4974aa6
--- /dev/null
+++ b/templates/de/header.tmpl.in
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <style>html{display:none;}</style>
+ <script type="text/javascript"><!--
+ /* Only display document if we are not in a frame... */
+ if (self == top) {
+ document.documentElement.style.display = 'block';
+ } else {
+ top.location = self.location;
+ }
+
+ /* Show an error if cookies are disabled */
+ function check_cookies() {
+ if (!navigator.cookieEnabled) {
+ document.getElementById('body').innerHTML = 'This page uses cookies to prevent common cross-site attacks. Please enable cookies in your browser.';
+ }
+ }
+ --></SCRIPT>
+ <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body onload="check_cookies();">
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a href="/">Home</a></li>
+ <li><a {SECTION=admin?class="active" :}href="/admin">Verwaltung</a></li>
+ <li><a {SECTION=classes?class="active" :}href="/classes/">Klassen</a></li>
+ <li><a {SECTION=help?class="active" :}href="/help/">Hilfe</a></li>
+ <li><a {SECTION=jobs?class="active" :}href="/jobs/">Aufträge</a></li>
+ <li><a {SECTION=printers?class="active" :}href="/printers/">Drucker</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>{title}</h1>
diff --git a/templates/de/help-header.tmpl b/templates/de/help-header.tmpl
new file mode 100644
index 0000000..45df8de
--- /dev/null
+++ b/templates/de/help-header.tmpl
@@ -0,0 +1,41 @@
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Suche in
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}:</B> <INPUT
+TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
+AUTOSAVE="org.cups.help" RESULTS="20">
+<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Suchen">
+<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Leeren"></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Inhalt">
+<TR><TD>
+
+<H3 CLASS="title">Online Hilfe Dokumente</H3>
+
+<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Alle Dokumente</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</TD></TR>
+</TABLE></DIV>
+
+{QUERY?<P>Suchergebnisse in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Keine Ãœbereinstimmung gefunden.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Druckversion anzeigen"></FORM>:
+
+<H1>CUPS Hilfeseiten</H1>
+
+<P>Dies ist das CUPS online Hilfesystem. Geben Sie Ihren Suchbegriff oben ein oder klicken Sie auf einen der Dokumentationslinks um sich die Online Hilfe Informationen anzeigen zu lassen.</P>
+
+<P>Wenn Sie noch unerfahren im Umgang mit CUPS sind, lesen Sie die "<a href="/help/overview.html">CUPS Ãœbersicht</a>". Erfahrene Benutzer sollten "<a href="/help/whatsnew.html">Was ist neu in CUPS 2.0</a>" lesen.</P>
+
+<P>Die <A HREF="http://www.cups.org/">CUPS Webseite</A> bietet ebenfalls viele Angebote inklusive Diskussionsforen für Benutzer, Antworten auf häufig gestellte Fragen, und ein Formular für Fehlerberichte und Wünsche.</P>}
diff --git a/templates/ca/help-printable.tmpl b/templates/de/help-printable.tmpl
index 2463c16..2463c16 100644
--- a/templates/ca/help-printable.tmpl
+++ b/templates/de/help-printable.tmpl
diff --git a/templates/de/help-trailer.tmpl b/templates/de/help-trailer.tmpl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/templates/de/help-trailer.tmpl
diff --git a/templates/de/job-cancel.tmpl b/templates/de/job-cancel.tmpl
new file mode 100644
index 0000000..63fc385
--- /dev/null
+++ b/templates/de/job-cancel.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} löschen</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde gelöscht.
diff --git a/templates/de/job-hold.tmpl b/templates/de/job-hold.tmpl
new file mode 100644
index 0000000..15d43a4
--- /dev/null
+++ b/templates/de/job-hold.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} anhalten</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde vom Drucken abgehalten.
diff --git a/templates/cs/job-move.tmpl b/templates/de/job-move.tmpl
index b706ca8..ba790ff 100644
--- a/templates/cs/job-move.tmpl
+++ b/templates/de/job-move.tmpl
@@ -1,15 +1,13 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
-<H2 CLASS="title">{job_id?Přesun úlohy {job_id}:Přesun všech úloh}</H2>
+<H2 CLASS="title">{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}</H2>
<TABLE>
<TR>
-<TH CLASS="label">Nová tiskárna:</TH>
+<TH CLASS="label">Neues Ziel:</TH>
<TD>
<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
@@ -18,10 +16,8 @@
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Přesunout {job_id?úlohu:úlohy}"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{job_id?Auftrag verschieben:Aufträge verschieben}"></TD>
</TR>
</TABLE>
</FORM>
-
-</DIV>
diff --git a/templates/de/job-moved.tmpl b/templates/de/job-moved.tmpl
new file mode 100644
index 0000000..795db20
--- /dev/null
+++ b/templates/de/job-moved.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}</H2>
+
+<P>{job_id?<A HREF="/jobs/{job_id}">Auftrag {job_id}</A>:Alle Aufträge} nach
+<A HREF="{job_printer_uri}">{job_printer_name}</A> verschoben.</P>
diff --git a/templates/de/job-release.tmpl b/templates/de/job-release.tmpl
new file mode 100644
index 0000000..5b3c6e4
--- /dev/null
+++ b/templates/de/job-release.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} freigeben</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde zum Drucken freigegeben.
diff --git a/templates/de/job-restart.tmpl b/templates/de/job-restart.tmpl
new file mode 100644
index 0000000..7904376
--- /dev/null
+++ b/templates/de/job-restart.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} neu starten</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde neu gestartet.
diff --git a/templates/de/jobs-header.tmpl b/templates/de/jobs-header.tmpl
new file mode 100644
index 0000000..e3935fe
--- /dev/null
+++ b/templates/de/jobs-header.tmpl
@@ -0,0 +1,5 @@
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aktive Aufträge anzeigen"></FORM>}
+{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Fertige Aufträge anzeigen"></FORM>}
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Alle Aufträge anzeigen"></FORM>}
+
+<P ALIGN="CENTER">{total=0?Keine Aufträge:Zeige {#job_id} von {total} {?which_jobs=?aktiven:{which_jobs=all?:beendeten}} {total=1?:s}Auftrag:Aufträgen}.</P>
diff --git a/templates/ca/jobs.tmpl b/templates/de/jobs.tmpl
index 2ec88e1..d24c3a1 100644
--- a/templates/ca/jobs.tmpl
+++ b/templates/de/jobs.tmpl
@@ -1,33 +1,34 @@
{#job_id=0?:
-<TABLE CLASS="list" SUMMARY="Job List">
+<TABLE CLASS="list" SUMMARY="Auftragsliste">
<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Nom</TH><TH>Usuari</TH><TH>Mida</TH><TH>P&agrave;gines</TH><TH>Estat</TH><TH>Control</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Name</TH><TH>Benutzer</TH><TH>Grösse</TH><TH>Seiten</TH><TH>Status</TH><TH>Steuerung</TH></TR>
</THEAD>
<TBODY>
{[job_id]
<TR VALIGN="TOP">
<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}{?phone? ({phone}):}&nbsp;</TD>
-<TD>{?job_name=?Desconegut:{job_name}}&nbsp;</TD>
-<TD>{?job_originating_user_name=?Withheld:{job_originating_user_name}}&nbsp;</TD>
+<TD>{?job_name=?Unbekannt:{job_name}}&nbsp;</TD>
+<TD>{?job_originating_user_name=?Einbehalten:{job_originating_user_name}}&nbsp;</TD>
<TD>{job_k_octets}k&nbsp;</TD>
-<TD>{job_media_sheets_completed=0?Desconegudes:{?job_media_sheets_completed}}&nbsp;</TD>
-<TD>{job_state=3?pendent des de<BR>{time_at_creation}:{job_state=4?pausada des de<BR>{time_at_creation}:
-{job_state=5?processant des de<BR>{time_at_processing}:{job_state=6?aturada:
-{job_state=7?cancel&middot;lada el<BR>{time_at_completed}:{job_state=8?avortada:completada el<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
+<TD>{job_media_sheets_completed=0?Unbekannt:{?job_media_sheets_completed}}&nbsp;</TD>
+<TD>{job_state=3?unerledigt seit<BR>{time_at_creation}:{job_state=4?angehalten seit<BR>{time_at_creation}:
+{job_state=5?verarbeitet seit<BR>{time_at_processing}:{job_state=6?gestoppt:
+{job_state=7?gelöscht am<BR>{time_at_completed}:{job_state=8?abgebrochen:beendet am<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}"><INPUT TYPE="SUBMIT" VALUE="Torna a imprimir"></FORM>:}:}
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
+<INPUT TYPE="SUBMIT" VALUE="Auftrag neu drucken"></FORM>:}:}
{job_state=4?
<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Allibera"></FORM>:}
+<INPUT TYPE="SUBMIT" VALUE="Auftrag freigeben"></FORM>:}
{job_state=3?
<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Pausa"></FORM>:}
+<INPUT TYPE="SUBMIT" VALUE="Auftrag anhalten"></FORM>:}
{job_state<7?
<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Cancel&middot;la"></FORM>
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Mou"></FORM>:}
+<INPUT TYPE="SUBMIT" VALUE="Auftrag löschen"></FORM>
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Auftrag verschieben"></FORM>:}
&nbsp;</TD>
</TR>
}
diff --git a/templates/ca/list-available-printers.tmpl b/templates/de/list-available-printers.tmpl
index b771b5b..a19bf5b 100644
--- a/templates/ca/list-available-printers.tmpl
+++ b/templates/de/list-available-printers.tmpl
@@ -1,11 +1,7 @@
-<DIV CLASS="indent">
+<H2 CLASS="title">Verfügbare Drucker</H2>
-<H2 CLASS="title">Impressores disponibles</H2>
-
-{#device_uri=0?<P>No s'ha trobat cap impressora.</P>
+{#device_uri=0?<P>Keine Drucker gefunden.</P>
:<UL>{[device_uri]
-<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Afegeix aquesta impressora"></FORM>
+<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Diesen Drucker hinzufügen"></FORM>
{device_make_and_model} ({device_info})</LI>
}</UL>}
-
-</DIV>
diff --git a/templates/cs/modify-class.tmpl b/templates/de/modify-class.tmpl
index 9e4881a..fd0aa9a 100644
--- a/templates/cs/modify-class.tmpl
+++ b/templates/de/modify-class.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava třídy {printer_name}</H2>
+<H2 CLASS="title">Klasse {printer_name} ändern</H2>
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -9,15 +7,15 @@
<TABLE>
<TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
</TR>
<TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
</TR>
<TR>
-<TH CLASS="label">Členové:</TH>
+<TH CLASS="label">Mitglieder:</TH>
<TD>
<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
@@ -26,9 +24,8 @@
</TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Upravit třídu"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Klasse ändern"></TD>
</TR>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/cs/modify-printer.tmpl b/templates/de/modify-printer.tmpl
index 8fc48ed..72b4bc5 100644
--- a/templates/cs/modify-printer.tmpl
+++ b/templates/de/modify-printer.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava tiskárny {printer_name}</H2>
+<H2 CLASS="title">Modify {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -13,30 +11,29 @@
<TABLE>
<TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Description:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis)</SMALL></TD>
+<SMALL>(Human-readable description such as "HP LaserJet with Duplexer")</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">Location:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis umístění)</SMALL></TD>
+<SMALL>(Human-readable location such as "Lab 1")</SMALL></TD>
</TR>
<TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Connection:</TH>
<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
</TR>
<TR>
-<TH CLASS="label">Sdílení:</TH>
+<TH CLASS="label">Sharing:</TH>
<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-sdílet tuto tiskárnu</TD>
+Share This Printer</TD>
</TR>
<TR>
<TR>
<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="PokraÄovat"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Continue"></TD>
</TR>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/de/norestart.tmpl b/templates/de/norestart.tmpl
new file mode 100644
index 0000000..a5f1214
--- /dev/null
+++ b/templates/de/norestart.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Einstellungen ändern</H2>
+
+<P>Der Server wurde nicht neu gestartet, da die Konfiguration nicht geändert wurde...</P>
diff --git a/templates/ca/option-boolean.tmpl b/templates/de/option-boolean.tmpl
index e832ee1..e832ee1 100644
--- a/templates/ca/option-boolean.tmpl
+++ b/templates/de/option-boolean.tmpl
diff --git a/templates/de/option-conflict.tmpl b/templates/de/option-conflict.tmpl
new file mode 100644
index 0000000..e1f2435
--- /dev/null
+++ b/templates/de/option-conflict.tmpl
@@ -0,0 +1,7 @@
+<P><B>Fehler:</B> die folgenden Optionen stehen im Konflikt:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
+}</UL>
+
+<P>Bitte ändern sie eine oder mehrere Einstellungen um die Konflikte zu lösen.</P>
diff --git a/templates/ca/option-header.tmpl b/templates/de/option-header.tmpl
index 464726a..464726a 100644
--- a/templates/ca/option-header.tmpl
+++ b/templates/de/option-header.tmpl
diff --git a/templates/ca/option-pickmany.tmpl b/templates/de/option-pickmany.tmpl
index 0da75e5..0da75e5 100644
--- a/templates/ca/option-pickmany.tmpl
+++ b/templates/de/option-pickmany.tmpl
diff --git a/templates/cs/option-pickone.tmpl b/templates/de/option-pickone.tmpl
index 9c7e2a2..1467b36 100644
--- a/templates/cs/option-pickone.tmpl
+++ b/templates/de/option-pickone.tmpl
@@ -6,12 +6,12 @@
{iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
<TR><TH CLASS="sublabel">{paramtext}:</TH>
<TD>{params=Units?<SELECT NAME="{keyword-1}.{params}">
-<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Body</OPTION>
-<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millimetry</OPTION>
-<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Centimetry</OPTION>
-<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Palce</OPTION>
-<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Stopy</OPTION>
-<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Metry</OPTION>
+<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Punkte</OPTION>
+<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millimeter</OPTION>
+<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Zentimeter</OPTION>
+<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Zoll</OPTION>
+<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Fuss</OPTION>
+<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Meter</OPTION>
</SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword-1}.{params}" VALUE="{paramvalue}">}</TD></TR>
}</TABLE>
</TD>:}
diff --git a/templates/de/option-trailer.tmpl b/templates/de/option-trailer.tmpl
new file mode 100644
index 0000000..7da5573
--- /dev/null
+++ b/templates/de/option-trailer.tmpl
@@ -0,0 +1,5 @@
+</TABLE>
+
+<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Standardeinstellungen festlegen"></P>
+
+</DIV> \ No newline at end of file
diff --git a/templates/ca/pager.tmpl b/templates/de/pager.tmpl
index ab134f1..1164045 100644
--- a/templates/ca/pager.tmpl
+++ b/templates/de/pager.tmpl
@@ -1,6 +1,6 @@
-<TABLE CLASS="inset" SUMMARY="Paging Bar">
+<TABLE CLASS="inset" SUMMARY="Seitenverwaltung">
<TR>
- <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Anterior"></FORM>:&nbsp;}</TD>
- <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Seg&uuml;ent &#x25b6;"></FORM>:&nbsp;}</TD>
+ <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Vorherige anzeigen"></FORM>:&nbsp;}</TD>
+ <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Nächste anzeigen &#x25b6;"></FORM>:&nbsp;}</TD>
</TR>
</TABLE>
diff --git a/templates/de/printer-accept.tmpl b/templates/de/printer-accept.tmpl
new file mode 100644
index 0000000..4babd47
--- /dev/null
+++ b/templates/de/printer-accept.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Aufträge von {is_class?Klasse:Drucker} {printer_name} akzeptieren</H2>
+
+<P>{is_class?Klasse:Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+aktzeptiert jetzt Aufträge.</P>
diff --git a/templates/de/printer-added.tmpl b/templates/de/printer-added.tmpl
new file mode 100644
index 0000000..b34529c
--- /dev/null
+++ b/templates/de/printer-added.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Drucker hinzufügen</H2>
+
+<P>Drucker <A HREF="/printers/{printer_name}">{printer_name}</A> wurde erfolgreich
+hinzufügt.
diff --git a/templates/de/printer-cancel-jobs.tmpl b/templates/de/printer-cancel-jobs.tmpl
new file mode 100644
index 0000000..364284d
--- /dev/null
+++ b/templates/de/printer-cancel-jobs.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Aufträge auf {is_class?Class:Printer} {printer_name} löschen</H2>
+
+<P>Alle Aufträge auf {is_class?class:printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurden gelöscht.</P>
diff --git a/templates/de/printer-configured.tmpl b/templates/de/printer-configured.tmpl
new file mode 100644
index 0000000..fff957b
--- /dev/null
+++ b/templates/de/printer-configured.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Standardeinstellungen für {printer_name} festlegen</H2>
+
+<P>Standardeinstellungen für {OP=set-class-options?Klasse <A HREF="/classes/{printer_name}">:Drucker <A HREF="/printers/{printer_name}">}{printer_name}</A>
+wurden erfolgreich gesetzt.
diff --git a/templates/ca/printer-confirm.tmpl b/templates/de/printer-confirm.tmpl
index 916bc30..b8735ab 100644
--- a/templates/ca/printer-confirm.tmpl
+++ b/templates/de/printer-confirm.tmpl
@@ -1,10 +1,8 @@
-<DIV CLASS="indent">
+<H2 CLASS="title">Delete Printer {printer_name}</H2>
-<H2 CLASS="title">Elimina la impressora {printer_name}</H2>
+<H2 CLASS="title">Drucker {printer_name} löschen</H2>
-<P><B>Av&iacute;s:</B> Esteu segur que voleu eliminar la impressora
-{printer_name}?</P>
+<P><B>Warnung:</B> Sind Sie sicher, dass Sie den Drucker
+{printer_name} löschen wollen?</P>
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Elimina la impressora"></FORM></P>
-
-</DIV>
+<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Drucker löschen"></FORM></P>
diff --git a/templates/de/printer-default.tmpl b/templates/de/printer-default.tmpl
new file mode 100644
index 0000000..3b35ee9
--- /dev/null
+++ b/templates/de/printer-default.tmpl
@@ -0,0 +1,9 @@
+<H2 CLASS="title">{is_class?Klasse:Drucker} {printer_name} als Standard festlegen</H2>
+
+<P>{is_class?Klasse:Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurde zum Standarddrucker für diesen Server gemacht.</P>
+
+<BLOCKQUOTE><B>Notiz:</B> Die Einstellungen des Standarddruckers
+welche von Benutzern mittels dem <TT>lpoptions</TT> Befehl gesetzt wurden,
+überschreiben diese Einstellung.</BLOCKQUOTE>
diff --git a/templates/de/printer-deleted.tmpl b/templates/de/printer-deleted.tmpl
new file mode 100644
index 0000000..c123e50
--- /dev/null
+++ b/templates/de/printer-deleted.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Drucker {printer_name} löschen</H2>
+
+<P>Drucker {printer_name} wurde erfolgreich gelöscht.
diff --git a/templates/de/printer-jobs-header.tmpl b/templates/de/printer-jobs-header.tmpl
new file mode 100644
index 0000000..0834c9c
--- /dev/null
+++ b/templates/de/printer-jobs-header.tmpl
@@ -0,0 +1 @@
+<H3 CLASS="title">Aufträge</H3>
diff --git a/templates/de/printer-modified.tmpl b/templates/de/printer-modified.tmpl
new file mode 100644
index 0000000..0289f9f
--- /dev/null
+++ b/templates/de/printer-modified.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Drucker {printer_name} ändern</H2>
+
+<P>Drucker <A HREF="/printers/{printer_name}">{printer_name}</A> wurde
+erfolgreich geändert.
diff --git a/templates/de/printer-reject.tmpl b/templates/de/printer-reject.tmpl
new file mode 100644
index 0000000..47f82cb
--- /dev/null
+++ b/templates/de/printer-reject.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Aufträge für {is_class?die Klasse:den Drucker} {printer_name} ablehnen</H2>
+
+<P>{is_class?Die Klasse:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+akzeptiert keine weiteren Aufträge.</P>
diff --git a/templates/de/printer-start.tmpl b/templates/de/printer-start.tmpl
new file mode 100644
index 0000000..c2d89c9
--- /dev/null
+++ b/templates/de/printer-start.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">{is_class?Die Klasse:Den Drucker} {printer_name} fortfahren</H2>
+
+<P>{is_class?Die Klassen:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wird fortgesetzt.</P>
diff --git a/templates/de/printer-stop.tmpl b/templates/de/printer-stop.tmpl
new file mode 100644
index 0000000..d519f1a
--- /dev/null
+++ b/templates/de/printer-stop.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">{is_class?Die Klasse:Den Drucker} {printer_name} anhalten</H2>
+
+<P>{is_class?Die Klasse:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurde angehalten.</P>
diff --git a/templates/de/printer.tmpl b/templates/de/printer.tmpl
new file mode 100644
index 0000000..2b9eb25
--- /dev/null
+++ b/templates/de/printer.tmpl
@@ -0,0 +1,43 @@
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}},
+{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert},
+{server_is_sharing_printers=0?Keine (Server):{printer_is_shared=0?Keine:}} Netzfreigabe{default_name={printer_name}?, Standarddrucker:}, {printer_is_colormanaged=0?Kein Farbmanagement:Farbmanagement})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Wartung</OPTION>
+<OPTION VALUE="print-test-page">Testseite drucken</OPTION>
+{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Druckköpfe reinigen</OPTION>:}
+{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Selbsttest-Seite drucken</OPTION>:}
+{printer_state=5?<OPTION VALUE="start-printer">Drucker starten</OPTION>:<OPTION VALUE="stop-printer">Drucker stoppen</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aufträge akzeptieren</OPTION>:<OPTION VALUE="reject-jobs">Aufträge ablehnen</OPTION>}
+<OPTION VALUE="move-jobs">Alle Aufträge verschieben</OPTION>
+<OPTION VALUE="purge-jobs">Alle Aufträge abbrechen</OPTION>
+</SELECT>
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
+</FORM>
+
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
+<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
+<OPTION VALUE="">Administration</OPTION>
+<OPTION VALUE="modify-printer">Drucker ändern</OPTION>
+<OPTION VALUE="delete-printer">Drucker löschen</OPTION>
+<OPTION VALUE="set-printer-options">Standardeinstellungen festlegen</OPTION>
+<OPTION VALUE="set-as-default">Als Standard festlegen</OPTION>
+<OPTION VALUE="set-allowed-users">Erlaubte Benutzer festlegen</OPTION>
+</SELECT>
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Beschreibung:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ort:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Treiber:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Verbindung:</TH><TD>{device_uri}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Einstellungen:</TH><TD>job-sheets={job_sheets_default}
+media={media_default?{media_default}:unknown}
+{sides_default?sides={sides_default}:}</TD></TR>
+</TABLE>
diff --git a/templates/de/printers-header.tmpl b/templates/de/printers-header.tmpl
new file mode 100644
index 0000000..7ee520e
--- /dev/null
+++ b/templates/de/printers-header.tmpl
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Keine Drucker:Zeige {#printer_name} von {total} Drucker{total=1?:n}}.</P>
diff --git a/templates/de/printers.tmpl b/templates/de/printers.tmpl
new file mode 100644
index 0000000..360154f
--- /dev/null
+++ b/templates/de/printers.tmpl
@@ -0,0 +1,11 @@
+{#printer_name=0?:
+<TABLE CLASS="list" SUMMARY="Druckerliste">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Queue Name <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Queue Name <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Beschreibung</TH><TH>Ort</TH><TH>Marke und Modell</TH><TH>Status</TH></TR>
+</THEAD>
+<TBODY>
+{[printer_name]
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+}
+</TBODY>
+</TABLE></DIV>}
diff --git a/templates/de/restart.tmpl b/templates/de/restart.tmpl
new file mode 100644
index 0000000..f0e5cee
--- /dev/null
+++ b/templates/de/restart.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Einstellungen ändern</H2>
+
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Busy Indicator"> Bitte warten bis der Server neu gestartet ist...</P>
diff --git a/templates/de/samba-export.tmpl b/templates/de/samba-export.tmpl
new file mode 100644
index 0000000..e856ff5
--- /dev/null
+++ b/templates/de/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="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Drucker für Samba freigeben</H2>
+
+{error?<P>Kann Drucker nicht für Samba freigeben\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Consult the <A HREF="/admin/log/error_log"
+TARGET="_blank">Fehlerprotokoll</A> Datei um mehr Informationen zu erhalten.</P>:
+<P>Diese Seite erlaubt es Ihnen Drucker für Samba bereitzustellen
+damit auf diese mittels Windows Clients über die Desktopsymbole
+<VAR>Netzwerk Nachbarn</VAR> oder <VAR>Netzwerkumgebung</VAR>
+zugegriffen werden kann. Sie müssen zuerst einen
+Windows PostScript Druckerteiber installieren wie diese in der Hilfe für <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A> beschrieben ist.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Drucker:</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()"> Alle Drucker freigeben
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Benutzername:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (benötigt)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Passwort:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (benötigt)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Drucker für Samba freigeben"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/de/samba-exported.tmpl b/templates/de/samba-exported.tmpl
new file mode 100644
index 0000000..0e088ed
--- /dev/null
+++ b/templates/de/samba-exported.tmpl
@@ -0,0 +1 @@
+<P>Drucker wurden erfolgreich für Samba freigegeben.</P>
diff --git a/templates/ca/search.tmpl b/templates/de/search.tmpl
index b76afaa..c4e89b8 100644
--- a/templates/ca/search.tmpl
+++ b/templates/de/search.tmpl
@@ -2,9 +2,9 @@
{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
-<P ALIGN="CENTER"><B>Cerca a les
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?classes:{SECTION=jobs?tasques:impressores}}}:</B>
+<P ALIGN="CENTER"><B>Suche in
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klassen:{SECTION=jobs?Aufträgen:Drucker}}}:</B>
<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
-TYPE="SUBMIT" VALUE="Cerca"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Neteja"></P>
+TYPE="SUBMIT" VALUE="Suchen"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Leeren"></P>
</FORM>
diff --git a/templates/cs/set-printer-options-header.tmpl b/templates/de/set-printer-options-header.tmpl
index 160ae6b..e0b64a3 100644
--- a/templates/cs/set-printer-options-header.tmpl
+++ b/templates/de/set-printer-options-header.tmpl
@@ -1,12 +1,10 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Nastavení parametrů u {printer_name}</H2>
+<H2 CLASS="title">Standardeinstellungen für {printer_name} festlegen</H2>
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Nastavit výchozí parametry tiskárny">:}
+{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Frage Drucker nach Voreinstellungen">:}
<SCRIPT TYPE="text/javascript"><!--
function update_paramtable(option)
diff --git a/templates/fr/set-printer-options-trailer.tmpl b/templates/de/set-printer-options-trailer.tmpl
index 11adc70..b92988a 100644
--- a/templates/fr/set-printer-options-trailer.tmpl
+++ b/templates/de/set-printer-options-trailer.tmpl
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
}
--></SCRIPT>
</FORM>
-
-</DIV>
diff --git a/templates/de/subscription-added.tmpl b/templates/de/subscription-added.tmpl
new file mode 100644
index 0000000..813f47f
--- /dev/null
+++ b/templates/de/subscription-added.tmpl
@@ -0,0 +1 @@
+<P>Subskription {subscription_name} wurde erfolgreich hinzugefügt.</P>
diff --git a/templates/de/subscription-canceled.tmpl b/templates/de/subscription-canceled.tmpl
new file mode 100644
index 0000000..18e71b9
--- /dev/null
+++ b/templates/de/subscription-canceled.tmpl
@@ -0,0 +1 @@
+<P>Subskription #{notify_subscription_id} wurde gekündigt.</P>
diff --git a/templates/de/test-page.tmpl b/templates/de/test-page.tmpl
new file mode 100644
index 0000000..bc77673
--- /dev/null
+++ b/templates/de/test-page.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Drucker Testseite auf {printer_name}</H2>
+
+<P>Testseite gesendet; Auftrags-ID ist <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/de/trailer.tmpl b/templates/de/trailer.tmpl
new file mode 100644
index 0000000..7fbd1bc
--- /dev/null
+++ b/templates/de/trailer.tmpl
@@ -0,0 +1,5 @@
+ </div>
+ </div>
+ <div class="footer">CUPS und das CUPS Logo sind Warenzeichen der <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. Alle Rechte vorbehalten.</div>
+ </body>
+</html>
diff --git a/templates/ca/users.tmpl b/templates/de/users.tmpl
index cceeb02..6364ba9 100644
--- a/templates/ca/users.tmpl
+++ b/templates/de/users.tmpl
@@ -1,30 +1,27 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<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">Usuaris amb permisos per {printer_name}</H2>
+<H2 CLASS="title">Erlaubte Benutzer für {printer_name}</H2>
<TABLE>
<TR>
-<TH CLASS="label">Usuaris:</TH>
+<TH CLASS="label">Benutzer:</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:}>Permet imprimir a aquests usuaris
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>No permetis imprimir a aquests usuaris
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Erlaube diesen Benutzern zu drucken
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Verbiete diesen Benutzern zu drucken
</TD>
</TR>
<TR>
<TD></TD>
<TD>
-<INPUT TYPE="SUBMIT" VALUE="Aplica els permisos">
+<INPUT TYPE="SUBMIT" VALUE="Set Allowed Users">
</TD>
</TR>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/edit-config.tmpl b/templates/edit-config.tmpl
index 8947382..d8f9bb1 100644
--- a/templates/edit-config.tmpl
+++ b/templates/edit-config.tmpl
@@ -5,8 +5,6 @@ function reset_config()
}
</SCRIPT>
-<DIV CLASS="indent">
-
<H2 CLASS="title">Edit Configuration File</H2>
<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
@@ -20,5 +18,3 @@ function reset_config()
onClick="reset_config();"></P>
</FORM>
-
-</DIV>
diff --git a/templates/error-op.tmpl b/templates/error-op.tmpl
index feaed0f..652537b 100644
--- a/templates/error-op.tmpl
+++ b/templates/error-op.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} Error</H2>
<P>Error:</P>
<BLOCKQUOTE>Unknown operation "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/error.tmpl b/templates/error.tmpl
index 8623573..2ac1b8f 100644
--- a/templates/error.tmpl
+++ b/templates/error.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} Error</H2>
<P>{?message?{message}:Error}:</P>
<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/es/add-class.tmpl b/templates/es/add-class.tmpl
index 6d61ebe..f163d28 100644
--- a/templates/es/add-class.tmpl
+++ b/templates/es/add-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">A&ntilde;adir clase</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -37,4 +35,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/es/add-printer.tmpl b/templates/es/add-printer.tmpl
index eedc3db..6ccd325 100644
--- a/templates/es/add-printer.tmpl
+++ b/templates/es/add-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">A&ntilde;adir impresora</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -44,4 +42,3 @@ Compartir esta impresora</TD>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/es/admin.tmpl b/templates/es/admin.tmpl
index cce1f14..780dd55 100644
--- a/templates/es/admin.tmpl
+++ b/templates/es/admin.tmpl
@@ -1,102 +1,97 @@
-<TABLE CLASS="indent" SUMMARY="Tareas de administraci&oacute;n">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Impresoras</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir impresora"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Encontrar nuevas impresoras"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar impresoras"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exportar impresoras a Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Clases</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir clase"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar clases"></FORM>
-</P>
-
-<H2 CLASS="title">Trabajos</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar trabajos"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Servidor</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Editar archivo configuraci&oacute;n"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de accesos"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de errores"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de p&aacute;ginas"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Configuraci&oacute;n del servidor\:</B></P>
-
-<P><A HREF="/admin/">Avanzada <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de clientes\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Anunciar la interfaz web<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preservar el historial de trabajos<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de trabajos (0 sin l&iacute;mite)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener metadatos\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener documentos\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tama&ntilde;o m&aacute;ximo del archivo de registro\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Configuraci&oacute;n del servidor:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avanzada <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuraci&oacute;n"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Subscripciones RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir subscripci&oacute;n RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="Subscripciones RSS">
-<THEAD><TR><TH>Nombre</TH><TH>Eventos</TH><TH>Nombre de la cola</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancelar subscripci&oacute;n RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Todas las colas}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+ <div class="halves">
+ <H2 CLASS="title">Impresoras</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir impresora"></FORM>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Encontrar nuevas impresoras"></FORM>
+ <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar impresoras"></FORM>
+ {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exportar impresoras a Samba"></FORM>:}
+ </P>
+
+ <H2 CLASS="title">Clases</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir clase"></FORM>
+ <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar clases"></FORM>
+ </P>
+
+ <H2 CLASS="title">Trabajos</H2>
+
+ <P>
+ <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar trabajos"></FORM>
+ </P>
+ </div>
+ <div class="halves">
+ <H2 CLASS="title">Servidor</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Editar archivo configuraci&oacute;n"></FORM>
+ <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de accesos"></FORM>
+ <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de errores"></FORM>
+ <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de p&aacute;ginas"></FORM>
+ </P>
+
+ {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+ <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+ <FORM METHOD="POST" ACTION="/admin">
+ <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+ {ADVANCEDSETTINGS?<P><B>Configuraci&oacute;n del servidor\:</B></P>
+
+ <P><A HREF="/admin/">Avanzada <SMALL>&#x25bc;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de clientes\:
+ <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Anunciar la interfaz web<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preservar el historial de trabajos<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de trabajos (0 sin l&iacute;mite)\:
+ <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener metadatos\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener documentos\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tama&ntilde;o m&aacute;ximo del archivo de registro\:
+ <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+ :<P><B>Configuraci&oacute;n del servidor:</B></P>
+
+ <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avanzada <SMALL>&#x25b6;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas</P>
+
+ }
+ <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuraci&oacute;n"></P>
+
+ </FORM>}
+ </div>
+</div>
+
+<div class="row">
+ <H2 CLASS="title">Subscripciones RSS</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir subscripci&oacute;n RSS"></FORM>
+ </P>
+
+ {notify_subscription_id?<TABLE CLASS="list" SUMMARY="Subscripciones RSS">
+ <THEAD><TR><TH>Nombre</TH><TH>Eventos</TH><TH>Nombre de la cola</TH></TR></THEAD>
+ <TBODY>{[notify_subscription_id]
+ <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancelar subscripci&oacute;n RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Todas las colas}</TD></TR>}
+ </TBODY>
+ </TABLE>:}
+</div>
diff --git a/templates/es/choose-device.tmpl b/templates/es/choose-device.tmpl
index 9f314fd..8e38af2 100644
--- a/templates/es/choose-device.tmpl
+++ b/templates/es/choose-device.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
{CUPS_GET_DEVICES_DONE?:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
@@ -50,5 +48,5 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
</TR>
</TABLE>
-</FORM>
-</DIV>
+</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Indicador de ocupado"> Buscando impresoras...</P>}
diff --git a/templates/es/choose-make.tmpl b/templates/es/choose-make.tmpl
index c846de4..93ef242 100644
--- a/templates/es/choose-make.tmpl
+++ b/templates/es/choose-make.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/es/choose-model.tmpl b/templates/es/choose-model.tmpl
index 497d4b1..8a5a4ba 100644
--- a/templates/es/choose-model.tmpl
+++ b/templates/es/choose-model.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/es/choose-serial.tmpl b/templates/es/choose-serial.tmpl
index 1f734b9..0b05302 100644
--- a/templates/es/choose-serial.tmpl
+++ b/templates/es/choose-serial.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -49,4 +47,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/es/choose-uri.tmpl b/templates/es/choose-uri.tmpl
index 46ea17b..3b6e783 100644
--- a/templates/es/choose-uri.tmpl
+++ b/templates/es/choose-uri.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -41,4 +39,3 @@ en red"</A> para escoger el URI adecuado a usar con su impresora.</P>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/es/class-added.tmpl b/templates/es/class-added.tmpl
index 867c8d9..0767e80 100644
--- a/templates/es/class-added.tmpl
+++ b/templates/es/class-added.tmpl
@@ -1,7 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">A&ntilde;adir clase</H2>
<P>Se ha a&ntilde;adido con &eacute;xito la clase <A HREF="/classes/{printer_name}">{printer_name}</A>.
-</DIV>
diff --git a/templates/es/class-confirm.tmpl b/templates/es/class-confirm.tmpl
index a30ff72..26f62c4 100644
--- a/templates/es/class-confirm.tmpl
+++ b/templates/es/class-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Borrar clase {printer_name}</H2>
<P><B>Advertencia:</B> &iquest;Est&aacute; seguro de querer borrar la clase
{printer_name}?</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Borrar clase"></FORM></P>
-
-</DIV>
diff --git a/templates/es/class-deleted.tmpl b/templates/es/class-deleted.tmpl
index ced78ad..248a7de 100644
--- a/templates/es/class-deleted.tmpl
+++ b/templates/es/class-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Borrar clase {printer_name}</H2>
<P>Se ha borrado con &eacute;xito la clase {printer_name}.
-
-</DIV> \ No newline at end of file
diff --git a/templates/es/class-jobs-header.tmpl b/templates/es/class-jobs-header.tmpl
index f25951b..f571813 100644
--- a/templates/es/class-jobs-header.tmpl
+++ b/templates/es/class-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">Trabajos</H3>
-</DIV>
diff --git a/templates/es/class-modified.tmpl b/templates/es/class-modified.tmpl
index d5ae2a7..42db8da 100644
--- a/templates/es/class-modified.tmpl
+++ b/templates/es/class-modified.tmpl
@@ -1,6 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modificar clase {printer_name}</H2>
<P>Se ha modificado con &eacute;xito la clase <A HREF="/classes/{printer_name}">{printer_name}</A>.
-</DIV> \ No newline at end of file
diff --git a/templates/es/class.tmpl b/templates/es/class.tmpl
index 5eea4f1..78d4bb9 100644
--- a/templates/es/class.tmpl
+++ b/templates/es/class.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}},
{printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos},
@@ -40,5 +39,3 @@
media={media_default?{media_default}:desconocido}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV>
diff --git a/templates/es/command.tmpl b/templates/es/command.tmpl
index ba50560..fa843a7 100644
--- a/templates/es/command.tmpl
+++ b/templates/es/command.tmpl
@@ -1,12 +1,8 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{title} en {printer_name}</H2>
<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
ALIGN="ABSMIDDLE" ALT="Indicador de ocupado"> }Trabajo de comando de impresora
{job_state=3?pendiente:{job_state=4?retenido:
{job_state=5?procesando:{job_state=6?parado:
-{job_state=7?cancelado:{job_state=8?anulado:completado}}}}}}{job_state=9?:{job_printer_state_message?,
+{job_state=7?cancelado:{job_state=8?interrumpido:completado}}}}}}{job_state=9?:{job_printer_state_message?,
<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/es/edit-config.tmpl b/templates/es/edit-config.tmpl
index a0c6634..817f8cc 100644
--- a/templates/es/edit-config.tmpl
+++ b/templates/es/edit-config.tmpl
@@ -5,8 +5,6 @@ function reset_config()
}
</SCRIPT>
-<DIV CLASS="indent">
-
<H2 CLASS="title">Editar archivo de configuraci&oacute;n</H2>
<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
@@ -20,5 +18,3 @@ function reset_config()
onClick="reset_config();"></P>
</FORM>
-
-</DIV>
diff --git a/templates/es/error-op.tmpl b/templates/es/error-op.tmpl
index d584108..7def5ce 100644
--- a/templates/es/error-op.tmpl
+++ b/templates/es/error-op.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
<P>Error:</P>
<BLOCKQUOTE>Operaci&oacute;n desconocida "{op}".</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/es/error.tmpl b/templates/es/error.tmpl
index f652ea2..f149a1b 100644
--- a/templates/es/error.tmpl
+++ b/templates/es/error.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
<P>{?message?{message}:Error}:</P>
<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/es/header.tmpl.in b/templates/es/header.tmpl.in
index b6c63b4..a6df94c 100644
--- a/templates/es/header.tmpl.in
+++ b/templates/es/header.tmpl.in
@@ -1,29 +1,43 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Inicio&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administraci&oacute;n&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Clases&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Ayuda&nbsp;en&nbsp;l&iacute;nea&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Trabajos&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Impresoras&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Buscar en la ayuda"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <style>html{display:none;}</style>
+ <script type="text/javascript"><!--
+ /* Only display document if we are not in a frame... */
+ if (self == top) {
+ document.documentElement.style.display = 'block';
+ } else {
+ top.location = self.location;
+ }
+
+ /* Show an error if cookies are disabled */
+ function check_cookies() {
+ if (!navigator.cookieEnabled) {
+ document.getElementById('body').innerHTML = 'Esta p&aacute;gina usa cookies para prevenir ataques comunes de sitios. Por favor, active las cookies en su navegador.';
+ }
+ }
+ --></SCRIPT>
+ <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body onload="check_cookies();">
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a href="/">Inicio</a></li>
+ <li><a {SECTION=admin?class="active" :}href="/admin">Administraci&oacute;n</a></li>
+ <li><a {SECTION=classes?class="active" :}href="/classes/">Clases</a></li>
+ <li><a {SECTION=help?class="active" :}href="/help/">Ayuda</a></li>
+ <li><a {SECTION=jobs?class="active" :}href="/jobs/">Trabajos</a></li>
+ <li><a {SECTION=printers?class="active" :}href="/printers/">Impresoras</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>{title}</h1>
diff --git a/templates/es/help-header.tmpl b/templates/es/help-header.tmpl
index 3e7fef9..b05b4b1 100644
--- a/templates/es/help-header.tmpl
+++ b/templates/es/help-header.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
@@ -31,21 +30,12 @@ AUTOSAVE="org.cups.help" RESULTS="20">
{QTEXT?</UL>:}
:<P>No hay coincidencias.</P>}
<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Ver versi&oacute;n imprimible"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Ver versi&oacute;n imprimible"></FORM>:
<H1>Ayuda en l&iacute;nea</H1>
-<P>Esta es la interfaz de ayuda en l&iacute;nea de CUPS. Introduzca las palabras
-a buscar aqu&iacute; encima o haga clic en cualquiera de los enlaces de la
-documentaci&oacute;n para visualizar la informaci&oacute;n de ayuda en l&iacute;nea.</P>
+<P>Esta es la interfaz de ayuda en l&iacute;nea de CUPS. Introduzca las palabras a buscar aqu&iacute; encima o haga clic en cualquiera de los enlaces de la documentaci&oacute;n para visualizar la informaci&oacute;n de ayuda en l&iacute;nea.</P>
-<P>Si es nuevo en CUPS, lea la p&aacute;gina "<a
-href="/help/overview.html">Informaci&oacute;n general de CUPS</a>". Los usuarios veteranos
-deber&iacute;an leer la p&aacute;gina "<a href="/help/whatsnew.html">Qu&eacute; hay de nuevo en CUPS
-1.6</a>".</P>
+<P>Si es nuevo en CUPS, lea la p&aacute;gina "<a href="/help/overview.html">Informaci&oacute;n general de CUPS</a>".</P>
-<P>La <A HREF="http://www.cups.org/">p&aacute;gina de inicio de CUPS</A> tambi&eacute;n
-proporciona muchos recursos, incluyendo foros de discusi&oacute;n de usuarios, respuestas
-a preguntas frecuentes, y un formulario para el env&iacute;o de informes de errores y
-peticiones de mejoras.</P>}
+<P>La <A HREF="http://www.cups.org/">p&aacute;gina de inicio de CUPS</A> tambi&eacute;n proporciona muchos recursos, incluyendo foros de discusi&oacute;n de usuarios, respuestas a preguntas frecuentes, y un formulario para el env&iacute;o de informes de errores y peticiones de mejoras.</P>}
diff --git a/templates/es/help-trailer.tmpl b/templates/es/help-trailer.tmpl
index 4c1ebed..e69de29 100644
--- a/templates/es/help-trailer.tmpl
+++ b/templates/es/help-trailer.tmpl
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/es/job-cancel.tmpl b/templates/es/job-cancel.tmpl
index 6a41427..e8ef1bb 100644
--- a/templates/es/job-cancel.tmpl
+++ b/templates/es/job-cancel.tmpl
@@ -1,7 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Cancelar trabajo {job_id}</H2>
<P>Se ha cancelado el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-</DIV>
diff --git a/templates/es/job-hold.tmpl b/templates/es/job-hold.tmpl
index 3136f9d..74257e6 100644
--- a/templates/es/job-hold.tmpl
+++ b/templates/es/job-hold.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Retener trabajo {job_id}</H2>
<P>Se ha retenido el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-
-</DIV>
diff --git a/templates/es/job-move.tmpl b/templates/es/job-move.tmpl
index e6aac39..02639b3 100644
--- a/templates/es/job-move.tmpl
+++ b/templates/es/job-move.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
</TABLE>
</FORM>
-
-</DIV>
diff --git a/templates/es/job-moved.tmpl b/templates/es/job-moved.tmpl
index 8eb7a98..e2a1911 100644
--- a/templates/es/job-moved.tmpl
+++ b/templates/es/job-moved.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{job_id?Mover trabajo {job_id}:Mover todos los trabajos}</H2>
<P>Se {job_id?ha movido el <A HREF="/jobs/{job_id}">Trabajo {job_id}</A>:han movido todos los trabajos} a
<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/es/job-release.tmpl b/templates/es/job-release.tmpl
index d925e5f..0b56ba5 100644
--- a/templates/es/job-release.tmpl
+++ b/templates/es/job-release.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Liberar trabajo {job_id}</H2>
<P>Se ha liberado el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-
-</DIV>
diff --git a/templates/es/job-restart.tmpl b/templates/es/job-restart.tmpl
index ee6c8e5..6e71de4 100644
--- a/templates/es/job-restart.tmpl
+++ b/templates/es/job-restart.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Reimprimir trabajo {job_id}</H2>
<P>Se ha reiniciado el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-
-</DIV>
diff --git a/templates/es/jobs-header.tmpl b/templates/es/jobs-header.tmpl
index fe8b51f..abb9914 100644
--- a/templates/es/jobs-header.tmpl
+++ b/templates/es/jobs-header.tmpl
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostrar trabajos activos"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostrar trabajos activos"></FORM>}
{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Mostrar trabajos completados"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Mostrar todos los trabajos"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Mostrar todos los trabajos"></FORM>}
<P ALIGN="CENTER">{total=0?No hay trabajos:Mostrando {#job_id} de {total} trabajo{total=1?:s}{?which_jobs=? activo{total=1?:s}:{which_jobs=all?: completado{total=1?:s}}}}.</P>
diff --git a/templates/es/jobs.tmpl b/templates/es/jobs.tmpl
index 1187513..65fb6cb 100644
--- a/templates/es/jobs.tmpl
+++ b/templates/es/jobs.tmpl
@@ -13,7 +13,7 @@
<TD>{job_media_sheets_completed=0?Desconocido:{?job_media_sheets_completed}}&nbsp;</TD>
<TD>{job_state=3?pendiente desde<BR>{time_at_creation}:{job_state=4?retenido desde<BR>{time_at_creation}:
{job_state=5?en proceso desde<BR>{time_at_processing}:{job_state=6?parado:
-{job_state=7?cancelado el<BR>{time_at_completed}:{job_state=8?anulado:completado el<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
+{job_state=7?cancelado el<BR>{time_at_completed}:{job_state=8?interrumpido:completado el<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
diff --git a/templates/es/list-available-printers.tmpl b/templates/es/list-available-printers.tmpl
index 51e0eb9..5ae28ce 100644
--- a/templates/es/list-available-printers.tmpl
+++ b/templates/es/list-available-printers.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Impresoras disponibles</H2>
{#device_uri=0?<P>No se encuentran impresoras.</P>
@@ -7,5 +5,3 @@
<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir esta impresora"></FORM>
{device_make_and_model} ({device_info})</LI>
}</UL>}
-
-</DIV>
diff --git a/templates/es/modify-class.tmpl b/templates/es/modify-class.tmpl
index a50b2bb..2e1da3d 100644
--- a/templates/es/modify-class.tmpl
+++ b/templates/es/modify-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modificar clase {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/es/modify-printer.tmpl b/templates/es/modify-printer.tmpl
index 3c09da0..d18d517 100644
--- a/templates/es/modify-printer.tmpl
+++ b/templates/es/modify-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modificar {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -39,4 +37,3 @@ Compartir esta impresora</TD>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/es/norestart.tmpl b/templates/es/norestart.tmpl
index ac0f96b..5923a67 100644
--- a/templates/es/norestart.tmpl
+++ b/templates/es/norestart.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Cambiar especificaciones</H2>
<p>No se ha reiniciado el servidor debido a que no se han hecho
cambios en la configuraci&oacute;n...</p>
-
-</DIV>
diff --git a/templates/es/printer-accept.tmpl b/templates/es/printer-accept.tmpl
index 63fab1b..f9a8efe 100644
--- a/templates/es/printer-accept.tmpl
+++ b/templates/es/printer-accept.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Aceptar trabajos de la {is_class?clase:impresora} {printer_name}</H2>
<P>La {is_class?clase:impresora} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ahora acepta trabajos.</P>
-
-</DIV>
diff --git a/templates/es/printer-added.tmpl b/templates/es/printer-added.tmpl
index 88c565b..4661e65 100644
--- a/templates/es/printer-added.tmpl
+++ b/templates/es/printer-added.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">A&ntilde;adir impresora</H2>
<P>Se ha a&ntilde;adido con &eacute;xito la impresora <A HREF="/printers/{printer_name}">{printer_name}</A>.
-
-</DIV>
diff --git a/templates/es/printer-cancel-jobs.tmpl b/templates/es/printer-cancel-jobs.tmpl
new file mode 100644
index 0000000..35abeb4
--- /dev/null
+++ b/templates/es/printer-cancel-jobs.tmpl
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Cancelar trabajos en {is_class?clase:impresora} {printer_name}</H2>
+
+<P>Se han cancelado todos los trabajos de la {is_class?clase:impresora} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>.</P>
diff --git a/templates/es/printer-configured.tmpl b/templates/es/printer-configured.tmpl
index d382264..026677f 100644
--- a/templates/es/printer-configured.tmpl
+++ b/templates/es/printer-configured.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Cambiar opciones predeterminadas de {printer_name}</H2>
<P>Se han establecido con &eacute;xito las opciones predeterminadas de la
{OP=set-class-options?clase <A HREF="/classes/{printer_name}">:impresora <A HREF="/printers/{printer_name}">}{printer_name}</A>.
-
-</DIV>
diff --git a/templates/es/printer-confirm.tmpl b/templates/es/printer-confirm.tmpl
index 1de104a..71e4793 100644
--- a/templates/es/printer-confirm.tmpl
+++ b/templates/es/printer-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Borrar impresora {printer_name}</H2>
<P><B>Advertencia:</B> &iquest;Est&aacute; seguro de querer borrar la impresora
{printer_name}?</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Borrar impresora"></FORM></P>
-
-</DIV>
diff --git a/templates/es/printer-default.tmpl b/templates/es/printer-default.tmpl
index 68b61f2..87a3c3c 100644
--- a/templates/es/printer-default.tmpl
+++ b/templates/es/printer-default.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Poner la {is_class?clase:impresora} {printer_name} como predeterminada</H2>
<P>Se ha puesto como predeterminada en el servidor la {is_class?clase:impresora} <A
@@ -9,5 +7,3 @@ HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>.</P>
que haya sido activada por mediaci&oacute;n del comando
<TT>lpoptions</TT> tiene mayor preferencia que este ajuste
predeterminado.</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/es/printer-deleted.tmpl b/templates/es/printer-deleted.tmpl
index 8bf7db6..2cda454 100644
--- a/templates/es/printer-deleted.tmpl
+++ b/templates/es/printer-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Borrar impresora {printer_name}</H2>
<P>Se ha borrado con &eacute;xito la impresora {printer_name}.
-
-</DIV>
diff --git a/templates/es/printer-jobs-header.tmpl b/templates/es/printer-jobs-header.tmpl
index f25951b..f571813 100644
--- a/templates/es/printer-jobs-header.tmpl
+++ b/templates/es/printer-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">Trabajos</H3>
-</DIV>
diff --git a/templates/es/printer-modified.tmpl b/templates/es/printer-modified.tmpl
index 9035dce..328c6ea 100644
--- a/templates/es/printer-modified.tmpl
+++ b/templates/es/printer-modified.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modificar impresora {printer_name}</H2>
<P>Se ha modificado con &eacute;xito la impresora <A HREF="/printers/{printer_name}">{printer_name}</A>.
-
-</DIV> \ No newline at end of file
diff --git a/templates/es/printer-reject.tmpl b/templates/es/printer-reject.tmpl
index 637e13e..8890935 100644
--- a/templates/es/printer-reject.tmpl
+++ b/templates/es/printer-reject.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Rechazar trabajos de la {is_class?clase:impresora} {printer_name}</H2>
<P>La {is_class?clase:impresora} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ya no acepta trabajos.</P>
-
-</DIV>
diff --git a/templates/es/printer-start.tmpl b/templates/es/printer-start.tmpl
index 117afcd..79695f6 100644
--- a/templates/es/printer-start.tmpl
+++ b/templates/es/printer-start.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Reanudar la {is_class?clase:impresora} {printer_name}</H2>
<P>La {is_class?clase:impresora} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ha sido reanudada.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/es/printer-stop.tmpl b/templates/es/printer-stop.tmpl
index af37494..0e9e267 100644
--- a/templates/es/printer-stop.tmpl
+++ b/templates/es/printer-stop.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Pausar la {is_class?clase:impresora} {printer_name}</H2>
<P>La {is_class?clase:impresora} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ha sido puesta en pausa.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/es/printer.tmpl b/templates/es/printer.tmpl
index f7642ac..7171289 100644
--- a/templates/es/printer.tmpl
+++ b/templates/es/printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}},
{printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos},
@@ -15,9 +13,9 @@
{printer_state=5?<OPTION VALUE="start-printer">Reanudar impresora</OPTION>:<OPTION VALUE="stop-printer">Pausar impresora</OPTION>}
{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aceptar trabajos</OPTION>:<OPTION VALUE="reject-jobs">Rechazar trabajos</OPTION>}
<OPTION VALUE="move-jobs">Mover todos los trabajos</OPTION>
-<OPTION VALUE="purge-jobs">Cancelar todos los trabajos</OPTION>
+<OPTION VALUE="cancel-jobs">Cancelar todos los trabajos</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
</FORM>
<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
@@ -31,17 +29,15 @@
<OPTION VALUE="set-as-default">Poner como predeterminada del servidor</OPTION>
<OPTION VALUE="set-allowed-users">Establecer usuarios permitidos</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
</FORM>
<TABLE SUMMARY="{printer_name}">
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;n:</TH><TD>{printer_info}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute;n:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, d&uacute;plex:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported=one-sided?:, d&uacute;plex})<BR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Conexi&oacute;n:</TH><TD>{device_uri}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Opciones predeterminadas:</TH><TD>job-sheets={job_sheets_default}
media={media_default?{media_default}:desconocido}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV>
diff --git a/templates/es/restart.tmpl b/templates/es/restart.tmpl
index 607351d..0a20077 100644
--- a/templates/es/restart.tmpl
+++ b/templates/es/restart.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Cambiar especificaciones</H2>
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
ALT="Indicador de ocupado"> Por favor espere mientras se reinicia el servidor...</P>
-
-</DIV>
diff --git a/templates/es/set-printer-options-header.tmpl b/templates/es/set-printer-options-header.tmpl
index 8a2740b..91a6074 100644
--- a/templates/es/set-printer-options-header.tmpl
+++ b/templates/es/set-printer-options-header.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Establecer opciones predeterminadas de {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
diff --git a/templates/es/set-printer-options-trailer.tmpl b/templates/es/set-printer-options-trailer.tmpl
index 11adc70..b92988a 100644
--- a/templates/es/set-printer-options-trailer.tmpl
+++ b/templates/es/set-printer-options-trailer.tmpl
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
}
--></SCRIPT>
</FORM>
-
-</DIV>
diff --git a/templates/es/subscription-added.tmpl b/templates/es/subscription-added.tmpl
index 87ce96a..725b8bb 100644
--- a/templates/es/subscription-added.tmpl
+++ b/templates/es/subscription-added.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>Se ha a&ntilde;adido con &eacute;xito la subscripci&oacute;n {subscription_name}.</P>
-
-</DIV>
diff --git a/templates/es/subscription-canceled.tmpl b/templates/es/subscription-canceled.tmpl
index d6ac171..8a68f54 100644
--- a/templates/es/subscription-canceled.tmpl
+++ b/templates/es/subscription-canceled.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>La subscripci&oacute;n #{notify_subscription_id} ha sido cancelada.</P>
-
-</DIV>
diff --git a/templates/es/test-page.tmpl b/templates/es/test-page.tmpl
index 763dab5..d4fbffa 100644
--- a/templates/es/test-page.tmpl
+++ b/templates/es/test-page.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Imprimir p&aacute;gina de prueba en {printer_name}</H2>
<P>P&aacute;gina de prueba enviada; el n&uacute;mero del trabajo es el <A HREF="/{SECTION}/{printer_name}">
{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/es/trailer.tmpl b/templates/es/trailer.tmpl
index 017693e..9bdd1a7 100644
--- a/templates/es/trailer.tmpl
+++ b/templates/es/trailer.tmpl
@@ -1,8 +1,5 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS y el logo de CUPS son marcas registradas de
-<A HREF="http://www.apple.com">Apple, Inc.</A> Los derechos de copia de CUPS
-2007-2013 son de Apple Inc. Todos los derechos reservados.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+ </div>
+ </div>
+ <div class="footer">CUPS y el logo de CUPS son marcas registradas de <a href="http://www.apple.com">Apple Inc.</a> Derechos de autor &copy; 2007-2015 Apple Inc. Todos los derechos reservados.</div>
+ </body>
+</html>
diff --git a/templates/es/users.tmpl b/templates/es/users.tmpl
index a8a645e..3d24a5a 100644
--- a/templates/es/users.tmpl
+++ b/templates/es/users.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/fr/add-class.tmpl b/templates/fr/add-class.tmpl
deleted file mode 100644
index a4402d4..0000000
--- a/templates/fr/add-class.tmpl
+++ /dev/null
@@ -1,40 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une classe</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Peux contenir n'importe quel caract&egrave;re sauf "/", "#", et espace)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Description compr&eacute;hensible comme "HP LaserJet Recto/Verso")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Emplacement compr&eacute;hensible comme "Lab 1")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</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="SUBMIT" VALUE="Ajouter la classe"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/add-printer.tmpl b/templates/fr/add-printer.tmpl
deleted file mode 100644
index 22dc07b..0000000
--- a/templates/fr/add-printer.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une imprimante</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<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}">
-{?current_make!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE" VALUE="{current_make}">:}
-{?current_make_and_model!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{current_make_and_model}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
-<SMALL>(Peux contenir n'importe quel caract&egrave;re sauf "/", "#", et espace)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>(Description compr&eacute;hensible comme "HP LaserJet Recto/Verso")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>(Emplacement compr&eacute;hensible comme "Lab 1")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Partager cette imprimante</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/add-rss-subscription.tmpl b/templates/fr/add-rss-subscription.tmpl
deleted file mode 100644
index e98ee1c..0000000
--- a/templates/fr/add-rss-subscription.tmpl
+++ /dev/null
@@ -1,44 +0,0 @@
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
-
-<H2 CLASS="title">S'abonner &agrave; un flux RSS</H2>
-
-<TABLE SUMMARY="S'abonner &agrave; un flux RSS">
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
-<SMALL>(Peux contenir n'importe quel caract&egrave;re sauf "/", "#", et espace)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">File:</TH>
-<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Toutes les files</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
-</TR>
-<TR VALIGN="TOP">
-<TH CLASS="label">Ev&eacute;nements:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>T&acirc;ches cr&eacute;es<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>T&acirc;ches finies<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>T&acirc;ches stopp&eacute;es<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Options de t&acirc;che modifi&eacute;es</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Files arr&ecirc;t&eacute;es<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>File ajout&eacute;e<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>File modifi&eacute;e<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>File supprim&eacute;e</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Serveur d&eacute;marr&eacute;<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Serveur arr&ecirc;t&eacute;<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Serveur red&eacute;marr&eacute;<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Audit de s&eacute;curit&eacute; du serveur</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nombre maximum d'&eacute;v&eacute;nements:</TH>
-<TD COLSPAN="5"><INPUT TYPE="NUMBER" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="S'abonner &agrave; un flux RSS"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/fr/admin.tmpl b/templates/fr/admin.tmpl
deleted file mode 100644
index 304e77b..0000000
--- a/templates/fr/admin.tmpl
+++ /dev/null
@@ -1,102 +0,0 @@
-<TABLE CLASS="indent" SUMMARY="T&acirc;ches d'Administration">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Imprimantes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Ajouter une imprimante"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Trouver de nouvelles imprimantes"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="G&eacute;rer les Imprimantes"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exporter les imprimantes vers Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Classes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Ajouter une classe"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="G&eacute;rer les Classes"></FORM>
-</P>
-
-<H2 CLASS="title">T&acirc;ches</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="G&eacute;rer les T&acirc;ches"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Serveur</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Editer le Fichier de Configuration"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Visualiser Access Log"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Visualiser Error Log"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Visualiser Page Log"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Param&egrave;tres du serveur\:</B></P>
-
-<P><A HREF="/admin/">Avanc&eacute; <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Partager les imprimantes connect&eacute;es &agrave; ce syst&egrave;me<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre maximum de clients\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Autoriser l'impression depuis Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Annoncer l'interface Web<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Autoriser l'administration &agrave; distance<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Utiliser l'authentification Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Autoriser les utilisateurs &agrave; annuler n'importe quelle t&acirc;che (Pas seulement les leurs)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Conserver l'historique des t&acirc;ches<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre de t&acirc;ches\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserver les meta-donn&eacute;es\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserver les documents\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Enregistrer les informations de debug pour la r&eacute;solution de probl&egrave;mes<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Taille maximum du fichier de log\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Param&egrave;tres du Serveur:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avanc&eacute; <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Partager les imprimantes connect&eacute;es &agrave; ce syst&egrave;me<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Autoriser l'impression depuis Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Autoriser l'administration &agrave; distance<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Utiliser l'authentification Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Autoriser les utilisateurs &agrave; annuler n'importe quelle t&acirc;che (Pas seulement les leurs)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Enregistrer les informations de debug pour la r&eacute;solution de probl&egrave;mes</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Modifier les param&egrave;tres"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Abonnements RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Ajouter un abonnement RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="Abonnements RSS">
-<THEAD><TR><TH>Nom</TH><TH>Ev&eacute;nements</TH><TH>Nom de la File</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Annuler l'abonnement RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Toutes les Files}</TD></TR>}
-</TBODY>
-</TABLE>:}
diff --git a/templates/fr/choose-device.tmpl b/templates/fr/choose-device.tmpl
deleted file mode 100644
index 2bcb430..0000000
--- a/templates/fr/choose-device.tmpl
+++ /dev/null
@@ -1,53 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-{op=add-printer?:<TR>
-<TH CLASS="label">Connexion courante\:</TH>
-<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
-{current_device_uri}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Imprimantes locales\:</TH>
-<TD>
-{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}}
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Imprimantes R&eacute;seaux D&eacute;couvertes\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}:}}
-</TD>
-</TR>
-<TR>
-<TR>
-<TH CLASS="label">Autres Imprimantes R&eacute;seaux\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-}:}}
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Indicateur d'occupation"> Recherche en cours...</P>}
-
-</DIV>
diff --git a/templates/fr/choose-make.tmpl b/templates/fr/choose-make.tmpl
deleted file mode 100644
index d48dfc1..0000000
--- a/templates/fr/choose-make.tmpl
+++ /dev/null
@@ -1,64 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<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}">
-
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Ne pas:{?printer_is_shared=0?Ne pas:}} Partager cette Imprimante</TD>
-</TR>
-<TR>
-<TH CLASS="label">Marque:</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="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>&nbsp;</TD>
-</TR>
-<TR>
-<TH CLASS="label">Ou donner un fichier 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="SUBMIT" VALUE="{op=add-printer?Ajouter une imprimante:Modifier l'imprimante}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/choose-model.tmpl b/templates/fr/choose-model.tmpl
deleted file mode 100644
index 5428153..0000000
--- a/templates/fr/choose-model.tmpl
+++ /dev/null
@@ -1,60 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<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}">
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Ne pas:{?printer_is_shared=0?Ne pas:}} Partager cette imprimante</TD>
-</TR>
-<TR>
-<TH CLASS="label">Marque:</TH>
-<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Choisir un autre fabriquant"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Mod&egrave;le:</TH>
-<TD>
-<SELECT NAME="PPD_NAME" SIZE="10">
-{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Pilote courrant - {current_make_and_model}</OPTION>:}
-{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
-}</SELECT>
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Ou donner un fichier 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="SUBMIT" VALUE="{op=add-printer?Ajouter une imprimante:Modifier une imprimante}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/choose-serial.tmpl b/templates/fr/choose-serial.tmpl
deleted file mode 100644
index a1c7204..0000000
--- a/templates/fr/choose-serial.tmpl
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Baud/s:</TH>
-<TD><SELECT NAME="BAUDRATE">
-{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Parit&eacute;:</TH>
-<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Aucune
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Paire
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Impaire
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Bits de donn&eacute;es:</TH>
-<TD><SELECT NAME="BITS">
-<OPTION {?bits=8?SELECTED:}>8
-<OPTION {?bits=7?SELECTED:}>7
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Contr&ocirc;le de flux:</TH>
-<TD><SELECT NAME="FLOW">
-<OPTION VALUE="none" {?flow=none?SELECTED:}>Aucun
-<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Logiciel)
-<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Mat&egrave;riel)
-<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Mat&egrave;riel)
-</SELECT></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/choose-uri.tmpl b/templates/fr/choose-uri.tmpl
deleted file mode 100644
index 72b4a5e..0000000
--- a/templates/fr/choose-uri.tmpl
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="URL" SIZE="60" MAXLENGTH="1023" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>Exemples:
-<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>Cf. <A HREF="/help/network.html" TARGET="_blank">"Imprimantes
-R&eacute;seaux"</A> pour construire l'URI &agrave; employ&eacute;e avec votre imprimante.</P>
-
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/class-added.tmpl b/templates/fr/class-added.tmpl
deleted file mode 100644
index 7ed1648..0000000
--- a/templates/fr/class-added.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une Classe</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> a &eacute;t&eacute; ajout&eacute;e
-avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/class-confirm.tmpl b/templates/fr/class-confirm.tmpl
deleted file mode 100644
index 276ec34..0000000
--- a/templates/fr/class-confirm.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer la classe {printer_name}</H2>
-
-<P><B>Attention:</B> Etes-vous sur(e) de vouloir supprimer la classe
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Supprimer la classe"></FORM></P>
-
-</DIV>
diff --git a/templates/fr/class-deleted.tmpl b/templates/fr/class-deleted.tmpl
deleted file mode 100644
index 6f8aefa..0000000
--- a/templates/fr/class-deleted.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer la classe {printer_name}</H2>
-
-<P>La classe {printer_name} a &eacute;t&eacute; supprim&eacute;e avec succ&egrave;s.
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/class-jobs-header.tmpl b/templates/fr/class-jobs-header.tmpl
deleted file mode 100644
index 551f47e..0000000
--- a/templates/fr/class-jobs-header.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">T&acirc;ches</H3>
-</DIV>
diff --git a/templates/fr/class-modified.tmpl b/templates/fr/class-modified.tmpl
deleted file mode 100644
index e4b8b5a..0000000
--- a/templates/fr/class-modified.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier la Classe {printer_name}</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> a &eacute;t&eacute;
-modifi&eacute;e avec succ&egrave;s.
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/class.tmpl b/templates/fr/class.tmpl
deleted file mode 100644
index 0d6d891..0000000
--- a/templates/fr/class.tmpl
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?En attente:{printer_state=4?En cours d'impression:Arr&ecirc;t&eacute;}},
-{printer_is_accepting_jobs=0?Rejette les t&acirc;ches:Accepte les t&acirc;ches},
-{server_is_sharing_printers=0?Non:{printer_is_shared=0?Non:}} Partag&eacute;e{default_name={printer_name}?, Imprimante par d&eacute;faut:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Maintenance</OPTION>
-<OPTION VALUE="print-test-page">Imprimer une page de test</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">D&eacute;marrer la classe</OPTION>:<OPTION VALUE="stop-class">Arr&ecirc;ter la classe</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepter les t&acirc;ches</OPTION>:<OPTION VALUE="reject-jobs">Rejeter les t&acirc;ches</OPTION>}
-<OPTION VALUE="move-jobs">Transf&eacute;rer toutes les t&acirc;ches</OPTION>
-<OPTION VALUE="purge-jobs">Annuler toutes les t&acirc;ches</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administration</OPTION>
-<OPTION VALUE="modify-class">Modifier la classe</OPTION>
-<OPTION VALUE="delete-class">Supprimer la classe</OPTION>
-<OPTION VALUE="set-class-options">R&eacute;initialiser les options</OPTION>
-<OPTION VALUE="set-as-default">D&eacute;finir par d&eacute;faut</OPTION>
-<OPTION VALUE="set-allowed-users">D&eacute;finir les autorisations</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Description:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Emplacement:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Membres:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">D&eacute;fauts:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:inconnu}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/fr/classes-header.tmpl b/templates/fr/classes-header.tmpl
deleted file mode 100644
index 3c4d1ba..0000000
--- a/templates/fr/classes-header.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Pas de classes:Affichage de {#printer_name} classe{total=1?:s}} sur {total}.</P>
diff --git a/templates/fr/classes.tmpl b/templates/fr/classes.tmpl
deleted file mode 100644
index 0a04ebe..0000000
--- a/templates/fr/classes.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Liste des Classes">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom de la file <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom de la file <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Description</TH><TH>Emplacement</TH><TH>Membres</TH><TH>&Eacute;tat</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Aucun:{member_uris}}</TD><TD>{printer_state=3?Inoccup&eacute;:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/fr/command.tmpl b/templates/fr/command.tmpl
deleted file mode 100644
index bcd0f90..0000000
--- a/templates/fr/command.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{title} sur {printer_name}</H2>
-
-<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Commandes de t&acirc;che d'impression
-{job_state=3?en attente:{job_state=4?retenu:
-{job_state=5?en cours d'impression:{job_state=6?arr&ecirc;t&eacute;:
-{job_state=7?annul&eacute;:{job_state=8?annul&eacute;:termin&eacute;}}}}}}{job_state=9?:{job_printer_state_message?,
-<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/fr/edit-config.tmpl b/templates/fr/edit-config.tmpl
deleted file mode 100644
index 62d1414..0000000
--- a/templates/fr/edit-config.tmpl
+++ /dev/null
@@ -1,24 +0,0 @@
-<SCRIPT TYPE="text/javascript">
-function reset_config()
-{
- document.cups.CUPSDCONF.value = "{?cupsdconf_default}";
-}
-</SCRIPT>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Edition du Fichier de Configuration</H2>
-
-<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-
-<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
-
-<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Enregistrer les modifications">
-<INPUT TYPE="BUTTON" VALUE="Utiliser le fichier de configuration par d&eacute;faut"
-onClick="reset_config();"></P>
-
-</FORM>
-
-</DIV>
diff --git a/templates/fr/error-op.tmpl b/templates/fr/error-op.tmpl
deleted file mode 100644
index ba5c91c..0000000
--- a/templates/fr/error-op.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{?title} {?printer_name} Erreur</H2>
-
-<P>Erreur:</P>
-
-<BLOCKQUOTE>Op&eacute;ration inconnue "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/fr/error.tmpl b/templates/fr/error.tmpl
deleted file mode 100644
index 2ce2451..0000000
--- a/templates/fr/error.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{?title} {?printer_name} Erreur</H2>
-
-<P>{?message?{message}:Erreur}:</P>
-
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/fr/header.tmpl.in b/templates/fr/header.tmpl.in
deleted file mode 100644
index d7f00c1..0000000
--- a/templates/fr/header.tmpl.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Accueil&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Aide&nbsp;En&nbsp;Ligne&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;T&acirc;ches&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Imprimantes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
diff --git a/templates/fr/help-header.tmpl b/templates/fr/help-header.tmpl
deleted file mode 100644
index 751136d..0000000
--- a/templates/fr/help-header.tmpl
+++ /dev/null
@@ -1,51 +0,0 @@
-<DIV CLASS="indent">
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
-{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
-
-<P ALIGN="CENTER"><B>Rechercher dans
-{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:tous les documents}}:</B> <INPUT
-TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
-AUTOSAVE="org.cups.help" RESULTS="20">
-<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Rechercher">
-<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Vider"></P>
-
-</FORM>
-
-<!-- Bookmarks -->
-<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Contenus">
-<TR><TD>
-
-<H3 CLASS="title">Documents d'aide en ligne</H3>
-
-<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Tous les documents</A></P>
-<HR>
-
-{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
-}
-</TD></TR>
-</TABLE></DIV>
-
-{QUERY?<P>R&eacute;sultats de la recherche dans {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:tous les documents}}\:</P>
-{QTEXT?<UL>
-{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
-{QTEXT?</UL>:}
-:<P>Aucun r&eacute;sultat trouv&eacute;.</P>}
-<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Voir la version imprimable"></FORM>:
-
-<H1>Aide en ligne</H1>
-
-<P>Voici l'interface d'aide en ligne de CUPS. Entrez ci-dessus les mots &agrave; rechercher
-ou cliquez sur un lien ci-contre pour afficher
-l'aide en ligne du document.</P>
-
-<P>Si vous &ecirc;tes un nouvel utilisateur de CUPS, lisez la page "<a
-href="/help/overview.html">Pr&eacute;sentation de CUPS</a>". Il est conseill&eacute; aux utilisateurs habitu&eacute;s
-de lire la page "<a href="/help/whatsnew.html">Quoi de neuf dans CUPS
-1.6</a>".</P>
-
-<P>La <A HREF="http://www.cups.org/">page d'accueil de CUPS</A> donne aussi
-acc&egrave;s &agrave; de nombreuses ressources, comme des forums de discussion pour les
-utilisateurs, des r&eacute;ponses aux questions fr&eacute;quentes, et un formulaire pour
-soumettre des rapports de bug ou des demandes pour de nouvelles fonctionnalit&eacute;s.</P>}
diff --git a/templates/fr/help-printable.tmpl b/templates/fr/help-printable.tmpl
deleted file mode 100644
index 2463c16..0000000
--- a/templates/fr/help-printable.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/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="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
diff --git a/templates/fr/help-trailer.tmpl b/templates/fr/help-trailer.tmpl
deleted file mode 100644
index 4c1ebed..0000000
--- a/templates/fr/help-trailer.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/fr/job-cancel.tmpl b/templates/fr/job-cancel.tmpl
deleted file mode 100644
index ab54269..0000000
--- a/templates/fr/job-cancel.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Annuler la T&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; annul&eacute;e.
-
-</DIV>
diff --git a/templates/fr/job-hold.tmpl b/templates/fr/job-hold.tmpl
deleted file mode 100644
index 7c85916..0000000
--- a/templates/fr/job-hold.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Retenir la t&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; retenue.
-
-</DIV>
diff --git a/templates/fr/job-move.tmpl b/templates/fr/job-move.tmpl
deleted file mode 100644
index 4cca760..0000000
--- a/templates/fr/job-move.tmpl
+++ /dev/null
@@ -1,27 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
-
-<H2 CLASS="title">{job_id?Transf&eacute;rer la t&acirc;che {job_id}:Transf&eacute;rer toutes les t&acirc;ches}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nouvelle destination:</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="SUBMIT" VALUE="{job_id?Transf&eacute;rer la t&acirc;che:Transf&eacute;rer les t&acirc;ches}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-
-</DIV>
diff --git a/templates/fr/job-moved.tmpl b/templates/fr/job-moved.tmpl
deleted file mode 100644
index ba28d33..0000000
--- a/templates/fr/job-moved.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{job_id?Transf&eacute;rer la t&acirc;che {job_id}:Transf&eacute;rer toutes les t&acirc;ches}</H2>
-
-<P>{job_id?<A HREF="/jobs/{job_id}">Job {job_id}</A>:Toutes les t&acirc;ches} transf&eacute;r&eacute;e(s) vers
-<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/fr/job-release.tmpl b/templates/fr/job-release.tmpl
deleted file mode 100644
index 4bfc1b9..0000000
--- a/templates/fr/job-release.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Lib&eacute;rer la T&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; lib&eacute;r&eacute;e.
-
-</DIV>
diff --git a/templates/fr/job-restart.tmpl b/templates/fr/job-restart.tmpl
deleted file mode 100644
index 0858840..0000000
--- a/templates/fr/job-restart.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">R&eacute;imprimer la T&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; relanc&eacute;e.
-
-</DIV>
diff --git a/templates/fr/jobs-header.tmpl b/templates/fr/jobs-header.tmpl
deleted file mode 100644
index c863005..0000000
--- a/templates/fr/jobs-header.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Affichage des t&acirc;ches actives"></FORM>}
-{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Affichage des t&acirc;ches termin&eacute;es"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Affichage de toutes les t&acirc;ches"></FORM>}</DIV>
-
-<P ALIGN="CENTER">{total=0?Pas de t&acirc;che:Affichage de {#job_id} t&acirc;che{total>1?s:}} {?which_jobs=?active{total>1?s:}:{which_jobs=all?:termin&eacute;e{total>1?s:}}} {total=0?:sur {total}} .</P>
diff --git a/templates/fr/jobs.tmpl b/templates/fr/jobs.tmpl
deleted file mode 100644
index c760d76..0000000
--- a/templates/fr/jobs.tmpl
+++ /dev/null
@@ -1,36 +0,0 @@
-{#job_id=0?:
-<TABLE CLASS="list" SUMMARY="Listes des t&acirc;ches">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Nom</TH><TH>Utilisateur</TH><TH>Taille</TH><TH>Pages</TH><TH>&Eacute;tat</TH><TH>Contr&ocirc;le</TH></TR>
-</THEAD>
-<TBODY>
-{[job_id]
-<TR VALIGN="TOP">
-<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}{?phone? ({phone}):}&nbsp;</TD>
-<TD>{?job_name=?Inconnu:{job_name}}&nbsp;</TD>
-<TD>{?job_originating_user_name=?Withheld:{job_originating_user_name}}&nbsp;</TD>
-<TD>{job_k_octets}k&nbsp;</TD>
-<TD>{job_media_sheets_completed=0?Inconnu:{?job_media_sheets_completed}}&nbsp;</TD>
-<TD>{job_state=3?en attente depuis<BR>{time_at_creation}:{job_state=4?retenu depuis<BR>{time_at_creation}:
-{job_state=5?en cours d'impression depuis<BR>{time_at_processing}:{job_state=6?arr&ecirc;t&eacute;:
-{job_state=7?annul&eacute; &acirc;<BR>{time_at_completed}:{job_state=8?annul&eacute;:termin&eacute; &agrave;<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
-<EM>"{job_printer_state_message}"</EM>:}</TD>
-<TD>
-{job_preserved>0?{job_state>5?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}"><INPUT TYPE="SUBMIT" VALUE="R&eacute;imprimer la t&acirc;che"></FORM>:}:}
-{job_state=4?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Lib&eacute;rer la t&acirc;che"></FORM>:}
-{job_state=3?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Retenir la t&acirc;che"></FORM>:}
-{job_state<7?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Annuler la t&acirc;che"></FORM>
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Transf&eacute;rer la t&acirc;che"></FORM>:}
-&nbsp;</TD>
-</TR>
-}
-</TBODY>
-</TABLE>
-}
diff --git a/templates/fr/list-available-printers.tmpl b/templates/fr/list-available-printers.tmpl
deleted file mode 100644
index dcc9937..0000000
--- a/templates/fr/list-available-printers.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Imprimantes Disponibles</H2>
-
-{#device_uri=0?<P>Aucune imprimante trouv&eacute;e.</P>
-:<UL>{[device_uri]
-<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Ajouter cette imprimante"></FORM>
-{device_make_and_model} ({device_info})</LI>
-}</UL>}
-
-</DIV>
diff --git a/templates/fr/modify-class.tmpl b/templates/fr/modify-class.tmpl
deleted file mode 100644
index 791c560..0000000
--- a/templates/fr/modify-class.tmpl
+++ /dev/null
@@ -1,34 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier la Classe {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</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="SUBMIT" VALUE="Modifier la classe"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/fr/modify-printer.tmpl b/templates/fr/modify-printer.tmpl
deleted file mode 100644
index 03e1b66..0000000
--- a/templates/fr/modify-printer.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<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}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Description compr&eacute;hensible comme "HP LaserJet Recto/Verso")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Emplacement compr&eacute;hensible comme "Lab 1")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Partager cette imprimante</TD>
-</TR>
-<TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/fr/norestart.tmpl b/templates/fr/norestart.tmpl
deleted file mode 100644
index 95965c6..0000000
--- a/templates/fr/norestart.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier les Param&egrave;tres</H2>
-
-<P>Le serveur n'a pas &eacute;t&eacute; red&eacute;marr&eacute; car la configuration
-n'a pas &eacute;t&eacute; modifi&eacute;e...</P>
-
-</DIV>
diff --git a/templates/fr/option-boolean.tmpl b/templates/fr/option-boolean.tmpl
deleted file mode 100644
index e832ee1..0000000
--- a/templates/fr/option-boolean.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD>
-{[choices]<INPUT TYPE="RADIO" NAME="{keyword-1}" {choices={defchoice-1}?CHECKED:} VALUE="{choices}">{text}}
-</TD>
-</TR>
diff --git a/templates/fr/option-conflict.tmpl b/templates/fr/option-conflict.tmpl
deleted file mode 100644
index 7077aac..0000000
--- a/templates/fr/option-conflict.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<P><B>Erreur:</B> Les options suivantes sont incompatibles entre elles:</P>
-
-<UL>
-{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
-}</UL>
-
-<P>Veuillez modifier une ou plusieurs de ces options pour r&eacute;soudre les conflits.</P>
diff --git a/templates/fr/option-header.tmpl b/templates/fr/option-header.tmpl
deleted file mode 100644
index 464726a..0000000
--- a/templates/fr/option-header.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="tab" ID="{group_id}">
-
-<H3 ALIGN="CENTER">{group}</H3>
-
-<TABLE WIDTH="100%">
diff --git a/templates/fr/option-pickmany.tmpl b/templates/fr/option-pickmany.tmpl
deleted file mode 100644
index 0da75e5..0000000
--- a/templates/fr/option-pickmany.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT></TD>
-</TR>
diff --git a/templates/fr/option-pickone.tmpl b/templates/fr/option-pickone.tmpl
deleted file mode 100644
index 3e3deeb..0000000
--- a/templates/fr/option-pickone.tmpl
+++ /dev/null
@@ -1,18 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" ID="select-{keyword}" ONCHANGE="update_paramtable('{keyword}')">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT>
-{iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
-<TR><TH CLASS="sublabel">{paramtext}:</TH>
-<TD>{params=Units?<SELECT NAME="{keyword-1}.{params}">
-<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Points</OPTION>
-<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millim&eagrave;tres</OPTION>
-<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Centim&eagrave;tres</OPTION>
-<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Pouces</OPTION>
-<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Pieds</OPTION>
-<OPTION VALUE="m"{paramvalue=m? SELECTED:}>M&egrave;tres</OPTION>
-</SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword-1}.{params}" VALUE="{paramvalue}">}</TD></TR>
-}</TABLE>
-</TD>:}
-</TR>
diff --git a/templates/fr/option-trailer.tmpl b/templates/fr/option-trailer.tmpl
deleted file mode 100644
index ceff313..0000000
--- a/templates/fr/option-trailer.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-</TABLE>
-
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="D&eacute;finir les options par d&eacute;faut"></P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/pager.tmpl b/templates/fr/pager.tmpl
deleted file mode 100644
index c4e7ba5..0000000
--- a/templates/fr/pager.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<TABLE CLASS="inset" SUMMARY="Mise en Page">
-<TR>
- <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Montrer les pr&eacute;c&eacute;dentes"></FORM>:&nbsp;}</TD>
- <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Montrer les suivantes &#x25b6;"></FORM>:&nbsp;}</TD>
-</TR>
-</TABLE>
diff --git a/templates/fr/printer-accept.tmpl b/templates/fr/printer-accept.tmpl
deleted file mode 100644
index cc25a09..0000000
--- a/templates/fr/printer-accept.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Accepte les T&acirc;ches sur {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-accepte d&eacute;sormais les t&acirc;ches d'impression.</P>
-
-</DIV>
diff --git a/templates/fr/printer-added.tmpl b/templates/fr/printer-added.tmpl
deleted file mode 100644
index ce0a3b4..0000000
--- a/templates/fr/printer-added.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une imprimante</H2>
-
-<P>L'imprimante <A HREF="/printers/{printer_name}">{printer_name}</A> a &eacute;t&eacute; ajout&eacute;e
-avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/printer-configured.tmpl b/templates/fr/printer-configured.tmpl
deleted file mode 100644
index 79ccb15..0000000
--- a/templates/fr/printer-configured.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;finir les options par d&eacute;faut pour {printer_name}</H2>
-
-<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:l'imprimante <A HREF="/printers/{printer_name}">}{printer_name}</A>
- a &eacute;t&eacute; configur&eacute;e avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/printer-confirm.tmpl b/templates/fr/printer-confirm.tmpl
deleted file mode 100644
index 715ddd1..0000000
--- a/templates/fr/printer-confirm.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer l'imprimante {printer_name}</H2>
-
-<P><B>Warning:</B> Etes-vous s&ucirc;r(e) de vouloir supprimer l'imprimante
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Supprimer l'imprimante"></FORM></P>
-
-</DIV>
diff --git a/templates/fr/printer-default.tmpl b/templates/fr/printer-default.tmpl
deleted file mode 100644
index d7f3703..0000000
--- a/templates/fr/printer-default.tmpl
+++ /dev/null
@@ -1,13 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;finir {is_class?la classe:l'imprimante} {printer_name} comme imprimante par d&eacute;faut</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-a &eacute;t&eacute; d&eacute;finie comme imprimante par d&eacute;faut du serveur.</P>
-
-<BLOCKQUOTE><B>Note:</B> Tout param&egrave;tre utilisateur d&eacute;fini via la commande
-<TT>lpoptions</TT> sera prioritaire sur le param&egrave;tre d&eacute;fini i&ccedil;i.
-</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/fr/printer-deleted.tmpl b/templates/fr/printer-deleted.tmpl
deleted file mode 100644
index 43af955..0000000
--- a/templates/fr/printer-deleted.tmpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer l'imprimante {printer_name}</H2>
-
-<P>L'imprimante {printer_name} a &eacute;t&eacute; supprim&eacute;e avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/printer-jobs-header.tmpl b/templates/fr/printer-jobs-header.tmpl
deleted file mode 100644
index 551f47e..0000000
--- a/templates/fr/printer-jobs-header.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">T&acirc;ches</H3>
-</DIV>
diff --git a/templates/fr/printer-modified.tmpl b/templates/fr/printer-modified.tmpl
deleted file mode 100644
index db962dc..0000000
--- a/templates/fr/printer-modified.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier l'Imprimante {printer_name}</H2>
-
-<P>L'imprimante <A HREF="/printers/{printer_name}">{printer_name}</A> a &eacute;t&eacute;
-modifi&eacute;e avec succ&egrave;s.
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/printer-purge.tmpl b/templates/fr/printer-purge.tmpl
deleted file mode 100644
index ce167b9..0000000
--- a/templates/fr/printer-purge.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Purger les T&acirc;ches sur {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>Toutes les t&acirc;ches de {is_class?la classe:l'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ont &eacute;t&eacute; purg&eacute;es.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/printer-reject.tmpl b/templates/fr/printer-reject.tmpl
deleted file mode 100644
index 36edcb8..0000000
--- a/templates/fr/printer-reject.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Rejeter les T&acirc;ches sur {is_class?Classe:Imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-n'accepte plus les t&acirc;ches d'impression.</P>
-
-</DIV>
diff --git a/templates/fr/printer-start.tmpl b/templates/fr/printer-start.tmpl
deleted file mode 100644
index f476c62..0000000
--- a/templates/fr/printer-start.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;marrer {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-a &eacute;t&eacute; d&eacute;marr&eacute;e.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/printer-stop.tmpl b/templates/fr/printer-stop.tmpl
deleted file mode 100644
index eb36fb5..0000000
--- a/templates/fr/printer-stop.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Arr&ecirc;ter {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-a &eacute;t&eacute; arr&ecirc;t&eacute;e.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/printer.tmpl b/templates/fr/printer.tmpl
deleted file mode 100644
index b5e89f0..0000000
--- a/templates/fr/printer.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Inoccup&eacute;e:{printer_state=4?En cours d'impression:En pause}},
-{printer_is_accepting_jobs=0?Rejette les t&acirc;ches:Accepte les t&acirc;ches},
-{server_is_sharing_printers=0?Non:{printer_is_shared=0?Non:}} Partag&eacute;e{default_name={printer_name}?, Imprimante par d&eacute;faut:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Maintenance</OPTION>
-<OPTION VALUE="print-test-page">Imprimer une page de test</OPTION>
-{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Nettoyer les t&ecirc;tes d'impression</OPTION>:}
-{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Imprimer la page de test de l'imprimante</OPTION>:}
-{printer_state=5?<OPTION VALUE="start-printer">D&eacute;marrer l'imprimante</OPTION>:<OPTION VALUE="stop-printer">Arr&ecirc;ter l'imprimante</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepter les t&acirc;ches</OPTION>:<OPTION VALUE="reject-jobs">Rejeter les t&acirc;ches</OPTION>}
-<OPTION VALUE="move-jobs">Transf&eacute;rer toutes les t&acirc;ches</OPTION>
-<OPTION VALUE="purge-jobs">Purger toutes les t&acirc;ches</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administration</OPTION>
-<OPTION VALUE="modify-printer">Modifier l'imprimante</OPTION>
-<OPTION VALUE="delete-printer">Supprimer l'imprimante</OPTION>
-<OPTION VALUE="set-printer-options">D&eacute;finir les options de l'imprimante</OPTION>
-<OPTION VALUE="set-as-default">D&eacute;finir par d&eacute;faut</OPTION>
-<OPTION VALUE="set-allowed-users">D&eacute;finir les autorisations</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Description:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Emplacement:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Pilote:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Connexion:</TH><TD>{device_uri}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">D&eacute;fauts:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:inconnu}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV> \ No newline at end of file
diff --git a/templates/fr/printers-header.tmpl b/templates/fr/printers-header.tmpl
deleted file mode 100644
index fe6753f..0000000
--- a/templates/fr/printers-header.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Pas d'imprimante:Affichage de {#printer_name} sur {total} imprimante{total>1?s:}}.</P>
diff --git a/templates/fr/printers.tmpl b/templates/fr/printers.tmpl
deleted file mode 100644
index 2abc59c..0000000
--- a/templates/fr/printers.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Liste des Imprimantes">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom de la file <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom de la file <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Description</TH><TH>Emplacement</TH><TH>Marque et Mod&egrave;le</TH><TH>&Eacute;tat</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Inoccup&eacute;e:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/fr/restart.tmpl b/templates/fr/restart.tmpl
deleted file mode 100644
index da164b7..0000000
--- a/templates/fr/restart.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier les Param&egrave;tres</H2>
-
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Veuillez patienter pendant que le serveur red&eacute;marre...</P>
-
-</DIV>
diff --git a/templates/fr/samba-export.tmpl b/templates/fr/samba-export.tmpl
deleted file mode 100644
index 94ff4fd..0000000
--- a/templates/fr/samba-export.tmpl
+++ /dev/null
@@ -1,54 +0,0 @@
-<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="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
-
-<H2 CLASS="title">Exporter les Imprimantes vers Samba</H2>
-
-{error?<P>Impossible d'exporter les imprimantes vers Samba\:</P>
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-<P>Consulter le fichier <A HREF="/admin/log/error_log"
-TARGET="_blank">error_log</A> pour plus d'informations.</P>:
-<P>Cette page vous permet d'exporter des imprimantes vers Samba de sorte que des
-clients Windows puissent y acc&eacute;der via l'ic&oacirc;ne <VAR>Voisinage r&eacute;seau</VAR> ou
-<VAR>Favoris r&eacute;seau</VAR> du bureau. Vous devez au pr&eacute;alable installer les
-pilotes Windows d'imprimante PostScript : cf. la page <i>man</i> <A
-HREF="/help/man-cupsaddsmb.html"
-TARGET="_blank">cupsaddsmb(8)</A>.</P>}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Imprimantes:</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()"> Exporter toutes les imprimantes
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Utilisateur Samba:</TH>
-<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (required)</TD>
-</TR>
-<TR>
-<TH CLASS="label">Mot de passe Samba:</TH>
-<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (required)</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Exporter les imprimantes vers Samba"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/fr/samba-exported.tmpl b/templates/fr/samba-exported.tmpl
deleted file mode 100644
index d4ad778..0000000
--- a/templates/fr/samba-exported.tmpl
+++ /dev/null
@@ -1 +0,0 @@
-<P>Les imprimantes ont &eacute;t&eacute; export&eacute;es vers Samba avec succ&egrave;s.</P>
diff --git a/templates/fr/search.tmpl b/templates/fr/search.tmpl
deleted file mode 100644
index 50b1b4e..0000000
--- a/templates/fr/search.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<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>Rechercher dans
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?les classes:{SECTION=jobs?les t&acirc;ches:les imprimantes}}}:</B>
-<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
-TYPE="SUBMIT" VALUE="Rechercher"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Vider"></P>
-
-</FORM>
diff --git a/templates/fr/set-printer-options-header.tmpl b/templates/fr/set-printer-options-header.tmpl
deleted file mode 100644
index 12e0b1d..0000000
--- a/templates/fr/set-printer-options-header.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;finir les Options pour {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Interroger l'imprimante pour les options par d&eacute;faut">:}
-
-<SCRIPT TYPE="text/javascript"><!--
-function update_paramtable(option)
-{
- var cb = document.getElementById("select-" + option)
- var paramstable = document.getElementById(option + "-params");
- if (cb.value == "Custom")
- paramstable.style.display = "table";
- else
- paramstable.style.display = "none";
-}
---></SCRIPT>
-
-<H3 CLASS="title">{[group_id]
-<A HREF="#{group_id}">{group}</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</H3>
-
-<DIV CLASS="tabs">
diff --git a/templates/fr/subscription-added.tmpl b/templates/fr/subscription-added.tmpl
deleted file mode 100644
index 54ffe8f..0000000
--- a/templates/fr/subscription-added.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>L'abonnement au flux RSS {subscription_name} a &eacute;t&eacute; ajout&eacute; avec succ&egrave;s.</P>
-
-</DIV>
diff --git a/templates/fr/subscription-canceled.tmpl b/templates/fr/subscription-canceled.tmpl
deleted file mode 100644
index 54fbcef..0000000
--- a/templates/fr/subscription-canceled.tmpl
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>L'abonnement #{notify_subscription_id} au flux RSS a &eacute;t&eacute; annul&eacute;.</P>
-
-</DIV>
diff --git a/templates/fr/test-page.tmpl b/templates/fr/test-page.tmpl
deleted file mode 100644
index 8be7c6f..0000000
--- a/templates/fr/test-page.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Imprimer une Page de Test sur {printer_name}</H2>
-
-<P>La page de test a &eacute;t&eacute; envoy&eacute;e; l'identifiant de la t&acirc;che est <A HREF="/{SECTION}/{printer_name}">
-{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/fr/trailer.tmpl b/templates/fr/trailer.tmpl
deleted file mode 100644
index f3a46c2..0000000
--- a/templates/fr/trailer.tmpl
+++ /dev/null
@@ -1,8 +0,0 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS et le logo CUPS sont des marques d&eacute;pos&eacute;es de
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS est sous copyright 2007-2013 Apple
-Inc. Tous droits r&eacute;serv&eacute;s.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/templates/fr/users.tmpl b/templates/fr/users.tmpl
deleted file mode 100644
index cb9a052..0000000
--- a/templates/fr/users.tmpl
+++ /dev/null
@@ -1,30 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<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">Utilisateurs autoris&eacute;s &agrave; utiliser {printer_name}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Utilisateurs:</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:}>Autoriser ces utilisateurs &agrave; imprimer
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Emp&ecirc;cher ces utilisateurs d'imprimer
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>
-<INPUT TYPE="SUBMIT" VALUE="D&eacute;finir les autorisations">
-</TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/header.tmpl.in b/templates/header.tmpl.in
index a383725..a4beb53 100644
--- a/templates/header.tmpl.in
+++ b/templates/header.tmpl.in
@@ -1,29 +1,43 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Home&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Online&nbsp;Help&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Jobs&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Printers&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <style>html{display:none;}</style>
+ <script type="text/javascript"><!--
+ /* Only display document if we are not in a frame... */
+ if (self == top) {
+ document.documentElement.style.display = 'block';
+ } else {
+ top.location = self.location;
+ }
+
+ /* Show an error if cookies are disabled */
+ function check_cookies() {
+ if (!navigator.cookieEnabled) {
+ document.getElementById('body').innerHTML = 'This page uses cookies to prevent common cross-site attacks. Please enable cookies in your browser.';
+ }
+ }
+ --></SCRIPT>
+ <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body onload="check_cookies();">
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a href="/">Home</a></li>
+ <li><a {SECTION=admin?class="active" :}href="/admin">Administration</a></li>
+ <li><a {SECTION=classes?class="active" :}href="/classes/">Classes</a></li>
+ <li><a {SECTION=help?class="active" :}href="/help/">Help</a></li>
+ <li><a {SECTION=jobs?class="active" :}href="/jobs/">Jobs</a></li>
+ <li><a {SECTION=printers?class="active" :}href="/printers/">Printers</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>{title}</h1>
diff --git a/templates/help-header.tmpl b/templates/help-header.tmpl
index 09741b5..86343e7 100644
--- a/templates/help-header.tmpl
+++ b/templates/help-header.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
@@ -31,21 +30,12 @@ AUTOSAVE="org.cups.help" RESULTS="20">
{QTEXT?</UL>:}
:<P>No matches found.</P>}
<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="View Printable Version"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="View Printable Version"></FORM>:
<H1>Online Help</H1>
-<P>This is the CUPS online help interface. Enter search words
-above or click on any of the documentation links to display
-online help information.</P>
+<P>This is the CUPS online help interface. Enter search words above or click on any of the documentation links to display online help information.</P>
-<P>If you are new to CUPS, read the "<a
-href="/help/overview.html">Overview of CUPS</a>" page. Veteran users
-should read the "<a href="/help/whatsnew.html">What's New in CUPS
-1.6</a>" page.</P>
+<P>If you are new to CUPS, read the "<a href="/help/overview.html">Overview of CUPS</a>" page.</P>
-<P>The <A HREF="http://www.cups.org/">CUPS home page</A> also
-provides many resources including user discussion forums, answers
-to frequently-asked questions, and a form for submitting bug
-reports and feature requests.</P>}
+<P>The <A HREF="http://www.cups.org/">CUPS home page</A> also provides many resources including user discussion forums, answers to frequently-asked questions, and a form for submitting bug reports and feature requests.</P>}
diff --git a/templates/help-trailer.tmpl b/templates/help-trailer.tmpl
index 4c1ebed..e69de29 100644
--- a/templates/help-trailer.tmpl
+++ b/templates/help-trailer.tmpl
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/ja/add-class.tmpl b/templates/ja/add-class.tmpl
index b4e9166..7dfa642 100644
--- a/templates/ja/add-class.tmpl
+++ b/templates/ja/add-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">クラスã®è¿½åŠ </H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -15,12 +13,12 @@
<TR>
<TH CLASS="label">説明:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("HP LaserJet with Duplexer" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„説明)</SMALL></TD>
+<SMALL>("両é¢ã‚ã‚ŠHP LaserJet" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„説明)</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">場所:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("Lab 1" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„場所)</SMALL></TD>
+<SMALL>("研究室1" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„場所)</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">メンãƒãƒ¼:</TH>
@@ -37,4 +35,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/add-printer.tmpl b/templates/ja/add-printer.tmpl
index 00fab5c..13d5e20 100644
--- a/templates/ja/add-printer.tmpl
+++ b/templates/ja/add-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">æ–°ã—ã„プリンターã®è¿½åŠ </H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -21,12 +19,12 @@
<TR>
<TH CLASS="label">説明:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>("HP LaserJet with Duplexer" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„説明)</SMALL></TD>
+<SMALL>("両é¢ã‚ã‚ŠHP LaserJet" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„説明)</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">場所:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>("Lab 1" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„場所)</SMALL></TD>
+<SMALL>("研究室1" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„場所)</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">接続:</TH>
@@ -44,4 +42,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/admin.tmpl b/templates/ja/admin.tmpl
index 53cb2da..13d6f13 100644
--- a/templates/ja/admin.tmpl
+++ b/templates/ja/admin.tmpl
@@ -1,102 +1,97 @@
-<TABLE CLASS="indent" SUMMARY="管ç†è€…タスク">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">プリンター</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="プリンターã®è¿½åŠ "></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="æ–°ã—ã„プリンターã®æ¤œç´¢"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="プリンターã®ç®¡ç†"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="プリンターを Samba ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"></FORM>:}
-</P>
-
-<H2 CLASS="title">クラス</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="クラスã®è¿½åŠ "></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="クラスã®ç®¡ç†"></FORM>
-</P>
-
-<H2 CLASS="title">ジョブ</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ジョブã®ç®¡ç†"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">サーãƒãƒ¼</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="設定ファイルã®ç·¨é›†"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクセスログã®è¡¨ç¤º"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="エラーログã®è¡¨ç¤º"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ページログã®è¡¨ç¤º"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>サーãƒãƒ¼è¨­å®š\:</B></P>
-
-<P><A HREF="/admin/">詳細 <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«æŽ¥ç¶šã•ã‚Œã¦ã„るプリンターを共有<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大クライアント数\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターãƒãƒƒãƒˆã‹ã‚‰ã®å°åˆ·ã‚’許å¯<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> ウェブインターフェイスを公開<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管ç†ã‚’許å¯<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos èªè¨¼ã‚’使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚‚ジョブã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚’許å¯<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> ジョブã®å±¥æ­´ã‚’ä¿å­˜<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ジョブ数 (0 ã¯ç„¡åˆ¶é™)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;メタデータをä¿æŒ\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ドキュメントをä¿æŒ\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングã®ãŸã‚ã«ãƒ‡ãƒãƒƒã‚°æƒ…報をä¿å­˜<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ログファイルサイズ\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>サーãƒãƒ¼è¨­å®š:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">詳細 <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«æŽ¥ç¶šã•ã‚Œã¦ã„るプリンターを共有<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターãƒãƒƒãƒˆã‹ã‚‰ã®å°åˆ·ã‚’許å¯<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管ç†ã‚’許å¯<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos èªè¨¼ã‚’使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚‚ジョブã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚’許å¯<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングã®ãŸã‚ã«ãƒ‡ãƒãƒƒã‚°æƒ…報をä¿å­˜</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="設定ã®å¤‰æ›´"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">RSS 購読</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS 購読ã®è¿½åŠ "></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS 購読">
-<THEAD><TR><TH>åå‰</TH><TH>イベント</TH><TH>キューå</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS 購読ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:ã™ã¹ã¦ã®ã‚­ãƒ¥ãƒ¼}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+ <div class="halves">
+ <H2 CLASS="title">プリンター</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="プリンターã®è¿½åŠ "></FORM>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="æ–°ã—ã„プリンターã®æ¤œç´¢"></FORM>
+ <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="プリンターã®ç®¡ç†"></FORM>
+ {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="プリンターを Samba ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"></FORM>:}
+ </P>
+
+ <H2 CLASS="title">クラス</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="クラスã®è¿½åŠ "></FORM>
+ <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="クラスã®ç®¡ç†"></FORM>
+ </P>
+
+ <H2 CLASS="title">ジョブ</H2>
+
+ <P>
+ <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ジョブã®ç®¡ç†"></FORM>
+ </P>
+ </div>
+ <div class="halves">
+ <H2 CLASS="title">サーãƒãƒ¼</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="設定ファイルã®ç·¨é›†"></FORM>
+ <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクセスログã®è¡¨ç¤º"></FORM>
+ <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="エラーログã®è¡¨ç¤º"></FORM>
+ <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ページログã®è¡¨ç¤º"></FORM>
+ </P>
+
+ {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+ <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+ <FORM METHOD="POST" ACTION="/admin">
+ <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+ {ADVANCEDSETTINGS?<P><B>サーãƒãƒ¼è¨­å®š\:</B></P>
+
+ <P><A HREF="/admin/">詳細 <SMALL>&#x25bc;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«æŽ¥ç¶šã•ã‚Œã¦ã„るプリンターを共有<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大クライアント数\:
+ <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターãƒãƒƒãƒˆã‹ã‚‰ã®å°åˆ·ã‚’許å¯<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> ウェブインターフェイスを公開<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管ç†ã‚’許å¯<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos èªè¨¼ã‚’使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚‚ジョブã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚’許å¯<BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> ジョブã®å±¥æ­´ã‚’ä¿å­˜<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ジョブ数 (0 ã¯ç„¡åˆ¶é™)\:
+ <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;メタデータをä¿æŒ\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ドキュメントをä¿æŒ\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングã®ãŸã‚ã«ãƒ‡ãƒãƒƒã‚°æƒ…報をä¿å­˜<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ログファイルサイズ\:
+ <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+ :<P><B>サーãƒãƒ¼è¨­å®š:</B></P>
+
+ <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">詳細 <SMALL>&#x25b6;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«æŽ¥ç¶šã•ã‚Œã¦ã„るプリンターを共有<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターãƒãƒƒãƒˆã‹ã‚‰ã®å°åˆ·ã‚’許å¯<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管ç†ã‚’許å¯<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos èªè¨¼ã‚’使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚‚ジョブã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚’許å¯<BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングã®ãŸã‚ã«ãƒ‡ãƒãƒƒã‚°æƒ…報をä¿å­˜</P>
+
+ }
+ <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="設定ã®å¤‰æ›´"></P>
+
+ </FORM>}
+ </div>
+</div>
+
+<div class="row">
+ <H2 CLASS="title">RSS 購読</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS 購読ã®è¿½åŠ "></FORM>
+ </P>
+
+ {notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS 購読">
+ <THEAD><TR><TH>åå‰</TH><TH>イベント</TH><TH>キューå</TH></TR></THEAD>
+ <TBODY>{[notify_subscription_id]
+ <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS 購読ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:ã™ã¹ã¦ã®ã‚­ãƒ¥ãƒ¼}</TD></TR>}
+ </TBODY>
+ </TABLE>:}
+</div> \ No newline at end of file
diff --git a/templates/ja/choose-device.tmpl b/templates/ja/choose-device.tmpl
index 83b1c6a..3a4fe74 100644
--- a/templates/ja/choose-device.tmpl
+++ b/templates/ja/choose-device.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?{printer_name} ã®å¤‰æ›´:プリンターã®è¿½åŠ }</H2>
{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
@@ -49,5 +47,3 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
ALT="Busy Indicator"> プリンターを探ã—ã¦ã„ã¾ã™...</P>}
-
-</DIV>
diff --git a/templates/ja/choose-make.tmpl b/templates/ja/choose-make.tmpl
index 7d2d923..eacc7d5 100644
--- a/templates/ja/choose-make.tmpl
+++ b/templates/ja/choose-make.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?{printer_name}ã®å¤‰æ›´:プリンターã®è¿½åŠ }</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/choose-model.tmpl b/templates/ja/choose-model.tmpl
index e82cece..daf1375 100644
--- a/templates/ja/choose-model.tmpl
+++ b/templates/ja/choose-model.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?{printer_name}ã®å¤‰æ›´:プリンターã®è¿½åŠ }</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/choose-serial.tmpl b/templates/ja/choose-serial.tmpl
index 924b84a..48b4a66 100644
--- a/templates/ja/choose-serial.tmpl
+++ b/templates/ja/choose-serial.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?{printer_name}ã®å¤‰æ›´:プリンターã®è¿½åŠ }</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -49,4 +47,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/choose-uri.tmpl b/templates/ja/choose-uri.tmpl
index 2c687be..cf44206 100644
--- a/templates/ja/choose-uri.tmpl
+++ b/templates/ja/choose-uri.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?{printer_name}ã®å¤‰æ›´:プリンターã®è¿½åŠ }</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -40,4 +38,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/class-added.tmpl b/templates/ja/class-added.tmpl
index 284aa9f..f444cf6 100644
--- a/templates/ja/class-added.tmpl
+++ b/templates/ja/class-added.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">クラスã®è¿½åŠ </H2>
<P>クラス <A HREF="/classes/{printer_name}">{printer_name}</A> ã¯æ­£ã—ã追加ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/class-confirm.tmpl b/templates/ja/class-confirm.tmpl
index 6ab315d..c275afa 100644
--- a/templates/ja/class-confirm.tmpl
+++ b/templates/ja/class-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">クラス {printer_name} ã®å‰Šé™¤</H2>
<P><B>警告:</B> 本当ã«ã‚¯ãƒ©ã‚¹
{printer_name} を削除ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="クラスã®å‰Šé™¤"></FORM></P>
-
-</DIV>
diff --git a/templates/ja/class-deleted.tmpl b/templates/ja/class-deleted.tmpl
index 6941321..be9b5e8 100644
--- a/templates/ja/class-deleted.tmpl
+++ b/templates/ja/class-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">クラス {printer_name} ã®å‰Šé™¤</H2>
<P>クラス {printer_name} ã¯æ­£ã—ã削除ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/class-jobs-header.tmpl b/templates/ja/class-jobs-header.tmpl
index 1d5d887..d12840e 100644
--- a/templates/ja/class-jobs-header.tmpl
+++ b/templates/ja/class-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">ジョブ</H3>
-</DIV>
diff --git a/templates/ja/class-modified.tmpl b/templates/ja/class-modified.tmpl
index be65f13..6c9256b 100644
--- a/templates/ja/class-modified.tmpl
+++ b/templates/ja/class-modified.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">クラス {printer_name} ã®å¤‰æ›´</H2>
<P>クラス <A HREF="/classes/{printer_name}">{printer_name}</A> ã¯æ­£ã—ã変更ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/class.tmpl b/templates/ja/class.tmpl
index b71ea7e..a5becb6 100644
--- a/templates/ja/class.tmpl
+++ b/templates/ja/class.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
({printer_state=3?待機中:{printer_state=4?処ç†ä¸­:åœæ­¢}},
{printer_is_accepting_jobs=0?ジョブを拒å¦ä¸­:ジョブをå—ã‘付ã‘中},
@@ -37,8 +36,6 @@
<TR><TH ALIGN="RIGHT" VALIGN="TOP">場所:</TH><TD>{printer_location}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">メンãƒãƒ¼:</TH><TD>{?member_uris=?ãªã—:{member_uris}}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">デフォルト:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:unknown}
+media={media_default?{media_default}:ä¸æ˜Ž}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV>
diff --git a/templates/ja/command.tmpl b/templates/ja/command.tmpl
index f892335..0aa3a39 100644
--- a/templates/ja/command.tmpl
+++ b/templates/ja/command.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{printer_name} ã® {title}</H2>
<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
@@ -8,5 +6,3 @@ ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }プリンターコマンドジョブ
{job_state=5?処ç†ä¸­:{job_state=6?åœæ­¢ä¸­:
{job_state=7?キャンセル:{job_state=8?破棄:完了}}}}}}{job_state=9?:{job_printer_state_message?,
<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/ja/edit-config.tmpl b/templates/ja/edit-config.tmpl
index dfd7dc9..b2a4b8f 100644
--- a/templates/ja/edit-config.tmpl
+++ b/templates/ja/edit-config.tmpl
@@ -5,9 +5,7 @@ function reset_config()
}
</SCRIPT>
-<DIV CLASS="indent">
-
-<H2 CLASS="title">設定ファイルã®è¨­å®š</H2>
+<H2 CLASS="title">設定ファイルã®ç·¨é›†</H2>
<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -20,5 +18,3 @@ function reset_config()
onClick="reset_config();"></P>
</FORM>
-
-</DIV>
diff --git a/templates/ja/error-op.tmpl b/templates/ja/error-op.tmpl
index 89ffbae..b5e94fb 100644
--- a/templates/ja/error-op.tmpl
+++ b/templates/ja/error-op.tmpl
@@ -1,9 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} ã®ã‚¨ãƒ©ãƒ¼</H2>
<P>エラー:</P>
<BLOCKQUOTE>"{op}" ã¯æœªçŸ¥ã®æ“作ã§ã™!</BLOCKQUOTE>
-</DIV>
diff --git a/templates/ja/error.tmpl b/templates/ja/error.tmpl
index d67ce36..0ed35fc 100644
--- a/templates/ja/error.tmpl
+++ b/templates/ja/error.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} ã®ã‚¨ãƒ©ãƒ¼</H2>
<P>{?message?{message}:エラー}:</P>
<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ja/header.tmpl.in b/templates/ja/header.tmpl.in
index 71a39f1..86298ac 100644
--- a/templates/ja/header.tmpl.in
+++ b/templates/ja/header.tmpl.in
@@ -1,29 +1,35 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;ホーム&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;管ç†&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;クラス&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;ヘルプ&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;ジョブ&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;プリンター&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <script type="text/javascript"><!--
+ /* Show an error if cookies are disabled */
+ function check_cookies() {
+ if (!navigator.cookieEnabled) {
+ document.getElementById('body').innerHTML = 'This page uses cookies to prevent common cross-site attacks. Please enable cookies in your browser.';
+ }
+ }
+ --></SCRIPT>
+ <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body onload="check_cookies();">
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a href="/">ホーム</a></li>
+ <li><a {SECTION=admin?class="active" :}href="/admin">管ç†</a></li>
+ <li><a {SECTION=classes?class="active" :}href="/classes/">クラス</a></li>
+ <li><a {SECTION=help?class="active" :}href="/help/">ヘルプ</a></li>
+ <li><a {SECTION=jobs?class="active" :}href="/jobs/">ジョブ</a></li>
+ <li><a {SECTION=printers?class="active" :}href="/printers/">プリンター</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>{title}</h1>
diff --git a/templates/ja/help-header.tmpl b/templates/ja/help-header.tmpl
index 4a1f0ff..118d15c 100644
--- a/templates/ja/help-header.tmpl
+++ b/templates/ja/help-header.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
@@ -31,8 +30,7 @@ AUTOSAVE="org.cups.help" RESULTS="20">
{QTEXT?</UL>:}
:<P>マッãƒã™ã‚‹ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚</P>}
<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="å°åˆ·å¯èƒ½ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®è¡¨ç¤º"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="å°åˆ·å¯èƒ½ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®è¡¨ç¤º"></FORM>:
<H1>オンラインヘルプ</H1>
@@ -41,9 +39,7 @@ AUTOSAVE="org.cups.help" RESULTS="20">
ドキュメントリンクã®ã„ãšã‚Œã‹ã‚’クリックã—ã¦ãã ã•ã„。</P>
<P>ã‚ãªãŸãŒ CUPS ã«ã¤ã„ã¦åˆå¿ƒè€…ãªã‚‰ã€ "<a
-href="/help/overview.html">CUPS ã®æ¦‚è¦</a>" ページを読んã§ãã ã•ã„。
-上級ユーザーã¯ã€ "<a href="/help/whatsnew.html">CUPS 1.6 ã®æ–°æ©Ÿèƒ½</a>"
-ページを読むã¹ãã§ã™ã€‚</P>
+href="/help/overview.html">CUPS ã®æ¦‚è¦</a>" ページを読んã§ãã ã•ã„。</P>
<P><A HREF="http://www.cups.org/">CUPS ホームページ</A> ã§ã‚‚ã€
ユーザーディスカッションフォーラムã€FAQã€
diff --git a/templates/ja/help-trailer.tmpl b/templates/ja/help-trailer.tmpl
index 4c1ebed..e69de29 100644
--- a/templates/ja/help-trailer.tmpl
+++ b/templates/ja/help-trailer.tmpl
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/ja/job-cancel.tmpl b/templates/ja/job-cancel.tmpl
index aa10295..c6fd085 100644
--- a/templates/ja/job-cancel.tmpl
+++ b/templates/ja/job-cancel.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ジョブ {job_id} ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«</H2>
<P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/job-hold.tmpl b/templates/ja/job-hold.tmpl
index baae237..014a48f 100644
--- a/templates/ja/job-hold.tmpl
+++ b/templates/ja/job-hold.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ジョブ {job_id} ã®ä¿ç•™</H2>
<P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> ã¯å°åˆ·ã‚’ä¿ç•™ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/job-move.tmpl b/templates/ja/job-move.tmpl
index 54da7e0..ce3072e 100644
--- a/templates/ja/job-move.tmpl
+++ b/templates/ja/job-move.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
</TABLE>
</FORM>
-
-</DIV>
diff --git a/templates/ja/job-moved.tmpl b/templates/ja/job-moved.tmpl
index c415359..b76b64d 100644
--- a/templates/ja/job-moved.tmpl
+++ b/templates/ja/job-moved.tmpl
@@ -1,8 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{job_id?ジョブ {job_id} ã®ç§»å‹•:ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–ã®ç§»å‹•}</H2>
<P>{job_id?<A HREF="/jobs/{job_id}">ジョブ {job_id}</A>:ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–} ã¯
<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A> ã«ç§»å‹•ã—ã¾ã—ãŸã€‚</P>
-</DIV>
diff --git a/templates/ja/job-release.tmpl b/templates/ja/job-release.tmpl
index fd9f89d..025571f 100644
--- a/templates/ja/job-release.tmpl
+++ b/templates/ja/job-release.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ジョブ {job_id} ã®è§£æ”¾</H2>
<P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> ã¯å°åˆ·ã‹ã‚‰è§£æ”¾ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/job-restart.tmpl b/templates/ja/job-restart.tmpl
index 493a4ac..8b8c0f6 100644
--- a/templates/ja/job-restart.tmpl
+++ b/templates/ja/job-restart.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ジョブ {job_id} ã®å†å°åˆ·</H2>
<P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> ã¯å†å°åˆ·ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/jobs-header.tmpl b/templates/ja/jobs-header.tmpl
index 8c1c3a5..20b544a 100644
--- a/templates/ja/jobs-header.tmpl
+++ b/templates/ja/jobs-header.tmpl
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクティブãªã‚¸ãƒ§ãƒ–を表示"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクティブãªã‚¸ãƒ§ãƒ–を表示"></FORM>}
{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="完了ã—ãŸã‚¸ãƒ§ãƒ–を表示"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を表示"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を表示"></FORM>}
<P ALIGN="CENTER">{total=0?ジョブã¯ã‚ã‚Šã¾ã›ã‚“:{total} 個ã®{?which_jobs=?アクティブãª:{which_jobs=all?:完了ã—ãŸ}}ジョブã®ã†ã¡ {#job_id} 個を表示中}}。</P>
diff --git a/templates/ja/list-available-printers.tmpl b/templates/ja/list-available-printers.tmpl
index f70b5aa..e84227d 100644
--- a/templates/ja/list-available-printers.tmpl
+++ b/templates/ja/list-available-printers.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">利用å¯èƒ½ãªãƒ—リンター</H2>
{#device_uri=0?<P>プリンターãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</P>
@@ -7,5 +5,3 @@
<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="ã“ã®ãƒ—リンターを追加"></FORM>
{device_make_and_model} ({device_info})</LI>
}</UL>}
-
-</DIV>
diff --git a/templates/ja/modify-class.tmpl b/templates/ja/modify-class.tmpl
index a41010f..f552bdf 100644
--- a/templates/ja/modify-class.tmpl
+++ b/templates/ja/modify-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">クラス {printer_name} ã®å¤‰æ›´</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ja/modify-printer.tmpl b/templates/ja/modify-printer.tmpl
index 009af6d..bb9aeac 100644
--- a/templates/ja/modify-printer.tmpl
+++ b/templates/ja/modify-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{printer_name} ã®å¤‰æ›´</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -15,12 +13,12 @@
<TR>
<TH CLASS="label">説明:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("HP LaserJet with Duplexer" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„説明)</SMALL></TD>
+<SMALL>("両é¢ã‚ã‚ŠHP LaserJet" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„説明)</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">場所:</TH>
<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("Lab 1" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„場所)</SMALL></TD>
+<SMALL>("研究室1" ã®ã‚ˆã†ã«äººãŒèª­ã¿ã‚„ã™ã„場所)</SMALL></TD>
</TR>
<TR>
<TH CLASS="label">接続:</TH>
@@ -39,4 +37,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/ja/norestart.tmpl b/templates/ja/norestart.tmpl
index 4740433..7007f3b 100644
--- a/templates/ja/norestart.tmpl
+++ b/templates/ja/norestart.tmpl
@@ -1,7 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">設定変更</H2>
<P>設定ã«ä½•ã‚‚変更ãŒè¡Œã‚ã‚Œãªã‹ã£ãŸãŸã‚ã€ã‚µãƒ¼ãƒãƒ¼ã¯å†èµ·å‹•ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ...</P>
-</DIV>
diff --git a/templates/ja/printer-accept.tmpl b/templates/ja/printer-accept.tmpl
index f13c662..6a97d85 100644
--- a/templates/ja/printer-accept.tmpl
+++ b/templates/ja/printer-accept.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} ã®ã‚¸ãƒ§ãƒ–ã®å—ã‘付ã‘</H2>
<P>{is_class?クラス:プリンター} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ã¯ã‚¸ãƒ§ãƒ–ã‚’å—ã‘付ã‘るよã†ã«ãªã‚Šã¾ã—ãŸã€‚</P>
-
-</DIV>
diff --git a/templates/ja/printer-added.tmpl b/templates/ja/printer-added.tmpl
index c07a832..be475f2 100644
--- a/templates/ja/printer-added.tmpl
+++ b/templates/ja/printer-added.tmpl
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">プリンターã®è¿½åŠ </H2>
<P>プリンター <A HREF="/printers/{printer_name}">{printer_name}</A> ã¯æ­£ã—ã追加ã•ã‚Œã¾ã—ãŸã€‚
-</DIV>
+
diff --git a/templates/ja/printer-cancel-jobs.tmpl b/templates/ja/printer-cancel-jobs.tmpl
new file mode 100644
index 0000000..f6a1598
--- /dev/null
+++ b/templates/ja/printer-cancel-jobs.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Cancel Jobs On {is_class?クラス:プリンター} {printer_name} ã®ã‚¸ãƒ§ãƒ–ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«</H2>
+
+<P>{is_class?クラス:プリンター} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+ã®ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸã€‚</P>
diff --git a/templates/ja/printer-configured.tmpl b/templates/ja/printer-configured.tmpl
index 1045943..190fb9b 100644
--- a/templates/ja/printer-configured.tmpl
+++ b/templates/ja/printer-configured.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{printer_name} ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚ªãƒ—ションã®è¨­å®š</H2>
<P>{OP=set-class-options?クラス <A HREF="/classes/{printer_name}">:プリンター <A HREF="/printers/{printer_name}">}{printer_name}</A>
ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚ªãƒ—ションã¯æ­£ã—ã設定ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/printer-confirm.tmpl b/templates/ja/printer-confirm.tmpl
index 6fdb52c..bdbaf3d 100644
--- a/templates/ja/printer-confirm.tmpl
+++ b/templates/ja/printer-confirm.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">プリンター {printer_name} ã®å‰Šé™¤</H2>
<P><B>警告:</B> 本当ã«ãƒ—リンター {printer_name} を削除ã—ã¦ã‚ˆã„ã§ã™ã‹ï¼Ÿ</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="プリンターã®å‰Šé™¤"></FORM></P>
-
-</DIV>
diff --git a/templates/ja/printer-default.tmpl b/templates/ja/printer-default.tmpl
index fccfc0d..cc5398c 100644
--- a/templates/ja/printer-default.tmpl
+++ b/templates/ja/printer-default.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} をデフォルトã«è¨­å®š</H2>
<P>{is_class?クラス:プリンター} <A
@@ -8,5 +6,3 @@ HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
<BLOCKQUOTE><B>注æ„:</B> <TT>lpoptions</TT> コマンドã§è¨­å®šã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã¯ã€
ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨­å®šã‚’上書ãã—ã¾ã™ã€‚</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ja/printer-deleted.tmpl b/templates/ja/printer-deleted.tmpl
index 2f2759b..0aa3adb 100644
--- a/templates/ja/printer-deleted.tmpl
+++ b/templates/ja/printer-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">プリンター {printer_name} ã®å‰Šé™¤</H2>
<P>プリンター {printer_name} ã¯æ­£ã—ã削除ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV>
diff --git a/templates/ja/printer-jobs-header.tmpl b/templates/ja/printer-jobs-header.tmpl
index 1d5d887..d12840e 100644
--- a/templates/ja/printer-jobs-header.tmpl
+++ b/templates/ja/printer-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">ジョブ</H3>
-</DIV>
diff --git a/templates/ja/printer-modified.tmpl b/templates/ja/printer-modified.tmpl
index a22e7da..d2ed7b5 100644
--- a/templates/ja/printer-modified.tmpl
+++ b/templates/ja/printer-modified.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">プリンター {printer_name} ã®å¤‰æ›´</H2>
<P>プリンター <A HREF="/printers/{printer_name}">{printer_name}</A>
ã¯æ­£ã—ã変更ã•ã‚Œã¾ã—ãŸã€‚
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/printer-purge.tmpl b/templates/ja/printer-purge.tmpl
deleted file mode 100644
index 4ba6cbc..0000000
--- a/templates/ja/printer-purge.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} ã®ã‚¸ãƒ§ãƒ–ã®å…¨å‰Šé™¤</H2>
-
-<P>{is_class?クラス:プリンター} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ã‹ã‚‰ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を削除ã—ã¾ã—ãŸã€‚</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/printer-reject.tmpl b/templates/ja/printer-reject.tmpl
index ba7cc52..cc64bbc 100644
--- a/templates/ja/printer-reject.tmpl
+++ b/templates/ja/printer-reject.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} ã®ã‚¸ãƒ§ãƒ–ã®æ‹’å¦</H2>
<P>{is_class?クラス:プリンター} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ã¯ã‚¸ãƒ§ãƒ–ã‚’å—ã‘付ã‘ãªããªã‚Šã¾ã—ãŸã€‚</P>
-
-</DIV>
diff --git a/templates/ja/printer-start.tmpl b/templates/ja/printer-start.tmpl
index 138829d..a13725f 100644
--- a/templates/ja/printer-start.tmpl
+++ b/templates/ja/printer-start.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} ã®å†é–‹</H2>
<P>{is_class?クラス:プリンター} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ã¯å†é–‹ã—ã¾ã—ãŸã€‚</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/printer-stop.tmpl b/templates/ja/printer-stop.tmpl
index cc74c1b..6c3cbd1 100644
--- a/templates/ja/printer-stop.tmpl
+++ b/templates/ja/printer-stop.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} ã®åœæ­¢</H2>
<P>{is_class?クラス:プリンター} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
ã¯åœæ­¢ã—ã¾ã—ãŸã€‚</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/printer.tmpl b/templates/ja/printer.tmpl
index a95b71e..2b82c61 100644
--- a/templates/ja/printer.tmpl
+++ b/templates/ja/printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
({printer_state=3?待機中:{printer_state=4?処ç†ä¸­:一時åœæ­¢ä¸­}},
{printer_is_accepting_jobs=0?ジョブを拒å¦ä¸­:ジョブをå—ã‘付ã‘中},
@@ -17,7 +15,7 @@
<OPTION VALUE="move-jobs">ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–ã®ç§»å‹•</OPTION>
<OPTION VALUE="purge-jobs">ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–をキャンセル</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="進む"></NOSCRIPT>
</FORM>
<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
@@ -31,17 +29,15 @@
<OPTION VALUE="set-as-default">サーãƒãƒ¼ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®è¨­å®š</OPTION>
<OPTION VALUE="set-allowed-users">許å¯ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¨­å®š</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="進む" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="進む"></NOSCRIPT>
</FORM>
<TABLE SUMMARY="{printer_name}">
<TR><TH ALIGN="RIGHT" VALIGN="TOP">説明:</TH><TD>{printer_info}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">場所:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">プリンタードライãƒãƒ¼:</TH><TD>{printer_make_and_model} ({color_supported=1?カラー:白黒}{sides_supported?, 両é¢å¯:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">プリンタードライãƒãƒ¼:</TH><TD>{printer_make_and_model} ({color_supported=1?カラー:白黒}{sides_supported=one-sided?:, 両é¢å¯})<BR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">接続:</TH><TD>{device_uri}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">デフォルト設定:</TH><TD>ãƒãƒŠãƒ¼={job_sheets_default}
-用紙サイズ={media_default?{media_default}:unknown}
+用紙サイズ={media_default?{media_default}:ä¸æ˜Ž}
{sides_default?両é¢æŒ‡å®š={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ja/restart.tmpl b/templates/ja/restart.tmpl
index d8504ef..70c537e 100644
--- a/templates/ja/restart.tmpl
+++ b/templates/ja/restart.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">設定ã®å¤‰æ›´</H2>
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
ALT="Busy Indicator"> サーãƒãƒ¼ãŒå†èµ·å‹•ã™ã‚‹é–“ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„...</P>
-
-</DIV>
diff --git a/templates/ja/set-printer-options-header.tmpl b/templates/ja/set-printer-options-header.tmpl
index cd8df91..4ab07db 100644
--- a/templates/ja/set-printer-options-header.tmpl
+++ b/templates/ja/set-printer-options-header.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{printer_name} ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚ªãƒ—ションã®å¤‰æ›´</H2>
<FORM METHOD="POST" ACTION="/admin">
diff --git a/templates/ja/set-printer-options-trailer.tmpl b/templates/ja/set-printer-options-trailer.tmpl
index 11adc70..b92988a 100644
--- a/templates/ja/set-printer-options-trailer.tmpl
+++ b/templates/ja/set-printer-options-trailer.tmpl
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
}
--></SCRIPT>
</FORM>
-
-</DIV>
diff --git a/templates/ja/subscription-added.tmpl b/templates/ja/subscription-added.tmpl
index e4ab98c..60339c1 100644
--- a/templates/ja/subscription-added.tmpl
+++ b/templates/ja/subscription-added.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>{subscription_name} ã®è³¼èª­ã¯æ­£ã—ã追加ã•ã‚Œã¾ã—ãŸã€‚</P>
-
-</DIV>
diff --git a/templates/ja/subscription-canceled.tmpl b/templates/ja/subscription-canceled.tmpl
index 8787dad..8065225 100644
--- a/templates/ja/subscription-canceled.tmpl
+++ b/templates/ja/subscription-canceled.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>購読 #{notify_subscription_id} ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸã€‚</P>
-
-</DIV>
diff --git a/templates/ja/test-page.tmpl b/templates/ja/test-page.tmpl
index 6cdaa87..b460010 100644
--- a/templates/ja/test-page.tmpl
+++ b/templates/ja/test-page.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{printer_name} ã®ãƒ†ã‚¹ãƒˆãƒšãƒ¼ã‚¸å°åˆ·</H2>
<P>テストページをé€ä¿¡ã—ã¾ã—ãŸ; ジョブ ID 㯠<A HREF="/{SECTION}/{printer_name}">
{printer_name}-{job_id}</A> ã§ã™ã€‚</P>
-
-</DIV>
diff --git a/templates/ja/trailer.tmpl b/templates/ja/trailer.tmpl
index e804b75..74447af 100644
--- a/templates/ja/trailer.tmpl
+++ b/templates/ja/trailer.tmpl
@@ -1,8 +1,5 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS is copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+ </div>
+ </div>
+ <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+ </body>
+</html>
diff --git a/templates/ja/users.tmpl b/templates/ja/users.tmpl
index b998c6b..4ba9855 100644
--- a/templates/ja/users.tmpl
+++ b/templates/ja/users.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/job-cancel.tmpl b/templates/job-cancel.tmpl
index 3e8fd4d..0b0106e 100644
--- a/templates/job-cancel.tmpl
+++ b/templates/job-cancel.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Cancel Job {job_id}</H2>
<P><A HREF="{job_printer_uri}">Job {job_id}</A> has been canceled.
-
-</DIV>
diff --git a/templates/job-hold.tmpl b/templates/job-hold.tmpl
index 58ce97f..3b5cd6a 100644
--- a/templates/job-hold.tmpl
+++ b/templates/job-hold.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Hold Job {job_id}</H2>
<P><A HREF="{job_printer_uri}">Job {job_id}</A> has been held from printing.
-
-</DIV>
diff --git a/templates/job-move.tmpl b/templates/job-move.tmpl
index 6ef0ff1..c2f7046 100644
--- a/templates/job-move.tmpl
+++ b/templates/job-move.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
</TABLE>
</FORM>
-
-</DIV>
diff --git a/templates/job-moved.tmpl b/templates/job-moved.tmpl
index c4db096..4893e24 100644
--- a/templates/job-moved.tmpl
+++ b/templates/job-moved.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{job_id?Move Job {job_id}:Move All Jobs}</H2>
<P>{job_id?<A HREF="/jobs/{job_id}">Job {job_id}</A>:All jobs} moved to
<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/job-release.tmpl b/templates/job-release.tmpl
index 8eb9a96..fe93793 100644
--- a/templates/job-release.tmpl
+++ b/templates/job-release.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Release Job {job_id}</H2>
<P><A HREF="{job_printer_uri}">Job {job_id}</A> has been released for printing.
-
-</DIV>
diff --git a/templates/job-restart.tmpl b/templates/job-restart.tmpl
index b91ced9..b5dfd95 100644
--- a/templates/job-restart.tmpl
+++ b/templates/job-restart.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Reprint Job {job_id}</H2>
<P><A HREF="{job_printer_uri}">Job {job_id}</A> has been restarted.
-
-</DIV>
diff --git a/templates/jobs-header.tmpl b/templates/jobs-header.tmpl
index e7547ba..a8a365b 100644
--- a/templates/jobs-header.tmpl
+++ b/templates/jobs-header.tmpl
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Show Active Jobs"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Show Active Jobs"></FORM>}
{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Show Completed Jobs"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Show All Jobs"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Show All Jobs"></FORM>}
<P ALIGN="CENTER">{total=0?No jobs:Showing {#job_id} of {total} {?which_jobs=?active:{which_jobs=all?:completed}} job{total=1?:s}}.</P>
diff --git a/templates/list-available-printers.tmpl b/templates/list-available-printers.tmpl
index a594439..9fe7b12 100644
--- a/templates/list-available-printers.tmpl
+++ b/templates/list-available-printers.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Available Printers</H2>
{#device_uri=0?<P>No printers found.</P>
@@ -7,5 +5,3 @@
<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Add This Printer"></FORM>
{device_make_and_model} ({device_info})</LI>
}</UL>}
-
-</DIV>
diff --git a/templates/modify-class.tmpl b/templates/modify-class.tmpl
index 31f7b9c..1aa4fe6 100644
--- a/templates/modify-class.tmpl
+++ b/templates/modify-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modify Class {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/modify-printer.tmpl b/templates/modify-printer.tmpl
index bdf3df6..72b4bc5 100644
--- a/templates/modify-printer.tmpl
+++ b/templates/modify-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modify {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -39,4 +37,3 @@ Share This Printer</TD>
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/norestart.tmpl b/templates/norestart.tmpl
index 6b31203..70bf3d3 100644
--- a/templates/norestart.tmpl
+++ b/templates/norestart.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Change Settings</H2>
<P>The server was not restarted because no changes were made to
the configuration...</P>
-
-</DIV>
diff --git a/templates/printer-accept.tmpl b/templates/printer-accept.tmpl
index 3e987ce..db5d8da 100644
--- a/templates/printer-accept.tmpl
+++ b/templates/printer-accept.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Accept Jobs On {is_class?Class:Printer} {printer_name}</H2>
<P>{is_class?Class:Printer} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
is now accepting jobs.</P>
-
-</DIV>
diff --git a/templates/printer-added.tmpl b/templates/printer-added.tmpl
index 9a6e798..0ccf6d3 100644
--- a/templates/printer-added.tmpl
+++ b/templates/printer-added.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Add Printer</H2>
<P>Printer <A HREF="/printers/{printer_name}">{printer_name}</A> has been added
successfully.
-
-</DIV>
diff --git a/templates/printer-cancel-jobs.tmpl b/templates/printer-cancel-jobs.tmpl
new file mode 100644
index 0000000..4376646
--- /dev/null
+++ b/templates/printer-cancel-jobs.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Cancel Jobs On {is_class?Class:Printer} {printer_name}</H2>
+
+<P>All jobs on {is_class?class:printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+have been canceled.</P>
diff --git a/templates/printer-configured.tmpl b/templates/printer-configured.tmpl
index 6f8104e..7bce3f9 100644
--- a/templates/printer-configured.tmpl
+++ b/templates/printer-configured.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Set Default Options for {printer_name}</H2>
<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:Printer <A HREF="/printers/{printer_name}">}{printer_name}</A>
default options have been set successfully.
-
-</DIV>
diff --git a/templates/printer-confirm.tmpl b/templates/printer-confirm.tmpl
index fce9e34..c1b2b17 100644
--- a/templates/printer-confirm.tmpl
+++ b/templates/printer-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Delete Printer {printer_name}</H2>
<P><B>Warning:</B> Are you sure you want to delete printer
{printer_name}?</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Delete Printer"></FORM></P>
-
-</DIV>
diff --git a/templates/printer-default.tmpl b/templates/printer-default.tmpl
index 72a7b5e..af21dca 100644
--- a/templates/printer-default.tmpl
+++ b/templates/printer-default.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Set {is_class?Class:Printer} {printer_name} As Default</H2>
<P>{is_class?Class:Printer} <A
@@ -9,5 +7,3 @@ has been made the default printer on the server.</P>
<BLOCKQUOTE><B>Note:</B> Any user default that has been set via
the <TT>lpoptions</TT> command will override this default
setting.</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/printer-deleted.tmpl b/templates/printer-deleted.tmpl
index d8a31ae..ea462ce 100644
--- a/templates/printer-deleted.tmpl
+++ b/templates/printer-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Delete Printer {printer_name}</H2>
<P>Printer {printer_name} has been deleted successfully.
-
-</DIV>
diff --git a/templates/printer-jobs-header.tmpl b/templates/printer-jobs-header.tmpl
index ba46f10..61e5151 100644
--- a/templates/printer-jobs-header.tmpl
+++ b/templates/printer-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">Jobs</H3>
-</DIV>
diff --git a/templates/printer-modified.tmpl b/templates/printer-modified.tmpl
index b61e8e3..1193a48 100644
--- a/templates/printer-modified.tmpl
+++ b/templates/printer-modified.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Modify Printer {printer_name}</H2>
<P>Printer <A HREF="/printers/{printer_name}">{printer_name}</A> has been
modified successfully.
-
-</DIV> \ No newline at end of file
diff --git a/templates/printer-purge.tmpl b/templates/printer-purge.tmpl
deleted file mode 100644
index 8cf7c14..0000000
--- a/templates/printer-purge.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Purge Jobs On {is_class?Class:Printer} {printer_name}</H2>
-
-<P>{is_class?Class:Printer} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-has been purged of all jobs.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/printer-reject.tmpl b/templates/printer-reject.tmpl
index 5f1c791..823c7e5 100644
--- a/templates/printer-reject.tmpl
+++ b/templates/printer-reject.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Reject Jobs On {is_class?Class:Printer} {printer_name}</H2>
<P>{is_class?Class:Printer} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
is no longer accepting jobs.</P>
-
-</DIV>
diff --git a/templates/printer-start.tmpl b/templates/printer-start.tmpl
index 3eaed13..76d44ed 100644
--- a/templates/printer-start.tmpl
+++ b/templates/printer-start.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Resume {is_class?Class:Printer} {printer_name}</H2>
<P>{is_class?Class:Printer} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
has been resumed.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/printer-stop.tmpl b/templates/printer-stop.tmpl
index b74e871..8c264b2 100644
--- a/templates/printer-stop.tmpl
+++ b/templates/printer-stop.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Pause {is_class?Class:Printer} {printer_name}</H2>
<P>{is_class?Class:Printer} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
has been paused.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/printer.tmpl b/templates/printer.tmpl
index 78fc08b..705f69f 100644
--- a/templates/printer.tmpl
+++ b/templates/printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
({printer_state=3?Idle:{printer_state=4?Processing:Paused}},
{printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs},
@@ -15,9 +13,9 @@
{printer_state=5?<OPTION VALUE="start-printer">Resume Printer</OPTION>:<OPTION VALUE="stop-printer">Pause Printer</OPTION>}
{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accept Jobs</OPTION>:<OPTION VALUE="reject-jobs">Reject Jobs</OPTION>}
<OPTION VALUE="move-jobs">Move All Jobs</OPTION>
-<OPTION VALUE="purge-jobs">Cancel All Jobs</OPTION>
+<OPTION VALUE="cancel-jobs">Cancel All Jobs</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
</FORM>
<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
@@ -31,17 +29,15 @@
<OPTION VALUE="set-as-default">Set As Server Default</OPTION>
<OPTION VALUE="set-allowed-users">Set Allowed Users</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
</FORM>
<TABLE SUMMARY="{printer_name}">
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Description:</TH><TD>{printer_info}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Location:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Driver:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Driver:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported=one-sided?:, 2-sided printing})<BR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Connection:</TH><TD>{device_uri}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Defaults:</TH><TD>job-sheets={job_sheets_default}
media={media_default?{media_default}:unknown}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV> \ No newline at end of file
diff --git a/templates/restart.tmpl b/templates/restart.tmpl
index bdfca87..47d39d0 100644
--- a/templates/restart.tmpl
+++ b/templates/restart.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Change Settings</H2>
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
ALT="Busy Indicator"> Please stand by while the server restarts...</P>
-
-</DIV>
diff --git a/templates/ru/add-class.tmpl b/templates/ru/add-class.tmpl
index a119d86..d67c4ad 100644
--- a/templates/ru/add-class.tmpl
+++ b/templates/ru/add-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -37,4 +35,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/add-printer.tmpl b/templates/ru/add-printer.tmpl
index 6690d88..824b913 100644
--- a/templates/ru/add-printer.tmpl
+++ b/templates/ru/add-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Добавление принтера</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -44,4 +42,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/admin.tmpl b/templates/ru/admin.tmpl
index ae2aab2..49a168c 100644
--- a/templates/ru/admin.tmpl
+++ b/templates/ru/admin.tmpl
@@ -1,102 +1,97 @@
-<TABLE CLASS="indent" SUMMARY="ÐдминиÑтрирование">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Принтеры</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Добавить принтер"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Ðайти новый принтер"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление принтерами"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="ЭкÑпортировать принтер в Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Группы</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Добавить группу"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление группами"></FORM>
-</P>
-
-<H2 CLASS="title">ЗаданиÑ</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление заданиÑми"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Сервер</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Редактировать конфигурационный файл"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал заданий"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал ошибок"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал Ñтраниц"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Параметры Ñервера\:</B></P>
-
-<P><A HREF="/admin/">Дополнительные параметры<SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Показать принтеры, иÑпользующиеÑÑ Ð² других ÑиÑтемах<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Протоколы\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из интернета<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> ÐнонÑировать веб-интерфейÑ<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное админиÑтрирование<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешать пользователÑм отменÑÑ‚ÑŒ любое задание(не только их ÑобÑтвенные)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> ВеÑти журнал заданий<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КоличеÑтво заданий\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ЗапиÑывать метаданные(Retain Metadata)\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;СущеÑтвующие документы(Retain Documents)\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> СохранÑÑ‚ÑŒ отладочную информацию в журнале<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;МакÑимальный размер журнала ошибок\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Параметры Ñервера:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Дополнительные параметры <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Разрешить ÑовмеÑтный доÑтуп к принтерам, подключенным к Ñтой ÑиÑтеме<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из Интернета<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное админиÑтрирование<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешить пользователÑм отменÑÑ‚ÑŒ любое задание(не только их ÑобÑтвенные)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> СохранÑÑ‚ÑŒ отладочную информацию в журнале</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Сохранить"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">ПодпиÑка по RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Добавить подпиÑку по RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="ПодпиÑки по RSS">
-<THEAD><TR><TH>Ðазвание</TH><TH>СобытиÑ</TH><TH>Очередь</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Отменить подпиÑку по RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Ð’Ñе очереди}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+ <div class="halves">
+ <H2 CLASS="title">Принтеры</H2>
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Добавить принтер"></FORM>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Ðайти новый принтер"></FORM>
+ <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление принтерами"></FORM>
+ {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="ЭкÑпортировать принтер в Samba"></FORM>:}
+ </P>
+
+ <H2 CLASS="title">Группы</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Добавить группу"></FORM>
+ <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление группами"></FORM>
+ </P>
+
+ <H2 CLASS="title">ЗаданиÑ</H2>
+
+ <P>
+ <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление заданиÑми"></FORM>
+ </P>
+ </div>
+ <div class="halves">
+ <H2 CLASS="title">Сервер</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Редактировать конфигурационный файл"></FORM>
+ <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал заданий"></FORM>
+ <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал ошибок"></FORM>
+ <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал Ñтраниц"></FORM>
+ </P>
+
+ {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+ <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+ <FORM METHOD="POST" ACTION="/admin">
+ <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+ {ADVANCEDSETTINGS?<P><B>Параметры Ñервера\:</B></P>
+
+ <P><A HREF="/admin/">Дополнительные параметры<SMALL>&#x25bc;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Разрешить ÑовмеÑтный доÑтуп к принтерам, подключенным к Ñтой ÑиÑтеме<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;МакÑимум клиентов\:
+ <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из интернет<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Разрешить доÑтуп через веб-интерфейÑ<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное админиÑтрирование<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешать пользователÑм отменÑÑ‚ÑŒ любое задание(не только их ÑобÑтвенные)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> ВеÑти журнал заданий<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КоличеÑтво заданий (0 без ограничений)\:
+ <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ЗапиÑывать метаданные(Retain Metadata)\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;СущеÑтвующие документы(Retain Documents)\:
+ <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> СохранÑÑ‚ÑŒ отладочную информацию в журнале<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;МакÑимальный размер журнала\:
+ <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+ :<P><B>Параметры Ñервера:</B></P>
+
+ <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Дополнительные параметры <SMALL>&#x25b6;</SMALL></A><BR>
+ <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+ <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Разрешить ÑовмеÑтный доÑтуп к принтерам, подключенным к Ñтой ÑиÑтеме<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из
+ интернет<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное админиÑтрирование<BR>
+ {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+ <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешить пользователÑм отменÑÑ‚ÑŒ любое задание(не только их ÑобÑтвенные)<BR>
+ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> СохранÑÑ‚ÑŒ отладочную информацию в журнале</P>
+
+ }
+ <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Сохранить"></P>
+
+ </FORM>}
+ </div>
+</div>
+
+<div class="row">
+ <H2 CLASS="title">ПодпиÑка по RSS</H2>
+
+ <P>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Добавить подпиÑку по RSS"></FORM>
+ </P>
+
+ {notify_subscription_id?<TABLE CLASS="list" SUMMARY="ПодпиÑки по RSS">
+ <THEAD><TR><TH>Ðазвание</TH><TH>СобытиÑ</TH><TH>Очередь</TH></TR></THEAD>
+ <TBODY>{[notify_subscription_id]
+ <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+ <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Отменить подпиÑку по RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Ð’Ñе очереди}</TD></TR>}
+ </TBODY>
+ </TABLE>:}
+</div> \ No newline at end of file
diff --git a/templates/ru/choose-device.tmpl b/templates/ru/choose-device.tmpl
index 3472f5f..8b63ac6 100644
--- a/templates/ru/choose-device.tmpl
+++ b/templates/ru/choose-device.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
@@ -9,12 +7,12 @@
<TABLE>
{op=add-printer?:<TR>
-<TH CLASS="label">Текущее подключение\:</TH>
+<TH CLASS="label">Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½\:</TH>
<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
{current_device_uri}</TD>
</TR>}
<TR>
-<TH CLASS="label">Локальные принтеры\:</TH>
+<TH CLASS="label">УÑтановленные принтеры\:</TH>
<TD>
{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
@@ -23,7 +21,7 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
</TD>
</TR>
<TR>
-<TH CLASS="label">Обнаруженные Ñетевые принтеры\:</TH>
+<TH CLASS="label">Ðайденные Ñетевые принтеры\:</TH>
<TD>
{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
@@ -48,6 +46,4 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
</TABLE>
</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> ПоиÑк принтеров...</P>}
-
-</DIV>
+ALT="Ожидание"> ПоиÑк принтеров...</P>}
diff --git a/templates/ru/choose-make.tmpl b/templates/ru/choose-make.tmpl
index 55b91db..d5ef7fe 100644
--- a/templates/ru/choose-make.tmpl
+++ b/templates/ru/choose-make.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/choose-model.tmpl b/templates/ru/choose-model.tmpl
index b666329..2f0d6d9 100644
--- a/templates/ru/choose-model.tmpl
+++ b/templates/ru/choose-model.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/choose-serial.tmpl b/templates/ru/choose-serial.tmpl
index 5a953a2..2c8d6c7 100644
--- a/templates/ru/choose-serial.tmpl
+++ b/templates/ru/choose-serial.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -19,11 +17,11 @@
</SELECT></TD>
</TR>
<TR>
-<TH CLASS="label">Печать Ñтраниц:</TH>
+<TH CLASS="label">ЧетноÑÑ‚ÑŒ:</TH>
<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Ð’Ñе
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Только четные
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Только нечетные
+<OPTION VALUE="none" {?parity=none?SELECTED:}>None
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Even
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Odd
</SELECT></TD>
</TR>
<TR>
@@ -49,4 +47,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/choose-uri.tmpl b/templates/ru/choose-uri.tmpl
index 3c843f0..fff9231 100644
--- a/templates/ru/choose-uri.tmpl
+++ b/templates/ru/choose-uri.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -40,4 +38,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/class-added.tmpl b/templates/ru/class-added.tmpl
index 626cfec..f0bf6cd 100644
--- a/templates/ru/class-added.tmpl
+++ b/templates/ru/class-added.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°</H2>
<P>Группа <A HREF="/classes/{printer_name}">{printer_name}</A> уÑпешно добавлена.
-
-</DIV>
diff --git a/templates/ru/class-confirm.tmpl b/templates/ru/class-confirm.tmpl
index 0eb87ef..9ea80aa 100644
--- a/templates/ru/class-confirm.tmpl
+++ b/templates/ru/class-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Удаление группы {printer_name}</H2>
<P><B>Предупреждение:</B> Ð’Ñ‹ дейÑтвительно хотите удалить группу
{printer_name}?</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Удалить группу"></FORM></P>
-
-</DIV>
diff --git a/templates/ru/class-deleted.tmpl b/templates/ru/class-deleted.tmpl
index 08f5999..c0b64d9 100644
--- a/templates/ru/class-deleted.tmpl
+++ b/templates/ru/class-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Удаление группы {printer_name}</H2>
<P>Группа {printer_name} уÑпешно удалена.
-
-</DIV> \ No newline at end of file
diff --git a/templates/ru/class-jobs-header.tmpl b/templates/ru/class-jobs-header.tmpl
index 8487cbb..8bcaa81 100644
--- a/templates/ru/class-jobs-header.tmpl
+++ b/templates/ru/class-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">ЗаданиÑ</H3>
-</DIV>
diff --git a/templates/ru/class-modified.tmpl b/templates/ru/class-modified.tmpl
index 986a02b..5f23e08 100644
--- a/templates/ru/class-modified.tmpl
+++ b/templates/ru/class-modified.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Изменение группы {printer_name}</H2>
<P>Группа <A HREF="/classes/{printer_name}">{printer_name}</A> уÑпешно изменена.
-
-</DIV> \ No newline at end of file
diff --git a/templates/ru/class.tmpl b/templates/ru/class.tmpl
index 643cbae..a5aadff 100644
--- a/templates/ru/class.tmpl
+++ b/templates/ru/class.tmpl
@@ -1,7 +1,6 @@
-<DIV CLASS="indent">
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Idle:{printer_state=4?печать:приоÑтановлен}},
-{printer_is_accepting_jobs=0?Ðе принимает заданиÑ:Принимает заданиÑ},
+({printer_state=3?ожидает:{printer_state=4?печать:приоÑтановлен}},
+{printer_is_accepting_jobs=0?не принимает заданиÑ:принимает заданиÑ},
{server_is_sharing_printers=0?нет ÑовмеÑтного доÑтупа:{printer_is_shared=0?нет ÑовмеÑтного доÑтупа:разрешен ÑовмеÑтный доÑтуп}} {default_name={printer_name}?, Сервер по умолчанию:})</H2>
<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
@@ -9,15 +8,15 @@
<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
<OPTION VALUE="">ОбÑлуживание</OPTION>
<OPTION VALUE="print-test-page">Печать пробной Ñтраницы</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">Данные группы</OPTION>:<OPTION VALUE="stop-class">ПриоÑтановить группу</OPTION>}
+{printer_state=5?<OPTION VALUE="start-class">Включить группу</OPTION>:<OPTION VALUE="stop-class">ОÑтановить группу</OPTION>}
{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Принимать заданиÑ</OPTION>:<OPTION VALUE="reject-jobs">Ðе принимать заданиÑ</OPTION>}
<OPTION VALUE="move-jobs">ПеремеÑтить вÑе заданиÑ</OPTION>
<OPTION VALUE="purge-jobs">Отменить вÑе заданиÑ</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Сохранить" STYLE="display: none;">
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
</FORM>
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="ÐдминиÑтрирование">
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
@@ -29,7 +28,7 @@
<OPTION VALUE="set-as-default">УÑтановить как принтер по умолчанию</OPTION>
<OPTION VALUE="set-allowed-users">СпиÑок разрешенных пользователей</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Сохранить" STYLE="display: none;">
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
</FORM>
<TABLE SUMMARY="{printer_name}">
@@ -40,5 +39,3 @@
media={media_default?{media_default}:неизвеÑтный}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV>
diff --git a/templates/ru/classes.tmpl b/templates/ru/classes.tmpl
index 5038bea..9b90b76 100644
--- a/templates/ru/classes.tmpl
+++ b/templates/ru/classes.tmpl
@@ -1,11 +1,11 @@
{#printer_name=0?:
<TABLE CLASS="list" SUMMARY="СпиÑок групп">
<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Очередь <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Очередь <SMALL>&#x25bc;</SMALL>}</A></TH><TH>ОпиÑание</TH><TH>РаÑположение</TH><TH>СоÑтав</TH><TH>СтатуÑ</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Ðаименование <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Ðаименование <SMALL>&#x25bc;</SMALL>}</A></TH><TH>ОпиÑание</TH><TH>РаÑположение</TH><TH>СоÑтав</TH><TH>СтатуÑ</TH></TR>
</THEAD>
<TBODY>
{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Ðет принтеров:{member_uris}}</TD><TD>{printer_state=3?Ð’ ожидании:{printer_state=4?Печатает:ПриоÑтановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Ðет принтеров:{member_uris}}</TD><TD>{printer_state=3?ожидает:{printer_state=4?печатает:приоÑтановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
}
</TBODY>
</TABLE></DIV>}
diff --git a/templates/ru/command.tmpl b/templates/ru/command.tmpl
index 4dc7b4e..09c26fd 100644
--- a/templates/ru/command.tmpl
+++ b/templates/ru/command.tmpl
@@ -1,12 +1,8 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{title} Ð´Ð»Ñ {printer_name}</H2>
<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Индикатор занÑтоÑти"> }Обработка заданиÑ
+ALIGN="ABSMIDDLE" ALT="Ожидание"> }Обработка заданиÑ
{job_state=3?в очереди:{job_state=4?удерживаетÑÑ:
{job_state=5?обрабатываетÑÑ:{job_state=6?оÑтановлено:
{job_state=7?отменено:{job_state=8?прервано:завершено}}}}}}{job_state=9?:{job_printer_state_message?,
<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/ru/edit-config.tmpl b/templates/ru/edit-config.tmpl
index d194059..69ebd0f 100644
--- a/templates/ru/edit-config.tmpl
+++ b/templates/ru/edit-config.tmpl
@@ -5,9 +5,7 @@ function reset_config()
}
</SCRIPT>
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Редактирование конфигурационного файла</H2>
+<H2 CLASS="title">Редактирование файла конфигурации</H2>
<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -16,9 +14,7 @@ function reset_config()
<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Сохранить изменениÑ">
-<INPUT TYPE="BUTTON" VALUE="СброÑить вÑе изменениÑ"
+<INPUT TYPE="BUTTON" VALUE="Отменить изменениÑ"
onClick="reset_config();"></P>
</FORM>
-
-</DIV>
diff --git a/templates/ru/error-op.tmpl b/templates/ru/error-op.tmpl
index 922976f..6e7dfb1 100644
--- a/templates/ru/error-op.tmpl
+++ b/templates/ru/error-op.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} - ошибка </H2>
<P>Ошибка:</P>
<BLOCKQUOTE>ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ru/error.tmpl b/templates/ru/error.tmpl
index 4a35c8f..da563c3 100644
--- a/templates/ru/error.tmpl
+++ b/templates/ru/error.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{?title} {?printer_name} - ошибка</H2>
<P>{?message?{message}:Ошибка}:</P>
<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ru/header.tmpl.in b/templates/ru/header.tmpl.in
index 6d16855..e5f0689 100644
--- a/templates/ru/header.tmpl.in
+++ b/templates/ru/header.tmpl.in
@@ -1,29 +1,43 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
- <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
- {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Ðачало&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;ÐдминиÑтрирование&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Группы&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Справка&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;ЗаданиÑ&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Принтеры&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="ПоиÑк по Ñправке"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <link rel="stylesheet" href="/cups.css" type="text/css">
+ <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+ <meta http-equiv="X-UA-Compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width">
+ <style>html{display:none;}</style>
+ <script type="text/javascript"><!--
+ /* Only display document if we are not in a frame... */
+ if (self == top) {
+ document.documentElement.style.display = 'block';
+ } else {
+ top.location = self.location;
+ }
+
+ /* Show an error if cookies are disabled */
+ function check_cookies() {
+ if (!navigator.cookieEnabled) {
+ document.getElementById('body').innerHTML = 'Эта Ñтраница иÑпользует cookies. ПожалуйÑта включите cookies в вашем браузере.';
+ }
+ }
+ --></SCRIPT>
+ <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+ </head>
+ <body onload="check_cookies();">
+ <div class="header">
+ <ul>
+ <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+ <li><a href="/">Ðачало</a></li>
+ <li><a {SECTION=admin?class="active" :}href="/admin">ÐдминиÑтрирование</a></li>
+ <li><a {SECTION=classes?class="active" :}href="/classes/">Группы</a></li>
+ <li><a {SECTION=help?class="active" :}href="/help/">Справка</a></li>
+ <li><a {SECTION=jobs?class="active" :}href="/jobs/">ЗаданиÑ</a></li>
+ <li><a {SECTION=printers?class="active" :}href="/printers/">Принтеры</a></li>
+ </ul>
+ </div>
+ <div class="body">
+ <div class="row">
+ <h1>{title}</h1>
diff --git a/templates/ru/help-header.tmpl b/templates/ru/help-header.tmpl
index d618a66..fdd361a 100644
--- a/templates/ru/help-header.tmpl
+++ b/templates/ru/help-header.tmpl
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
@@ -31,8 +30,7 @@ AUTOSAVE="org.cups.help" RESULTS="20">
{QTEXT?</UL>:}
:<P>Ðе найдено Ñовпадений.</P>}
<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Показать верÑию Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Показать верÑию Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸"></FORM>:
<H1>Справка</H1>
diff --git a/templates/ru/help-trailer.tmpl b/templates/ru/help-trailer.tmpl
index 4c1ebed..e69de29 100644
--- a/templates/ru/help-trailer.tmpl
+++ b/templates/ru/help-trailer.tmpl
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/ru/job-cancel.tmpl b/templates/ru/job-cancel.tmpl
index cba5644..5cd5fd5 100644
--- a/templates/ru/job-cancel.tmpl
+++ b/templates/ru/job-cancel.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Отмена Ð·Ð°Ð´Ð°Ð½Ð¸Ñ {job_id}</H2>
<P><A HREF="{job_printer_uri}">Задание {job_id}</A> отменено.
-
-</DIV>
diff --git a/templates/ru/job-hold.tmpl b/templates/ru/job-hold.tmpl
index 162e4a4..ea56f5b 100644
--- a/templates/ru/job-hold.tmpl
+++ b/templates/ru/job-hold.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ПриоÑтановка Ð·Ð°Ð´Ð°Ð½Ð¸Ñ {job_id}</H2>
<P><A HREF="{job_printer_uri}">Задание {job_id}</A> приоÑтановлено.
-
-</DIV>
diff --git a/templates/ru/job-move.tmpl b/templates/ru/job-move.tmpl
index 598e4db..3c4e0be 100644
--- a/templates/ru/job-move.tmpl
+++ b/templates/ru/job-move.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
</TABLE>
</FORM>
-
-</DIV>
diff --git a/templates/ru/job-moved.tmpl b/templates/ru/job-moved.tmpl
index e5bd656..66ecf8e 100644
--- a/templates/ru/job-moved.tmpl
+++ b/templates/ru/job-moved.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">{job_id?Перемещение Ð·Ð°Ð´Ð°Ð½Ð¸Ñ {job_id}:Перемещение вÑех заданий}</H2>
<P>{job_id?<A HREF="/jobs/{job_id}">Задание {job_id}</A>:Ð’Ñе заданиÑ} перемещены на
<A HREF="/{is_class?группы:принтеры}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/ru/job-release.tmpl b/templates/ru/job-release.tmpl
index 1cad15a..379cd81 100644
--- a/templates/ru/job-release.tmpl
+++ b/templates/ru/job-release.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Разблокирование Ð·Ð°Ð´Ð°Ð½Ð¸Ñ {job_id}</H2>
<P><A HREF="{job_printer_uri}">Задание {job_id}</A> разблокировано.
-
-</DIV>
diff --git a/templates/ru/job-restart.tmpl b/templates/ru/job-restart.tmpl
index 490fc3a..2a1810c 100644
--- a/templates/ru/job-restart.tmpl
+++ b/templates/ru/job-restart.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ПерезапуÑк Ð·Ð°Ð´Ð°Ð½Ð¸Ñ {job_id}</H2>
<P><A HREF="{job_printer_uri}">Задание {job_id}</A> запущено заново.
-
-</DIV>
diff --git a/templates/ru/jobs-header.tmpl b/templates/ru/jobs-header.tmpl
index 7b645b5..6692c44 100644
--- a/templates/ru/jobs-header.tmpl
+++ b/templates/ru/jobs-header.tmpl
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать активные заданиÑ"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать активные заданиÑ"></FORM>}
{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Показать завершенные заданиÑ"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Показать вÑе заданиÑ"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Показать вÑе заданиÑ"></FORM>}
<P ALIGN="CENTER">{total=0?Ðет заданий:Задание {#job_id} из {total} {?which_jobs=?активных:{which_jobs=all?:завершенных}}}.</P>
diff --git a/templates/ru/list-available-printers.tmpl b/templates/ru/list-available-printers.tmpl
index 90d3c94..651de12 100644
--- a/templates/ru/list-available-printers.tmpl
+++ b/templates/ru/list-available-printers.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ДоÑтупные принтеры</H2>
{#device_uri=0?<P>Ðе обнаружено ни одного принтера.</P>
@@ -7,5 +5,3 @@
<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Локальный принтер"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Добавить Ñтот принтер"></FORM>
{device_make_and_model} ({device_info})</LI>
}</UL>}
-
-</DIV>
diff --git a/templates/ru/modify-class.tmpl b/templates/ru/modify-class.tmpl
index a85698a..6549bc6 100644
--- a/templates/ru/modify-class.tmpl
+++ b/templates/ru/modify-class.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Изменение группы {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
</TABLE>
</FORM>
-</DIV> \ No newline at end of file
diff --git a/templates/ru/modify-printer.tmpl b/templates/ru/modify-printer.tmpl
index 8ec523f..b7371f8 100644
--- a/templates/ru/modify-printer.tmpl
+++ b/templates/ru/modify-printer.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Изменение принтера {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
@@ -39,4 +37,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/ru/norestart.tmpl b/templates/ru/norestart.tmpl
index a08a467..b567976 100644
--- a/templates/ru/norestart.tmpl
+++ b/templates/ru/norestart.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Применение изменений</H2>
<P>Сервер не был перезапущен,поÑкольку не произошло изменений в конфигурации...</P>
-
-</DIV>
diff --git a/templates/ru/option-trailer.tmpl b/templates/ru/option-trailer.tmpl
index f80e946..9fb252e 100644
--- a/templates/ru/option-trailer.tmpl
+++ b/templates/ru/option-trailer.tmpl
@@ -1,5 +1,5 @@
</TABLE>
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Сохранить параметры по умолчанию"></P>
+<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Сохранить параметры"></P>
</DIV> \ No newline at end of file
diff --git a/templates/ru/pager.tmpl b/templates/ru/pager.tmpl
index 3c5dc62..0d0459b 100644
--- a/templates/ru/pager.tmpl
+++ b/templates/ru/pager.tmpl
@@ -1,6 +1,6 @@
<TABLE CLASS="inset" SUMMARY="ПроÑмотр по Ñтраницам">
<TR>
- <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Предварительный проÑмотр"></FORM>:&nbsp;}</TD>
- <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Показать Ñледующую &#x25b6;"></FORM>:&nbsp;}</TD>
+ <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; ПредыдущаÑ"></FORM>:&nbsp;}</TD>
+ <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ &#x25b6;"></FORM>:&nbsp;}</TD>
</TR>
</TABLE>
diff --git a/templates/ru/printer-accept.tmpl b/templates/ru/printer-accept.tmpl
index 24d100d..4818dff 100644
--- a/templates/ru/printer-accept.tmpl
+++ b/templates/ru/printer-accept.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Прием заданий {is_class?в группу:на принтер} {printer_name}</H2>
<P>{is_class?Группа:Принтер} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
теперь принимает заданиÑ.</P>
-
-</DIV>
diff --git a/templates/ru/printer-added.tmpl b/templates/ru/printer-added.tmpl
index cc78407..c2b3df2 100644
--- a/templates/ru/printer-added.tmpl
+++ b/templates/ru/printer-added.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Добавить принтер</H2>
<P>Принтер <A HREF="/printers/{printer_name}">{printer_name}</A> уÑпешно добавлен.
-
-</DIV>
diff --git a/templates/ru/printer-cancel-jobs.tmpl b/templates/ru/printer-cancel-jobs.tmpl
new file mode 100644
index 0000000..cd2ad45
--- /dev/null
+++ b/templates/ru/printer-cancel-jobs.tmpl
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Отмена заданий Ð´Ð»Ñ {is_class?Class:Printer} {printer_name}</H2>
+
+<P>Ð’Ñе Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ {is_class?class:printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+были отменены.</P>
diff --git a/templates/ru/printer-configured.tmpl b/templates/ru/printer-configured.tmpl
index 33c4c14..74da095 100644
--- a/templates/ru/printer-configured.tmpl
+++ b/templates/ru/printer-configured.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ÐаÑтройки по умолчанию Ð´Ð»Ñ {printer_name}</H2>
<P>{OP=set-class-options?Группа <A HREF="/classes/{printer_name}">:Принтер <A HREF="/printers/{printer_name}">}{printer_name}</A>
-теперь иÑпользуют параметры по умолчанию.
-
-</DIV>
+теперь иÑпользует параметры по умолчанию.
diff --git a/templates/ru/printer-confirm.tmpl b/templates/ru/printer-confirm.tmpl
index 86b6360..3d502d3 100644
--- a/templates/ru/printer-confirm.tmpl
+++ b/templates/ru/printer-confirm.tmpl
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Удаление принтера {printer_name}</H2>
<P><B>Предупреждение:</B> вы дейÑтвительно хотите удалить принтер
{printer_name}?</P>
<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Удалить принтер"></FORM></P>
-
-</DIV>
diff --git a/templates/ru/printer-default.tmpl b/templates/ru/printer-default.tmpl
index 474f4b8..fd77139 100644
--- a/templates/ru/printer-default.tmpl
+++ b/templates/ru/printer-default.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">УÑтановка {is_class?группы:принтера} {printer_name} по умолчанию</H2>
<P>{is_class?Группа:Принтер} <A
@@ -7,6 +5,4 @@ HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
уÑтановлены на Ñервере по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… заданий.</P>
<BLOCKQUOTE><B>ПримечаниÑ:</B> вы можете переопределить Ñто поведение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды
-the <TT>lpoptions</TT>.</BLOCKQUOTE>
-
-</DIV>
+ <TT>lpoptions</TT>.</BLOCKQUOTE>
diff --git a/templates/ru/printer-deleted.tmpl b/templates/ru/printer-deleted.tmpl
index 43593c7..4b28027 100644
--- a/templates/ru/printer-deleted.tmpl
+++ b/templates/ru/printer-deleted.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Удаление принтера {printer_name}</H2>
<P>Принтер {printer_name} уÑпешно удален.
-
-</DIV>
diff --git a/templates/ru/printer-jobs-header.tmpl b/templates/ru/printer-jobs-header.tmpl
index 8487cbb..8bcaa81 100644
--- a/templates/ru/printer-jobs-header.tmpl
+++ b/templates/ru/printer-jobs-header.tmpl
@@ -1,3 +1 @@
-<DIV CLASS="indent">
<H3 CLASS="title">ЗаданиÑ</H3>
-</DIV>
diff --git a/templates/ru/printer-modified.tmpl b/templates/ru/printer-modified.tmpl
index 21c502f..93df272 100644
--- a/templates/ru/printer-modified.tmpl
+++ b/templates/ru/printer-modified.tmpl
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Изменение принтера {printer_name}</H2>
-<P>Параметры принтера <A HREF="/printers/{printer_name}">{printer_name}</A> уÑпешно изменены.
-
-</DIV> \ No newline at end of file
+<P>Параметры принтера <A HREF="/printers/{printer_name}">{printer_name}</A> уÑпешно изменены. \ No newline at end of file
diff --git a/templates/ru/printer-purge.tmpl b/templates/ru/printer-purge.tmpl
deleted file mode 100644
index c2768c8..0000000
--- a/templates/ru/printer-purge.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">ОчиÑтка вÑех заданий Ð´Ð»Ñ {is_class?группы:принтера} {printer_name}</H2>
-
-<P>Ð’Ñе Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ {is_class?группы:принтера} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-очищены.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ru/printer-reject.tmpl b/templates/ru/printer-reject.tmpl
index 012e161..d8a4722 100644
--- a/templates/ru/printer-reject.tmpl
+++ b/templates/ru/printer-reject.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Отмена заданий Ð´Ð»Ñ {is_class?группы:принтера} {printer_name}</H2>
<P>{is_class?Группа:Принтер} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
больше не принимает заданиÑ.</P>
-
-</DIV>
diff --git a/templates/ru/printer-start.tmpl b/templates/ru/printer-start.tmpl
index cb02c79..d7e8fb8 100644
--- a/templates/ru/printer-start.tmpl
+++ b/templates/ru/printer-start.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Возобновить работу {is_class?группы:принтера} {printer_name}</H2>
<P>{is_class?Группа:Принтер} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-теперь принимают заданиÑ.</P>
-
-</DIV> \ No newline at end of file
+теперь принимает заданиÑ.</P>
diff --git a/templates/ru/printer-stop.tmpl b/templates/ru/printer-stop.tmpl
index d9fa7fc..d9b5035 100644
--- a/templates/ru/printer-stop.tmpl
+++ b/templates/ru/printer-stop.tmpl
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">ПриоÑтановить {is_class?группу:принтер} {printer_name}</H2>
<P>{is_class?Группа:Принтер} <A
HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
{is_class?была приоÑтановлена:был приоÑтановлен}.</P>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ru/printer.tmpl b/templates/ru/printer.tmpl
index 90bc7b3..a2e9b40 100644
--- a/templates/ru/printer.tmpl
+++ b/templates/ru/printer.tmpl
@@ -1,7 +1,5 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?в ожидании:{printer_state=4?печать:приоÑтановлен}},
+({printer_state=3?ожидает:{printer_state=4?печать:приоÑтановлен}},
{printer_is_accepting_jobs=0?не принимает заданиÑ:принимает заданиÑ},
{server_is_sharing_printers=0?нет ÑовмеÑтного доÑтупа:{printer_is_shared=0?нет ÑовмеÑтного доÑтупа:разрешен ÑовмеÑтный доÑтуп}} {default_name={printer_name}?, По умолчанию:})</H2>
@@ -15,9 +13,9 @@
{printer_state=5?<OPTION VALUE="start-printer">ВоÑÑтановить печать</OPTION>:<OPTION VALUE="stop-printer">ПриоÑтановить принтер</OPTION>}
{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Принимать заданиÑ</OPTION>:<OPTION VALUE="reject-jobs">Ðе принимать заданиÑ</OPTION>}
<OPTION VALUE="move-jobs">ПеремеÑтить вÑе заданиÑ</OPTION>
-<OPTION VALUE="purge-jobs">Закрыть вÑе заданиÑ</OPTION>
+<OPTION VALUE="purge-jobs">Отменить вÑе заданиÑ</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
</FORM>
<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
@@ -31,17 +29,15 @@
<OPTION VALUE="set-as-default">УÑтановить как принтер по умолчанию</OPTION>
<OPTION VALUE="set-allowed-users">СпиÑок разрешенных пользователей</OPTION>
</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
</FORM>
<TABLE SUMMARY="{printer_name}">
<TR><TH ALIGN="RIGHT" VALIGN="TOP">ОпиÑание:</TH><TD>{printer_info}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">РаÑположение:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Драйвер:</TH><TD>{printer_make_and_model} ({color_supported=1?цветной:черно-белый}{sides_supported?, дуплекÑÐ½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Драйвер:</TH><TD>{printer_make_and_model} ({color_supported=1?цветной:черно-белый}{sides_supported=one-sided?:, дуплекÑÐ½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ})<BR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Подключение:</TH><TD>{device_uri}</TD></TR>
<TR><TH ALIGN="RIGHT" VALIGN="TOP">По умолчанию:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:неизвеÑтный}
+media={media_default?{media_default}:unknown}
{sides_default?sides={sides_default}:}</TD></TR>
</TABLE>
-
-</DIV> \ No newline at end of file
diff --git a/templates/ru/printers.tmpl b/templates/ru/printers.tmpl
index 79feae5..939835c 100644
--- a/templates/ru/printers.tmpl
+++ b/templates/ru/printers.tmpl
@@ -1,11 +1,11 @@
{#printer_name=0?:
<TABLE CLASS="list" SUMMARY="СпиÑок принтеров">
<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Очередь <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Очередь <SMALL>&#x25bc;</SMALL>}</A></TH><TH>ОпиÑание</TH><TH>РаÑположение</TH><TH>Драйвер</TH><TH>СтатуÑ</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Ðаименование <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Ðаименование <SMALL>&#x25bc;</SMALL>}</A></TH><TH>ОпиÑание</TH><TH>РаÑположение</TH><TH>Драйвер</TH><TH>СтатуÑ</TH></TR>
</THEAD>
<TBODY>
{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Idle:{printer_state=4?Печатает:ПриоÑтановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?ожидает:{printer_state=4?печатает:приоÑтановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
}
</TBODY>
</TABLE></DIV>}
diff --git a/templates/ru/restart.tmpl b/templates/ru/restart.tmpl
index c32a5ae..c8fb265 100644
--- a/templates/ru/restart.tmpl
+++ b/templates/ru/restart.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Применение изменений параметров</H2>
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Ожидание"> ДождитеÑÑŒ перезагрузки Ñервера...</P>
-
-</DIV>
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Ожидание"> ДождитеÑÑŒ перезапуÑка Ñервера...</P>
diff --git a/templates/ru/search.tmpl b/templates/ru/search.tmpl
index f338bc6..b5f136c 100644
--- a/templates/ru/search.tmpl
+++ b/templates/ru/search.tmpl
@@ -3,7 +3,7 @@
{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
<P ALIGN="CENTER"><B>ПоиÑк
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?группы:{SECTION=jobs?заданиÑ:принтеры}}}:</B>
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?группы:{SECTION=jobs?заданиÑ:принтера}}}:</B>
<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
TYPE="SUBMIT" VALUE="ПоиÑк"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="ОчиÑтить"></P>
diff --git a/templates/ru/set-printer-options-header.tmpl b/templates/ru/set-printer-options-header.tmpl
index e5c79dd..59a5a79 100644
--- a/templates/ru/set-printer-options-header.tmpl
+++ b/templates/ru/set-printer-options-header.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">УÑтановить параметры по умолчанию Ð´Ð»Ñ {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
diff --git a/templates/ru/set-printer-options-trailer.tmpl b/templates/ru/set-printer-options-trailer.tmpl
index 11adc70..b92988a 100644
--- a/templates/ru/set-printer-options-trailer.tmpl
+++ b/templates/ru/set-printer-options-trailer.tmpl
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
}
--></SCRIPT>
</FORM>
-
-</DIV>
diff --git a/templates/ru/subscription-added.tmpl b/templates/ru/subscription-added.tmpl
index f2b4642..b5c60ab 100644
--- a/templates/ru/subscription-added.tmpl
+++ b/templates/ru/subscription-added.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>ПодпиÑка {subscription_name} была уÑпешно добавлена.</P>
-
-</DIV>
diff --git a/templates/ru/subscription-canceled.tmpl b/templates/ru/subscription-canceled.tmpl
index 5daed1f..1518cbe 100644
--- a/templates/ru/subscription-canceled.tmpl
+++ b/templates/ru/subscription-canceled.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>ПодпиÑка #{notify_subscription_id} была отменена.</P>
-
-</DIV>
diff --git a/templates/ru/test-page.tmpl b/templates/ru/test-page.tmpl
index 6dc1ba1..ce8837c 100644
--- a/templates/ru/test-page.tmpl
+++ b/templates/ru/test-page.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Печать пробной Ñтраницы на {printer_name}</H2>
<P>ÐŸÑ€Ð¾Ð±Ð½Ð°Ñ Ñтраница отправлена на печать;Ðомер Ð·Ð°Ð´Ð°Ð½Ð¸Ñ <A HREF="/{SECTION}/{printer_name}">
{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/ru/trailer.tmpl b/templates/ru/trailer.tmpl
index 09de926..ef87fea 100644
--- a/templates/ru/trailer.tmpl
+++ b/templates/ru/trailer.tmpl
@@ -1,7 +1,6 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS, а так же логотип CUPS ÑвлÑÑŽÑ‚ÑÑ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированными торговыми марками
-<A HREF="http://www.apple.com">Apple Inc.</A> ÐвторÑкие права на CUPS принадлежат (2007-2013) компании Apple Inc. Ð’Ñе права защищены.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+ </div>
+ </div>
+ <div class="footer">CUPS, а так же логотип CUPS ÑвлÑÑŽÑ‚ÑÑ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированными торговыми марками
+<A HREF="http://www.apple.com">Apple Inc.</A> ÐвторÑкие права на CUPS принадлежат (2007-2014) компании Apple Inc. Ð’Ñе права защищены.</div>
+ </body>
+</html>
diff --git a/templates/ru/users.tmpl b/templates/ru/users.tmpl
index ee718b2..6f3aca5 100644
--- a/templates/ru/users.tmpl
+++ b/templates/ru/users.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/templates/set-printer-options-header.tmpl b/templates/set-printer-options-header.tmpl
index 3e7db46..91e0981 100644
--- a/templates/set-printer-options-header.tmpl
+++ b/templates/set-printer-options-header.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Set Default Options for {printer_name}</H2>
<FORM METHOD="POST" ACTION="/admin">
diff --git a/templates/set-printer-options-trailer.tmpl b/templates/set-printer-options-trailer.tmpl
index 11adc70..b92988a 100644
--- a/templates/set-printer-options-trailer.tmpl
+++ b/templates/set-printer-options-trailer.tmpl
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
}
--></SCRIPT>
</FORM>
-
-</DIV>
diff --git a/templates/subscription-added.tmpl b/templates/subscription-added.tmpl
index c288b36..6153d79 100644
--- a/templates/subscription-added.tmpl
+++ b/templates/subscription-added.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>Subscription {subscription_name} has been added successfully.</P>
-
-</DIV>
diff --git a/templates/subscription-canceled.tmpl b/templates/subscription-canceled.tmpl
index 86f2c10..46662cc 100644
--- a/templates/subscription-canceled.tmpl
+++ b/templates/subscription-canceled.tmpl
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
<P>Subscription #{notify_subscription_id} has been canceled.</P>
-
-</DIV>
diff --git a/templates/test-page.tmpl b/templates/test-page.tmpl
index 59e314a..44a74f2 100644
--- a/templates/test-page.tmpl
+++ b/templates/test-page.tmpl
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
<H2 CLASS="title">Print Test Page On {printer_name}</H2>
<P>Test page sent; job ID is <A HREF="/{SECTION}/{printer_name}">
{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/trailer.tmpl b/templates/trailer.tmpl
index c66986a..74447af 100644
--- a/templates/trailer.tmpl
+++ b/templates/trailer.tmpl
@@ -1,8 +1,5 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> Copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+ </div>
+ </div>
+ <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+ </body>
+</html>
diff --git a/templates/users.tmpl b/templates/users.tmpl
index 0889f3f..c88e033 100644
--- a/templates/users.tmpl
+++ b/templates/users.tmpl
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
<FORM METHOD="POST" ACTION="/admin">
<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
</TABLE>
</FORM>
-</DIV>
diff --git a/test/4.1-requests.test b/test/4.1-requests.test
index fbd2a97..ab75c98 100644
--- a/test/4.1-requests.test
+++ b/test/4.1-requests.test
@@ -1,5 +1,5 @@
#
-# "$Id: 4.1-requests.test 8144 2008-11-19 19:23:12Z mike $"
+# "$Id: 4.1-requests.test 11398 2013-11-06 20:11:11Z msweet $"
#
# Verify that the server requires the following attributes:
#
@@ -155,5 +155,5 @@
STATUS server-error-version-not-supported
}
#
-# End of "$Id: 4.1-requests.test 8144 2008-11-19 19:23:12Z mike $"
+# End of "$Id: 4.1-requests.test 11398 2013-11-06 20:11:11Z msweet $"
#
diff --git a/test/4.2-cups-printer-ops.test b/test/4.2-cups-printer-ops.test
index 67c515d..4052ee7 100644
--- a/test/4.2-cups-printer-ops.test
+++ b/test/4.2-cups-printer-ops.test
@@ -1,5 +1,5 @@
#
-# "$Id: 4.2-cups-printer-ops.test 6379 2007-03-21 14:57:22Z mike $"
+# "$Id: 4.2-cups-printer-ops.test 11798 2014-04-07 15:18:44Z msweet $"
#
# Verify that the CUPS printer operations work.
#
@@ -204,6 +204,7 @@
ATTR uri device-uri file:/tmp/Test1
ATTR enum printer-state 3
ATTR boolean printer-is-accepting-jobs true
+ ATTR text printer-info "Test Printer 1"
FILE testps.ppd
@@ -323,5 +324,5 @@
}
#
-# End of "$Id: 4.2-cups-printer-ops.test 6379 2007-03-21 14:57:22Z mike $"
+# End of "$Id: 4.2-cups-printer-ops.test 11798 2014-04-07 15:18:44Z msweet $"
#
diff --git a/test/4.3-job-ops.test b/test/4.3-job-ops.test
index 2f2236b..fbfa3b9 100644
--- a/test/4.3-job-ops.test
+++ b/test/4.3-job-ops.test
@@ -1,5 +1,5 @@
#
-# "$Id: 4.3-job-ops.test 7550 2008-05-12 16:40:40Z mike $"
+# "$Id: 4.3-job-ops.test 11398 2013-11-06 20:11:11Z msweet $"
#
# Verify that the IPP job operations work.
#
@@ -326,5 +326,5 @@
}
#
-# End of "$Id: 4.3-job-ops.test 7550 2008-05-12 16:40:40Z mike $"
+# End of "$Id: 4.3-job-ops.test 11398 2013-11-06 20:11:11Z msweet $"
#
diff --git a/test/4.4-subscription-ops.test b/test/4.4-subscription-ops.test
index f6cf820..e0a18a3 100644
--- a/test/4.4-subscription-ops.test
+++ b/test/4.4-subscription-ops.test
@@ -1,5 +1,5 @@
#
-# "$Id: 4.4-subscription-ops.test 6635 2007-07-09 20:34:48Z mike $"
+# "$Id: 4.4-subscription-ops.test 11398 2013-11-06 20:11:11Z msweet $"
#
# Verify that the CUPS subscription operations work.
#
@@ -149,5 +149,5 @@
}
#
-# End of "$Id: 4.4-subscription-ops.test 6635 2007-07-09 20:34:48Z mike $"
+# End of "$Id: 4.4-subscription-ops.test 11398 2013-11-06 20:11:11Z msweet $"
#
diff --git a/test/5.1-lpadmin.sh b/test/5.1-lpadmin.sh
index e4a8ed4..c6158da 100644
--- a/test/5.1-lpadmin.sh
+++ b/test/5.1-lpadmin.sh
@@ -1,17 +1,17 @@
#!/bin/sh
#
-# "$Id: 5.1-lpadmin.sh 7494 2008-04-25 18:36:46Z mike $"
+# "$Id: 5.1-lpadmin.sh 12393 2014-12-19 15:33:22Z msweet $"
#
-# Test the lpadmin command.
+# Test the lpadmin command.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2005 by Easy Software Products, all rights reserved.
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 1997-2005 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
echo "Add Printer Test"
@@ -22,7 +22,12 @@ if test $? != 0; then
echo " FAILED"
exit 1
else
- echo " PASSED"
+ if test -f $CUPS_SERVERROOT/ppd/Test3.ppd; then
+ echo " PASSED"
+ else
+ echo " FAILED (No PPD)"
+ exit 1
+ fi
fi
echo ""
@@ -52,8 +57,8 @@ echo ""
echo "Add Shared Printer Test"
echo ""
-echo " lpadmin -p Test3 -E -v ipp://localhost:8631/printers/Test2 -m raw"
-$VALGRIND ../systemv/lpadmin -p Test3 -E -v ipp://localhost:8631/printers/Test2 -m raw 2>&1
+echo " lpadmin -p Test3 -E -v ipp://localhost:$IPP_PORT/printers/Test2 -m raw"
+$VALGRIND ../systemv/lpadmin -p Test3 -E -v ipp://localhost:$IPP_PORT/printers/Test2 -m raw 2>&1
if test $? != 0; then
echo " FAILED"
exit 1
@@ -63,5 +68,5 @@ fi
echo ""
#
-# End of "$Id: 5.1-lpadmin.sh 7494 2008-04-25 18:36:46Z mike $".
+# End of "$Id: 5.1-lpadmin.sh 12393 2014-12-19 15:33:22Z msweet $".
#
diff --git a/test/5.2-lpc.sh b/test/5.2-lpc.sh
index ff15a87..3797ab0 100644
--- a/test/5.2-lpc.sh
+++ b/test/5.2-lpc.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id: 5.2-lpc.sh 6649 2007-07-11 21:46:42Z mike $"
+# "$Id: 5.2-lpc.sh 11398 2013-11-06 20:11:11Z msweet $"
#
# Test the lpc command.
#
@@ -27,5 +27,5 @@ fi
echo ""
#
-# End of "$Id: 5.2-lpc.sh 6649 2007-07-11 21:46:42Z mike $".
+# End of "$Id: 5.2-lpc.sh 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/5.3-lpq.sh b/test/5.3-lpq.sh
index 633508c..8c9491a 100644
--- a/test/5.3-lpq.sh
+++ b/test/5.3-lpq.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id: 5.3-lpq.sh 6649 2007-07-11 21:46:42Z mike $"
+# "$Id: 5.3-lpq.sh 11398 2013-11-06 20:11:11Z msweet $"
#
# Test the lpq command.
#
@@ -27,5 +27,5 @@ fi
echo ""
#
-# End of "$Id: 5.3-lpq.sh 6649 2007-07-11 21:46:42Z mike $".
+# End of "$Id: 5.3-lpq.sh 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/5.4-lpstat.sh b/test/5.4-lpstat.sh
index b2e38f1..9d9a182 100644
--- a/test/5.4-lpstat.sh
+++ b/test/5.4-lpstat.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id: 5.4-lpstat.sh 6649 2007-07-11 21:46:42Z mike $"
+# "$Id: 5.4-lpstat.sh 12490 2015-02-06 18:45:48Z msweet $"
#
# Test the lpstat command.
#
@@ -30,7 +30,7 @@ echo "LPSTAT Test"
echo ""
echo " lpstat -H"
server="`$VALGRIND ../systemv/lpstat -H 2>&1`"
-if test $? != 0 -o "x$server" != xlocalhost:8631; then
+if test $? != 0 -o "x$server" != x$CUPS_SERVER; then
echo " FAILED ($server)"
exit 1
else
@@ -39,5 +39,5 @@ fi
echo ""
#
-# End of "$Id: 5.4-lpstat.sh 6649 2007-07-11 21:46:42Z mike $".
+# End of "$Id: 5.4-lpstat.sh 12490 2015-02-06 18:45:48Z msweet $".
#
diff --git a/test/5.5-lp.sh b/test/5.5-lp.sh
index aa326a8..8d67330 100644
--- a/test/5.5-lp.sh
+++ b/test/5.5-lp.sh
@@ -1,10 +1,10 @@
#!/bin/sh
#
-# "$Id: 5.5-lp.sh 7415 2008-03-31 22:33:20Z mike $"
+# "$Id: 5.5-lp.sh 12066 2014-07-30 18:30:44Z msweet $"
#
# Test the lp command.
#
-# Copyright 2007-2012 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 1997-2005 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -55,6 +55,7 @@ echo ""
echo " lp -d Test1 testfile.jpg"
echo " lp -d Test2 testfile.jpg"
i=0
+pids=""
while test $i -lt $1; do
j=1
while test $j -le $2; do
@@ -63,12 +64,13 @@ while test $i -lt $1; do
done
$VALGRIND ../systemv/lp -d Test1 testfile.jpg 2>&1 &
+ pids="$pids $!"
$VALGRIND ../systemv/lp -d Test2 testfile.jpg 2>&1 &
- lppid=$!
+ pids="$pids $!"
i=`expr $i + 1`
done
-wait $lppid
+wait $pids
if test $? != 0; then
echo " FAILED"
exit 1
@@ -79,6 +81,19 @@ echo ""
./waitjobs.sh
+echo "LPSTAT Completed Jobs Order Test"
+echo ""
+echo " lpstat -W completed -o"
+$VALGRIND ../systemv/lpstat -W completed -o | tee $BASE/lpstat-completed.txt
+if test "`uniq -d $BASE/lpstat-completed.txt`" != ""; then
+ echo " FAILED"
+ exit 1
+else
+ echo " PASSED"
+fi
+echo ""
+
+
#
-# End of "$Id: 5.5-lp.sh 7415 2008-03-31 22:33:20Z mike $".
+# End of "$Id: 5.5-lp.sh 12066 2014-07-30 18:30:44Z msweet $".
#
diff --git a/test/5.6-lpr.sh b/test/5.6-lpr.sh
index 9a26e75..c918ab2 100644
--- a/test/5.6-lpr.sh
+++ b/test/5.6-lpr.sh
@@ -1,10 +1,10 @@
#!/bin/sh
#
-# "$Id: 5.6-lpr.sh 7409 2008-03-29 00:26:03Z mike $"
+# "$Id: 5.6-lpr.sh 12065 2014-07-30 17:56:35Z msweet $"
#
# Test the lpr command.
#
-# Copyright 2007-2012 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 1997-2005 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -55,6 +55,7 @@ echo ""
echo " lpr -P Test1 testfile.jpg"
echo " lpr -P Test2 testfile.jpg"
i=0
+pids=""
while test $i -lt $1; do
j=1
while test $j -le $2; do
@@ -63,12 +64,13 @@ while test $i -lt $1; do
done
$VALGRIND ../berkeley/lpr -P Test1 testfile.jpg 2>&1 &
+ pids="$pids $!"
$VALGRIND ../berkeley/lpr -P Test2 testfile.jpg 2>&1 &
- lprpid=$!
+ pids="$pids $!"
i=`expr $i + 1`
done
-wait $lppid
+wait $pids
if test $? != 0; then
echo " FAILED"
exit 1
@@ -80,5 +82,5 @@ echo ""
./waitjobs.sh
#
-# End of "$Id: 5.6-lpr.sh 7409 2008-03-29 00:26:03Z mike $".
+# End of "$Id: 5.6-lpr.sh 12065 2014-07-30 17:56:35Z msweet $".
#
diff --git a/test/5.7-lprm.sh b/test/5.7-lprm.sh
index 4b96920..fd89569 100644
--- a/test/5.7-lprm.sh
+++ b/test/5.7-lprm.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id: 5.7-lprm.sh 7409 2008-03-29 00:26:03Z mike $"
+# "$Id: 5.7-lprm.sh 11398 2013-11-06 20:11:11Z msweet $"
#
# Test the lprm command.
#
@@ -43,5 +43,5 @@ fi
echo ""
#
-# End of "$Id: 5.7-lprm.sh 7409 2008-03-29 00:26:03Z mike $".
+# End of "$Id: 5.7-lprm.sh 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/5.8-cancel.sh b/test/5.8-cancel.sh
index 88b7dd4..321b75b 100644
--- a/test/5.8-cancel.sh
+++ b/test/5.8-cancel.sh
@@ -1,10 +1,10 @@
#!/bin/sh
#
-# "$Id: 5.8-cancel.sh 7409 2008-03-29 00:26:03Z mike $"
+# "$Id: 5.8-cancel.sh 11398 2013-11-06 20:11:11Z msweet $"
#
# Test the cancel command.
#
-# Copyright 2007-2011 by Apple Inc.
+# Copyright 2007-2013 by Apple Inc.
# Copyright 1997-2006 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -40,6 +40,18 @@ else
fi
echo ""
+echo "Purge All Test"
+echo ""
+echo " cancel -a -x"
+$VALGRIND ../systemv/cancel -a -x 2>&1
+if test $? != 0; then
+ echo " FAILED"
+ exit 1
+else
+ echo " PASSED"
+fi
+echo ""
+
#
-# End of "$Id: 5.8-cancel.sh 7409 2008-03-29 00:26:03Z mike $".
+# End of "$Id: 5.8-cancel.sh 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/5.9-lpinfo.sh b/test/5.9-lpinfo.sh
index a6ea364..416ac58 100644
--- a/test/5.9-lpinfo.sh
+++ b/test/5.9-lpinfo.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id: 5.9-lpinfo.sh 7711 2008-07-02 04:39:27Z mike $"
+# "$Id: 5.9-lpinfo.sh 11398 2013-11-06 20:11:11Z msweet $"
#
# Test the lpinfo command.
#
@@ -51,5 +51,5 @@ fi
echo ""
#
-# End of "$Id: 5.9-lpinfo.sh 7711 2008-07-02 04:39:27Z mike $".
+# End of "$Id: 5.9-lpinfo.sh 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/Dependencies b/test/Dependencies
index 69b96a6..e2822d0 100644
--- a/test/Dependencies
+++ b/test/Dependencies
@@ -1,18 +1,29 @@
-ippserver.o: ippserver.c ../cups/cups-private.h ../cups/string-private.h \
+ippfind.o: ippfind.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ippinfra.o: ippinfra.c ../config.h ../cups/cups.h ../cups/file.h \
+ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
+ ../cups/language.h ../cups/pwg.h ../cups/string-private.h \
+ ../cups/thread-private.h
+ippproxy.o: ippproxy.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
+ ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
+ ../cups/pwg.h
+ippserver.o: ippserver.c ../config.h ../cups/cups.h ../cups/file.h \
+ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
+ ../cups/language.h ../cups/pwg.h ../cups/string-private.h \
+ ../cups/thread-private.h
ipptool.o: ipptool.c ../cups/cups-private.h ../cups/string-private.h \
../config.h ../cups/debug-private.h ../cups/versioning.h \
- ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/http-private.h ../cups/md5-private.h \
- ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
- ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+ ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+ ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+ ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
../cups/file-private.h
xmltotest.o: xmltotest.c ../config.h ../cups/cups.h ../cups/file.h \
../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
- ../cups/language.h
+ ../cups/language.h ../cups/pwg.h
diff --git a/test/Makefile b/test/Makefile
index 4974b7c..01af7cc 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,9 +1,9 @@
#
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $"
#
# IPP test makefile for CUPS.
#
-# Copyright 2007-2012 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 1997-2006 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -40,16 +40,27 @@ TESTFILES = \
create-printer-subscription.test \
get-completed-jobs.test \
get-jobs.test \
+ get-notifications.test \
get-printer-attributes.test \
+ get-subscriptions.test \
ipp-1.1.test \
ipp-2.0.test \
ipp-2.1.test \
- ipp-2.2.test
+ ipp-2.2.test \
+ ipp-everywhere.test \
+ print-job.test \
+ print-job-deflate.test \
+ print-job-gzip.test \
+ validate-job.test
OBJS = \
+ ippfind.o \
+ ippinfra.o \
+ ippproxy.o \
ippserver.o \
ipptool.o \
xmltotest.o
TARGETS = \
+ $(IPPFIND_BIN) \
ippserver \
ipptool \
ipptool-static
@@ -81,7 +92,7 @@ unittests:
#
clean:
- $(RM) $(TARGETS) $(OBJS)
+ $(RM) $(TARGETS) $(OBJS) ippfind-static ippinfra ippinfra-shared ippproxy ippproxy-shared ippserver-shared
#
@@ -122,9 +133,15 @@ install-exec:
echo Installing ipptool in $(BINDIR)...
$(INSTALL_DIR) -m 755 $(BINDIR)
$(INSTALL_BIN) ipptool $(BINDIR)
+ if test -x ippfind; then \
+ $(INSTALL_BIN) ippfind $(BINDIR); \
+ fi
if test "x$(SYMROOT)" != "x"; then \
$(INSTALL_DIR) $(SYMROOT); \
+ cp ippfind $(SYMROOT); \
+ dsymutil $(SYMROOT)/ippfind; \
cp ipptool $(SYMROOT); \
+ dsymutil $(SYMROOT)/ipptool; \
fi
@@ -158,6 +175,56 @@ uninstall:
#
+# ippfind
+#
+
+ippfind: ippfind.o ../cups/$(LIBCUPS) ../cups/$(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ ippfind.o $(LIBS)
+ echo Linking $@-static...
+ $(CC) $(LDFLAGS) -o $@-static ippfind.o ../cups/$(LIBCUPSSTATIC) \
+ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
+# ippinfra
+#
+
+ippinfra: ippinfra.o ../cups/$(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ ippinfra.o ../cups/$(LIBCUPSSTATIC) \
+ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
+# ippinfra-shared
+#
+
+ippinfra-shared: ippinfra.o ../cups/$(LIBCUPS)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ ippinfra.o $(LIBS)
+
+
+#
+# ippproxy
+#
+
+ippproxy: ippproxy.o ../cups/$(LIBCUPSSTATIC)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ ippproxy.o ../cups/$(LIBCUPSSTATIC) \
+ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
+# ippproxy-shared
+#
+
+ippproxy-shared: ippproxy.o ../cups/$(LIBCUPS)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o $@ ippproxy.o $(LIBS)
+
+
+#
# ippserver
#
@@ -214,5 +281,5 @@ include Dependencies
#
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $".
#
diff --git a/test/cancel-current-job.test b/test/cancel-current-job.test
index cb37f22..1c74769 100644
--- a/test/cancel-current-job.test
+++ b/test/cancel-current-job.test
@@ -1,5 +1,5 @@
#
-# "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $"
+# "$Id: cancel-current-job.test 11398 2013-11-06 20:11:11Z msweet $"
#
# Cancel the currently printing job.
#
@@ -61,5 +61,5 @@
#
-# End of "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $".
+# End of "$Id: cancel-current-job.test 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/create-printer-subscription.test b/test/create-printer-subscription.test
index 6195917..eefb1e6 100644
--- a/test/create-printer-subscription.test
+++ b/test/create-printer-subscription.test
@@ -1,26 +1,52 @@
#
-# "$Id$"
+# "$Id: create-printer-subscription.test 11896 2014-05-27 15:00:06Z msweet $"
#
-# Create a printer subscription.
+# Create a printer subscription.
#
-# Copyright 2007-2010 by Apple Inc.
-# Copyright 2001-2006 by Easy Software Products. All rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
# Usage:
#
-# ./ipptool -d recipient=uri printer-uri create-printer-subscription.test
+# ./ipptool [-d recipient=uri] printer-uri create-printer-subscription.test
#
+{
+ # The name of the test...
+ NAME "Create a push printer subscription"
+ SKIP-IF-NOT-DEFINED recipient
+
+ # The operation to use
+ OPERATION Create-Printer-Subscription
+
+ # The attributes to send
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+
+ GROUP subscription-attributes-tag
+ ATTR uri notify-recipient-uri $recipient
+ ATTR keyword notify-events printer-config-changed,printer-state-changed
+
+ # What statuses are OK?
+ STATUS successful-ok
+
+ # What attributes do we expect?
+ EXPECT notify-subscription-id OF-TYPE integer WITH-VALUE >0
+ DISPLAY notify-subscription-id
+}
{
# The name of the test...
- NAME "Create a printer subscription"
+ NAME "Create a pull printer subscription"
+ SKIP-IF-DEFINED recipient
# The operation to use
OPERATION Create-Printer-Subscription
@@ -32,8 +58,8 @@
ATTR uri printer-uri $uri
GROUP subscription-attributes-tag
- ATTR uri notify-recipient $recipient
- ATTR keyword notify-events printer-state-changed
+ ATTR keyword notify-pull-method ippget
+ ATTR keyword notify-events printer-config-changed,printer-state-changed
# What statuses are OK?
STATUS successful-ok
@@ -45,5 +71,5 @@
#
-# End of "$Id$"
+# End of "$Id: create-printer-subscription.test 11896 2014-05-27 15:00:06Z msweet $"
#
diff --git a/test/everywhere/bonjour-tests.sh b/test/everywhere/bonjour-tests.sh
new file mode 100755
index 0000000..1a24852
--- /dev/null
+++ b/test/everywhere/bonjour-tests.sh
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/test/everywhere/document-format-tests.sh b/test/everywhere/document-format-tests.sh
new file mode 100755
index 0000000..1a24852
--- /dev/null
+++ b/test/everywhere/document-format-tests.sh
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/test/everywhere/document-format-tests.test b/test/everywhere/document-format-tests.test
new file mode 100644
index 0000000..5bcf6c0
--- /dev/null
+++ b/test/everywhere/document-format-tests.test
@@ -0,0 +1,9689 @@
+#
+# "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $"
+#
+# IPP Everywhere test suite.
+#
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+# Usage:
+#
+# ./ipptool -V 2.0 -tf filename.ext printer-uri ipp-everywhere.test
+#
+
+# Do all of the IPP/1.1 and IPP/2.0 tests
+INCLUDE "ipp-2.0.test"
+
+
+# Test required printer description attribute support.
+#
+# Required by: PWG 5100.14
+{
+ NAME "PWG 5100.14 section 5.1/5.2 - Required Operations and Attributes"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format application/octet-stream
+ ATTR keyword requested-attributes all,media-col-database
+
+ STATUS successful-ok
+
+ # Operations
+ EXPECT operations-supported WITH-VALUE 0x0002 # Print-Job
+ EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
+ EXPECT operations-supported WITH-VALUE 0x0005 # Create-Job
+ EXPECT operations-supported WITH-VALUE 0x0006 # Send-Document
+ EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
+ EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
+ EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
+ EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
+ EXPECT operations-supported WITH-VALUE 0x0039 # Cancel-My-Jobs
+ EXPECT operations-supported WITH-VALUE 0x003b # Close-Job
+ EXPECT operations-supported WITH-VALUE 0x003c # Identify-Printer
+
+ # Printer description attributes
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "deflate" DEFINE-MATCH HAVE_DEFLATE
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "gzip" DEFINE-MATCH HAVE_GZIP
+
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/jpeg"
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/pwg-raster"
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "/^(application/pdf|application/openxps)$/" DEFINE-MATCH PDF_OR_OPENXPS
+
+ EXPECT feed-orientation-supported OF-TYPE keyword IN-GROUP printer-attributes-tag DEFINE-MATCH FEED_ORIENTATION_SUPPORTED
+ EXPECT feed-orientation-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED FEED_ORIENTATION_SUPPORTED
+
+ EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag DEFINE-MATCH FINISHINGS_SUPPORTED
+ EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag IF-DEFINED FINISHINGS_SUPPORTED
+
+ EXPECT identify-actions-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/"
+ EXPECT identify-actions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/"
+
+ EXPECT ipp-features-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "ipp-everywhere"
+
+ EXPECT job-account-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNT_ID_SUPPORTED
+ EXPECT job-account-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNT_ID_SUPPORTED
+
+ EXPECT job-accounting-user-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNTING_USER_ID_SUPPORTED
+ EXPECT job-accounting-user-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNTING_USER_ID_SUPPORTED
+
+ EXPECT job-constraints-supported OF-TYPE collection IN-GROUP printer-attributes-tag DEFINE-MATCH JOB_CONSTRAINTS_SUPPORTED
+ EXPECT job-resolvers-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED JOB_CONSTRAINTS_SUPPORTED
+
+ EXPECT job-creation-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+
+ EXPECT job-ids-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true
+
+ EXPECT preferred-attributes-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT media-bottom-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-left-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-right-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-top-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+
+ EXPECT media-col-database OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-source-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT multiple-operation-time-out OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+
+ EXPECT multiple-operation-time-out-action OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(abort-job|hold-job|process-job)$/"
+
+ EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-number"
+ EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "pages"
+
+ EXPECT page-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true IF-DEFINED PDF_OR_OPENXPS
+
+ EXPECT print-color-mode-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/"
+ EXPECT print-color-mode-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/"
+
+ EXPECT print-content-optimize-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|graphic|photo|text|text-and-graphic)$/"
+ EXPECT print-content-optimize-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|graphic|photo|text|text-and-graphic)$/"
+
+ EXPECT print-rendering-intent-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/"
+ EXPECT print-rendering-intent-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/"
+
+ EXPECT ?printer-alert OF-TYPE octetString IN-GROUP printer-attributes-tag
+ EXPECT ?printer-alert-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-alert
+
+ EXPECT printer-charge-info DEFINE-MATCH PRINTER_CHARGE_INFO
+ EXPECT ?printer-charge-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-charge-info-uri IF-DEFINED PRINTER_CHARGE_INFO
+ EXPECT ?printer-charge-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT printer-config-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-config-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1
+
+ EXPECT printer-device-id OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^([-A-Za-z ]+:[^;]*;)+$/"
+
+ EXPECT printer-geo-location OF-TYPE uri|unknown IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^geo:/"
+
+ EXPECT printer-get-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-format"
+
+ EXPECT ?printer-icc-profiles-supported OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT printer-icons OF-TYPE uri IN-GROUP printer-attributes-tag
+
+ EXPECT ?printer-mandatory-job-attributes OF-TYPE keyword IN-GROUP printer-attributes-tag
+
+ EXPECT printer-organization OF-TYPE text IN-GROUP printer-attributes-tag
+ EXPECT printer-organizational-unit OF-TYPE text IN-GROUP printer-attributes-tag
+
+ EXPECT printer-state-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-state-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1
+
+ EXPECT printer-supply OF-TYPE octetString IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply-description
+ EXPECT printer-supply-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply
+
+ EXPECT printer-supply-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT printer-uuid OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^urn:uuid:[0-9A-Fa-f]{8,8}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{12,12}/"
+
+ EXPECT pwg-raster-document-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 150dpi DEFINE-MATCH HAVE_150DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 180dpi DEFINE-MATCH HAVE_180DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 300dpi DEFINE-MATCH HAVE_300DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 3600dpi DEFINE-MATCH HAVE_360DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 600dpi DEFINE-MATCH HAVE_600DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 720dpi DEFINE-MATCH HAVE_720DPI
+
+ EXPECT pwg-raster-document-sheet-back OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT pwg-raster-document-type-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "black_1" DEFINE-MATCH HAVE_BLACK_1
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "cmyk_8" DEFINE-MATCH HAVE_CMYK_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "sgray_8" DEFINE-MATCH HAVE_SGRAY_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_8" DEFINE-MATCH HAVE_SRGB_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_16" DEFINE-MATCH HAVE_SRGB_16
+
+ EXPECT which-jobs-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+}
+
+
+# Test printing all sample documents
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+
+#
+# End of "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $".
+#
diff --git a/test/everywhere/ipp-tests.sh b/test/everywhere/ipp-tests.sh
new file mode 100755
index 0000000..1a24852
--- /dev/null
+++ b/test/everywhere/ipp-tests.sh
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/test/everywhere/ipp-tests.test b/test/everywhere/ipp-tests.test
new file mode 100644
index 0000000..0fb6486
--- /dev/null
+++ b/test/everywhere/ipp-tests.test
@@ -0,0 +1,12086 @@
+#
+# "$Id$"
+#
+# IPP Everywhere Printer Self-Certification - IPP Tests
+#
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+
+# All tests are done using IPP/2.0
+VERSION 2.0
+
+# Regular expression for PWG media size names (eek!)
+DEFINE MEDIA_REGEX "/^(choice(_((custom|na|asme|roc|oe|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])in|(custom|iso|jis|jpn|prc|om|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])mm)){2,}|(custom|na|asme|roc|oe|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])in|(custom|iso|jis|jpn|prc|om|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])mm)$$/"
+
+# Regular expressions for URI schemes:
+#
+# HTTP_URI_SCHEME - Matches strings beginning with http:// or https://
+# IPP_URI_SCHEME - Matches strings beginning with ipp:// or ipps://
+
+DEFINE HTTP_URI_SCHEME "/^https?://.+$$/"
+DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
+
+
+# Test that a request-id value of 0 is not accepted.
+#
+# Required by: RFC 2911 section 3.1.1
+{
+ NAME "I1. RFC 2911 section 3.1.1: Bad request-id value 0"
+ REQUEST-ID 0
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+
+ STATUS client-error-bad-request
+ EXPECT !printer-uri-supported
+}
+
+
+# Test that the first two attributes must be attributes-charset and
+# attributes-natural-language.
+#
+# Required by: RFC 2911 section 3.1.4
+{
+ NAME "I2. RFC 2911 section 3.1.4: No Operation Attributes"
+ REQUEST-ID random
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+
+ STATUS client-error-bad-request
+ EXPECT !printer-uri-supported
+}
+{
+ NAME "I3. RFC 2911 section 3.1.4: attributes-charset"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR uri printer-uri $uri
+
+ STATUS client-error-bad-request
+ EXPECT !printer-uri-supported
+}
+{
+ NAME "I4. RFC 2911 section 3.1.4: attributes-natural-language"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+
+ STATUS client-error-bad-request
+ EXPECT !printer-uri-supported
+}
+{
+ NAME "I5. RFC 2911 section 3.1.4: attributes-natural-language + attributes-charset"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR charset attributes-charset utf-8
+ ATTR uri printer-uri $uri
+
+ STATUS client-error-bad-request
+ EXPECT !printer-uri-supported
+}
+{
+ NAME "I6. RFC 2911 section 3.1.4: attributes-charset + attributes-natural-language"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+
+ STATUS successful-ok
+ EXPECT printer-uri-supported OF-TYPE uri WITH-ALL-VALUES "$IPP_URI_SCHEME"
+}
+
+
+# Test that bad IPP versions are not supported.
+#
+# Required by: RFC 2911 section 3.1.8
+{
+ # The name of the test...
+ NAME "I7. RFC 2911 section 3.1.8: Unsupported IPP version 0.0"
+ VERSION 0.0
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+
+ STATUS server-error-version-not-supported
+ EXPECT !printer-uri-supported
+}
+
+
+# Test that printer operations require the printer-uri operation attribute.
+#
+# Required by: RFC 2911 section 3.2
+{
+ NAME "I8. RFC 2911 section 3.2: No printer-uri operation attribute"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+
+ STATUS client-error-bad-request
+ EXPECT !printer-uri-supported
+}
+
+
+# Test Print-Job operation
+#
+# Required by: RFC 2911 section 3.2.1
+{
+ NAME "I9. RFC 2911 section 3.2.1: Print-Job Operation"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ FILE $filename
+
+ STATUS successful-ok
+ STATUS client-error-document-format-not-supported
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state WITH-VALUE 7,8,9 DEFINE-MATCH PRINT_JOB_COMPLETED
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+# Test Validate-Job operation
+#
+# Required by: RFC 2911 section 3.2.3
+{
+ NAME "I10. RFC 2911 section 3.2.3: Validate-Job Operation"
+ OPERATION Validate-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+
+ STATUS successful-ok
+}
+
+
+# Test Get-Printer-Attributes operation
+#
+# Required by: RFC 2911 section 3.2.5
+{
+ NAME "I11. RFC 2911 section 3.2.5: Get-Printer-Attributes Operation (default)"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+
+ STATUS successful-ok
+
+ # Display some useful information to identify the test
+ DISPLAY color-supported
+ DISPLAY compression-supported
+ DISPLAY document-format-supported
+ DISPLAY finishings-supported
+ DISPLAY ipp-versions-supported
+ DISPLAY job-sheets-supported
+ DISPLAY media-supported
+ DISPLAY number-up-supported
+ DISPLAY operations-supported
+ DISPLAY pages-per-minute
+ DISPLAY pages-per-minute-color
+ DISPLAY print-quality-supported
+ DISPLAY printer-uri-supported
+ DISPLAY reference-uri-schemes-supported
+ DISPLAY sizes-supported
+ DISPLAY uri-authentication-supported
+ DISPLAY uri-security-supported
+
+ # Operations
+ EXPECT operations-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 0x0002 # Print-Job
+ EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
+ EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
+ EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
+ EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
+ EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
+
+ # Job template attributes
+ EXPECT ?copies-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?copies-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag
+ EXPECT ?finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag
+ EXPECT ?finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3
+ EXPECT ?job-hold-until-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?job-hold-until-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE no-hold
+ EXPECT job-hold-until-default IF-DEFINED OPTIONAL_HOLD_JOB
+ EXPECT job-hold-until-supported IF-DEFINED OPTIONAL_HOLD_JOB
+ EXPECT ?job-priority-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0,<101
+ EXPECT ?job-priority-supported OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0,<101
+ EXPECT ?job-sheets-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+ EXPECT ?job-sheets-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE none
+ EXPECT ?media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+ EXPECT ?media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+ EXPECT ?multiple-document-handling-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+ EXPECT ?multiple-document-handling-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+ EXPECT ?number-up-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?number-up-supported OF-TYPE integer|rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >0
+ EXPECT ?number-up-supported WITH-VALUE 1
+ EXPECT ?orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+ EXPECT ?orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5,6
+ EXPECT ?pages-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag
+ EXPECT ?print-quality-default OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+ EXPECT ?print-quality-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5
+ EXPECT ?printer-resolution-default OF-TYPE resolution IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?printer-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag
+ EXPECT ?sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+ EXPECT ?sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+
+ # Job template attributes for specific tests...
+ EXPECT copies-supported WITH-VALUE >1 DEFINE-MATCH OPTIONAL_COPIES
+ EXPECT document-format-supported WITH-VALUE "application/pdf" DEFINE-MATCH OPTIONAL_PDF
+ EXPECT document-format-supported WITH-VALUE "application/postscript" DEFINE-MATCH OPTIONAL_POSTSCRIPT
+ EXPECT document-format-supported WITH-VALUE "image/jpeg" DEFINE-MATCH OPTIONAL_JPEG
+ EXPECT job-sheets-supported WITH-VALUE "standard" DEFINE-MATCH OPTIONAL_STANDARD_SHEET
+ EXPECT media-supported WITH-VALUE "a4" DEFINE-VALUE OPTIONAL_A4_MEDIA
+ EXPECT media-supported WITH-VALUE "iso-a4" DEFINE-VALUE OPTIONAL_A4_MEDIA
+ EXPECT media-supported WITH-VALUE "iso_a4_210x297mm" DEFINE-VALUE OPTIONAL_A4_MEDIA
+ EXPECT media-supported WITH-VALUE "letter" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+ EXPECT media-supported WITH-VALUE "na-letter" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+ EXPECT media-supported WITH-VALUE "na_letter_8.5x11in" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+ EXPECT media-supported WITH-VALUE "index-4x6" DEFINE-VALUE OPTIONAL_4X6_MEDIA
+ EXPECT media-supported WITH-VALUE "na_index-4x6_4x6in" DEFINE-VALUE OPTIONAL_4X6_MEDIA
+ EXPECT number-up-supported WITH-VALUE 2 DEFINE-MATCH OPTIONAL_2UP
+ EXPECT print-quality WITH-VALUE 3 DEFINE-MATCH OPTIONAL_DRAFT_QUALITY
+ EXPECT print-quality WITH-VALUE 4 DEFINE-MATCH OPTIONAL_NORMAL_QUALITY
+ EXPECT print-quality WITH-VALUE 5 DEFINE-MATCH OPTIONAL_BEST_QUALITY
+ EXPECT sides-supported WITH-VALUE "two-sided-long-edge" DEFINE-MATCH OPTIONAL_DUPLEX
+
+ # Printer description attributes
+ EXPECT ?color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?job-impressions-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?job-k-octets-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?multiple-operation-time-out OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?pages-per-minute OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?pages-per-minute-color OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?printer-driver-installer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?printer-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT ?printer-location OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT ?printer-make-and-model OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT ?printer-message-from-operator OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT ?printer-more-info OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+ EXPECT ?printer-more-info-manufacturer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+ EXPECT ?printer-state-message OF-TYPE text IN-GROUP printer-attributes-tag
+ EXPECT ?reference-uri-schemes-supported OF-TYPE uriScheme IN-GROUP printer-attributes-tag
+ EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED OPTIONAL_PRINT_URI
+ EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED OPTIONAL_SEND_URI IF-NOT-DEFINED OPTIONAL_PRINT_URI
+ EXPECT charset-configured OF-TYPE charset IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT charset-supported OF-TYPE charset IN-GROUP printer-attributes-tag WITH-VALUE utf-8
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE none
+ EXPECT document-format-default OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag
+ EXPECT generated-natural-language-supported OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag
+ EXPECT ipp-versions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE 1.1
+ EXPECT natural-language-configured OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT pdl-override-supported OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-is-accepting-jobs OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-name OF-TYPE name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT printer-state OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+ EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag
+ EXPECT printer-up-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-security-supported WITH-ALL-VALUES "$IPP_URI_SCHEME"
+ EXPECT queued-job-count OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT uri-authentication-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+ EXPECT uri-security-supported OF-TYPE keyword IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-authentication-supported
+}
+
+
+# Test Get-Printer-Attributes operation with requested-attributes
+#
+# Required by: RFC 2911 section 3.2.5
+{
+ NAME "I12. RFC 2911 section 3.2.5: Get-Printer-Attributes Operation (requested-attributes)"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+ ATTR keyword requested-attributes printer-uri-supported
+
+ STATUS successful-ok
+
+ EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$IPP_URI_SCHEME"
+ EXPECT !printer-name
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ NAME "I13. RFC 2911 section 3.2.6: Get-Jobs Operation (default)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT !job-printer-uri
+ EXPECT !job-more-info
+ EXPECT !job-name
+ EXPECT !job-originating-user-name
+ EXPECT !job-state
+ EXPECT !job-state-reasons
+ EXPECT !job-state-message
+ EXPECT !job-detailed-status-messages
+ EXPECT !number-of-documents
+ EXPECT !output-device-assigned
+ EXPECT !time-at-creation
+ EXPECT !time-at-processing
+ EXPECT !time-at-completed
+ EXPECT !job-printer-up-time
+ EXPECT !date-time-at-creation
+ EXPECT !date-time-at-processing
+ EXPECT !date-time-at-completed
+ EXPECT !number-of-intervening-jobs
+ EXPECT !job-message-from-operator
+ EXPECT !job-k-octets
+ EXPECT !job-impressions
+ EXPECT !job-media-sheets
+ EXPECT !job-k-octets-processed
+ EXPECT !job-impressions-completed
+ EXPECT !job-media-sheets-completed
+
+ EXPECT !copies
+ EXPECT !finishings
+ EXPECT !job-hold-until
+ EXPECT !job-priority
+ EXPECT !job-sheets
+ EXPECT !media
+ EXPECT !multiple-document-handling
+ EXPECT !number-up
+ EXPECT !orientation-requested
+ EXPECT !pages-ranges
+ EXPECT !print-quality
+ EXPECT !printer-resolution
+ EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+ NAME "I14. RFC 2911 section 3.2.6: Get-Jobs Operation (requested-attributes)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword requested-attributes all
+
+ STATUS successful-ok
+ EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+ EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-impressions OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-k-octets-processed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-impressions-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+
+ EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
+ EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
+ EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
+ EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+ EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+ EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
+ EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+ EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+ NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (my-jobs)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR boolean my-jobs true
+
+ STATUS successful-ok
+ EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT !job-printer-uri
+ EXPECT !job-more-info
+ EXPECT !job-name
+ EXPECT !job-originating-user-name
+ EXPECT !job-state
+ EXPECT !job-state-reasons
+ EXPECT !job-state-message
+ EXPECT !job-detailed-status-messages
+ EXPECT !number-of-documents
+ EXPECT !output-device-assigned
+ EXPECT !time-at-creation
+ EXPECT !time-at-processing
+ EXPECT !time-at-completed
+ EXPECT !job-printer-up-time
+ EXPECT !date-time-at-creation
+ EXPECT !date-time-at-processing
+ EXPECT !date-time-at-completed
+ EXPECT !number-of-intervening-jobs
+ EXPECT !job-message-from-operator
+ EXPECT !job-k-octets
+ EXPECT !job-impressions
+ EXPECT !job-media-sheets
+ EXPECT !job-k-octets-processed
+ EXPECT !job-impressions-completed
+ EXPECT !job-media-sheets-completed
+
+ EXPECT !copies
+ EXPECT !finishings
+ EXPECT !job-hold-until
+ EXPECT !job-priority
+ EXPECT !job-sheets
+ EXPECT !media
+ EXPECT !multiple-document-handling
+ EXPECT !number-up
+ EXPECT !orientation-requested
+ EXPECT !pages-ranges
+ EXPECT !print-quality
+ EXPECT !printer-resolution
+ EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+ # Skip this test when doing authenticated printing since we'll always
+ # use the authenticated username over the requesting-user-name value.
+ SKIP-IF-DEFINED uriuser
+
+ NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (my-jobs different user)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name not-$user
+ ATTR boolean my-jobs true
+
+ STATUS successful-ok
+ EXPECT !job-id
+ EXPECT !job-uri
+ EXPECT !job-printer-uri
+ EXPECT !job-more-info
+ EXPECT !job-name
+ EXPECT !job-originating-user-name
+ EXPECT !job-state
+ EXPECT !job-state-reasons
+ EXPECT !job-state-message
+ EXPECT !job-detailed-status-messages
+ EXPECT !number-of-documents
+ EXPECT !output-device-assigned
+ EXPECT !time-at-creation
+ EXPECT !time-at-processing
+ EXPECT !time-at-completed
+ EXPECT !job-printer-up-time
+ EXPECT !date-time-at-creation
+ EXPECT !date-time-at-processing
+ EXPECT !date-time-at-completed
+ EXPECT !number-of-intervening-jobs
+ EXPECT !job-message-from-operator
+ EXPECT !job-k-octets
+ EXPECT !job-impressions
+ EXPECT !job-media-sheets
+ EXPECT !job-k-octets-processed
+ EXPECT !job-impressions-completed
+ EXPECT !job-media-sheets-completed
+
+ EXPECT !copies
+ EXPECT !finishings
+ EXPECT !job-hold-until
+ EXPECT !job-priority
+ EXPECT !job-sheets
+ EXPECT !media
+ EXPECT !multiple-document-handling
+ EXPECT !number-up
+ EXPECT !orientation-requested
+ EXPECT !pages-ranges
+ EXPECT !print-quality
+ EXPECT !printer-resolution
+ EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+ NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (which-jobs=not-completed)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword which-jobs not-completed
+
+ STATUS successful-ok
+ EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT !job-printer-uri
+ EXPECT !job-more-info
+ EXPECT !job-name
+ EXPECT !job-originating-user-name
+ EXPECT !job-state
+ EXPECT !job-state-reasons
+ EXPECT !job-state-message
+ EXPECT !job-detailed-status-messages
+ EXPECT !number-of-documents
+ EXPECT !output-device-assigned
+ EXPECT !time-at-creation
+ EXPECT !time-at-processing
+ EXPECT !time-at-completed
+ EXPECT !job-printer-up-time
+ EXPECT !date-time-at-creation
+ EXPECT !date-time-at-processing
+ EXPECT !date-time-at-completed
+ EXPECT !number-of-intervening-jobs
+ EXPECT !job-message-from-operator
+ EXPECT !job-k-octets
+ EXPECT !job-impressions
+ EXPECT !job-media-sheets
+ EXPECT !job-k-octets-processed
+ EXPECT !job-impressions-completed
+ EXPECT !job-media-sheets-completed
+
+ EXPECT !copies
+ EXPECT !finishings
+ EXPECT !job-hold-until
+ EXPECT !job-priority
+ EXPECT !job-sheets
+ EXPECT !media
+ EXPECT !multiple-document-handling
+ EXPECT !number-up
+ EXPECT !orientation-requested
+ EXPECT !pages-ranges
+ EXPECT !print-quality
+ EXPECT !printer-resolution
+ EXPECT !sides
+}
+
+
+# Wait for job to complete...
+{
+ SKIP-IF-NOT-DEFINED job-id
+
+ NAME "Get-Job-Attributes Until Job Complete"
+ OPERATION Get-Job-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >6 REPEAT-NO-MATCH REPEAT-LIMIT 30
+ DISPLAY job-state
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (which-jobs=completed)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword which-jobs completed
+
+ STATUS successful-ok
+ EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT !job-printer-uri
+ EXPECT !job-more-info
+ EXPECT !job-name
+ EXPECT !job-originating-user-name
+ EXPECT !job-state
+ EXPECT !job-state-reasons
+ EXPECT !job-state-message
+ EXPECT !job-detailed-status-messages
+ EXPECT !number-of-documents
+ EXPECT !output-device-assigned
+ EXPECT !time-at-creation
+ EXPECT !time-at-processing
+ EXPECT !time-at-completed
+ EXPECT !job-printer-up-time
+ EXPECT !date-time-at-creation
+ EXPECT !date-time-at-processing
+ EXPECT !date-time-at-completed
+ EXPECT !number-of-intervening-jobs
+ EXPECT !job-message-from-operator
+ EXPECT !job-k-octets
+ EXPECT !job-impressions
+ EXPECT !job-media-sheets
+ EXPECT !job-k-octets-processed
+ EXPECT !job-impressions-completed
+ EXPECT !job-media-sheets-completed
+
+ EXPECT !copies
+ EXPECT !finishings
+ EXPECT !job-hold-until
+ EXPECT !job-priority
+ EXPECT !job-sheets
+ EXPECT !media
+ EXPECT !multiple-document-handling
+ EXPECT !number-up
+ EXPECT !orientation-requested
+ EXPECT !pages-ranges
+ EXPECT !print-quality
+ EXPECT !printer-resolution
+ EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+ SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+ NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (which-jobs, requested-attributes)"
+ OPERATION Get-Jobs
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword requested-attributes all
+ ATTR keyword which-jobs completed
+
+ STATUS successful-ok
+ EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+ EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-impressions OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-k-octets-processed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-impressions-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+
+ EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
+ EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
+ EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
+ EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+ EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+ EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
+ EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+ EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+}
+
+
+# Test Cancel-Job operation
+#
+# Required by: RFC 2911 section 3.3.3
+{
+ NAME "RFC 2911 section 3.3.3: Cancel-Job Operation (completed job)"
+ OPERATION Cancel-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS client-error-not-possible
+}
+
+
+# Test Print-Job operation
+#
+# Required by: RFC 2911 section 3.2.1
+{
+ NAME "RFC 2911 section 3.2.1: Print-Job Operation"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ FILE $filename
+
+ STATUS successful-ok
+ STATUS client-error-document-format-not-supported
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test Cancel-Job operation
+#
+# Required by: RFC 2911 section 3.3.3
+{
+ NAME "RFC 2911 section 3.3.3: Cancel-Job Operation (pending/processing job)"
+ OPERATION Cancel-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ STATUS client-error-not-possible
+}
+
+
+# Test Get-Job-Attributes operation
+#
+# Required by: RFC 2911 section 3.3.4
+{
+ NAME "RFC 2911 section 3.3.4: Get-Job-Attributes Operation"
+ OPERATION Get-Job-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+ EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-impressions OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-k-octets-processed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-impressions-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-media-sheets-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+
+ EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
+ EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
+ EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
+ EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+ EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+ EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
+ EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+ EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+}
+
+
+# Test Print-URI operation
+#
+# Defined by: RFC 2911 section 3.2.2
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_PRINT_URI
+ SKIP-IF-NOT-DEFINED document-uri
+
+ NAME "RFC 2911 section 3.2.2: Print-URI Operation"
+ OPERATION Print-URI
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR uri document-uri $document-uri
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test Print-URI operation with bad document-uri
+#
+# Defined by: RFC 2911 section 3.2.2
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_PRINT_URI
+ SKIP-IF-NOT-DEFINED document-uri
+
+ NAME "Print-URI with bad URI: Print-URI Operation"
+ OPERATION Print-URI
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR uri document-uri "bogus://bogus"
+
+ STATUS client-error-uri-scheme-not-supported
+
+ EXPECT !job-uri
+ EXPECT !job-id
+ EXPECT !job-state
+ EXPECT !job-state-reasons
+ EXPECT !job-state-message
+}
+
+
+# Test Create-Job and Send-Document operations
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.1
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+
+ NAME "RFC 2911 section 3.2.4: Create-Job Operation"
+ OPERATION Create-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+
+ STATUS successful-ok
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+ SKIP-PREVIOUS-ERROR yes
+
+ NAME "RFC 2911 section 3.3.1: Send-Document Operation"
+ OPERATION Send-Document
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+ ATTR boolean last-document true
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ FILE $filename
+
+ STATUS successful-ok
+ STATUS client-error-document-format-not-supported
+ STATUS server-error-job-canceled
+}
+
+# Test Create-Job and Send-Document operations (no last-document)
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.1
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+
+ NAME "Send-Document missing last-document: Create-Job Operation"
+ OPERATION Create-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+
+ STATUS successful-ok
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+ SKIP-PREVIOUS-ERROR yes
+
+ NAME "Send-Document missing last-document: Send-Document Operation"
+ OPERATION Send-Document
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ FILE $filename
+
+ STATUS client-error-bad-request
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+ SKIP-PREVIOUS-ERROR yes
+
+ NAME "RFC 2911 section 3.3.3: Cancel-Job Operation"
+ OPERATION Cancel-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+}
+
+# Test Create-Job and Send-URI operations
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.2
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+ SKIP-IF-NOT-DEFINED document-uri
+
+ NAME "RFC 2911 section 3.2.4: Create-Job Operation"
+ OPERATION Create-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+
+ STATUS successful-ok
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+ SKIP-IF-NOT-DEFINED document-uri
+ SKIP-PREVIOUS-ERROR yes
+
+ NAME "RFC 2911 section 3.3.2: Send-URI Operation"
+ OPERATION Send-URI
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+ ATTR boolean last-document true
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR uri document-uri $document-uri
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+}
+
+
+# Test Create-Job and Send-URI operations (bad URI)
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.2
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+
+ NAME "Send-URI with bad URI: Create-Job Operation"
+ OPERATION Create-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+
+ STATUS successful-ok
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+ SKIP-IF-NOT-DEFINED document-uri
+ SKIP-PREVIOUS-ERROR yes
+
+ NAME "Send-URI with bad URI: Send-URI Operation (bad URI)"
+ OPERATION Send-URI
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+ ATTR boolean last-document true
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ ATTR uri document-uri "bogus://bogus"
+
+ STATUS client-error-uri-scheme-not-supported
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+ SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+ SKIP-PREVIOUS-ERROR yes
+
+ NAME "Send-URI with bad URI: Cancel-Job Operation"
+ OPERATION Cancel-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+}
+
+
+# Test multiple copy output
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_COPIES
+
+ NAME "Print-Job with copies"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name $filename
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ GROUP job-attributes-tag
+ ATTR integer copies 2
+ FILE $filename
+
+ STATUS successful-ok
+ STATUS client-error-document-format-not-supported
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test PDF output
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+ NAME "Print-Job with A4 PDF"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ FILE document-a4.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+ NAME "Print-Job with A4 PDF, Duplex"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document, Duplex"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR keyword sides two-sided-long-edge
+ FILE document-a4.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+ NAME "Print-Job with US Letter PDF"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ FILE document-letter.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+ NAME "Print-Job with US Letter PDF, Duplex"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document, Duplex"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR keyword sides two-sided-long-edge
+ FILE document-letter.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test PostScript output
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+ NAME "Print-Job with A4 PostScript"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document, Duplex"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ FILE document-a4.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+ NAME "Print-Job with A4 PostScript, Duplex"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR keyword sides two-sided-long-edge
+ FILE document-a4.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+ NAME "Print-Job with US Letter PostScript"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document, Duplex"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ FILE document-letter.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+ NAME "Print-Job with US Letter PostScript, Duplex"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR keyword sides two-sided-long-edge
+ FILE document-letter.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test JPEG output
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+ NAME "Print-Job with Color JPEG on A4"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Color JPEG on A4"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name color.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ FILE color.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+ NAME "Print-Job with Color JPEG on US Letter"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Color JPEG on US Letter"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name color.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ FILE color.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+
+ NAME "Print-Job with Color JPEG on 4x6"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Color JPEG on 4x6"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name color.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_4X6_MEDIA
+ FILE color.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+ NAME "Print-Job with Grayscale JPEG on A4"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Grayscale JPEG on A4"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name gray.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ FILE gray.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+ NAME "Print-Job with Grayscale JPEG on US Letter"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Grayscale JPEG on US Letter"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name gray.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ FILE gray.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+
+ NAME "Print-Job with Grayscale JPEG on 4x6"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Grayscale JPEG on 4x6"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name gray.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_4X6_MEDIA
+ FILE gray.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Print-Job with job-sheets
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+ NAME "Print-Job with A4 PDF and Standard Sheet"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document w/Standard Sheet"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR keyword job-sheets standard
+ FILE document-a4.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+ NAME "Print-Job with US Letter PDF and Standard Sheet"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document w/Standard Sheet"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR keyword job-sheets standard
+ FILE document-a4.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+ NAME "Print-Job with A4 PDF and Standard Sheet"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document w/Standard Sheet"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR keyword job-sheets standard
+ FILE document-a4.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+ NAME "Print-Job with US Letter PDF and Standard Sheet"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document w/Standard Sheet"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR keyword job-sheets standard
+ FILE document-a4.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test number-up output
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+ NAME "Print-Job with A4 PDF, 2-Up"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document; 2-Up"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR integer number-up 2
+ FILE document-a4.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+ NAME "Print-Job with US Letter PDF, 2-Up"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document; 2-Up"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR integer number-up 2
+ FILE document-letter.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+ NAME "Print-Job with A4 PDF, 2-Up"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document; 2-Up"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR integer number-up 2
+ FILE document-a4.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+ NAME "Print-Job with US Letter PDF, 2-Up"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document; 2-Up"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.ps
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/postscript
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR integer number-up 2
+ FILE document-letter.ps
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test output with print-quality...
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DRAFT_QUALITY
+
+ NAME "Print-Job with JPEG on 4x6, Draft Quality"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "4x6 Color JPEG; Draft Quality"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name color.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_4X6_MEDIA
+ ATTR enum print-quality 3
+ FILE color.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_NORMAL_QUALITY
+
+ NAME "Print-Job with JPEG on 4x6, Normal Quality"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "4x6 Color JPEG; Normal Quality"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name color.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_4X6_MEDIA
+ ATTR enum print-quality 4
+ FILE color.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+ SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_HIGH_QUALITY
+
+ NAME "Print-Job with JPEG on 4x6, High Quality"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "4x6 Color JPEG; High Quality"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name color.jpg
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format image/jpeg
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_4X6_MEDIA
+ ATTR enum print-quality 5
+ FILE color.jpg
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DRAFT_QUALITY
+
+ NAME "Print-Job with A4 PDF, Draft Quality"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "A4 Test Document; 2-Up"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-a4.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_A4_MEDIA
+ ATTR enum print-quality 3
+ FILE document-a4.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-DEFINED NOPRINT
+ SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+ SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+ SKIP-IF-NOT-DEFINED OPTIONAL_DRAFT_QUALITY
+
+ NAME "Print-Job with US Letter PDF, Draft Quality"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "US Letter Test Document; 2-Up"
+ ATTR boolean ipp-attribute-fidelity false
+ ATTR name document-name document-letter.pdf
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format application/pdf
+ GROUP job-attributes-tag
+ ATTR keyword media $OPTIONAL_LETTER_MEDIA
+ ATTR enum print-quality 3
+ FILE document-letter.pdf
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test hold/release in the context of Print-Job w/job-hold-until + Release-Job
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_HOLD_JOB
+
+ NAME "Print-Job with job-hold-until"
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR name job-name "Test Document w/Hold"
+ ATTR name document-name $filename
+ ATTR keyword compression none
+ ATTR mimeMediaType document-format $filetype
+ GROUP job-attributes-tag
+ ATTR keyword job-hold-until indefinite
+ FILE $filename
+
+ STATUS successful-ok
+ STATUS server-error-job-canceled
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+ EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE >0
+ EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+ WITH-VALUE 3,4,5,6,7,8,9
+ EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+ EXPECT ?number-of-intervening-jobs OF-TYPE integer
+ IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+ SKIP-IF-NOT-DEFINED OPTIONAL_HOLD_JOB
+
+ NAME "Release-Job"
+ OPERATION Release-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ STATUS client-error-not-possible
+}
+
+
+# Test required printer description attribute support.
+#
+# Required by: PWG 5100.12 section 6.2
+{
+ NAME "PWG 5100.12 section 6.2 - Required Printer Description Attributes"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format application/octet-stream
+
+ STATUS successful-ok
+
+ # Figure out capabilities
+ EXPECT color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true DEFINE-MATCH PRINTER_IS_COLOR
+
+ # Job template attributes
+ EXPECT copies-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT copies-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag
+ EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag
+ EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3
+ EXPECT media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$MEDIA_REGEX"
+ EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$MEDIA_REGEX"
+ EXPECT media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$MEDIA_REGEX"
+ EXPECT orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+ EXPECT orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5,6
+ EXPECT output-bin-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT output-bin-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+ EXPECT print-quality-default OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+ EXPECT print-quality-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5
+ EXPECT printer-resolution-default OF-TYPE resolution IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag
+ EXPECT sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+ EXPECT sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+
+ # Optional media-col support
+ EXPECT ?media-col-default OF-TYPE collection IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT ?media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag
+ EXPECT ?media-col-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+ EXPECT media-col-supported WITH-VALUE media-back-coating DEFINE-MATCH HAVE_MEDIA_BACK_COATING
+ EXPECT media-col-supported WITH-VALUE media-color DEFINE-MATCH HAVE_MEDIA_COLOR
+ EXPECT media-col-supported WITH-VALUE media-front-coating DEFINE-MATCH HAVE_MEDIA_FRONT_COATING
+ EXPECT media-col-supported WITH-VALUE media-grain DEFINE-MATCH HAVE_MEDIA_GRAIN
+ EXPECT media-col-supported WITH-VALUE media-hole-count DEFINE-MATCH HAVE_MEDIA_HOLE_COUNT
+ EXPECT media-col-supported WITH-VALUE media-info DEFINE-MATCH HAVE_MEDIA_INFO
+ EXPECT media-col-supported WITH-VALUE media-key DEFINE-MATCH HAVE_MEDIA_KEY
+ EXPECT media-col-supported WITH-VALUE media-order-count DEFINE-MATCH HAVE_MEDIA_ORDER_COUNT
+ EXPECT media-col-supported WITH-VALUE media-pre-printed DEFINE-MATCH HAVE_MEDIA_PRE_PRINTED
+ EXPECT media-col-supported WITH-VALUE media-recycled DEFINE-MATCH HAVE_MEDIA_RECYCLED
+ EXPECT media-col-supported WITH-VALUE media-size DEFINE-MATCH HAVE_MEDIA_SIZE
+ EXPECT media-col-supported WITH-VALUE media-tooth DEFINE-MATCH HAVE_MEDIA_TOOTH
+ EXPECT media-col-supported WITH-VALUE media-type DEFINE-MATCH HAVE_MEDIA_TYPE
+ EXPECT media-col-supported WITH-VALUE media-weight-metric DEFINE-MATCH HAVE_MEDIA_WEIGHT_METRIC
+
+ EXPECT media-back-coating-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_BACK_COATING
+ EXPECT media-color-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_COLOR
+ EXPECT media-front-coating-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_FRONT_COATING
+ EXPECT media-grain-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_GRAIN
+ EXPECT media-hole-count-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >-1 IF-DEFINED HAVE_MEDIA_HOLE_COUNT
+ EXPECT media-info-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_INFO
+ EXPECT media-key-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_KEY
+ EXPECT media-order-count-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >0 IF-DEFINED HAVE_MEDIA_ORDER_COUNT
+ EXPECT media-pre-printed-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_PRE_PRINTED
+ EXPECT media-recycled-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_RECYCLED
+ EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_SIZE
+ EXPECT media-tooth-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_TOOTH
+ EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_TYPE
+ EXPECT media-weight-metric-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >-1 IF-DEFINED HAVE_MEDIA_WEIGHT_METRIC
+
+ # Printer description attributes
+ EXPECT color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT pages-per-minute OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT pages-per-minute-color OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED PRINTER_IS_COLOR
+ EXPECT !pages-per-minute-color IF-NOT-DEFINED PRINTER_IS_COLOR
+ EXPECT printer-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT printer-location OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT printer-make-and-model OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+ EXPECT printer-more-info OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+}
+
+
+# Test required printer description attribute support.
+#
+# Required by: PWG 5100.14
+{
+ NAME "PWG 5100.14 section 5.1/5.2 - Required Operations and Attributes"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format application/octet-stream
+ ATTR keyword requested-attributes all,media-col-database
+
+ STATUS successful-ok
+
+ # Operations
+ EXPECT operations-supported WITH-VALUE 0x0002 # Print-Job
+ EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
+ EXPECT operations-supported WITH-VALUE 0x0005 # Create-Job
+ EXPECT operations-supported WITH-VALUE 0x0006 # Send-Document
+ EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
+ EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
+ EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
+ EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
+ EXPECT operations-supported WITH-VALUE 0x0039 # Cancel-My-Jobs
+ EXPECT operations-supported WITH-VALUE 0x003b # Close-Job
+ EXPECT operations-supported WITH-VALUE 0x003c # Identify-Printer
+
+ # Printer description attributes
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "deflate" DEFINE-MATCH HAVE_DEFLATE
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "gzip" DEFINE-MATCH HAVE_GZIP
+
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/jpeg"
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/pwg-raster"
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "/^(application/pdf|application/openxps)$/" DEFINE-MATCH PDF_OR_OPENXPS
+
+ EXPECT feed-orientation-supported OF-TYPE keyword IN-GROUP printer-attributes-tag DEFINE-MATCH FEED_ORIENTATION_SUPPORTED
+ EXPECT feed-orientation-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED FEED_ORIENTATION_SUPPORTED
+
+ EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag DEFINE-MATCH FINISHINGS_SUPPORTED
+ EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag IF-DEFINED FINISHINGS_SUPPORTED
+
+ EXPECT identify-actions-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/"
+ EXPECT identify-actions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/"
+
+ EXPECT ipp-features-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "ipp-everywhere"
+
+ EXPECT job-account-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNT_ID_SUPPORTED
+ EXPECT job-account-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNT_ID_SUPPORTED
+
+ EXPECT job-accounting-user-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNTING_USER_ID_SUPPORTED
+ EXPECT job-accounting-user-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNTING_USER_ID_SUPPORTED
+
+ EXPECT job-constraints-supported OF-TYPE collection IN-GROUP printer-attributes-tag DEFINE-MATCH JOB_CONSTRAINTS_SUPPORTED
+ EXPECT job-resolvers-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED JOB_CONSTRAINTS_SUPPORTED
+
+ EXPECT job-creation-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+
+ EXPECT job-ids-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true
+
+ EXPECT preferred-attributes-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT media-bottom-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-left-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-right-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-top-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+
+ EXPECT media-col-database OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-source-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT multiple-operation-time-out OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+
+ EXPECT multiple-operation-time-out-action OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(abort-job|hold-job|process-job)$/"
+
+ EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-number"
+ EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "pages"
+
+ EXPECT page-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true IF-DEFINED PDF_OR_OPENXPS
+
+ EXPECT print-color-mode-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/"
+ EXPECT print-color-mode-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/"
+
+ EXPECT print-content-optimize-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|graphic|photo|text|text-and-graphic)$/"
+ EXPECT print-content-optimize-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|graphic|photo|text|text-and-graphic)$/"
+
+ EXPECT print-rendering-intent-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/"
+ EXPECT print-rendering-intent-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/"
+
+ EXPECT ?printer-alert OF-TYPE octetString IN-GROUP printer-attributes-tag
+ EXPECT ?printer-alert-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-alert
+
+ EXPECT printer-charge-info DEFINE-MATCH PRINTER_CHARGE_INFO
+ EXPECT ?printer-charge-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-charge-info-uri IF-DEFINED PRINTER_CHARGE_INFO
+ EXPECT ?printer-charge-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT printer-config-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-config-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1
+
+ EXPECT printer-device-id OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^([-A-Za-z ]+:[^;]*;)+$/"
+
+ EXPECT printer-geo-location OF-TYPE uri|unknown IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^geo:/"
+
+ EXPECT printer-get-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-format"
+
+ EXPECT ?printer-icc-profiles-supported OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT printer-icons OF-TYPE uri IN-GROUP printer-attributes-tag
+
+ EXPECT ?printer-mandatory-job-attributes OF-TYPE keyword IN-GROUP printer-attributes-tag
+
+ EXPECT printer-organization OF-TYPE text IN-GROUP printer-attributes-tag
+ EXPECT printer-organizational-unit OF-TYPE text IN-GROUP printer-attributes-tag
+
+ EXPECT printer-state-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-state-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1
+
+ EXPECT printer-supply OF-TYPE octetString IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply-description
+ EXPECT printer-supply-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply
+
+ EXPECT printer-supply-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT printer-uuid OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^urn:uuid:[0-9A-Fa-f]{8,8}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{12,12}/"
+
+ EXPECT pwg-raster-document-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 150dpi DEFINE-MATCH HAVE_150DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 180dpi DEFINE-MATCH HAVE_180DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 300dpi DEFINE-MATCH HAVE_300DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 3600dpi DEFINE-MATCH HAVE_360DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 600dpi DEFINE-MATCH HAVE_600DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 720dpi DEFINE-MATCH HAVE_720DPI
+
+ EXPECT pwg-raster-document-sheet-back OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT pwg-raster-document-type-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "black_1" DEFINE-MATCH HAVE_BLACK_1
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "cmyk_8" DEFINE-MATCH HAVE_CMYK_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "sgray_8" DEFINE-MATCH HAVE_SGRAY_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_8" DEFINE-MATCH HAVE_SRGB_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_16" DEFINE-MATCH HAVE_SRGB_16
+
+ EXPECT which-jobs-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+}
+
+
+# Test printing all sample documents
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+
+#
+# End of "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $".
+#
diff --git a/test/fax-job.test b/test/fax-job.test
new file mode 100644
index 0000000..dd35532
--- /dev/null
+++ b/test/fax-job.test
@@ -0,0 +1,59 @@
+# Fax a test page using Create-Job + Send-Document
+#
+# Usage:
+#
+# ./ipptest -f filename ipp://... fax-job.test
+{
+ # The name of the test...
+ NAME "Create FaxOut Job for 555-1212 and an IPP destination"
+
+ # The operation to use
+ OPERATION Create-Job
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+
+ GROUP job-attributes-tag
+ ATTR collection destination-uris {
+ MEMBER uri destination-uri tel:4055551212
+ },{
+ MEMBER uri destination-uri ipp://11.22.33.44/ipp/print
+ MEMBER enum print-quality 5
+ MEMBER keyword media na_letter_8.5x11in
+ }
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT job-id OF-TYPE integer WITH-VALUE >0
+ EXPECT job-uri OF-TYPE uri
+}
+{
+ # The name of the test...
+ NAME "Send FaxOut Document"
+
+ # The operation to use
+ OPERATION Send-Document
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+ ATTR mimetype document-format $filetype
+ ATTR boolean last-document true
+
+ FILE $filename
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/get-completed-jobs.test b/test/get-completed-jobs.test
index eca2279..504ab82 100644
--- a/test/get-completed-jobs.test
+++ b/test/get-completed-jobs.test
@@ -1,9 +1,9 @@
#
-# "$Id$"
+# "$Id: get-completed-jobs.test 12088 2014-08-07 01:09:21Z msweet $"
#
# Get list of completed jobs.
#
-# Copyright 2007-2012 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 2001-2006 by Easy Software Products. All rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -32,7 +32,7 @@
ATTR uri printer-uri $uri
ATTR keyword which-jobs completed
ATTR keyword requested-attributes
- job-id,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets-completed
+ job-id,job-uri,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets-completed
# What statuses are OK?
STATUS successful-ok
@@ -47,5 +47,5 @@
#
-# End of "$Id$".
+# End of "$Id: get-completed-jobs.test 12088 2014-08-07 01:09:21Z msweet $".
#
diff --git a/test/get-job-template-attributes.test b/test/get-job-template-attributes.test
new file mode 100644
index 0000000..0330160
--- /dev/null
+++ b/test/get-job-template-attributes.test
@@ -0,0 +1,24 @@
+# Get printer Job Template attributes using get-printer-attributes
+{
+ # The name of the test...
+ NAME "Get printer Job Template attributes using Get-Printer-Attributes"
+
+ # The operation to use
+ OPERATION Get-Printer-Attributes
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR keyword requested-attributes job-template,media-col-database
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT copies-default
+ EXPECT copies-supported
+ EXPECT media-col-database
+}
diff --git a/test/get-jobs.test b/test/get-jobs.test
index 13b9959..d8cc514 100644
--- a/test/get-jobs.test
+++ b/test/get-jobs.test
@@ -1,9 +1,9 @@
#
-# "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $"
+# "$Id: get-jobs.test 12088 2014-08-07 01:09:21Z msweet $"
#
# Get list of not-completed jobs.
#
-# Copyright 2007-2012 by Apple Inc.
+# Copyright 2007-2014 by Apple Inc.
# Copyright 2001-2006 by Easy Software Products. All rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -31,7 +31,7 @@
ATTR language attributes-natural-language en
ATTR uri printer-uri $uri
ATTR keyword requested-attributes
- job-id,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets,job-media-sheets-completed,job-impressions,job-impressions-completed
+ job-id,job-uri,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets,job-media-sheets-completed,job-impressions,job-impressions-completed
# What statuses are OK?
STATUS successful-ok
@@ -49,5 +49,5 @@
#
-# End of "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $".
+# End of "$Id: get-jobs.test 12088 2014-08-07 01:09:21Z msweet $".
#
diff --git a/test/get-notifications.test b/test/get-notifications.test
new file mode 100644
index 0000000..874d214
--- /dev/null
+++ b/test/get-notifications.test
@@ -0,0 +1,46 @@
+#
+# "$Id: get-notifications.test 11398 2013-11-06 20:11:11Z msweet $"
+#
+# Get subscription events.
+#
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+# Usage:
+#
+# ./ipptool -d id=NNN printer-uri get-notifications.test
+#
+
+{
+ # The name of the test...
+ NAME "Get events using Get-Notifications"
+
+ # The operation to use
+ OPERATION Get-Notifications
+
+ # The attributes to send
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer notify-subscription-ids $id
+
+ # What statuses are OK?
+ STATUS successful-ok
+
+ # What attributes do we expect?
+ EXPECT notify-event OF-TYPE keyword
+ DISPLAY notify-event
+ DISPLAY notify-text
+}
+
+
+#
+# End of "$Id: get-notifications.test 11398 2013-11-06 20:11:11Z msweet $"
+#
diff --git a/test/get-printer-attributes-2.0.test b/test/get-printer-attributes-2.0.test
index c123c3e..adfb457 100644
--- a/test/get-printer-attributes-2.0.test
+++ b/test/get-printer-attributes-2.0.test
@@ -17,7 +17,7 @@
ATTR charset attributes-charset utf-8
ATTR language attributes-natural-language en
ATTR uri printer-uri $uri
- ATTR keyword requested-attributes printer-defaults,printer-description,media-col-database
+ ATTR keyword requested-attributes all,media-col-database
# What statuses are OK?
STATUS successful-ok
diff --git a/test/get-printer-description-attributes.test b/test/get-printer-description-attributes.test
new file mode 100644
index 0000000..b1d8138
--- /dev/null
+++ b/test/get-printer-description-attributes.test
@@ -0,0 +1,43 @@
+# Get Printer Description attributes using get-printer-attributes
+{
+ # The name of the test...
+ NAME "Get Printer Description attributes using Get-Printer-Attributes"
+
+ # The operation to use
+ OPERATION Get-Printer-Attributes
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR keyword requested-attributes printer-description
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT printer-name
+ EXPECT printer-uri-supported
+ EXPECT uri-security-supported
+ EXPECT uri-authentication-supported
+ EXPECT printer-state
+ EXPECT printer-state-reasons
+ EXPECT ipp-versions-supported
+ EXPECT operations-supported
+ EXPECT charset-configured
+ EXPECT charset-supported
+ EXPECT natural-language-configured
+ EXPECT generated-natural-language-supported
+ EXPECT document-format-default
+ EXPECT document-format-supported
+ EXPECT printer-is-accepting-jobs
+ EXPECT queued-job-count
+ EXPECT pdl-override-supported
+ EXPECT printer-up-time
+ EXPECT compression-supported
+ EXPECT !copies-default
+ EXPECT !copies-supported
+ EXPECT !media-col-database
+}
diff --git a/test/identify-printer-display.test b/test/identify-printer-display.test
new file mode 100644
index 0000000..4957a26
--- /dev/null
+++ b/test/identify-printer-display.test
@@ -0,0 +1,21 @@
+# Make the printer display a message
+{
+ # The name of the test...
+ NAME "Identify Printer with Message"
+
+ # The operation to use
+ OPERATION Identify-Printer
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword identify-actions display
+ ATTR text message "Hello\, World!"
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/identify-printer-multiple.test b/test/identify-printer-multiple.test
new file mode 100644
index 0000000..79b2580
--- /dev/null
+++ b/test/identify-printer-multiple.test
@@ -0,0 +1,21 @@
+# Make the printer display a message and beep
+{
+ # The name of the test...
+ NAME "Identify Printer with Message and Beep"
+
+ # The operation to use
+ OPERATION Identify-Printer
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword identify-actions sound,display
+ ATTR text message "Hello\, World!"
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/identify-printer.test b/test/identify-printer.test
new file mode 100644
index 0000000..b97bb71
--- /dev/null
+++ b/test/identify-printer.test
@@ -0,0 +1,20 @@
+# Make the printer beep
+{
+ # The name of the test...
+ NAME "Identify Printer with Sound"
+
+ # The operation to use
+ OPERATION Identify-Printer
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR keyword identify-actions sound
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/ipp-1.1.test b/test/ipp-1.1.test
index 4fd0ad7..0d4c646 100644
--- a/test/ipp-1.1.test
+++ b/test/ipp-1.1.test
@@ -1,9 +1,9 @@
#
-# "$Id$"
+# "$Id: ipp-1.1.test 12661 2015-05-25 14:30:52Z msweet $"
#
# IPP/1.1 test suite.
#
-# Copyright 2007-2012 by Apple Inc.
+# Copyright 2007-2015 by Apple Inc.
# Copyright 2001-2006 by Easy Software Products. All rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -156,7 +156,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS client-error-document-format-not-supported
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -324,7 +324,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
EXPECT natural-language-configured OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag COUNT 1
EXPECT pdl-override-supported OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
EXPECT printer-is-accepting-jobs OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
- EXPECT printer-name OF-TYPE name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{1,127}$$/"
+ EXPECT printer-name OF-TYPE name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
EXPECT printer-state OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag
EXPECT printer-up-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
@@ -429,22 +429,22 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
ATTR keyword requested-attributes all
STATUS successful-ok
- EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
- EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
- EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
- EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
- EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
- EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
- EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+ EXPECT ?job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+ EXPECT ?job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
- EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
- EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
- EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
- EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+ EXPECT ?time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT ?time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT ?time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+ EXPECT ?job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
@@ -489,8 +489,8 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
ATTR boolean my-jobs true
STATUS successful-ok
- EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
- EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
EXPECT !job-printer-uri
EXPECT !job-more-info
EXPECT !job-name
@@ -613,8 +613,8 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
ATTR keyword which-jobs not-completed
STATUS successful-ok
- EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
- EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+ EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+ EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
EXPECT !job-printer-uri
EXPECT !job-more-info
EXPECT !job-name
@@ -833,7 +833,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS client-error-document-format-not-supported
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -945,7 +945,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1262,7 +1262,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS client-error-document-format-not-supported
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1300,7 +1300,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1338,7 +1338,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1374,7 +1374,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1412,7 +1412,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1450,7 +1450,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1488,7 +1488,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1524,7 +1524,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1562,7 +1562,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1600,7 +1600,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1636,7 +1636,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1672,7 +1672,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1708,7 +1708,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1744,7 +1744,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1780,7 +1780,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1820,7 +1820,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1858,7 +1858,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1896,7 +1896,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1934,7 +1934,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1974,7 +1974,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2012,7 +2012,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2050,7 +2050,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2088,7 +2088,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2128,7 +2128,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2166,7 +2166,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2204,7 +2204,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2242,7 +2242,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2280,7 +2280,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2315,7 +2315,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
STATUS successful-ok
STATUS server-error-job-canceled
- STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+ STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2346,5 +2346,5 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
#
-# End of "$Id$".
+# End of "$Id: ipp-1.1.test 12661 2015-05-25 14:30:52Z msweet $".
#
diff --git a/test/ipp-2.0.test b/test/ipp-2.0.test
index 0ee0e94..370ec4a 100644
--- a/test/ipp-2.0.test
+++ b/test/ipp-2.0.test
@@ -1,5 +1,5 @@
#
-# "$Id$"
+# "$Id: ipp-2.0.test 11398 2013-11-06 20:11:11Z msweet $"
#
# IPP/2.0 test suite.
#
@@ -111,5 +111,5 @@ DEFINE MEDIA_REGEX "/^(choice(_((custom|na|asme|roc|oe|roll)_[a-z0-9][-a-z0-9]*_
#
-# End of "$Id$".
+# End of "$Id: ipp-2.0.test 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/ipp-2.1.test b/test/ipp-2.1.test
index e8ddae4..ca48351 100644
--- a/test/ipp-2.1.test
+++ b/test/ipp-2.1.test
@@ -1,5 +1,5 @@
#
-# "$Id$"
+# "$Id: ipp-2.1.test 11398 2013-11-06 20:11:11Z msweet $"
#
# IPP/2.1 test suite.
#
@@ -92,5 +92,5 @@ INCLUDE "ipp-2.0.test"
#
-# End of "$Id$".
+# End of "$Id: ipp-2.1.test 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/ipp-2.2.test b/test/ipp-2.2.test
index 3042ec2..a6eb7a7 100644
--- a/test/ipp-2.2.test
+++ b/test/ipp-2.2.test
@@ -1,5 +1,5 @@
#
-# "$Id$"
+# "$Id: ipp-2.2.test 11398 2013-11-06 20:11:11Z msweet $"
#
# IPP/2.2 test suite.
#
@@ -82,5 +82,5 @@ INCLUDE "ipp-2.1.test"
#
-# End of "$Id$".
+# End of "$Id: ipp-2.2.test 11398 2013-11-06 20:11:11Z msweet $".
#
diff --git a/test/ipp-everywhere.test b/test/ipp-everywhere.test
new file mode 100644
index 0000000..5bcf6c0
--- /dev/null
+++ b/test/ipp-everywhere.test
@@ -0,0 +1,9689 @@
+#
+# "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $"
+#
+# IPP Everywhere test suite.
+#
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+# Usage:
+#
+# ./ipptool -V 2.0 -tf filename.ext printer-uri ipp-everywhere.test
+#
+
+# Do all of the IPP/1.1 and IPP/2.0 tests
+INCLUDE "ipp-2.0.test"
+
+
+# Test required printer description attribute support.
+#
+# Required by: PWG 5100.14
+{
+ NAME "PWG 5100.14 section 5.1/5.2 - Required Operations and Attributes"
+ OPERATION Get-Printer-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format application/octet-stream
+ ATTR keyword requested-attributes all,media-col-database
+
+ STATUS successful-ok
+
+ # Operations
+ EXPECT operations-supported WITH-VALUE 0x0002 # Print-Job
+ EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
+ EXPECT operations-supported WITH-VALUE 0x0005 # Create-Job
+ EXPECT operations-supported WITH-VALUE 0x0006 # Send-Document
+ EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
+ EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
+ EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
+ EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
+ EXPECT operations-supported WITH-VALUE 0x0039 # Cancel-My-Jobs
+ EXPECT operations-supported WITH-VALUE 0x003b # Close-Job
+ EXPECT operations-supported WITH-VALUE 0x003c # Identify-Printer
+
+ # Printer description attributes
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "deflate" DEFINE-MATCH HAVE_DEFLATE
+ EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "gzip" DEFINE-MATCH HAVE_GZIP
+
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/jpeg"
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/pwg-raster"
+ EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "/^(application/pdf|application/openxps)$/" DEFINE-MATCH PDF_OR_OPENXPS
+
+ EXPECT feed-orientation-supported OF-TYPE keyword IN-GROUP printer-attributes-tag DEFINE-MATCH FEED_ORIENTATION_SUPPORTED
+ EXPECT feed-orientation-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED FEED_ORIENTATION_SUPPORTED
+
+ EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag DEFINE-MATCH FINISHINGS_SUPPORTED
+ EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag IF-DEFINED FINISHINGS_SUPPORTED
+
+ EXPECT identify-actions-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/"
+ EXPECT identify-actions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/"
+
+ EXPECT ipp-features-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "ipp-everywhere"
+
+ EXPECT job-account-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNT_ID_SUPPORTED
+ EXPECT job-account-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNT_ID_SUPPORTED
+
+ EXPECT job-accounting-user-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNTING_USER_ID_SUPPORTED
+ EXPECT job-accounting-user-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNTING_USER_ID_SUPPORTED
+
+ EXPECT job-constraints-supported OF-TYPE collection IN-GROUP printer-attributes-tag DEFINE-MATCH JOB_CONSTRAINTS_SUPPORTED
+ EXPECT job-resolvers-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED JOB_CONSTRAINTS_SUPPORTED
+
+ EXPECT job-creation-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+
+ EXPECT job-ids-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true
+
+ EXPECT preferred-attributes-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT media-bottom-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-left-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-right-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+ EXPECT media-top-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1
+
+ EXPECT media-col-database OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT media-source-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+
+ EXPECT multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT multiple-operation-time-out OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+
+ EXPECT multiple-operation-time-out-action OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(abort-job|hold-job|process-job)$/"
+
+ EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-number"
+ EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "pages"
+
+ EXPECT page-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true IF-DEFINED PDF_OR_OPENXPS
+
+ EXPECT print-color-mode-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/"
+ EXPECT print-color-mode-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/"
+
+ EXPECT print-content-optimize-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|graphic|photo|text|text-and-graphic)$/"
+ EXPECT print-content-optimize-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|graphic|photo|text|text-and-graphic)$/"
+
+ EXPECT print-rendering-intent-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/"
+ EXPECT print-rendering-intent-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/"
+
+ EXPECT ?printer-alert OF-TYPE octetString IN-GROUP printer-attributes-tag
+ EXPECT ?printer-alert-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-alert
+
+ EXPECT printer-charge-info DEFINE-MATCH PRINTER_CHARGE_INFO
+ EXPECT ?printer-charge-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-charge-info-uri IF-DEFINED PRINTER_CHARGE_INFO
+ EXPECT ?printer-charge-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT printer-config-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-config-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1
+
+ EXPECT printer-device-id OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^([-A-Za-z ]+:[^;]*;)+$/"
+
+ EXPECT printer-geo-location OF-TYPE uri|unknown IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^geo:/"
+
+ EXPECT printer-get-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-format"
+
+ EXPECT ?printer-icc-profiles-supported OF-TYPE collection IN-GROUP printer-attributes-tag
+
+ EXPECT printer-icons OF-TYPE uri IN-GROUP printer-attributes-tag
+
+ EXPECT ?printer-mandatory-job-attributes OF-TYPE keyword IN-GROUP printer-attributes-tag
+
+ EXPECT printer-organization OF-TYPE text IN-GROUP printer-attributes-tag
+ EXPECT printer-organizational-unit OF-TYPE text IN-GROUP printer-attributes-tag
+
+ EXPECT printer-state-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1
+ EXPECT printer-state-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1
+
+ EXPECT printer-supply OF-TYPE octetString IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply-description
+ EXPECT printer-supply-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply
+
+ EXPECT printer-supply-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT printer-uuid OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^urn:uuid:[0-9A-Fa-f]{8,8}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{12,12}/"
+
+ EXPECT pwg-raster-document-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 150dpi DEFINE-MATCH HAVE_150DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 180dpi DEFINE-MATCH HAVE_180DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 300dpi DEFINE-MATCH HAVE_300DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 3600dpi DEFINE-MATCH HAVE_360DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 600dpi DEFINE-MATCH HAVE_600DPI
+ EXPECT pwg-raster-document-resolution-supported WITH-VALUE 720dpi DEFINE-MATCH HAVE_720DPI
+
+ EXPECT pwg-raster-document-sheet-back OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
+
+ EXPECT pwg-raster-document-type-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "black_1" DEFINE-MATCH HAVE_BLACK_1
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "cmyk_8" DEFINE-MATCH HAVE_CMYK_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "sgray_8" DEFINE-MATCH HAVE_SGRAY_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_8" DEFINE-MATCH HAVE_SRGB_8
+ EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_16" DEFINE-MATCH HAVE_SRGB_16
+
+ EXPECT which-jobs-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+}
+
+
+# Test printing all sample documents
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/color.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/color.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/color.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/color.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/color.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/color.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "color.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_16
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "color.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-a4"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-a4 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/document-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/document-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/document-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/document-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/document-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/document-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/document-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/document-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/document-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/document-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/document-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/document-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/document-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/document-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/document-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/document-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/document-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/document-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/document-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/document-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/document-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/document-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/document-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "document-letter"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "document-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print document-letter @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "document-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/document-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/gray.jpg-4x6-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/gray.jpg-4x6-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/gray.jpg-4x6-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/gray.jpg-4x6-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/gray.jpg-4x6-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/gray.jpg-4x6-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "gray.jpg-4x6"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "gray.jpg-4x6"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-a4-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-a4-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-a4-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-a4-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-a4-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-a4-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-a4-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-a4-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-a4-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-a4-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-a4-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-a4-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-a4-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-a4-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-a4-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-a4-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-a4-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-a4"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-a4"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-a4 @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-a4"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-a4-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/black-1/onepage-letter-black-1-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/sgray-8/onepage-letter-sgray-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 150dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_150DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-150dpi-20111130/srgb-8/onepage-letter-srgb-8-150dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/black-1/onepage-letter-black-1-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/sgray-8/onepage-letter-sgray-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 180dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_180DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-180dpi-20111130/srgb-8/onepage-letter-srgb-8-180dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/black-1/onepage-letter-black-1-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/sgray-8/onepage-letter-sgray-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 300dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_300DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-300dpi-20111130/srgb-8/onepage-letter-srgb-8-300dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/black-1/onepage-letter-black-1-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/sgray-8/onepage-letter-sgray-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 360dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_360DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-360dpi-20111130/srgb-8/onepage-letter-srgb-8-360dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/black-1/onepage-letter-black-1-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/sgray-8/onepage-letter-sgray-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 600dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_600DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-600dpi-20111130/srgb-8/onepage-letter-srgb-8-600dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, black-1, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_BLACK_1
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/black-1/onepage-letter-black-1-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, cmyk-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_CMYK_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, sgray-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SGRAY_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/sgray-8/onepage-letter-sgray-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "onepage-letter"
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "onepage-letter"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print onepage-letter @ 720dpi, srgb-8, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+ SKIP-IF-NOT-DEFINED HAVE_720DPI
+ SKIP-IF-NOT-DEFINED HAVE_SRGB_8
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "onepage-letter"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-720dpi-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+
+#
+# End of "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $".
+#
diff --git a/test/ippdiscover.c b/test/ippdiscover.c
new file mode 100644
index 0000000..cd35401
--- /dev/null
+++ b/test/ippdiscover.c
@@ -0,0 +1,829 @@
+/*
+ * "$Id: ippdiscover.c 10983 2013-05-13 23:57:32Z msweet $"
+ *
+ * ippdiscover command for CUPS.
+ *
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ */
+
+
+/*
+ * Include necessary headers.
+ */
+
+#include <cups/cups-private.h>
+#ifdef HAVE_DNSSD
+# include <dns_sd.h>
+# ifdef WIN32
+# pragma comment(lib, "dnssd.lib")
+# endif /* WIN32 */
+#endif /* HAVE_DNSSD */
+#ifdef HAVE_AVAHI
+# include <avahi-client/client.h>
+# include <avahi-client/lookup.h>
+# include <avahi-common/simple-watch.h>
+# include <avahi-common/domain.h>
+# include <avahi-common/error.h>
+# include <avahi-common/malloc.h>
+#define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX
+#endif /* HAVE_AVAHI */
+
+
+/*
+ * Local globals...
+ */
+
+#ifdef HAVE_AVAHI
+static int got_data = 0; /* Got data from poll? */
+static AvahiSimplePoll *simple_poll = NULL;
+ /* Poll information */
+#endif /* HAVE_AVAHI */
+static const char *program = NULL;/* Program to run */
+
+
+/*
+ * Local functions...
+ */
+
+#ifdef HAVE_DNSSD
+static void DNSSD_API browse_callback(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain, void *context)
+ __attribute__((nonnull(1,5,6,7,8)));
+static void DNSSD_API resolve_cb(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *fullName,
+ const char *hostTarget,
+ uint16_t port, uint16_t txtLen,
+ const unsigned char *txtRecord,
+ void *context);
+#endif /* HAVE_DNSSD */
+
+#ifdef HAVE_AVAHI
+static void browse_callback(AvahiServiceBrowser *browser,
+ AvahiIfIndex interface,
+ AvahiProtocol protocol,
+ AvahiBrowserEvent event,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain,
+ AvahiLookupResultFlags flags,
+ void *context);
+static void client_cb(AvahiClient *client, AvahiClientState state,
+ void *simple_poll);
+static int poll_cb(struct pollfd *pollfds, unsigned int num_pollfds,
+ int timeout, void *context);
+static void resolve_cb(AvahiServiceResolver *resolver,
+ AvahiIfIndex interface,
+ AvahiProtocol protocol,
+ AvahiResolverEvent event,
+ const char *name, const char *type,
+ const char *domain, const char *host_name,
+ const AvahiAddress *address, uint16_t port,
+ AvahiStringList *txt,
+ AvahiLookupResultFlags flags, void *context);
+#endif /* HAVE_AVAHI */
+
+static void resolve_and_run(const char *name, const char *type,
+ const char *domain);
+static void unquote(char *dst, const char *src, size_t dstsize);
+static void usage(void) __attribute__((noreturn));
+
+
+/*
+ * 'main()' - Browse for printers and run the specified command.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line args */
+ char *argv[]) /* I - Command-line arguments */
+{
+ int i; /* Looping var */
+ const char *opt, /* Current option character */
+ *name = NULL, /* Service name */
+ *type = "_ipp._tcp", /* Service type */
+ *domain = "local."; /* Service domain */
+#ifdef HAVE_DNSSD
+ DNSServiceRef ref; /* Browsing service reference */
+#endif /* HAVE_DNSSD */
+#ifdef HAVE_AVAHI
+ AvahiClient *client; /* Client information */
+ int error; /* Error code, if any */
+#endif /* HAVE_AVAHI */
+
+
+ for (i = 1; i < argc; i ++)
+ if (!strcmp(argv[i], "snmp"))
+ snmponly = 1;
+ else if (!strcmp(argv[i], "ipp"))
+ ipponly = 1;
+ else
+ {
+ puts("Usage: ./ipp-printers [{ipp | snmp}]");
+ return (1);
+ }
+
+ /*
+ * Create an array to track devices...
+ */
+
+ devices = cupsArrayNew((cups_array_func_t)compare_devices, NULL);
+
+ /*
+ * Browse for different kinds of printers...
+ */
+
+ if (DNSServiceCreateConnection(&main_ref) != kDNSServiceErr_NoError)
+ {
+ perror("ERROR: Unable to create service connection");
+ return (1);
+ }
+
+ fd = DNSServiceRefSockFD(main_ref);
+
+ ipp_ref = main_ref;
+ DNSServiceBrowse(&ipp_ref, kDNSServiceFlagsShareConnection, 0,
+ "_ipp._tcp", NULL, browse_callback, devices);
+
+ /*
+ * Loop until we are killed...
+ */
+
+ progress();
+
+ for (;;)
+ {
+ FD_ZERO(&input);
+ FD_SET(fd, &input);
+
+ timeout.tv_sec = 2;
+ timeout.tv_usec = 500000;
+
+ if (select(fd + 1, &input, NULL, NULL, &timeout) <= 0)
+ {
+ time_t curtime = time(NULL);
+
+ for (device = (cups_device_t *)cupsArrayFirst(devices);
+ device;
+ device = (cups_device_t *)cupsArrayNext(devices))
+ if (!device->got_resolve)
+ {
+ if (!device->ref)
+ break;
+
+ if ((curtime - device->resolve_time) > 10)
+ {
+ device->got_resolve = -1;
+ fprintf(stderr, "\rUnable to resolve \"%s\": timeout\n",
+ device->name);
+ progress();
+ }
+ else
+ break;
+ }
+
+ if (!device)
+ break;
+ }
+
+ if (FD_ISSET(fd, &input))
+ {
+ /*
+ * Process results of our browsing...
+ */
+
+ progress();
+ DNSServiceProcessResult(main_ref);
+ }
+ else
+ {
+ /*
+ * Query any devices we've found...
+ */
+
+ DNSServiceErrorType status; /* DNS query status */
+ int count; /* Number of queries */
+
+
+ for (device = (cups_device_t *)cupsArrayFirst(devices), count = 0;
+ device;
+ device = (cups_device_t *)cupsArrayNext(devices))
+ {
+ if (!device->ref && !device->sent)
+ {
+ /*
+ * Found the device, now get the TXT record(s) for it...
+ */
+
+ if (count < 50)
+ {
+ device->resolve_time = time(NULL);
+ device->ref = main_ref;
+
+ status = DNSServiceResolve(&(device->ref),
+ kDNSServiceFlagsShareConnection,
+ 0, device->name, device->regtype,
+ device->domain, resolve_callback,
+ device);
+ if (status != kDNSServiceErr_NoError)
+ {
+ fprintf(stderr, "\rUnable to resolve \"%s\": %d\n",
+ device->name, status);
+ progress();
+ }
+ else
+ count ++;
+ }
+ }
+ else if (!device->sent && device->got_resolve)
+ {
+ /*
+ * Got the TXT records, now report the device...
+ */
+
+ DNSServiceRefDeallocate(device->ref);
+ device->ref = 0;
+ device->sent = 1;
+ }
+ }
+ }
+ }
+
+#ifndef DEBUG
+ fprintf(stderr, "\rFound %d printers. Now querying for capabilities...\n",
+ cupsArrayCount(devices));
+#endif /* !DEBUG */
+
+ puts("#!/bin/sh -x");
+ puts("test -d results && rm -rf results");
+ puts("mkdir results");
+ puts("CUPS_DEBUG_LEVEL=6; export CUPS_DEBUG_LEVEL");
+ puts("CUPS_DEBUG_FILTER='^(ipp|http|_ipp|_http|cupsGetResponse|cupsSend|"
+ "cupsWrite|cupsDo).*'; export CUPS_DEBUG_FILTER");
+
+ for (device = (cups_device_t *)cupsArrayFirst(devices);
+ device;
+ device = (cups_device_t *)cupsArrayNext(devices))
+ {
+ if (device->got_resolve <= 0 || device->cups_shared)
+ continue;
+
+#ifdef DEBUG
+ fprintf(stderr, "Checking \"%s\" (got_resolve=%d, cups_shared=%d, uri=%s)\n",
+ device->name, device->got_resolve, device->cups_shared, device->uri);
+#else
+ fprintf(stderr, "Checking \"%s\"...\n", device->name);
+#endif /* DEBUG */
+
+ if ((http = httpConnect(device->host, device->port)) == NULL)
+ {
+ fprintf(stderr, "Failed to connect to \"%s\": %s\n", device->name,
+ cupsLastErrorString());
+ continue;
+ }
+
+ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+ device->uri);
+
+ response = cupsDoRequest(http, request, device->rp);
+
+ if (cupsLastError() > IPP_OK_SUBST)
+ fprintf(stderr, "Failed to query \"%s\": %s\n", device->name,
+ cupsLastErrorString());
+ else
+ {
+ if ((attr = ippFindAttribute(response, "ipp-versions-supported",
+ IPP_TAG_KEYWORD)) != NULL)
+ {
+ version = attr->values[0].string.text;
+
+ for (i = 1; i < attr->num_values; i ++)
+ if (strcmp(attr->values[i].string.text, version) > 0)
+ version = attr->values[i].string.text;
+ }
+ else
+ version = "1.0";
+
+ testfile = NULL;
+
+ if ((attr = ippFindAttribute(response, "document-format-supported",
+ IPP_TAG_MIMETYPE)) != NULL)
+ {
+ /*
+ * Figure out the test file for printing, preferring PDF and PostScript
+ * over JPEG and plain text...
+ */
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (!strcasecmp(attr->values[i].string.text, "application/pdf"))
+ {
+ testfile = "testfile.pdf";
+ break;
+ }
+ else if (!strcasecmp(attr->values[i].string.text,
+ "application/postscript"))
+ testfile = "testfile.ps";
+ else if (!strcasecmp(attr->values[i].string.text, "image/jpeg") &&
+ !testfile)
+ testfile = "testfile.jpg";
+ else if (!strcasecmp(attr->values[i].string.text, "text/plain") &&
+ !testfile)
+ testfile = "testfile.txt";
+ else if (!strcasecmp(attr->values[i].string.text,
+ "application/vnd.hp-PCL") && !testfile)
+ testfile = "testfile.pcl";
+ }
+
+ if (!testfile)
+ {
+ fprintf(stderr,
+ "Printer \"%s\" reports the following IPP file formats:\n",
+ device->name);
+ for (i = 0; i < attr->num_values; i ++)
+ fprintf(stderr, " \"%s\"\n", attr->values[i].string.text);
+ }
+ }
+
+ if (!testfile && device->pdl)
+ {
+ char *pdl, /* Copy of pdl string */
+ *start, *end; /* Pointers into pdl string */
+
+
+ pdl = strdup(device->pdl);
+ for (start = device->pdl; start && *start; start = end)
+ {
+ if ((end = strchr(start, ',')) != NULL)
+ *end++ = '\0';
+
+ if (!strcasecmp(start, "application/pdf"))
+ {
+ testfile = "testfile.pdf";
+ break;
+ }
+ else if (!strcasecmp(start, "application/postscript"))
+ testfile = "testfile.ps";
+ else if (!strcasecmp(start, "image/jpeg") && !testfile)
+ testfile = "testfile.jpg";
+ else if (!strcasecmp(start, "text/plain") && !testfile)
+ testfile = "testfile.txt";
+ else if (!strcasecmp(start, "application/vnd.hp-PCL") && !testfile)
+ testfile = "testfile.pcl";
+ }
+ free(pdl);
+
+ if (testfile)
+ {
+ fprintf(stderr,
+ "Using \"%s\" for printer \"%s\" based on TXT record pdl "
+ "info.\n", testfile, device->name);
+ }
+ else
+ {
+ fprintf(stderr,
+ "Printer \"%s\" reports the following TXT file formats:\n",
+ device->name);
+ fprintf(stderr, " \"%s\"\n", device->pdl);
+ }
+ }
+
+ if (!device->ty &&
+ (attr = ippFindAttribute(response, "printer-make-and-model",
+ IPP_TAG_TEXT)) != NULL)
+ device->ty = strdup(attr->values[0].string.text);
+
+ if (strcmp(version, "1.0") && testfile && device->ty)
+ {
+ char filename[1024], /* Filename */
+ *fileptr; /* Pointer into filename */
+ const char *typtr; /* Pointer into ty */
+
+ if (!strncasecmp(device->ty, "DeskJet", 7) ||
+ !strncasecmp(device->ty, "DesignJet", 9) ||
+ !strncasecmp(device->ty, "OfficeJet", 9) ||
+ !strncasecmp(device->ty, "Photosmart", 10))
+ strlcpy(filename, "HP_", sizeof(filename));
+ else
+ filename[0] = '\0';
+
+ fileptr = filename + strlen(filename);
+
+ if (!strncasecmp(device->ty, "Lexmark International Lexmark", 29))
+ typtr = device->ty + 22;
+ else
+ typtr = device->ty;
+
+ while (*typtr && fileptr < (filename + sizeof(filename) - 1))
+ {
+ if (isalnum(*typtr & 255) || *typtr == '-')
+ *fileptr++ = *typtr++;
+ else
+ {
+ *fileptr++ = '_';
+ typtr++;
+ }
+ }
+
+ *fileptr = '\0';
+
+ printf("# %s\n", device->name);
+ printf("echo \"Testing %s...\"\n", device->name);
+
+ if (!ipponly)
+ {
+ printf("echo \"snmpwalk -c public -v 1 -Cc %s 1.3.6.1.2.1.25 "
+ "1.3.6.1.2.1.43 1.3.6.1.4.1.2699.1\" > results/%s.snmpwalk\n",
+ device->host, filename);
+ printf("snmpwalk -c public -v 1 -Cc %s 1.3.6.1.2.1.25 "
+ "1.3.6.1.2.1.43 1.3.6.1.4.1.2699.1 | "
+ "tee -a results/%s.snmpwalk\n",
+ device->host, filename);
+ }
+
+ if (!snmponly)
+ {
+ printf("echo \"./ipptool-static -tIf %s -T 30 -d NOPRINT=1 -V %s %s "
+ "ipp-%s.test\" > results/%s.log\n", testfile, version,
+ device->uri, version, filename);
+ printf("CUPS_DEBUG_LOG=results/%s.debug_log "
+ "./ipptool-static -tIf %s -T 30 -d NOPRINT=1 -V %s %s "
+ "ipp-%s.test | tee -a results/%s.log\n", filename,
+ testfile, version, device->uri,
+ version, filename);
+ }
+
+ puts("");
+ }
+ else if (!device->ty)
+ fprintf(stderr,
+ "Ignoring \"%s\" since it doesn't provide a make and model.\n",
+ device->name);
+ else if (!testfile)
+ fprintf(stderr,
+ "Ignoring \"%s\" since it does not support a common format.\n",
+ device->name);
+ else
+ fprintf(stderr, "Ignoring \"%s\" since it only supports IPP/1.0.\n",
+ device->name);
+ }
+
+ ippDelete(response);
+ httpClose(http);
+ }
+
+ return (0);
+}
+
+
+/*
+ * 'browse_callback()' - Browse devices.
+ */
+
+static void
+browse_callback(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Option flags */
+ uint32_t interfaceIndex, /* I - Interface number */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain, /* I - Service domain */
+ void *context) /* I - Devices array */
+{
+#ifdef DEBUG
+ fprintf(stderr, "browse_callback(sdRef=%p, flags=%x, "
+ "interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", "
+ "regtype=\"%s\", replyDomain=\"%s\", context=%p)\n",
+ sdRef, flags, interfaceIndex, errorCode,
+ serviceName ? serviceName : "(null)",
+ regtype ? regtype : "(null)",
+ replyDomain ? replyDomain : "(null)",
+ context);
+#endif /* DEBUG */
+
+ /*
+ * Only process "add" data...
+ */
+
+ if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd))
+ return;
+
+ /*
+ * Get the device...
+ */
+
+ get_device((cups_array_t *)context, serviceName, regtype, replyDomain);
+}
+
+
+/*
+ * 'compare_devices()' - Compare two devices.
+ */
+
+static int /* O - Result of comparison */
+compare_devices(cups_device_t *a, /* I - First device */
+ cups_device_t *b) /* I - Second device */
+{
+ int retval = strcmp(a->name, b->name);
+
+ if (retval)
+ return (retval);
+ else
+ return (-strcmp(a->regtype, b->regtype));
+}
+
+
+/*
+ * 'get_device()' - Create or update a device.
+ */
+
+static cups_device_t * /* O - Device */
+get_device(cups_array_t *devices, /* I - Device array */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain) /* I - Service domain */
+{
+ cups_device_t key, /* Search key */
+ *device; /* Device */
+ char fullName[kDNSServiceMaxDomainName];
+ /* Full name for query */
+
+
+ /*
+ * See if this is a new device...
+ */
+
+ key.name = (char *)serviceName;
+ key.regtype = (char *)regtype;
+
+ for (device = cupsArrayFind(devices, &key);
+ device;
+ device = cupsArrayNext(devices))
+ if (strcasecmp(device->name, key.name))
+ break;
+ else
+ {
+ if (!strcasecmp(device->domain, "local.") &&
+ strcasecmp(device->domain, replyDomain))
+ {
+ /*
+ * Update the .local listing to use the "global" domain name instead.
+ * The backend will try local lookups first, then the global domain name.
+ */
+
+ free(device->domain);
+ device->domain = strdup(replyDomain);
+
+ DNSServiceConstructFullName(fullName, device->name, regtype,
+ replyDomain);
+ free(device->fullName);
+ device->fullName = strdup(fullName);
+ }
+
+ return (device);
+ }
+
+ /*
+ * Yes, add the device...
+ */
+
+ device = calloc(sizeof(cups_device_t), 1);
+ device->name = strdup(serviceName);
+ device->domain = strdup(replyDomain);
+ device->regtype = strdup(regtype);
+
+ cupsArrayAdd(devices, device);
+
+ /*
+ * Set the "full name" of this service, which is used for queries...
+ */
+
+ DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain);
+ device->fullName = strdup(fullName);
+
+#ifdef DEBUG
+ fprintf(stderr, "get_device: fullName=\"%s\"...\n", fullName);
+#endif /* DEBUG */
+
+ return (device);
+}
+
+
+/*
+ * 'progress()' - Show query progress.
+ */
+
+static void
+progress(void)
+{
+#ifndef DEBUG
+ const char *chars = "|/-\\";
+ static int count = 0;
+
+
+ fprintf(stderr, "\rLooking for printers %c", chars[count]);
+ fflush(stderr);
+ count = (count + 1) & 3;
+#endif /* !DEBUG */
+}
+
+
+/*
+ * 'resolve_callback()' - Process resolve data.
+ */
+
+static void
+resolve_callback(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Data flags */
+ uint32_t interfaceIndex, /* I - Interface */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *fullName, /* I - Full service name */
+ const char *hostTarget, /* I - Hostname */
+ uint16_t port, /* I - Port number (network byte order) */
+ uint16_t txtLen, /* I - Length of TXT record data */
+ const unsigned char *txtRecord, /* I - TXT record data */
+ void *context) /* I - Device */
+{
+ char temp[257], /* TXT key value */
+ uri[1024]; /* Printer URI */
+ const void *value; /* Value from TXT record */
+ uint8_t valueLen; /* Length of value */
+ cups_device_t *device = (cups_device_t *)context;
+ /* Device */
+
+
+#ifdef DEBUG
+ fprintf(stderr, "\rresolve_callback(sdRef=%p, flags=%x, "
+ "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", "
+ "hostTarget=\"%s\", port=%d, txtLen=%u, txtRecord=%p, "
+ "context=%p)\n",
+ sdRef, flags, interfaceIndex, errorCode,
+ fullName ? fullName : "(null)", hostTarget ? hostTarget : "(null)",
+ ntohs(port), txtLen, txtRecord, context);
+#endif /* DEBUG */
+
+ /*
+ * Only process "add" data...
+ */
+
+ if (errorCode != kDNSServiceErr_NoError)
+ return;
+
+ device->got_resolve = 1;
+ device->host = strdup(hostTarget);
+ device->port = ntohs(port);
+
+ /*
+ * Extract the "remote printer" key from the TXT record and save the URI...
+ */
+
+ if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "rp",
+ &valueLen)) != NULL)
+ {
+ if (((char *)value)[0] == '/')
+ {
+ /*
+ * "rp" value (incorrectly) has a leading slash already...
+ */
+
+ memcpy(temp, value, valueLen);
+ temp[valueLen] = '\0';
+ }
+ else
+ {
+ /*
+ * Convert to resource by concatenating with a leading "/"...
+ */
+
+ temp[0] = '/';
+ memcpy(temp + 1, value, valueLen);
+ temp[valueLen + 1] = '\0';
+ }
+ }
+ else
+ {
+ /*
+ * Default "rp" value is blank, mapping to a path of "/"...
+ */
+
+ temp[0] = '/';
+ temp[1] = '\0';
+ }
+
+ if (!strncmp(temp, "/printers/", 10))
+ device->cups_shared = -1;
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp",
+ NULL, hostTarget, ntohs(port), temp);
+ device->uri = strdup(uri);
+ device->rp = strdup(temp);
+
+ if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "ty",
+ &valueLen)) != NULL)
+ {
+ memcpy(temp, value, valueLen);
+ temp[valueLen] = '\0';
+
+ device->ty = strdup(temp);
+ }
+
+ if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "pdl",
+ &valueLen)) != NULL)
+ {
+ memcpy(temp, value, valueLen);
+ temp[valueLen] = '\0';
+
+ device->pdl = strdup(temp);
+ }
+
+ if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "printer-type",
+ &valueLen)) != NULL)
+ device->cups_shared = 1;
+
+ if (device->cups_shared)
+ fprintf(stderr, "\rIgnoring CUPS printer %s\n", uri);
+ else
+ fprintf(stderr, "\rFound IPP printer %s\n", uri);
+
+ progress();
+}
+
+
+/*
+ * 'unquote()' - Unquote a name string.
+ */
+
+static void
+unquote(char *dst, /* I - Destination buffer */
+ const char *src, /* I - Source string */
+ size_t dstsize) /* I - Size of destination buffer */
+{
+ char *dstend = dst + dstsize - 1; /* End of destination buffer */
+
+
+ while (*src && dst < dstend)
+ {
+ if (*src == '\\')
+ {
+ src ++;
+ if (isdigit(src[0] & 255) && isdigit(src[1] & 255) &&
+ isdigit(src[2] & 255))
+ {
+ *dst++ = ((((src[0] - '0') * 10) + src[1] - '0') * 10) + src[2] - '0';
+ src += 3;
+ }
+ else
+ *dst++ = *src++;
+ }
+ else
+ *dst++ = *src ++;
+ }
+
+ *dst = '\0';
+}
+
+
+/*
+ * 'usage()' - Show program usage and exit.
+ */
+
+static void
+usage(void)
+{
+ _cupsLangPuts(stdout, _("Usage: ippdiscover [options] -a\n"
+ " ippdiscover [options] \"service name\"\n"
+ "\n"
+ "Options:"));
+ _cupsLangPuts(stdout, _(" -a Browse for all services."));
+ _cupsLangPuts(stdout, _(" -d domain Browse/resolve in specified domain."));
+ _cupsLangPuts(stdout, _(" -p program Run specified program for each service."));
+ _cupsLangPuts(stdout, _(" -t type Browse/resolve with specified type."));
+
+ exit(0);
+}
+
+
+/*
+ * End of "$Id: ippdiscover.c 10983 2013-05-13 23:57:32Z msweet $".
+ */
diff --git a/test/ippfind.c b/test/ippfind.c
new file mode 100644
index 0000000..78b608e
--- /dev/null
+++ b/test/ippfind.c
@@ -0,0 +1,2847 @@
+/*
+ * "$Id: ippfind.c 12638 2015-05-19 02:36:15Z msweet $"
+ *
+ * Utility to find IPP printers via Bonjour/DNS-SD and optionally run
+ * commands such as IPP and Bonjour conformance tests. This tool is
+ * inspired by the UNIX "find" command, thus its name.
+ *
+ * Copyright 2008-2015 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#define _CUPS_NO_DEPRECATED
+#include <cups/cups-private.h>
+#ifdef WIN32
+# include <process.h>
+# include <sys/timeb.h>
+#else
+# include <sys/wait.h>
+#endif /* WIN32 */
+#include <regex.h>
+#ifdef HAVE_DNSSD
+# include <dns_sd.h>
+#elif defined(HAVE_AVAHI)
+# include <avahi-client/client.h>
+# include <avahi-client/lookup.h>
+# include <avahi-common/simple-watch.h>
+# include <avahi-common/domain.h>
+# include <avahi-common/error.h>
+# include <avahi-common/malloc.h>
+# define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX
+#endif /* HAVE_DNSSD */
+
+#ifndef WIN32
+extern char **environ; /* Process environment variables */
+#endif /* !WIN32 */
+
+
+/*
+ * Structures...
+ */
+
+typedef enum ippfind_exit_e /* Exit codes */
+{
+ IPPFIND_EXIT_TRUE = 0, /* OK and result is true */
+ IPPFIND_EXIT_FALSE, /* OK but result is false*/
+ IPPFIND_EXIT_BONJOUR, /* Browse/resolve failure */
+ IPPFIND_EXIT_SYNTAX, /* Bad option or syntax error */
+ IPPFIND_EXIT_MEMORY /* Out of memory */
+} ippfind_exit_t;
+
+typedef enum ippfind_op_e /* Operations for expressions */
+{
+ /* "Evaluation" operations */
+ IPPFIND_OP_NONE, /* No operation */
+ IPPFIND_OP_AND, /* Logical AND of all children */
+ IPPFIND_OP_OR, /* Logical OR of all children */
+ IPPFIND_OP_TRUE, /* Always true */
+ IPPFIND_OP_FALSE, /* Always false */
+ IPPFIND_OP_IS_LOCAL, /* Is a local service */
+ IPPFIND_OP_IS_REMOTE, /* Is a remote service */
+ IPPFIND_OP_DOMAIN_REGEX, /* Domain matches regular expression */
+ IPPFIND_OP_NAME_REGEX, /* Name matches regular expression */
+ IPPFIND_OP_HOST_REGEX, /* Hostname matches regular expression */
+ IPPFIND_OP_PORT_RANGE, /* Port matches range */
+ IPPFIND_OP_PATH_REGEX, /* Path matches regular expression */
+ IPPFIND_OP_TXT_EXISTS, /* TXT record key exists */
+ IPPFIND_OP_TXT_REGEX, /* TXT record key matches regular expression */
+ IPPFIND_OP_URI_REGEX, /* URI matches regular expression */
+
+ /* "Output" operations */
+ IPPFIND_OP_EXEC, /* Execute when true */
+ IPPFIND_OP_LIST, /* List when true */
+ IPPFIND_OP_PRINT_NAME, /* Print URI when true */
+ IPPFIND_OP_PRINT_URI, /* Print name when true */
+ IPPFIND_OP_QUIET /* No output when true */
+} ippfind_op_t;
+
+typedef struct ippfind_expr_s /* Expression */
+{
+ struct ippfind_expr_s
+ *prev, /* Previous expression */
+ *next, /* Next expression */
+ *parent, /* Parent expressions */
+ *child; /* Child expressions */
+ ippfind_op_t op; /* Operation code (see above) */
+ int invert; /* Invert the result */
+ char *key; /* TXT record key */
+ regex_t re; /* Regular expression for matching */
+ int range[2]; /* Port number range */
+ int num_args; /* Number of arguments for exec */
+ char **args; /* Arguments for exec */
+} ippfind_expr_t;
+
+typedef struct ippfind_srv_s /* Service information */
+{
+#ifdef HAVE_DNSSD
+ DNSServiceRef ref; /* Service reference for query */
+#elif defined(HAVE_AVAHI)
+ AvahiServiceResolver *ref; /* Resolver */
+#endif /* HAVE_DNSSD */
+ char *name, /* Service name */
+ *domain, /* Domain name */
+ *regtype, /* Registration type */
+ *fullName, /* Full name */
+ *host, /* Hostname */
+ *resource, /* Resource path */
+ *uri; /* URI */
+ int num_txt; /* Number of TXT record keys */
+ cups_option_t *txt; /* TXT record keys */
+ int port, /* Port number */
+ is_local, /* Is a local service? */
+ is_processed, /* Did we process the service? */
+ is_resolved; /* Got the resolve data? */
+} ippfind_srv_t;
+
+
+/*
+ * Local globals...
+ */
+
+#ifdef HAVE_DNSSD
+static DNSServiceRef dnssd_ref; /* Master service reference */
+#elif defined(HAVE_AVAHI)
+static AvahiClient *avahi_client = NULL;/* Client information */
+static int avahi_got_data = 0; /* Got data from poll? */
+static AvahiSimplePoll *avahi_poll = NULL;
+ /* Poll information */
+#endif /* HAVE_DNSSD */
+
+static int address_family = AF_UNSPEC;
+ /* Address family for LIST */
+static int bonjour_error = 0; /* Error browsing/resolving? */
+static double bonjour_timeout = 1.0; /* Timeout in seconds */
+static int ipp_version = 20; /* IPP version for LIST */
+
+
+/*
+ * Local functions...
+ */
+
+#ifdef HAVE_DNSSD
+static void DNSSD_API browse_callback(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain, void *context)
+ __attribute__((nonnull(1,5,6,7,8)));
+static void DNSSD_API browse_local_callback(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain,
+ void *context)
+ __attribute__((nonnull(1,5,6,7,8)));
+#elif defined(HAVE_AVAHI)
+static void browse_callback(AvahiServiceBrowser *browser,
+ AvahiIfIndex interface,
+ AvahiProtocol protocol,
+ AvahiBrowserEvent event,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain,
+ AvahiLookupResultFlags flags,
+ void *context);
+static void client_callback(AvahiClient *client,
+ AvahiClientState state,
+ void *context);
+#endif /* HAVE_AVAHI */
+
+static int compare_services(ippfind_srv_t *a, ippfind_srv_t *b);
+static const char *dnssd_error_string(int error);
+static int eval_expr(ippfind_srv_t *service,
+ ippfind_expr_t *expressions);
+static int exec_program(ippfind_srv_t *service, int num_args,
+ char **args);
+static ippfind_srv_t *get_service(cups_array_t *services,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain)
+ __attribute__((nonnull(1,2,3,4)));
+static double get_time(void);
+static int list_service(ippfind_srv_t *service);
+static ippfind_expr_t *new_expr(ippfind_op_t op, int invert,
+ const char *value, const char *regex,
+ char **args);
+#ifdef HAVE_DNSSD
+static void DNSSD_API resolve_callback(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *fullName,
+ const char *hostTarget, uint16_t port,
+ uint16_t txtLen,
+ const unsigned char *txtRecord,
+ void *context)
+ __attribute__((nonnull(1,5,6,9, 10)));
+#elif defined(HAVE_AVAHI)
+static int poll_callback(struct pollfd *pollfds,
+ unsigned int num_pollfds, int timeout,
+ void *context);
+static void resolve_callback(AvahiServiceResolver *res,
+ AvahiIfIndex interface,
+ AvahiProtocol protocol,
+ AvahiResolverEvent event,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain,
+ const char *host_name,
+ const AvahiAddress *address,
+ uint16_t port,
+ AvahiStringList *txt,
+ AvahiLookupResultFlags flags,
+ void *context);
+#endif /* HAVE_DNSSD */
+static void set_service_uri(ippfind_srv_t *service);
+static void show_usage(void) __attribute__((noreturn));
+static void show_version(void) __attribute__((noreturn));
+
+
+/*
+ * 'main()' - Browse for printers.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line args */
+ char *argv[]) /* I - Command-line arguments */
+{
+ int i, /* Looping var */
+ have_output = 0,/* Have output expression */
+ status = IPPFIND_EXIT_FALSE;
+ /* Exit status */
+ const char *opt, /* Option character */
+ *search; /* Current browse/resolve string */
+ cups_array_t *searches; /* Things to browse/resolve */
+ cups_array_t *services; /* Service array */
+ ippfind_srv_t *service; /* Current service */
+ ippfind_expr_t *expressions = NULL,
+ /* Expression tree */
+ *temp = NULL, /* New expression */
+ *parent = NULL, /* Parent expression */
+ *current = NULL,/* Current expression */
+ *parens[100]; /* Markers for parenthesis */
+ int num_parens = 0; /* Number of parenthesis */
+ ippfind_op_t logic = IPPFIND_OP_AND;
+ /* Logic for next expression */
+ int invert = 0; /* Invert expression? */
+ int err; /* DNS-SD error */
+#ifdef HAVE_DNSSD
+ fd_set sinput; /* Input set for select() */
+ struct timeval stimeout; /* Timeout for select() */
+#endif /* HAVE_DNSSD */
+ double endtime; /* End time */
+ static const char * const ops[] = /* Node operation names */
+ {
+ "NONE",
+ "AND",
+ "OR",
+ "TRUE",
+ "FALSE",
+ "IS_LOCAL",
+ "IS_REMOTE",
+ "DOMAIN_REGEX",
+ "NAME_REGEX",
+ "HOST_REGEX",
+ "PORT_RANGE",
+ "PATH_REGEX",
+ "TXT_EXISTS",
+ "TXT_REGEX",
+ "URI_REGEX",
+ "EXEC",
+ "LIST",
+ "PRINT_NAME",
+ "PRINT_URI",
+ "QUIET"
+ };
+
+
+ /*
+ * Initialize the locale...
+ */
+
+ _cupsSetLocale(argv);
+
+ /*
+ * Create arrays to track services and things we want to browse/resolve...
+ */
+
+ searches = cupsArrayNew(NULL, NULL);
+ services = cupsArrayNew((cups_array_func_t)compare_services, NULL);
+
+ /*
+ * Parse command-line...
+ */
+
+ if (getenv("IPPFIND_DEBUG"))
+ for (i = 1; i < argc; i ++)
+ fprintf(stderr, "argv[%d]=\"%s\"\n", i, argv[i]);
+
+ for (i = 1; i < argc; i ++)
+ {
+ if (argv[i][0] == '-')
+ {
+ if (argv[i][1] == '-')
+ {
+ /*
+ * Parse --option options...
+ */
+
+ if (!strcmp(argv[i], "--and"))
+ {
+ if (logic == IPPFIND_OP_OR)
+ {
+ _cupsLangPuts(stderr, _("ippfind: Cannot use --and after --or."));
+ show_usage();
+ }
+
+ if (!current)
+ {
+ _cupsLangPuts(stderr,
+ _("ippfind: Missing expression before \"--and\"."));
+ show_usage();
+ }
+
+ temp = NULL;
+ }
+ else if (!strcmp(argv[i], "--domain"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after %s."),
+ "--domain");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_DOMAIN_REGEX, invert, NULL, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--exec"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Expected program after %s."),
+ "--exec");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_EXEC, invert, NULL, NULL,
+ argv + i)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ while (i < argc)
+ if (!strcmp(argv[i], ";"))
+ break;
+ else
+ i ++;
+
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Expected semi-colon after %s."),
+ "--exec");
+ show_usage();
+ }
+
+ have_output = 1;
+ }
+ else if (!strcmp(argv[i], "--false"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_FALSE, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--help"))
+ {
+ show_usage();
+ }
+ else if (!strcmp(argv[i], "--host"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after %s."),
+ "--host");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_HOST_REGEX, invert, NULL, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--ls"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_LIST, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ }
+ else if (!strcmp(argv[i], "--local"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_IS_LOCAL, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--name"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after %s."),
+ "--name");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_NAME_REGEX, invert, NULL, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--not"))
+ {
+ invert = 1;
+ }
+ else if (!strcmp(argv[i], "--or"))
+ {
+ if (!current)
+ {
+ _cupsLangPuts(stderr,
+ _("ippfind: Missing expression before \"--or\"."));
+ show_usage();
+ }
+
+ logic = IPPFIND_OP_OR;
+
+ if (parent && parent->op == IPPFIND_OP_OR)
+ {
+ /*
+ * Already setup to do "foo --or bar --or baz"...
+ */
+
+ temp = NULL;
+ }
+ else if (!current->prev && parent)
+ {
+ /*
+ * Change parent node into an OR node...
+ */
+
+ parent->op = IPPFIND_OP_OR;
+ temp = NULL;
+ }
+ else if (!current->prev)
+ {
+ /*
+ * Need to group "current" in a new OR node...
+ */
+
+ if ((temp = new_expr(IPPFIND_OP_OR, 0, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ temp->parent = parent;
+ temp->child = current;
+ current->parent = temp;
+
+ if (parent)
+ parent->child = temp;
+ else
+ expressions = temp;
+
+ parent = temp;
+ temp = NULL;
+ }
+ else
+ {
+ /*
+ * Need to group previous expressions in an AND node, and then
+ * put that in an OR node...
+ */
+
+ if ((temp = new_expr(IPPFIND_OP_AND, 0, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ while (current->prev)
+ {
+ current->parent = temp;
+ current = current->prev;
+ }
+
+ current->parent = temp;
+ temp->child = current;
+ current = temp;
+
+ if ((temp = new_expr(IPPFIND_OP_OR, 0, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ temp->parent = parent;
+ current->parent = temp;
+
+ if (parent)
+ parent->child = temp;
+ else
+ expressions = temp;
+
+ parent = temp;
+ temp = NULL;
+ }
+ }
+ else if (!strcmp(argv[i], "--path"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after %s."),
+ "--path");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_PATH_REGEX, invert, NULL, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--port"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Expected port range after %s."),
+ "--port");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_PORT_RANGE, invert, argv[i], NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--print"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_PRINT_URI, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ }
+ else if (!strcmp(argv[i], "--print-name"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_PRINT_NAME, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ }
+ else if (!strcmp(argv[i], "--quiet"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_QUIET, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ }
+ else if (!strcmp(argv[i], "--remote"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_IS_REMOTE, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--true"))
+ {
+ if ((temp = new_expr(IPPFIND_OP_TRUE, invert, NULL, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--txt"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Expected key name after %s."),
+ "--txt");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_TXT_EXISTS, invert, argv[i], NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strncmp(argv[i], "--txt-", 6))
+ {
+ const char *key = argv[i] + 6;/* TXT key */
+
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after %s."),
+ argv[i - 1]);
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_TXT_REGEX, invert, key, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--uri"))
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after %s."),
+ "--uri");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_URI_REGEX, invert, NULL, argv[i],
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ }
+ else if (!strcmp(argv[i], "--version"))
+ {
+ show_version();
+ }
+ else
+ {
+ _cupsLangPrintf(stderr, _("%s: Unknown option \"%s\"."),
+ "ippfind", argv[i]);
+ show_usage();
+ }
+
+ if (temp)
+ {
+ /*
+ * Add new expression...
+ */
+
+ if (logic == IPPFIND_OP_AND &&
+ current && current->prev &&
+ parent && parent->op != IPPFIND_OP_AND)
+ {
+ /*
+ * Need to re-group "current" in a new AND node...
+ */
+
+ ippfind_expr_t *tempand; /* Temporary AND node */
+
+ if ((tempand = new_expr(IPPFIND_OP_AND, 0, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ /*
+ * Replace "current" with new AND node at the end of this list...
+ */
+
+ current->prev->next = tempand;
+ tempand->prev = current->prev;
+ tempand->parent = parent;
+
+ /*
+ * Add "current to the new AND node...
+ */
+
+ tempand->child = current;
+ current->parent = tempand;
+ current->prev = NULL;
+ parent = tempand;
+ }
+
+ /*
+ * Add the new node at current level...
+ */
+
+ temp->parent = parent;
+ temp->prev = current;
+
+ if (current)
+ current->next = temp;
+ else if (parent)
+ parent->child = temp;
+ else
+ expressions = temp;
+
+ current = temp;
+ invert = 0;
+ logic = IPPFIND_OP_AND;
+ temp = NULL;
+ }
+ }
+ else
+ {
+ /*
+ * Parse -o options
+ */
+
+ for (opt = argv[i] + 1; *opt; opt ++)
+ {
+ switch (*opt)
+ {
+ case '4' :
+ address_family = AF_INET;
+ break;
+
+ case '6' :
+ address_family = AF_INET6;
+ break;
+
+ case 'P' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Expected port range after %s."),
+ "-P");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_PORT_RANGE, invert, argv[i],
+ NULL, NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 'T' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("%s: Missing timeout for \"-T\"."),
+ "ippfind");
+ show_usage();
+ }
+
+ bonjour_timeout = atof(argv[i]);
+ break;
+
+ case 'V' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("%s: Missing version for \"-V\"."),
+ "ippfind");
+ show_usage();
+ }
+
+ if (!strcmp(argv[i], "1.1"))
+ ipp_version = 11;
+ else if (!strcmp(argv[i], "2.0"))
+ ipp_version = 20;
+ else if (!strcmp(argv[i], "2.1"))
+ ipp_version = 21;
+ else if (!strcmp(argv[i], "2.2"))
+ ipp_version = 22;
+ else
+ {
+ _cupsLangPrintf(stderr, _("%s: Bad version %s for \"-V\"."),
+ "ippfind", argv[i]);
+ show_usage();
+ }
+ break;
+
+ case 'd' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after "
+ "%s."), "-d");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_DOMAIN_REGEX, invert, NULL,
+ argv[i], NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 'h' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after "
+ "%s."), "-h");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_HOST_REGEX, invert, NULL,
+ argv[i], NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 'l' :
+ if ((temp = new_expr(IPPFIND_OP_LIST, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ break;
+
+ case 'n' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after "
+ "%s."), "-n");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_NAME_REGEX, invert, NULL,
+ argv[i], NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 'p' :
+ if ((temp = new_expr(IPPFIND_OP_PRINT_URI, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ break;
+
+ case 'q' :
+ if ((temp = new_expr(IPPFIND_OP_QUIET, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ break;
+
+ case 'r' :
+ if ((temp = new_expr(IPPFIND_OP_IS_REMOTE, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 's' :
+ if ((temp = new_expr(IPPFIND_OP_PRINT_NAME, invert, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ have_output = 1;
+ break;
+
+ case 't' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing key name after %s."),
+ "-t");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_TXT_EXISTS, invert, argv[i],
+ NULL, NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 'u' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing regular expression after "
+ "%s."), "-u");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_URI_REGEX, invert, NULL,
+ argv[i], NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+ break;
+
+ case 'x' :
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing program after %s."),
+ "-x");
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_EXEC, invert, NULL, NULL,
+ argv + i)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ while (i < argc)
+ if (!strcmp(argv[i], ";"))
+ break;
+ else
+ i ++;
+
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Missing semi-colon after %s."),
+ "-x");
+ show_usage();
+ }
+
+ have_output = 1;
+ break;
+
+ default :
+ _cupsLangPrintf(stderr, _("%s: Unknown option \"-%c\"."),
+ "ippfind", *opt);
+ show_usage();
+ }
+
+ if (temp)
+ {
+ /*
+ * Add new expression...
+ */
+
+ if (logic == IPPFIND_OP_AND &&
+ current && current->prev &&
+ parent && parent->op != IPPFIND_OP_AND)
+ {
+ /*
+ * Need to re-group "current" in a new AND node...
+ */
+
+ ippfind_expr_t *tempand; /* Temporary AND node */
+
+ if ((tempand = new_expr(IPPFIND_OP_AND, 0, NULL, NULL,
+ NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ /*
+ * Replace "current" with new AND node at the end of this list...
+ */
+
+ current->prev->next = tempand;
+ tempand->prev = current->prev;
+ tempand->parent = parent;
+
+ /*
+ * Add "current to the new AND node...
+ */
+
+ tempand->child = current;
+ current->parent = tempand;
+ current->prev = NULL;
+ parent = tempand;
+ }
+
+ /*
+ * Add the new node at current level...
+ */
+
+ temp->parent = parent;
+ temp->prev = current;
+
+ if (current)
+ current->next = temp;
+ else if (parent)
+ parent->child = temp;
+ else
+ expressions = temp;
+
+ current = temp;
+ invert = 0;
+ logic = IPPFIND_OP_AND;
+ temp = NULL;
+ }
+ }
+ }
+ }
+ else if (!strcmp(argv[i], "("))
+ {
+ if (num_parens >= 100)
+ {
+ _cupsLangPuts(stderr, _("ippfind: Too many parenthesis."));
+ show_usage();
+ }
+
+ if ((temp = new_expr(IPPFIND_OP_AND, invert, NULL, NULL, NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ parens[num_parens++] = temp;
+
+ if (current)
+ {
+ temp->parent = current->parent;
+ current->next = temp;
+ temp->prev = current;
+ }
+ else
+ expressions = temp;
+
+ parent = temp;
+ current = NULL;
+ invert = 0;
+ logic = IPPFIND_OP_AND;
+ }
+ else if (!strcmp(argv[i], ")"))
+ {
+ if (num_parens <= 0)
+ {
+ _cupsLangPuts(stderr, _("ippfind: Missing open parenthesis."));
+ show_usage();
+ }
+
+ current = parens[--num_parens];
+ parent = current->parent;
+ invert = 0;
+ logic = IPPFIND_OP_AND;
+ }
+ else if (!strcmp(argv[i], "!"))
+ {
+ invert = 1;
+ }
+ else
+ {
+ /*
+ * _regtype._tcp[,subtype][.domain]
+ *
+ * OR
+ *
+ * service-name[._regtype._tcp[.domain]]
+ */
+
+ cupsArrayAdd(searches, argv[i]);
+ }
+ }
+
+ if (num_parens > 0)
+ {
+ _cupsLangPuts(stderr, _("ippfind: Missing close parenthesis."));
+ show_usage();
+ }
+
+ if (!have_output)
+ {
+ /*
+ * Add an implicit --print-uri to the end...
+ */
+
+ if ((temp = new_expr(IPPFIND_OP_PRINT_URI, 0, NULL, NULL, NULL)) == NULL)
+ return (IPPFIND_EXIT_MEMORY);
+
+ if (current)
+ {
+ while (current->parent)
+ current = current->parent;
+
+ current->next = temp;
+ temp->prev = current;
+ }
+ else
+ expressions = temp;
+ }
+
+ if (cupsArrayCount(searches) == 0)
+ {
+ /*
+ * Add an implicit browse for IPP printers ("_ipp._tcp")...
+ */
+
+ cupsArrayAdd(searches, "_ipp._tcp");
+ }
+
+ if (getenv("IPPFIND_DEBUG"))
+ {
+ int indent = 4; /* Indentation */
+
+ puts("Expression tree:");
+ current = expressions;
+ while (current)
+ {
+ /*
+ * Print the current node...
+ */
+
+ printf("%*s%s%s\n", indent, "", current->invert ? "!" : "",
+ ops[current->op]);
+
+ /*
+ * Advance to the next node...
+ */
+
+ if (current->child)
+ {
+ current = current->child;
+ indent += 4;
+ }
+ else if (current->next)
+ current = current->next;
+ else if (current->parent)
+ {
+ while (current->parent)
+ {
+ indent -= 4;
+ current = current->parent;
+ if (current->next)
+ break;
+ }
+
+ current = current->next;
+ }
+ else
+ current = NULL;
+ }
+
+ puts("\nSearch items:");
+ for (search = (const char *)cupsArrayFirst(searches);
+ search;
+ search = (const char *)cupsArrayNext(searches))
+ printf(" %s\n", search);
+ }
+
+ /*
+ * Start up browsing/resolving...
+ */
+
+#ifdef HAVE_DNSSD
+ if ((err = DNSServiceCreateConnection(&dnssd_ref)) != kDNSServiceErr_NoError)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"),
+ dnssd_error_string(err));
+ return (IPPFIND_EXIT_BONJOUR);
+ }
+
+#elif defined(HAVE_AVAHI)
+ if ((avahi_poll = avahi_simple_poll_new()) == NULL)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"),
+ strerror(errno));
+ return (IPPFIND_EXIT_BONJOUR);
+ }
+
+ avahi_simple_poll_set_func(avahi_poll, poll_callback, NULL);
+
+ avahi_client = avahi_client_new(avahi_simple_poll_get(avahi_poll),
+ 0, client_callback, avahi_poll, &err);
+ if (!avahi_client)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"),
+ dnssd_error_string(err));
+ return (IPPFIND_EXIT_BONJOUR);
+ }
+#endif /* HAVE_DNSSD */
+
+ for (search = (const char *)cupsArrayFirst(searches);
+ search;
+ search = (const char *)cupsArrayNext(searches))
+ {
+ char buf[1024], /* Full name string */
+ *name = NULL, /* Service instance name */
+ *regtype, /* Registration type */
+ *domain; /* Domain, if any */
+
+ strlcpy(buf, search, sizeof(buf));
+ if (buf[0] == '_')
+ {
+ regtype = buf;
+ }
+ else if ((regtype = strstr(buf, "._")) != NULL)
+ {
+ name = buf;
+ *regtype++ = '\0';
+ }
+ else
+ {
+ name = buf;
+ regtype = "_ipp._tcp";
+ }
+
+ for (domain = regtype; *domain; domain ++)
+ if (*domain == '.' && domain[1] != '_')
+ {
+ *domain++ = '\0';
+ break;
+ }
+
+ if (!*domain)
+ domain = NULL;
+
+ if (name)
+ {
+ /*
+ * Resolve the given service instance name, regtype, and domain...
+ */
+
+ if (!domain)
+ domain = "local.";
+
+ service = get_service(services, name, regtype, domain);
+
+#ifdef HAVE_DNSSD
+ service->ref = dnssd_ref;
+ err = DNSServiceResolve(&(service->ref),
+ kDNSServiceFlagsShareConnection, 0, name,
+ regtype, domain, resolve_callback,
+ service);
+
+#elif defined(HAVE_AVAHI)
+ service->ref = avahi_service_resolver_new(avahi_client, AVAHI_IF_UNSPEC,
+ AVAHI_PROTO_UNSPEC, name,
+ regtype, domain,
+ AVAHI_PROTO_UNSPEC, 0,
+ resolve_callback, service);
+ if (service->ref)
+ err = 0;
+ else
+ err = avahi_client_errno(avahi_client);
+#endif /* HAVE_DNSSD */
+ }
+ else
+ {
+ /*
+ * Browse for services of the given type...
+ */
+
+#ifdef HAVE_DNSSD
+ DNSServiceRef ref; /* Browse reference */
+
+ ref = dnssd_ref;
+ err = DNSServiceBrowse(&ref, kDNSServiceFlagsShareConnection, 0, regtype,
+ domain, browse_callback, services);
+
+ if (!err)
+ {
+ ref = dnssd_ref;
+ err = DNSServiceBrowse(&ref, kDNSServiceFlagsShareConnection,
+ kDNSServiceInterfaceIndexLocalOnly, regtype,
+ domain, browse_local_callback, services);
+ }
+
+#elif defined(HAVE_AVAHI)
+ if (avahi_service_browser_new(avahi_client, AVAHI_IF_UNSPEC,
+ AVAHI_PROTO_UNSPEC, regtype, domain, 0,
+ browse_callback, services))
+ err = 0;
+ else
+ err = avahi_client_errno(avahi_client);
+#endif /* HAVE_DNSSD */
+ }
+
+ if (err)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to browse or resolve: %s"),
+ dnssd_error_string(err));
+
+ if (name)
+ printf("name=\"%s\"\n", name);
+
+ printf("regtype=\"%s\"\n", regtype);
+
+ if (domain)
+ printf("domain=\"%s\"\n", domain);
+
+ return (IPPFIND_EXIT_BONJOUR);
+ }
+ }
+
+ /*
+ * Process browse/resolve requests...
+ */
+
+ if (bonjour_timeout > 1.0)
+ endtime = get_time() + bonjour_timeout;
+ else
+ endtime = get_time() + 300.0;
+
+ while (get_time() < endtime)
+ {
+ int process = 0; /* Process services? */
+
+#ifdef HAVE_DNSSD
+ int fd = DNSServiceRefSockFD(dnssd_ref);
+ /* File descriptor for DNS-SD */
+
+ FD_ZERO(&sinput);
+ FD_SET(fd, &sinput);
+
+ stimeout.tv_sec = 0;
+ stimeout.tv_usec = 500000;
+
+ if (select(fd + 1, &sinput, NULL, NULL, &stimeout) < 0)
+ continue;
+
+ if (FD_ISSET(fd, &sinput))
+ {
+ /*
+ * Process responses...
+ */
+
+ DNSServiceProcessResult(dnssd_ref);
+ }
+ else
+ {
+ /*
+ * Time to process services...
+ */
+
+ process = 1;
+ }
+
+#elif defined(HAVE_AVAHI)
+ avahi_got_data = 0;
+
+ if (avahi_simple_poll_iterate(avahi_poll, 500) > 0)
+ {
+ /*
+ * We've been told to exit the loop. Perhaps the connection to
+ * Avahi failed.
+ */
+
+ return (IPPFIND_EXIT_BONJOUR);
+ }
+
+ if (!avahi_got_data)
+ {
+ /*
+ * Time to process services...
+ */
+
+ process = 1;
+ }
+#endif /* HAVE_DNSSD */
+
+ if (process)
+ {
+ /*
+ * Process any services that we have found...
+ */
+
+ int active = 0, /* Number of active resolves */
+ resolved = 0, /* Number of resolved services */
+ processed = 0; /* Number of processed services */
+
+ for (service = (ippfind_srv_t *)cupsArrayFirst(services);
+ service;
+ service = (ippfind_srv_t *)cupsArrayNext(services))
+ {
+ if (service->is_processed)
+ processed ++;
+
+ if (service->is_resolved)
+ resolved ++;
+
+ if (!service->ref && !service->is_resolved)
+ {
+ /*
+ * Found a service, now resolve it (but limit to 50 active resolves...)
+ */
+
+ if (active < 50)
+ {
+#ifdef HAVE_DNSSD
+ service->ref = dnssd_ref;
+ err = DNSServiceResolve(&(service->ref),
+ kDNSServiceFlagsShareConnection, 0,
+ service->name, service->regtype,
+ service->domain, resolve_callback,
+ service);
+
+#elif defined(HAVE_AVAHI)
+ service->ref = avahi_service_resolver_new(avahi_client,
+ AVAHI_IF_UNSPEC,
+ AVAHI_PROTO_UNSPEC,
+ service->name,
+ service->regtype,
+ service->domain,
+ AVAHI_PROTO_UNSPEC, 0,
+ resolve_callback,
+ service);
+ if (service->ref)
+ err = 0;
+ else
+ err = avahi_client_errno(avahi_client);
+#endif /* HAVE_DNSSD */
+
+ if (err)
+ {
+ _cupsLangPrintf(stderr,
+ _("ippfind: Unable to browse or resolve: %s"),
+ dnssd_error_string(err));
+ return (IPPFIND_EXIT_BONJOUR);
+ }
+
+ active ++;
+ }
+ }
+ else if (service->is_resolved && !service->is_processed)
+ {
+ /*
+ * Resolved, not process this service against the expressions...
+ */
+
+ if (service->ref)
+ {
+#ifdef HAVE_DNSSD
+ DNSServiceRefDeallocate(service->ref);
+#else
+ avahi_service_resolver_free(service->ref);
+#endif /* HAVE_DNSSD */
+
+ service->ref = NULL;
+ }
+
+ if (eval_expr(service, expressions))
+ status = IPPFIND_EXIT_TRUE;
+
+ service->is_processed = 1;
+ }
+ else if (service->ref)
+ active ++;
+ }
+
+ /*
+ * If we have processed all services we have discovered, then we are done.
+ */
+
+ if (processed == cupsArrayCount(services) && bonjour_timeout <= 1.0)
+ break;
+ }
+ }
+
+ if (bonjour_error)
+ return (IPPFIND_EXIT_BONJOUR);
+ else
+ return (status);
+}
+
+
+#ifdef HAVE_DNSSD
+/*
+ * 'browse_callback()' - Browse devices.
+ */
+
+static void DNSSD_API
+browse_callback(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Option flags */
+ uint32_t interfaceIndex, /* I - Interface number */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain, /* I - Service domain */
+ void *context) /* I - Services array */
+{
+ /*
+ * Only process "add" data...
+ */
+
+ (void)sdRef;
+ (void)interfaceIndex;
+
+ if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd))
+ return;
+
+ /*
+ * Get the device...
+ */
+
+ get_service((cups_array_t *)context, serviceName, regtype, replyDomain);
+}
+
+
+/*
+ * 'browse_local_callback()' - Browse local devices.
+ */
+
+static void DNSSD_API
+browse_local_callback(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Option flags */
+ uint32_t interfaceIndex, /* I - Interface number */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain, /* I - Service domain */
+ void *context) /* I - Services array */
+{
+ ippfind_srv_t *service; /* Service */
+
+
+ /*
+ * Only process "add" data...
+ */
+
+ (void)sdRef;
+ (void)interfaceIndex;
+
+ if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd))
+ return;
+
+ /*
+ * Get the device...
+ */
+
+ service = get_service((cups_array_t *)context, serviceName, regtype,
+ replyDomain);
+ service->is_local = 1;
+}
+#endif /* HAVE_DNSSD */
+
+
+#ifdef HAVE_AVAHI
+/*
+ * 'browse_callback()' - Browse devices.
+ */
+
+static void
+browse_callback(
+ AvahiServiceBrowser *browser, /* I - Browser */
+ AvahiIfIndex interface, /* I - Interface index (unused) */
+ AvahiProtocol protocol, /* I - Network protocol (unused) */
+ AvahiBrowserEvent event, /* I - What happened */
+ const char *name, /* I - Service name */
+ const char *type, /* I - Registration type */
+ const char *domain, /* I - Domain */
+ AvahiLookupResultFlags flags, /* I - Flags */
+ void *context) /* I - Services array */
+{
+ AvahiClient *client = avahi_service_browser_get_client(browser);
+ /* Client information */
+ ippfind_srv_t *service; /* Service information */
+
+
+ (void)interface;
+ (void)protocol;
+ (void)context;
+
+ switch (event)
+ {
+ case AVAHI_BROWSER_FAILURE:
+ fprintf(stderr, "DEBUG: browse_callback: %s\n",
+ avahi_strerror(avahi_client_errno(client)));
+ bonjour_error = 1;
+ avahi_simple_poll_quit(avahi_poll);
+ break;
+
+ case AVAHI_BROWSER_NEW:
+ /*
+ * This object is new on the network. Create a device entry for it if
+ * it doesn't yet exist.
+ */
+
+ service = get_service((cups_array_t *)context, name, type, domain);
+
+ if (flags & AVAHI_LOOKUP_RESULT_LOCAL)
+ service->is_local = 1;
+ break;
+
+ case AVAHI_BROWSER_REMOVE:
+ case AVAHI_BROWSER_ALL_FOR_NOW:
+ case AVAHI_BROWSER_CACHE_EXHAUSTED:
+ break;
+ }
+}
+
+
+/*
+ * 'client_callback()' - Avahi client callback function.
+ */
+
+static void
+client_callback(
+ AvahiClient *client, /* I - Client information (unused) */
+ AvahiClientState state, /* I - Current state */
+ void *context) /* I - User data (unused) */
+{
+ (void)client;
+ (void)context;
+
+ /*
+ * If the connection drops, quit.
+ */
+
+ if (state == AVAHI_CLIENT_FAILURE)
+ {
+ fputs("DEBUG: Avahi connection failed.\n", stderr);
+ bonjour_error = 1;
+ avahi_simple_poll_quit(avahi_poll);
+ }
+}
+#endif /* HAVE_AVAHI */
+
+
+/*
+ * 'compare_services()' - Compare two devices.
+ */
+
+static int /* O - Result of comparison */
+compare_services(ippfind_srv_t *a, /* I - First device */
+ ippfind_srv_t *b) /* I - Second device */
+{
+ return (strcmp(a->name, b->name));
+}
+
+
+/*
+ * 'dnssd_error_string()' - Return an error string for an error code.
+ */
+
+static const char * /* O - Error message */
+dnssd_error_string(int error) /* I - Error number */
+{
+# ifdef HAVE_DNSSD
+ switch (error)
+ {
+ case kDNSServiceErr_NoError :
+ return ("OK.");
+
+ default :
+ case kDNSServiceErr_Unknown :
+ return ("Unknown error.");
+
+ case kDNSServiceErr_NoSuchName :
+ return ("Service not found.");
+
+ case kDNSServiceErr_NoMemory :
+ return ("Out of memory.");
+
+ case kDNSServiceErr_BadParam :
+ return ("Bad parameter.");
+
+ case kDNSServiceErr_BadReference :
+ return ("Bad service reference.");
+
+ case kDNSServiceErr_BadState :
+ return ("Bad state.");
+
+ case kDNSServiceErr_BadFlags :
+ return ("Bad flags.");
+
+ case kDNSServiceErr_Unsupported :
+ return ("Unsupported.");
+
+ case kDNSServiceErr_NotInitialized :
+ return ("Not initialized.");
+
+ case kDNSServiceErr_AlreadyRegistered :
+ return ("Already registered.");
+
+ case kDNSServiceErr_NameConflict :
+ return ("Name conflict.");
+
+ case kDNSServiceErr_Invalid :
+ return ("Invalid name.");
+
+ case kDNSServiceErr_Firewall :
+ return ("Firewall prevents registration.");
+
+ case kDNSServiceErr_Incompatible :
+ return ("Client library incompatible.");
+
+ case kDNSServiceErr_BadInterfaceIndex :
+ return ("Bad interface index.");
+
+ case kDNSServiceErr_Refused :
+ return ("Server prevents registration.");
+
+ case kDNSServiceErr_NoSuchRecord :
+ return ("Record not found.");
+
+ case kDNSServiceErr_NoAuth :
+ return ("Authentication required.");
+
+ case kDNSServiceErr_NoSuchKey :
+ return ("Encryption key not found.");
+
+ case kDNSServiceErr_NATTraversal :
+ return ("Unable to traverse NAT boundary.");
+
+ case kDNSServiceErr_DoubleNAT :
+ return ("Unable to traverse double-NAT boundary.");
+
+ case kDNSServiceErr_BadTime :
+ return ("Bad system time.");
+
+ case kDNSServiceErr_BadSig :
+ return ("Bad signature.");
+
+ case kDNSServiceErr_BadKey :
+ return ("Bad encryption key.");
+
+ case kDNSServiceErr_Transient :
+ return ("Transient error occurred - please try again.");
+
+ case kDNSServiceErr_ServiceNotRunning :
+ return ("Server not running.");
+
+ case kDNSServiceErr_NATPortMappingUnsupported :
+ return ("NAT doesn't support NAT-PMP or UPnP.");
+
+ case kDNSServiceErr_NATPortMappingDisabled :
+ return ("NAT supports NAT-PNP or UPnP but it is disabled.");
+
+ case kDNSServiceErr_NoRouter :
+ return ("No Internet/default router configured.");
+
+ case kDNSServiceErr_PollingMode :
+ return ("Service polling mode error.");
+
+#ifndef WIN32
+ case kDNSServiceErr_Timeout :
+ return ("Service timeout.");
+#endif /* !WIN32 */
+ }
+
+# elif defined(HAVE_AVAHI)
+ return (avahi_strerror(error));
+# endif /* HAVE_DNSSD */
+}
+
+
+/*
+ * 'eval_expr()' - Evaluate the expressions against the specified service.
+ *
+ * Returns 1 for true and 0 for false.
+ */
+
+static int /* O - Result of evaluation */
+eval_expr(ippfind_srv_t *service, /* I - Service */
+ ippfind_expr_t *expressions) /* I - Expressions */
+{
+ int logic, /* Logical operation */
+ result; /* Result of current expression */
+ ippfind_expr_t *expression; /* Current expression */
+ const char *val; /* TXT value */
+
+ /*
+ * Loop through the expressions...
+ */
+
+ if (expressions && expressions->parent)
+ logic = expressions->parent->op;
+ else
+ logic = IPPFIND_OP_AND;
+
+ for (expression = expressions; expression; expression = expression->next)
+ {
+ switch (expression->op)
+ {
+ default :
+ case IPPFIND_OP_AND :
+ case IPPFIND_OP_OR :
+ if (expression->child)
+ result = eval_expr(service, expression->child);
+ else
+ result = expression->op == IPPFIND_OP_AND;
+ break;
+ case IPPFIND_OP_TRUE :
+ result = 1;
+ break;
+ case IPPFIND_OP_FALSE :
+ result = 0;
+ break;
+ case IPPFIND_OP_IS_LOCAL :
+ result = service->is_local;
+ break;
+ case IPPFIND_OP_IS_REMOTE :
+ result = !service->is_local;
+ break;
+ case IPPFIND_OP_DOMAIN_REGEX :
+ result = !regexec(&(expression->re), service->domain, 0, NULL, 0);
+ break;
+ case IPPFIND_OP_NAME_REGEX :
+ result = !regexec(&(expression->re), service->name, 0, NULL, 0);
+ break;
+ case IPPFIND_OP_HOST_REGEX :
+ result = !regexec(&(expression->re), service->host, 0, NULL, 0);
+ break;
+ case IPPFIND_OP_PORT_RANGE :
+ result = service->port >= expression->range[0] &&
+ service->port <= expression->range[1];
+ break;
+ case IPPFIND_OP_PATH_REGEX :
+ result = !regexec(&(expression->re), service->resource, 0, NULL, 0);
+ break;
+ case IPPFIND_OP_TXT_EXISTS :
+ result = cupsGetOption(expression->key, service->num_txt,
+ service->txt) != NULL;
+ break;
+ case IPPFIND_OP_TXT_REGEX :
+ val = cupsGetOption(expression->key, service->num_txt,
+ service->txt);
+ if (val)
+ result = !regexec(&(expression->re), val, 0, NULL, 0);
+ else
+ result = 0;
+
+ if (getenv("IPPFIND_DEBUG"))
+ printf("TXT_REGEX of \"%s\": %d\n", val, result);
+ break;
+ case IPPFIND_OP_URI_REGEX :
+ result = !regexec(&(expression->re), service->uri, 0, NULL, 0);
+ break;
+ case IPPFIND_OP_EXEC :
+ result = exec_program(service, expression->num_args,
+ expression->args);
+ break;
+ case IPPFIND_OP_LIST :
+ result = list_service(service);
+ break;
+ case IPPFIND_OP_PRINT_NAME :
+ _cupsLangPuts(stdout, service->name);
+ result = 1;
+ break;
+ case IPPFIND_OP_PRINT_URI :
+ _cupsLangPuts(stdout, service->uri);
+ result = 1;
+ break;
+ case IPPFIND_OP_QUIET :
+ result = 1;
+ break;
+ }
+
+ if (expression->invert)
+ result = !result;
+
+ if (logic == IPPFIND_OP_AND && !result)
+ return (0);
+ else if (logic == IPPFIND_OP_OR && result)
+ return (1);
+ }
+
+ return (logic == IPPFIND_OP_AND);
+}
+
+
+/*
+ * 'exec_program()' - Execute a program for a service.
+ */
+
+static int /* O - 1 if program terminated
+ successfully, 0 otherwise. */
+exec_program(ippfind_srv_t *service, /* I - Service */
+ int num_args, /* I - Number of command-line args */
+ char **args) /* I - Command-line arguments */
+{
+ char **myargv, /* Command-line arguments */
+ **myenvp, /* Environment variables */
+ *ptr, /* Pointer into variable */
+ domain[1024], /* IPPFIND_SERVICE_DOMAIN */
+ hostname[1024], /* IPPFIND_SERVICE_HOSTNAME */
+ name[256], /* IPPFIND_SERVICE_NAME */
+ port[32], /* IPPFIND_SERVICE_PORT */
+ regtype[256], /* IPPFIND_SERVICE_REGTYPE */
+ scheme[128], /* IPPFIND_SERVICE_SCHEME */
+ uri[1024], /* IPPFIND_SERVICE_URI */
+ txt[100][256]; /* IPPFIND_TXT_foo */
+ int i, /* Looping var */
+ myenvc, /* Number of environment variables */
+ status; /* Exit status of program */
+#ifndef WIN32
+ char program[1024]; /* Program to execute */
+ int pid; /* Process ID */
+#endif /* !WIN32 */
+
+
+ /*
+ * Environment variables...
+ */
+
+ snprintf(domain, sizeof(domain), "IPPFIND_SERVICE_DOMAIN=%s",
+ service->domain);
+ snprintf(hostname, sizeof(hostname), "IPPFIND_SERVICE_HOSTNAME=%s",
+ service->host);
+ snprintf(name, sizeof(name), "IPPFIND_SERVICE_NAME=%s", service->name);
+ snprintf(port, sizeof(port), "IPPFIND_SERVICE_PORT=%d", service->port);
+ snprintf(regtype, sizeof(regtype), "IPPFIND_SERVICE_REGTYPE=%s",
+ service->regtype);
+ snprintf(scheme, sizeof(scheme), "IPPFIND_SERVICE_SCHEME=%s",
+ !strncmp(service->regtype, "_http._tcp", 10) ? "http" :
+ !strncmp(service->regtype, "_https._tcp", 11) ? "https" :
+ !strncmp(service->regtype, "_ipp._tcp", 9) ? "ipp" :
+ !strncmp(service->regtype, "_ipps._tcp", 10) ? "ipps" : "lpd");
+ snprintf(uri, sizeof(uri), "IPPFIND_SERVICE_URI=%s", service->uri);
+ for (i = 0; i < service->num_txt && i < 100; i ++)
+ {
+ snprintf(txt[i], sizeof(txt[i]), "IPPFIND_TXT_%s=%s", service->txt[i].name,
+ service->txt[i].value);
+ for (ptr = txt[i] + 12; *ptr && *ptr != '='; ptr ++)
+ *ptr = (char)_cups_toupper(*ptr);
+ }
+
+ for (i = 0, myenvc = 7 + service->num_txt; environ[i]; i ++)
+ if (strncmp(environ[i], "IPPFIND_", 8))
+ myenvc ++;
+
+ if ((myenvp = calloc(sizeof(char *), (size_t)(myenvc + 1))) == NULL)
+ {
+ _cupsLangPuts(stderr, _("ippfind: Out of memory."));
+ exit(IPPFIND_EXIT_MEMORY);
+ }
+
+ for (i = 0, myenvc = 0; environ[i]; i ++)
+ if (strncmp(environ[i], "IPPFIND_", 8))
+ myenvp[myenvc++] = environ[i];
+
+ myenvp[myenvc++] = domain;
+ myenvp[myenvc++] = hostname;
+ myenvp[myenvc++] = name;
+ myenvp[myenvc++] = port;
+ myenvp[myenvc++] = regtype;
+ myenvp[myenvc++] = scheme;
+ myenvp[myenvc++] = uri;
+
+ for (i = 0; i < service->num_txt && i < 100; i ++)
+ myenvp[myenvc++] = txt[i];
+
+ /*
+ * Allocate and copy command-line arguments...
+ */
+
+ if ((myargv = calloc(sizeof(char *), (size_t)(num_args + 1))) == NULL)
+ {
+ _cupsLangPuts(stderr, _("ippfind: Out of memory."));
+ exit(IPPFIND_EXIT_MEMORY);
+ }
+
+ for (i = 0; i < num_args; i ++)
+ {
+ if (strchr(args[i], '{'))
+ {
+ char temp[2048], /* Temporary string */
+ *tptr, /* Pointer into temporary string */
+ keyword[256], /* {keyword} */
+ *kptr; /* Pointer into keyword */
+
+ for (ptr = args[i], tptr = temp; *ptr; ptr ++)
+ {
+ if (*ptr == '{')
+ {
+ /*
+ * Do a {var} substitution...
+ */
+
+ for (kptr = keyword, ptr ++; *ptr && *ptr != '}'; ptr ++)
+ if (kptr < (keyword + sizeof(keyword) - 1))
+ *kptr++ = *ptr;
+
+ if (*ptr != '}')
+ {
+ _cupsLangPuts(stderr,
+ _("ippfind: Missing close brace in substitution."));
+ exit(IPPFIND_EXIT_SYNTAX);
+ }
+
+ *kptr = '\0';
+ if (!keyword[0] || !strcmp(keyword, "service_uri"))
+ strlcpy(tptr, service->uri, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strcmp(keyword, "service_domain"))
+ strlcpy(tptr, service->domain, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strcmp(keyword, "service_hostname"))
+ strlcpy(tptr, service->host, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strcmp(keyword, "service_name"))
+ strlcpy(tptr, service->name, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strcmp(keyword, "service_path"))
+ strlcpy(tptr, service->resource, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strcmp(keyword, "service_port"))
+ strlcpy(tptr, port + 21, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strcmp(keyword, "service_scheme"))
+ strlcpy(tptr, scheme + 22, sizeof(temp) - (size_t)(tptr - temp));
+ else if (!strncmp(keyword, "txt_", 4))
+ {
+ const char *val = cupsGetOption(keyword + 4, service->num_txt, service->txt);
+ if (val)
+ strlcpy(tptr, val, sizeof(temp) - (size_t)(tptr - temp));
+ else
+ *tptr = '\0';
+ }
+ else
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unknown variable \"{%s}\"."),
+ keyword);
+ exit(IPPFIND_EXIT_SYNTAX);
+ }
+
+ tptr += strlen(tptr);
+ }
+ else if (tptr < (temp + sizeof(temp) - 1))
+ *tptr++ = *ptr;
+ }
+
+ *tptr = '\0';
+ myargv[i] = strdup(temp);
+ }
+ else
+ myargv[i] = strdup(args[i]);
+ }
+
+#ifdef WIN32
+ if (getenv("IPPFIND_DEBUG"))
+ {
+ printf("\nProgram:\n %s\n", args[0]);
+ puts("\nArguments:");
+ for (i = 0; i < num_args; i ++)
+ printf(" %s\n", myargv[i]);
+ puts("\nEnvironment:");
+ for (i = 0; i < myenvc; i ++)
+ printf(" %s\n", myenvp[i]);
+ }
+
+ status = _spawnvpe(_P_WAIT, args[0], myargv, myenvp);
+
+#else
+ /*
+ * Execute the program...
+ */
+
+ if (strchr(args[0], '/') && !access(args[0], X_OK))
+ strlcpy(program, args[0], sizeof(program));
+ else if (!cupsFileFind(args[0], getenv("PATH"), 1, program, sizeof(program)))
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to execute \"%s\": %s"),
+ args[0], strerror(ENOENT));
+ exit(IPPFIND_EXIT_SYNTAX);
+ }
+
+ if (getenv("IPPFIND_DEBUG"))
+ {
+ printf("\nProgram:\n %s\n", program);
+ puts("\nArguments:");
+ for (i = 0; i < num_args; i ++)
+ printf(" %s\n", myargv[i]);
+ puts("\nEnvironment:");
+ for (i = 0; i < myenvc; i ++)
+ printf(" %s\n", myenvp[i]);
+ }
+
+ if ((pid = fork()) == 0)
+ {
+ /*
+ * Child comes here...
+ */
+
+ execve(program, myargv, myenvp);
+ exit(1);
+ }
+ else if (pid < 0)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to execute \"%s\": %s"),
+ args[0], strerror(errno));
+ exit(IPPFIND_EXIT_SYNTAX);
+ }
+ else
+ {
+ /*
+ * Wait for it to complete...
+ */
+
+ while (wait(&status) != pid)
+ ;
+ }
+#endif /* WIN32 */
+
+ /*
+ * Free memory...
+ */
+
+ for (i = 0; i < num_args; i ++)
+ free(myargv[i]);
+
+ free(myargv);
+ free(myenvp);
+
+ /*
+ * Return whether the program succeeded or crashed...
+ */
+
+ if (getenv("IPPFIND_DEBUG"))
+ {
+#ifdef WIN32
+ printf("Exit Status: %d\n", status);
+#else
+ if (WIFEXITED(status))
+ printf("Exit Status: %d\n", WEXITSTATUS(status));
+ else
+ printf("Terminating Signal: %d\n", WTERMSIG(status));
+#endif /* WIN32 */
+ }
+
+ return (status == 0);
+}
+
+
+/*
+ * 'get_service()' - Create or update a device.
+ */
+
+static ippfind_srv_t * /* O - Service */
+get_service(cups_array_t *services, /* I - Service array */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain) /* I - Service domain */
+{
+ ippfind_srv_t key, /* Search key */
+ *service; /* Service */
+ char fullName[kDNSServiceMaxDomainName];
+ /* Full name for query */
+
+
+ /*
+ * See if this is a new device...
+ */
+
+ key.name = (char *)serviceName;
+ key.regtype = (char *)regtype;
+
+ for (service = cupsArrayFind(services, &key);
+ service;
+ service = cupsArrayNext(services))
+ if (_cups_strcasecmp(service->name, key.name))
+ break;
+ else if (!strcmp(service->regtype, key.regtype))
+ return (service);
+
+ /*
+ * Yes, add the service...
+ */
+
+ service = calloc(sizeof(ippfind_srv_t), 1);
+ service->name = strdup(serviceName);
+ service->domain = strdup(replyDomain);
+ service->regtype = strdup(regtype);
+
+ cupsArrayAdd(services, service);
+
+ /*
+ * Set the "full name" of this service, which is used for queries and
+ * resolves...
+ */
+
+#ifdef HAVE_DNSSD
+ DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain);
+#else /* HAVE_AVAHI */
+ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName,
+ regtype, replyDomain);
+#endif /* HAVE_DNSSD */
+
+ service->fullName = strdup(fullName);
+
+ return (service);
+}
+
+
+/*
+ * 'get_time()' - Get the current time-of-day in seconds.
+ */
+
+static double
+get_time(void)
+{
+#ifdef WIN32
+ struct _timeb curtime; /* Current Windows time */
+
+ _ftime(&curtime);
+
+ return (curtime.time + 0.001 * curtime.millitm);
+
+#else
+ struct timeval curtime; /* Current UNIX time */
+
+ if (gettimeofday(&curtime, NULL))
+ return (0.0);
+ else
+ return (curtime.tv_sec + 0.000001 * curtime.tv_usec);
+#endif /* WIN32 */
+}
+
+
+/*
+ * 'list_service()' - List the contents of a service.
+ */
+
+static int /* O - 1 if successful, 0 otherwise */
+list_service(ippfind_srv_t *service) /* I - Service */
+{
+ http_addrlist_t *addrlist; /* Address(es) of service */
+ char port[10]; /* Port number of service */
+
+
+ snprintf(port, sizeof(port), "%d", service->port);
+
+ if ((addrlist = httpAddrGetList(service->host, address_family, port)) == NULL)
+ {
+ _cupsLangPrintf(stdout, "%s unreachable", service->uri);
+ return (0);
+ }
+
+ if (!strncmp(service->regtype, "_ipp._tcp", 9) ||
+ !strncmp(service->regtype, "_ipps._tcp", 10))
+ {
+ /*
+ * IPP/IPPS printer
+ */
+
+ http_t *http; /* HTTP connection */
+ ipp_t *request, /* IPP request */
+ *response; /* IPP response */
+ ipp_attribute_t *attr; /* IPP attribute */
+ int i, /* Looping var */
+ count, /* Number of values */
+ version, /* IPP version */
+ paccepting; /* printer-is-accepting-jobs value */
+ ipp_pstate_t pstate; /* printer-state value */
+ char preasons[1024], /* Comma-delimited printer-state-reasons */
+ *ptr, /* Pointer into reasons */
+ *end; /* End of reasons buffer */
+ static const char * const rattrs[] =/* Requested attributes */
+ {
+ "printer-is-accepting-jobs",
+ "printer-state",
+ "printer-state-reasons"
+ };
+
+ /*
+ * Connect to the printer...
+ */
+
+ http = httpConnect2(service->host, service->port, addrlist, address_family,
+ !strncmp(service->regtype, "_ipps._tcp", 10) ?
+ HTTP_ENCRYPTION_ALWAYS :
+ HTTP_ENCRYPTION_IF_REQUESTED,
+ 1, 30000, NULL);
+
+ httpAddrFreeList(addrlist);
+
+ if (!http)
+ {
+ _cupsLangPrintf(stdout, "%s unavailable", service->uri);
+ return (0);
+ }
+
+ /*
+ * Get the current printer state...
+ */
+
+ response = NULL;
+ version = ipp_version;
+
+ do
+ {
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippSetVersion(request, version / 10, version % 10);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+ service->uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+ "requesting-user-name", NULL, cupsUser());
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+ "requested-attributes",
+ (int)(sizeof(rattrs) / sizeof(rattrs[0])), NULL, rattrs);
+
+ response = cupsDoRequest(http, request, service->resource);
+
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST && version > 11)
+ version = 11;
+ }
+ while (cupsLastError() > IPP_STATUS_OK_EVENTS_COMPLETE && version > 11);
+
+ /*
+ * Show results...
+ */
+
+ if (cupsLastError() > IPP_STATUS_OK_EVENTS_COMPLETE)
+ {
+ _cupsLangPrintf(stdout, "%s: unavailable", service->uri);
+ return (0);
+ }
+
+ if ((attr = ippFindAttribute(response, "printer-state",
+ IPP_TAG_ENUM)) != NULL)
+ pstate = (ipp_pstate_t)ippGetInteger(attr, 0);
+ else
+ pstate = IPP_PSTATE_STOPPED;
+
+ if ((attr = ippFindAttribute(response, "printer-is-accepting-jobs",
+ IPP_TAG_BOOLEAN)) != NULL)
+ paccepting = ippGetBoolean(attr, 0);
+ else
+ paccepting = 0;
+
+ if ((attr = ippFindAttribute(response, "printer-state-reasons",
+ IPP_TAG_KEYWORD)) != NULL)
+ {
+ strlcpy(preasons, ippGetString(attr, 0, NULL), sizeof(preasons));
+
+ for (i = 1, count = ippGetCount(attr), ptr = preasons + strlen(preasons),
+ end = preasons + sizeof(preasons) - 1;
+ i < count && ptr < end;
+ i ++, ptr += strlen(ptr))
+ {
+ *ptr++ = ',';
+ strlcpy(ptr, ippGetString(attr, i, NULL), (size_t)(end - ptr + 1));
+ }
+ }
+ else
+ strlcpy(preasons, "none", sizeof(preasons));
+
+ ippDelete(response);
+ httpClose(http);
+
+ _cupsLangPrintf(stdout, "%s %s %s %s", service->uri,
+ ippEnumString("printer-state", pstate),
+ paccepting ? "accepting-jobs" : "not-accepting-jobs",
+ preasons);
+ }
+ else if (!strncmp(service->regtype, "_http._tcp", 10) ||
+ !strncmp(service->regtype, "_https._tcp", 11))
+ {
+ /*
+ * HTTP/HTTPS web page
+ */
+
+ http_t *http; /* HTTP connection */
+ http_status_t status; /* HEAD status */
+
+
+ /*
+ * Connect to the web server...
+ */
+
+ http = httpConnect2(service->host, service->port, addrlist, address_family,
+ !strncmp(service->regtype, "_ipps._tcp", 10) ?
+ HTTP_ENCRYPTION_ALWAYS :
+ HTTP_ENCRYPTION_IF_REQUESTED,
+ 1, 30000, NULL);
+
+ httpAddrFreeList(addrlist);
+
+ if (!http)
+ {
+ _cupsLangPrintf(stdout, "%s unavailable", service->uri);
+ return (0);
+ }
+
+ if (httpGet(http, service->resource))
+ {
+ _cupsLangPrintf(stdout, "%s unavailable", service->uri);
+ return (0);
+ }
+
+ do
+ {
+ status = httpUpdate(http);
+ }
+ while (status == HTTP_STATUS_CONTINUE);
+
+ httpFlush(http);
+ httpClose(http);
+
+ if (status >= HTTP_STATUS_BAD_REQUEST)
+ {
+ _cupsLangPrintf(stdout, "%s unavailable", service->uri);
+ return (0);
+ }
+
+ _cupsLangPrintf(stdout, "%s available", service->uri);
+ }
+ else if (!strncmp(service->regtype, "_printer._tcp", 13))
+ {
+ /*
+ * LPD printer
+ */
+
+ int sock; /* Socket */
+
+
+ if (!httpAddrConnect(addrlist, &sock))
+ {
+ _cupsLangPrintf(stdout, "%s unavailable", service->uri);
+ httpAddrFreeList(addrlist);
+ return (0);
+ }
+
+ _cupsLangPrintf(stdout, "%s available", service->uri);
+ httpAddrFreeList(addrlist);
+
+ httpAddrClose(NULL, sock);
+ }
+ else
+ {
+ _cupsLangPrintf(stdout, "%s unsupported", service->uri);
+ httpAddrFreeList(addrlist);
+ return (0);
+ }
+
+ return (1);
+}
+
+
+/*
+ * 'new_expr()' - Create a new expression.
+ */
+
+static ippfind_expr_t * /* O - New expression */
+new_expr(ippfind_op_t op, /* I - Operation */
+ int invert, /* I - Invert result? */
+ const char *value, /* I - TXT key or port range */
+ const char *regex, /* I - Regular expression */
+ char **args) /* I - Pointer to argument strings */
+{
+ ippfind_expr_t *temp; /* New expression */
+
+
+ if ((temp = calloc(1, sizeof(ippfind_expr_t))) == NULL)
+ return (NULL);
+
+ temp->op = op;
+ temp->invert = invert;
+
+ if (op == IPPFIND_OP_TXT_EXISTS || op == IPPFIND_OP_TXT_REGEX)
+ temp->key = (char *)value;
+ else if (op == IPPFIND_OP_PORT_RANGE)
+ {
+ /*
+ * Pull port number range of the form "number", "-number" (0-number),
+ * "number-" (number-65535), and "number-number".
+ */
+
+ if (*value == '-')
+ {
+ temp->range[1] = atoi(value + 1);
+ }
+ else if (strchr(value, '-'))
+ {
+ if (sscanf(value, "%d-%d", temp->range, temp->range + 1) == 1)
+ temp->range[1] = 65535;
+ }
+ else
+ {
+ temp->range[0] = temp->range[1] = atoi(value);
+ }
+ }
+
+ if (regex)
+ {
+ int err = regcomp(&(temp->re), regex, REG_NOSUB | REG_ICASE | REG_EXTENDED);
+
+ if (err)
+ {
+ char message[256]; /* Error message */
+
+ regerror(err, &(temp->re), message, sizeof(message));
+ _cupsLangPrintf(stderr, _("ippfind: Bad regular expression: %s"),
+ message);
+ exit(IPPFIND_EXIT_SYNTAX);
+ }
+ }
+
+ if (args)
+ {
+ int num_args; /* Number of arguments */
+
+ for (num_args = 1; args[num_args]; num_args ++)
+ if (!strcmp(args[num_args], ";"))
+ break;
+
+ temp->num_args = num_args;
+ temp->args = malloc((size_t)num_args * sizeof(char *));
+ memcpy(temp->args, args, (size_t)num_args * sizeof(char *));
+ }
+
+ return (temp);
+}
+
+
+#ifdef HAVE_AVAHI
+/*
+ * 'poll_callback()' - Wait for input on the specified file descriptors.
+ *
+ * Note: This function is needed because avahi_simple_poll_iterate is broken
+ * and always uses a timeout of 0 (!) milliseconds.
+ * (Avahi Ticket #364)
+ */
+
+static int /* O - Number of file descriptors matching */
+poll_callback(
+ struct pollfd *pollfds, /* I - File descriptors */
+ unsigned int num_pollfds, /* I - Number of file descriptors */
+ int timeout, /* I - Timeout in milliseconds (unused) */
+ void *context) /* I - User data (unused) */
+{
+ int val; /* Return value */
+
+
+ (void)timeout;
+ (void)context;
+
+ val = poll(pollfds, num_pollfds, 500);
+
+ if (val > 0)
+ avahi_got_data = 1;
+
+ return (val);
+}
+#endif /* HAVE_AVAHI */
+
+
+/*
+ * 'resolve_callback()' - Process resolve data.
+ */
+
+#ifdef HAVE_DNSSD
+static void DNSSD_API
+resolve_callback(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Data flags */
+ uint32_t interfaceIndex, /* I - Interface */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *fullName, /* I - Full service name */
+ const char *hostTarget, /* I - Hostname */
+ uint16_t port, /* I - Port number (network byte order) */
+ uint16_t txtLen, /* I - Length of TXT record data */
+ const unsigned char *txtRecord, /* I - TXT record data */
+ void *context) /* I - Service */
+{
+ char key[256], /* TXT key value */
+ *value; /* Value from TXT record */
+ const unsigned char *txtEnd; /* End of TXT record */
+ uint8_t valueLen; /* Length of value */
+ ippfind_srv_t *service = (ippfind_srv_t *)context;
+ /* Service */
+
+
+ /*
+ * Only process "add" data...
+ */
+
+ (void)sdRef;
+ (void)flags;
+ (void)interfaceIndex;
+ (void)fullName;
+
+ if (errorCode != kDNSServiceErr_NoError)
+ {
+ _cupsLangPrintf(stderr, _("ippfind: Unable to browse or resolve: %s"),
+ dnssd_error_string(errorCode));
+ bonjour_error = 1;
+ return;
+ }
+
+ service->is_resolved = 1;
+ service->host = strdup(hostTarget);
+ service->port = ntohs(port);
+
+ value = service->host + strlen(service->host) - 1;
+ if (value >= service->host && *value == '.')
+ *value = '\0';
+
+ /*
+ * Loop through the TXT key/value pairs and add them to an array...
+ */
+
+ for (txtEnd = txtRecord + txtLen; txtRecord < txtEnd; txtRecord += valueLen)
+ {
+ /*
+ * Ignore bogus strings...
+ */
+
+ valueLen = *txtRecord++;
+
+ memcpy(key, txtRecord, valueLen);
+ key[valueLen] = '\0';
+
+ if ((value = strchr(key, '=')) == NULL)
+ continue;
+
+ *value++ = '\0';
+
+ /*
+ * Add to array of TXT values...
+ */
+
+ service->num_txt = cupsAddOption(key, value, service->num_txt,
+ &(service->txt));
+ }
+
+ set_service_uri(service);
+}
+
+
+#elif defined(HAVE_AVAHI)
+static void
+resolve_callback(
+ AvahiServiceResolver *resolver, /* I - Resolver */
+ AvahiIfIndex interface, /* I - Interface */
+ AvahiProtocol protocol, /* I - Address protocol */
+ AvahiResolverEvent event, /* I - Event */
+ const char *serviceName,/* I - Service name */
+ const char *regtype, /* I - Registration type */
+ const char *replyDomain,/* I - Domain name */
+ const char *hostTarget, /* I - FQDN */
+ const AvahiAddress *address, /* I - Address */
+ uint16_t port, /* I - Port number */
+ AvahiStringList *txt, /* I - TXT records */
+ AvahiLookupResultFlags flags, /* I - Lookup flags */
+ void *context) /* I - Service */
+{
+ char key[256], /* TXT key */
+ *value; /* TXT value */
+ ippfind_srv_t *service = (ippfind_srv_t *)context;
+ /* Service */
+ AvahiStringList *current; /* Current TXT key/value pair */
+
+
+ (void)address;
+
+ if (event != AVAHI_RESOLVER_FOUND)
+ {
+ bonjour_error = 1;
+
+ avahi_service_resolver_free(resolver);
+ avahi_simple_poll_quit(avahi_poll);
+ return;
+ }
+
+ service->is_resolved = 1;
+ service->host = strdup(hostTarget);
+ service->port = port;
+
+ value = service->host + strlen(service->host) - 1;
+ if (value >= service->host && *value == '.')
+ *value = '\0';
+
+ /*
+ * Loop through the TXT key/value pairs and add them to an array...
+ */
+
+ for (current = txt; current; current = current->next)
+ {
+ /*
+ * Ignore bogus strings...
+ */
+
+ if (current->size > (sizeof(key) - 1))
+ continue;
+
+ memcpy(key, current->text, current->size);
+ key[current->size] = '\0';
+
+ if ((value = strchr(key, '=')) == NULL)
+ continue;
+
+ *value++ = '\0';
+
+ /*
+ * Add to array of TXT values...
+ */
+
+ service->num_txt = cupsAddOption(key, value, service->num_txt,
+ &(service->txt));
+ }
+
+ set_service_uri(service);
+}
+#endif /* HAVE_DNSSD */
+
+
+/*
+ * 'set_service_uri()' - Set the URI of the service.
+ */
+
+static void
+set_service_uri(ippfind_srv_t *service) /* I - Service */
+{
+ char uri[1024]; /* URI */
+ const char *path, /* Resource path */
+ *scheme; /* URI scheme */
+
+
+ if (!strncmp(service->regtype, "_http.", 6))
+ {
+ scheme = "http";
+ path = cupsGetOption("path", service->num_txt, service->txt);
+ }
+ else if (!strncmp(service->regtype, "_https.", 7))
+ {
+ scheme = "https";
+ path = cupsGetOption("path", service->num_txt, service->txt);
+ }
+ else if (!strncmp(service->regtype, "_ipp.", 5))
+ {
+ scheme = "ipp";
+ path = cupsGetOption("rp", service->num_txt, service->txt);
+ }
+ else if (!strncmp(service->regtype, "_ipps.", 6))
+ {
+ scheme = "ipps";
+ path = cupsGetOption("rp", service->num_txt, service->txt);
+ }
+ else if (!strncmp(service->regtype, "_printer.", 9))
+ {
+ scheme = "lpd";
+ path = cupsGetOption("rp", service->num_txt, service->txt);
+ }
+ else
+ return;
+
+ if (!path || !*path)
+ path = "/";
+
+ if (*path == '/')
+ {
+ service->resource = strdup(path);
+ }
+ else
+ {
+ snprintf(uri, sizeof(uri), "/%s", path);
+ service->resource = strdup(uri);
+ }
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL,
+ service->host, service->port, service->resource);
+ service->uri = strdup(uri);
+}
+
+
+/*
+ * 'show_usage()' - Show program usage.
+ */
+
+static void
+show_usage(void)
+{
+ _cupsLangPuts(stderr, _("Usage: ippfind [options] regtype[,subtype]"
+ "[.domain.] ... [expression]\n"
+ " ippfind [options] name[.regtype[.domain.]] "
+ "... [expression]\n"
+ " ippfind --help\n"
+ " ippfind --version"));
+ _cupsLangPuts(stderr, "");
+ _cupsLangPuts(stderr, _("Options:"));
+ _cupsLangPuts(stderr, _(" -4 Connect using IPv4."));
+ _cupsLangPuts(stderr, _(" -6 Connect using IPv6."));
+ _cupsLangPuts(stderr, _(" -T seconds Set the browse timeout in "
+ "seconds."));
+ _cupsLangPuts(stderr, _(" -V version Set default IPP "
+ "version."));
+ _cupsLangPuts(stderr, _(" --help Show this help."));
+ _cupsLangPuts(stderr, _(" --version Show program version."));
+ _cupsLangPuts(stderr, "");
+ _cupsLangPuts(stderr, _("Expressions:"));
+ _cupsLangPuts(stderr, _(" -P number[-number] Match port to number or range."));
+ _cupsLangPuts(stderr, _(" -d regex Match domain to regular expression."));
+ _cupsLangPuts(stderr, _(" -h regex Match hostname to regular expression."));
+ _cupsLangPuts(stderr, _(" -l List attributes."));
+ _cupsLangPuts(stderr, _(" -n regex Match service name to regular expression."));
+ _cupsLangPuts(stderr, _(" -p Print URI if true."));
+ _cupsLangPuts(stderr, _(" -q Quietly report match via exit code."));
+ _cupsLangPuts(stderr, _(" -r True if service is remote."));
+ _cupsLangPuts(stderr, _(" -s Print service name if true."));
+ _cupsLangPuts(stderr, _(" -t key True if the TXT record contains the key."));
+ _cupsLangPuts(stderr, _(" -u regex Match URI to regular expression."));
+ _cupsLangPuts(stderr, _(" -x utility [argument ...] ;\n"
+ " Execute program if true."));
+ _cupsLangPuts(stderr, _(" --domain regex Match domain to regular expression."));
+ _cupsLangPuts(stderr, _(" --exec utility [argument ...] ;\n"
+ " Execute program if true."));
+ _cupsLangPuts(stderr, _(" --host regex Match hostname to regular expression."));
+ _cupsLangPuts(stderr, _(" --ls List attributes."));
+ _cupsLangPuts(stderr, _(" --local True if service is local."));
+ _cupsLangPuts(stderr, _(" --name regex Match service name to regular expression."));
+ _cupsLangPuts(stderr, _(" --path regex Match resource path to regular expression."));
+ _cupsLangPuts(stderr, _(" --port number[-number] Match port to number or range."));
+ _cupsLangPuts(stderr, _(" --print Print URI if true."));
+ _cupsLangPuts(stderr, _(" --print-name Print service name if true."));
+ _cupsLangPuts(stderr, _(" --quiet Quietly report match via exit code."));
+ _cupsLangPuts(stderr, _(" --remote True if service is remote."));
+ _cupsLangPuts(stderr, _(" --txt key True if the TXT record contains the key."));
+ _cupsLangPuts(stderr, _(" --txt-* regex Match TXT record key to regular expression."));
+ _cupsLangPuts(stderr, _(" --uri regex Match URI to regular expression."));
+ _cupsLangPuts(stderr, "");
+ _cupsLangPuts(stderr, _("Modifiers:"));
+ _cupsLangPuts(stderr, _(" ( expressions ) Group expressions."));
+ _cupsLangPuts(stderr, _(" ! expression Unary NOT of expression."));
+ _cupsLangPuts(stderr, _(" --not expression Unary NOT of expression."));
+ _cupsLangPuts(stderr, _(" --false Always false."));
+ _cupsLangPuts(stderr, _(" --true Always true."));
+ _cupsLangPuts(stderr, _(" expression expression Logical AND."));
+ _cupsLangPuts(stderr, _(" expression --and expression\n"
+ " Logical AND."));
+ _cupsLangPuts(stderr, _(" expression --or expression\n"
+ " Logical OR."));
+ _cupsLangPuts(stderr, "");
+ _cupsLangPuts(stderr, _("Substitutions:"));
+ _cupsLangPuts(stderr, _(" {} URI"));
+ _cupsLangPuts(stderr, _(" {service_domain} Domain name"));
+ _cupsLangPuts(stderr, _(" {service_hostname} Fully-qualified domain name"));
+ _cupsLangPuts(stderr, _(" {service_name} Service instance name"));
+ _cupsLangPuts(stderr, _(" {service_port} Port number"));
+ _cupsLangPuts(stderr, _(" {service_regtype} DNS-SD registration type"));
+ _cupsLangPuts(stderr, _(" {service_scheme} URI scheme"));
+ _cupsLangPuts(stderr, _(" {service_uri} URI"));
+ _cupsLangPuts(stderr, _(" {txt_*} Value of TXT record key"));
+ _cupsLangPuts(stderr, "");
+ _cupsLangPuts(stderr, _("Environment Variables:"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_DOMAIN Domain name"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_HOSTNAME\n"
+ " Fully-qualified domain name"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_NAME Service instance name"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_PORT Port number"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_REGTYPE DNS-SD registration type"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_SCHEME URI scheme"));
+ _cupsLangPuts(stderr, _(" IPPFIND_SERVICE_URI URI"));
+ _cupsLangPuts(stderr, _(" IPPFIND_TXT_* Value of TXT record key"));
+
+ exit(IPPFIND_EXIT_TRUE);
+}
+
+
+/*
+ * 'show_version()' - Show program version.
+ */
+
+static void
+show_version(void)
+{
+ _cupsLangPuts(stderr, CUPS_SVERSION);
+
+ exit(IPPFIND_EXIT_TRUE);
+}
+
+
+/*
+ * End of "$Id: ippfind.c 12638 2015-05-19 02:36:15Z msweet $".
+ */
diff --git a/test/ippinfra.c b/test/ippinfra.c
new file mode 100644
index 0000000..0a4a367
--- /dev/null
+++ b/test/ippinfra.c
@@ -0,0 +1,7125 @@
+/*
+ * "$Id: ippinfra.c 12237 2014-11-03 13:07:32Z msweet $"
+ *
+ * Sample IPP INFRA server for CUPS.
+ *
+ * Copyright 2010-2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Disable private and deprecated stuff so we can verify that the public API
+ * is sufficient to implement a server.
+ */
+
+#define _IPP_PRIVATE_STRUCTURES 0 /* Disable private IPP stuff */
+#define _CUPS_NO_DEPRECATED 1 /* Disable deprecated stuff */
+
+
+/*
+ * Include necessary headers...
+ */
+
+#include <config.h> /* CUPS configuration header */
+#include <cups/cups.h> /* Public API */
+#include <cups/string-private.h> /* CUPS string functions */
+#include <cups/thread-private.h> /* For multithreading functions */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+# include <fcntl.h>
+# include <io.h>
+# include <process.h>
+# define WEXITSTATUS(s) (s)
+# include <winsock2.h>
+typedef ULONG nfds_t;
+# define poll WSAPoll
+#else
+extern char **environ;
+
+# include <sys/fcntl.h>
+# include <sys/wait.h>
+# include <poll.h>
+#endif /* WIN32 */
+
+#ifdef HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+#endif /* HAVE_SYS_MOUNT_H */
+#ifdef HAVE_SYS_STATFS_H
+# include <sys/statfs.h>
+#endif /* HAVE_SYS_STATFS_H */
+#ifdef HAVE_SYS_STATVFS_H
+# include <sys/statvfs.h>
+#endif /* HAVE_SYS_STATVFS_H */
+#ifdef HAVE_SYS_VFS_H
+# include <sys/vfs.h>
+#endif /* HAVE_SYS_VFS_H */
+
+#ifdef HAVE_PTHREAD_H
+typedef pthread_cond_t _cups_cond_t;
+# define _CUPS_COND_INITIALIZER PTHREAD_COND_INITIALIZER
+# define _cupsCondBroadcast(c) pthread_cond_broadcast(c)
+# define _cupsCondDeinit(c) pthread_cond_destroy(c)
+# define _cupsCondInit(c) pthread_cond_init((c), NULL)
+# define _cupsCondWait(c,m) pthread_cond_wait((c),(m))
+# define _cupsMutexDeinit(m) pthread_mutex_destroy(m)
+# define _cupsRWDeinit(rw) pthread_rwlock_destroy(rw)
+#else
+typedef char _cups_cond_t;
+# define _CUPS_COND_INITIALIZER 0
+# define _cupsCondBroadcast(c)
+# define _cupsCondDeinit(c)
+# define _cupsCondInit(c) *(c)=0
+# define _cupsCondWait(c,m) 0
+# define _cupsMutexDeinit(m)
+# define _cupsRWDeinit(rw)
+#endif /* HAVE_PTHREAD_H */
+
+
+/*
+ * Constants...
+ */
+
+/* New IPP operation codes from IPP INFRA */
+# define _IPP_OP_ACKNOWLEDGE_DOCUMENT (ipp_op_t)0x003f
+# define _IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER (ipp_op_t)0x0040
+# define _IPP_OP_ACKNOWLEDGE_JOB (ipp_op_t)0x0041
+# define _IPP_OP_FETCH_DOCUMENT (ipp_op_t)0x0042
+# define _IPP_OP_FETCH_JOB (ipp_op_t)0x0043
+# define _IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES (ipp_op_t)0x0044
+# define _IPP_OP_UPDATE_ACTIVE_JOBS (ipp_op_t)0x0045
+# define _IPP_OP_UPDATE_DOCUMENT_STATUS (ipp_op_t)0x0047
+# define _IPP_OP_UPDATE_JOB_STATUS (ipp_op_t)0x0048
+# define _IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES (ipp_op_t)0x0049
+# define _IPP_OP_DEREGISTER_OUTPUT_DEVICE (ipp_op_t)0x204b
+
+/* New IPP status code from IPP INFRA */
+# define _IPP_STATUS_ERROR_NOT_FETCHABLE (ipp_status_t)0x0420
+
+/* Maximum lease duration value from RFC 3995 - 2^26-1 or ~2 years */
+# define _IPP_NOTIFY_LEASE_DURATION_MAX 67108863
+/* But a value of 0 means "never expires"... */
+# define _IPP_NOTIFY_LEASE_DURATION_FOREVER 0
+/* Default duration is 1 day */
+# define _IPP_NOTIFY_LEASE_DURATION_DEFAULT 86400
+
+
+/*
+ * Event mask enumeration...
+ */
+
+enum _ipp_event_e /* notify-events bit values */
+{
+ _IPP_EVENT_DOCUMENT_COMPLETED = 0x00000001,
+ _IPP_EVENT_DOCUMENT_CONFIG_CHANGED = 0x00000002,
+ _IPP_EVENT_DOCUMENT_CREATED = 0x00000004,
+ _IPP_EVENT_DOCUMENT_FETCHABLE = 0x00000008,
+ _IPP_EVENT_DOCUMENT_STATE_CHANGED = 0x00000010,
+ _IPP_EVENT_DOCUMENT_STOPPED = 0x00000020,
+ _IPP_EVENT_JOB_COMPLETED = 0x00000040,
+ _IPP_EVENT_JOB_CONFIG_CHANGED = 0x00000080,
+ _IPP_EVENT_JOB_CREATED = 0x00000100,
+ _IPP_EVENT_JOB_FETCHABLE = 0x00000200,
+ _IPP_EVENT_JOB_PROGRESS = 0x00000400,
+ _IPP_EVENT_JOB_STATE_CHANGED = 0x00000800,
+ _IPP_EVENT_JOB_STOPPED = 0x00001000,
+ _IPP_EVENT_PRINTER_CONFIG_CHANGED = 0x00002000,
+ _IPP_EVENT_PRINTER_FINISHINGS_CHANGED = 0x00004000,
+ _IPP_EVENT_PRINTER_MEDIA_CHANGED = 0x00008000,
+ _IPP_EVENT_PRINTER_QUEUE_ORDER_CHANGED = 0x00010000,
+ _IPP_EVENT_PRINTER_RESTARTED = 0x00020000,
+ _IPP_EVENT_PRINTER_SHUTDOWN = 0x00040000,
+ _IPP_EVENT_PRINTER_STATE_CHANGED = 0x00080000,
+ _IPP_EVENT_PRINTER_STOPPED = 0x00100000,
+
+ /* "Wildcard" values... */
+ _IPP_EVENT_NONE = 0x00000000, /* Nothing */
+ _IPP_EVENT_DOCUMENT_ALL = 0x0000003f,
+ _IPP_EVENT_DOCUMENT_STATE_ALL = 0x00000037,
+ _IPP_EVENT_JOB_ALL = 0x00001fc0,
+ _IPP_EVENT_JOB_STATE_ALL = 0x00001940,
+ _IPP_EVENT_PRINTER_ALL = 0x001fe000,
+ _IPP_EVENT_PRINTER_CONFIG_ALL = 0x0000e000,
+ _IPP_EVENT_PRINTER_STATE_ALL = 0x001e0000,
+ _IPP_EVENT_ALL = 0x001fffff /* Everything */
+};
+typedef unsigned int _ipp_event_t; /* Bitfield for notify-events */
+#define _IPP_EVENT_DEFAULT _IPP_EVENT_JOB_COMPLETED
+#define _IPP_EVENT_DEFAULT_STRING "job-completed"
+static const char * const _ipp_events[] =
+{ /* Strings for bits */
+ "document-completed",
+ "document-config-changed",
+ "document-created",
+ "document-fetchable",
+ "document-state-changed",
+ "document-stopped",
+ "job-completed",
+ "job-config-changed",
+ "job-created",
+ "job-fetchable",
+ "job-progress",
+ "job-state-changed",
+ "job-stopped",
+ "printer-config-changed",
+ "printer-finishings-changed",
+ "printer-media-changed",
+ "printer-queue-order-changed",
+ "printer-restarted",
+ "printer-shutdown",
+ "printer-state-changed",
+ "printer-stopped"
+};
+
+enum _ipp_jreason_e /* job-state-reasons bit values */
+{
+ _IPP_JREASON_NONE = 0x00000000, /* none */
+ _IPP_JREASON_ABORTED_BY_SYSTEM = 0x00000001,
+ _IPP_JREASON_COMPRESSION_ERROR = 0x00000002,
+ _IPP_JREASON_DOCUMENT_ACCESS_ERROR = 0x00000004,
+ _IPP_JREASON_DOCUMENT_FORMAT_ERROR = 0x00000008,
+ _IPP_JREASON_DOCUMENT_PASSWORD_ERROR = 0x00000010,
+ _IPP_JREASON_DOCUMENT_PERMISSION_ERROR = 0x00000020,
+ _IPP_JREASON_DOCUMENT_SECURITY_ERROR = 0x00000040,
+ _IPP_JREASON_DOCUMENT_UNPRINTABLE_ERROR = 0x00000080,
+ _IPP_JREASON_ERRORS_DETECTED = 0x00000100,
+ _IPP_JREASON_JOB_CANCELED_AT_DEVICE = 0x00000200,
+ _IPP_JREASON_JOB_CANCELED_BY_USER = 0x00000400,
+ _IPP_JREASON_JOB_COMPLETED_SUCCESSFULLY = 0x00000800,
+ _IPP_JREASON_JOB_COMPLETED_WITH_ERRORS = 0x00001000,
+ _IPP_JREASON_JOB_COMPLETED_WITH_WARNINGS = 0x00002000,
+ _IPP_JREASON_JOB_DATA_INSUFFICIENT = 0x00004000,
+ _IPP_JREASON_JOB_FETCHABLE = 0x00008000,
+ _IPP_JREASON_JOB_INCOMING = 0x00010000,
+ _IPP_JREASON_JOB_PASSWORD_WAIT = 0x00020000,
+ _IPP_JREASON_JOB_PRINTING = 0x00040000,
+ _IPP_JREASON_JOB_QUEUED = 0x00080000,
+ _IPP_JREASON_JOB_SPOOLING = 0x00100000,
+ _IPP_JREASON_JOB_STOPPED = 0x00200000,
+ _IPP_JREASON_JOB_TRANSFORMING = 0x00400000,
+ _IPP_JREASON_PRINTER_STOPPED = 0x00800000,
+ _IPP_JREASON_PRINTER_STOPPED_PARTLY = 0x01000000,
+ _IPP_JREASON_PROCESSING_TO_STOP_POINT = 0x02000000,
+ _IPP_JREASON_QUEUED_IN_DEVICE = 0x04000000,
+ _IPP_JREASON_WARNINGS_DETECTED = 0x08000000
+};
+typedef unsigned int _ipp_jreason_t; /* Bitfield for job-state-reasons */
+static const char * const _ipp_jreasons[] =
+{ /* Strings for bits */
+ "aborted-by-system",
+ "compression-error",
+ "document-access-error",
+ "document-format-error",
+ "document-password-error",
+ "document-permission-error",
+ "document-security-error",
+ "document-unprintable-error",
+ "errors-detected",
+ "job-canceled-at-device",
+ "job-canceled-by-user",
+ "job-completed-successfully",
+ "job-completed-with-errors",
+ "job-completed-with-warnings",
+ "job-data-insufficient",
+ "job-fetchable",
+ "job-incoming",
+ "job-password-wait",
+ "job-printing",
+ "job-queued",
+ "job-spooling",
+ "job-stopped",
+ "job-transforming",
+ "printer-stopped",
+ "printer-stopped-partly",
+ "processing-to-stop-point",
+ "queued-in-device",
+ "warnings-detected"
+};
+
+enum _ipp_preason_e /* printer-state-reasons bit values */
+{
+ _IPP_PREASON_NONE = 0x0000, /* none */
+ _IPP_PREASON_OTHER = 0x0001, /* other */
+ _IPP_PREASON_COVER_OPEN = 0x0002, /* cover-open */
+ _IPP_PREASON_INPUT_TRAY_MISSING = 0x0004,
+ /* input-tray-missing */
+ _IPP_PREASON_MARKER_SUPPLY_EMPTY = 0x0008,
+ /* marker-supply-empty */
+ _IPP_PREASON_MARKER_SUPPLY_LOW = 0x0010,
+ /* marker-supply-low */
+ _IPP_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020,
+ /* marker-waste-almost-full */
+ _IPP_PREASON_MARKER_WASTE_FULL = 0x0040,
+ /* marker-waste-full */
+ _IPP_PREASON_MEDIA_EMPTY = 0x0080, /* media-empty */
+ _IPP_PREASON_MEDIA_JAM = 0x0100, /* media-jam */
+ _IPP_PREASON_MEDIA_LOW = 0x0200, /* media-low */
+ _IPP_PREASON_MEDIA_NEEDED = 0x0400, /* media-needed */
+ _IPP_PREASON_MOVING_TO_PAUSED = 0x0800,
+ /* moving-to-paused */
+ _IPP_PREASON_PAUSED = 0x1000, /* paused */
+ _IPP_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */
+ _IPP_PREASON_TONER_EMPTY = 0x4000, /* toner-empty */
+ _IPP_PREASON_TONER_LOW = 0x8000 /* toner-low */
+};
+typedef unsigned int _ipp_preason_t; /* Bitfield for printer-state-reasons */
+static const char * const _ipp_preasons[] =
+{ /* Strings for bits */
+ "other",
+ "cover-open",
+ "input-tray-missing",
+ "marker-supply-empty",
+ "marker-supply-low",
+ "marker-waste-almost-full",
+ "marker-waste-full",
+ "media-empty",
+ "media-jam",
+ "media-low",
+ "media-needed",
+ "moving-to-paused",
+ "paused",
+ "spool-area-full",
+ "toner-empty",
+ "toner-low"
+};
+
+
+/*
+ * Structures...
+ */
+
+typedef struct _ipp_filter_s /**** Attribute filter ****/
+{
+ cups_array_t *ra; /* Requested attributes */
+ ipp_tag_t group_tag; /* Group to copy */
+} _ipp_filter_t;
+
+typedef struct _ipp_job_s _ipp_job_t;
+
+typedef struct _ipp_device_s /**** Output Device data ****/
+{
+ _cups_rwlock_t rwlock; /* Printer lock */
+ char *name, /* printer-name (mapped to output-device) */
+ *uuid; /* output-device-uuid */
+ ipp_t *attrs; /* All printer attributes */
+ ipp_pstate_t state; /* printer-state value */
+ _ipp_preason_t reasons; /* printer-state-reasons values */
+} _ipp_device_t;
+
+typedef struct _ipp_printer_s /**** Printer data ****/
+{
+ _cups_rwlock_t rwlock; /* Printer lock */
+ int ipv4, /* IPv4 listener */
+ ipv6; /* IPv6 listener */
+ char *name, /* printer-name */
+ *directory, /* Spool directory */
+ *hostname, /* Hostname */
+ *uri, /* printer-uri-supported */
+ *proxy_user, /* Proxy username */
+ *proxy_pass; /* Proxy password */
+ int port; /* Port */
+ size_t urilen; /* Length of printer URI */
+ cups_array_t *devices; /* Associated devices */
+ ipp_t *attrs; /* Static attributes */
+ ipp_t *dev_attrs; /* Current device attributes */
+ time_t start_time; /* Startup time */
+ time_t config_time; /* printer-config-change-time */
+ ipp_pstate_t state, /* printer-state value */
+ dev_state; /* Current device printer-state value */
+ _ipp_preason_t state_reasons, /* printer-state-reasons values */
+ dev_reasons; /* Current device printer-state-reasons values */
+ time_t state_time; /* printer-state-change-time */
+ cups_array_t *jobs, /* Jobs */
+ *active_jobs, /* Active jobs */
+ *completed_jobs;/* Completed jobs */
+ _ipp_job_t *processing_job;/* Current processing job */
+ int next_job_id; /* Next job-id value */
+ cups_array_t *subscriptions; /* Subscriptions */
+ int next_sub_id; /* Next notify-subscription-id value */
+} _ipp_printer_t;
+
+struct _ipp_job_s /**** Job data ****/
+{
+ int id; /* job-id */
+ _cups_rwlock_t rwlock; /* Job lock */
+ const char *name, /* job-name */
+ *username, /* job-originating-user-name */
+ *format; /* document-format */
+ int priority; /* job-priority */
+ char *dev_uuid; /* output-device-uuid-assigned */
+ ipp_jstate_t state, /* job-state value */
+ dev_state; /* output-device-job-state value */
+ _ipp_jreason_t state_reasons, /* job-state-reasons values */
+ dev_state_reasons;
+ /* output-device-job-state-reasons values */
+ char *dev_state_message;
+ /* output-device-job-state-message value */
+ time_t created, /* time-at-creation value */
+ processing, /* time-at-processing value */
+ completed; /* time-at-completed value */
+ int impressions, /* job-impressions value */
+ impcompleted; /* job-impressions-completed value */
+ ipp_t *attrs; /* Attributes */
+ int cancel; /* Non-zero when job canceled */
+ char *filename; /* Print file name */
+ int fd; /* Print file descriptor */
+ _ipp_printer_t *printer; /* Printer */
+};
+
+typedef struct _ipp_subscription_s /**** Subscription data ****/
+{
+ int id; /* notify-subscription-id */
+ const char *uuid; /* notify-subscription-uuid */
+ _cups_rwlock_t rwlock; /* Subscription lock */
+ _ipp_event_t mask; /* Event mask */
+ _ipp_printer_t *printer; /* Printer */
+ _ipp_job_t *job; /* Job, if any */
+ ipp_t *attrs; /* Attributes */
+ const char *username; /* notify-subscriber-user-name */
+ int lease; /* notify-lease-duration */
+ int interval; /* notify-time-interval */
+ time_t expire; /* Lease expiration time */
+ int first_sequence, /* First notify-sequence-number in cache */
+ last_sequence; /* Last notify-sequence-number used */
+ cups_array_t *events; /* Events (ipp_t *'s) */
+ int pending_delete; /* Non-zero when the subscription is about to be deleted/canceled */
+} _ipp_subscription_t;
+
+typedef struct _ipp_client_s /**** Client data ****/
+{
+ http_t *http; /* HTTP connection */
+ ipp_t *request, /* IPP request */
+ *response; /* IPP response */
+ time_t start; /* Request start time */
+ http_state_t operation; /* Request operation */
+ ipp_op_t operation_id; /* IPP operation-id */
+ char uri[1024], /* Request URI */
+ *options; /* URI options */
+ http_addr_t addr; /* Client address */
+ char hostname[256], /* Client hostname */
+ username[32]; /* Client authenticated username */
+ _ipp_printer_t *printer; /* Printer */
+ _ipp_job_t *job; /* Current job, if any */
+ int fetch_compression,
+ /* Compress file? */
+ fetch_file; /* File to fetch */
+} _ipp_client_t;
+
+
+/*
+ * Local functions...
+ */
+
+static void add_event(_ipp_printer_t *printer, _ipp_job_t *job, _ipp_event_t event, const char *message, ...) __attribute__((__format__(__printf__, 4, 5)));
+static void check_jobs(_ipp_printer_t *printer);
+static void clean_jobs(_ipp_printer_t *printer);
+static int compare_active_jobs(_ipp_job_t *a, _ipp_job_t *b);
+static int compare_completed_jobs(_ipp_job_t *a, _ipp_job_t *b);
+static int compare_devices(_ipp_device_t *a, _ipp_device_t *b);
+static int compare_jobs(_ipp_job_t *a, _ipp_job_t *b);
+static void copy_attributes(ipp_t *to, ipp_t *from, cups_array_t *ra,
+ ipp_tag_t group_tag, int quickcopy);
+static void copy_job_attributes(_ipp_client_t *client,
+ _ipp_job_t *job, cups_array_t *ra);
+static void copy_job_state_reasons(ipp_t *ipp, ipp_tag_t group_tag, _ipp_job_t *job);
+static void copy_printer_state_reasons(ipp_t *ipp, ipp_tag_t group_tag, _ipp_printer_t *printer);
+static void copy_subscription_attributes(_ipp_client_t *client, _ipp_subscription_t *sub, cups_array_t *ra);
+static _ipp_client_t *create_client(_ipp_printer_t *printer, int sock);
+static _ipp_device_t *create_device(_ipp_client_t *client);
+static _ipp_job_t *create_job(_ipp_client_t *client);
+static void create_job_filename(_ipp_printer_t *printer, _ipp_job_t *job, const char *format, char *fname, size_t fnamesize);
+static int create_listener(int family, int port);
+static _ipp_subscription_t *create_subscription(_ipp_printer_t *printer, _ipp_job_t *job, int interval, int lease, const char *username, ipp_attribute_t *notify_events, ipp_attribute_t *notify_attributes, ipp_attribute_t *notify_user_data);
+static _ipp_printer_t *create_printer(const char *servername, int port, const char *name, const char *directory, const char *proxy_user, const char *proxy_pass);
+static void debug_attributes(const char *title, ipp_t *ipp,
+ int response);
+static void delete_client(_ipp_client_t *client);
+static void delete_device(_ipp_device_t *device);
+static void delete_job(_ipp_job_t *job);
+static void delete_printer(_ipp_printer_t *printer);
+static void delete_subscription(_ipp_subscription_t *sub);
+static int filter_cb(_ipp_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr);
+static _ipp_device_t *find_device(_ipp_client_t *client);
+static _ipp_job_t *find_job(_ipp_client_t *client, int job_id);
+static _ipp_subscription_t *find_subscription(_ipp_client_t *client, int sub_id);
+static _ipp_jreason_t get_job_state_reasons_bits(ipp_attribute_t *attr);
+static _ipp_event_t get_notify_events_bits(ipp_attribute_t *attr);
+static const char *get_notify_subscribed_event(_ipp_event_t event);
+static _ipp_preason_t get_printer_state_reasons_bits(ipp_attribute_t *attr);
+static void html_escape(_ipp_client_t *client, const char *s,
+ size_t slen);
+static void html_footer(_ipp_client_t *client);
+static void html_header(_ipp_client_t *client, const char *title);
+static void html_printf(_ipp_client_t *client, const char *format, ...) __attribute__((__format__(__printf__, 2, 3)));
+static void ipp_acknowledge_document(_ipp_client_t *client);
+static void ipp_acknowledge_identify_printer(_ipp_client_t *client);
+static void ipp_acknowledge_job(_ipp_client_t *client);
+static void ipp_cancel_job(_ipp_client_t *client);
+static void ipp_cancel_my_jobs(_ipp_client_t *client);
+static void ipp_cancel_subscription(_ipp_client_t *client);
+static void ipp_close_job(_ipp_client_t *client);
+static void ipp_create_job(_ipp_client_t *client);
+static void ipp_create_xxx_subscriptions(_ipp_client_t *client);
+static void ipp_deregister_output_device(_ipp_client_t *client);
+static void ipp_fetch_document(_ipp_client_t *client);
+static void ipp_fetch_job(_ipp_client_t *client);
+static void ipp_get_document_attributes(_ipp_client_t *client);
+static void ipp_get_documents(_ipp_client_t *client);
+static void ipp_get_job_attributes(_ipp_client_t *client);
+static void ipp_get_jobs(_ipp_client_t *client);
+static void ipp_get_notifications(_ipp_client_t *client);
+static void ipp_get_output_device_attributes(_ipp_client_t *client);
+static void ipp_get_printer_attributes(_ipp_client_t *client);
+static void ipp_get_printer_supported_values(_ipp_client_t *client);
+static void ipp_get_subscription_attributes(_ipp_client_t *client);
+static void ipp_get_subscriptions(_ipp_client_t *client);
+static void ipp_identify_printer(_ipp_client_t *client);
+static void ipp_print_job(_ipp_client_t *client);
+static void ipp_print_uri(_ipp_client_t *client);
+static void ipp_renew_subscription(_ipp_client_t *client);
+static void ipp_send_document(_ipp_client_t *client);
+static void ipp_send_uri(_ipp_client_t *client);
+static void ipp_update_active_jobs(_ipp_client_t *client);
+static void ipp_update_document_status(_ipp_client_t *client);
+static void ipp_update_job_status(_ipp_client_t *client);
+static void ipp_update_output_device_attributes(_ipp_client_t *client);
+static void ipp_validate_document(_ipp_client_t *client);
+static void ipp_validate_job(_ipp_client_t *client);
+//static int parse_options(_ipp_client_t *client, cups_option_t **options);
+static void *process_client(_ipp_client_t *client);
+static int process_http(_ipp_client_t *client);
+static int process_ipp(_ipp_client_t *client);
+static void *process_job(_ipp_job_t *job);
+static int respond_http(_ipp_client_t *client, http_status_t code,
+ const char *content_coding,
+ const char *type, size_t length);
+static void respond_ipp(_ipp_client_t *client, ipp_status_t status,
+ const char *message, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+static void respond_unsupported(_ipp_client_t *client,
+ ipp_attribute_t *attr);
+static void run_printer(_ipp_printer_t *printer);
+static char *time_string(time_t tv, char *buffer, size_t bufsize);
+static void update_device_attributes_no_lock(_ipp_printer_t *printer);
+static void update_device_state_no_lock(_ipp_printer_t *printer);
+static void usage(int status) __attribute__((noreturn));
+static int valid_doc_attributes(_ipp_client_t *client);
+static int valid_job_attributes(_ipp_client_t *client);
+
+
+/*
+ * Globals...
+ */
+
+static int KeepFiles = 0,
+ Verbosity = 0;
+//static _cups_mutex_t SubscriptionMutex = _CUPS_MUTEX_INITIALIZER;
+static _cups_cond_t SubscriptionCondition = _CUPS_COND_INITIALIZER;
+
+
+/*
+ * 'main()' - Main entry to the sample infrastructure server.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line args */
+ char *argv[]) /* I - Command-line arguments */
+{
+ int i; /* Looping var */
+ const char *opt, /* Current option character */
+ *servername = NULL, /* Server host name */
+ *name = NULL; /* Printer name */
+#ifdef HAVE_SSL
+ const char *keypath = NULL; /* Keychain path */
+#endif /* HAVE_SSL */
+ int port = 0; /* Port number (0 = auto) */
+ char directory[1024] = "", /* Spool directory */
+ hostname[1024], /* Auto-detected hostname */
+ proxy_user[256] = "", /* Proxy username */
+ *proxy_pass = NULL; /* Proxy password */
+ _ipp_printer_t *printer; /* Printer object */
+
+
+ /*
+ * Parse command-line arguments...
+ */
+
+ for (i = 1; i < argc; i ++)
+ if (argv[i][0] == '-')
+ {
+ for (opt = argv[i] + 1; *opt; opt ++)
+ {
+ switch (*opt)
+ {
+#ifdef HAVE_SSL
+ case 'K' : /* -K keypath */
+ i ++;
+ if (i >= argc)
+ usage(1);
+ keypath = argv[i];
+ break;
+#endif /* HAVE_SSL */
+
+ case 'd' : /* -d spool-directory */
+ i ++;
+ if (i >= argc)
+ usage(1);
+ strlcpy(directory, argv[i], sizeof(directory));
+ break;
+
+ case 'h' : /* -h (show help) */
+ usage(0);
+
+ case 'k' : /* -k (keep files) */
+ KeepFiles = 1;
+ break;
+
+ case 'n' : /* -n hostname */
+ i ++;
+ if (i >= argc)
+ usage(1);
+ servername = argv[i];
+ break;
+
+ case 'p' : /* -p port */
+ i ++;
+ if (i >= argc || !isdigit(argv[i][0] & 255))
+ usage(1);
+ port = atoi(argv[i]);
+ break;
+
+ case 'u' : /* -u user:pass */
+ i ++;
+ if (i >= argc)
+ usage(1);
+ strlcpy(proxy_user, argv[i], sizeof(proxy_user));
+ if ((proxy_pass = strchr(proxy_user, ':')) != NULL)
+ *proxy_pass++ = '\0';
+ break;
+
+ case 'v' : /* -v (be verbose) */
+ Verbosity ++;
+ break;
+
+ default : /* Unknown */
+ fprintf(stderr, "Unknown option \"-%c\".\n", *opt);
+ usage(1);
+ }
+ }
+ }
+ else if (!name)
+ {
+ name = argv[i];
+ }
+ else
+ {
+ fprintf(stderr, "Unexpected command-line argument \"%s\"\n", argv[i]);
+ usage(1);
+ }
+
+ if (!name)
+ usage(1);
+
+ /*
+ * Apply defaults as needed...
+ */
+
+ if (!servername)
+ servername = httpGetHostname(NULL, hostname, sizeof(hostname));
+
+ if (!port)
+ {
+#ifdef WIN32
+ /*
+ * Windows is almost always used as a single user system, so use a default port
+ * number of 8631.
+ */
+
+ port = 8631;
+
+#else
+ /*
+ * Use 8000 + UID mod 1000 for the default port number...
+ */
+
+ port = 8000 + ((int)getuid() % 1000);
+#endif /* WIN32 */
+
+ fprintf(stderr, "Listening on port %d.\n", port);
+ }
+
+ if (!directory[0])
+ {
+ snprintf(directory, sizeof(directory), "/tmp/ippserver.%d", (int)getpid());
+
+ if (mkdir(directory, 0777) && errno != EEXIST)
+ {
+ fprintf(stderr, "Unable to create spool directory \"%s\": %s\n",
+ directory, strerror(errno));
+ usage(1);
+ }
+
+ if (Verbosity)
+ fprintf(stderr, "Using spool directory \"%s\".\n", directory);
+ }
+
+ if (!proxy_user[0])
+ {
+ strlcpy(proxy_user, "test", sizeof(proxy_user));
+
+ if (Verbosity)
+ fputs("Using proxy username \"test\".\n", stderr);
+ }
+
+ if (!proxy_pass)
+ {
+ proxy_pass = "test123";
+
+ if (Verbosity)
+ fputs("Using proxy password \"test123\".\n", stderr);
+ }
+
+#ifdef HAVE_SSL
+ cupsSetServerCredentials(keypath, servername, 1);
+#endif /* HAVE_SSL */
+
+ /*
+ * Create the printer...
+ */
+
+ if ((printer = create_printer(servername, port, name, directory, proxy_user, proxy_pass)) == NULL)
+ return (1);
+
+ /*
+ * Run the print service...
+ */
+
+ run_printer(printer);
+
+ /*
+ * Destroy the printer and exit...
+ */
+
+ delete_printer(printer);
+
+ return (0);
+}
+
+
+/*
+ * 'add_event()' - Add an event to a subscription.
+ */
+
+static void
+add_event(_ipp_printer_t *printer, /* I - Printer */
+ _ipp_job_t *job, /* I - Job, if any */
+ _ipp_event_t event, /* I - Event */
+ const char *message, /* I - Printf-style notify-text message */
+ ...) /* I - Additional printf arguments */
+{
+ _ipp_subscription_t *sub; /* Current subscription */
+ ipp_t *n; /* Notify attributes */
+ char text[1024]; /* notify-text value */
+ va_list ap; /* Argument pointer */
+
+
+ va_start(ap, message);
+ vsnprintf(text, sizeof(text), message, ap);
+ va_end(ap);
+
+ for (sub = (_ipp_subscription_t *)cupsArrayFirst(printer->subscriptions);
+ sub;
+ sub = (_ipp_subscription_t *)cupsArrayNext(printer->subscriptions))
+ {
+ if (sub->mask & event && (!sub->job || job == sub->job))
+ {
+ _cupsRWLockWrite(&sub->rwlock);
+
+ n = ippNew();
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_CHARSET, "notify-charset", NULL, "utf-8");
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_LANGUAGE, "notify-natural-language", NULL, "en");
+ ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-printer-up-time", time(NULL) - printer->start_time);
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, "notify-printer-uri", NULL, printer->uri);
+ if (job)
+ ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-job-id", job->id);
+ ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-subcription-id", sub->id);
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, "notify-subscription-uuid", NULL, sub->uuid);
+ ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-sequence-number", ++ sub->last_sequence);
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "notify-subscribed-event", NULL, get_notify_subscribed_event(event));
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT, "notify-text", NULL, text);
+ if (event & _IPP_EVENT_PRINTER_ALL)
+ {
+ ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, "printer-state", printer->state);
+ copy_printer_state_reasons(n, IPP_TAG_EVENT_NOTIFICATION, printer);
+ }
+ if (event & _IPP_EVENT_JOB_ALL)
+ {
+ ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, "job-state", job->state);
+ copy_job_state_reasons(n, IPP_TAG_EVENT_NOTIFICATION, job);
+ if (event == _IPP_EVENT_JOB_CREATED)
+ {
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, "job-name", NULL, job->name);
+ ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, "job-originating-user-name", NULL, job->username);
+ }
+ }
+
+ cupsArrayAdd(sub->events, n);
+ if (cupsArrayCount(sub->events) > 100)
+ {
+ n = (ipp_t *)cupsArrayFirst(sub->events);
+ cupsArrayRemove(sub->events, n);
+ ippDelete(n);
+ sub->first_sequence ++;
+ }
+
+ _cupsRWUnlock(&sub->rwlock);
+ _cupsCondBroadcast(&SubscriptionCondition);
+ }
+ }
+}
+
+
+/*
+ * 'check_jobs()' - Check for new jobs to process.
+ */
+
+static void
+check_jobs(_ipp_printer_t *printer) /* I - Printer */
+{
+ _ipp_job_t *job; /* Current job */
+
+
+ if (printer->processing_job)
+ return;
+
+ _cupsRWLockWrite(&(printer->rwlock));
+ for (job = (_ipp_job_t *)cupsArrayFirst(printer->active_jobs);
+ job;
+ job = (_ipp_job_t *)cupsArrayNext(printer->active_jobs))
+ {
+ if (job->state == IPP_JSTATE_PENDING)
+ {
+ if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
+ {
+ job->state = IPP_JSTATE_ABORTED;
+ job->completed = time(NULL);
+
+ add_event(printer, job, _IPP_EVENT_JOB_COMPLETED, "Job aborted because creation of processing thread failed.");
+ }
+ break;
+ }
+ }
+ _cupsRWUnlock(&(printer->rwlock));
+}
+
+
+/*
+ * 'clean_jobs()' - Clean out old (completed) jobs.
+ */
+
+static void
+clean_jobs(_ipp_printer_t *printer) /* I - Printer */
+{
+ _ipp_job_t *job; /* Current job */
+ time_t cleantime; /* Clean time */
+
+
+ if (cupsArrayCount(printer->jobs) == 0)
+ return;
+
+ cleantime = time(NULL) - 60;
+
+ _cupsRWLockWrite(&(printer->rwlock));
+ for (job = (_ipp_job_t *)cupsArrayFirst(printer->jobs);
+ job;
+ job = (_ipp_job_t *)cupsArrayNext(printer->jobs))
+ if (job->completed && job->completed < cleantime)
+ {
+ cupsArrayRemove(printer->jobs, job);
+ delete_job(job);
+ }
+ else
+ break;
+ _cupsRWUnlock(&(printer->rwlock));
+}
+
+
+/*
+ * 'compare_active_jobs()' - Compare two active jobs.
+ */
+
+static int /* O - Result of comparison */
+compare_active_jobs(_ipp_job_t *a, /* I - First job */
+ _ipp_job_t *b) /* I - Second job */
+{
+ int diff; /* Difference */
+
+
+ if ((diff = b->priority - a->priority) == 0)
+ diff = b->id - a->id;
+
+ return (diff);
+}
+
+
+/*
+ * 'compare_completed_jobs()' - Compare two completed jobs.
+ */
+
+static int /* O - Result of comparison */
+compare_completed_jobs(_ipp_job_t *a, /* I - First job */
+ _ipp_job_t *b) /* I - Second job */
+{
+ int diff; /* Difference */
+
+
+ if ((diff = a->completed - b->completed) == 0)
+ diff = b->id - a->id;
+
+ return (diff);
+}
+
+
+/*
+ * 'compare_devices()' - Compare two devices...
+ */
+
+static int /* O - Result of comparison */
+compare_devices(_ipp_device_t *a, /* I - First device */
+ _ipp_device_t *b) /* I - Second device */
+{
+ return (strcmp(a->uuid, b->uuid));
+}
+
+
+/*
+ * 'compare_jobs()' - Compare two jobs.
+ */
+
+static int /* O - Result of comparison */
+compare_jobs(_ipp_job_t *a, /* I - First job */
+ _ipp_job_t *b) /* I - Second job */
+{
+ return (b->id - a->id);
+}
+
+
+/*
+ * 'copy_attributes()' - Copy attributes from one request to another.
+ */
+
+static void
+copy_attributes(ipp_t *to, /* I - Destination request */
+ ipp_t *from, /* I - Source request */
+ cups_array_t *ra, /* I - Requested attributes */
+ ipp_tag_t group_tag, /* I - Group to copy */
+ int quickcopy) /* I - Do a quick copy? */
+{
+ _ipp_filter_t filter; /* Filter data */
+
+
+ filter.ra = ra;
+ filter.group_tag = group_tag;
+
+ ippCopyAttributes(to, from, quickcopy, (ipp_copycb_t)filter_cb, &filter);
+}
+
+
+/*
+ * 'copy_job_attrs()' - Copy job attributes to the response.
+ */
+
+static void
+copy_job_attributes(
+ _ipp_client_t *client, /* I - Client */
+ _ipp_job_t *job, /* I - Job */
+ cups_array_t *ra) /* I - requested-attributes */
+{
+ copy_attributes(client->response, job->attrs, ra, IPP_TAG_JOB, 0);
+
+ if (!ra || cupsArrayFind(ra, "date-time-at-completed"))
+ {
+ if (job->completed)
+ ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed));
+ else
+ ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed");
+ }
+
+ if (!ra || cupsArrayFind(ra, "date-time-at-processing"))
+ {
+ if (job->processing)
+ ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-processing", ippTimeToDate(job->processing));
+ else
+ ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing");
+ }
+
+ if (!ra || cupsArrayFind(ra, "job-impressions"))
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions", job->impressions);
+
+ if (!ra || cupsArrayFind(ra, "job-impressions-completed"))
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", job->impcompleted);
+
+ if (!ra || cupsArrayFind(ra, "job-printer-up-time"))
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-printer-up-time", (int)(time(NULL) - client->printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "job-state"))
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_ENUM,
+ "job-state", job->state);
+
+ if (!ra || cupsArrayFind(ra, "job-state-message"))
+ {
+ if (job->dev_state_message)
+ {
+ ippAddString(client->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, job->dev_state_message);
+ }
+ else
+ {
+ const char *message = ""; /* Message string */
+
+ switch (job->state)
+ {
+ case IPP_JSTATE_PENDING :
+ message = "Job pending.";
+ break;
+
+ case IPP_JSTATE_HELD :
+ if (job->state_reasons & _IPP_JREASON_JOB_INCOMING)
+ message = "Job incoming.";
+ else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO))
+ message = "Job held.";
+ else
+ message = "Job created.";
+ break;
+
+ case IPP_JSTATE_PROCESSING :
+ if (job->state_reasons & _IPP_JREASON_PROCESSING_TO_STOP_POINT)
+ {
+ if (job->cancel)
+ message = "Cancel in progress.";
+ else
+ message = "Abort in progress.";
+ }
+ else
+ message = "Job printing.";
+ break;
+
+ case IPP_JSTATE_STOPPED :
+ message = "Job stopped.";
+ break;
+
+ case IPP_JSTATE_CANCELED :
+ message = "Job canceled.";
+ break;
+
+ case IPP_JSTATE_ABORTED :
+ message = "Job aborted.";
+ break;
+
+ case IPP_JSTATE_COMPLETED :
+ message = "Job completed.";
+ break;
+ }
+
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, message);
+ }
+ }
+
+ if (!ra || cupsArrayFind(ra, "job-state-reasons"))
+ copy_job_state_reasons(client->response, IPP_TAG_JOB, job);
+/*
+ switch (job->state)
+ {
+ case IPP_JSTATE_PENDING :
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
+ NULL, "none");
+ break;
+
+ case IPP_JSTATE_HELD :
+ if (job->fd >= 0)
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-incoming");
+ else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO))
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-hold-until-specified");
+ else
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-data-insufficient");
+ break;
+
+ case IPP_JSTATE_PROCESSING :
+ if (job->cancel)
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "processing-to-stop-point");
+ else
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-printing");
+ break;
+
+ case IPP_JSTATE_STOPPED :
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
+ NULL, "job-stopped");
+ break;
+
+ case IPP_JSTATE_CANCELED :
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
+ NULL, "job-canceled-by-user");
+ break;
+
+ case IPP_JSTATE_ABORTED :
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
+ NULL, "aborted-by-system");
+ break;
+
+ case IPP_JSTATE_COMPLETED :
+ ippAddString(client->response, IPP_TAG_JOB,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
+ NULL, "job-completed-successfully");
+ break;
+ }
+*/
+
+ if (!ra || cupsArrayFind(ra, "time-at-completed"))
+ ippAddInteger(client->response, IPP_TAG_JOB,
+ job->completed ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE,
+ "time-at-completed", (int)(job->completed - client->printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "time-at-processing"))
+ ippAddInteger(client->response, IPP_TAG_JOB,
+ job->processing ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE,
+ "time-at-processing", (int)(job->processing - client->printer->start_time));
+}
+
+
+/*
+ * 'copy_job_state_reasons()' - Copy printer-state-reasons values.
+ */
+
+static void
+copy_job_state_reasons(
+ ipp_t *ipp, /* I - Attributes */
+ ipp_tag_t group_tag, /* I - Group */
+ _ipp_job_t *job) /* I - Printer */
+{
+ _ipp_jreason_t creasons; /* Combined job-state-reasons */
+
+
+ creasons = job->state_reasons | job->dev_state_reasons;
+
+ if (!creasons)
+ {
+ ippAddString(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "none");
+ }
+ else
+ {
+ int i, /* Looping var */
+ num_reasons = 0;/* Number of reasons */
+ _ipp_jreason_t reason; /* Current reason */
+ const char *reasons[32]; /* Reason strings */
+
+ for (i = 0, reason = 1; i < (int)(sizeof(_ipp_jreasons) / sizeof(_ipp_jreasons[0])); i ++, reason <<= 1)
+ {
+ if (creasons & reason)
+ reasons[num_reasons ++] = _ipp_jreasons[i];
+ }
+
+ ippAddStrings(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", num_reasons, NULL, reasons);
+ }
+}
+
+
+/*
+ * 'copy_printer_state_reasons()' - Copy printer-state-reasons values.
+ */
+
+static void
+copy_printer_state_reasons(
+ ipp_t *ipp, /* I - Attributes */
+ ipp_tag_t group_tag, /* I - Group */
+ _ipp_printer_t *printer) /* I - Printer */
+{
+ _ipp_preason_t creasons = printer->state_reasons | printer->dev_reasons;
+ /* Combined reasons */
+
+
+ if (creasons == _IPP_PREASON_NONE)
+ {
+ ippAddString(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-state-reasons", NULL, "none");
+ }
+ else
+ {
+ int i, /* Looping var */ num_reasons = 0;/* Number of reasons */
+ _ipp_preason_t reason; /* Current reason */
+ const char *reasons[32]; /* Reason strings */
+
+ for (i = 0, reason = 1; i < (int)(sizeof(_ipp_preasons) / sizeof(_ipp_preasons[0])); i ++, reason <<= 1)
+ {
+ if (creasons & reason)
+ reasons[num_reasons ++] = _ipp_preasons[i];
+ }
+
+ ippAddStrings(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-state-reasons", num_reasons, NULL, reasons);
+ }
+}
+
+
+/*
+ * 'copy_sub_attrs()' - Copy job attributes to the response.
+ */
+
+static void
+copy_subscription_attributes(
+ _ipp_client_t *client, /* I - Client */
+ _ipp_subscription_t *sub, /* I - Subscription */
+ cups_array_t *ra) /* I - requested-attributes */
+{
+ copy_attributes(client->response, sub->attrs, ra, IPP_TAG_SUBSCRIPTION, 0);
+
+ if (!ra || cupsArrayFind(ra, "notify-lease-expiration-time"))
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-lease-expiration-time", (int)(sub->expire - client->printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "notify-printer-up-time"))
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-printer-up-time", (int)(time(NULL) - client->printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "notify-sequence-number"))
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-sequence-number", sub->last_sequence);
+}
+
+
+/*
+ * 'create_client()' - Accept a new network connection and create a client
+ * object.
+ */
+
+static _ipp_client_t * /* O - Client */
+create_client(_ipp_printer_t *printer, /* I - Printer */
+ int sock) /* I - Listen socket */
+{
+ _ipp_client_t *client; /* Client */
+
+
+ if ((client = calloc(1, sizeof(_ipp_client_t))) == NULL)
+ {
+ perror("Unable to allocate memory for client");
+ return (NULL);
+ }
+
+ client->printer = printer;
+ client->fetch_file = -1;
+
+ /*
+ * Accept the client and get the remote address...
+ */
+
+ if ((client->http = httpAcceptConnection(sock, 1)) == NULL)
+ {
+ perror("Unable to accept client connection");
+
+ free(client);
+
+ return (NULL);
+ }
+
+ httpGetHostname(client->http, client->hostname, sizeof(client->hostname));
+
+ if (Verbosity)
+ fprintf(stderr, "Accepted connection from %s\n", client->hostname);
+
+ return (client);
+}
+
+
+/*
+ * 'create_device()' - Create an output device tracking object.
+ */
+
+static _ipp_device_t * /* O - Device */
+create_device(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ ipp_attribute_t *uuid; /* output-device-uuid */
+
+
+ if ((uuid = ippFindAttribute(client->request, "output-device-uuid", IPP_TAG_URI)) == NULL)
+ return (NULL);
+
+ if ((device = calloc(1, sizeof(_ipp_device_t))) == NULL)
+ return (NULL);
+
+ _cupsRWInit(&device->rwlock);
+
+ device->uuid = strdup(ippGetString(uuid, 0, NULL));
+ device->state = IPP_PSTATE_STOPPED;
+
+ _cupsRWLockWrite(&client->printer->rwlock);
+ cupsArrayAdd(client->printer->devices, device);
+ _cupsRWUnlock(&client->printer->rwlock);
+
+ return (device);
+}
+
+
+/*
+ * 'create_job()' - Create a new job object from a Print-Job or Create-Job
+ * request.
+ */
+
+static _ipp_job_t * /* O - Job */
+create_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* Job */
+ ipp_attribute_t *attr; /* Job attribute */
+ char uri[1024], /* job-uri value */
+ uuid[64]; /* job-uuid value */
+
+
+ _cupsRWLockWrite(&(client->printer->rwlock));
+
+ /*
+ * Allocate and initialize the job object...
+ */
+
+ if ((job = calloc(1, sizeof(_ipp_job_t))) == NULL)
+ {
+ perror("Unable to allocate memory for job");
+ return (NULL);
+ }
+
+ job->printer = client->printer;
+ job->attrs = ippNew();
+ job->state = IPP_JSTATE_HELD;
+ job->fd = -1;
+
+ /*
+ * Copy all of the job attributes...
+ */
+
+ copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
+
+ /*
+ * Get the requesting-user-name, document format, and priority...
+ */
+
+ if ((attr = ippFindAttribute(client->request, "job-priority", IPP_TAG_INTEGER)) != NULL)
+ job->priority = ippGetInteger(attr, 0);
+ else
+ job->priority = 50;
+
+ if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL)
+ job->username = ippGetString(attr, 0, NULL);
+ else
+ job->username = "anonymous";
+
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-user-name", NULL, job->username);
+
+ if (ippGetOperation(client->request) != IPP_OP_CREATE_JOB)
+ {
+ if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else
+ job->format = "application/octet-stream";
+ }
+
+ if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_INTEGER)) != NULL)
+ job->impressions = ippGetInteger(attr, 0);
+
+ if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_NAME)) != NULL)
+ job->name = ippGetString(attr, 0, NULL);
+
+ /*
+ * Add job description attributes and add to the jobs array...
+ */
+
+ job->id = client->printer->next_job_id ++;
+
+ snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id);
+ httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid));
+
+ ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created)));
+ ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id);
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri);
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid);
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri);
+ ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time));
+
+ cupsArrayAdd(client->printer->jobs, job);
+ cupsArrayAdd(client->printer->active_jobs, job);
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ return (job);
+}
+
+
+/*
+ * 'create_job_filename()' - Create the filename for a document in a job.
+ */
+
+static void create_job_filename(
+ _ipp_printer_t *printer, /* I - Printer */
+ _ipp_job_t *job, /* I - Job */
+ const char *format, /* I - Format or NULL */
+ char *fname, /* I - Filename buffer */
+ size_t fnamesize) /* I - Size of filename buffer */
+{
+ char name[256], /* "Safe" filename */
+ *nameptr; /* Pointer into filename */
+ const char *ext, /* Filename extension */
+ *job_name; /* job-name value */
+ ipp_attribute_t *job_name_attr; /* job-name attribute */
+
+
+ /*
+ * Make a name from the job-name attribute...
+ */
+
+ if ((job_name_attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL)
+ job_name = ippGetString(job_name_attr, 0, NULL);
+ else
+ job_name = "untitled";
+
+ for (nameptr = name; *job_name && nameptr < (name + sizeof(name) - 1); job_name ++)
+ if (isalnum(*job_name & 255) || *job_name == '-')
+ *nameptr++ = (char)tolower(*job_name & 255);
+ else
+ *nameptr++ = '_';
+
+ *nameptr = '\0';
+
+ /*
+ * Figure out the extension...
+ */
+
+ if (!format)
+ format = job->format;
+
+ if (!strcasecmp(format, "image/jpeg"))
+ ext = "jpg";
+ else if (!strcasecmp(format, "image/png"))
+ ext = "png";
+ else if (!strcasecmp(format, "image/pwg-raster"))
+ ext = "ras";
+ else if (!strcasecmp(format, "image/urf"))
+ ext = "urf";
+ else if (!strcasecmp(format, "application/pdf"))
+ ext = "pdf";
+ else if (!strcasecmp(format, "application/postscript"))
+ ext = "ps";
+ else
+ ext = "prn";
+
+ /*
+ * Create a filename with the job-id, job-name, and document-format (extension)...
+ */
+
+ snprintf(fname, fnamesize, "%s/%d-%s.%s", printer->directory, job->id, name, ext);
+}
+
+
+/*
+ * 'create_listener()' - Create a listener socket.
+ */
+
+static int /* O - Listener socket or -1 on error */
+create_listener(int family, /* I - Address family */
+ int port) /* I - Port number */
+{
+ int sock; /* Listener socket */
+ http_addrlist_t *addrlist; /* Listen address */
+ char service[255]; /* Service port */
+
+
+ snprintf(service, sizeof(service), "%d", port);
+ if ((addrlist = httpAddrGetList(NULL, family, service)) == NULL)
+ return (-1);
+
+ sock = httpAddrListen(&(addrlist->addr), port);
+
+ httpAddrFreeList(addrlist);
+
+ return (sock);
+}
+
+
+/*
+ * 'create_printer()' - Create, register, and listen for connections to a
+ * printer object.
+ */
+
+static _ipp_printer_t * /* O - Printer */
+create_printer(const char *servername, /* I - Server hostname (NULL for default) */
+ int port, /* I - Port number */
+ const char *name, /* I - printer-name */
+ const char *directory, /* I - Spool directory */
+ const char *proxy_user, /* I - Proxy account username */
+ const char *proxy_pass) /* I - Proxy account password */
+{
+ _ipp_printer_t *printer; /* Printer */
+ char uri[1024], /* Printer URI */
+ adminurl[1024], /* printer-more-info URI */
+ supplyurl[1024],/* printer-supply-info-uri URI */
+ uuid[128]; /* printer-uuid */
+ int k_supported; /* Maximum file size supported */
+#ifdef HAVE_STATVFS
+ struct statvfs spoolinfo; /* FS info for spool directory */
+ double spoolsize; /* FS size */
+#elif defined(HAVE_STATFS)
+ struct statfs spoolinfo; /* FS info for spool directory */
+ double spoolsize; /* FS size */
+#endif /* HAVE_STATVFS */
+ static const char * const versions[] =/* ipp-versions-supported values */
+ {
+ "1.0",
+ "1.1",
+ "2.0"
+ };
+ static const char * const features[] =/* ipp-features-supported values */
+ {
+ "document-object",
+ "ipp-everywhere",
+ "infrastructure-printer",
+ "page-overrides"
+ };
+ static const int ops[] = /* operations-supported values */
+ {
+ IPP_OP_PRINT_JOB,
+ IPP_OP_PRINT_URI,
+ IPP_OP_VALIDATE_JOB,
+ IPP_OP_CREATE_JOB,
+ IPP_OP_SEND_DOCUMENT,
+ IPP_OP_SEND_URI,
+ IPP_OP_CANCEL_JOB,
+ IPP_OP_GET_JOB_ATTRIBUTES,
+ IPP_OP_GET_JOBS,
+ IPP_OP_GET_PRINTER_ATTRIBUTES,
+ IPP_OP_GET_PRINTER_SUPPORTED_VALUES,
+ IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
+ IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
+ IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,
+ IPP_OP_GET_SUBSCRIPTIONS,
+ IPP_OP_RENEW_SUBSCRIPTION,
+ IPP_OP_CANCEL_SUBSCRIPTION,
+ IPP_OP_GET_NOTIFICATIONS,
+ IPP_OP_GET_DOCUMENT_ATTRIBUTES,
+ IPP_OP_GET_DOCUMENTS,
+ IPP_OP_CANCEL_MY_JOBS,
+ IPP_OP_CLOSE_JOB,
+ IPP_OP_IDENTIFY_PRINTER,
+ IPP_OP_VALIDATE_DOCUMENT,
+ _IPP_OP_ACKNOWLEDGE_DOCUMENT,
+ _IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER,
+ _IPP_OP_ACKNOWLEDGE_JOB,
+ _IPP_OP_FETCH_DOCUMENT,
+ _IPP_OP_FETCH_JOB,
+ _IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES,
+ _IPP_OP_UPDATE_ACTIVE_JOBS,
+ _IPP_OP_UPDATE_DOCUMENT_STATUS,
+ _IPP_OP_UPDATE_JOB_STATUS,
+ _IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES,
+ _IPP_OP_DEREGISTER_OUTPUT_DEVICE
+ };
+ static const char * const charsets[] =/* charset-supported values */
+ {
+ "us-ascii",
+ "utf-8"
+ };
+ static const char * const compressions[] =/* compression-supported values */
+ {
+#ifdef HAVE_LIBZ
+ "deflate",
+ "gzip",
+#endif /* HAVE_LIBZ */
+ "none"
+ };
+ static const char * const notify_attributes[] =
+ { /* notify-attributes-supported */
+ "printer-state-change-time",
+ "notify-lease-expiration-time",
+ "notify-subscriber-user-name"
+ };
+ static const char * const reference_uri_schemes_supported[] =
+ { /* reference-uri-schemes-supported */
+ "file",
+ "ftp",
+ "http"
+#ifdef HAVE_SSL
+ , "https"
+#endif /* HAVE_SSL */
+ };
+ static const char * const which_jobs[] =
+ { /* which-jobs-supported values */
+ "completed",
+ "not-completed",
+ "aborted",
+ "all",
+ "canceled",
+ "pending",
+ "pending-held",
+ "processing",
+ "processing-stopped"
+ };
+
+
+ /*
+ * Allocate memory for the printer...
+ */
+
+ if ((printer = calloc(1, sizeof(_ipp_printer_t))) == NULL)
+ {
+ perror("ippserver: Unable to allocate memory for printer");
+ return (NULL);
+ }
+
+ printer->ipv4 = -1;
+ printer->ipv6 = -1;
+ printer->name = strdup(name);
+ printer->directory = strdup(directory);
+ printer->hostname = strdup(servername);
+ printer->port = port;
+ printer->start_time = time(NULL);
+ printer->config_time = printer->start_time;
+ printer->state = IPP_PSTATE_IDLE;
+ printer->state_reasons = _IPP_PREASON_NONE;
+ printer->state_time = printer->start_time;
+ printer->jobs = cupsArrayNew3((cups_array_func_t)compare_jobs, NULL, NULL, 0, NULL, (cups_afree_func_t)delete_job);
+ printer->active_jobs = cupsArrayNew((cups_array_func_t)compare_active_jobs, NULL);
+ printer->completed_jobs = cupsArrayNew((cups_array_func_t)compare_completed_jobs, NULL);
+ printer->next_job_id = 1;
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+ printer->hostname, printer->port, "/ipp/print");
+ printer->uri = strdup(uri);
+ printer->urilen = strlen(uri);
+
+ if (proxy_user)
+ printer->proxy_user = strdup(proxy_user);
+ if (proxy_pass)
+ printer->proxy_pass = strdup(proxy_pass);
+
+ printer->devices = cupsArrayNew((cups_array_func_t)compare_devices, NULL);
+
+ _cupsRWInit(&(printer->rwlock));
+
+ /*
+ * Create the listener sockets...
+ */
+
+ if ((printer->ipv4 = create_listener(AF_INET, printer->port)) < 0)
+ {
+ perror("Unable to create IPv4 listener");
+ goto bad_printer;
+ }
+
+ if ((printer->ipv6 = create_listener(AF_INET6, printer->port)) < 0)
+ {
+ perror("Unable to create IPv6 listener");
+ goto bad_printer;
+ }
+
+ /*
+ * Prepare values for the printer attributes...
+ */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL, printer->hostname, printer->port, "/");
+ httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), "http", NULL, printer->hostname, printer->port, "/supplies");
+
+ if (Verbosity)
+ {
+ fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl);
+ fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl);
+ fprintf(stderr, "printer-uri=\"%s\"\n", uri);
+ }
+
+ /*
+ * Get the maximum spool size based on the size of the filesystem used for
+ * the spool directory. If the host OS doesn't support the statfs call
+ * or the filesystem is larger than 2TiB, always report INT_MAX.
+ */
+
+#ifdef HAVE_STATVFS
+ if (statvfs(printer->directory, &spoolinfo))
+ k_supported = INT_MAX;
+ else if ((spoolsize = (double)spoolinfo.f_frsize *
+ spoolinfo.f_blocks / 1024) > INT_MAX)
+ k_supported = INT_MAX;
+ else
+ k_supported = (int)spoolsize;
+
+#elif defined(HAVE_STATFS)
+ if (statfs(printer->directory, &spoolinfo))
+ k_supported = INT_MAX;
+ else if ((spoolsize = (double)spoolinfo.f_bsize *
+ spoolinfo.f_blocks / 1024) > INT_MAX)
+ k_supported = INT_MAX;
+ else
+ k_supported = (int)spoolsize;
+
+#else
+ k_supported = INT_MAX;
+#endif /* HAVE_STATVFS */
+
+ /*
+ * Create the printer attributes. This list of attributes is sorted to improve
+ * performance when the client provides a requested-attributes attribute...
+ */
+
+ printer->attrs = ippNew();
+
+ /* charset-configured */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_CHARSET),
+ "charset-configured", NULL, "utf-8");
+
+ /* charset-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_CHARSET),
+ "charset-supported", sizeof(charsets) / sizeof(charsets[0]),
+ NULL, charsets);
+
+ /* compression-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "compression-supported",
+ (int)(sizeof(compressions) / sizeof(compressions[0])), NULL,
+ compressions);
+
+ /* generated-natural-language-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_LANGUAGE),
+ "generated-natural-language-supported", NULL, "en");
+
+ /* ipp-features-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features);
+
+ /* ipp-versions-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]), NULL, versions);
+
+ /* ippget-event-life */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "ippget-event-life", 300);
+
+ /* job-ids-supported */
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-ids-supported", 1);
+
+ /* job-k-octets-supported */
+ ippAddRange(printer->attrs, IPP_TAG_PRINTER, "job-k-octets-supported", 0,
+ k_supported);
+
+ /* job-priority-default */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "job-priority-default", 50);
+
+ /* job-priority-supported */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "job-priority-supported", 100);
+
+ /* multiple-document-jobs-supported */
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "multiple-document-jobs-supported", 0);
+
+ /* multiple-operation-time-out */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "multiple-operation-time-out", 60);
+
+ /* multiple-operation-time-out-action */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "abort-job");
+
+ /* natural-language-configured */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_LANGUAGE),
+ "natural-language-configured", NULL, "en");
+
+ /* notify-attributes-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-attributes-supported", sizeof(notify_attributes) / sizeof(notify_attributes[0]), NULL, notify_attributes);
+
+ /* notify-events-default */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events-default", NULL, "job-completed");
+
+ /* notify-events-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events-supported", sizeof(_ipp_events) / sizeof(_ipp_events[0]), NULL, _ipp_events);
+
+ /* notify-lease-duration-default */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "notify-lease-duration-default", 86400);
+
+ /* notify-lease-duration-supported */
+ ippAddRange(printer->attrs, IPP_TAG_PRINTER, "notify-lease-duration-supported", 0, _IPP_NOTIFY_LEASE_DURATION_MAX);
+
+ /* notify-max-events-supported */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "notify-lease-duration-default", (int)(sizeof(_ipp_events) / sizeof(_ipp_events[0])));
+
+ /* notify-pull-method-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-pull-method-supported", NULL, "ippget");
+
+ /* operations-supported */
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
+ "operations-supported", sizeof(ops) / sizeof(ops[0]), ops);
+
+ /* printer-get-attributes-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format");
+
+ /* printer-is-accepting-jobs */
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
+
+ /* printer-info */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, name);
+
+ /* printer-more-info */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl);
+
+ /* printer-name */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name);
+
+ /* printer-supply-info-uri */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl);
+
+ /* printer-uri-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri);
+
+ /* printer-uuid */
+ httpAssembleUUID(printer->hostname, port, name, 0, uuid, sizeof(uuid));
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid);
+
+ /* reference-uri-scheme-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_URISCHEME),
+ "reference-uri-schemes-supported",
+ (int)(sizeof(reference_uri_schemes_supported) /
+ sizeof(reference_uri_schemes_supported[0])),
+ NULL, reference_uri_schemes_supported);
+
+ /* uri-authentication-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "uri-authentication-supported", NULL, "basic");
+
+ /* uri-security-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "uri-security-supported", NULL, "tls");
+
+ /* which-jobs-supported */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "which-jobs-supported",
+ sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs);
+
+ debug_attributes("Printer", printer->attrs, 0);
+
+ /*
+ * Return it!
+ */
+
+ return (printer);
+
+
+ /*
+ * If we get here we were unable to create the printer...
+ */
+
+ bad_printer:
+
+ delete_printer(printer);
+ return (NULL);
+}
+
+
+/*
+ * 'create_subscription()' - Create a new subscription object from a
+ * Print-Job, Create-Job, or Create-xxx-Subscription
+ * request.
+ */
+
+static _ipp_subscription_t * /* O - Subscription object */
+create_subscription(
+ _ipp_printer_t *printer, /* I - Printer */
+ _ipp_job_t *job, /* I - Job, if any */
+ int interval, /* I - Interval for progress events */
+ int lease, /* I - Lease duration */
+ const char *username, /* I - User creating the subscription */
+ ipp_attribute_t *notify_events, /* I - Events to monitor */
+ ipp_attribute_t *notify_attributes, /* I - Attributes to report */
+ ipp_attribute_t *notify_user_data) /* I - User data, if any */
+{
+ _ipp_subscription_t *sub; /* Subscription */
+ ipp_attribute_t *attr; /* Subscription attribute */
+ char uuid[64]; /* notify-subscription-uuid value */
+
+
+ /*
+ * Allocate and initialize the subscription object...
+ */
+
+ if ((sub = calloc(1, sizeof(_ipp_subscription_t))) == NULL)
+ {
+ perror("Unable to allocate memory for subscription");
+ return (NULL);
+ }
+
+ _cupsRWLockWrite(&(printer->rwlock));
+
+ sub->id = printer->next_sub_id ++;
+ sub->mask = notify_events ? get_notify_events_bits(notify_events) : _IPP_EVENT_DEFAULT;
+ sub->printer = printer;
+ sub->job = job;
+ sub->interval = interval;
+ sub->lease = lease;
+ sub->attrs = ippNew();
+
+ if (lease)
+ sub->expire = time(NULL) + sub->lease;
+ else
+ sub->expire = INT_MAX;
+
+ _cupsRWInit(&(sub->rwlock));
+
+ /*
+ * Add subscription description attributes and add to the subscriptions
+ * array...
+ */
+
+ ippAddInteger(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-subscription-id", sub->id);
+
+ httpAssembleUUID(printer->hostname, printer->port, printer->name, -sub->id, uuid, sizeof(uuid));
+ attr = ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, "notify-subscription-uuid", NULL, uuid);
+ sub->uuid = ippGetString(attr, 0, NULL);
+
+ ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, "notify-printer-uri", NULL, printer->uri);
+
+ if (job)
+ ippAddInteger(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-job-id", job->id);
+ else
+ ippAddInteger(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-lease-duration", sub->lease);
+
+ attr = ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_NAME, "notify-subscriber-user-name", NULL, username);
+ sub->username = ippGetString(attr, 0, NULL);
+
+ if (notify_events)
+ ippCopyAttribute(sub->attrs, notify_events, 0);
+ else
+ ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events", NULL, _IPP_EVENT_DEFAULT_STRING);
+
+ ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-pull-method", NULL, "ippget");
+
+ if (notify_attributes)
+ ippCopyAttribute(sub->attrs, notify_attributes, 0);
+
+ if (notify_user_data)
+ ippCopyAttribute(sub->attrs, notify_user_data, 0);
+
+ sub->events = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)ippDelete);
+
+ cupsArrayAdd(printer->subscriptions, sub);
+
+ _cupsRWUnlock(&(printer->rwlock));
+
+ return (sub);
+}
+
+
+/*
+ * 'debug_attributes()' - Print attributes in a request or response.
+ */
+
+static void
+debug_attributes(const char *title, /* I - Title */
+ ipp_t *ipp, /* I - Request/response */
+ int type) /* I - 0 = object, 1 = request, 2 = response */
+{
+ ipp_tag_t group_tag; /* Current group */
+ ipp_attribute_t *attr; /* Current attribute */
+ char buffer[2048]; /* String buffer for value */
+ int major, minor; /* Version */
+
+
+ if (Verbosity <= 1)
+ return;
+
+ fprintf(stderr, "%s:\n", title);
+ major = ippGetVersion(ipp, &minor);
+ fprintf(stderr, " version=%d.%d\n", major, minor);
+ if (type == 1)
+ fprintf(stderr, " operation-id=%s(%04x)\n",
+ ippOpString(ippGetOperation(ipp)), ippGetOperation(ipp));
+ else if (type == 2)
+ fprintf(stderr, " status-code=%s(%04x)\n",
+ ippErrorString(ippGetStatusCode(ipp)), ippGetStatusCode(ipp));
+ fprintf(stderr, " request-id=%d\n\n", ippGetRequestId(ipp));
+
+ for (attr = ippFirstAttribute(ipp), group_tag = IPP_TAG_ZERO;
+ attr;
+ attr = ippNextAttribute(ipp))
+ {
+ if (ippGetGroupTag(attr) != group_tag)
+ {
+ group_tag = ippGetGroupTag(attr);
+ fprintf(stderr, " %s\n", ippTagString(group_tag));
+ }
+
+ if (ippGetName(attr))
+ {
+ ippAttributeString(attr, buffer, sizeof(buffer));
+ fprintf(stderr, " %s (%s%s) %s\n", ippGetName(attr),
+ ippGetCount(attr) > 1 ? "1setOf " : "",
+ ippTagString(ippGetValueTag(attr)), buffer);
+ }
+ }
+}
+
+
+/*
+ * 'delete_client()' - Close the socket and free all memory used by a client
+ * object.
+ */
+
+static void
+delete_client(_ipp_client_t *client) /* I - Client */
+{
+ if (Verbosity)
+ fprintf(stderr, "Closing connection from %s\n", client->hostname);
+
+ /*
+ * Flush pending writes before closing...
+ */
+
+ httpFlushWrite(client->http);
+
+ /*
+ * Free memory...
+ */
+
+ httpClose(client->http);
+
+ ippDelete(client->request);
+ ippDelete(client->response);
+
+ free(client);
+}
+
+
+/*
+ * 'delete_device()' - Remove a device from a printer.
+ *
+ * Note: Caller is responsible for locking the printer object.
+ */
+
+static void
+delete_device(_ipp_device_t *device) /* I - Device */
+{
+ /*
+ * Free memory used for the device...
+ */
+
+ _cupsRWDeinit(&device->rwlock);
+
+ if (device->name)
+ free(device->name);
+
+ free(device->uuid);
+
+ ippDelete(device->attrs);
+
+ free(device);
+}
+
+
+/*
+ * 'delete_job()' - Remove from the printer and free all memory used by a job
+ * object.
+ */
+
+static void
+delete_job(_ipp_job_t *job) /* I - Job */
+{
+ if (Verbosity)
+ fprintf(stderr, "Removing job #%d from history.\n", job->id);
+
+ _cupsRWLockWrite(&job->rwlock);
+
+ ippDelete(job->attrs);
+
+ if (job->filename)
+ {
+ if (!KeepFiles)
+ unlink(job->filename);
+
+ free(job->filename);
+ }
+
+ _cupsRWDeinit(&job->rwlock);
+
+ free(job);
+}
+
+
+/*
+ * 'delete_printer()' - Unregister, close listen sockets, and free all memory
+ * used by a printer object.
+ */
+
+static void
+delete_printer(_ipp_printer_t *printer) /* I - Printer */
+{
+ _cupsRWLockWrite(&printer->rwlock);
+
+ if (printer->ipv4 >= 0)
+ close(printer->ipv4);
+
+ if (printer->ipv6 >= 0)
+ close(printer->ipv6);
+
+ if (printer->name)
+ free(printer->name);
+ if (printer->directory)
+ free(printer->directory);
+ if (printer->hostname)
+ free(printer->hostname);
+ if (printer->uri)
+ free(printer->uri);
+ if (printer->proxy_user)
+ free(printer->proxy_user);
+ if (printer->proxy_pass)
+ free(printer->proxy_pass);
+
+
+ ippDelete(printer->attrs);
+ ippDelete(printer->dev_attrs);
+
+ cupsArrayDelete(printer->active_jobs);
+ cupsArrayDelete(printer->completed_jobs);
+ cupsArrayDelete(printer->jobs);
+ cupsArrayDelete(printer->subscriptions);
+
+ _cupsRWDeinit(&printer->rwlock);
+
+ free(printer);
+}
+
+
+/*
+ * 'delete_subscription()' - Delete a subscription.
+ */
+
+static void
+delete_subscription(
+ _ipp_subscription_t *sub) /* I - Subscription */
+{
+ sub->pending_delete = 1;
+
+ _cupsCondBroadcast(&SubscriptionCondition);
+
+ _cupsRWLockWrite(&sub->rwlock);
+
+ ippDelete(sub->attrs);
+ cupsArrayDelete(sub->events);
+
+ _cupsRWDeinit(&sub->rwlock);
+
+ free(sub);
+}
+
+
+/*
+ * 'filter_cb()' - Filter printer attributes based on the requested array.
+ */
+
+static int /* O - 1 to copy, 0 to ignore */
+filter_cb(_ipp_filter_t *filter, /* I - Filter parameters */
+ ipp_t *dst, /* I - Destination (unused) */
+ ipp_attribute_t *attr) /* I - Source attribute */
+{
+ /*
+ * Filter attributes as needed...
+ */
+
+ (void)dst;
+
+ ipp_tag_t group = ippGetGroupTag(attr);
+ const char *name = ippGetName(attr);
+
+ if ((filter->group_tag != IPP_TAG_ZERO && group != filter->group_tag && group != IPP_TAG_ZERO) || !name || (!strcmp(name, "media-col-database") && !cupsArrayFind(filter->ra, (void *)name)))
+ return (0);
+
+ return (!filter->ra || cupsArrayFind(filter->ra, (void *)name) != NULL);
+}
+
+
+/*
+ * 'find_device()' - Find a device.
+ */
+
+static _ipp_device_t * /* I - Device */
+find_device(_ipp_client_t *client) /* I - Client */
+{
+ ipp_attribute_t *uuid; /* output-device-uuid */
+ _ipp_device_t key, /* Search key */
+ *device; /* Matching device */
+
+
+ if ((uuid = ippFindAttribute(client->request, "output-device-uuid", IPP_TAG_URI)) == NULL)
+ return (NULL);
+
+ key.uuid = (char *)ippGetString(uuid, 0, NULL);
+
+ _cupsRWLockRead(&client->printer->rwlock);
+ device = (_ipp_device_t *)cupsArrayFind(client->printer->devices, &key);
+ _cupsRWUnlock(&client->printer->rwlock);
+
+ return (device);
+}
+
+
+/*
+ * 'find_job()' - Find a job specified in a request.
+ */
+
+static _ipp_job_t * /* O - Job or NULL */
+find_job(_ipp_client_t *client, /* I - Client */
+ int job_id) /* I - Job ID to find or 0 to lookup */
+{
+ ipp_attribute_t *attr; /* job-id or job-uri attribute */
+ _ipp_job_t key, /* Job search key */
+ *job; /* Matching job, if any */
+
+
+ if (job_id > 0)
+ {
+ key.id = job_id;
+ }
+ else if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL)
+ {
+ const char *uri = ippGetString(attr, 0, NULL);
+
+ if (!strncmp(uri, client->printer->uri, client->printer->urilen) &&
+ uri[client->printer->urilen] == '/')
+ key.id = atoi(uri + client->printer->urilen + 1);
+ else
+ return (NULL);
+ }
+ else if ((attr = ippFindAttribute(client->request, "job-id", IPP_TAG_INTEGER)) != NULL)
+ {
+ key.id = ippGetInteger(attr, 0);
+ }
+
+ _cupsRWLockRead(&(client->printer->rwlock));
+ job = (_ipp_job_t *)cupsArrayFind(client->printer->jobs, &key);
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ return (job);
+}
+
+
+/*
+ * 'find_subscription()' - Find a subcription.
+ */
+
+static _ipp_subscription_t * /* O - Subscription */
+find_subscription(_ipp_client_t *client,/* I - Client */
+ int sub_id) /* I - Subscription ID or 0 */
+{
+ ipp_attribute_t *notify_subscription_id;
+ /* notify-subscription-id */
+ _ipp_subscription_t key, /* Search key */
+ *sub; /* Matching subscription */
+
+
+ if (sub_id > 0)
+ key.id = sub_id;
+ else if ((notify_subscription_id = ippFindAttribute(client->request, "notify-subscription-id", IPP_TAG_INTEGER)) == NULL)
+ return (NULL);
+ else
+ key.id = ippGetInteger(notify_subscription_id, 0);
+
+ _cupsRWLockRead(&client->printer->rwlock);
+ sub = (_ipp_subscription_t *)cupsArrayFind(client->printer->subscriptions, &key);
+ _cupsRWUnlock(&client->printer->rwlock);
+
+ return (sub);
+}
+
+
+/*
+ * 'get_job_state_reasons_bits()' - Get the bits associates with "job-state-reasons" values.
+ */
+
+static _ipp_jreason_t /* O - Bits */
+get_job_state_reasons_bits(
+ ipp_attribute_t *attr) /* I - "job-state-reasons" attribute */
+{
+ int i, j, /* Looping vars */
+ count; /* Number of "job-state-reasons" values */
+ const char *keyword; /* "job-state-reasons" value */
+ _ipp_jreason_t jreasons = _IPP_JREASON_NONE;
+ /* Bits for "job-state-reasons" values */
+
+
+ count = ippGetCount(attr);
+ for (i = 0; i < count; i ++)
+ {
+ keyword = ippGetString(attr, i, NULL);
+
+ for (j = 0; j < (int)(sizeof(_ipp_jreasons) / sizeof(_ipp_jreasons[0])); j ++)
+ {
+ if (!strcmp(keyword, _ipp_jreasons[j]))
+ {
+ jreasons |= 1 << j;
+ break;
+ }
+ }
+ }
+
+ return (jreasons);
+}
+
+
+/*
+ * 'get_notify_event_bits()' - Get the bits associated with "notify-events" values.
+ */
+
+static _ipp_event_t /* O - Bits */
+get_notify_events_bits(
+ ipp_attribute_t *attr) /* I - "notify-events" attribute */
+{
+ int i, j, /* Looping vars */
+ count; /* Number of "notify-events" values */
+ const char *keyword; /* "notify-events" value */
+ _ipp_event_t events = _IPP_EVENT_NONE;
+ /* Bits for "notify-events" values */
+
+
+ count = ippGetCount(attr);
+ for (i = 0; i < count; i ++)
+ {
+ keyword = ippGetString(attr, i, NULL);
+
+ for (j = 0; j < (int)(sizeof(_ipp_events) / sizeof(_ipp_events[0])); j ++)
+ {
+ if (!strcmp(keyword, _ipp_jreasons[j]))
+ {
+ events |= 1 << j;
+ break;
+ }
+ }
+ }
+
+ return (events);
+}
+
+
+/*
+ * 'get_notify_subscribed_event()' - Get the event name.
+ */
+
+static const char * /* O - Event name */
+get_notify_subscribed_event(
+ _ipp_event_t event) /* I - Event bit */
+{
+ int i; /* Looping var */
+ _ipp_event_t mask; /* Current mask */
+
+ for (i = 0, mask = 1; i < (int)(sizeof(_ipp_events) / sizeof(_ipp_events[0])); i ++, mask <<= 1)
+ if (event & mask)
+ return (_ipp_events[i]);
+
+ return ("none");
+}
+
+
+/*
+ * 'get_printer_state_reasons_bits()' - Get the bits associated with "printer-state-reasons" values.
+ */
+
+static _ipp_preason_t /* O - Bits */
+get_printer_state_reasons_bits(
+ ipp_attribute_t *attr) /* I - "printer-state-reasons" bits */
+{
+ int i, j, /* Looping vars */
+ count; /* Number of "printer-state-reasons" values */
+ const char *keyword; /* "printer-state-reasons" value */
+ _ipp_preason_t preasons = _IPP_PREASON_NONE;
+ /* Bits for "printer-state-reasons" values */
+
+
+ count = ippGetCount(attr);
+ for (i = 0; i < count; i ++)
+ {
+ keyword = ippGetString(attr, i, NULL);
+
+ for (j = 0; j < (int)(sizeof(_ipp_preasons) / sizeof(_ipp_preasons[0])); j ++)
+ {
+ if (!strcmp(keyword, _ipp_preasons[j]))
+ {
+ preasons |= 1 << j;
+ break;
+ }
+ }
+ }
+
+ return (preasons);
+}
+
+
+/*
+ * 'html_escape()' - Write a HTML-safe string.
+ */
+
+static void
+html_escape(_ipp_client_t *client, /* I - Client */
+ const char *s, /* I - String to write */
+ size_t slen) /* I - Number of characters to write */
+{
+ const char *start, /* Start of segment */
+ *end; /* End of string */
+
+
+ start = s;
+ end = s + (slen > 0 ? slen : strlen(s));
+
+ while (*s && s < end)
+ {
+ if (*s == '&' || *s == '<')
+ {
+ if (s > start)
+ httpWrite2(client->http, start, (size_t)(s - start));
+
+ if (*s == '&')
+ httpWrite2(client->http, "&amp;", 5);
+ else
+ httpWrite2(client->http, "&lt;", 4);
+
+ start = s + 1;
+ }
+
+ s ++;
+ }
+
+ if (s > start)
+ httpWrite2(client->http, start, (size_t)(s - start));
+}
+
+
+/*
+ * 'html_footer()' - Show the web interface footer.
+ *
+ * This function also writes the trailing 0-length chunk.
+ */
+
+static void
+html_footer(_ipp_client_t *client) /* I - Client */
+{
+ html_printf(client,
+ "</div>\n"
+ "</body>\n"
+ "</html>\n");
+ httpWrite2(client->http, "", 0);
+}
+
+
+/*
+ * 'html_header()' - Show the web interface header and title.
+ */
+
+static void
+html_header(_ipp_client_t *client, /* I - Client */
+ const char *title) /* I - Title */
+{
+ html_printf(client,
+ "<!doctype html>\n"
+ "<html>\n"
+ "<head>\n"
+ "<title>%s</title>\n"
+ "<link rel=\"shortcut icon\" href=\"/icon.png\" type=\"image/png\">\n"
+ "<link rel=\"apple-touch-icon\" href=\"/icon.png\" type=\"image/png\">\n"
+ "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\">\n"
+ "<meta name=\"viewport\" content=\"width=device-width\">\n"
+ "<style>\n"
+ "body { font-family: sans-serif; margin: 0; }\n"
+ "div.body { padding: 0px 10px 10px; }\n"
+ "blockquote { background: #dfd; border-radius: 5px; color: #006; padding: 10px; }\n"
+ "table.form { border-collapse: collapse; margin-top: 10px; width: 100%%; }\n"
+ "table.form td, table.form th { padding: 5px 2px; width: 50%%; }\n"
+ "table.form th { text-align: right; }\n"
+ "table.striped { border-bottom: solid thin black; border-collapse: collapse; width: 100%%; }\n"
+ "table.striped tr:nth-child(even) { background: #fcfcfc; }\n"
+ "table.striped tr:nth-child(odd) { background: #f0f0f0; }\n"
+ "table.striped th { background: white; border-bottom: solid thin black; text-align: left; vertical-align: bottom; }\n"
+ "table.striped td { margin: 0; padding: 5px; vertical-align: top; }\n"
+ "table.nav { border-collapse: collapse; width: 100%%; }\n"
+ "table.nav td { margin: 0; text-align: center; }\n"
+ "td.nav a, td.nav a:active, td.nav a:hover, td.nav a:hover:link, td.nav a:hover:link:visited, td.nav a:link, td.nav a:link:visited, td.nav a:visited { background: inherit; color: inherit; font-size: 80%%; text-decoration: none; }\n"
+ "td.nav { background: #333; color: #fff; padding: 4px 8px; width: 33%%; }\n"
+ "td.nav.sel { background: #fff; color: #000; font-weight: bold; }\n"
+ "td.nav:hover { background: #666; color: #fff; }\n"
+ "td.nav:active { background: #000; color: #ff0; }\n"
+ "</style>\n"
+ "</head>\n"
+ "<body>\n"
+ "<table class=\"nav\"><tr>"
+ "<td class=\"nav%s\"><a href=\"/\">Status</a></td>"
+ "<td class=\"nav%s\"><a href=\"/supplies\">Supplies</a></td>"
+ "<td class=\"nav%s\"><a href=\"/media\">Media</a></td>"
+ "</tr></table>\n"
+ "<div class=\"body\">\n", title, !strcmp(client->uri, "/") ? " sel" : "", !strcmp(client->uri, "/supplies") ? " sel" : "", !strcmp(client->uri, "/media") ? " sel" : "");
+}
+
+
+/*
+ * 'html_printf()' - Send formatted text to the client, quoting as needed.
+ */
+
+static void
+html_printf(_ipp_client_t *client, /* I - Client */
+ const char *format, /* I - Printf-style format string */
+ ...) /* I - Additional arguments as needed */
+{
+ va_list ap; /* Pointer to arguments */
+ const char *start; /* Start of string */
+ char size, /* Size character (h, l, L) */
+ type; /* Format type character */
+ int width, /* Width of field */
+ prec; /* Number of characters of precision */
+ char tformat[100], /* Temporary format string for sprintf() */
+ *tptr, /* Pointer into temporary format */
+ temp[1024]; /* Buffer for formatted numbers */
+ char *s; /* Pointer to string */
+
+
+ /*
+ * Loop through the format string, formatting as needed...
+ */
+
+ va_start(ap, format);
+ start = format;
+
+ while (*format)
+ {
+ if (*format == '%')
+ {
+ if (format > start)
+ httpWrite2(client->http, start, (size_t)(format - start));
+
+ tptr = tformat;
+ *tptr++ = *format++;
+
+ if (*format == '%')
+ {
+ httpWrite2(client->http, "%", 1);
+ format ++;
+ start = format;
+ continue;
+ }
+ else if (strchr(" -+#\'", *format))
+ *tptr++ = *format++;
+
+ if (*format == '*')
+ {
+ /*
+ * Get width from argument...
+ */
+
+ format ++;
+ width = va_arg(ap, int);
+
+ snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width);
+ tptr += strlen(tptr);
+ }
+ else
+ {
+ width = 0;
+
+ while (isdigit(*format & 255))
+ {
+ if (tptr < (tformat + sizeof(tformat) - 1))
+ *tptr++ = *format;
+
+ width = width * 10 + *format++ - '0';
+ }
+ }
+
+ if (*format == '.')
+ {
+ if (tptr < (tformat + sizeof(tformat) - 1))
+ *tptr++ = *format;
+
+ format ++;
+
+ if (*format == '*')
+ {
+ /*
+ * Get precision from argument...
+ */
+
+ format ++;
+ prec = va_arg(ap, int);
+
+ snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec);
+ tptr += strlen(tptr);
+ }
+ else
+ {
+ prec = 0;
+
+ while (isdigit(*format & 255))
+ {
+ if (tptr < (tformat + sizeof(tformat) - 1))
+ *tptr++ = *format;
+
+ prec = prec * 10 + *format++ - '0';
+ }
+ }
+ }
+
+ if (*format == 'l' && format[1] == 'l')
+ {
+ size = 'L';
+
+ if (tptr < (tformat + sizeof(tformat) - 2))
+ {
+ *tptr++ = 'l';
+ *tptr++ = 'l';
+ }
+
+ format += 2;
+ }
+ else if (*format == 'h' || *format == 'l' || *format == 'L')
+ {
+ if (tptr < (tformat + sizeof(tformat) - 1))
+ *tptr++ = *format;
+
+ size = *format++;
+ }
+ else
+ size = 0;
+
+
+ if (!*format)
+ {
+ start = format;
+ break;
+ }
+
+ if (tptr < (tformat + sizeof(tformat) - 1))
+ *tptr++ = *format;
+
+ type = *format++;
+ *tptr = '\0';
+ start = format;
+
+ switch (type)
+ {
+ case 'E' : /* Floating point formats */
+ case 'G' :
+ case 'e' :
+ case 'f' :
+ case 'g' :
+ if ((size_t)(width + 2) > sizeof(temp))
+ break;
+
+ sprintf(temp, tformat, va_arg(ap, double));
+
+ httpWrite2(client->http, temp, strlen(temp));
+ break;
+
+ case 'B' : /* Integer formats */
+ case 'X' :
+ case 'b' :
+ case 'd' :
+ case 'i' :
+ case 'o' :
+ case 'u' :
+ case 'x' :
+ if ((size_t)(width + 2) > sizeof(temp))
+ break;
+
+# ifdef HAVE_LONG_LONG
+ if (size == 'L')
+ sprintf(temp, tformat, va_arg(ap, long long));
+ else
+# endif /* HAVE_LONG_LONG */
+ if (size == 'l')
+ sprintf(temp, tformat, va_arg(ap, long));
+ else
+ sprintf(temp, tformat, va_arg(ap, int));
+
+ httpWrite2(client->http, temp, strlen(temp));
+ break;
+
+ case 'p' : /* Pointer value */
+ if ((size_t)(width + 2) > sizeof(temp))
+ break;
+
+ sprintf(temp, tformat, va_arg(ap, void *));
+
+ httpWrite2(client->http, temp, strlen(temp));
+ break;
+
+ case 'c' : /* Character or character array */
+ if (width <= 1)
+ {
+ temp[0] = (char)va_arg(ap, int);
+ temp[1] = '\0';
+ html_escape(client, temp, 1);
+ }
+ else
+ html_escape(client, va_arg(ap, char *), (size_t)width);
+ break;
+
+ case 's' : /* String */
+ if ((s = va_arg(ap, char *)) == NULL)
+ s = "(null)";
+
+ html_escape(client, s, strlen(s));
+ break;
+ }
+ }
+ else
+ format ++;
+ }
+
+ if (format > start)
+ httpWrite2(client->http, start, (size_t)(format - start));
+
+ va_end(ap);
+}
+
+
+/*
+ * 'ipp_acknowledge_document()' - Acknowledge receipt of a document.
+ */
+
+static void
+ipp_acknowledge_document(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ _ipp_job_t *job; /* Job */
+ ipp_attribute_t *attr; /* Attribute */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+ return;
+ }
+
+ if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "document-number", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(attr) != IPP_TAG_OPERATION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) != 1)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, attr ? "Bad document-number attribute." : "Missing document-number attribute.");
+ return;
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_acknowledge_identify_printer()' - Acknowledge an identify command.
+ */
+
+static void
+ipp_acknowledge_identify_printer(
+ _ipp_client_t *client) /* I - Client */
+{
+ // TODO: Implement this!
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_acknowledge_job()' - Acknowledge receipt of a job.
+ */
+
+static void
+ipp_acknowledge_job(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ _ipp_job_t *job; /* Job */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+ return;
+ }
+
+ if (job->dev_uuid && strcmp(job->dev_uuid, device->uuid))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_AUTHORIZED, "Job not assigned to device.");
+ return;
+ }
+
+ if (!(job->state_reasons & _IPP_JREASON_JOB_FETCHABLE))
+ {
+ respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Job not fetchable.");
+ return;
+ }
+
+ if (!job->dev_uuid)
+ job->dev_uuid = strdup(device->uuid);
+
+ job->state_reasons &= (_ipp_jreason_t)~_IPP_JREASON_JOB_FETCHABLE;
+
+ add_event(client->printer, job, _IPP_EVENT_JOB_STATE_CHANGED, "Job acknowledged.");
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_cancel_job()' - Cancel a job.
+ */
+
+static void
+ipp_cancel_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* Job information */
+
+
+ /*
+ * Get the job...
+ */
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ return;
+ }
+
+ /*
+ * See if the job is already completed, canceled, or aborted; if so,
+ * we can't cancel...
+ */
+
+ switch (job->state)
+ {
+ case IPP_JSTATE_CANCELED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is already canceled - can\'t cancel.", job->id);
+ break;
+
+ case IPP_JSTATE_ABORTED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is already aborted - can\'t cancel.", job->id);
+ break;
+
+ case IPP_JSTATE_COMPLETED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is already completed - can\'t cancel.", job->id);
+ break;
+
+ default :
+ /*
+ * Cancel the job...
+ */
+
+ _cupsRWLockWrite(&(client->printer->rwlock));
+
+ if (job->state == IPP_JSTATE_PROCESSING ||
+ (job->state == IPP_JSTATE_HELD && job->fd >= 0))
+ job->cancel = 1;
+ else
+ {
+ job->state = IPP_JSTATE_CANCELED;
+ job->completed = time(NULL);
+ }
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ add_event(client->printer, job, _IPP_EVENT_JOB_COMPLETED, NULL);
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ break;
+ }
+}
+
+
+/*
+ * 'ipp_cancel_my_jobs()' - Cancel a user's jobs.
+ */
+
+static void
+ipp_cancel_my_jobs(
+ _ipp_client_t *client) /* I - Client */
+{
+ // TODO: Implement this!
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_cancel_subscription()' - Cancel a subscription.
+ */
+
+static void
+ipp_cancel_subscription(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_subscription_t *sub; /* Subscription */
+
+
+ if ((sub = find_subscription(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Subscription was not found.");
+ return;
+ }
+
+ _cupsRWLockWrite(&client->printer->rwlock);
+ cupsArrayRemove(client->printer->subscriptions, sub);
+ delete_subscription(sub);
+ _cupsRWUnlock(&client->printer->rwlock);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_close_job()' - Close an open job.
+ */
+
+static void
+ipp_close_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* Job information */
+
+
+ /*
+ * Get the job...
+ */
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ return;
+ }
+
+ /*
+ * See if the job is already completed, canceled, or aborted; if so,
+ * we can't cancel...
+ */
+
+ switch (job->state)
+ {
+ case IPP_JSTATE_CANCELED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is canceled - can\'t close.", job->id);
+ break;
+
+ case IPP_JSTATE_ABORTED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is aborted - can\'t close.", job->id);
+ break;
+
+ case IPP_JSTATE_COMPLETED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is completed - can\'t close.", job->id);
+ break;
+
+ case IPP_JSTATE_PROCESSING :
+ case IPP_JSTATE_STOPPED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is already closed.", job->id);
+ break;
+
+ default :
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ break;
+ }
+}
+
+
+/*
+ * 'ipp_create_job()' - Create a job object.
+ */
+
+static void
+ipp_create_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* New job */
+ cups_array_t *ra; /* Attributes to send in response */
+
+
+ /*
+ * Validate print job attributes...
+ */
+
+ if (!valid_job_attributes(client))
+ {
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * Do we have a file to print?
+ */
+
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Unexpected document data following request.");
+ return;
+ }
+
+ /*
+ * Create the job...
+ */
+
+ if ((job = create_job(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_TOO_MANY_JOBS, "Too many jobs are queued.");
+ return;
+ }
+
+ /*
+ * Return the job info...
+ */
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+ cupsArrayAdd(ra, "job-id");
+ cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-message");
+ cupsArrayAdd(ra, "job-state-reasons");
+ cupsArrayAdd(ra, "job-uri");
+
+ copy_job_attributes(client, job, ra);
+ cupsArrayDelete(ra);
+
+ /*
+ * Add any subscriptions...
+ */
+
+ client->job = job;
+ ipp_create_xxx_subscriptions(client);
+}
+
+
+/*
+ * 'ipp_create_xxx_subscriptions()' - Create job and printer subscriptions.
+ */
+
+static void
+ipp_create_xxx_subscriptions(
+ _ipp_client_t *client)
+{
+ _ipp_subscription_t *sub; /* Subscription */
+ ipp_attribute_t *attr; /* Subscription attribute */
+ const char *username; /* requesting-user-name or
+ authenticated username */
+ int num_subs = 0, /* Number of subscriptions */
+ ok_subs = 0; /* Number of good subscriptions */
+
+
+ /*
+ * For the Create-xxx-Subscriptions operations, queue up a successful-ok
+ * response...
+ */
+
+ if (ippGetOperation(client->request) == IPP_OP_CREATE_JOB_SUBSCRIPTIONS || ippGetOperation(client->request) == IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS)
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ /*
+ * Get the authenticated user name, if any...
+ */
+
+ if (client->username[0])
+ username = client->username;
+ else if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL && ippGetGroupTag(attr) == IPP_TAG_OPERATION && ippGetCount(attr) == 1)
+ username = ippGetString(attr, 0, NULL);
+ else
+ username = "guest";
+
+ /*
+ * Skip past the initial attributes to the first subscription group.
+ */
+
+ attr = ippFirstAttribute(client->request);
+ while (attr && ippGetGroupTag(attr) != IPP_TAG_SUBSCRIPTION)
+ attr = ippNextAttribute(client->request);
+
+ while (attr)
+ {
+ _ipp_job_t *job = NULL; /* Job */
+ const char *attrname, /* Attribute name */
+ *pullmethod = NULL;
+ /* notify-pull-method */
+ ipp_attribute_t *notify_attributes = NULL,
+ /* notify-attributes */
+ *notify_events = NULL,
+ /* notify-events */
+ *notify_user_data = NULL;
+ /* notify-user-data */
+ int interval = 0, /* notify-time-interval */
+ lease = _IPP_NOTIFY_LEASE_DURATION_DEFAULT;
+ /* notify-lease-duration */
+ ipp_status_t status = IPP_STATUS_OK;
+ /* notify-status-code */
+
+ num_subs ++;
+
+ while (attr)
+ {
+ if ((attrname = ippGetName(attr)) == NULL)
+ break;
+
+ if (!strcmp(attrname, "notify-recipient-uri"))
+ {
+ /*
+ * Push notifications not supported.
+ */
+
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ else if (!strcmp(attrname, "notify-pull-method"))
+ {
+ pullmethod = ippGetString(attr, 0, NULL);
+
+ if (ippGetValueTag(attr) != IPP_TAG_KEYWORD || ippGetCount(attr) != 1 || !pullmethod || strcmp(pullmethod, "ippget"))
+ {
+ ippCopyAttribute(client->response, attr, 0);
+ pullmethod = NULL;
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ }
+ }
+ else if (!strcmp(attrname, "notify-attributes"))
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_KEYWORD)
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+
+ notify_attributes = attr;
+ }
+ else if (!strcmp(attrname, "notify-charset"))
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_CHARSET || ippGetCount(attr) != 1 ||
+ (strcmp(ippGetString(attr, 0, NULL), "us-ascii") && strcmp(ippGetString(attr, 0, NULL), "utf-8")))
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ }
+ else if (!strcmp(attrname, "notify-natural-language"))
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_LANGUAGE || ippGetCount(attr) != 1 || strcmp(ippGetString(attr, 0, NULL), "en"))
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ }
+ else if (!strcmp(attrname, "notify-user-data"))
+ {
+ int datalen; /* Length of data */
+
+ if (ippGetValueTag(attr) != IPP_TAG_STRING || ippGetCount(attr) != 1 || !ippGetOctetString(attr, 0, &datalen) || datalen > 63)
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ else
+ notify_user_data = attr;
+ }
+ else if (!strcmp(attrname, "notify-events"))
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_KEYWORD)
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ else
+ notify_events = attr;
+ }
+ else if (!strcmp(attrname, "notify-lease-duration"))
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) < 0)
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ else
+ lease = ippGetInteger(attr, 0);
+ }
+ else if (!strcmp(attrname, "notify-time-interval"))
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) < 0)
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ else
+ interval = ippGetInteger(attr, 0);
+ }
+ else if (!strcmp(attrname, "notify-job-id"))
+ {
+ if (ippGetOperation(client->request) != IPP_OP_CREATE_JOB_SUBSCRIPTIONS || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 1)
+ {
+ status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ else if ((job = find_job(client, ippGetInteger(attr, 0))) == NULL)
+ {
+ status = IPP_STATUS_ERROR_NOT_FOUND;
+ ippCopyAttribute(client->response, attr, 0);
+ }
+ }
+
+ attr = ippNextAttribute(client->request);
+ }
+
+ if (status)
+ {
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", status);
+ }
+ else if (!pullmethod)
+ {
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", IPP_STATUS_ERROR_BAD_REQUEST);
+ }
+ else
+ {
+ switch (ippGetOperation(client->request))
+ {
+ case IPP_OP_PRINT_JOB :
+ case IPP_OP_PRINT_URI :
+ case IPP_OP_CREATE_JOB :
+ job = client->job;
+ break;
+
+ default :
+ break;
+ }
+
+ if ((sub = create_subscription(client->printer, job, interval, lease, username, notify_events, notify_attributes, notify_user_data)) == NULL)
+ {
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-subscription-id", sub->id);
+ ok_subs ++;
+ }
+ else
+ ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", IPP_STATUS_ERROR_INTERNAL);
+ }
+ }
+
+ if (ok_subs == 0)
+ ippSetStatusCode(client->response, IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS);
+ else if (ok_subs != num_subs)
+ ippSetStatusCode(client->response, IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS);
+}
+
+
+/*
+ * 'ipp_deregister_output_device()' - Unregister an output device.
+ */
+
+static void
+ipp_deregister_output_device(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+
+
+ /*
+ * Find the device...
+ */
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Output device not found.");
+ return;
+ }
+
+ /*
+ * Remove the device from the printer...
+ */
+
+ _cupsRWLockWrite(&client->printer->rwlock);
+
+ cupsArrayRemove(client->printer->devices, device);
+
+ update_device_attributes_no_lock(client->printer);
+ update_device_state_no_lock(client->printer);
+
+ _cupsRWUnlock(&client->printer->rwlock);
+
+ /*
+ * Delete the device...
+ */
+
+ delete_device(device);
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_fetch_document()' - Download a document.
+ */
+
+static void
+ipp_fetch_document(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ _ipp_job_t *job; /* Job */
+ ipp_attribute_t *attr; /* Attribute */
+ int compression; /* compression */
+ char filename[1024]; /* Job filename */
+ const char *format; /* document-format */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+ return;
+ }
+
+ if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "document-number", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(attr) != IPP_TAG_OPERATION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) != 1)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, attr ? "Bad document-number attribute." : "Missing document-number attribute.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "compression-accepted", IPP_TAG_KEYWORD)) != NULL)
+ compression = !strcmp(ippGetString(attr, 0, NULL), "gzip");
+ else
+ compression = 0;
+
+ if ((attr = ippFindAttribute(client->request, "document-format-accepted", IPP_TAG_MIMETYPE)) != NULL)
+ {
+ int i, /* Looping var */
+ count = ippGetCount(attr); /* Number of values */
+
+
+ for (i = 0; i < count; i ++)
+ {
+ format = ippGetString(attr, i, NULL);
+
+ create_job_filename(client->printer, job, NULL, filename, sizeof(filename));
+
+ if (!access(filename, R_OK))
+ break;
+ }
+
+ if (i >= count)
+ {
+ respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Document not available in requested format.");
+ return;
+ }
+ }
+ else if ((attr = ippFindAttribute(job->attrs, "document-format", IPP_TAG_MIMETYPE)) != NULL)
+ format = ippGetString(attr, 0, NULL);
+ else
+ {
+ respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Document format unknown.");
+ return;
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format);
+ ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "compression", NULL, compression ? "gzip" : "none");
+
+ client->fetch_file = open(filename, O_RDONLY);
+}
+
+
+/*
+ * 'ipp_fetch_job()' - Download a job.
+ */
+
+static void
+ipp_fetch_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ _ipp_job_t *job; /* Job */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+ return;
+ }
+
+ if (job->dev_uuid && strcmp(job->dev_uuid, device->uuid))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+ return;
+ }
+
+ if (!(job->state_reasons & _IPP_JREASON_JOB_FETCHABLE))
+ {
+ respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Job not fetchable.");
+ return;
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ copy_attributes(client->response, job->attrs, NULL, IPP_TAG_JOB, 0);
+}
+
+
+/*
+ * 'ipp_get_document_attributes()' - Get the attributes for a document object.
+ *
+ * Note: This implementation only supports single document jobs so we
+ * synthesize the information for a single document from the job.
+ */
+
+static void
+ipp_get_document_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ // TODO: Implement this!
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_get_documents()' - Get the list of documents in a job.
+ *
+ * Note: This implementation only supports single document jobs so we
+ * synthesize the information for a single document from the job.
+ */
+
+static void
+ipp_get_documents(_ipp_client_t *client)/* I - Client */
+{
+ // TODO: Implement this!
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_get_job_attributes()' - Get the attributes for a job object.
+ */
+
+static void
+ipp_get_job_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* Job */
+ cups_array_t *ra; /* requested-attributes */
+
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job not found.");
+ return;
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ ra = ippCreateRequestedArray(client->request);
+ copy_job_attributes(client, job, ra);
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_jobs()' - Get a list of job objects.
+ */
+
+static void
+ipp_get_jobs(_ipp_client_t *client) /* I - Client */
+{
+ ipp_attribute_t *attr; /* Current attribute */
+ const char *which_jobs = NULL;
+ /* which-jobs values */
+ int job_comparison; /* Job comparison */
+ ipp_jstate_t job_state; /* job-state value */
+ int first_job_id, /* First job ID */
+ limit, /* Maximum number of jobs to return */
+ count; /* Number of jobs that match */
+ const char *username; /* Username */
+ _ipp_job_t *job; /* Current job pointer */
+ cups_array_t *ra; /* Requested attributes array */
+
+
+ /*
+ * See if the "which-jobs" attribute have been specified...
+ */
+
+ if ((attr = ippFindAttribute(client->request, "which-jobs",
+ IPP_TAG_KEYWORD)) != NULL)
+ {
+ which_jobs = ippGetString(attr, 0, NULL);
+ fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->hostname, which_jobs);
+ }
+
+ if (!which_jobs || !strcmp(which_jobs, "not-completed"))
+ {
+ job_comparison = -1;
+ job_state = IPP_JSTATE_STOPPED;
+ }
+ else if (!strcmp(which_jobs, "completed"))
+ {
+ job_comparison = 1;
+ job_state = IPP_JSTATE_CANCELED;
+ }
+ else if (!strcmp(which_jobs, "aborted"))
+ {
+ job_comparison = 0;
+ job_state = IPP_JSTATE_ABORTED;
+ }
+ else if (!strcmp(which_jobs, "all"))
+ {
+ job_comparison = 1;
+ job_state = IPP_JSTATE_PENDING;
+ }
+ else if (!strcmp(which_jobs, "canceled"))
+ {
+ job_comparison = 0;
+ job_state = IPP_JSTATE_CANCELED;
+ }
+ else if (!strcmp(which_jobs, "pending"))
+ {
+ job_comparison = 0;
+ job_state = IPP_JSTATE_PENDING;
+ }
+ else if (!strcmp(which_jobs, "pending-held"))
+ {
+ job_comparison = 0;
+ job_state = IPP_JSTATE_HELD;
+ }
+ else if (!strcmp(which_jobs, "processing"))
+ {
+ job_comparison = 0;
+ job_state = IPP_JSTATE_PROCESSING;
+ }
+ else if (!strcmp(which_jobs, "processing-stopped"))
+ {
+ job_comparison = 0;
+ job_state = IPP_JSTATE_STOPPED;
+ }
+ else
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,
+ "The which-jobs value \"%s\" is not supported.", which_jobs);
+ ippAddString(client->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD,
+ "which-jobs", NULL, which_jobs);
+ return;
+ }
+
+ /*
+ * See if they want to limit the number of jobs reported...
+ */
+
+ if ((attr = ippFindAttribute(client->request, "limit",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ limit = ippGetInteger(attr, 0);
+
+ fprintf(stderr, "%s Get-Jobs limit=%d", client->hostname, limit);
+ }
+ else
+ limit = 0;
+
+ if ((attr = ippFindAttribute(client->request, "first-job-id",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ first_job_id = ippGetInteger(attr, 0);
+
+ fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->hostname,
+ first_job_id);
+ }
+ else
+ first_job_id = 1;
+
+ /*
+ * See if we only want to see jobs for a specific user...
+ */
+
+ username = NULL;
+
+ if ((attr = ippFindAttribute(client->request, "my-jobs",
+ IPP_TAG_BOOLEAN)) != NULL)
+ {
+ int my_jobs = ippGetBoolean(attr, 0);
+
+ fprintf(stderr, "%s Get-Jobs my-jobs=%s\n", client->hostname,
+ my_jobs ? "true" : "false");
+
+ if (my_jobs)
+ {
+ if ((attr = ippFindAttribute(client->request, "requesting-user-name",
+ IPP_TAG_NAME)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Need requesting-user-name with my-jobs.");
+ return;
+ }
+
+ username = ippGetString(attr, 0, NULL);
+
+ fprintf(stderr, "%s Get-Jobs requesting-user-name=\"%s\"\n",
+ client->hostname, username);
+ }
+ }
+
+ /*
+ * OK, build a list of jobs for this printer...
+ */
+
+ ra = ippCreateRequestedArray(client->request);
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ _cupsRWLockRead(&(client->printer->rwlock));
+
+ for (count = 0, job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs);
+ (limit <= 0 || count < limit) && job;
+ job = (_ipp_job_t *)cupsArrayNext(client->printer->jobs))
+ {
+ /*
+ * Filter out jobs that don't match...
+ */
+
+ if ((job_comparison < 0 && job->state > job_state) ||
+ (job_comparison == 0 && job->state != job_state) ||
+ (job_comparison > 0 && job->state < job_state) ||
+ job->id < first_job_id ||
+ (username && job->username &&
+ strcasecmp(username, job->username)))
+ continue;
+
+ if (count > 0)
+ ippAddSeparator(client->response);
+
+ count ++;
+ copy_job_attributes(client, job, ra);
+ }
+
+ cupsArrayDelete(ra);
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+}
+
+
+/*
+ * 'ipp_get_notifications()' - Get notification events for one or more subscriptions.
+ */
+
+static void
+ipp_get_notifications(
+ _ipp_client_t *client) /* I - Client */
+{
+ ipp_attribute_t *sub_ids, /* notify-subscription-ids */
+ *seq_nums, /* notify-sequence-numbers */
+ *notify_wait; /* Wait for events? */
+ int i, /* Looping vars */
+ count, /* Number of IDs */
+ first = 1, /* First event? */
+ seq_num; /* Sequence number */
+ _ipp_subscription_t *sub; /* Current subscription */
+ ipp_t *event; /* Current event */
+
+
+ if ((sub_ids = ippFindAttribute(client->request, "notify-subscription-ids", IPP_TAG_INTEGER)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing notify-subscription-ids attribute.");
+ return;
+ }
+
+ count = ippGetCount(sub_ids);
+ seq_nums = ippFindAttribute(client->request, "notify-sequence-numbers", IPP_TAG_INTEGER);
+ notify_wait = ippFindAttribute(client->request, "notify-wait", IPP_TAG_BOOLEAN);
+
+ if (seq_nums && count != ippGetCount(seq_nums))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The notify-subscription-ids and notify-sequence-numbers attributes are different lengths.");
+ return;
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ ippAddInteger(client->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "notify-get-interval", 30);
+
+ for (i = 0; i < count; i ++)
+ {
+ if ((sub = find_subscription(client, ippGetInteger(sub_ids, i))) == NULL)
+ continue;
+
+ seq_num = ippGetInteger(seq_nums, i);
+ if (seq_num < sub->first_sequence)
+ seq_num = sub->first_sequence;
+
+ if (seq_num > sub->last_sequence)
+ continue;
+
+ for (event = (ipp_t *)cupsArrayIndex(sub->events, seq_num - sub->first_sequence);
+ event;
+ event = (ipp_t *)cupsArrayNext(sub->events))
+ {
+ if (first)
+ first = 0;
+ else
+ ippAddSeparator(client->response);
+
+ ippCopyAttributes(client->response, event, 0, NULL, NULL);
+ }
+ }
+}
+
+
+/*
+ * 'ipp_get_output_device_attributes()' - Get attributes for an output device.
+ */
+
+static void
+ipp_get_output_device_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ // TODO: Implement this!
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_get_printer_attributes()' - Get the attributes for a printer object.
+ */
+
+static void
+ipp_get_printer_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ cups_array_t *ra; /* Requested attributes array */
+ _ipp_printer_t *printer; /* Printer */
+
+
+ /*
+ * Send the attributes...
+ */
+
+ ra = ippCreateRequestedArray(client->request);
+ printer = client->printer;
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ _cupsRWLockRead(&(printer->rwlock));
+
+ copy_attributes(client->response, printer->attrs, ra, IPP_TAG_ZERO,
+ IPP_TAG_CUPS_CONST);
+ copy_attributes(client->response, printer->dev_attrs, ra, IPP_TAG_ZERO, IPP_TAG_ZERO);
+
+ if (!ra || cupsArrayFind(ra, "printer-config-change-date-time"))
+ ippAddDate(client->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-config-change-time"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-config-change-time", (int)(printer->config_time - printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-current-time"))
+ ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL)));
+
+
+ if (!ra || cupsArrayFind(ra, "printer-state"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM,
+ "printer-state", printer->state > printer->dev_state ? printer->state : printer->dev_state);
+
+ if (!ra || cupsArrayFind(ra, "printer-state-change-date-time"))
+ ippAddDate(client->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer->state_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-state-change-time"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-state-change-time", (int)(printer->state_time - printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-state-message"))
+ {
+ static const char * const messages[] = { "Idle.", "Printing.", "Stopped." };
+
+ if (printer->state > printer->dev_state)
+ ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->state - IPP_PSTATE_IDLE]);
+ else
+ ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->dev_state - IPP_PSTATE_IDLE]);
+ }
+
+ if (!ra || cupsArrayFind(ra, "printer-state-reasons"))
+ copy_printer_state_reasons(client->response, IPP_TAG_PRINTER, printer);
+
+ if (!ra || cupsArrayFind(ra, "printer-up-time"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "queued-job-count"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "queued-job-count", cupsArrayCount(printer->active_jobs));
+
+ _cupsRWUnlock(&(printer->rwlock));
+
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_printer_supported_values()' - Return the supported values for
+ * the infrastructure printer.
+ */
+
+static void
+ipp_get_printer_supported_values(
+ _ipp_client_t *client) /* I - Client */
+{
+ cups_array_t *ra = ippCreateRequestedArray(client->request);
+ /* Requested attributes */
+
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ copy_attributes(client->response, client->printer->attrs, ra, IPP_TAG_PRINTER, 1);
+
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_subscription_attributes()' - Get attributes for a subscription.
+ */
+
+static void
+ipp_get_subscription_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_subscription_t *sub; /* Subscription */
+ cups_array_t *ra = ippCreateRequestedArray(client->request);
+ /* Requested attributes */
+
+
+ if ((sub = find_subscription(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Subscription was not found.");
+ }
+ else
+ {
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ copy_subscription_attributes(client, sub, ra);
+ }
+
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_subscriptions()' - Get attributes for all subscriptions.
+ */
+
+static void
+ipp_get_subscriptions(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_subscription_t *sub; /* Current subscription */
+ cups_array_t *ra = ippCreateRequestedArray(client->request);
+ /* Requested attributes */
+ int first = 1; /* First time? */
+
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ _cupsRWLockRead(&client->printer->rwlock);
+ for (sub = (_ipp_subscription_t *)cupsArrayFirst(client->printer->subscriptions);
+ sub;
+ sub = (_ipp_subscription_t *)cupsArrayNext(client->printer->subscriptions))
+ {
+ if (first)
+ first = 0;
+ else
+ ippAddSeparator(client->response);
+
+ copy_subscription_attributes(client, sub, ra);
+ }
+
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_identify_printer()' - Beep or display a message.
+ */
+
+static void
+ipp_identify_printer(
+ _ipp_client_t *client) /* I - Client */
+{
+ /* TODO: Do something */
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_print_job()' - Create a job object with an attached document.
+ */
+
+static void
+ipp_print_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* New job */
+ char filename[1024], /* Filename buffer */
+ buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes read */
+ cups_array_t *ra; /* Attributes to send in response */
+
+
+ /*
+ * Validate print job attributes...
+ */
+
+ if (!valid_job_attributes(client))
+ {
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * Do we have a file to print?
+ */
+
+ if (httpGetState(client->http) == HTTP_STATE_POST_SEND)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request.");
+ return;
+ }
+
+ /*
+ * Print the job...
+ */
+
+ if ((job = create_job(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+ "Currently printing another job.");
+ return;
+ }
+
+ /*
+ * Create a file for the request data...
+ */
+
+ create_job_filename(client->printer, job, NULL, filename, sizeof(filename));
+
+ if (Verbosity)
+ fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
+
+ if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
+ {
+ job->state = IPP_JSTATE_ABORTED;
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to create print file: %s", strerror(errno));
+ return;
+ }
+
+ while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
+ {
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+ }
+
+ if (bytes < 0)
+ {
+ /*
+ * Got an error while reading the print data, so abort this job.
+ */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to read print file.");
+ return;
+ }
+
+ if (close(job->fd))
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+
+ job->fd = -1;
+ job->filename = strdup(filename);
+ job->state = IPP_JSTATE_PENDING;
+
+ /*
+ * Process the job, if possible...
+ */
+
+ check_jobs(client->printer);
+
+ /*
+ * Return the job info...
+ */
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+ cupsArrayAdd(ra, "job-id");
+ cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-message");
+ cupsArrayAdd(ra, "job-state-reasons");
+ cupsArrayAdd(ra, "job-uri");
+
+ copy_job_attributes(client, job, ra);
+ cupsArrayDelete(ra);
+
+ /*
+ * Process any pending subscriptions...
+ */
+
+ client->job = job;
+ ipp_create_xxx_subscriptions(client);
+}
+
+
+/*
+ * 'ipp_print_uri()' - Create a job object with a referenced document.
+ */
+
+static void
+ipp_print_uri(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* New job */
+ ipp_attribute_t *uri; /* document-uri */
+ char scheme[256], /* URI scheme */
+ userpass[256], /* Username and password info */
+ hostname[256], /* Hostname */
+ resource[1024]; /* Resource path */
+ int port; /* Port number */
+ http_uri_status_t uri_status; /* URI decode status */
+ http_encryption_t encryption; /* Encryption to use, if any */
+ http_t *http; /* Connection for http/https URIs */
+ http_status_t status; /* Access status for http/https URIs */
+ int infile; /* Input file for local file URIs */
+ char filename[1024], /* Filename buffer */
+ buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes read */
+ cups_array_t *ra; /* Attributes to send in response */
+ static const char * const uri_status_strings[] =
+ { /* URI decode errors */
+ "URI too large.",
+ "Bad arguments to function.",
+ "Bad resource in URI.",
+ "Bad port number in URI.",
+ "Bad hostname in URI.",
+ "Bad username in URI.",
+ "Bad scheme in URI.",
+ "Bad/empty URI."
+ };
+
+
+ /*
+ * Validate print job attributes...
+ */
+
+ if (!valid_job_attributes(client))
+ {
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * Do we have a file to print?
+ */
+
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Unexpected document data following request.");
+ return;
+ }
+
+ /*
+ * Do we have a document URI?
+ */
+
+ if ((uri = ippFindAttribute(client->request, "document-uri",
+ IPP_TAG_URI)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri.");
+ return;
+ }
+
+ if (ippGetCount(uri) != 1)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Too many document-uri values.");
+ return;
+ }
+
+ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL),
+ scheme, sizeof(scheme), userpass,
+ sizeof(userpass), hostname, sizeof(hostname),
+ &port, resource, sizeof(resource));
+ if (uri_status < HTTP_URI_STATUS_OK)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s",
+ uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
+ return;
+ }
+
+ if (strcmp(scheme, "file") &&
+#ifdef HAVE_SSL
+ strcmp(scheme, "https") &&
+#endif /* HAVE_SSL */
+ strcmp(scheme, "http"))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME,
+ "URI scheme \"%s\" not supported.", scheme);
+ return;
+ }
+
+ if (!strcmp(scheme, "file") && access(resource, R_OK))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
+ return;
+ }
+
+ /*
+ * Print the job...
+ */
+
+ if ((job = create_job(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+ "Currently printing another job.");
+ return;
+ }
+
+ /*
+ * Create a file for the request data...
+ */
+
+ if (!strcasecmp(job->format, "image/jpeg"))
+ snprintf(filename, sizeof(filename), "%s/%d.jpg",
+ client->printer->directory, job->id);
+ else if (!strcasecmp(job->format, "image/png"))
+ snprintf(filename, sizeof(filename), "%s/%d.png",
+ client->printer->directory, job->id);
+ else if (!strcasecmp(job->format, "application/pdf"))
+ snprintf(filename, sizeof(filename), "%s/%d.pdf",
+ client->printer->directory, job->id);
+ else if (!strcasecmp(job->format, "application/postscript"))
+ snprintf(filename, sizeof(filename), "%s/%d.ps",
+ client->printer->directory, job->id);
+ else
+ snprintf(filename, sizeof(filename), "%s/%d.prn",
+ client->printer->directory, job->id);
+
+ if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
+ {
+ job->state = IPP_JSTATE_ABORTED;
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to create print file: %s", strerror(errno));
+ return;
+ }
+
+ if (!strcmp(scheme, "file"))
+ {
+ if ((infile = open(resource, O_RDONLY)) < 0)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
+ return;
+ }
+
+ do
+ {
+ if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 &&
+ (errno == EAGAIN || errno == EINTR))
+ bytes = 1;
+ else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes)
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ close(infile);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+ }
+ while (bytes > 0);
+
+ close(infile);
+ }
+ else
+ {
+#ifdef HAVE_SSL
+ if (port == 443 || !strcmp(scheme, "https"))
+ encryption = HTTP_ENCRYPTION_ALWAYS;
+ else
+#endif /* HAVE_SSL */
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
+
+ if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption,
+ 1, 30000, NULL)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to connect to %s: %s", hostname,
+ cupsLastErrorString());
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ return;
+ }
+
+ httpClearFields(http);
+ httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
+ if (httpGet(http, resource))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", strerror(errno));
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ httpClose(http);
+ return;
+ }
+
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
+
+ if (status != HTTP_STATUS_OK)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", httpStatus(status));
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ httpClose(http);
+ return;
+ }
+
+ while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
+ {
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ httpClose(http);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+ }
+
+ httpClose(http);
+ }
+
+ if (close(job->fd))
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+
+ job->fd = -1;
+ job->filename = strdup(filename);
+ job->state = IPP_JSTATE_PENDING;
+
+ /* TODO: Do something different here - only process if the printer is idle */
+ /*
+ * Process the job...
+ */
+
+ check_jobs(client->printer);
+
+ /*
+ * Return the job info...
+ */
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+ cupsArrayAdd(ra, "job-id");
+ cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-reasons");
+ cupsArrayAdd(ra, "job-uri");
+
+ copy_job_attributes(client, job, ra);
+ cupsArrayDelete(ra);
+
+ /*
+ * Process any pending subscriptions...
+ */
+
+ client->job = job;
+ ipp_create_xxx_subscriptions(client);
+}
+
+
+/*
+ * 'ipp_renew_subscription()' - Renew a subscription.
+ */
+
+static void
+ipp_renew_subscription(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_subscription_t *sub; /* Subscription */
+ ipp_attribute_t *attr; /* notify-lease-duration */
+ int lease; /* Lease duration in seconds */
+
+
+ if ((sub = find_subscription(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Subscription was not found.");
+ return;
+ }
+
+ if (sub->job)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Per-job subscriptions cannot be renewed.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "notify-lease-duration", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetGroupTag(attr) != IPP_TAG_SUBSCRIPTION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) < 0)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "Bad notify-lease-duration.");
+ return;
+ }
+
+ lease = ippGetInteger(attr, 0);
+ }
+ else
+ lease = _IPP_NOTIFY_LEASE_DURATION_DEFAULT;
+
+ sub->lease = lease;
+
+ if (lease)
+ sub->expire = time(NULL) + sub->lease;
+ else
+ sub->expire = INT_MAX;
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_send_document()' - Add an attached document to a job object created with
+ * Create-Job.
+ */
+
+static void
+ipp_send_document(_ipp_client_t *client)/* I - Client */
+{
+ _ipp_job_t *job; /* Job information */
+ char filename[1024], /* Filename buffer */
+ buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes read */
+ ipp_attribute_t *attr; /* Current attribute */
+ cups_array_t *ra; /* Attributes to send in response */
+
+
+ /*
+ * Get the job...
+ */
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * See if we already have a document for this job or the job has already
+ * in a non-pending state...
+ */
+
+ if (job->state > IPP_JSTATE_HELD)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job is not in a pending state.");
+ httpFlush(client->http);
+ return;
+ }
+ else if (job->filename || job->fd >= 0)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
+ "Multiple document jobs are not supported.");
+ httpFlush(client->http);
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "last-document",
+ IPP_TAG_ZERO)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Missing required last-document attribute.");
+ httpFlush(client->http);
+ return;
+ }
+ else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 ||
+ !ippGetBoolean(attr, 0))
+ {
+ respond_unsupported(client, attr);
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * Validate document attributes...
+ */
+
+ if (!valid_doc_attributes(client))
+ {
+ httpFlush(client->http);
+ return;
+ }
+
+ copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
+
+ /*
+ * Get the document format for the job...
+ */
+
+ _cupsRWLockWrite(&(client->printer->rwlock));
+
+ if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else
+ job->format = "application/octet-stream";
+
+ /*
+ * Create a file for the request data...
+ */
+
+ create_job_filename(client->printer, job, NULL, filename, sizeof(filename));
+
+ if (Verbosity)
+ fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
+
+ job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ if (job->fd < 0)
+ {
+ job->state = IPP_JSTATE_ABORTED;
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to create print file: %s", strerror(errno));
+ return;
+ }
+
+ while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
+ {
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+ }
+
+ if (bytes < 0)
+ {
+ /*
+ * Got an error while reading the print data, so abort this job.
+ */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to read print file.");
+ return;
+ }
+
+ if (close(job->fd))
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+
+ _cupsRWLockWrite(&(client->printer->rwlock));
+
+ job->fd = -1;
+ job->filename = strdup(filename);
+ job->state = IPP_JSTATE_PENDING;
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ /*
+ * Process the job, if possible...
+ */
+
+ check_jobs(client->printer);
+
+ /*
+ * Return the job info...
+ */
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+ cupsArrayAdd(ra, "job-id");
+ cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-reasons");
+ cupsArrayAdd(ra, "job-uri");
+
+ copy_job_attributes(client, job, ra);
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_send_uri()' - Add a referenced document to a job object created with
+ * Create-Job.
+ */
+
+static void
+ipp_send_uri(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* Job information */
+ ipp_attribute_t *uri; /* document-uri */
+ char scheme[256], /* URI scheme */
+ userpass[256], /* Username and password info */
+ hostname[256], /* Hostname */
+ resource[1024]; /* Resource path */
+ int port; /* Port number */
+ http_uri_status_t uri_status; /* URI decode status */
+ http_encryption_t encryption; /* Encryption to use, if any */
+ http_t *http; /* Connection for http/https URIs */
+ http_status_t status; /* Access status for http/https URIs */
+ int infile; /* Input file for local file URIs */
+ char filename[1024], /* Filename buffer */
+ buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes read */
+ ipp_attribute_t *attr; /* Current attribute */
+ cups_array_t *ra; /* Attributes to send in response */
+ static const char * const uri_status_strings[] =
+ { /* URI decode errors */
+ "URI too large.",
+ "Bad arguments to function.",
+ "Bad resource in URI.",
+ "Bad port number in URI.",
+ "Bad hostname in URI.",
+ "Bad username in URI.",
+ "Bad scheme in URI.",
+ "Bad/empty URI."
+ };
+
+
+ /*
+ * Get the job...
+ */
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * See if we already have a document for this job or the job has already
+ * in a non-pending state...
+ */
+
+ if (job->state > IPP_JSTATE_HELD)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job is not in a pending state.");
+ httpFlush(client->http);
+ return;
+ }
+ else if (job->filename || job->fd >= 0)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
+ "Multiple document jobs are not supported.");
+ httpFlush(client->http);
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "last-document",
+ IPP_TAG_ZERO)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Missing required last-document attribute.");
+ httpFlush(client->http);
+ return;
+ }
+ else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 ||
+ !ippGetBoolean(attr, 0))
+ {
+ respond_unsupported(client, attr);
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * Validate document attributes...
+ */
+
+ if (!valid_doc_attributes(client))
+ {
+ httpFlush(client->http);
+ return;
+ }
+
+ /*
+ * Do we have a file to print?
+ */
+
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Unexpected document data following request.");
+ return;
+ }
+
+ /*
+ * Do we have a document URI?
+ */
+
+ if ((uri = ippFindAttribute(client->request, "document-uri",
+ IPP_TAG_URI)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri.");
+ return;
+ }
+
+ if (ippGetCount(uri) != 1)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Too many document-uri values.");
+ return;
+ }
+
+ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL),
+ scheme, sizeof(scheme), userpass,
+ sizeof(userpass), hostname, sizeof(hostname),
+ &port, resource, sizeof(resource));
+ if (uri_status < HTTP_URI_STATUS_OK)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s",
+ uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
+ return;
+ }
+
+ if (strcmp(scheme, "file") &&
+#ifdef HAVE_SSL
+ strcmp(scheme, "https") &&
+#endif /* HAVE_SSL */
+ strcmp(scheme, "http"))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME,
+ "URI scheme \"%s\" not supported.", scheme);
+ return;
+ }
+
+ if (!strcmp(scheme, "file") && access(resource, R_OK))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
+ return;
+ }
+
+ /*
+ * Get the document format for the job...
+ */
+
+ _cupsRWLockWrite(&(client->printer->rwlock));
+
+ if ((attr = ippFindAttribute(job->attrs, "document-format",
+ IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else
+ job->format = "application/octet-stream";
+
+ /*
+ * Create a file for the request data...
+ */
+
+ if (!strcasecmp(job->format, "image/jpeg"))
+ snprintf(filename, sizeof(filename), "%s/%d.jpg",
+ client->printer->directory, job->id);
+ else if (!strcasecmp(job->format, "image/png"))
+ snprintf(filename, sizeof(filename), "%s/%d.png",
+ client->printer->directory, job->id);
+ else if (!strcasecmp(job->format, "application/pdf"))
+ snprintf(filename, sizeof(filename), "%s/%d.pdf",
+ client->printer->directory, job->id);
+ else if (!strcasecmp(job->format, "application/postscript"))
+ snprintf(filename, sizeof(filename), "%s/%d.ps",
+ client->printer->directory, job->id);
+ else
+ snprintf(filename, sizeof(filename), "%s/%d.prn",
+ client->printer->directory, job->id);
+
+ job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ if (job->fd < 0)
+ {
+ job->state = IPP_JSTATE_ABORTED;
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to create print file: %s", strerror(errno));
+ return;
+ }
+
+ if (!strcmp(scheme, "file"))
+ {
+ if ((infile = open(resource, O_RDONLY)) < 0)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
+ return;
+ }
+
+ do
+ {
+ if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 &&
+ (errno == EAGAIN || errno == EINTR))
+ bytes = 1;
+ else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes)
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ close(infile);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+ }
+ while (bytes > 0);
+
+ close(infile);
+ }
+ else
+ {
+#ifdef HAVE_SSL
+ if (port == 443 || !strcmp(scheme, "https"))
+ encryption = HTTP_ENCRYPTION_ALWAYS;
+ else
+#endif /* HAVE_SSL */
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
+
+ if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption,
+ 1, 30000, NULL)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to connect to %s: %s", hostname,
+ cupsLastErrorString());
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ return;
+ }
+
+ httpClearFields(http);
+ httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
+ if (httpGet(http, resource))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", strerror(errno));
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ httpClose(http);
+ return;
+ }
+
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
+
+ if (status != HTTP_STATUS_OK)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", httpStatus(status));
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ httpClose(http);
+ return;
+ }
+
+ while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
+ {
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+
+ close(job->fd);
+ job->fd = -1;
+
+ unlink(filename);
+ httpClose(http);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+ }
+
+ httpClose(http);
+ }
+
+ if (close(job->fd))
+ {
+ int error = errno; /* Write error */
+
+ job->state = IPP_JSTATE_ABORTED;
+ job->fd = -1;
+
+ unlink(filename);
+
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
+ return;
+ }
+
+ _cupsRWLockWrite(&(client->printer->rwlock));
+
+ job->fd = -1;
+ job->filename = strdup(filename);
+ job->state = IPP_JSTATE_PENDING;
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+
+ /*
+ * Process the job, if possible...
+ */
+
+ check_jobs(client->printer);
+
+ /*
+ * Return the job info...
+ */
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+ cupsArrayAdd(ra, "job-id");
+ cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-reasons");
+ cupsArrayAdd(ra, "job-uri");
+
+ copy_job_attributes(client, job, ra);
+ cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_update_active_jobs()' - Update the list of active jobs.
+ */
+
+static void
+ipp_update_active_jobs(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Output device */
+ _ipp_job_t *job; /* Job */
+ ipp_attribute_t *job_ids, /* job-ids */
+ *job_states; /* output-device-job-states */
+ int i, /* Looping var */
+ count, /* Number of values */
+ num_different = 0,
+ /* Number of jobs with different states */
+ different[1000],/* Jobs with different states */
+ num_unsupported = 0,
+ /* Number of unsupported job-ids */
+ unsupported[1000];
+ /* Unsupported job-ids */
+ ipp_jstate_t states[1000]; /* Different job state values */
+
+
+ /*
+ * Process the job-ids and output-device-job-states values...
+ */
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job_ids = ippFindAttribute(client->request, "job-ids", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(job_ids) != IPP_TAG_OPERATION || ippGetValueTag(job_ids) != IPP_TAG_INTEGER)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, job_ids ? "Bad job-ids attribute." : "Missing required job-ids attribute.");
+ return;
+ }
+
+ if ((job_states = ippFindAttribute(client->request, "output-device-job-states", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(job_states) != IPP_TAG_OPERATION || ippGetValueTag(job_states) != IPP_TAG_ENUM)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, job_ids ? "Bad output-device-job-states attribute." : "Missing required output-device-job-states attribute.");
+ return;
+ }
+
+ count = ippGetCount(job_ids);
+ if (count != ippGetCount(job_states))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The job-ids and output-device-job-states attributes do not have the same number of values.");
+ return;
+ }
+
+ for (i = 0; i < count; i ++)
+ {
+ if ((job = find_job(client, ippGetInteger(job_ids, i))) == NULL || !job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+ {
+ if (num_unsupported < 1000)
+ unsupported[num_unsupported ++] = ippGetInteger(job_ids, i);
+ }
+ else
+ {
+ ipp_jstate_t state = (ipp_jstate_t)ippGetInteger(job_states, i);
+
+ if (job->state >= IPP_JSTATE_STOPPED && state != job->state)
+ {
+ if (num_different < 1000)
+ {
+ different[num_different] = job->id;
+ states[num_different ++] = job->state;
+ }
+ }
+ else
+ job->dev_state = state;
+ }
+ }
+
+ /*
+ * Then look for jobs assigned to the device but not listed...
+ */
+
+ for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs);
+ job && num_different < 1000;
+ job = (_ipp_job_t *)cupsArrayNext(client->printer->jobs))
+ {
+ if (job->dev_uuid && !strcmp(job->dev_uuid, device->uuid) && !ippContainsInteger(job_ids, job->id))
+ {
+ different[num_different] = job->id;
+ states[num_different ++] = job->state;
+ }
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ if (num_different > 0)
+ {
+ ippAddIntegers(client->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-ids", num_different, different);
+ ippAddIntegers(client->response, IPP_TAG_OPERATION, IPP_TAG_ENUM, "output-device-job-states", num_different, (int *)states);
+ }
+
+ if (num_unsupported > 0)
+ {
+ ippAddIntegers(client->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "job-ids", num_unsupported, unsupported);
+ }
+}
+
+
+/*
+ * 'ipp_update_document_status()' - Update the state of a document.
+ */
+
+static void
+ipp_update_document_status(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ _ipp_job_t *job; /* Job */
+ ipp_attribute_t *attr; /* Attribute */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+ return;
+ }
+
+ if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "document-number", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(attr) != IPP_TAG_OPERATION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) != 1)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, attr ? "Bad document-number attribute." : "Missing document-number attribute.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "impressions-completed", IPP_TAG_INTEGER)) != NULL)
+ {
+ job->impcompleted = ippGetInteger(attr, 0);
+ add_event(client->printer, job, _IPP_EVENT_JOB_PROGRESS, NULL);
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_update_job_status()' - Update the state of a job.
+ */
+
+static void
+ipp_update_job_status(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ _ipp_job_t *job; /* Job */
+ ipp_attribute_t *attr; /* Attribute */
+ _ipp_event_t events = _IPP_EVENT_NONE;
+ /* Event(s) */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+ return;
+ }
+
+ if ((job = find_job(client, 0)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+ return;
+ }
+
+ if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+ return;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "job-impressions-completed", IPP_TAG_INTEGER)) != NULL)
+ {
+ job->impcompleted = ippGetInteger(attr, 0);
+ events |= _IPP_EVENT_JOB_PROGRESS;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "output-device-job-state", IPP_TAG_ENUM)) != NULL)
+ {
+ job->dev_state = (ipp_jstate_t)ippGetInteger(attr, 0);
+ events |= _IPP_EVENT_JOB_STATE_CHANGED;
+ }
+
+ if ((attr = ippFindAttribute(client->request, "output-device-job-state-reasons", IPP_TAG_KEYWORD)) != NULL)
+ {
+ job->dev_state_reasons = get_job_state_reasons_bits(attr);
+ events |= _IPP_EVENT_JOB_STATE_CHANGED;
+ }
+
+ if (events)
+ add_event(client->printer, job, events, NULL);
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_update_output_device_attributes()' - Update the values for an output device.
+ */
+
+static void
+ipp_update_output_device_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ _ipp_device_t *device; /* Device */
+ ipp_attribute_t *attr, /* Current attribute */
+ *dev_attr; /* Device attribute */
+ _ipp_event_t events = _IPP_EVENT_NONE;
+ /* Config/state changed? */
+
+
+ if ((device = find_device(client)) == NULL)
+ {
+ if ((device = create_device(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Unable to add output device.");
+ return;
+ }
+ }
+
+ _cupsRWLockWrite(&device->rwlock);
+
+ attr = ippFirstAttribute(client->request);
+ while (attr && ippGetGroupTag(attr) != IPP_TAG_PRINTER)
+ attr = ippNextAttribute(client->request);
+
+ for (; attr; attr = ippNextAttribute(client->request))
+ {
+ const char *attrname = ippGetName(attr),
+ /* Attribute name */
+ *dotptr; /* Pointer to dot in name */
+
+ /*
+ * Skip attributes we don't care about...
+ */
+
+ if (!attrname)
+ continue;
+
+ if (strncmp(attrname, "copies", 6) && strncmp(attrname, "document-format", 15) && strncmp(attrname, "finishings", 10) && strncmp(attrname, "media", 5) && strncmp(attrname, "print-", 6) && strncmp(attrname, "sides", 5) && strncmp(attrname, "printer-alert", 13) && strncmp(attrname, "printer-input", 13) && strncmp(attrname, "printer-output", 14) && strncmp(attrname, "printer-resolution", 18) && strncmp(attrname, "pwg-raster", 10) && strncmp(attrname, "urf-", 4))
+ continue;
+
+ if (strncmp(attrname, "printer-alert", 13) || strncmp(attrname, "printer-state", 13))
+ events |= _IPP_EVENT_PRINTER_CONFIG_CHANGED;
+ else
+ events |= _IPP_EVENT_PRINTER_STATE_CHANGED;
+
+ if (!strcmp(attrname, "media-col-ready") || !strcmp(attrname, "media-ready"))
+ events |= _IPP_EVENT_PRINTER_MEDIA_CHANGED;
+
+ if (!strcmp(attrname, "finishings-col-ready") || !strcmp(attrname, "finishings-ready"))
+ events |= _IPP_EVENT_PRINTER_FINISHINGS_CHANGED;
+
+ if ((dotptr = strrchr(attrname, '.')) != NULL && isdigit(dotptr[1] & 255))
+ {
+#if 0
+ /*
+ * Sparse representation: name.NNN or name.NNN-NNN
+ */
+
+ char temp[256], /* Temporary name string */
+ *tempptr; /* Pointer into temporary string */
+ int low, high; /* Low and high numbers in range */
+
+ low = (int)strtol(dotptr + 1, (char **)&dotptr, 10);
+ if (dotptr && *dotptr == '-')
+ high = (int)strtol(dotptr + 1, NULL, 10);
+ else
+ high = low;
+
+ strlcpy(temp, attrname, sizeof(temp));
+ if ((tempptr = strrchr(temp, '.')) != NULL)
+ *tempptr = '\0';
+
+ if ((dev_attr = ippFindAttribute(device->attrs, temp, IPP_TAG_ZERO)) != NULL)
+ {
+ }
+ else
+#endif /* 0 */
+ respond_unsupported(client, attr);
+ }
+ else
+ {
+ /*
+ * Regular representation - replace or delete current attribute,
+ * if any...
+ */
+
+ if ((dev_attr = ippFindAttribute(device->attrs, attrname, IPP_TAG_ZERO)) != NULL)
+ ippDeleteAttribute(device->attrs, dev_attr);
+
+ if (ippGetValueTag(attr) != IPP_TAG_DELETEATTR)
+ ippCopyAttribute(device->attrs, attr, 0);
+ }
+ }
+
+ _cupsRWUnlock(&device->rwlock);
+
+ if (events)
+ {
+ _cupsRWLockWrite(&client->printer->rwlock);
+ if (events & _IPP_EVENT_PRINTER_CONFIG_CHANGED)
+ update_device_attributes_no_lock(client->printer);
+ if (events & _IPP_EVENT_PRINTER_STATE_CHANGED)
+ update_device_state_no_lock(client->printer);
+ _cupsRWUnlock(&client->printer->rwlock);
+
+ add_event(client->printer, NULL, events, NULL);
+ }
+}
+
+
+/*
+ * 'ipp_validate_document()' - Validate document creation attributes.
+ */
+
+static void
+ipp_validate_document(
+ _ipp_client_t *client) /* I - Client */
+{
+ if (valid_doc_attributes(client))
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_validate_job()' - Validate job creation attributes.
+ */
+
+static void
+ipp_validate_job(_ipp_client_t *client) /* I - Client */
+{
+ if (valid_job_attributes(client))
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+#if 0
+/*
+ * 'parse_options()' - Parse URL options into CUPS options.
+ *
+ * The client->options string is destroyed by this function.
+ */
+
+static int /* O - Number of options */
+parse_options(_ipp_client_t *client, /* I - Client */
+ cups_option_t **options) /* O - Options */
+{
+ char *name, /* Name */
+ *value, /* Value */
+ *next; /* Next name=value pair */
+ int num_options = 0; /* Number of options */
+
+
+ *options = NULL;
+
+ for (name = client->options; name && *name; name = next)
+ {
+ if ((value = strchr(name, '=')) == NULL)
+ break;
+
+ *value++ = '\0';
+ if ((next = strchr(value, '&')) != NULL)
+ *next++ = '\0';
+
+ num_options = cupsAddOption(name, value, num_options, options);
+ }
+
+ return (num_options);
+}
+#endif /* 0 */
+
+
+/*
+ * 'process_client()' - Process client requests on a thread.
+ */
+
+static void * /* O - Exit status */
+process_client(_ipp_client_t *client) /* I - Client */
+{
+ /*
+ * Loop until we are out of requests or timeout (30 seconds)...
+ */
+
+#ifdef HAVE_SSL
+ int first_time = 1; /* First time request? */
+#endif /* HAVE_SSL */
+
+ while (httpWait(client->http, 30000))
+ {
+#ifdef HAVE_SSL
+ if (first_time)
+ {
+ /*
+ * See if we need to negotiate a TLS connection...
+ */
+
+ char buf[1]; /* First byte from client */
+
+ if (recv(httpGetFd(client->http), buf, 1, MSG_PEEK) == 1 && (!buf[0] || !strchr("DGHOPT", buf[0])))
+ {
+ fprintf(stderr, "%s Starting HTTPS session.\n", client->hostname);
+
+ if (httpEncryption(client->http, HTTP_ENCRYPTION_ALWAYS))
+ {
+ fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString());
+ break;
+ }
+
+ fprintf(stderr, "%s Connection now encrypted.\n", client->hostname);
+ }
+
+ first_time = 0;
+ }
+#endif /* HAVE_SSL */
+
+ if (!process_http(client))
+ break;
+ }
+
+ /*
+ * Close the conection to the client and return...
+ */
+
+ delete_client(client);
+
+ return (NULL);
+}
+
+
+/*
+ * 'process_http()' - Process a HTTP request.
+ */
+
+int /* O - 1 on success, 0 on failure */
+process_http(_ipp_client_t *client) /* I - Client connection */
+{
+ char uri[1024]; /* URI */
+ http_state_t http_state; /* HTTP state */
+ http_status_t http_status; /* HTTP status */
+ ipp_state_t ipp_state; /* State of IPP transfer */
+ char scheme[32], /* Method/scheme */
+ userpass[128], /* Username:password */
+ hostname[HTTP_MAX_HOST];
+ /* Hostname */
+ int port; /* Port number */
+ const char *encoding; /* Content-Encoding value */
+ static const char * const http_states[] =
+ { /* Strings for logging HTTP method */
+ "WAITING",
+ "OPTIONS",
+ "GET",
+ "GET_SEND",
+ "HEAD",
+ "POST",
+ "POST_RECV",
+ "POST_SEND",
+ "PUT",
+ "PUT_RECV",
+ "DELETE",
+ "TRACE",
+ "CONNECT",
+ "STATUS",
+ "UNKNOWN_METHOD",
+ "UNKNOWN_VERSION"
+ };
+
+
+ /*
+ * Clear state variables...
+ */
+
+ ippDelete(client->request);
+ ippDelete(client->response);
+
+ client->request = NULL;
+ client->response = NULL;
+ client->operation = HTTP_STATE_WAITING;
+
+ /*
+ * Read a request from the connection...
+ */
+
+ while ((http_state = httpReadRequest(client->http, uri,
+ sizeof(uri))) == HTTP_STATE_WAITING)
+ usleep(1);
+
+ /*
+ * Parse the request line...
+ */
+
+ if (http_state == HTTP_STATE_ERROR)
+ {
+ if (httpError(client->http) == EPIPE)
+ fprintf(stderr, "%s Client closed connection.\n", client->hostname);
+ else
+ fprintf(stderr, "%s Bad request line (%s).\n", client->hostname,
+ strerror(httpError(client->http)));
+
+ return (0);
+ }
+ else if (http_state == HTTP_STATE_UNKNOWN_METHOD)
+ {
+ fprintf(stderr, "%s Bad/unknown operation.\n", client->hostname);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+ else if (http_state == HTTP_STATE_UNKNOWN_VERSION)
+ {
+ fprintf(stderr, "%s Bad HTTP version.\n", client->hostname);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+
+ fprintf(stderr, "%s %s %s\n", client->hostname, http_states[http_state],
+ uri);
+
+ /*
+ * Separate the URI into its components...
+ */
+
+ if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme),
+ userpass, sizeof(userpass),
+ hostname, sizeof(hostname), &port,
+ client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK &&
+ (http_state != HTTP_STATE_OPTIONS || strcmp(uri, "*")))
+ {
+ fprintf(stderr, "%s Bad URI \"%s\".\n", client->hostname, uri);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+
+ if ((client->options = strchr(client->uri, '?')) != NULL)
+ *(client->options)++ = '\0';
+
+ /*
+ * Process the request...
+ */
+
+ client->start = time(NULL);
+ client->operation = httpGetState(client->http);
+
+ /*
+ * Parse incoming parameters until the status changes...
+ */
+
+ while ((http_status = httpUpdate(client->http)) == HTTP_STATUS_CONTINUE);
+
+ if (http_status != HTTP_STATUS_OK)
+ {
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+
+ if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] &&
+ httpGetVersion(client->http) >= HTTP_VERSION_1_1)
+ {
+ /*
+ * HTTP/1.1 and higher require the "Host:" field...
+ */
+
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+
+ /*
+ * Handle HTTP Upgrade...
+ */
+
+ if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION),
+ "Upgrade"))
+ {
+#ifdef HAVE_SSL
+ if (strstr(httpGetField(client->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(client->http))
+ {
+ if (!respond_http(client, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, NULL, 0))
+ return (0);
+
+ fprintf(stderr, "%s Upgrading to encrypted connection.\n", client->hostname);
+
+ if (httpEncryption(client->http, HTTP_ENCRYPTION_REQUIRED))
+ {
+ fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString());
+ return (0);
+ }
+
+ fprintf(stderr, "%s Connection now encrypted.\n", client->hostname);
+ }
+ else
+#endif /* HAVE_SSL */
+
+ if (!respond_http(client, HTTP_STATUS_NOT_IMPLEMENTED, NULL, NULL, 0))
+ return (0);
+ }
+
+ /*
+ * Handle HTTP Expect...
+ */
+
+ if (httpGetExpect(client->http) &&
+ (client->operation == HTTP_STATE_POST ||
+ client->operation == HTTP_STATE_PUT))
+ {
+ if (httpGetExpect(client->http) == HTTP_STATUS_CONTINUE)
+ {
+ /*
+ * Send 100-continue header...
+ */
+
+ if (!respond_http(client, HTTP_STATUS_CONTINUE, NULL, NULL, 0))
+ return (0);
+ }
+ else
+ {
+ /*
+ * Send 417-expectation-failed header...
+ */
+
+ if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0))
+ return (0);
+ }
+ }
+
+ /*
+ * Handle new transfers...
+ */
+
+ encoding = httpGetContentEncoding(client->http);
+
+ switch (client->operation)
+ {
+ case HTTP_STATE_OPTIONS :
+ /*
+ * Do OPTIONS command...
+ */
+
+ return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0));
+
+ case HTTP_STATE_HEAD :
+#if 0 /* TODO: Work out icon support */
+ if (!strcmp(client->uri, "/icon.png"))
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0));
+ else
+#endif /* 0 */
+ if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies"))
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0));
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+
+ case HTTP_STATE_GET :
+#if 0 /* TODO: Work out icon support */
+ if (!strcmp(client->uri, "/icon.png"))
+ {
+ /*
+ * Send PNG icon file.
+ */
+
+ int fd; /* Icon file */
+ struct stat fileinfo; /* Icon file information */
+ char buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes */
+
+ fprintf(stderr, "Icon file is \"%s\".\n", client->printer->icon);
+
+ if (!stat(client->printer->icon, &fileinfo) &&
+ (fd = open(client->printer->icon, O_RDONLY)) >= 0)
+ {
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png",
+ (size_t)fileinfo.st_size))
+ {
+ close(fd);
+ return (0);
+ }
+
+ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+ httpWrite2(client->http, buffer, (size_t)bytes);
+
+ httpFlushWrite(client->http);
+
+ close(fd);
+ }
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ }
+ else
+#endif /* 0 */
+ if (!strcmp(client->uri, "/"))
+ {
+ /*
+ * Show web status page...
+ */
+
+ _ipp_job_t *job; /* Current job */
+ int i; /* Looping var */
+ _ipp_preason_t reason; /* Current reason */
+ static const char * const reasons[] =
+ { /* Reason strings */
+ "Other",
+ "Cover Open",
+ "Input Tray Missing",
+ "Marker Supply Empty",
+ "Marker Supply Low",
+ "Marker Waste Almost Full",
+ "Marker Waste Full",
+ "Media Empty",
+ "Media Jam",
+ "Media Low",
+ "Media Needed",
+ "Moving to Paused",
+ "Paused",
+ "Spool Area Full",
+ "Toner Empty",
+ "Toner Low"
+ };
+
+ if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+ return (0);
+
+ html_header(client, client->printer->name);
+ html_printf(client,
+ "<p><img align=\"right\" src=\"/icon.png\" width=\"64\" height=\"64\"><b>ippserver (" CUPS_SVERSION ")</b></p>\n"
+ "<p>%s, %d job(s).", client->printer->state == IPP_PSTATE_IDLE ? "Idle" : client->printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(client->printer->jobs));
+ for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1)
+ if (client->printer->state_reasons & reason)
+ html_printf(client, "\n<br>&nbsp;&nbsp;&nbsp;&nbsp;%s", reasons[i]);
+ html_printf(client, "</p>\n");
+
+ if (cupsArrayCount(client->printer->jobs) > 0)
+ {
+ _cupsRWLockRead(&(client->printer->rwlock));
+
+ html_printf(client, "<table class=\"striped\" summary=\"Jobs\"><thead><tr><th>Job #</th><th>Name</th><th>Owner</th><th>When</th></tr></thead><tbody>\n");
+ for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs); job; job = (_ipp_job_t *)cupsArrayNext(client->printer->jobs))
+ {
+ char when[256], /* When job queued/started/finished */
+ hhmmss[64]; /* Time HH:MM:SS */
+
+ switch (job->state)
+ {
+ case IPP_JSTATE_PENDING :
+ case IPP_JSTATE_HELD :
+ snprintf(when, sizeof(when), "Queued at %s", time_string(job->created, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_PROCESSING :
+ case IPP_JSTATE_STOPPED :
+ snprintf(when, sizeof(when), "Started at %s", time_string(job->processing, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_ABORTED :
+ snprintf(when, sizeof(when), "Aborted at %s", time_string(job->completed, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_CANCELED :
+ snprintf(when, sizeof(when), "Canceled at %s", time_string(job->completed, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_COMPLETED :
+ snprintf(when, sizeof(when), "Completed at %s", time_string(job->completed, hhmmss, sizeof(hhmmss)));
+ break;
+ }
+
+ html_printf(client, "<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", job->id, job->name, job->username, when);
+ }
+ html_printf(client, "</tbody></table>\n");
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+ }
+ html_footer(client);
+
+ return (1);
+ }
+#if 0 /* TODO: Pull media and supply info from device attrs */
+ else if (!strcmp(client->uri, "/media"))
+ {
+ /*
+ * Show web media page...
+ */
+
+ int i, /* Looping var */
+ num_options; /* Number of form options */
+ cups_option_t *options; /* Form options */
+ static const char * const sizes[] =
+ { /* Size strings */
+ "ISO A4",
+ "ISO A5",
+ "ISO A6",
+ "DL Envelope",
+ "US Legal",
+ "US Letter",
+ "#10 Envelope",
+ "3x5 Photo",
+ "3.5x5 Photo",
+ "4x6 Photo",
+ "5x7 Photo"
+ };
+ static const char * const types[] =
+ /* Type strings */
+ {
+ "Auto",
+ "Cardstock",
+ "Envelope",
+ "Labels",
+ "Other",
+ "Glossy Photo",
+ "High-Gloss Photo",
+ "Matte Photo",
+ "Satin Photo",
+ "Semi-Gloss Photo",
+ "Plain",
+ "Letterhead",
+ "Transparency"
+ };
+ static const int sheets[] = /* Number of sheets */
+ {
+ 250,
+ 100,
+ 25,
+ 5,
+ 0
+ };
+
+ if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+ return (0);
+
+ html_header(client, client->printer->name);
+
+ if ((num_options = parse_options(client, &options)) > 0)
+ {
+ /*
+ * WARNING: A real printer/server implementation MUST NOT implement
+ * media updates via a GET request - GET requests are supposed to be
+ * idempotent (without side-effects) and we obviously are not
+ * authenticating access here. This form is provided solely to
+ * enable testing and development!
+ */
+
+ const char *val; /* Form value */
+
+ if ((val = cupsGetOption("main_size", num_options, options)) != NULL)
+ client->printer->main_size = atoi(val);
+ if ((val = cupsGetOption("main_type", num_options, options)) != NULL)
+ client->printer->main_type = atoi(val);
+ if ((val = cupsGetOption("main_level", num_options, options)) != NULL)
+ client->printer->main_level = atoi(val);
+
+ if ((val = cupsGetOption("envelope_size", num_options, options)) != NULL)
+ client->printer->envelope_size = atoi(val);
+ if ((val = cupsGetOption("envelope_level", num_options, options)) != NULL)
+ client->printer->envelope_level = atoi(val);
+
+ if ((val = cupsGetOption("photo_size", num_options, options)) != NULL)
+ client->printer->photo_size = atoi(val);
+ if ((val = cupsGetOption("photo_type", num_options, options)) != NULL)
+ client->printer->photo_type = atoi(val);
+ if ((val = cupsGetOption("photo_level", num_options, options)) != NULL)
+ client->printer->photo_level = atoi(val);
+
+ if ((client->printer->main_level < 100 && client->printer->main_level > 0) || (client->printer->envelope_level < 25 && client->printer->envelope_level > 0) || (client->printer->photo_level < 25 && client->printer->photo_level > 0))
+ client->printer->state_reasons |= _IPP_PREASON_MEDIA_LOW;
+ else
+ client->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_LOW;
+
+ if ((client->printer->main_level == 0 && client->printer->main_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->envelope_level == 0 && client->printer->envelope_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->photo_level == 0 && client->printer->photo_size > _IPP_MEDIA_SIZE_NONE))
+ {
+ client->printer->state_reasons |= _IPP_PREASON_MEDIA_EMPTY;
+ if (client->printer->active_job)
+ client->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED;
+ }
+ else
+ client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MEDIA_EMPTY | _IPP_PREASON_MEDIA_NEEDED);
+
+ html_printf(client, "<blockquote>Media updated.</blockquote>\n");
+ }
+
+ html_printf(client, "<form method=\"GET\" action=\"/media\">\n");
+
+ html_printf(client, "<table class=\"form\" summary=\"Media\">\n");
+ html_printf(client, "<tr><th>Main Tray:</th><td><select name=\"main_size\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+ if (!strstr(sizes[i], "Envelope") && !strstr(sizes[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_size ? " selected" : "", sizes[i]);
+ html_printf(client, "</select> <select name=\"main_type\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+ if (!strstr(types[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_type ? " selected" : "", types[i]);
+ html_printf(client, "</select> <select name=\"main_level\">");
+ for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+ html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->main_level ? " selected" : "", sheets[i]);
+ html_printf(client, "</select></td></tr>\n");
+
+ html_printf(client,
+ "<tr><th>Envelope Feeder:</th><td><select name=\"envelope_size\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+ if (strstr(sizes[i], "Envelope"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->envelope_size ? " selected" : "", sizes[i]);
+ html_printf(client, "</select> <select name=\"envelope_level\">");
+ for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+ html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->envelope_level ? " selected" : "", sheets[i]);
+ html_printf(client, "</select></td></tr>\n");
+
+ html_printf(client,
+ "<tr><th>Photo Tray:</th><td><select name=\"photo_size\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+ if (strstr(sizes[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_size ? " selected" : "", sizes[i]);
+ html_printf(client, "</select> <select name=\"photo_type\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+ if (strstr(types[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_type ? " selected" : "", types[i]);
+ html_printf(client, "</select> <select name=\"photo_level\">");
+ for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+ html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->photo_level ? " selected" : "", sheets[i]);
+ html_printf(client, "</select></td></tr>\n");
+
+ html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Media\"></td></tr></table></form>\n");
+ html_footer(client);
+
+ return (1);
+ }
+ else if (!strcmp(client->uri, "/supplies"))
+ {
+ /*
+ * Show web supplies page...
+ */
+
+ int i, j, /* Looping vars */
+ num_options; /* Number of form options */
+ cups_option_t *options; /* Form options */
+ static const int levels[] = { 0, 5, 10, 25, 50, 75, 90, 95, 100 };
+
+ if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+ return (0);
+
+ html_header(client, client->printer->name);
+
+ if ((num_options = parse_options(client, &options)) > 0)
+ {
+ /*
+ * WARNING: A real printer/server implementation MUST NOT implement
+ * supply updates via a GET request - GET requests are supposed to be
+ * idempotent (without side-effects) and we obviously are not
+ * authenticating access here. This form is provided solely to
+ * enable testing and development!
+ */
+
+ char name[64]; /* Form field */
+ const char *val; /* Form value */
+
+ client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MARKER_SUPPLY_EMPTY | _IPP_PREASON_MARKER_SUPPLY_LOW | _IPP_PREASON_MARKER_WASTE_ALMOST_FULL | _IPP_PREASON_MARKER_WASTE_FULL | _IPP_PREASON_TONER_EMPTY | _IPP_PREASON_TONER_LOW);
+
+ for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+ {
+ snprintf(name, sizeof(name), "supply_%d", i);
+ if ((val = cupsGetOption(name, num_options, options)) != NULL)
+ {
+ int level = client->printer->supplies[i] = atoi(val);
+ /* New level */
+
+ if (i < 4)
+ {
+ if (level == 0)
+ client->printer->state_reasons |= _IPP_PREASON_TONER_EMPTY;
+ else if (level < 10)
+ client->printer->state_reasons |= _IPP_PREASON_TONER_LOW;
+ }
+ else
+ {
+ if (level == 100)
+ client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_FULL;
+ else if (level > 90)
+ client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_ALMOST_FULL;
+ }
+ }
+ }
+
+ html_printf(client, "<blockquote>Supplies updated.</blockquote>\n");
+ }
+
+ html_printf(client, "<form method=\"GET\" action=\"/supplies\">\n");
+
+ html_printf(client, "<table class=\"form\" summary=\"Supplies\">\n");
+ for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+ {
+ html_printf(client, "<tr><th>%s:</th><td><select name=\"supply_%d\">", printer_supplies[i], i);
+ for (j = 0; j < (int)(sizeof(levels) / sizeof(levels[0])); j ++)
+ html_printf(client, "<option value=\"%d\"%s>%d%%</option>", levels[j], levels[j] == client->printer->supplies[i] ? " selected" : "", levels[j]);
+ html_printf(client, "</select></td></tr>\n");
+ }
+ html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Supplies\"></td></tr>\n</table>\n</form>\n");
+ html_footer(client);
+
+ return (1);
+ }
+#endif /* 0 */
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ break;
+
+ case HTTP_STATE_POST :
+ if (strcmp(httpGetField(client->http, HTTP_FIELD_CONTENT_TYPE),
+ "application/ipp"))
+ {
+ /*
+ * Not an IPP request...
+ */
+
+ return (respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0));
+ }
+
+ /*
+ * Read the IPP request...
+ */
+
+ client->request = ippNew();
+
+ while ((ipp_state = ippRead(client->http,
+ client->request)) != IPP_STATE_DATA)
+ {
+ if (ipp_state == IPP_STATE_ERROR)
+ {
+ fprintf(stderr, "%s IPP read error (%s).\n", client->hostname,
+ cupsLastErrorString());
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+ }
+
+ /*
+ * Now that we have the IPP request, process the request...
+ */
+
+ return (process_ipp(client));
+
+ default :
+ break; /* Anti-compiler-warning-code */
+ }
+
+ return (1);
+}
+
+
+/*
+ * 'process_ipp()' - Process an IPP request.
+ */
+
+static int /* O - 1 on success, 0 on error */
+process_ipp(_ipp_client_t *client) /* I - Client */
+{
+ ipp_tag_t group; /* Current group tag */
+ ipp_attribute_t *attr; /* Current attribute */
+ ipp_attribute_t *charset; /* Character set attribute */
+ ipp_attribute_t *language; /* Language attribute */
+ ipp_attribute_t *uri; /* Printer URI attribute */
+ int major, minor; /* Version number */
+ const char *name; /* Name of attribute */
+
+
+ debug_attributes("Request", client->request, 1);
+
+ /*
+ * First build an empty response message for this request...
+ */
+
+ client->operation_id = ippGetOperation(client->request);
+ client->response = ippNewResponse(client->request);
+
+ /*
+ * Then validate the request header and required attributes...
+ */
+
+ major = ippGetVersion(client->request, &minor);
+
+ if (major < 1 || major > 2)
+ {
+ /*
+ * Return an error, since we only support IPP 1.x and 2.x.
+ */
+
+ respond_ipp(client, IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED,
+ "Bad request version number %d.%d.", major, minor);
+ }
+ else if (ippGetRequestId(client->request) <= 0)
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad request-id %d.",
+ ippGetRequestId(client->request));
+ else if (!ippFirstAttribute(client->request))
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "No attributes in request.");
+ else
+ {
+ /*
+ * Make sure that the attributes are provided in the correct order and
+ * don't repeat groups...
+ */
+
+ for (attr = ippFirstAttribute(client->request),
+ group = ippGetGroupTag(attr);
+ attr;
+ attr = ippNextAttribute(client->request))
+ {
+ if (ippGetGroupTag(attr) < group && ippGetGroupTag(attr) != IPP_TAG_ZERO)
+ {
+ /*
+ * Out of order; return an error...
+ */
+
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Attribute groups are out of order (%x < %x).",
+ ippGetGroupTag(attr), group);
+ break;
+ }
+ else
+ group = ippGetGroupTag(attr);
+ }
+
+ if (!attr)
+ {
+ /*
+ * Then make sure that the first three attributes are:
+ *
+ * attributes-charset
+ * attributes-natural-language
+ * printer-uri/job-uri
+ */
+
+ attr = ippFirstAttribute(client->request);
+ name = ippGetName(attr);
+ if (attr && name && !strcmp(name, "attributes-charset") &&
+ ippGetValueTag(attr) == IPP_TAG_CHARSET)
+ charset = attr;
+ else
+ charset = NULL;
+
+ attr = ippNextAttribute(client->request);
+ name = ippGetName(attr);
+
+ if (attr && name && !strcmp(name, "attributes-natural-language") &&
+ ippGetValueTag(attr) == IPP_TAG_LANGUAGE)
+ language = attr;
+ else
+ language = NULL;
+
+ if ((attr = ippFindAttribute(client->request, "printer-uri",
+ IPP_TAG_URI)) != NULL)
+ uri = attr;
+ else if ((attr = ippFindAttribute(client->request, "job-uri",
+ IPP_TAG_URI)) != NULL)
+ uri = attr;
+ else
+ uri = NULL;
+
+ if (charset &&
+ strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") &&
+ strcasecmp(ippGetString(charset, 0, NULL), "utf-8"))
+ {
+ /*
+ * Bad character set...
+ */
+
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Unsupported character set \"%s\".",
+ ippGetString(charset, 0, NULL));
+ }
+ else if (!charset || !language || !uri)
+ {
+ /*
+ * Return an error, since attributes-charset,
+ * attributes-natural-language, and printer-uri/job-uri are required
+ * for all operations.
+ */
+
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Missing required attributes.");
+ }
+ else
+ {
+ char scheme[32], /* URI scheme */
+ userpass[32], /* Username/password in URI */
+ host[256], /* Host name in URI */
+ resource[256]; /* Resource path in URI */
+ int port; /* Port number in URI */
+
+ name = ippGetName(uri);
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL),
+ scheme, sizeof(scheme),
+ userpass, sizeof(userpass),
+ host, sizeof(host), &port,
+ resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,
+ "Bad %s value '%s'.", name, ippGetString(uri, 0, NULL));
+ else if ((!strcmp(name, "job-uri") && strncmp(resource, "/ipp/print/", 11)) ||
+ (!strcmp(name, "printer-uri") && strcmp(resource, "/ipp/print")))
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.",
+ name, ippGetString(uri, 0, NULL));
+ else
+ {
+ /*
+ * Try processing the operation...
+ */
+
+ switch ((int)ippGetOperation(client->request))
+ {
+ case IPP_OP_PRINT_JOB :
+ ipp_print_job(client);
+ break;
+
+ case IPP_OP_PRINT_URI :
+ ipp_print_uri(client);
+ break;
+
+ case IPP_OP_VALIDATE_JOB :
+ ipp_validate_job(client);
+ break;
+
+ case IPP_OP_CREATE_JOB :
+ ipp_create_job(client);
+ break;
+
+ case IPP_OP_SEND_DOCUMENT :
+ ipp_send_document(client);
+ break;
+
+ case IPP_OP_SEND_URI :
+ ipp_send_uri(client);
+ break;
+
+ case IPP_OP_CANCEL_JOB :
+ ipp_cancel_job(client);
+ break;
+
+ case IPP_OP_CANCEL_MY_JOBS :
+ ipp_cancel_my_jobs(client);
+ break;
+
+ case IPP_OP_GET_JOB_ATTRIBUTES :
+ ipp_get_job_attributes(client);
+ break;
+
+ case IPP_OP_GET_JOBS :
+ ipp_get_jobs(client);
+ break;
+
+ case IPP_OP_GET_PRINTER_ATTRIBUTES :
+ ipp_get_printer_attributes(client);
+ break;
+
+ case IPP_OP_GET_PRINTER_SUPPORTED_VALUES :
+ ipp_get_printer_supported_values(client);
+ break;
+
+ case IPP_OP_CLOSE_JOB :
+ ipp_close_job(client);
+ break;
+
+ case IPP_OP_IDENTIFY_PRINTER :
+ ipp_identify_printer(client);
+ break;
+
+ case IPP_OP_CANCEL_SUBSCRIPTION :
+ ipp_cancel_subscription(client);
+ break;
+
+ case IPP_OP_CREATE_JOB_SUBSCRIPTIONS :
+ case IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS :
+ ipp_create_xxx_subscriptions(client);
+ break;
+
+ case IPP_OP_GET_NOTIFICATIONS :
+ ipp_get_notifications(client);
+ break;
+
+ case IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES :
+ ipp_get_subscription_attributes(client);
+ break;
+
+ case IPP_OP_GET_SUBSCRIPTIONS :
+ ipp_get_subscriptions(client);
+ break;
+
+ case IPP_OP_RENEW_SUBSCRIPTION :
+ ipp_renew_subscription(client);
+ break;
+
+ case IPP_OP_GET_DOCUMENT_ATTRIBUTES :
+ ipp_get_document_attributes(client);
+ break;
+
+ case IPP_OP_GET_DOCUMENTS :
+ ipp_get_documents(client);
+ break;
+
+ case IPP_OP_VALIDATE_DOCUMENT :
+ ipp_validate_document(client);
+ break;
+
+ case _IPP_OP_ACKNOWLEDGE_DOCUMENT :
+ ipp_acknowledge_document(client);
+ break;
+
+ case _IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER :
+ ipp_acknowledge_identify_printer(client);
+ break;
+
+ case _IPP_OP_ACKNOWLEDGE_JOB :
+ ipp_acknowledge_job(client);
+ break;
+
+ case _IPP_OP_FETCH_DOCUMENT :
+ ipp_fetch_document(client);
+ break;
+
+ case _IPP_OP_FETCH_JOB :
+ ipp_fetch_job(client);
+ break;
+
+ case _IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES :
+ ipp_get_output_device_attributes(client);
+ break;
+
+ case _IPP_OP_UPDATE_ACTIVE_JOBS :
+ ipp_update_active_jobs(client);
+ break;
+
+ case _IPP_OP_UPDATE_DOCUMENT_STATUS :
+ ipp_update_document_status(client);
+ break;
+
+ case _IPP_OP_UPDATE_JOB_STATUS :
+ ipp_update_job_status(client);
+ break;
+
+ case _IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES :
+ ipp_update_output_device_attributes(client);
+ break;
+
+ case _IPP_OP_DEREGISTER_OUTPUT_DEVICE :
+ ipp_deregister_output_device(client);
+ break;
+
+ default :
+ respond_ipp(client, IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED,
+ "Operation not supported.");
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Send the HTTP header and return...
+ */
+
+ if (httpGetState(client->http) != HTTP_STATE_POST_SEND)
+ httpFlush(client->http); /* Flush trailing (junk) data */
+
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "application/ipp",
+ client->fetch_file >= 0 ? 0 : ippLength(client->response)));
+}
+
+
+/*
+ * 'process_job()' - Process a print job.
+ */
+
+static void * /* O - Thread exit status */
+process_job(_ipp_job_t *job) /* I - Job */
+{
+ job->state = IPP_JSTATE_PROCESSING;
+ job->printer->state = IPP_PSTATE_PROCESSING;
+ job->processing = time(NULL);
+ job->printer->processing_job = job;
+
+ add_event(job->printer, job, _IPP_EVENT_JOB_STATE_CHANGED, "Job processing.");
+
+ /*
+ * TODO: Perform any preprocessing needed...
+ */
+
+ // job->state_reasons |= _IPP_JREASON_JOB_TRANSFORMING;
+ // job->state_reasons &= ~_IPP_JREASON_JOB_TRANSFORMING;
+
+ /*
+ * Set the state to processing-stopped, fetchable, then send a
+ * notification.
+ */
+
+ job->state = IPP_JSTATE_STOPPED;
+ job->state_reasons |= _IPP_JREASON_JOB_FETCHABLE;
+
+ add_event(job->printer, job, _IPP_EVENT_JOB_STATE_CHANGED, "Job fetchable.");
+
+ return (NULL);
+}
+
+
+/*
+ * 'respond_http()' - Send a HTTP response.
+ */
+
+int /* O - 1 on success, 0 on failure */
+respond_http(
+ _ipp_client_t *client, /* I - Client */
+ http_status_t code, /* I - HTTP status of response */
+ const char *content_encoding, /* I - Content-Encoding of response */
+ const char *type, /* I - MIME media type of response */
+ size_t length) /* I - Length of response */
+{
+ char message[1024]; /* Text message */
+
+
+ fprintf(stderr, "%s %s\n", client->hostname, httpStatus(code));
+
+ if (code == HTTP_STATUS_CONTINUE)
+ {
+ /*
+ * 100-continue doesn't send any headers...
+ */
+
+ return (httpWriteResponse(client->http, HTTP_STATUS_CONTINUE) == 0);
+ }
+
+ /*
+ * Format an error message...
+ */
+
+ if (!type && !length && code != HTTP_STATUS_OK && code != HTTP_STATUS_SWITCHING_PROTOCOLS)
+ {
+ snprintf(message, sizeof(message), "%d - %s\n", code, httpStatus(code));
+
+ type = "text/plain";
+ length = strlen(message);
+ }
+ else
+ message[0] = '\0';
+
+ /*
+ * Send the HTTP response header...
+ */
+
+ httpClearFields(client->http);
+
+ if (code == HTTP_STATUS_METHOD_NOT_ALLOWED ||
+ client->operation == HTTP_STATE_OPTIONS)
+ httpSetField(client->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST");
+
+ if (type)
+ {
+ if (!strcmp(type, "text/html"))
+ httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE,
+ "text/html; charset=utf-8");
+ else
+ httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, type);
+
+ if (content_encoding)
+ httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, content_encoding);
+ }
+
+ httpSetLength(client->http, length);
+
+ if (httpWriteResponse(client->http, code) < 0)
+ return (0);
+
+ /*
+ * Send the response data...
+ */
+
+ if (message[0])
+ {
+ /*
+ * Send a plain text message.
+ */
+
+ if (httpPrintf(client->http, "%s", message) < 0)
+ return (0);
+
+ if (httpWrite2(client->http, "", 0) < 0)
+ return (0);
+ }
+ else if (client->response)
+ {
+ /*
+ * Send an IPP response...
+ */
+
+ debug_attributes("Response", client->response, 2);
+
+ ippSetState(client->response, IPP_STATE_IDLE);
+
+ if (ippWrite(client->http, client->response) != IPP_STATE_DATA)
+ return (0);
+
+ if (client->fetch_file >= 0)
+ {
+ ssize_t bytes; /* Bytes read */
+ char buffer[32768]; /* Buffer */
+
+ if (client->fetch_compression)
+ httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, "gzip");
+
+ while ((bytes = read(client->fetch_file, buffer, sizeof(buffer))) > 0)
+ httpWrite2(client->http, buffer, (size_t)bytes);
+
+ httpWrite2(client->http, "", 0);
+ close(client->fetch_file);
+ client->fetch_file = -1;
+ }
+ }
+
+ return (1);
+}
+
+
+/*
+ * 'respond_ipp()' - Send an IPP response.
+ */
+
+static void
+respond_ipp(_ipp_client_t *client, /* I - Client */
+ ipp_status_t status, /* I - status-code */
+ const char *message, /* I - printf-style status-message */
+ ...) /* I - Additional args as needed */
+{
+ const char *formatted = NULL; /* Formatted message */
+
+
+ ippSetStatusCode(client->response, status);
+
+ if (message)
+ {
+ va_list ap; /* Pointer to additional args */
+ ipp_attribute_t *attr; /* New status-message attribute */
+
+ va_start(ap, message);
+ if ((attr = ippFindAttribute(client->response, "status-message",
+ IPP_TAG_TEXT)) != NULL)
+ ippSetStringfv(client->response, &attr, 0, message, ap);
+ else
+ attr = ippAddStringfv(client->response, IPP_TAG_OPERATION, IPP_TAG_TEXT,
+ "status-message", NULL, message, ap);
+ va_end(ap);
+
+ formatted = ippGetString(attr, 0, NULL);
+ }
+
+ if (formatted)
+ fprintf(stderr, "%s %s %s (%s)\n", client->hostname,
+ ippOpString(client->operation_id), ippErrorString(status),
+ formatted);
+ else
+ fprintf(stderr, "%s %s %s\n", client->hostname,
+ ippOpString(client->operation_id), ippErrorString(status));
+}
+
+
+/*
+ * 'respond_unsupported()' - Respond with an unsupported attribute.
+ */
+
+static void
+respond_unsupported(
+ _ipp_client_t *client, /* I - Client */
+ ipp_attribute_t *attr) /* I - Atribute */
+{
+ ipp_attribute_t *temp; /* Copy of attribute */
+
+
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,
+ "Unsupported %s %s%s value.", ippGetName(attr),
+ ippGetCount(attr) > 1 ? "1setOf " : "",
+ ippTagString(ippGetValueTag(attr)));
+
+ temp = ippCopyAttribute(client->response, attr, 0);
+ ippSetGroupTag(client->response, &temp, IPP_TAG_UNSUPPORTED_GROUP);
+}
+
+
+/*
+ * 'run_printer()' - Run the printer service.
+ */
+
+static void
+run_printer(_ipp_printer_t *printer) /* I - Printer */
+{
+ int num_fds; /* Number of file descriptors */
+ struct pollfd polldata[3]; /* poll() data */
+ int timeout; /* Timeout for poll() */
+ _ipp_client_t *client; /* New client */
+
+
+ /*
+ * Setup poll() data for the Bonjour service socket and IPv4/6 listeners...
+ */
+
+ polldata[0].fd = printer->ipv4;
+ polldata[0].events = POLLIN;
+
+ polldata[1].fd = printer->ipv6;
+ polldata[1].events = POLLIN;
+
+ num_fds = 2;
+
+ /*
+ * Loop until we are killed or have a hard error...
+ */
+
+ for (;;)
+ {
+ if (cupsArrayCount(printer->jobs))
+ timeout = 10;
+ else
+ timeout = -1;
+
+ if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR)
+ {
+ perror("poll() failed");
+ break;
+ }
+
+ if (polldata[0].revents & POLLIN)
+ {
+ if ((client = create_client(printer, printer->ipv4)) != NULL)
+ {
+ if (!_cupsThreadCreate((_cups_thread_func_t)process_client, client))
+ {
+ perror("Unable to create client thread");
+ delete_client(client);
+ }
+ }
+ }
+
+ if (polldata[1].revents & POLLIN)
+ {
+ if ((client = create_client(printer, printer->ipv6)) != NULL)
+ {
+ if (!_cupsThreadCreate((_cups_thread_func_t)process_client, client))
+ {
+ perror("Unable to create client thread");
+ delete_client(client);
+ }
+ }
+ }
+
+ /*
+ * Clean out old jobs...
+ */
+
+ clean_jobs(printer);
+ }
+}
+
+
+/*
+ * 'time_string()' - Return the local time in hours, minutes, and seconds.
+ */
+
+static char *
+time_string(time_t tv, /* I - Time value */
+ char *buffer, /* I - Buffer */
+ size_t bufsize) /* I - Size of buffer */
+{
+ struct tm *curtime = localtime(&tv);
+ /* Local time */
+
+ strftime(buffer, bufsize, "%X", curtime);
+ return (buffer);
+}
+
+
+/*
+ * 'update_device_attributes_no_lock()' - Update the composite device attributes.
+ *
+ * Note: Caller MUST lock the printer object for writing before using.
+ */
+
+static void
+update_device_attributes_no_lock(
+ _ipp_printer_t *printer) /* I - Printer */
+{
+ _ipp_device_t *device; /* Current device */
+ ipp_t *dev_attrs; /* Device attributes */
+
+
+ /* TODO: Support multiple output devices, icons, etc... */
+ device = (_ipp_device_t *)cupsArrayFirst(printer->devices);
+ dev_attrs = ippNew();
+
+ if (device)
+ copy_attributes(dev_attrs, device->attrs, NULL, IPP_TAG_PRINTER, 0);
+
+ ippDelete(printer->dev_attrs);
+ printer->dev_attrs = dev_attrs;
+
+ printer->config_time = time(NULL);
+}
+
+
+/*
+ * 'update_device_status_no_lock()' - Update the composite device state.
+ *
+ * Note: Caller MUST lock the printer object for writing before using.
+ */
+
+static void
+update_device_state_no_lock(
+ _ipp_printer_t *printer) /* I - Printer */
+{
+ _ipp_device_t *device; /* Current device */
+ ipp_attribute_t *attr; /* Current attribute */
+
+
+ /* TODO: Support multiple output devices, icons, etc... */
+ device = (_ipp_device_t *)cupsArrayFirst(printer->devices);
+
+ if ((attr = ippFindAttribute(device->attrs, "printer-state", IPP_TAG_ENUM)) != NULL)
+ printer->dev_state = (ipp_pstate_t)ippGetInteger(attr, 0);
+ else
+ printer->dev_state = IPP_PSTATE_STOPPED;
+
+ if ((attr = ippFindAttribute(device->attrs, "printer-state-reasons", IPP_TAG_KEYWORD)) != NULL)
+ printer->dev_reasons = get_printer_state_reasons_bits(attr);
+ else
+ printer->dev_reasons = _IPP_PREASON_PAUSED;
+
+ printer->state_time = time(NULL);
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(int status) /* O - Exit status */
+{
+ if (!status)
+ {
+ puts(CUPS_SVERSION " - Copyright 2010-2014 by Apple Inc. All rights reserved.");
+ puts("");
+ }
+
+ puts("Usage: ippinfra [options] \"name\"");
+ puts("");
+ puts("Options:");
+ printf("-d spool-directory Spool directory "
+ "(default=/tmp/ippserver.%d)\n", (int)getpid());
+ puts("-h Show program help");
+ puts("-k Keep job spool files");
+ puts("-n hostname Hostname for printer");
+ puts("-p port Port number (default=auto)");
+ puts("-u user:pass Set proxy username and password");
+ puts("-v[vvv] Be (very) verbose");
+
+ exit(status);
+}
+
+
+/*
+ * 'valid_doc_attributes()' - Determine whether the document attributes are
+ * valid.
+ *
+ * When one or more document attributes are invalid, this function adds a
+ * suitable response and attributes to the unsupported group.
+ */
+
+static int /* O - 1 if valid, 0 if not */
+valid_doc_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ int valid = 1; /* Valid attributes? */
+ ipp_op_t op = ippGetOperation(client->request);
+ /* IPP operation */
+ const char *op_name = ippOpString(op);
+ /* IPP operation name */
+ ipp_attribute_t *attr, /* Current attribute */
+ *supported; /* xxx-supported attribute */
+ const char *compression = NULL,
+ /* compression value */
+ *format = NULL; /* document-format value */
+
+
+ /*
+ * Check operation attributes...
+ */
+
+ if ((attr = ippFindAttribute(client->request, "compression", IPP_TAG_ZERO)) != NULL)
+ {
+ /*
+ * If compression is specified, only accept a supported value in a Print-Job
+ * or Send-Document request...
+ */
+
+ compression = ippGetString(attr, 0, NULL);
+ supported = ippFindAttribute(client->printer->attrs,
+ "compression-supported", IPP_TAG_KEYWORD);
+
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD ||
+ ippGetGroupTag(attr) != IPP_TAG_OPERATION ||
+ (op != IPP_OP_PRINT_JOB && op != IPP_OP_SEND_DOCUMENT &&
+ op != IPP_OP_VALIDATE_JOB) ||
+ !ippContainsString(supported, compression))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ fprintf(stderr, "%s %s compression=\"%s\"\n", client->hostname, op_name, compression);
+
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "compression-supplied", NULL, compression);
+
+ if (strcmp(compression, "none"))
+ {
+ if (Verbosity)
+ fprintf(stderr, "Receiving job file with \"%s\" compression.\n", compression);
+ httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, compression);
+ }
+ }
+ }
+
+ /*
+ * Is it a format we support?
+ */
+
+ if ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_MIMETYPE ||
+ ippGetGroupTag(attr) != IPP_TAG_OPERATION)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ format = ippGetString(attr, 0, NULL);
+
+ fprintf(stderr, "%s %s document-format=\"%s\"\n",
+ client->hostname, op_name, format);
+
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, format);
+ }
+ }
+ else
+ {
+ format = ippGetString(ippFindAttribute(client->printer->attrs, "document-format-default", IPP_TAG_MIMETYPE), 0, NULL);
+ if (!format)
+ format = "application/octet-stream"; /* Should never happen */
+
+ attr = ippAddString(client->request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format);
+ }
+
+ if (!strcmp(format, "application/octet-stream") && (ippGetOperation(client->request) == IPP_OP_PRINT_JOB || ippGetOperation(client->request) == IPP_OP_SEND_DOCUMENT))
+ {
+ /*
+ * Auto-type the file using the first 8 bytes of the file...
+ */
+
+ unsigned char header[8]; /* First 8 bytes of file */
+
+ memset(header, 0, sizeof(header));
+ httpPeek(client->http, (char *)header, sizeof(header));
+
+ if (!memcmp(header, "%PDF", 4))
+ format = "application/pdf";
+ else if (!memcmp(header, "%!", 2))
+ format = "application/postscript";
+ else if (!memcmp(header, "\377\330\377", 3) && header[3] >= 0xe0 && header[3] <= 0xef)
+ format = "image/jpeg";
+ else if (!memcmp(header, "\211PNG", 4))
+ format = "image/png";
+ else if (!memcmp(header, "RAS2", 4))
+ format = "image/pwg-raster";
+ else if (!memcmp(header, "UNIRAST", 8))
+ format = "image/urf";
+ else
+ format = NULL;
+
+ if (format)
+ {
+ fprintf(stderr, "%s %s Auto-typed document-format=\"%s\"\n",
+ client->hostname, op_name, format);
+
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, format);
+ }
+ }
+
+ if (op != IPP_OP_CREATE_JOB && (supported = ippFindAttribute(client->printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL && !ippContainsString(supported, format))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+
+ /*
+ * document-name
+ */
+
+ if ((attr = ippFindAttribute(client->request, "document-name", IPP_TAG_NAME)) != NULL)
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL));
+
+ return (valid);
+}
+
+
+/*
+ * 'valid_job_attributes()' - Determine whether the job attributes are valid.
+ *
+ * When one or more job attributes are invalid, this function adds a suitable
+ * response and attributes to the unsupported group.
+ */
+
+static int /* O - 1 if valid, 0 if not */
+valid_job_attributes(
+ _ipp_client_t *client) /* I - Client */
+{
+ int i, /* Looping var */
+ valid = 1; /* Valid attributes? */
+ ipp_attribute_t *attr, /* Current attribute */
+ *supported; /* xxx-supported attribute */
+
+
+ /*
+ * Check operation attributes...
+ */
+
+ valid = valid_doc_attributes(client);
+
+ /*
+ * Check the various job template attributes...
+ */
+
+ if ((attr = ippFindAttribute(client->request, "copies", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER ||
+ ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 999)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BOOLEAN)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "job-hold-until", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(attr) != IPP_TAG_KEYWORD) ||
+ strcmp(ippGetString(attr, 0, NULL), "no-hold"))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 0)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+
+ ippSetGroupTag(client->request, &attr, IPP_TAG_JOB);
+ }
+ else
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled");
+
+ if ((attr = ippFindAttribute(client->request, "job-priority", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER ||
+ ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 100)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "job-sheets", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(attr) != IPP_TAG_KEYWORD) ||
+ strcmp(ippGetString(attr, 0, NULL), "none"))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "media", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(attr) != IPP_TAG_KEYWORD))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+#if 0 /* TODO: Validate media */
+ for (i = 0;
+ i < (int)(sizeof(media_supported) / sizeof(media_supported[0]));
+ i ++)
+ if (!strcmp(ippGetString(attr, 0, NULL), media_supported[i]))
+ break;
+
+ if (i >= (int)(sizeof(media_supported) / sizeof(media_supported[0])))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+#endif /* 0 */
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 ||
+ ippGetValueTag(attr) != IPP_TAG_BEGIN_COLLECTION)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ /* TODO: check for valid media-col */
+ }
+
+ if ((attr = ippFindAttribute(client->request, "multiple-document-handling", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD ||
+ (strcmp(ippGetString(attr, 0, NULL),
+ "separate-documents-uncollated-copies") &&
+ strcmp(ippGetString(attr, 0, NULL),
+ "separate-documents-collated-copies")))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "orientation-requested", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM ||
+ ippGetInteger(attr, 0) < IPP_ORIENT_PORTRAIT ||
+ ippGetInteger(attr, 0) > IPP_ORIENT_REVERSE_PORTRAIT)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "page-ranges", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetValueTag(attr) != IPP_TAG_RANGE)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "print-quality", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM ||
+ ippGetInteger(attr, 0) < IPP_QUALITY_DRAFT ||
+ ippGetInteger(attr, 0) > IPP_QUALITY_HIGH)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "printer-resolution", IPP_TAG_ZERO)) != NULL)
+ {
+ supported = ippFindAttribute(client->printer->dev_attrs, "printer-resolution-supported", IPP_TAG_RESOLUTION);
+
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_RESOLUTION ||
+ !supported)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ int count, /* Number of supported values */
+ xdpi, /* Horizontal resolution for job template attribute */
+ ydpi, /* Vertical resolution for job template attribute */
+ sydpi; /* Vertical resolution for supported value */
+ ipp_res_t units, /* Units for job template attribute */
+ sunits; /* Units for supported value */
+
+ xdpi = ippGetResolution(attr, 0, &ydpi, &units);
+ count = ippGetCount(supported);
+
+ for (i = 0; i < count; i ++)
+ {
+ if (xdpi == ippGetResolution(supported, i, &sydpi, &sunits) && ydpi == sydpi && units == sunits)
+ break;
+ }
+
+ if (i >= count)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "sides", IPP_TAG_ZERO)) != NULL)
+ {
+ const char *sides = ippGetString(attr, 0, NULL);
+ /* "sides" value... */
+
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else if ((supported = ippFindAttribute(client->printer->dev_attrs, "sides-supported", IPP_TAG_KEYWORD)) != NULL)
+ {
+ if (!ippContainsString(supported, sides))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+ else if (strcmp(sides, "one-sided"))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ return (valid);
+}
+
+
+/*
+ * End of "$Id: ippinfra.c 12237 2014-11-03 13:07:32Z msweet $".
+ */
diff --git a/test/ippinfra.man b/test/ippinfra.man
new file mode 100644
index 0000000..46ac84e
--- /dev/null
+++ b/test/ippinfra.man
@@ -0,0 +1,103 @@
+.\"
+.\" "$Id$"
+.\"
+.\" ippinfra man page for CUPS.
+.\"
+.\" Copyright 2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippinfra 1 "CUPS" "16 September 2014" "Apple Inc."
+.SH NAME
+ippinfra \- a simple ipp infrastructure server
+.SH SYNOPSIS
+.B ippinfra
+[
+.B \-d
+.I spool-directory
+] [
+.B \-h
+] [
+.B \-k
+] [
+.B \-n
+.I hostname
+] [
+.B \-p
+.I port
+] [
+.B \-u
+.I username:password
+] [
+.B \-v[vvv]
+]
+.I service-name
+.SH DESCRIPTION
+.B ippinfra
+is a simple Internet Printing Protocol (IPP) infrastructure server conforming to the IPP Shared Infrastructure Extensions (INFRA) specification. It can be used as a very basic infrastructure server between standard IPP clients and IPP proxies conforming to the INFRA specification.
+.SH OPTIONS
+The following options are recognized by
+.B ippinfra:
+.TP 5
+\fB\-d \fIspool-directory\fR
+Specifies the directory that will hold the print files.
+The default is a directory under the user's current temporary directory.
+.TP 5
+.B \-h
+Shows program help.
+.TP 5
+.B \-k
+Keeps the print documents in the spool directory rather than deleting them.
+.TP 5
+\fB\-n \fIhostname\fR
+Specifies the hostname that is reported by the server.
+The default is the name returned by the
+.BR hostname (1)
+command.
+.TP 5
+\fB\-p \fIport\fR
+Specifies the port number to listen on.
+The default is a user-specific number from 8000 to 8999.
+.TP 5
+\fB\-u \fIusername:password\fR
+Specifies the username and password for the IPP proxy.
+The default is "test:test123".
+.TP 5
+.B \-v[vvv]
+Be (very) verbose when logging activity to the standard output.
+.SH EXIT STATUS
+The
+.B ippinfra
+program returns 1 if it is unable to process the command-line arguments.
+Otherwise
+.B ippinfra
+will run continuously until terminated.
+.SH CONFORMING TO
+The
+.B ippinfra
+program is unique to CUPS and conforms to the IPP Shared Infrastructure Extensions (INFRA) specification as an Infrastructure Printer.
+.SH EXAMPLES
+Run
+.B ippinfra
+with a service name of My Cool Printer:
+.nf
+
+ ippinfra "My Cool Printer"
+.fi
+.LP
+Specify a proxy username of "foo" and password of "bar":
+.nf
+
+ ippinfra \-u foo:bar "My Cool Printer"
+.fi
+.SH SEE ALSO
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2014 by Apple Inc.
+.\"
+.\" End of "$Id$".
+.\"
diff --git a/test/ippproxy.c b/test/ippproxy.c
new file mode 100644
index 0000000..e8dd2c1
--- /dev/null
+++ b/test/ippproxy.c
@@ -0,0 +1,29 @@
+/*
+ * "$Id: ippproxy.c 12191 2014-10-01 19:00:21Z msweet $"
+ *
+ * CUPS Cloud Proxy for HP PCL and IPP Everywhere printers.
+ *
+ * Copyright 2014 by Apple Inc.
+ */
+
+#include <cups/cups.h>
+
+
+/*
+ * 'main()' - Main entry for cupsproxy.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line arguments */
+ char *argv[]) /* I - Command-line arguments */
+{
+ (void)argc;
+ (void)argv;
+
+ return (0);
+}
+
+
+/*
+ * End of "$Id: ippproxy.c 12191 2014-10-01 19:00:21Z msweet $".
+ */
diff --git a/test/ippproxy.man b/test/ippproxy.man
new file mode 100644
index 0000000..1d46c9a
--- /dev/null
+++ b/test/ippproxy.man
@@ -0,0 +1,59 @@
+.\"
+.\" "$Id$"
+.\"
+.\" ippproxy man page for CUPS.
+.\"
+.\" Copyright 2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippproxy 1 "CUPS" "16 September 2014" "Apple Inc."
+.SH NAME
+ippproxy \- a simple ipp proxy client
+.SH SYNOPSIS
+.B ippproxy
+[
+.B \-v[vvv]
+]
+.I infrastructure-printer-uri
+.I local-printer-uri
+.SH DESCRIPTION
+.B ippproxy
+is a simple IPP proxy client conforming to the IPP Shared Infrastructure Extensions (INFRA) specification. It can be used to proxy access to a local IPP printer through an Infrastructure Printer such as
+.BR ippinfra (1).
+.SH OPTIONS
+The following options are recognized by
+.B ippproxy:
+.TP 5
+.B \-v[vvv]
+Be (very) verbose when logging activity to the standard output.
+.SH EXIT STATUS
+The
+.B ippproxy
+program returns 1 if it is unable to process the command-line arguments or connect to either the infrastructure or local printers.
+Otherwise
+.B ippproxy
+will run continuously until terminated.
+.SH CONFORMING TO
+The
+.B ippproxy
+program is unique to CUPS and conforms to the IPP Shared Infrastructure Extensions (INFRA) specification.
+.SH EXAMPLE
+Run
+.B ippproxy
+with an infrastructure URI of "ipps://host.example.com/ipp/print" and a local URI of "ipp://10.0.1.2/ipp/print":
+.nf
+
+ ippproxy ipps://host.example.com/ipp/print ipp://10.0.1.2/ipp/print
+.fi
+.SH SEE ALSO
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2014 by Apple Inc.
+.\"
+.\" End of "$Id$".
+.\"
diff --git a/test/ippserver.c b/test/ippserver.c
index 32bcf44..6fcae92 100644
--- a/test/ippserver.c
+++ b/test/ippserver.c
@@ -1,88 +1,68 @@
/*
- * "$Id: ippserver.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ippserver.c 12947 2015-10-28 15:23:33Z msweet $"
*
- * Sample IPP/2.0 server for CUPS.
+ * Sample IPP Everywhere server for CUPS.
*
- * Copyright 2010-2012 by Apple Inc.
+ * Copyright 2010-2015 by Apple Inc.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Main entry to the sample server.
- * clean_jobs() - Clean out old (completed) jobs.
- * compare_jobs() - Compare two jobs.
- * copy_attributes() - Copy attributes from one request to
- * another.
- * copy_job_attrs() - Copy job attributes to the response.
- * create_client() - Accept a new network connection and create
- * a client object.
- * create_job() - Create a new job object from a Print-Job or
- * Create-Job request.
- * create_listener() - Create a listener socket.
- * create_media_col() - Create a media-col value.
- * create_printer() - Create, register, and listen for
- * connections to a printer object.
- * create_requested_array() - Create an array for requested-attributes.
- * debug_attributes() - Print attributes in a request or response.
- * delete_client() - Close the socket and free all memory used
- * by a client object.
- * delete_job() - Remove from the printer and free all memory
- * used by a job object.
- * delete_printer() - Unregister, close listen sockets, and free
- * all memory used by a printer object.
- * dnssd_callback() - Handle Bonjour registration events.
- * find_job() - Find a job specified in a request.
- * html_escape() - Write a HTML-safe string.
- * html_printf() - Send formatted text to the client, quoting
- * as needed.
- * ipp_cancel_job() - Cancel a job.
- * ipp_create_job() - Create a job object.
- * ipp_get_job_attributes() - Get the attributes for a job object.
- * ipp_get_jobs() - Get a list of job objects.
- * ipp_get_printer_attributes() - Get the attributes for a printer object.
- * ipp_print_job() - Create a job object with an attached
- * document.
- * ipp_print_uri() - Create a job object with a referenced
- * document.
- * ipp_send_document() - Add an attached document to a job object
- * created with Create-Job.
- * ipp_send_uri() - Add a referenced document to a job object
- * created with Create-Job.
- * ipp_validate_job() - Validate job creation attributes.
- * process_client() - Process client requests on a thread.
- * process_http() - Process a HTTP request.
- * process_ipp() - Process an IPP request.
- * process_job() - Process a print job.
- * register_printer() - Register a printer object via Bonjour.
- * respond_http() - Send a HTTP response.
- * respond_ipp() - Send an IPP response.
- * respond_unsupported() - Respond with an unsupported attribute.
- * run_printer() - Run the printer service.
- * usage() - Show program usage.
- * valid_doc_attributes() - Determine whether the document attributes
- * are valid.
- * valid_job_attributes() - Determine whether the job attributes are
- * valid.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
+ * Disable private and deprecated stuff so we can verify that the public API
+ * is sufficient to implement a server.
+ */
+
+#define _IPP_PRIVATE_STRUCTURES 0 /* Disable private IPP stuff */
+#define _CUPS_NO_DEPRECATED 1 /* Disable deprecated stuff */
+
+
+/*
* Include necessary headers...
*/
-#include <cups/cups-private.h>
+#include <config.h> /* CUPS configuration header */
+#include <cups/cups.h> /* Public API */
+#include <cups/string-private.h> /* CUPS string functions */
+#include <cups/thread-private.h> /* For multithreading functions */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+# include <fcntl.h>
+# include <io.h>
+# include <process.h>
+# define WEXITSTATUS(s) (s)
+# include <winsock2.h>
+typedef ULONG nfds_t;
+# define poll WSAPoll
+#else
+extern char **environ;
+
+# include <sys/fcntl.h>
+# include <sys/wait.h>
+# include <poll.h>
+#endif /* WIN32 */
+
#ifdef HAVE_DNSSD
# include <dns_sd.h>
+#elif defined(HAVE_AVAHI)
+# include <avahi-client/client.h>
+# include <avahi-client/publish.h>
+# include <avahi-common/error.h>
+# include <avahi-common/thread-watch.h>
#endif /* HAVE_DNSSD */
-#include <limits.h>
-#include <sys/stat.h>
-#include <poll.h>
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif /* HAVE_SYS_MOUNT_H */
@@ -101,33 +81,53 @@
* Constants...
*/
-enum _ipp_preasons_e /* printer-state-reasons bit values */
+enum _ipp_preason_e /* printer-state-reasons bit values */
{
- _IPP_PRINTER_NONE = 0x0000, /* none */
- _IPP_PRINTER_OTHER = 0x0001, /* other */
- _IPP_PRINTER_COVER_OPEN = 0x0002, /* cover-open */
- _IPP_PRINTER_INPUT_TRAY_MISSING = 0x0004,
+ _IPP_PREASON_NONE = 0x0000, /* none */
+ _IPP_PREASON_OTHER = 0x0001, /* other */
+ _IPP_PREASON_COVER_OPEN = 0x0002, /* cover-open */
+ _IPP_PREASON_INPUT_TRAY_MISSING = 0x0004,
/* input-tray-missing */
- _IPP_PRINTER_MARKER_SUPPLY_EMPTY = 0x0008,
+ _IPP_PREASON_MARKER_SUPPLY_EMPTY = 0x0008,
/* marker-supply-empty */
- _IPP_PRINTER_MARKER_SUPPLY_LOW = 0x0010,
- /* marker-suply-low */
- _IPP_PRINTER_MARKER_WASTE_ALMOST_FULL = 0x0020,
+ _IPP_PREASON_MARKER_SUPPLY_LOW = 0x0010,
+ /* marker-supply-low */
+ _IPP_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020,
/* marker-waste-almost-full */
- _IPP_PRINTER_MARKER_WASTE_FULL = 0x0040,
+ _IPP_PREASON_MARKER_WASTE_FULL = 0x0040,
/* marker-waste-full */
- _IPP_PRINTER_MEDIA_EMPTY = 0x0080, /* media-empty */
- _IPP_PRINTER_MEDIA_JAM = 0x0100, /* media-jam */
- _IPP_PRINTER_MEDIA_LOW = 0x0200, /* media-low */
- _IPP_PRINTER_MEDIA_NEEDED = 0x0400, /* media-needed */
- _IPP_PRINTER_MOVING_TO_PAUSED = 0x0800,
+ _IPP_PREASON_MEDIA_EMPTY = 0x0080, /* media-empty */
+ _IPP_PREASON_MEDIA_JAM = 0x0100, /* media-jam */
+ _IPP_PREASON_MEDIA_LOW = 0x0200, /* media-low */
+ _IPP_PREASON_MEDIA_NEEDED = 0x0400, /* media-needed */
+ _IPP_PREASON_MOVING_TO_PAUSED = 0x0800,
/* moving-to-paused */
- _IPP_PRINTER_PAUSED = 0x1000, /* paused */
- _IPP_PRINTER_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */
- _IPP_PRINTER_TONER_EMPTY = 0x4000, /* toner-empty */
- _IPP_PRINTER_TONER_LOW = 0x8000 /* toner-low */
+ _IPP_PREASON_PAUSED = 0x1000, /* paused */
+ _IPP_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */
+ _IPP_PREASON_TONER_EMPTY = 0x4000, /* toner-empty */
+ _IPP_PREASON_TONER_LOW = 0x8000 /* toner-low */
+};
+typedef unsigned int _ipp_preason_t; /* Bitfield for printer-state-reasons */
+static const char * const _ipp_preason_strings[] =
+{ /* Strings for each bit */
+ /* "none" is implied for no bits set */
+ "other",
+ "cover-open",
+ "input-tray-missing",
+ "marker-supply-empty",
+ "marker-supply-low",
+ "marker-waste-almost-full",
+ "marker-waste-full",
+ "media-empty",
+ "media-jam",
+ "media-low",
+ "media-needed",
+ "moving-to-paused",
+ "paused",
+ "spool-area-full",
+ "toner-empty",
+ "toner-low"
};
-typedef unsigned int _ipp_preasons_t; /* Bitfield for printer-state-reasons */
typedef enum _ipp_media_class_e
{
@@ -136,6 +136,21 @@ typedef enum _ipp_media_class_e
_IPP_ENV_ONLY /* Envelope-only size */
} _ipp_media_class_t;
+typedef enum _ipp_media_size_e
+{
+ _IPP_MEDIA_SIZE_NONE = -1,
+ _IPP_MEDIA_SIZE_A4,
+ _IPP_MEDIA_SIZE_A5,
+ _IPP_MEDIA_SIZE_A6,
+ _IPP_MEDIA_SIZE_DL,
+ _IPP_MEDIA_SIZE_LEGAL,
+ _IPP_MEDIA_SIZE_LETTER,
+ _IPP_MEDIA_SIZE_COM10,
+ _IPP_MEDIA_SIZE_3x5,
+ _IPP_MEDIA_SIZE_L,
+ _IPP_MEDIA_SIZE_4x6,
+ _IPP_MEDIA_SIZE_5x7
+} _ipp_media_size_t;
static const char * const media_supported[] =
{ /* media-supported values */
"iso_a4_210x297mm", /* A4 */
@@ -164,6 +179,43 @@ static const int media_col_sizes[][3] =
{ 10160, 15240, _IPP_PHOTO_ONLY }, /* 4x6 */
{ 12700, 17780, _IPP_PHOTO_ONLY } /* 5x7 aka 2L */
};
+
+typedef enum _ipp_media_source_e
+{
+ _IPP_MEDIA_SOURCE_NONE = -1,
+ _IPP_MEDIA_SOURCE_AUTO,
+ _IPP_MEDIA_SOURCE_MAIN,
+ _IPP_MEDIA_SOURCE_MANUAL,
+ _IPP_MEDIA_SOURCE_ENVELOPE,
+ _IPP_MEDIA_SOURCE_PHOTO
+} _ipp_media_source_t;
+static const char * const media_source_supported[] =
+ /* media-source-supported values */
+{
+ "auto",
+ "main",
+ "manual",
+ "envelope",
+ "photo"
+};
+
+typedef enum _ipp_media_type_e
+{
+ _IPP_MEDIA_TYPE_NONE = -1,
+ _IPP_MEDIA_TYPE_AUTO,
+ _IPP_MEDIA_TYPE_CARDSTOCK,
+ _IPP_MEDIA_TYPE_ENVELOPE,
+ _IPP_MEDIA_TYPE_LABELS,
+ _IPP_MEDIA_TYPE_OTHER,
+ _IPP_MEDIA_TYPE_GLOSSY,
+ _IPP_MEDIA_TYPE_HIGH_GLOSS,
+ _IPP_MEDIA_TYPE_MATTE,
+ _IPP_MEDIA_TYPE_SATIN,
+ _IPP_MEDIA_TYPE_SEMI_GLOSS,
+ _IPP_MEDIA_TYPE_STATIONERY,
+ _IPP_MEDIA_TYPE_LETTERHEAD,
+ _IPP_MEDIA_TYPE_TRANSPARENCY
+} _ipp_media_type_t;
static const char * const media_type_supported[] =
/* media-type-supported values */
{
@@ -182,50 +234,109 @@ static const char * const media_type_supported[] =
"transparency"
};
+typedef enum _ipp_supply_e
+{
+ _IPP_SUPPLY_CYAN, /* Cyan Toner */
+ _IPP_SUPPLY_MAGENTA, /* Magenta Toner */
+ _IPP_SUPPLY_YELLOW, /* Yellow Toner */
+ _IPP_SUPPLY_BLACK, /* Black Toner */
+ _IPP_SUPPLY_WASTE /* Waste Toner */
+} _ipp_supply_t;
+static const char * const printer_supplies[] =
+{ /* printer-supply-description values */
+ "Cyan Toner",
+ "Magenta Toner",
+ "Yellow Toner",
+ "Black Toner",
+ "Toner Waste"
+};
+
+/*
+ * URL scheme for web resources...
+ */
+
+#ifdef HAVE_SSL
+# define WEB_SCHEME "https"
+#else
+# define WEB_SCHEME "http"
+#endif /* HAVE_SSL */
+
/*
* Structures...
*/
+#ifdef HAVE_DNSSD
+typedef DNSServiceRef _ipp_srv_t; /* Service reference */
+typedef TXTRecordRef _ipp_txt_t; /* TXT record */
+
+#elif defined(HAVE_AVAHI)
+typedef AvahiEntryGroup *_ipp_srv_t; /* Service reference */
+typedef AvahiStringList *_ipp_txt_t; /* TXT record */
+
+#else
+typedef void *_ipp_srv_t; /* Service reference */
+typedef void *_ipp_txt_t; /* TXT record */
+#endif /* HAVE_DNSSD */
+
+typedef struct _ipp_filter_s /**** Attribute filter ****/
+{
+ cups_array_t *ra; /* Requested attributes */
+ ipp_tag_t group_tag; /* Group to copy */
+} _ipp_filter_t;
+
typedef struct _ipp_job_s _ipp_job_t;
typedef struct _ipp_printer_s /**** Printer data ****/
{
int ipv4, /* IPv4 listener */
ipv6; /* IPv6 listener */
-#ifdef HAVE_DNSSD
- DNSServiceRef common_ref, /* Shared service connection */
- ipp_ref, /* Bonjour IPP service */
+ _ipp_srv_t ipp_ref, /* Bonjour IPP service */
+ ipps_ref, /* Bonjour IPPS service */
http_ref, /* Bonjour HTTP service */
printer_ref; /* Bonjour LPD service */
- TXTRecordRef ipp_txt; /* Bonjour IPP TXT record */
- char *dnssd_name; /* printer-dnssd-name */
-#endif /* HAVE_DNSSD */
- char *name, /* printer-name */
+ char *dnssd_name, /* printer-dnssd-name */
+ *name, /* printer-name */
*icon, /* Icon filename */
*directory, /* Spool directory */
*hostname, /* Hostname */
- *uri; /* printer-uri-supported */
+ *uri, /* printer-uri-supported */
+ *command; /* Command to run with job file */
int port; /* Port */
size_t urilen; /* Length of printer URI */
ipp_t *attrs; /* Static attributes */
+ time_t start_time; /* Startup time */
+ time_t config_time; /* printer-config-change-time */
ipp_pstate_t state; /* printer-state value */
- _ipp_preasons_t state_reasons; /* printer-state-reasons values */
+ _ipp_preason_t state_reasons; /* printer-state-reasons values */
+ time_t state_time; /* printer-state-change-time */
cups_array_t *jobs; /* Jobs */
_ipp_job_t *active_job; /* Current active/pending job */
int next_job_id; /* Next job-id value */
_cups_rwlock_t rwlock; /* Printer lock */
+ _ipp_media_size_t main_size; /* Ready media */
+ _ipp_media_type_t main_type;
+ int main_level;
+ _ipp_media_size_t envelope_size;
+ int envelope_level;
+ _ipp_media_size_t photo_size;
+ _ipp_media_type_t photo_type;
+ int photo_level;
+ int supplies[5]; /* Supply levels (0-100) */
} _ipp_printer_t;
struct _ipp_job_s /**** Job data ****/
{
int id; /* Job ID */
- char *name, /* job-name */
+ const char *name, /* job-name */
*username, /* job-originating-user-name */
*format; /* document-format */
ipp_jstate_t state; /* job-state value */
- time_t processing, /* time-at-processing value */
+ time_t created, /* time-at-creation value */
+ processing, /* time-at-processing value */
completed; /* time-at-completed value */
+ int impressions, /* job-impressions value */
+ impcompleted; /* job-impressions-completed value */
ipp_t *attrs; /* Static attributes */
int cancel; /* Non-zero when job canceled */
char *filename; /* Print file name */
@@ -235,14 +346,16 @@ struct _ipp_job_s /**** Job data ****/
typedef struct _ipp_client_s /**** Client data ****/
{
- http_t http; /* HTTP connection */
+ http_t *http; /* HTTP connection */
ipp_t *request, /* IPP request */
*response; /* IPP response */
time_t start; /* Request start time */
http_state_t operation; /* Request operation */
ipp_op_t operation_id; /* IPP operation-id */
- char uri[1024]; /* Request URI */
+ char uri[1024], /* Request URI */
+ *options; /* URI options */
http_addr_t addr; /* Client address */
+ char hostname[256]; /* Client hostname */
_ipp_printer_t *printer; /* Printer */
_ipp_job_t *job; /* Current job, if any */
} _ipp_client_t;
@@ -260,9 +373,8 @@ static void copy_job_attributes(_ipp_client_t *client,
_ipp_job_t *job, cups_array_t *ra);
static _ipp_client_t *create_client(_ipp_printer_t *printer, int sock);
static _ipp_job_t *create_job(_ipp_client_t *client);
-static int create_listener(int family, int *port);
-static ipp_t *create_media_col(const char *media, const char *type,
- int width, int length, int margins);
+static int create_listener(int family, int port);
+static ipp_t *create_media_col(const char *media, const char *source, const char *type, int width, int length, int margins);
static ipp_t *create_media_size(int width, int length);
static _ipp_printer_t *create_printer(const char *servername,
const char *name, const char *location,
@@ -270,53 +382,62 @@ static _ipp_printer_t *create_printer(const char *servername,
const char *icon,
const char *docformats, int ppm,
int ppm_color, int duplex, int port,
-#ifdef HAVE_DNSSD
- const char *regtype,
-#endif /* HAVE_DNSSD */
- const char *directory);
-static cups_array_t *create_requested_array(_ipp_client_t *client);
+ int pin, const char *subtype,
+ const char *directory,
+ const char *command,
+ const char *attrfile);
static void debug_attributes(const char *title, ipp_t *ipp,
int response);
static void delete_client(_ipp_client_t *client);
static void delete_job(_ipp_job_t *job);
static void delete_printer(_ipp_printer_t *printer);
#ifdef HAVE_DNSSD
-static void dnssd_callback(DNSServiceRef sdRef,
+static void DNSSD_API dnssd_callback(DNSServiceRef sdRef,
DNSServiceFlags flags,
DNSServiceErrorType errorCode,
const char *name,
const char *regtype,
const char *domain,
_ipp_printer_t *printer);
+#elif defined(HAVE_AVAHI)
+static void dnssd_callback(AvahiEntryGroup *p, AvahiEntryGroupState state, void *context);
+static void dnssd_client_cb(AvahiClient *c, AvahiClientState state, void *userdata);
#endif /* HAVE_DNSSD */
+static void dnssd_init(void);
+static int filter_cb(_ipp_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr);
static _ipp_job_t *find_job(_ipp_client_t *client);
+static ipp_t *get_collection(FILE *fp, const char *filename, int *linenum);
+static char *get_token(FILE *fp, char *buf, int buflen, int *linenum);
static void html_escape(_ipp_client_t *client, const char *s,
size_t slen);
+static void html_footer(_ipp_client_t *client);
+static void html_header(_ipp_client_t *client, const char *title);
static void html_printf(_ipp_client_t *client, const char *format,
...) __attribute__((__format__(__printf__,
2, 3)));
static void ipp_cancel_job(_ipp_client_t *client);
+static void ipp_close_job(_ipp_client_t *client);
static void ipp_create_job(_ipp_client_t *client);
static void ipp_get_job_attributes(_ipp_client_t *client);
static void ipp_get_jobs(_ipp_client_t *client);
static void ipp_get_printer_attributes(_ipp_client_t *client);
+static void ipp_identify_printer(_ipp_client_t *client);
static void ipp_print_job(_ipp_client_t *client);
static void ipp_print_uri(_ipp_client_t *client);
static void ipp_send_document(_ipp_client_t *client);
static void ipp_send_uri(_ipp_client_t *client);
static void ipp_validate_job(_ipp_client_t *client);
+static void load_attributes(const char *filename, ipp_t *attrs);
+static int parse_options(_ipp_client_t *client, cups_option_t **options);
+static void process_attr_message(_ipp_job_t *job, char *message);
static void *process_client(_ipp_client_t *client);
static int process_http(_ipp_client_t *client);
static int process_ipp(_ipp_client_t *client);
static void *process_job(_ipp_job_t *job);
-#ifdef HAVE_DNSSD
-static int register_printer(_ipp_printer_t *printer,
- const char *location, const char *make,
- const char *model, const char *formats,
- const char *adminurl, int color,
- int duplex, const char *regtype);
-#endif /* HAVE_DNSSD */
+static void process_state_message(_ipp_job_t *job, char *message);
+static int register_printer(_ipp_printer_t *printer, const char *location, const char *make, const char *model, const char *formats, const char *adminurl, const char *uuid, int color, int duplex, const char *regtype);
static int respond_http(_ipp_client_t *client, http_status_t code,
+ const char *content_coding,
const char *type, size_t length);
static void respond_ipp(_ipp_client_t *client, ipp_status_t status,
const char *message, ...)
@@ -324,6 +445,7 @@ static void respond_ipp(_ipp_client_t *client, ipp_status_t status,
static void respond_unsupported(_ipp_client_t *client,
ipp_attribute_t *attr);
static void run_printer(_ipp_printer_t *printer);
+static char *time_string(time_t tv, char *buffer, size_t bufsize);
static void usage(int status) __attribute__((noreturn));
static int valid_doc_attributes(_ipp_client_t *client);
static int valid_job_attributes(_ipp_client_t *client);
@@ -333,6 +455,13 @@ static int valid_job_attributes(_ipp_client_t *client);
* Globals...
*/
+#ifdef HAVE_DNSSD
+static DNSServiceRef DNSSDMaster = NULL;
+#elif defined(HAVE_AVAHI)
+static AvahiThreadedPoll *DNSSDMaster = NULL;
+static AvahiClient *DNSSDClient = NULL;
+#endif /* HAVE_DNSSD */
+
static int KeepFiles = 0,
Verbosity = 0;
@@ -347,22 +476,27 @@ main(int argc, /* I - Number of command-line args */
{
int i; /* Looping var */
const char *opt, /* Current option character */
+ *attrfile = NULL, /* Attributes file */
+ *command = NULL, /* Command to run with job files */
*servername = NULL, /* Server host name */
*name = NULL, /* Printer name */
*location = "", /* Location of printer */
*make = "Test", /* Manufacturer */
*model = "Printer", /* Model */
*icon = "printer.png", /* Icon file */
- *formats = "application/pdf,image/jpeg";
+ *formats = "application/pdf,image/jpeg,image/pwg-raster";
/* Supported formats */
-#ifdef HAVE_DNSSD
- const char *regtype = "_ipp._tcp"; /* Bonjour service type */
-#endif /* HAVE_DNSSD */
- int port = 8631, /* Port number (0 = auto) TODO: FIX */
+#ifdef HAVE_SSL
+ const char *keypath = NULL; /* Keychain path */
+#endif /* HAVE_SSL */
+ const char *subtype = "_print"; /* Bonjour service subtype */
+ int port = 0, /* Port number (0 = auto) */
duplex = 0, /* Duplex mode */
ppm = 10, /* Pages per minute for mono */
- ppm_color = 0; /* Pages per minute for color */
- char directory[1024] = ""; /* Spool directory */
+ ppm_color = 0, /* Pages per minute for color */
+ pin = 0; /* PIN printing mode? */
+ char directory[1024] = "", /* Spool directory */
+ hostname[1024]; /* Auto-detected hostname */
_ipp_printer_t *printer; /* Printer object */
@@ -374,12 +508,22 @@ main(int argc, /* I - Number of command-line args */
if (argv[i][0] == '-')
{
for (opt = argv[i] + 1; *opt; opt ++)
+ {
switch (*opt)
{
case '2' : /* -2 (enable 2-sided printing) */
duplex = 1;
break;
+#ifdef HAVE_SSL
+ case 'K' : /* -K keypath */
+ i ++;
+ if (i >= argc)
+ usage(1);
+ keypath = argv[i];
+ break;
+#endif /* HAVE_SSL */
+
case 'M' : /* -M manufacturer */
i ++;
if (i >= argc)
@@ -387,6 +531,26 @@ main(int argc, /* I - Number of command-line args */
make = argv[i];
break;
+ case 'P' : /* -P (PIN printing mode) */
+ pin = 1;
+ break;
+
+ case 'a' : /* -a attributes-file */
+ i ++;
+ if (i >= argc)
+ usage(1);
+
+ attrfile = argv[i];
+ break;
+
+ case 'c' : /* -c command */
+ i ++;
+ if (i >= argc)
+ usage(1);
+
+ command = argv[i];
+ break;
+
case 'd' : /* -d spool-directory */
i ++;
if (i >= argc)
@@ -403,7 +567,6 @@ main(int argc, /* I - Number of command-line args */
case 'h' : /* -h (show help) */
usage(0);
- break;
case 'i' : /* -i icon.png */
i ++;
@@ -444,14 +607,12 @@ main(int argc, /* I - Number of command-line args */
port = atoi(argv[i]);
break;
-#ifdef HAVE_DNSSD
- case 'r' : /* -r regtype */
+ case 'r' : /* -r subtype */
i ++;
if (i >= argc)
usage(1);
- regtype = argv[i];
+ subtype = argv[i];
break;
-#endif /* HAVE_DNSSD */
case 's' : /* -s speed[,color-speed] */
i ++;
@@ -468,8 +629,8 @@ main(int argc, /* I - Number of command-line args */
default : /* Unknown */
fprintf(stderr, "Unknown option \"-%c\".\n", *opt);
usage(1);
- break;
}
+ }
}
else if (!name)
{
@@ -488,11 +649,48 @@ main(int argc, /* I - Number of command-line args */
* Apply defaults as needed...
*/
+ if (!servername)
+ servername = httpGetHostname(NULL, hostname, sizeof(hostname));
+
+ if (!port)
+ {
+#ifdef WIN32
+ /*
+ * Windows is almost always used as a single user system, so use a default
+ * port number of 8631.
+ */
+
+ port = 8631;
+
+#else
+ /*
+ * Use 8000 + UID mod 1000 for the default port number...
+ */
+
+ port = 8000 + ((int)getuid() % 1000);
+#endif /* WIN32 */
+
+ fprintf(stderr, "Listening on port %d.\n", port);
+ }
+
if (!directory[0])
{
- snprintf(directory, sizeof(directory), "/tmp/ippserver.%d", (int)getpid());
+ const char *tmpdir; /* Temporary directory */
+
+#ifdef WIN32
+ if ((tmpdir = getenv("TEMP")) == NULL)
+ tmpdir = "C:/TEMP";
+#elif defined(__APPLE__)
+ if ((tmpdir = getenv("TMPDIR")) == NULL)
+ tmpdir = "/private/tmp";
+#else
+ if ((tmpdir = getenv("TMPDIR")) == NULL)
+ tmpdir = "/tmp";
+#endif /* WIN32 */
+
+ snprintf(directory, sizeof(directory), "%s/ippserver.%d", tmpdir, (int)getpid());
- if (mkdir(directory, 0777) && errno != EEXIST)
+ if (mkdir(directory, 0755) && errno != EEXIST)
{
fprintf(stderr, "Unable to create spool directory \"%s\": %s\n",
directory, strerror(errno));
@@ -503,16 +701,23 @@ main(int argc, /* I - Number of command-line args */
fprintf(stderr, "Using spool directory \"%s\".\n", directory);
}
+#ifdef HAVE_SSL
+ cupsSetServerCredentials(keypath, servername, 1);
+#endif /* HAVE_SSL */
+
+ /*
+ * Initialize Bonjour...
+ */
+
+ dnssd_init();
+
/*
* Create the printer...
*/
if ((printer = create_printer(servername, name, location, make, model, icon,
- formats, ppm, ppm_color, duplex, port,
-#ifdef HAVE_DNSSD
- regtype,
-#endif /* HAVE_DNSSD */
- directory)) == NULL)
+ formats, ppm, ppm_color, duplex, port, pin,
+ subtype, directory, command, attrfile)) == NULL)
return (1);
/*
@@ -585,25 +790,13 @@ copy_attributes(ipp_t *to, /* I - Destination request */
ipp_tag_t group_tag, /* I - Group to copy */
int quickcopy) /* I - Do a quick copy? */
{
- ipp_attribute_t *fromattr; /* Source attribute */
-
-
- if (!to || !from)
- return;
+ _ipp_filter_t filter; /* Filter data */
- for (fromattr = from->attrs; fromattr; fromattr = fromattr->next)
- {
- /*
- * Filter attributes as needed...
- */
- if ((group_tag != IPP_TAG_ZERO && fromattr->group_tag != group_tag &&
- fromattr->group_tag != IPP_TAG_ZERO) || !fromattr->name)
- continue;
+ filter.ra = ra;
+ filter.group_tag = group_tag;
- if (!ra || cupsArrayFind(ra, fromattr->name))
- ippCopyAttribute(to, fromattr, quickcopy);
- }
+ ippCopyAttributes(to, from, quickcopy, (ipp_copycb_t)filter_cb, &filter);
}
@@ -619,71 +812,134 @@ copy_job_attributes(
{
copy_attributes(client->response, job->attrs, ra, IPP_TAG_JOB, 0);
+ if (!ra || cupsArrayFind(ra, "date-time-at-completed"))
+ {
+ if (job->completed)
+ ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed));
+ else
+ ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed");
+ }
+
+ if (!ra || cupsArrayFind(ra, "date-time-at-processing"))
+ {
+ if (job->processing)
+ ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-processing", ippTimeToDate(job->processing));
+ else
+ ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing");
+ }
+
+ if (!ra || cupsArrayFind(ra, "job-impressions"))
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions", job->impressions);
+
+ if (!ra || cupsArrayFind(ra, "job-impressions-completed"))
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", job->impcompleted);
+
if (!ra || cupsArrayFind(ra, "job-printer-up-time"))
- ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER,
- "job-printer-up-time", (int)time(NULL));
+ ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-printer-up-time", (int)(time(NULL) - client->printer->start_time));
if (!ra || cupsArrayFind(ra, "job-state"))
ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_ENUM,
"job-state", job->state);
+ if (!ra || cupsArrayFind(ra, "job-state-message"))
+ {
+ switch (job->state)
+ {
+ case IPP_JSTATE_PENDING :
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job pending.");
+ break;
+
+ case IPP_JSTATE_HELD :
+ if (job->fd >= 0)
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job incoming.");
+ else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO))
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job held.");
+ else
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job created.");
+ break;
+
+ case IPP_JSTATE_PROCESSING :
+ if (job->cancel)
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job canceling.");
+ else
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job printing.");
+ break;
+
+ case IPP_JSTATE_STOPPED :
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job stopped.");
+ break;
+
+ case IPP_JSTATE_CANCELED :
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job canceled.");
+ break;
+
+ case IPP_JSTATE_ABORTED :
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job aborted.");
+ break;
+
+ case IPP_JSTATE_COMPLETED :
+ ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job completed.");
+ break;
+ }
+ }
+
if (!ra || cupsArrayFind(ra, "job-state-reasons"))
{
switch (job->state)
{
- case IPP_JOB_PENDING :
+ case IPP_JSTATE_PENDING :
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
NULL, "none");
break;
- case IPP_JOB_HELD :
+ case IPP_JSTATE_HELD :
if (job->fd >= 0)
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
- NULL, "job-incoming");
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-incoming");
else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO))
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
- NULL, "job-hold-until-specified");
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-hold-until-specified");
else
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
- NULL, "job-data-insufficient");
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-data-insufficient");
break;
- case IPP_JOB_PROCESSING :
+ case IPP_JSTATE_PROCESSING :
if (job->cancel)
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
- NULL, "processing-to-stop-point");
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "processing-to-stop-point");
else
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
- NULL, "job-printing");
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "job-state-reasons", NULL, "job-printing");
break;
- case IPP_JOB_STOPPED :
+ case IPP_JSTATE_STOPPED :
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
NULL, "job-stopped");
break;
- case IPP_JOB_CANCELED :
+ case IPP_JSTATE_CANCELED :
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
NULL, "job-canceled-by-user");
break;
- case IPP_JOB_ABORTED :
+ case IPP_JSTATE_ABORTED :
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
NULL, "aborted-by-system");
break;
- case IPP_JOB_COMPLETED :
+ case IPP_JSTATE_COMPLETED :
ippAddString(client->response, IPP_TAG_JOB,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+ IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
NULL, "job-completed-successfully");
break;
}
@@ -692,12 +948,12 @@ copy_job_attributes(
if (!ra || cupsArrayFind(ra, "time-at-completed"))
ippAddInteger(client->response, IPP_TAG_JOB,
job->completed ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE,
- "time-at-completed", job->completed);
+ "time-at-completed", (int)(job->completed - client->printer->start_time));
if (!ra || cupsArrayFind(ra, "time-at-processing"))
ippAddInteger(client->response, IPP_TAG_JOB,
job->processing ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE,
- "time-at-processing", job->processing);
+ "time-at-processing", (int)(job->processing - client->printer->start_time));
}
@@ -711,8 +967,6 @@ create_client(_ipp_printer_t *printer, /* I - Printer */
int sock) /* I - Listen socket */
{
_ipp_client_t *client; /* Client */
- int val; /* Parameter value */
- socklen_t addrlen; /* Length of address */
if ((client = calloc(1, sizeof(_ipp_client_t))) == NULL)
@@ -721,20 +975,13 @@ create_client(_ipp_printer_t *printer, /* I - Printer */
return (NULL);
}
- client->printer = printer;
- client->http.activity = time(NULL);
- client->http.hostaddr = &(client->addr);
- client->http.blocking = 1;
- client->http.wait_value = 60000;
+ client->printer = printer;
/*
* Accept the client and get the remote address...
*/
- addrlen = sizeof(http_addr_t);
-
- if ((client->http.fd = accept(sock, (struct sockaddr *)&(client->addr),
- &addrlen)) < 0)
+ if ((client->http = httpAcceptConnection(sock, 1)) == NULL)
{
perror("Unable to accept client connection");
@@ -743,23 +990,10 @@ create_client(_ipp_printer_t *printer, /* I - Printer */
return (NULL);
}
- httpAddrString(&(client->addr), client->http.hostname,
- sizeof(client->http.hostname));
+ httpGetHostname(client->http, client->hostname, sizeof(client->hostname));
if (Verbosity)
- fprintf(stderr, "Accepted connection from %s (%s)\n", client->http.hostname,
- client->http.hostaddr->addr.sa_family == AF_INET ? "IPv4" : "IPv6");
-
- /*
- * Using TCP_NODELAY improves responsiveness, especially on systems
- * with a slow loopback interface. Since we write large buffers
- * when sending print files and requests, there shouldn't be any
- * performance penalty for this...
- */
-
- val = 1;
- setsockopt(client->http.fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val,
- sizeof(val));
+ fprintf(stderr, "Accepted connection from %s\n", client->hostname);
return (client);
}
@@ -775,12 +1009,13 @@ create_job(_ipp_client_t *client) /* I - Client */
{
_ipp_job_t *job; /* Job */
ipp_attribute_t *attr; /* Job attribute */
- char uri[1024]; /* job-uri value */
+ char uri[1024], /* job-uri value */
+ uuid[64]; /* job-uuid value */
_cupsRWLockWrite(&(client->printer->rwlock));
if (client->printer->active_job &&
- client->printer->active_job->state < IPP_JOB_CANCELED)
+ client->printer->active_job->state < IPP_JSTATE_CANCELED)
{
/*
* Only accept a single job at a time...
@@ -801,42 +1036,42 @@ create_job(_ipp_client_t *client) /* I - Client */
}
job->printer = client->printer;
- job->attrs = client->request;
- job->state = IPP_JOB_HELD;
+ job->attrs = ippNew();
+ job->state = IPP_JSTATE_HELD;
job->fd = -1;
- client->request = NULL;
/*
- * Set all but the first two attributes to the job attributes group...
+ * Copy all of the job attributes...
*/
- for (attr = job->attrs->attrs->next->next; attr; attr = attr->next)
- attr->group_tag = IPP_TAG_JOB;
+ copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
/*
* Get the requesting-user-name, document format, and priority...
*/
- if ((attr = ippFindAttribute(job->attrs, "requesting-user-name",
- IPP_TAG_NAME)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL)
+ job->username = ippGetString(attr, 0, NULL);
+ else
+ job->username = "anonymous";
+
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-user-name", NULL, job->username);
+
+ if (ippGetOperation(client->request) != IPP_OP_CREATE_JOB)
{
- _cupsStrFree(attr->name);
- attr->name = _cupsStrAlloc("job-originating-user-name");
+ if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else
+ job->format = "application/octet-stream";
}
- else
- attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME | IPP_TAG_COPY,
- "job-originating-user-name", NULL, "anonymous");
- if (attr)
- job->username = attr->values[0].string.text;
- else
- job->username = "anonymous";
+ if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_INTEGER)) != NULL)
+ job->impressions = ippGetInteger(attr, 0);
- if ((attr = ippFindAttribute(job->attrs, "document-format",
- IPP_TAG_MIMETYPE)) != NULL)
- job->format = attr->values[0].string.text;
- else
- job->format = "application/octet-stream";
+ if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_NAME)) != NULL)
+ job->name = ippGetString(attr, 0, NULL);
/*
* Add job description attributes and add to the jobs array...
@@ -845,13 +1080,17 @@ create_job(_ipp_client_t *client) /* I - Client */
job->id = client->printer->next_job_id ++;
snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id);
+ httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid));
+ ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created)));
ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id);
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri);
- ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL,
- client->printer->uri);
- ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation",
- (int)time(NULL));
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid);
+ if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL)
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, ippGetString(attr, 0, NULL));
+ else
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri);
+ ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time));
cupsArrayAdd(client->printer->jobs, job);
client->printer->active_job = job;
@@ -863,64 +1102,86 @@ create_job(_ipp_client_t *client) /* I - Client */
/*
- * 'create_listener()' - Create a listener socket.
+ * 'create_job_filename()' - Create the filename for a document in a job.
*/
-static int /* O - Listener socket or -1 on error */
-create_listener(int family, /* I - Address family */
- int *port) /* IO - Port number */
+static void create_job_filename(
+ _ipp_printer_t *printer, /* I - Printer */
+ _ipp_job_t *job, /* I - Job */
+ char *fname, /* I - Filename buffer */
+ size_t fnamesize) /* I - Size of filename buffer */
{
- int sock, /* Listener socket */
- val; /* Socket value */
- http_addr_t address; /* Listen address */
- socklen_t addrlen; /* Length of listen address */
+ char name[256], /* "Safe" filename */
+ *nameptr; /* Pointer into filename */
+ const char *ext, /* Filename extension */
+ *job_name; /* job-name value */
+ ipp_attribute_t *job_name_attr; /* job-name attribute */
- if ((sock = socket(family, SOCK_STREAM, 0)) < 0)
- return (-1);
+ /*
+ * Make a name from the job-name attribute...
+ */
- val = 1;
- setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+ if ((job_name_attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL)
+ job_name = ippGetString(job_name_attr, 0, NULL);
+ else
+ job_name = "untitled";
-#ifdef IPV6_V6ONLY
- if (family == AF_INET6)
- setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
-#endif /* IPV6_V6ONLY */
+ for (nameptr = name; *job_name && nameptr < (name + sizeof(name) - 1); job_name ++)
+ if (isalnum(*job_name & 255) || *job_name == '-')
+ *nameptr++ = (char)tolower(*job_name & 255);
+ else
+ *nameptr++ = '_';
- if (!*port)
- {
- /*
- * Get the auto-assigned port number for the IPv4 socket...
- */
+ *nameptr = '\0';
- /* TODO: This code does not appear to work - port is always 0... */
- addrlen = sizeof(address);
- if (getsockname(sock, (struct sockaddr *)&address, &addrlen))
- {
- perror("getsockname() failed");
- *port = 8631;
- }
- else
- *port = _httpAddrPort(&address);
+ /*
+ * Figure out the extension...
+ */
- fprintf(stderr, "Listening on port %d.\n", *port);
- }
+ if (!strcasecmp(job->format, "image/jpeg"))
+ ext = "jpg";
+ else if (!strcasecmp(job->format, "image/png"))
+ ext = "png";
+ else if (!strcasecmp(job->format, "image/pwg-raster"))
+ ext = "ras";
+ else if (!strcasecmp(job->format, "image/urf"))
+ ext = "urf";
+ else if (!strcasecmp(job->format, "application/pdf"))
+ ext = "pdf";
+ else if (!strcasecmp(job->format, "application/postscript"))
+ ext = "ps";
+ else
+ ext = "prn";
+
+ /*
+ * Create a filename with the job-id, job-name, and document-format (extension)...
+ */
- memset(&address, 0, sizeof(address));
- address.addr.sa_family = family;
- _httpAddrSetPort(&address, *port);
+ snprintf(fname, fnamesize, "%s/%d-%s.%s", printer->directory, job->id, name, ext);
+}
- if (bind(sock, (struct sockaddr *)&address, httpAddrLength(&address)))
- {
- close(sock);
- return (-1);
- }
- if (listen(sock, 5))
- {
- close(sock);
+/*
+ * 'create_listener()' - Create a listener socket.
+ */
+
+static int /* O - Listener socket or -1 on error */
+create_listener(int family, /* I - Address family */
+ int port) /* I - Port number */
+{
+ int sock; /* Listener socket */
+ http_addrlist_t *addrlist; /* Listen address */
+ char service[255]; /* Service port */
+
+
+ snprintf(service, sizeof(service), "%d", port);
+ if ((addrlist = httpAddrGetList(NULL, family, service)) == NULL)
return (-1);
- }
+
+ sock = httpAddrListen(&(addrlist->addr), port);
+
+ httpAddrFreeList(addrlist);
return (sock);
}
@@ -932,7 +1193,8 @@ create_listener(int family, /* I - Address family */
static ipp_t * /* O - media-col collection */
create_media_col(const char *media, /* I - Media name */
- const char *type, /* I - Nedua type */
+ const char *source, /* I - Media source */
+ const char *type, /* I - Media type */
int width, /* I - x-dimension in 2540ths */
int length, /* I - y-dimension in 2540ths */
int margins) /* I - Value for margins */
@@ -943,12 +1205,19 @@ create_media_col(const char *media, /* I - Media name */
char media_key[256]; /* media-key value */
- snprintf(media_key, sizeof(media_key), "%s_%s%s", media, type,
- margins == 0 ? "_borderless" : "");
+ if (type && source)
+ snprintf(media_key, sizeof(media_key), "%s_%s_%s%s", media, source, type, margins == 0 ? "_borderless" : "");
+ else if (type)
+ snprintf(media_key, sizeof(media_key), "%s__%s%s", media, type, margins == 0 ? "_borderless" : "");
+ else if (source)
+ snprintf(media_key, sizeof(media_key), "%s_%s%s", media, source, margins == 0 ? "_borderless" : "");
+ else
+ snprintf(media_key, sizeof(media_key), "%s%s", media, margins == 0 ? "_borderless" : "");
ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-key", NULL,
media_key);
ippAddCollection(media_col, IPP_TAG_PRINTER, "media-size", media_size);
+ ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-size-name", NULL, media);
ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
"media-bottom-margin", margins);
ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -957,8 +1226,10 @@ create_media_col(const char *media, /* I - Media name */
"media-right-margin", margins);
ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
"media-top-margin", margins);
- ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type",
- NULL, type);
+ if (source)
+ ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-source", NULL, source);
+ if (type)
+ ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type", NULL, type);
ippDelete(media_size);
@@ -1003,19 +1274,28 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
int ppm_color, /* I - Pages per minute in color (0 for gray) */
int duplex, /* I - 1 = duplex, 0 = simplex */
int port, /* I - Port for listeners or 0 for auto */
-#ifdef HAVE_DNSSD
- const char *regtype, /* I - Bonjour service type */
-#endif /* HAVE_DNSSD */
- const char *directory) /* I - Spool directory */
+ int pin, /* I - Require PIN printing */
+ const char *subtype, /* I - Bonjour service subtype */
+ const char *directory, /* I - Spool directory */
+ const char *command, /* I - Command to run on job files */
+ const char *attrfile) /* I - Attributes file */
{
int i, j; /* Looping vars */
_ipp_printer_t *printer; /* Printer */
- char hostname[256], /* Hostname */
- uri[1024], /* Printer URI */
+#ifndef WIN32
+ char path[1024]; /* Full path to command */
+#endif /* !WIN32 */
+ char uri[1024], /* Printer URI */
+#ifdef HAVE_SSL
+ securi[1024], /* Secure printer URI */
+ *uris[2], /* All URIs */
+#endif /* HAVE_SSL */
icons[1024], /* printer-icons URI */
adminurl[1024], /* printer-more-info URI */
+ supplyurl[1024],/* printer-supply-info-uri URI */
device_id[1024],/* printer-device-id */
- make_model[128];/* printer-make-and-model */
+ make_model[128],/* printer-make-and-model */
+ uuid[128]; /* printer-uuid */
int num_formats; /* Number of document-format-supported values */
char *defformat, /* document-format-default value */
*formats[100], /* document-format-supported values */
@@ -1028,8 +1308,7 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
/* media-size-supported value */
ipp_t *media_col_default;
/* media-col-default value */
- _ipp_value_t *media_col_value;
- /* Current media-col-database value */
+ int media_col_index;/* Current media-col-database value */
int k_supported; /* Maximum file size supported */
#ifdef HAVE_STATVFS
struct statvfs spoolinfo; /* FS info for spool directory */
@@ -1040,10 +1319,10 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
#endif /* HAVE_STATVFS */
static const int orients[4] = /* orientation-requested-supported values */
{
- IPP_PORTRAIT,
- IPP_LANDSCAPE,
- IPP_REVERSE_LANDSCAPE,
- IPP_REVERSE_PORTRAIT
+ IPP_ORIENT_PORTRAIT,
+ IPP_ORIENT_LANDSCAPE,
+ IPP_ORIENT_REVERSE_LANDSCAPE,
+ IPP_ORIENT_REVERSE_PORTRAIT
};
static const char * const versions[] =/* ipp-versions-supported values */
{
@@ -1051,29 +1330,52 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
"1.1",
"2.0"
};
+ static const char * const features[] =/* ipp-features-supported values */
+ {
+ "ipp-everywhere"
+ };
static const int ops[] = /* operations-supported values */
{
- IPP_PRINT_JOB,
- IPP_PRINT_URI,
- IPP_VALIDATE_JOB,
- IPP_CREATE_JOB,
- IPP_SEND_DOCUMENT,
- IPP_SEND_URI,
- IPP_CANCEL_JOB,
- IPP_GET_JOB_ATTRIBUTES,
- IPP_GET_JOBS,
- IPP_GET_PRINTER_ATTRIBUTES
+ IPP_OP_PRINT_JOB,
+ IPP_OP_PRINT_URI,
+ IPP_OP_VALIDATE_JOB,
+ IPP_OP_CREATE_JOB,
+ IPP_OP_SEND_DOCUMENT,
+ IPP_OP_SEND_URI,
+ IPP_OP_CANCEL_JOB,
+ IPP_OP_GET_JOB_ATTRIBUTES,
+ IPP_OP_GET_JOBS,
+ IPP_OP_GET_PRINTER_ATTRIBUTES,
+ IPP_OP_CANCEL_MY_JOBS,
+ IPP_OP_CLOSE_JOB,
+ IPP_OP_IDENTIFY_PRINTER
};
static const char * const charsets[] =/* charset-supported values */
{
"us-ascii",
"utf-8"
};
+ static const char * const compressions[] =/* compression-supported values */
+ {
+#ifdef HAVE_LIBZ
+ "deflate",
+ "gzip",
+#endif /* HAVE_LIBZ */
+ "none"
+ };
+ static const char * const identify_actions[] =
+ {
+ "display",
+ "sound"
+ };
static const char * const job_creation[] =
{ /* job-creation-attributes-supported values */
"copies",
"ipp-attribute-fidelity",
+ "job-account-id",
+ "job-accounting-user-id",
"job-name",
+ "job-password",
"job-priority",
"media",
"media-col",
@@ -1088,6 +1390,7 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
"media-left-margin",
"media-right-margin",
"media-size",
+ "media-source",
"media-top-margin",
"media-type"
};
@@ -1101,12 +1404,36 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
"separate-documents-uncollated-copies",
"separate-documents-collated-copies"
};
+ static const char * const overrides[] =
+ { /* overrides-supported */
+ "document-number",
+ "pages"
+ };
+ static const char * const print_color_mode_supported[] =
+ { /* print-color-mode-supported values */
+ "auto",
+ "color",
+ "monochrome"
+ };
static const int print_quality_supported[] =
{ /* print-quality-supported values */
IPP_QUALITY_DRAFT,
IPP_QUALITY_NORMAL,
IPP_QUALITY_HIGH
};
+ static const int pwg_raster_document_resolution_supported[] =
+ {
+ 150,
+ 300
+ };
+ static const char * const pwg_raster_document_type_supported[] =
+ {
+ "black_1",
+ "cmyk_8",
+ "sgray_8",
+ "srgb_8",
+ "srgb_16"
+ };
static const char * const reference_uri_schemes_supported[] =
{ /* reference-uri-schemes-supported */
"file",
@@ -1122,6 +1449,29 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
"two-sided-long-edge",
"two-sided-short-edge"
};
+ static const char * const urf_supported[] =
+ { /* urf-supported values */
+ "CP1",
+ "IS1-5-7",
+ "MT1-2-3-4-5-6-8-9-10-11-12-13",
+ "RS300",
+ "SRGB24",
+ "V1.4",
+ "W8",
+ "DM1"
+ };
+#ifdef HAVE_SSL
+ static const char * const uri_authentication_supported[] =
+ { /* uri-authentication-supported values */
+ "none",
+ "none"
+ };
+ static const char * const uri_security_supported[] =
+ { /* uri-security-supported values */
+ "none",
+ "tls"
+ };
+#endif /* HAVE_SSL */
static const char * const which_jobs[] =
{ /* which-jobs-supported values */
"completed",
@@ -1136,50 +1486,101 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
};
+#ifndef WIN32
+ /*
+ * If a command was specified, make sure it exists and is executable...
+ */
+
+ if (command)
+ {
+ if (*command == '/' || !strncmp(command, "./", 2))
+ {
+ if (access(command, X_OK))
+ {
+ fprintf(stderr, "ippserver: Unable to execute command \"%s\": %s\n", command, strerror(errno));
+ return (NULL);
+ }
+ }
+ else
+ {
+ if (!cupsFileFind(command, getenv("PATH"), 1, path, sizeof(path)))
+ {
+ fprintf(stderr, "ippserver: Unable to find command \"%s\".\n", command);
+ return (NULL);
+ }
+
+ command = path;
+ }
+ }
+#endif /* !WIN32 */
+
/*
* Allocate memory for the printer...
*/
if ((printer = calloc(1, sizeof(_ipp_printer_t))) == NULL)
{
- perror("Unable to allocate memory for printer");
+ perror("ippserver: Unable to allocate memory for printer");
return (NULL);
}
printer->ipv4 = -1;
printer->ipv6 = -1;
- printer->name = _cupsStrAlloc(name);
-#ifdef HAVE_DNSSD
- printer->dnssd_name = _cupsStrRetain(printer->name);
-#endif /* HAVE_DNSSD */
- printer->directory = _cupsStrAlloc(directory);
- printer->hostname = _cupsStrAlloc(servername ? servername :
- httpGetHostname(NULL, hostname,
- sizeof(hostname)));
+ printer->name = strdup(name);
+ printer->dnssd_name = strdup(printer->name);
+ printer->command = command ? strdup(command) : NULL;
+ printer->directory = strdup(directory);
+ printer->hostname = strdup(servername);
printer->port = port;
- printer->state = IPP_PRINTER_IDLE;
- printer->state_reasons = _IPP_PRINTER_NONE;
+ printer->start_time = time(NULL);
+ printer->config_time = printer->start_time;
+ printer->state = IPP_PSTATE_IDLE;
+ printer->state_reasons = _IPP_PREASON_NONE;
+ printer->state_time = printer->start_time;
printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL);
printer->next_job_id = 1;
- httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
- printer->hostname, printer->port, "/ipp");
- printer->uri = _cupsStrAlloc(uri);
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, printer->hostname, printer->port, "/ipp/print");
+ printer->uri = strdup(uri);
printer->urilen = strlen(uri);
+#ifdef HAVE_SSL
+ httpAssembleURI(HTTP_URI_CODING_ALL, securi, sizeof(securi), "ipps", NULL, printer->hostname, printer->port, "/ipp/print");
+#endif /* HAVE_SSL */
+
+ if (icon)
+ printer->icon = strdup(icon);
+
+ printer->main_size = _IPP_MEDIA_SIZE_A4;
+ printer->main_type = _IPP_MEDIA_TYPE_STATIONERY;
+ printer->main_level = 500;
+
+ printer->envelope_size = _IPP_MEDIA_SIZE_NONE;
+ printer->envelope_level = 0;
+
+ printer->photo_size = _IPP_MEDIA_SIZE_NONE;
+ printer->photo_type = _IPP_MEDIA_TYPE_NONE;
+ printer->photo_level = 0;
+
+ printer->supplies[_IPP_SUPPLY_CYAN] = 100;
+ printer->supplies[_IPP_SUPPLY_MAGENTA] = 100;
+ printer->supplies[_IPP_SUPPLY_YELLOW] = 100;
+ printer->supplies[_IPP_SUPPLY_BLACK] = 100;
+ printer->supplies[_IPP_SUPPLY_WASTE] = 0;
+
_cupsRWInit(&(printer->rwlock));
/*
* Create the listener sockets...
*/
- if ((printer->ipv4 = create_listener(AF_INET, &(printer->port))) < 0)
+ if ((printer->ipv4 = create_listener(AF_INET, printer->port)) < 0)
{
perror("Unable to create IPv4 listener");
goto bad_printer;
}
- if ((printer->ipv6 = create_listener(AF_INET6, &(printer->port))) < 0)
+ if ((printer->ipv6 = create_listener(AF_INET6, printer->port)) < 0)
{
perror("Unable to create IPv6 listener");
goto bad_printer;
@@ -1189,14 +1590,14 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
* Prepare values for the printer attributes...
*/
- httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), "http", NULL,
- printer->hostname, printer->port, "/icon.png");
- httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL,
- printer->hostname, printer->port, "/");
+ httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), WEB_SCHEME, NULL, printer->hostname, printer->port, "/icon.png");
+ httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/");
+ httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/supplies");
if (Verbosity)
{
fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl);
+ fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl);
fprintf(stderr, "printer-uri=\"%s\"\n", uri);
}
@@ -1210,7 +1611,7 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
*ptr++ = '\0';
formats[num_formats++] = ptr;
- if (!_cups_strcasecmp(ptr, "application/octet-stream"))
+ if (!strcasecmp(ptr, "application/octet-stream"))
defformat = ptr;
}
@@ -1219,24 +1620,27 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
prefix = "CMD:";
for (i = 0; i < num_formats; i ++)
{
- if (!_cups_strcasecmp(formats[i], "application/pdf"))
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPDF", prefix);
- else if (!_cups_strcasecmp(formats[i], "application/postscript"))
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPS", prefix);
- else if (!_cups_strcasecmp(formats[i], "application/vnd.hp-PCL"))
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPCL", prefix);
- else if (!_cups_strcasecmp(formats[i], "image/jpeg"))
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sJPEG", prefix);
- else if (!_cups_strcasecmp(formats[i], "image/png"))
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPNG", prefix);
- else if (_cups_strcasecmp(formats[i], "application/octet-stream"))
- snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%s%s", prefix,
- formats[i]);
+ if (!strcasecmp(formats[i], "application/pdf"))
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPDF", prefix);
+ else if (!strcasecmp(formats[i], "application/postscript"))
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPS", prefix);
+ else if (!strcasecmp(formats[i], "application/vnd.hp-PCL"))
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPCL", prefix);
+ else if (!strcasecmp(formats[i], "image/jpeg"))
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sJPEG", prefix);
+ else if (!strcasecmp(formats[i], "image/png"))
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPNG", prefix);
+ else if (strcasecmp(formats[i], "application/octet-stream"))
+ snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%s%s", prefix, formats[i]);
ptr += strlen(ptr);
prefix = ",";
}
- strlcat(device_id, ";", sizeof(device_id));
+ if (ptr < (device_id + sizeof(device_id) - 1))
+ {
+ *ptr++ = ';';
+ *ptr = '\0';
+ }
/*
* Get the maximum spool size based on the size of the filesystem used for
@@ -1273,29 +1677,30 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
printer->attrs = ippNew();
+ if (attrfile)
+ load_attributes(attrfile, printer->attrs);
+
/* charset-configured */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_CHARSET | IPP_TAG_COPY,
- "charset-configured", NULL, "utf-8");
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-configured", NULL, "utf-8");
/* charset-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_CHARSET | IPP_TAG_COPY,
- "charset-supported", sizeof(charsets) / sizeof(charsets[0]),
- NULL, charsets);
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-supported", sizeof(charsets) / sizeof(charsets[0]), NULL, charsets);
/* color-supported */
- ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "color-supported",
- ppm_color > 0);
+ if (!ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_ZERO))
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "color-supported", ppm_color > 0);
/* compression-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "compression-supported", NULL, "none");
+ if (!ippFindAttribute(printer->attrs, "compression-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "compression-supported", (int)(sizeof(compressions) / sizeof(compressions[0])), NULL, compressions);
/* copies-default */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "copies-default", 1);
+ if (!ippFindAttribute(printer->attrs, "copies-default", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1);
/* copies-supported */
- ippAddRange(printer->attrs, IPP_TAG_PRINTER, "copies-supported", 1, 999);
+ if (!ippFindAttribute(printer->attrs, "copies-supported", IPP_TAG_ZERO))
+ ippAddRange(printer->attrs, IPP_TAG_PRINTER, "copies-supported", 1, 999);
/* document-format-default */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE,
@@ -1306,225 +1711,261 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
"document-format-supported", num_formats, NULL,
(const char * const *)formats);
+ /* document-password-supported */
+ if (!ippFindAttribute(printer->attrs, "document-password-supported", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 127);
+
/* finishings-default */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
- "finishings-default", IPP_FINISHINGS_NONE);
+ if (!ippFindAttribute(printer->attrs, "finishings-default", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE);
/* finishings-supported */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
- "finishings-supported", IPP_FINISHINGS_NONE);
+ if (!ippFindAttribute(printer->attrs, "finishings-supported", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE);
/* generated-natural-language-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE | IPP_TAG_COPY,
- "generated-natural-language-supported", NULL, "en");
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "generated-natural-language-supported", NULL, "en");
+
+ /* identify-actions-default */
+ if (!ippFindAttribute(printer->attrs, "identify-actions-default", IPP_TAG_ZERO))
+ ippAddString (printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-default", NULL, "sound");
+
+ /* identify-actions-supported */
+ if (!ippFindAttribute(printer->attrs, "identify-actions-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-supported", sizeof(identify_actions) / sizeof(identify_actions[0]), NULL, identify_actions);
+
+ /* ipp-features-supported */
+ if (!ippFindAttribute(printer->attrs, "ipp-features-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features);
/* ipp-versions-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "ipp-versions-supported",
- sizeof(versions) / sizeof(versions[0]), NULL, versions);
+ if (!ippFindAttribute(printer->attrs, "ipp-versions-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]), NULL, versions);
+
+ /* job-account-id-default */
+ if (!ippFindAttribute(printer->attrs, "job-account-id-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-account-id-default", NULL, "");
+
+ /* job-account-id-supported */
+ if (!ippFindAttribute(printer->attrs, "job-account-id-supported", IPP_TAG_ZERO))
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-account-id-supported", 1);
+
+ /* job-accounting-user-id-default */
+ if (!ippFindAttribute(printer->attrs, "job-accounting-user-id-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-accounting-user-id-default", NULL, "");
+
+ /* job-accounting-user-id-supported */
+ if (!ippFindAttribute(printer->attrs, "job-accounting-user-id-supported", IPP_TAG_ZERO))
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-accounting-user-id-supported", 1);
/* job-creation-attributes-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "job-creation-attributes-supported",
- sizeof(job_creation) / sizeof(job_creation[0]),
- NULL, job_creation);
+ if (!ippFindAttribute(printer->attrs, "job-creation-attributes-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-creation-attributes-supported", sizeof(job_creation) / sizeof(job_creation[0]), NULL, job_creation);
+
+ /* job-ids-supported */
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-ids-supported", 1);
/* job-k-octets-supported */
ippAddRange(printer->attrs, IPP_TAG_PRINTER, "job-k-octets-supported", 0,
k_supported);
+ /* job-password-supported */
+ if (!ippFindAttribute(printer->attrs, "job-password-supported", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-password-supported", 4);
+
/* job-priority-default */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "job-priority-default", 50);
+ if (!ippFindAttribute(printer->attrs, "job-priority-default", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-default", 50);
/* job-priority-supported */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "job-priority-supported", 100);
+ if (!ippFindAttribute(printer->attrs, "job-priority-supported", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-supported", 100);
/* job-sheets-default */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
- "job-sheets-default", NULL, "none");
+ if (!ippFindAttribute(printer->attrs, "job-sheets-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-default", NULL, "none");
/* job-sheets-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
- "job-sheets-supported", NULL, "none");
+ if (!ippFindAttribute(printer->attrs, "job-sheets-supported", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-supported", NULL, "none");
/* media-bottom-margin-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "media-bottom-margin-supported",
- (int)(sizeof(media_xxx_margin_supported) /
- sizeof(media_xxx_margin_supported[0])),
- media_xxx_margin_supported);
+ if (!ippFindAttribute(printer->attrs, "media-bottom-margin-supported", IPP_TAG_ZERO))
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
/* media-col-database */
- for (num_database = 0, i = 0;
- i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
- i ++)
- {
- if (media_col_sizes[i][2] == _IPP_ENV_ONLY)
- num_database += 2; /* auto + envelope */
- else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY)
- num_database += 12; /* auto + photographic-* + borderless */
- else
- num_database += (int)(sizeof(media_type_supported) /
- sizeof(media_type_supported[0])) + 6;
- /* All types + borderless */
- }
-
- media_col_database = ippAddCollections(printer->attrs, IPP_TAG_PRINTER,
- "media-col-database", num_database,
- NULL);
- for (media_col_value = media_col_database->values, i = 0;
- i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
- i ++)
- {
- for (j = 0;
- j < (int)(sizeof(media_type_supported) /
- sizeof(media_type_supported[0]));
- j ++)
+ if (!ippFindAttribute(printer->attrs, "media-col-database", IPP_TAG_ZERO))
+ {
+ for (num_database = 0, i = 0;
+ i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+ i ++)
{
- if (media_col_sizes[i][2] == _IPP_ENV_ONLY &&
- strcmp(media_type_supported[j], "auto") &&
- strcmp(media_type_supported[j], "envelope"))
- continue;
- else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY &&
- strcmp(media_type_supported[j], "auto") &&
- strncmp(media_type_supported[j], "photographic-", 13))
- continue;
-
- media_col_value->collection =
- create_media_col(media_supported[i], media_type_supported[j],
- media_col_sizes[i][0], media_col_sizes[i][1],
- media_xxx_margin_supported[1]);
- media_col_value ++;
+ if (media_col_sizes[i][2] == _IPP_ENV_ONLY)
+ num_database += 3; /* auto + manual + envelope */
+ else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY)
+ num_database += 6 * 3; /* auto + photographic-* from auto, manual, and photo */
+ else
+ num_database += 2; /* Regular + borderless */
+ }
- if (media_col_sizes[i][2] != _IPP_ENV_ONLY &&
- (!strcmp(media_type_supported[j], "auto") ||
- !strncmp(media_type_supported[j], "photographic-", 13)))
+ media_col_database = ippAddCollections(printer->attrs, IPP_TAG_PRINTER, "media-col-database", num_database, NULL);
+ for (media_col_index = 0, i = 0;
+ i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+ i ++)
+ {
+ switch (media_col_sizes[i][2])
{
- /*
- * Add borderless version for this combination...
- */
+ case _IPP_GENERAL :
+ /*
+ * Regular + borderless for the general class; no source/type
+ * selectors...
+ */
+
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], NULL, NULL, media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], NULL, NULL, media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+ break;
+
+ case _IPP_ENV_ONLY :
+ /*
+ * Regular margins for "auto", "manual", and "envelope" sources.
+ */
- media_col_value->collection =
- create_media_col(media_supported[i], media_type_supported[j],
- media_col_sizes[i][0], media_col_sizes[i][1],
- media_xxx_margin_supported[0]);
- media_col_value ++;
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "auto", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "manual", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "envelope", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+ break;
+ case _IPP_PHOTO_ONLY :
+ /*
+ * Photos have specific media types and can only be printed via
+ * the auto, manual, and photo sources...
+ */
+
+ for (j = 0;
+ j < (int)(sizeof(media_type_supported) /
+ sizeof(media_type_supported[0]));
+ j ++)
+ {
+ if (strcmp(media_type_supported[j], "auto") && strncmp(media_type_supported[j], "photographic-", 13))
+ continue;
+
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "auto", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "manual", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+ ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "photo", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+ }
+ break;
}
}
}
/* media-col-default */
- media_col_default = create_media_col(media_supported[0],
- media_type_supported[0],
- media_col_sizes[0][0],
- media_col_sizes[0][1],
- media_xxx_margin_supported[1]);
+ if (!ippFindAttribute(printer->attrs, "media-col-default", IPP_TAG_ZERO))
+ {
+ media_col_default = create_media_col(media_supported[0], media_source_supported[0], media_type_supported[0], media_col_sizes[0][0], media_col_sizes[0][1],media_xxx_margin_supported[1]);
- ippAddCollection(printer->attrs, IPP_TAG_PRINTER, "media-col-default",
- media_col_default);
- ippDelete(media_col_default);
+ ippAddCollection(printer->attrs, IPP_TAG_PRINTER, "media-col-default",
+ media_col_default);
+ ippDelete(media_col_default);
+ }
/* media-col-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "media-col-supported",
- (int)(sizeof(media_col_supported) /
- sizeof(media_col_supported[0])), NULL,
- media_col_supported);
+ if (!ippFindAttribute(printer->attrs, "media-col-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-col-supported", (int)(sizeof(media_col_supported) / sizeof(media_col_supported[0])), NULL, media_col_supported);
/* media-default */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "media-default", NULL, media_supported[0]);
+ if (!ippFindAttribute(printer->attrs, "media-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-default", NULL, media_supported[0]);
/* media-left-margin-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "media-left-margin-supported",
- (int)(sizeof(media_xxx_margin_supported) /
- sizeof(media_xxx_margin_supported[0])),
- media_xxx_margin_supported);
+ if (!ippFindAttribute(printer->attrs, "media-left-margin-supported", IPP_TAG_ZERO))
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
/* media-right-margin-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "media-right-margin-supported",
- (int)(sizeof(media_xxx_margin_supported) /
- sizeof(media_xxx_margin_supported[0])),
- media_xxx_margin_supported);
+ if (!ippFindAttribute(printer->attrs, "media-right-margin-supported", IPP_TAG_ZERO))
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
/* media-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "media-supported",
- (int)(sizeof(media_supported) / sizeof(media_supported[0])),
- NULL, media_supported);
+ if (!ippFindAttribute(printer->attrs, "media-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-supported", (int)(sizeof(media_supported) / sizeof(media_supported[0])), NULL, media_supported);
/* media-size-supported */
- media_size_supported = ippAddCollections(printer->attrs, IPP_TAG_PRINTER,
- "media-size-supported",
- (int)(sizeof(media_col_sizes) /
- sizeof(media_col_sizes[0])),
- NULL);
- for (i = 0;
- i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
- i ++)
- media_size_supported->values[i].collection =
- create_media_size(media_col_sizes[i][0], media_col_sizes[i][1]);
+ if (!ippFindAttribute(printer->attrs, "media-size-supported", IPP_TAG_ZERO))
+ {
+ media_size_supported = ippAddCollections(printer->attrs, IPP_TAG_PRINTER, "media-size-supported", (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0])), NULL);
+
+ for (i = 0;
+ i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+ i ++)
+ {
+ ipp_t *size = create_media_size(media_col_sizes[i][0], media_col_sizes[i][1]);
+
+ ippSetCollection(printer->attrs, &media_size_supported, i, size);
+ ippDelete(size);
+ }
+ }
+
+ /* media-source-supported */
+ if (!ippFindAttribute(printer->attrs, "media-source-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", (int)(sizeof(media_source_supported) / sizeof(media_source_supported[0])), NULL, media_source_supported);
/* media-top-margin-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "media-top-margin-supported",
- (int)(sizeof(media_xxx_margin_supported) /
- sizeof(media_xxx_margin_supported[0])),
- media_xxx_margin_supported);
+ if (!ippFindAttribute(printer->attrs, "media-top-margin-supported", IPP_TAG_ZERO))
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
/* media-type-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "media-type-supported",
- (int)(sizeof(media_type_supported) /
- sizeof(media_type_supported[0])),
- NULL, media_type_supported);
+ if (!ippFindAttribute(printer->attrs, "media-type-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", (int)(sizeof(media_type_supported) / sizeof(media_type_supported[0])), NULL, media_type_supported);
/* multiple-document-handling-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "multiple-document-handling-supported",
- sizeof(multiple_document_handling) /
- sizeof(multiple_document_handling[0]), NULL,
- multiple_document_handling);
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-document-handling-supported", sizeof(multiple_document_handling) / sizeof(multiple_document_handling[0]), NULL, multiple_document_handling);
/* multiple-document-jobs-supported */
- ippAddBoolean(printer->attrs, IPP_TAG_PRINTER,
- "multiple-document-jobs-supported", 0);
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "multiple-document-jobs-supported", 0);
+
+ /* multiple-operation-time-out */
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "multiple-operation-time-out", 60);
+
+ /* multiple-operation-time-out-action */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "abort-job");
/* natural-language-configured */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE | IPP_TAG_COPY,
+ ippAddString(printer->attrs, IPP_TAG_PRINTER,
+ IPP_CONST_TAG(IPP_TAG_LANGUAGE),
"natural-language-configured", NULL, "en");
/* number-up-default */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "number-up-default", 1);
+ if (!ippFindAttribute(printer->attrs, "number-up-default", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "number-up-default", 1);
/* number-up-supported */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "number-up-supported", 1);
+ if (!ippFindAttribute(printer->attrs, "number-up-supported", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "number-up-supported", 1);
/* operations-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
- "operations-supported", sizeof(ops) / sizeof(ops[0]), ops);
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "operations-supported", sizeof(ops) / sizeof(ops[0]), ops);
/* orientation-requested-default */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE,
- "orientation-requested-default", 0);
+ if (!ippFindAttribute(printer->attrs, "orientation-requested-default", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "orientation-requested-default", 0);
/* orientation-requested-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
- "orientation-requested-supported", 4, orients);
+ if (!ippFindAttribute(printer->attrs, "orientation-requested-supported", IPP_TAG_ZERO))
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", 4, orients);
/* output-bin-default */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "output-bin-default", NULL, "face-down");
+ if (!ippFindAttribute(printer->attrs, "output-bin-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-down");
/* output-bin-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "output-bin-supported", NULL, "face-down");
+ if (!ippFindAttribute(printer->attrs, "output-bin-supported", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down");
+
+ /* overrides-supported */
+ if (!ippFindAttribute(printer->attrs, "overrides-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "overrides-supported", (int)(sizeof(overrides) / sizeof(overrides[0])), NULL, overrides);
+
+ /* page-ranges-supported */
+ if (!ippFindAttribute(printer->attrs, "page-ranges-supported", IPP_TAG_ZERO))
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "page-ranges-supported", 1);
/* pages-per-minute */
ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -1536,35 +1977,64 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
"pages-per-minute-color", ppm_color);
/* pdl-override-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "pdl-override-supported", NULL, "attempted");
+ if (!ippFindAttribute(printer->attrs, "pdl-override-supported", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pdl-override-supported", NULL, "attempted");
+
+ /* preferred-attributes-supported */
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "preferred-attributes-supported", 0);
+
+ /* print-color-mode-default */
+ if (!ippFindAttribute(printer->attrs, "print-color-mode-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, "auto");
+
+ /* print-color-mode-supported */
+ if (!ippFindAttribute(printer->attrs, "print-color-mode-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported) / sizeof(print_color_mode_supported[0])), NULL, print_color_mode_supported);
+
+ /* print-content-optimize-default */
+ if (!ippFindAttribute(printer->attrs, "print-content-optimize-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto");
+
+ /* print-content-optimize-supported */
+ if (!ippFindAttribute(printer->attrs, "print-content-optimize-supported", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto");
+
+ /* print-rendering-intent-default */
+ if (!ippFindAttribute(printer->attrs, "print-rendering-intent-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto");
+
+ /* print-rendering-intent-supported */
+ if (!ippFindAttribute(printer->attrs, "print-rendering-intent-supported", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto");
/* print-quality-default */
- ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
- "print-quality-default", IPP_QUALITY_NORMAL);
+ if (!ippFindAttribute(printer->attrs, "print-quality-default", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL);
/* print-quality-supported */
- ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
- "print-quality-supported",
- (int)(sizeof(print_quality_supported) /
- sizeof(print_quality_supported[0])),
- print_quality_supported);
+ if (!ippFindAttribute(printer->attrs, "print-quality-supported", IPP_TAG_ZERO))
+ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported);
/* printer-device-id */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
"printer-device-id", NULL, device_id);
+ /* printer-get-attributes-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format");
+
+ /* printer-geo-location */
+ if (!ippFindAttribute(printer->attrs, "printer-geo-location", IPP_TAG_ZERO))
+ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location", 0);
+
/* printer-icons */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
"printer-icons", NULL, icons);
/* printer-is-accepting-jobs */
- ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs",
- 1);
+ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
/* printer-info */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info",
- NULL, name);
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, name);
/* printer-location */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
@@ -1574,68 +2044,125 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
"printer-make-and-model", NULL, make_model);
+ /* printer-mandatory-job-attributes */
+ if (pin && !ippFindAttribute(printer->attrs, "", IPP_TAG_ZERO))
+ {
+ static const char * const names[] =
+ {
+ "job-account-id",
+ "job-accounting-user-id",
+ "job-password"
+ };
+
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+ "printer-mandatory-job-attributes",
+ (int)(sizeof(names) / sizeof(names[0])), NULL, names);
+ }
+
/* printer-more-info */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
- "printer-more-info", NULL, adminurl);
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl);
/* printer-name */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name",
- NULL, name);
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name);
+
+ /* printer-organization */
+ if (!ippFindAttribute(printer->attrs, "printer-organization", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organization", NULL, "Apple Inc.");
+
+ /* printer-organizational-unit */
+ if (!ippFindAttribute(printer->attrs, "printer-organizational-unit", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, "Printing Engineering");
/* printer-resolution-default */
- ippAddResolution(printer->attrs, IPP_TAG_PRINTER,
- "printer-resolution-default", IPP_RES_PER_INCH, 600, 600);
+ if (!ippFindAttribute(printer->attrs, "printer-resolution-default", IPP_TAG_ZERO))
+ ippAddResolution(printer->attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, 600, 600);
/* printer-resolution-supported */
- ippAddResolution(printer->attrs, IPP_TAG_PRINTER,
- "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600);
+ if (!ippFindAttribute(printer->attrs, "printer-resolutions-supported", IPP_TAG_ZERO))
+ ippAddResolution(printer->attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600);
+
+ /* printer-supply-description */
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])), NULL, printer_supplies);
+
+ /* printer-supply-info-uri */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl);
/* printer-uri-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
- "printer-uri-supported", NULL, uri);
+#ifdef HAVE_SSL
+ uris[0] = uri;
+ uris[1] = securi;
+
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", 2, NULL, (const char **)uris);
+
+#else
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri);
+#endif /* HAVE_SSL */
+
+ /* printer-uuid */
+ httpAssembleUUID(printer->hostname, port, name, 0, uuid, sizeof(uuid));
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid);
+
+ /* pwg-raster-document-xxx-supported */
+ for (i = 0; i < num_formats; i ++)
+ if (!strcasecmp(formats[i], "image/pwg-raster"))
+ break;
+
+ if (i < num_formats)
+ {
+ if (!ippFindAttribute(printer->attrs, "pwg-raster-document-resolution-supported", IPP_TAG_ZERO))
+ ippAddResolutions(printer->attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", (int)(sizeof(pwg_raster_document_resolution_supported) / sizeof(pwg_raster_document_resolution_supported[0])), IPP_RES_PER_INCH, pwg_raster_document_resolution_supported, pwg_raster_document_resolution_supported);
+ if (!ippFindAttribute(printer->attrs, "pwg-raster-document-sheet-back", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "pwg-raster-document-sheet-back", NULL, "normal");
+ if (!ippFindAttribute(printer->attrs, "pwg-raster-document-type-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported) / sizeof(pwg_raster_document_type_supported[0])), NULL, pwg_raster_document_type_supported);
+ }
/* reference-uri-scheme-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
- IPP_TAG_URISCHEME | IPP_TAG_COPY,
- "reference-uri-schemes-supported",
- (int)(sizeof(reference_uri_schemes_supported) /
- sizeof(reference_uri_schemes_supported[0])),
- NULL, reference_uri_schemes_supported);
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_URISCHEME), "reference-uri-schemes-supported", (int)(sizeof(reference_uri_schemes_supported) / sizeof(reference_uri_schemes_supported[0])), NULL, reference_uri_schemes_supported);
/* sides-default */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "sides-default", NULL, "one-sided");
+ if (!ippFindAttribute(printer->attrs, "sides-default", IPP_TAG_ZERO))
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-default", NULL, "one-sided");
/* sides-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "sides-supported", duplex ? 3 : 1, NULL, sides_supported);
+ if (!ippFindAttribute(printer->attrs, "sides-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", duplex ? 3 : 1, NULL, sides_supported);
+
+ /* urf-supported */
+ for (i = 0; i < num_formats; i ++)
+ if (!strcasecmp(formats[i], "image/urf"))
+ break;
+
+ if (i < num_formats && !ippFindAttribute(printer->attrs, "urf-supported", IPP_TAG_ZERO))
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported) / sizeof(urf_supported[0])) - !duplex, NULL, urf_supported);
/* uri-authentication-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "uri-authentication-supported", NULL, "none");
+#ifdef HAVE_SSL
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_supported);
+#else
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", NULL, "none");
+#endif /* HAVE_SSL */
/* uri-security-supported */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "uri-security-supported", NULL, "none");
+#ifdef HAVE_SSL
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-security-supported", 2, NULL, uri_security_supported);
+#else
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-security-supported", NULL, "none");
+#endif /* HAVE_SSL */
/* which-jobs-supported */
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
- "which-jobs-supported",
- sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs);
+ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "which-jobs-supported", sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs);
free(formats[0]);
debug_attributes("Printer", printer->attrs, 0);
-#ifdef HAVE_DNSSD
/*
* Register the printer with Bonjour...
*/
- if (!register_printer(printer, location, make, model, docformats, adminurl,
- ppm_color > 0, duplex, regtype))
+ if (!register_printer(printer, location, make, model, docformats, adminurl, uuid + 9, ppm_color > 0, duplex, subtype))
goto bad_printer;
-#endif /* HAVE_DNSSD */
/*
* Return it!
@@ -1656,208 +2183,6 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
/*
- * 'create_requested_array()' - Create an array for requested-attributes.
- */
-
-static cups_array_t * /* O - requested-attributes array */
-create_requested_array(
- _ipp_client_t *client) /* I - Client */
-{
- int i; /* Looping var */
- ipp_attribute_t *requested; /* requested-attributes attribute */
- cups_array_t *ra; /* Requested attributes array */
- char *value; /* Current value */
-
-
- /*
- * Get the requested-attributes attribute, and return NULL if we don't
- * have one...
- */
-
- if ((requested = ippFindAttribute(client->request, "requested-attributes",
- IPP_TAG_KEYWORD)) == NULL)
- return (NULL);
-
- /*
- * If the attribute contains a single "all" keyword, return NULL...
- */
-
- if (requested->num_values == 1 &&
- !strcmp(requested->values[0].string.text, "all"))
- return (NULL);
-
- /*
- * Create an array using "strcmp" as the comparison function...
- */
-
- ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-
- for (i = 0; i < requested->num_values; i ++)
- {
- value = requested->values[i].string.text;
-
- if (!strcmp(value, "job-template"))
- {
- cupsArrayAdd(ra, "copies");
- cupsArrayAdd(ra, "copies-default");
- cupsArrayAdd(ra, "copies-supported");
- cupsArrayAdd(ra, "finishings");
- cupsArrayAdd(ra, "finishings-default");
- cupsArrayAdd(ra, "finishings-supported");
- cupsArrayAdd(ra, "job-hold-until");
- cupsArrayAdd(ra, "job-hold-until-default");
- cupsArrayAdd(ra, "job-hold-until-supported");
- cupsArrayAdd(ra, "job-priority");
- cupsArrayAdd(ra, "job-priority-default");
- cupsArrayAdd(ra, "job-priority-supported");
- cupsArrayAdd(ra, "job-sheets");
- cupsArrayAdd(ra, "job-sheets-default");
- cupsArrayAdd(ra, "job-sheets-supported");
- cupsArrayAdd(ra, "media");
- cupsArrayAdd(ra, "media-col");
- cupsArrayAdd(ra, "media-col-default");
- cupsArrayAdd(ra, "media-col-supported");
- cupsArrayAdd(ra, "media-default");
- cupsArrayAdd(ra, "media-source-supported");
- cupsArrayAdd(ra, "media-supported");
- cupsArrayAdd(ra, "media-type-supported");
- cupsArrayAdd(ra, "multiple-document-handling");
- cupsArrayAdd(ra, "multiple-document-handling-default");
- cupsArrayAdd(ra, "multiple-document-handling-supported");
- cupsArrayAdd(ra, "number-up");
- cupsArrayAdd(ra, "number-up-default");
- cupsArrayAdd(ra, "number-up-supported");
- cupsArrayAdd(ra, "orientation-requested");
- cupsArrayAdd(ra, "orientation-requested-default");
- cupsArrayAdd(ra, "orientation-requested-supported");
- cupsArrayAdd(ra, "page-ranges");
- cupsArrayAdd(ra, "page-ranges-supported");
- cupsArrayAdd(ra, "printer-resolution");
- cupsArrayAdd(ra, "printer-resolution-default");
- cupsArrayAdd(ra, "printer-resolution-supported");
- cupsArrayAdd(ra, "print-quality");
- cupsArrayAdd(ra, "print-quality-default");
- cupsArrayAdd(ra, "print-quality-supported");
- cupsArrayAdd(ra, "sides");
- cupsArrayAdd(ra, "sides-default");
- cupsArrayAdd(ra, "sides-supported");
- }
- else if (!strcmp(value, "job-description"))
- {
- cupsArrayAdd(ra, "date-time-at-completed");
- cupsArrayAdd(ra, "date-time-at-creation");
- cupsArrayAdd(ra, "date-time-at-processing");
- cupsArrayAdd(ra, "job-detailed-status-message");
- cupsArrayAdd(ra, "job-document-access-errors");
- cupsArrayAdd(ra, "job-id");
- cupsArrayAdd(ra, "job-impressions");
- cupsArrayAdd(ra, "job-impressions-completed");
- cupsArrayAdd(ra, "job-k-octets");
- cupsArrayAdd(ra, "job-k-octets-processed");
- cupsArrayAdd(ra, "job-media-sheets");
- cupsArrayAdd(ra, "job-media-sheets-completed");
- cupsArrayAdd(ra, "job-message-from-operator");
- cupsArrayAdd(ra, "job-more-info");
- cupsArrayAdd(ra, "job-name");
- cupsArrayAdd(ra, "job-originating-user-name");
- cupsArrayAdd(ra, "job-printer-up-time");
- cupsArrayAdd(ra, "job-printer-uri");
- cupsArrayAdd(ra, "job-state");
- cupsArrayAdd(ra, "job-state-message");
- cupsArrayAdd(ra, "job-state-reasons");
- cupsArrayAdd(ra, "job-uri");
- cupsArrayAdd(ra, "number-of-documents");
- cupsArrayAdd(ra, "number-of-intervening-jobs");
- cupsArrayAdd(ra, "output-device-assigned");
- cupsArrayAdd(ra, "time-at-completed");
- cupsArrayAdd(ra, "time-at-creation");
- cupsArrayAdd(ra, "time-at-processing");
- }
- else if (!strcmp(value, "printer-description"))
- {
- cupsArrayAdd(ra, "charset-configured");
- cupsArrayAdd(ra, "charset-supported");
- cupsArrayAdd(ra, "color-supported");
- cupsArrayAdd(ra, "compression-supported");
- cupsArrayAdd(ra, "document-format-default");
- cupsArrayAdd(ra, "document-format-supported");
- cupsArrayAdd(ra, "generated-natural-language-supported");
- cupsArrayAdd(ra, "ipp-versions-supported");
- cupsArrayAdd(ra, "job-impressions-supported");
- cupsArrayAdd(ra, "job-k-octets-supported");
- cupsArrayAdd(ra, "job-media-sheets-supported");
- cupsArrayAdd(ra, "multiple-document-jobs-supported");
- cupsArrayAdd(ra, "multiple-operation-time-out");
- cupsArrayAdd(ra, "natural-language-configured");
- cupsArrayAdd(ra, "notify-attributes-supported");
- cupsArrayAdd(ra, "notify-lease-duration-default");
- cupsArrayAdd(ra, "notify-lease-duration-supported");
- cupsArrayAdd(ra, "notify-max-events-supported");
- cupsArrayAdd(ra, "notify-events-default");
- cupsArrayAdd(ra, "notify-events-supported");
- cupsArrayAdd(ra, "notify-pull-method-supported");
- cupsArrayAdd(ra, "notify-schemes-supported");
- cupsArrayAdd(ra, "operations-supported");
- cupsArrayAdd(ra, "pages-per-minute");
- cupsArrayAdd(ra, "pages-per-minute-color");
- cupsArrayAdd(ra, "pdl-override-supported");
- cupsArrayAdd(ra, "printer-alert");
- cupsArrayAdd(ra, "printer-alert-description");
- cupsArrayAdd(ra, "printer-current-time");
- cupsArrayAdd(ra, "printer-driver-installer");
- cupsArrayAdd(ra, "printer-info");
- cupsArrayAdd(ra, "printer-is-accepting-jobs");
- cupsArrayAdd(ra, "printer-location");
- cupsArrayAdd(ra, "printer-make-and-model");
- cupsArrayAdd(ra, "printer-message-from-operator");
- cupsArrayAdd(ra, "printer-more-info");
- cupsArrayAdd(ra, "printer-more-info-manufacturer");
- cupsArrayAdd(ra, "printer-name");
- cupsArrayAdd(ra, "printer-state");
- cupsArrayAdd(ra, "printer-state-message");
- cupsArrayAdd(ra, "printer-state-reasons");
- cupsArrayAdd(ra, "printer-up-time");
- cupsArrayAdd(ra, "printer-uri-supported");
- cupsArrayAdd(ra, "queued-job-count");
- cupsArrayAdd(ra, "reference-uri-schemes-supported");
- cupsArrayAdd(ra, "uri-authentication-supported");
- cupsArrayAdd(ra, "uri-security-supported");
- }
- else if (!strcmp(value, "printer-defaults"))
- {
- cupsArrayAdd(ra, "copies-default");
- cupsArrayAdd(ra, "document-format-default");
- cupsArrayAdd(ra, "finishings-default");
- cupsArrayAdd(ra, "job-hold-until-default");
- cupsArrayAdd(ra, "job-priority-default");
- cupsArrayAdd(ra, "job-sheets-default");
- cupsArrayAdd(ra, "media-default");
- cupsArrayAdd(ra, "media-col-default");
- cupsArrayAdd(ra, "number-up-default");
- cupsArrayAdd(ra, "orientation-requested-default");
- cupsArrayAdd(ra, "sides-default");
- }
- else if (!strcmp(value, "subscription-template"))
- {
- cupsArrayAdd(ra, "notify-attributes");
- cupsArrayAdd(ra, "notify-charset");
- cupsArrayAdd(ra, "notify-events");
- cupsArrayAdd(ra, "notify-lease-duration");
- cupsArrayAdd(ra, "notify-natural-language");
- cupsArrayAdd(ra, "notify-pull-method");
- cupsArrayAdd(ra, "notify-recipient-uri");
- cupsArrayAdd(ra, "notify-time-interval");
- cupsArrayAdd(ra, "notify-user-data");
- }
- else
- cupsArrayAdd(ra, value);
- }
-
- return (ra);
-}
-
-
-/*
* 'debug_attributes()' - Print attributes in a request or response.
*/
@@ -1869,38 +2194,39 @@ debug_attributes(const char *title, /* I - Title */
ipp_tag_t group_tag; /* Current group */
ipp_attribute_t *attr; /* Current attribute */
char buffer[2048]; /* String buffer for value */
+ int major, minor; /* Version */
if (Verbosity <= 1)
return;
fprintf(stderr, "%s:\n", title);
- fprintf(stderr, " version=%d.%d\n", ipp->request.any.version[0],
- ipp->request.any.version[1]);
+ major = ippGetVersion(ipp, &minor);
+ fprintf(stderr, " version=%d.%d\n", major, minor);
if (type == 1)
fprintf(stderr, " operation-id=%s(%04x)\n",
- ippOpString(ipp->request.op.operation_id),
- ipp->request.op.operation_id);
+ ippOpString(ippGetOperation(ipp)), ippGetOperation(ipp));
else if (type == 2)
fprintf(stderr, " status-code=%s(%04x)\n",
- ippErrorString(ipp->request.status.status_code),
- ipp->request.status.status_code);
- fprintf(stderr, " request-id=%d\n\n", ipp->request.any.request_id);
+ ippErrorString(ippGetStatusCode(ipp)), ippGetStatusCode(ipp));
+ fprintf(stderr, " request-id=%d\n\n", ippGetRequestId(ipp));
- for (attr = ipp->attrs, group_tag = IPP_TAG_ZERO; attr; attr = attr->next)
+ for (attr = ippFirstAttribute(ipp), group_tag = IPP_TAG_ZERO;
+ attr;
+ attr = ippNextAttribute(ipp))
{
- if (attr->group_tag != group_tag)
+ if (ippGetGroupTag(attr) != group_tag)
{
- group_tag = attr->group_tag;
+ group_tag = ippGetGroupTag(attr);
fprintf(stderr, " %s\n", ippTagString(group_tag));
}
- if (attr->name)
+ if (ippGetName(attr))
{
ippAttributeString(attr, buffer, sizeof(buffer));
- fprintf(stderr, " %s (%s%s) %s\n", attr->name,
- attr->num_values > 1 ? "1setOf " : "",
- ippTagString(attr->value_tag), buffer);
+ fprintf(stderr, " %s (%s%s) %s\n", ippGetName(attr),
+ ippGetCount(attr) > 1 ? "1setOf " : "",
+ ippTagString(ippGetValueTag(attr)), buffer);
}
}
}
@@ -1915,27 +2241,21 @@ static void
delete_client(_ipp_client_t *client) /* I - Client */
{
if (Verbosity)
- fprintf(stderr, "Closing connection from %s (%s)\n", client->http.hostname,
- client->http.hostaddr->addr.sa_family == AF_INET ? "IPv4" : "IPv6");
+ fprintf(stderr, "Closing connection from %s\n", client->hostname);
/*
* Flush pending writes before closing...
*/
- httpFlushWrite(&(client->http));
-
- if (client->http.fd >= 0)
- close(client->http.fd);
+ httpFlushWrite(client->http);
/*
* Free memory...
*/
- httpClearCookie(&(client->http));
- httpClearFields(&(client->http));
+ httpClose(client->http);
ippDelete(client->request);
-
ippDelete(client->response);
free(client);
@@ -1984,32 +2304,41 @@ delete_printer(_ipp_printer_t *printer) /* I - Printer */
#if HAVE_DNSSD
if (printer->printer_ref)
DNSServiceRefDeallocate(printer->printer_ref);
-
if (printer->ipp_ref)
DNSServiceRefDeallocate(printer->ipp_ref);
-
+ if (printer->ipps_ref)
+ DNSServiceRefDeallocate(printer->ipps_ref);
if (printer->http_ref)
DNSServiceRefDeallocate(printer->http_ref);
+#elif defined(HAVE_AVAHI)
+ avahi_threaded_poll_lock(DNSSDMaster);
- if (printer->common_ref)
- DNSServiceRefDeallocate(printer->common_ref);
-
- TXTRecordDeallocate(&(printer->ipp_txt));
+ if (printer->printer_ref)
+ avahi_entry_group_free(printer->printer_ref);
+ if (printer->ipp_ref)
+ avahi_entry_group_free(printer->ipp_ref);
+ if (printer->ipps_ref)
+ avahi_entry_group_free(printer->ipps_ref);
+ if (printer->http_ref)
+ avahi_entry_group_free(printer->http_ref);
- if (printer->dnssd_name)
- _cupsStrFree(printer->dnssd_name);
+ avahi_threaded_poll_unlock(DNSSDMaster);
#endif /* HAVE_DNSSD */
+ if (printer->dnssd_name)
+ free(printer->dnssd_name);
if (printer->name)
- _cupsStrFree(printer->name);
+ free(printer->name);
if (printer->icon)
- _cupsStrFree(printer->icon);
+ free(printer->icon);
+ if (printer->command)
+ free(printer->command);
if (printer->directory)
- _cupsStrFree(printer->directory);
+ free(printer->directory);
if (printer->hostname)
- _cupsStrFree(printer->hostname);
+ free(printer->hostname);
if (printer->uri)
- _cupsStrFree(printer->uri);
+ free(printer->uri);
ippDelete(printer->attrs);
cupsArrayDelete(printer->jobs);
@@ -2023,7 +2352,7 @@ delete_printer(_ipp_printer_t *printer) /* I - Printer */
* 'dnssd_callback()' - Handle Bonjour registration events.
*/
-static void
+static void DNSSD_API
dnssd_callback(
DNSServiceRef sdRef, /* I - Service reference */
DNSServiceFlags flags, /* I - Status flags */
@@ -2033,26 +2362,142 @@ dnssd_callback(
const char *domain, /* I - Domain for service */
_ipp_printer_t *printer) /* I - Printer */
{
+ (void)sdRef;
+ (void)flags;
+ (void)domain;
+
if (errorCode)
{
fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n",
regtype, (int)errorCode);
return;
}
- else if (_cups_strcasecmp(name, printer->dnssd_name))
+ else if (strcasecmp(name, printer->dnssd_name))
{
if (Verbosity)
fprintf(stderr, "Now using DNS-SD service name \"%s\".\n", name);
/* No lock needed since only the main thread accesses/changes this */
- _cupsStrFree(printer->dnssd_name);
- printer->dnssd_name = _cupsStrAlloc(name);
+ free(printer->dnssd_name);
+ printer->dnssd_name = strdup(name);
+ }
+}
+
+
+#elif defined(HAVE_AVAHI)
+/*
+ * 'dnssd_callback()' - Handle Bonjour registration events.
+ */
+
+static void
+dnssd_callback(
+ AvahiEntryGroup *srv, /* I - Service */
+ AvahiEntryGroupState state, /* I - Registration state */
+ void *context) /* I - Printer */
+{
+ (void)srv;
+ (void)state;
+ (void)context;
+}
+
+
+/*
+ * 'dnssd_client_cb()' - Client callback for Avahi.
+ *
+ * Called whenever the client or server state changes...
+ */
+
+static void
+dnssd_client_cb(
+ AvahiClient *c, /* I - Client */
+ AvahiClientState state, /* I - Current state */
+ void *userdata) /* I - User data (unused) */
+{
+ (void)userdata;
+
+ if (!c)
+ return;
+
+ switch (state)
+ {
+ default :
+ fprintf(stderr, "Ignore Avahi state %d.\n", state);
+ break;
+
+ case AVAHI_CLIENT_FAILURE:
+ if (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED)
+ {
+ fputs("Avahi server crashed, exiting.\n", stderr);
+ exit(1);
+ }
+ break;
}
}
#endif /* HAVE_DNSSD */
/*
+ * 'dnssd_init()' - Initialize the DNS-SD service connections...
+ */
+
+static void
+dnssd_init(void)
+{
+#ifdef HAVE_DNSSD
+ if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError)
+ {
+ fputs("Error: Unable to initialize Bonjour.\n", stderr);
+ exit(1);
+ }
+
+#elif defined(HAVE_AVAHI)
+ int error; /* Error code, if any */
+
+ if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL)
+ {
+ fputs("Error: Unable to initialize Bonjour.\n", stderr);
+ exit(1);
+ }
+
+ if ((DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssd_client_cb, NULL, &error)) == NULL)
+ {
+ fputs("Error: Unable to initialize Bonjour.\n", stderr);
+ exit(1);
+ }
+
+ avahi_threaded_poll_start(DNSSDMaster);
+#endif /* HAVE_DNSSD */
+}
+
+
+/*
+ * 'filter_cb()' - Filter printer attributes based on the requested array.
+ */
+
+static int /* O - 1 to copy, 0 to ignore */
+filter_cb(_ipp_filter_t *filter, /* I - Filter parameters */
+ ipp_t *dst, /* I - Destination (unused) */
+ ipp_attribute_t *attr) /* I - Source attribute */
+{
+ /*
+ * Filter attributes as needed...
+ */
+
+#ifndef WIN32 /* Avoid MS compiler bug */
+ (void)dst;
+#endif /* !WIN32 */
+
+ ipp_tag_t group = ippGetGroupTag(attr);
+ const char *name = ippGetName(attr);
+
+ if ((filter->group_tag != IPP_TAG_ZERO && group != filter->group_tag && group != IPP_TAG_ZERO) || !name || (!strcmp(name, "media-col-database") && !cupsArrayFind(filter->ra, (void *)name)))
+ return (0);
+
+ return (!filter->ra || cupsArrayFind(filter->ra, (void *)name) != NULL);
+}
+
+
+/*
* 'find_job()' - Find a job specified in a request.
*/
@@ -2064,19 +2509,18 @@ find_job(_ipp_client_t *client) /* I - Client */
*job; /* Matching job, if any */
- key.id = 0;
-
- if ((attr = ippFindAttribute(client->request, "job-uri",
- IPP_TAG_URI)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL)
{
- if (!strncmp(attr->values[0].string.text, client->printer->uri,
- client->printer->urilen) &&
- attr->values[0].string.text[client->printer->urilen] == '/')
- key.id = atoi(attr->values[0].string.text + client->printer->urilen + 1);
+ const char *uri = ippGetString(attr, 0, NULL);
+
+ if (!strncmp(uri, client->printer->uri, client->printer->urilen) &&
+ uri[client->printer->urilen] == '/')
+ key.id = atoi(uri + client->printer->urilen + 1);
+ else
+ return (NULL);
}
- else if ((attr = ippFindAttribute(client->request, "job-id",
- IPP_TAG_INTEGER)) != NULL)
- key.id = attr->values[0].integer;
+ else if ((attr = ippFindAttribute(client->request, "job-id", IPP_TAG_INTEGER)) != NULL)
+ key.id = ippGetInteger(attr, 0);
_cupsRWLockRead(&(client->printer->rwlock));
job = (_ipp_job_t *)cupsArrayFind(client->printer->jobs, &key);
@@ -2087,6 +2531,325 @@ find_job(_ipp_client_t *client) /* I - Client */
/*
+ * 'get_collection()' - Get a collection value from a file.
+ */
+
+static ipp_t * /* O - Collection value */
+get_collection(FILE *fp, /* I - File to read from */
+ const char *filename, /* I - Attributes filename */
+ int *linenum) /* IO - Line number */
+{
+ char token[1024], /* Token from file */
+ attr[128]; /* Attribute name */
+ ipp_tag_t value; /* Current value type */
+ ipp_t *col = ippNew(); /* Collection value */
+ ipp_attribute_t *lastcol = NULL; /* Last collection attribute */
+
+
+ while (get_token(fp, token, sizeof(token), linenum) != NULL)
+ {
+ if (!strcmp(token, "}"))
+ break;
+ else if (!strcmp(token, "{") && lastcol)
+ {
+ /*
+ * Another collection value
+ */
+
+ ipp_t *subcol = get_collection(fp, filename, linenum);
+ /* Collection value */
+
+ if (subcol)
+ ippSetCollection(col, &lastcol, ippGetCount(lastcol), subcol);
+ else
+ goto col_error;
+ }
+ else if (!_cups_strcasecmp(token, "MEMBER"))
+ {
+ /*
+ * Attribute...
+ */
+
+ lastcol = NULL;
+
+ if (!get_token(fp, token, sizeof(token), linenum))
+ {
+ fprintf(stderr, "ippserver: Missing MEMBER value tag on line %d of \"%s\".\n", *linenum, filename);
+ goto col_error;
+ }
+
+ if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
+ {
+ fprintf(stderr, "ippserver: Bad MEMBER value tag \"%s\" on line %d of \"%s\".\n", token, *linenum, filename);
+ goto col_error;
+ }
+
+ if (!get_token(fp, attr, sizeof(attr), linenum))
+ {
+ fprintf(stderr, "ippserver: Missing MEMBER name on line %d of \"%s\".\n", *linenum, filename);
+ goto col_error;
+ }
+
+ if (!get_token(fp, token, sizeof(token), linenum))
+ {
+ fprintf(stderr, "ippserver: Missing MEMBER value on line %d of \"%s\".\n", *linenum, filename);
+ goto col_error;
+ }
+
+ switch (value)
+ {
+ case IPP_TAG_BOOLEAN :
+ if (!_cups_strcasecmp(token, "true"))
+ ippAddBoolean(col, IPP_TAG_ZERO, attr, 1);
+ else
+ ippAddBoolean(col, IPP_TAG_ZERO, attr, (char)atoi(token));
+ break;
+
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ ippAddInteger(col, IPP_TAG_ZERO, value, attr, atoi(token));
+ break;
+
+ case IPP_TAG_RESOLUTION :
+ {
+ int xres, /* X resolution */
+ yres; /* Y resolution */
+ char units[6]; /* Units */
+
+ if (sscanf(token, "%dx%d%5s", &xres, &yres, units) != 3 ||
+ (_cups_strcasecmp(units, "dpi") &&
+ _cups_strcasecmp(units, "dpc") &&
+ _cups_strcasecmp(units, "dpcm") &&
+ _cups_strcasecmp(units, "other")))
+ {
+ fprintf(stderr, "ippserver: Bad resolution value \"%s\" on line %d of \"%s\".\n", token, *linenum, filename);
+ goto col_error;
+ }
+
+ if (!_cups_strcasecmp(units, "dpi"))
+ ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_INCH, xres, yres);
+ else if (!_cups_strcasecmp(units, "dpc") ||
+ !_cups_strcasecmp(units, "dpcm"))
+ ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_CM, xres, yres);
+ else
+ ippAddResolution(col, IPP_TAG_ZERO, attr, (ipp_res_t)0, xres, yres);
+ }
+ break;
+
+ case IPP_TAG_RANGE :
+ {
+ int lowers[4], /* Lower value */
+ uppers[4], /* Upper values */
+ num_vals; /* Number of values */
+
+
+ num_vals = sscanf(token, "%d-%d,%d-%d,%d-%d,%d-%d",
+ lowers + 0, uppers + 0,
+ lowers + 1, uppers + 1,
+ lowers + 2, uppers + 2,
+ lowers + 3, uppers + 3);
+
+ if ((num_vals & 1) || num_vals == 0)
+ {
+ fprintf(stderr, "ippserver: Bad rangeOfInteger value \"%s\" on line %d of \"%s\".\n", token, *linenum, filename);
+ goto col_error;
+ }
+
+ ippAddRanges(col, IPP_TAG_ZERO, attr, num_vals / 2, lowers,
+ uppers);
+ }
+ break;
+
+ case IPP_TAG_BEGIN_COLLECTION :
+ if (!strcmp(token, "{"))
+ {
+ ipp_t *subcol = get_collection(fp, filename, linenum);
+ /* Collection value */
+
+ if (subcol)
+ {
+ lastcol = ippAddCollection(col, IPP_TAG_ZERO, attr, subcol);
+ ippDelete(subcol);
+ }
+ else
+ goto col_error;
+ }
+ else
+ {
+ fprintf(stderr, "ippserver: Bad collection value on line %d of \"%s\".\n", *linenum, filename);
+ goto col_error;
+ }
+ break;
+ case IPP_TAG_STRING :
+ ippAddOctetString(col, IPP_TAG_ZERO, attr, token, (int)strlen(token));
+ break;
+
+ default :
+ if (!strchr(token, ','))
+ ippAddString(col, IPP_TAG_ZERO, value, attr, NULL, token);
+ else
+ {
+ /*
+ * Multiple string values...
+ */
+
+ int num_values; /* Number of values */
+ char *values[100], /* Values */
+ *ptr; /* Pointer to next value */
+
+
+ values[0] = token;
+ num_values = 1;
+
+ for (ptr = strchr(token, ','); ptr; ptr = strchr(ptr, ','))
+ {
+ *ptr++ = '\0';
+ values[num_values] = ptr;
+ num_values ++;
+ if (num_values >= (int)(sizeof(values) / sizeof(values[0])))
+ break;
+ }
+
+ ippAddStrings(col, IPP_TAG_ZERO, value, attr, num_values,
+ NULL, (const char **)values);
+ }
+ break;
+ }
+ }
+ }
+
+ return (col);
+
+ /*
+ * If we get here there was a parse error; free memory and return.
+ */
+
+ col_error:
+
+ ippDelete(col);
+
+ return (NULL);
+}
+
+
+/*
+ * 'get_token()' - Get a token from a file.
+ */
+
+static char * /* O - Token from file or NULL on EOF */
+get_token(FILE *fp, /* I - File to read from */
+ char *buf, /* I - Buffer to read into */
+ int buflen, /* I - Length of buffer */
+ int *linenum) /* IO - Current line number */
+{
+ int ch, /* Character from file */
+ quote; /* Quoting character */
+ char *bufptr, /* Pointer into buffer */
+ *bufend; /* End of buffer */
+
+
+ for (;;)
+ {
+ /*
+ * Skip whitespace...
+ */
+
+ while (isspace(ch = getc(fp)))
+ {
+ if (ch == '\n')
+ (*linenum) ++;
+ }
+
+ /*
+ * Read a token...
+ */
+
+ if (ch == EOF)
+ return (NULL);
+ else if (ch == '\'' || ch == '\"')
+ {
+ /*
+ * Quoted text or regular expression...
+ */
+
+ quote = ch;
+ bufptr = buf;
+ bufend = buf + buflen - 1;
+
+ while ((ch = getc(fp)) != EOF)
+ {
+ if (ch == '\\')
+ {
+ /*
+ * Escape next character...
+ */
+
+ if (bufptr < bufend)
+ *bufptr++ = (char)ch;
+
+ if ((ch = getc(fp)) != EOF && bufptr < bufend)
+ *bufptr++ = (char)ch;
+ }
+ else if (ch == quote)
+ break;
+ else if (bufptr < bufend)
+ *bufptr++ = (char)ch;
+ }
+
+ *bufptr = '\0';
+
+ return (buf);
+ }
+ else if (ch == '#')
+ {
+ /*
+ * Comment...
+ */
+
+ while ((ch = getc(fp)) != EOF)
+ if (ch == '\n')
+ break;
+
+ (*linenum) ++;
+ }
+ else if (ch == '{' || ch == '}' || ch == ',')
+ {
+ buf[0] = (char)ch;
+ buf[1] = '\0';
+
+ return (buf);
+ }
+ else
+ {
+ /*
+ * Whitespace delimited text...
+ */
+
+ ungetc(ch, fp);
+
+ bufptr = buf;
+ bufend = buf + buflen - 1;
+
+ while ((ch = getc(fp)) != EOF)
+ if (isspace(ch) || ch == '#')
+ break;
+ else if (bufptr < bufend)
+ *bufptr++ = (char)ch;
+
+ if (ch == '#')
+ ungetc(ch, fp);
+ else if (ch == '\n')
+ (*linenum) ++;
+
+ *bufptr = '\0';
+
+ return (buf);
+ }
+ }
+}
+
+
+/*
* 'html_escape()' - Write a HTML-safe string.
*/
@@ -2107,12 +2870,12 @@ html_escape(_ipp_client_t *client, /* I - Client */
if (*s == '&' || *s == '<')
{
if (s > start)
- httpWrite2(&(client->http), start, s - start);
+ httpWrite2(client->http, start, (size_t)(s - start));
if (*s == '&')
- httpWrite2(&(client->http), "&amp;", 5);
+ httpWrite2(client->http, "&amp;", 5);
else
- httpWrite2(&(client->http), "&lt;", 4);
+ httpWrite2(client->http, "&lt;", 4);
start = s + 1;
}
@@ -2121,7 +2884,72 @@ html_escape(_ipp_client_t *client, /* I - Client */
}
if (s > start)
- httpWrite2(&(client->http), start, s - start);
+ httpWrite2(client->http, start, (size_t)(s - start));
+}
+
+
+/*
+ * 'html_footer()' - Show the web interface footer.
+ *
+ * This function also writes the trailing 0-length chunk.
+ */
+
+static void
+html_footer(_ipp_client_t *client) /* I - Client */
+{
+ html_printf(client,
+ "</div>\n"
+ "</body>\n"
+ "</html>\n");
+ httpWrite2(client->http, "", 0);
+}
+
+
+/*
+ * 'html_header()' - Show the web interface header and title.
+ */
+
+static void
+html_header(_ipp_client_t *client, /* I - Client */
+ const char *title) /* I - Title */
+{
+ html_printf(client,
+ "<!doctype html>\n"
+ "<html>\n"
+ "<head>\n"
+ "<title>%s</title>\n"
+ "<link rel=\"shortcut icon\" href=\"/icon.png\" type=\"image/png\">\n"
+ "<link rel=\"apple-touch-icon\" href=\"/icon.png\" type=\"image/png\">\n"
+ "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\">\n"
+ "<meta name=\"viewport\" content=\"width=device-width\">\n"
+ "<style>\n"
+ "body { font-family: sans-serif; margin: 0; }\n"
+ "div.body { padding: 0px 10px 10px; }\n"
+ "blockquote { background: #dfd; border-radius: 5px; color: #006; padding: 10px; }\n"
+ "table.form { border-collapse: collapse; margin-top: 10px; width: 100%%; }\n"
+ "table.form td, table.form th { padding: 5px 2px; width: 50%%; }\n"
+ "table.form th { text-align: right; }\n"
+ "table.striped { border-bottom: solid thin black; border-collapse: collapse; width: 100%%; }\n"
+ "table.striped tr:nth-child(even) { background: #fcfcfc; }\n"
+ "table.striped tr:nth-child(odd) { background: #f0f0f0; }\n"
+ "table.striped th { background: white; border-bottom: solid thin black; text-align: left; vertical-align: bottom; }\n"
+ "table.striped td { margin: 0; padding: 5px; vertical-align: top; }\n"
+ "table.nav { border-collapse: collapse; width: 100%%; }\n"
+ "table.nav td { margin: 0; text-align: center; }\n"
+ "td.nav a, td.nav a:active, td.nav a:hover, td.nav a:hover:link, td.nav a:hover:link:visited, td.nav a:link, td.nav a:link:visited, td.nav a:visited { background: inherit; color: inherit; font-size: 80%%; text-decoration: none; }\n"
+ "td.nav { background: #333; color: #fff; padding: 4px 8px; width: 33%%; }\n"
+ "td.nav.sel { background: #fff; color: #000; font-weight: bold; }\n"
+ "td.nav:hover { background: #666; color: #fff; }\n"
+ "td.nav:active { background: #000; color: #ff0; }\n"
+ "</style>\n"
+ "</head>\n"
+ "<body>\n"
+ "<table class=\"nav\"><tr>"
+ "<td class=\"nav%s\"><a href=\"/\">Status</a></td>"
+ "<td class=\"nav%s\"><a href=\"/supplies\">Supplies</a></td>"
+ "<td class=\"nav%s\"><a href=\"/media\">Media</a></td>"
+ "</tr></table>\n"
+ "<div class=\"body\">\n", title, !strcmp(client->uri, "/") ? " sel" : "", !strcmp(client->uri, "/supplies") ? " sel" : "", !strcmp(client->uri, "/media") ? " sel" : "");
}
@@ -2158,15 +2986,16 @@ html_printf(_ipp_client_t *client, /* I - Client */
if (*format == '%')
{
if (format > start)
- httpWrite2(&(client->http), start, format - start);
+ httpWrite2(client->http, start, (size_t)(format - start));
tptr = tformat;
*tptr++ = *format++;
if (*format == '%')
{
- httpWrite2(&(client->http), "%", 1);
+ httpWrite2(client->http, "%", 1);
format ++;
+ start = format;
continue;
}
else if (strchr(" -+#\'", *format))
@@ -2181,7 +3010,7 @@ html_printf(_ipp_client_t *client, /* I - Client */
format ++;
width = va_arg(ap, int);
- snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
+ snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width);
tptr += strlen(tptr);
}
else
@@ -2213,7 +3042,7 @@ html_printf(_ipp_client_t *client, /* I - Client */
format ++;
prec = va_arg(ap, int);
- snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
+ snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec);
tptr += strlen(tptr);
}
else
@@ -2273,12 +3102,12 @@ html_printf(_ipp_client_t *client, /* I - Client */
case 'e' :
case 'f' :
case 'g' :
- if ((width + 2) > sizeof(temp))
+ if ((size_t)(width + 2) > sizeof(temp))
break;
sprintf(temp, tformat, va_arg(ap, double));
- httpWrite2(&(client->http), temp, strlen(temp));
+ httpWrite2(client->http, temp, strlen(temp));
break;
case 'B' : /* Integer formats */
@@ -2289,7 +3118,7 @@ html_printf(_ipp_client_t *client, /* I - Client */
case 'o' :
case 'u' :
case 'x' :
- if ((width + 2) > sizeof(temp))
+ if ((size_t)(width + 2) > sizeof(temp))
break;
# ifdef HAVE_LONG_LONG
@@ -2302,22 +3131,22 @@ html_printf(_ipp_client_t *client, /* I - Client */
else
sprintf(temp, tformat, va_arg(ap, int));
- httpWrite2(&(client->http), temp, strlen(temp));
+ httpWrite2(client->http, temp, strlen(temp));
break;
case 'p' : /* Pointer value */
- if ((width + 2) > sizeof(temp))
+ if ((size_t)(width + 2) > sizeof(temp))
break;
sprintf(temp, tformat, va_arg(ap, void *));
- httpWrite2(&(client->http), temp, strlen(temp));
+ httpWrite2(client->http, temp, strlen(temp));
break;
case 'c' : /* Character or character array */
if (width <= 1)
{
- temp[0] = va_arg(ap, int);
+ temp[0] = (char)va_arg(ap, int);
temp[1] = '\0';
html_escape(client, temp, 1);
}
@@ -2338,7 +3167,7 @@ html_printf(_ipp_client_t *client, /* I - Client */
}
if (format > start)
- httpWrite2(&(client->http), start, format - start);
+ httpWrite2(client->http, start, (size_t)(format - start));
va_end(ap);
}
@@ -2360,7 +3189,7 @@ ipp_cancel_job(_ipp_client_t *client) /* I - Client */
if ((job = find_job(client)) == NULL)
{
- respond_ipp(client, IPP_NOT_FOUND, "Job does not exist.");
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
return;
}
@@ -2371,18 +3200,18 @@ ipp_cancel_job(_ipp_client_t *client) /* I - Client */
switch (job->state)
{
- case IPP_JOB_CANCELED :
- respond_ipp(client, IPP_NOT_POSSIBLE,
+ case IPP_JSTATE_CANCELED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
"Job #%d is already canceled - can\'t cancel.", job->id);
break;
- case IPP_JOB_ABORTED :
- respond_ipp(client, IPP_NOT_POSSIBLE,
+ case IPP_JSTATE_ABORTED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
"Job #%d is already aborted - can\'t cancel.", job->id);
break;
- case IPP_JOB_COMPLETED :
- respond_ipp(client, IPP_NOT_POSSIBLE,
+ case IPP_JSTATE_COMPLETED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
"Job #%d is already completed - can\'t cancel.", job->id);
break;
@@ -2393,18 +3222,73 @@ ipp_cancel_job(_ipp_client_t *client) /* I - Client */
_cupsRWLockWrite(&(client->printer->rwlock));
- if (job->state == IPP_JOB_PROCESSING ||
- (job->state == IPP_JOB_HELD && job->fd >= 0))
+ if (job->state == IPP_JSTATE_PROCESSING ||
+ (job->state == IPP_JSTATE_HELD && job->fd >= 0))
job->cancel = 1;
else
{
- job->state = IPP_JOB_CANCELED;
+ job->state = IPP_JSTATE_CANCELED;
job->completed = time(NULL);
}
_cupsRWUnlock(&(client->printer->rwlock));
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+ break;
+ }
+}
+
+
+/*
+ * 'ipp_close_job()' - Close an open job.
+ */
+
+static void
+ipp_close_job(_ipp_client_t *client) /* I - Client */
+{
+ _ipp_job_t *job; /* Job information */
+
+
+ /*
+ * Get the job...
+ */
+
+ if ((job = find_job(client)) == NULL)
+ {
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ return;
+ }
+
+ /*
+ * See if the job is already completed, canceled, or aborted; if so,
+ * we can't cancel...
+ */
+
+ switch (job->state)
+ {
+ case IPP_JSTATE_CANCELED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is canceled - can\'t close.", job->id);
+ break;
+
+ case IPP_JSTATE_ABORTED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is aborted - can\'t close.", job->id);
+ break;
+
+ case IPP_JSTATE_COMPLETED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is completed - can\'t close.", job->id);
+ break;
+
+ case IPP_JSTATE_PROCESSING :
+ case IPP_JSTATE_STOPPED :
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job #%d is already closed.", job->id);
+ break;
+
+ default :
+ respond_ipp(client, IPP_STATUS_OK, NULL);
break;
}
}
@@ -2427,7 +3311,7 @@ ipp_create_job(_ipp_client_t *client) /* I - Client */
if (!valid_job_attributes(client))
{
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
@@ -2435,9 +3319,9 @@ ipp_create_job(_ipp_client_t *client) /* I - Client */
* Do we have a file to print?
*/
- if (client->http.state == HTTP_POST_RECV)
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
{
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Unexpected document data following request.");
return;
}
@@ -2448,7 +3332,8 @@ ipp_create_job(_ipp_client_t *client) /* I - Client */
if ((job = create_job(client)) == NULL)
{
- respond_ipp(client, IPP_PRINTER_BUSY, "Currently printing another job.");
+ respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+ "Currently printing another job.");
return;
}
@@ -2456,11 +3341,12 @@ ipp_create_job(_ipp_client_t *client) /* I - Client */
* Return the job info...
*/
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
cupsArrayAdd(ra, "job-id");
cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-message");
cupsArrayAdd(ra, "job-state-reasons");
cupsArrayAdd(ra, "job-uri");
@@ -2483,13 +3369,13 @@ ipp_get_job_attributes(
if ((job = find_job(client)) == NULL)
{
- respond_ipp(client, IPP_NOT_FOUND, "Job not found.");
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job not found.");
return;
}
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
- ra = create_requested_array(client);
+ ra = ippCreateRequestedArray(client->request);
copy_job_attributes(client, job, ra);
cupsArrayDelete(ra);
}
@@ -2503,6 +3389,8 @@ static void
ipp_get_jobs(_ipp_client_t *client) /* I - Client */
{
ipp_attribute_t *attr; /* Current attribute */
+ const char *which_jobs = NULL;
+ /* which-jobs values */
int job_comparison; /* Job comparison */
ipp_jstate_t job_state; /* job-state value */
int first_job_id, /* First job ID */
@@ -2519,61 +3407,62 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */
if ((attr = ippFindAttribute(client->request, "which-jobs",
IPP_TAG_KEYWORD)) != NULL)
- fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->http.hostname,
- attr->values[0].string.text);
+ {
+ which_jobs = ippGetString(attr, 0, NULL);
+ fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->hostname, which_jobs);
+ }
- if (!attr || !strcmp(attr->values[0].string.text, "not-completed"))
+ if (!which_jobs || !strcmp(which_jobs, "not-completed"))
{
job_comparison = -1;
- job_state = IPP_JOB_STOPPED;
+ job_state = IPP_JSTATE_STOPPED;
}
- else if (!strcmp(attr->values[0].string.text, "completed"))
+ else if (!strcmp(which_jobs, "completed"))
{
job_comparison = 1;
- job_state = IPP_JOB_CANCELED;
+ job_state = IPP_JSTATE_CANCELED;
}
- else if (!strcmp(attr->values[0].string.text, "aborted"))
+ else if (!strcmp(which_jobs, "aborted"))
{
job_comparison = 0;
- job_state = IPP_JOB_ABORTED;
+ job_state = IPP_JSTATE_ABORTED;
}
- else if (!strcmp(attr->values[0].string.text, "all"))
+ else if (!strcmp(which_jobs, "all"))
{
job_comparison = 1;
- job_state = IPP_JOB_PENDING;
+ job_state = IPP_JSTATE_PENDING;
}
- else if (!strcmp(attr->values[0].string.text, "canceled"))
+ else if (!strcmp(which_jobs, "canceled"))
{
job_comparison = 0;
- job_state = IPP_JOB_CANCELED;
+ job_state = IPP_JSTATE_CANCELED;
}
- else if (!strcmp(attr->values[0].string.text, "pending"))
+ else if (!strcmp(which_jobs, "pending"))
{
job_comparison = 0;
- job_state = IPP_JOB_PENDING;
+ job_state = IPP_JSTATE_PENDING;
}
- else if (!strcmp(attr->values[0].string.text, "pending-held"))
+ else if (!strcmp(which_jobs, "pending-held"))
{
job_comparison = 0;
- job_state = IPP_JOB_HELD;
+ job_state = IPP_JSTATE_HELD;
}
- else if (!strcmp(attr->values[0].string.text, "processing"))
+ else if (!strcmp(which_jobs, "processing"))
{
job_comparison = 0;
- job_state = IPP_JOB_PROCESSING;
+ job_state = IPP_JSTATE_PROCESSING;
}
- else if (!strcmp(attr->values[0].string.text, "processing-stopped"))
+ else if (!strcmp(which_jobs, "processing-stopped"))
{
job_comparison = 0;
- job_state = IPP_JOB_STOPPED;
+ job_state = IPP_JSTATE_STOPPED;
}
else
{
- respond_ipp(client, IPP_ATTRIBUTES,
- "The which-jobs value \"%s\" is not supported.",
- attr->values[0].string.text);
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,
+ "The which-jobs value \"%s\" is not supported.", which_jobs);
ippAddString(client->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD,
- "which-jobs", NULL, attr->values[0].string.text);
+ "which-jobs", NULL, which_jobs);
return;
}
@@ -2584,9 +3473,9 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */
if ((attr = ippFindAttribute(client->request, "limit",
IPP_TAG_INTEGER)) != NULL)
{
- limit = attr->values[0].integer;
+ limit = ippGetInteger(attr, 0);
- fprintf(stderr, "%s Get-Jobs limit=%d", client->http.hostname, limit);
+ fprintf(stderr, "%s Get-Jobs limit=%d", client->hostname, limit);
}
else
limit = 0;
@@ -2594,9 +3483,9 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */
if ((attr = ippFindAttribute(client->request, "first-job-id",
IPP_TAG_INTEGER)) != NULL)
{
- first_job_id = attr->values[0].integer;
+ first_job_id = ippGetInteger(attr, 0);
- fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->http.hostname,
+ fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->hostname,
first_job_id);
}
else
@@ -2611,23 +3500,25 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */
if ((attr = ippFindAttribute(client->request, "my-jobs",
IPP_TAG_BOOLEAN)) != NULL)
{
- fprintf(stderr, "%s Get-Jobs my-jobs=%s\n", client->http.hostname,
- attr->values[0].boolean ? "true" : "false");
+ int my_jobs = ippGetBoolean(attr, 0);
+
+ fprintf(stderr, "%s Get-Jobs my-jobs=%s\n", client->hostname,
+ my_jobs ? "true" : "false");
- if (attr->values[0].boolean)
+ if (my_jobs)
{
if ((attr = ippFindAttribute(client->request, "requesting-user-name",
IPP_TAG_NAME)) == NULL)
{
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Need requesting-user-name with my-jobs.");
return;
}
- username = attr->values[0].string.text;
+ username = ippGetString(attr, 0, NULL);
fprintf(stderr, "%s Get-Jobs requesting-user-name=\"%s\"\n",
- client->http.hostname, username);
+ client->hostname, username);
}
}
@@ -2635,21 +3526,9 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */
* OK, build a list of jobs for this printer...
*/
- if ((ra = create_requested_array(client)) == NULL &&
- !ippFindAttribute(client->request, "requested-attributes",
- IPP_TAG_KEYWORD))
- {
- /*
- * IPP conformance - Get-Jobs has a default requested-attributes value of
- * "job-id" and "job-uri".
- */
+ ra = ippCreateRequestedArray(client->request);
- ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
- cupsArrayAdd(ra, "job-id");
- cupsArrayAdd(ra, "job-uri");
- }
-
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
_cupsRWLockRead(&(client->printer->rwlock));
@@ -2665,7 +3544,8 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */
(job_comparison == 0 && job->state != job_state) ||
(job_comparison > 0 && job->state < job_state) ||
job->id < first_job_id ||
- (username && job->username && _cups_strcasecmp(username, job->username)))
+ (username && job->username &&
+ strcasecmp(username, job->username)))
continue;
if (count > 0)
@@ -2697,79 +3577,147 @@ ipp_get_printer_attributes(
* Send the attributes...
*/
- ra = create_requested_array(client);
+ ra = ippCreateRequestedArray(client->request);
printer = client->printer;
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
_cupsRWLockRead(&(printer->rwlock));
copy_attributes(client->response, printer->attrs, ra, IPP_TAG_ZERO,
- IPP_TAG_COPY);
+ IPP_TAG_CUPS_CONST);
+
+ if (!ra || cupsArrayFind(ra, "media-col-ready"))
+ {
+ int i, /* Looping var */
+ num_ready = 0; /* Number of ready media */
+ ipp_t *ready[3]; /* Ready media */
+
+ if (printer->main_size != _IPP_MEDIA_SIZE_NONE)
+ {
+ if (printer->main_type != _IPP_MEDIA_TYPE_NONE)
+ ready[num_ready ++] = create_media_col(media_supported[printer->main_size], "main", media_type_supported[printer->main_type], media_col_sizes[printer->main_size][0], media_col_sizes[printer->main_size][1], 635);
+ else
+ ready[num_ready ++] = create_media_col(media_supported[printer->main_size], "main", NULL, media_col_sizes[printer->main_size][0], media_col_sizes[printer->main_size][1], 635);
+ }
+ if (printer->envelope_size != _IPP_MEDIA_SIZE_NONE)
+ ready[num_ready ++] = create_media_col(media_supported[printer->envelope_size], "envelope", NULL, media_col_sizes[printer->envelope_size][0], media_col_sizes[printer->envelope_size][1], 635);
+ if (printer->photo_size != _IPP_MEDIA_SIZE_NONE)
+ {
+ if (printer->photo_type != _IPP_MEDIA_TYPE_NONE)
+ ready[num_ready ++] = create_media_col(media_supported[printer->photo_size], "photo", media_type_supported[printer->photo_type], media_col_sizes[printer->photo_size][0], media_col_sizes[printer->photo_size][1], 0);
+ else
+ ready[num_ready ++] = create_media_col(media_supported[printer->photo_size], "photo", NULL, media_col_sizes[printer->photo_size][0], media_col_sizes[printer->photo_size][1], 0);
+ }
+
+ if (num_ready)
+ {
+ ippAddCollections(client->response, IPP_TAG_PRINTER, "media-col-ready", num_ready, (const ipp_t **)ready);
+ for (i = 0; i < num_ready; i ++)
+ ippDelete(ready[i]);
+ }
+ else
+ ippAddOutOfBand(client->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-col-ready");
+ }
+
+ if (!ra || cupsArrayFind(ra, "media-ready"))
+ {
+ int num_ready = 0; /* Number of ready media */
+ const char *ready[3]; /* Ready media */
+
+ if (printer->main_size != _IPP_MEDIA_SIZE_NONE)
+ ready[num_ready ++] = media_supported[printer->main_size];
+
+ if (printer->envelope_size != _IPP_MEDIA_SIZE_NONE)
+ ready[num_ready ++] = media_supported[printer->envelope_size];
+
+ if (printer->photo_size != _IPP_MEDIA_SIZE_NONE)
+ ready[num_ready ++] = media_supported[printer->photo_size];
+
+ if (num_ready)
+ ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-ready", num_ready, NULL, ready);
+ else
+ ippAddOutOfBand(client->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-ready");
+ }
+
+ if (!ra || cupsArrayFind(ra, "printer-config-change-date-time"))
+ ippAddDate(client->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-config-change-time"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-config-change-time", (int)(printer->config_time - printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-current-time"))
+ ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL)));
+
if (!ra || cupsArrayFind(ra, "printer-state"))
ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM,
"printer-state", printer->state);
+ if (!ra || cupsArrayFind(ra, "printer-state-change-date-time"))
+ ippAddDate(client->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer->state_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-state-change-time"))
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-state-change-time", (int)(printer->state_time - printer->start_time));
+
+ if (!ra || cupsArrayFind(ra, "printer-state-message"))
+ {
+ static const char * const messages[] = { "Idle.", "Printing.", "Stopped." };
+
+ ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->state - IPP_PSTATE_IDLE]);
+ }
+
if (!ra || cupsArrayFind(ra, "printer-state-reasons"))
{
- if (printer->state_reasons == _IPP_PRINTER_NONE)
+ if (printer->state_reasons == _IPP_PREASON_NONE)
ippAddString(client->response, IPP_TAG_PRINTER,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "printer-state-reasons",
- NULL, "none");
+ IPP_CONST_TAG(IPP_TAG_KEYWORD),
+ "printer-state-reasons", NULL, "none");
else
{
- int num_reasons = 0;/* Number of reasons */
- const char *reasons[32]; /* Reason strings */
-
- if (printer->state_reasons & _IPP_PRINTER_OTHER)
- reasons[num_reasons ++] = "other";
- if (printer->state_reasons & _IPP_PRINTER_COVER_OPEN)
- reasons[num_reasons ++] = "cover-open";
- if (printer->state_reasons & _IPP_PRINTER_INPUT_TRAY_MISSING)
- reasons[num_reasons ++] = "input-tray-missing";
- if (printer->state_reasons & _IPP_PRINTER_MARKER_SUPPLY_EMPTY)
- reasons[num_reasons ++] = "marker-supply-empty-warning";
- if (printer->state_reasons & _IPP_PRINTER_MARKER_SUPPLY_LOW)
- reasons[num_reasons ++] = "marker-supply-low-report";
- if (printer->state_reasons & _IPP_PRINTER_MARKER_WASTE_ALMOST_FULL)
- reasons[num_reasons ++] = "marker-waste-almost-full-report";
- if (printer->state_reasons & _IPP_PRINTER_MARKER_WASTE_FULL)
- reasons[num_reasons ++] = "marker-waste-full-warning";
- if (printer->state_reasons & _IPP_PRINTER_MEDIA_EMPTY)
- reasons[num_reasons ++] = "media-empty-warning";
- if (printer->state_reasons & _IPP_PRINTER_MEDIA_JAM)
- reasons[num_reasons ++] = "media-jam-warning";
- if (printer->state_reasons & _IPP_PRINTER_MEDIA_LOW)
- reasons[num_reasons ++] = "media-low-report";
- if (printer->state_reasons & _IPP_PRINTER_MEDIA_NEEDED)
- reasons[num_reasons ++] = "media-needed-report";
- if (printer->state_reasons & _IPP_PRINTER_MOVING_TO_PAUSED)
- reasons[num_reasons ++] = "moving-to-paused";
- if (printer->state_reasons & _IPP_PRINTER_PAUSED)
- reasons[num_reasons ++] = "paused";
- if (printer->state_reasons & _IPP_PRINTER_SPOOL_AREA_FULL)
- reasons[num_reasons ++] = "spool-area-full";
- if (printer->state_reasons & _IPP_PRINTER_TONER_EMPTY)
- reasons[num_reasons ++] = "toner-empty-warning";
- if (printer->state_reasons & _IPP_PRINTER_TONER_LOW)
- reasons[num_reasons ++] = "toner-low-report";
-
- ippAddStrings(client->response, IPP_TAG_PRINTER,
- IPP_TAG_KEYWORD | IPP_TAG_COPY, "printer-state-reasons",
- num_reasons, NULL, reasons);
+ ipp_attribute_t *attr = NULL; /* printer-state-reasons */
+ _ipp_preason_t bit; /* Reason bit */
+ int i; /* Looping var */
+ char reason[32]; /* Reason string */
+
+ for (i = 0, bit = 1; i < (int)(sizeof(_ipp_preason_strings) / sizeof(_ipp_preason_strings[0])); i ++, bit *= 2)
+ {
+ if (printer->state_reasons & bit)
+ {
+ snprintf(reason, sizeof(reason), "%s-%s", _ipp_preason_strings[i], printer->state == IPP_PSTATE_IDLE ? "report" : printer->state == IPP_PSTATE_PROCESSING ? "warning" : "error");
+ if (attr)
+ ippSetString(client->response, &attr, ippGetCount(attr), reason);
+ else
+ attr = ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "printer-state-reasons", NULL, reason);
+ }
+ }
+ }
+ }
+
+ if (!ra || cupsArrayFind(ra, "printer-supply"))
+ {
+ int i; /* Looping var */
+ char buffer[256]; /* Supply value buffer */
+ ipp_attribute_t *attr = NULL; /* Attribute */
+ static const char * const colorants[] = { "cyan", "magenta", "yellow", "black", "unknown" };
+
+ for (i = 0; i < 5; i ++)
+ {
+ snprintf(buffer, sizeof(buffer), "index=%d;class=%s;type=%s;unit=percent;maxcapacity=100;level=%d;colorantname=%s;", i + 1, i < 4 ? "supplyThatIsConsumed" : "receptacleThatIsFilled", i < 4 ? "toner" : "wasteToner", printer->supplies[i], colorants[i]);
+
+ if (!attr)
+ attr = ippAddOctetString(client->response, IPP_TAG_PRINTER, "printer-supply", buffer, (int)strlen(buffer));
+ else
+ ippSetOctetString(client->response, &attr, i, buffer, (int)strlen(buffer));
}
}
if (!ra || cupsArrayFind(ra, "printer-up-time"))
- ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "printer-up-time", (int)time(NULL));
+ ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time));
if (!ra || cupsArrayFind(ra, "queued-job-count"))
ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
- "queued-job-count",
- printer->active_job &&
- printer->active_job->state < IPP_JOB_CANCELED);
+ "queued-job-count", printer->active_job && printer->active_job->state < IPP_JSTATE_CANCELED);
_cupsRWUnlock(&(printer->rwlock));
@@ -2778,6 +3726,34 @@ ipp_get_printer_attributes(
/*
+ * 'ipp_identify_printer()' - Beep or display a message.
+ */
+
+static void
+ipp_identify_printer(
+ _ipp_client_t *client) /* I - Client */
+{
+ ipp_attribute_t *actions, /* identify-actions */
+ *message; /* message */
+
+
+ actions = ippFindAttribute(client->request, "identify-actions", IPP_TAG_KEYWORD);
+ message = ippFindAttribute(client->request, "message", IPP_TAG_TEXT);
+
+ if (!actions || ippContainsString(actions, "sound"))
+ {
+ putchar(0x07);
+ fflush(stdout);
+ }
+
+ if (ippContainsString(actions, "display"))
+ printf("IDENTIFY from %s: %s\n", client->hostname, message ? ippGetString(message, 0, NULL) : "No message supplied");
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
* 'ipp_print_job()' - Create a job object with an attached document.
*/
@@ -2797,7 +3773,7 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */
if (!valid_job_attributes(client))
{
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
@@ -2805,9 +3781,9 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */
* Do we have a file to print?
*/
- if (client->http.state == HTTP_POST_SEND)
+ if (httpGetState(client->http) == HTTP_STATE_POST_SEND)
{
- respond_ipp(client, IPP_BAD_REQUEST, "No file in request.");
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request.");
return;
}
@@ -2817,7 +3793,8 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */
if ((job = create_job(client)) == NULL)
{
- respond_ipp(client, IPP_PRINTER_BUSY, "Currently printing another job.");
+ respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+ "Currently printing another job.");
return;
}
@@ -2825,45 +3802,34 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */
* Create a file for the request data...
*/
- if (!_cups_strcasecmp(job->format, "image/jpeg"))
- snprintf(filename, sizeof(filename), "%s/%d.jpg",
- client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "image/png"))
- snprintf(filename, sizeof(filename), "%s/%d.png",
- client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/pdf"))
- snprintf(filename, sizeof(filename), "%s/%d.pdf",
- client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/postscript"))
- snprintf(filename, sizeof(filename), "%s/%d.ps",
- client->printer->directory, job->id);
- else
- snprintf(filename, sizeof(filename), "%s/%d.prn",
- client->printer->directory, job->id);
+ create_job_filename(client->printer, job, filename, sizeof(filename));
+
+ if (Verbosity)
+ fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
{
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to create print file: %s", strerror(errno));
return;
}
- while ((bytes = httpRead2(&(client->http), buffer, sizeof(buffer))) > 0)
+ while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
{
- if (write(job->fd, buffer, bytes) < bytes)
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to write print file: %s", strerror(error));
return;
}
@@ -2875,14 +3841,15 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */
* Got an error while reading the print data, so abort this job.
*/
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to read print file.");
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to read print file.");
return;
}
@@ -2890,45 +3857,41 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
- strerror(error));
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
return;
}
job->fd = -1;
job->filename = strdup(filename);
- job->state = IPP_JOB_PENDING;
+ job->state = IPP_JSTATE_PENDING;
/*
* Process the job...
*/
-#if 0
if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
{
- job->state = IPP_JOB_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+ job->state = IPP_JSTATE_ABORTED;
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
return;
}
-#else
- process_job(job);
-#endif /* 0 */
-
/*
* Return the job info...
*/
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
cupsArrayAdd(ra, "job-id");
cupsArrayAdd(ra, "job-state");
+ cupsArrayAdd(ra, "job-state-message");
cupsArrayAdd(ra, "job-state-reasons");
cupsArrayAdd(ra, "job-uri");
@@ -2979,7 +3942,7 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
if (!valid_job_attributes(client))
{
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
@@ -2987,9 +3950,9 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
* Do we have a file to print?
*/
- if (client->http.state == HTTP_POST_RECV)
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
{
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Unexpected document data following request.");
return;
}
@@ -3001,24 +3964,25 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
if ((uri = ippFindAttribute(client->request, "document-uri",
IPP_TAG_URI)) == NULL)
{
- respond_ipp(client, IPP_BAD_REQUEST, "Missing document-uri.");
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri.");
return;
}
- if (uri->num_values != 1)
+ if (ippGetCount(uri) != 1)
{
- respond_ipp(client, IPP_BAD_REQUEST, "Too many document-uri values.");
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Too many document-uri values.");
return;
}
- uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text,
+ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL),
scheme, sizeof(scheme), userpass,
sizeof(userpass), hostname, sizeof(hostname),
&port, resource, sizeof(resource));
- if (uri_status < HTTP_URI_OK)
+ if (uri_status < HTTP_URI_STATUS_OK)
{
- respond_ipp(client, IPP_BAD_REQUEST, "Bad document-uri: %s",
- uri_status_strings[uri_status - HTTP_URI_OVERFLOW]);
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s",
+ uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
return;
}
@@ -3028,15 +3992,15 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
#endif /* HAVE_SSL */
strcmp(scheme, "http"))
{
- respond_ipp(client, IPP_URI_SCHEME, "URI scheme \"%s\" not supported.",
- scheme);
+ respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME,
+ "URI scheme \"%s\" not supported.", scheme);
return;
}
if (!strcmp(scheme, "file") && access(resource, R_OK))
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
- strerror(errno));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
return;
}
@@ -3046,7 +4010,8 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
if ((job = create_job(client)) == NULL)
{
- respond_ipp(client, IPP_PRINTER_BUSY, "Currently printing another job.");
+ respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+ "Currently printing another job.");
return;
}
@@ -3054,16 +4019,16 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
* Create a file for the request data...
*/
- if (!_cups_strcasecmp(job->format, "image/jpeg"))
+ if (!strcasecmp(job->format, "image/jpeg"))
snprintf(filename, sizeof(filename), "%s/%d.jpg",
client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "image/png"))
+ else if (!strcasecmp(job->format, "image/png"))
snprintf(filename, sizeof(filename), "%s/%d.png",
client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/pdf"))
+ else if (!strcasecmp(job->format, "application/pdf"))
snprintf(filename, sizeof(filename), "%s/%d.pdf",
client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/postscript"))
+ else if (!strcasecmp(job->format, "application/postscript"))
snprintf(filename, sizeof(filename), "%s/%d.ps",
client->printer->directory, job->id);
else
@@ -3072,9 +4037,9 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
{
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to create print file: %s", strerror(errno));
return;
}
@@ -3083,8 +4048,8 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
{
if ((infile = open(resource, O_RDONLY)) < 0)
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
- strerror(errno));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
return;
}
@@ -3093,11 +4058,11 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 &&
(errno == EAGAIN || errno == EINTR))
bytes = 1;
- else if (bytes > 0 && write(job->fd, buffer, bytes) < bytes)
+ else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes)
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3105,7 +4070,7 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
unlink(filename);
close(infile);
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to write print file: %s", strerror(error));
return;
}
@@ -3118,17 +4083,18 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
{
#ifdef HAVE_SSL
if (port == 443 || !strcmp(scheme, "https"))
- encryption = HTTP_ENCRYPT_ALWAYS;
+ encryption = HTTP_ENCRYPTION_ALWAYS;
else
#endif /* HAVE_SSL */
- encryption = HTTP_ENCRYPT_IF_REQUESTED;
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
- if ((http = httpConnectEncrypt(hostname, port, encryption)) == NULL)
+ if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption,
+ 1, 30000, NULL)) == NULL)
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
"Unable to connect to %s: %s", hostname,
cupsLastErrorString());
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3141,10 +4107,10 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
if (httpGet(http, resource))
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
- strerror(errno));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", strerror(errno));
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3154,14 +4120,14 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
return;
}
- while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
- if (status != HTTP_OK)
+ if (status != HTTP_STATUS_OK)
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
- httpStatus(status));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", httpStatus(status));
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3173,11 +4139,11 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
{
- if (write(job->fd, buffer, bytes) < bytes)
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3185,7 +4151,7 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
unlink(filename);
httpClose(http);
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to write print file: %s", strerror(error));
return;
}
@@ -3198,19 +4164,19 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
- strerror(error));
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
return;
}
job->fd = -1;
job->filename = strdup(filename);
- job->state = IPP_JOB_PENDING;
+ job->state = IPP_JSTATE_PENDING;
/*
* Process the job...
@@ -3219,8 +4185,8 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
#if 0
if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
{
- job->state = IPP_JOB_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+ job->state = IPP_JSTATE_ABORTED;
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
return;
}
@@ -3232,7 +4198,7 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */
* Return the job info...
*/
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
cupsArrayAdd(ra, "job-id");
@@ -3267,8 +4233,8 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
if ((job = find_job(client)) == NULL)
{
- respond_ipp(client, IPP_NOT_FOUND, "Job does not exist.");
- httpFlush(&(client->http));
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ httpFlush(client->http);
return;
}
@@ -3277,33 +4243,34 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
* in a non-pending state...
*/
- if (job->state > IPP_JOB_HELD)
+ if (job->state > IPP_JSTATE_HELD)
{
- respond_ipp(client, IPP_NOT_POSSIBLE, "Job is not in a pending state.");
- httpFlush(&(client->http));
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job is not in a pending state.");
+ httpFlush(client->http);
return;
}
else if (job->filename || job->fd >= 0)
{
- respond_ipp(client, IPP_MULTIPLE_JOBS_NOT_SUPPORTED,
+ respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
"Multiple document jobs are not supported.");
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
if ((attr = ippFindAttribute(client->request, "last-document",
IPP_TAG_ZERO)) == NULL)
{
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Missing required last-document attribute.");
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
- else if (attr->value_tag != IPP_TAG_BOOLEAN || attr->num_values != 1 ||
- !attr->values[0].boolean)
+ else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 ||
+ !ippGetBoolean(attr, 0))
{
respond_unsupported(client, attr);
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
@@ -3313,19 +4280,22 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
if (!valid_doc_attributes(client))
{
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
+ copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
+
/*
* Get the document format for the job...
*/
_cupsRWLockWrite(&(client->printer->rwlock));
- if ((attr = ippFindAttribute(job->attrs, "document-format",
- IPP_TAG_MIMETYPE)) != NULL)
- job->format = attr->values[0].string.text;
+ if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
+ else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL)
+ job->format = ippGetString(attr, 0, NULL);
else
job->format = "application/octet-stream";
@@ -3333,21 +4303,10 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
* Create a file for the request data...
*/
- if (!_cups_strcasecmp(job->format, "image/jpeg"))
- snprintf(filename, sizeof(filename), "%s/%d.jpg",
- client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "image/png"))
- snprintf(filename, sizeof(filename), "%s/%d.png",
- client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/pdf"))
- snprintf(filename, sizeof(filename), "%s/%d.pdf",
- client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/postscript"))
- snprintf(filename, sizeof(filename), "%s/%d.ps",
- client->printer->directory, job->id);
- else
- snprintf(filename, sizeof(filename), "%s/%d.prn",
- client->printer->directory, job->id);
+ create_job_filename(client->printer, job, filename, sizeof(filename));
+
+ if (Verbosity)
+ fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
@@ -3355,27 +4314,27 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
if (job->fd < 0)
{
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to create print file: %s", strerror(errno));
return;
}
- while ((bytes = httpRead2(&(client->http), buffer, sizeof(buffer))) > 0)
+ while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
{
- if (write(job->fd, buffer, bytes) < bytes)
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to write print file: %s", strerror(error));
return;
}
@@ -3387,14 +4346,15 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
* Got an error while reading the print data, so abort this job.
*/
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to read print file.");
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to read print file.");
return;
}
@@ -3402,13 +4362,13 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
- strerror(error));
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
return;
}
@@ -3416,7 +4376,7 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
job->fd = -1;
job->filename = strdup(filename);
- job->state = IPP_JOB_PENDING;
+ job->state = IPP_JSTATE_PENDING;
_cupsRWUnlock(&(client->printer->rwlock));
@@ -3427,8 +4387,8 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
#if 0
if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
{
- job->state = IPP_JOB_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+ job->state = IPP_JSTATE_ABORTED;
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
return;
}
@@ -3440,7 +4400,7 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
* Return the job info...
*/
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
cupsArrayAdd(ra, "job-id");
@@ -3497,8 +4457,8 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
if ((job = find_job(client)) == NULL)
{
- respond_ipp(client, IPP_NOT_FOUND, "Job does not exist.");
- httpFlush(&(client->http));
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+ httpFlush(client->http);
return;
}
@@ -3507,33 +4467,34 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
* in a non-pending state...
*/
- if (job->state > IPP_JOB_HELD)
+ if (job->state > IPP_JSTATE_HELD)
{
- respond_ipp(client, IPP_NOT_POSSIBLE, "Job is not in a pending state.");
- httpFlush(&(client->http));
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
+ "Job is not in a pending state.");
+ httpFlush(client->http);
return;
}
else if (job->filename || job->fd >= 0)
{
- respond_ipp(client, IPP_MULTIPLE_JOBS_NOT_SUPPORTED,
+ respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
"Multiple document jobs are not supported.");
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
if ((attr = ippFindAttribute(client->request, "last-document",
IPP_TAG_ZERO)) == NULL)
{
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Missing required last-document attribute.");
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
- else if (attr->value_tag != IPP_TAG_BOOLEAN || attr->num_values != 1 ||
- !attr->values[0].boolean)
+ else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 ||
+ !ippGetBoolean(attr, 0))
{
respond_unsupported(client, attr);
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
@@ -3543,7 +4504,7 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
if (!valid_doc_attributes(client))
{
- httpFlush(&(client->http));
+ httpFlush(client->http);
return;
}
@@ -3551,9 +4512,9 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
* Do we have a file to print?
*/
- if (client->http.state == HTTP_POST_RECV)
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
{
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Unexpected document data following request.");
return;
}
@@ -3565,24 +4526,25 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
if ((uri = ippFindAttribute(client->request, "document-uri",
IPP_TAG_URI)) == NULL)
{
- respond_ipp(client, IPP_BAD_REQUEST, "Missing document-uri.");
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri.");
return;
}
- if (uri->num_values != 1)
+ if (ippGetCount(uri) != 1)
{
- respond_ipp(client, IPP_BAD_REQUEST, "Too many document-uri values.");
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Too many document-uri values.");
return;
}
- uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text,
+ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL),
scheme, sizeof(scheme), userpass,
sizeof(userpass), hostname, sizeof(hostname),
&port, resource, sizeof(resource));
- if (uri_status < HTTP_URI_OK)
+ if (uri_status < HTTP_URI_STATUS_OK)
{
- respond_ipp(client, IPP_BAD_REQUEST, "Bad document-uri: %s",
- uri_status_strings[uri_status - HTTP_URI_OVERFLOW]);
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s",
+ uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
return;
}
@@ -3592,15 +4554,15 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
#endif /* HAVE_SSL */
strcmp(scheme, "http"))
{
- respond_ipp(client, IPP_URI_SCHEME, "URI scheme \"%s\" not supported.",
- scheme);
+ respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME,
+ "URI scheme \"%s\" not supported.", scheme);
return;
}
if (!strcmp(scheme, "file") && access(resource, R_OK))
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
- strerror(errno));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
return;
}
@@ -3612,7 +4574,7 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
if ((attr = ippFindAttribute(job->attrs, "document-format",
IPP_TAG_MIMETYPE)) != NULL)
- job->format = attr->values[0].string.text;
+ job->format = ippGetString(attr, 0, NULL);
else
job->format = "application/octet-stream";
@@ -3620,16 +4582,16 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
* Create a file for the request data...
*/
- if (!_cups_strcasecmp(job->format, "image/jpeg"))
+ if (!strcasecmp(job->format, "image/jpeg"))
snprintf(filename, sizeof(filename), "%s/%d.jpg",
client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "image/png"))
+ else if (!strcasecmp(job->format, "image/png"))
snprintf(filename, sizeof(filename), "%s/%d.png",
client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/pdf"))
+ else if (!strcasecmp(job->format, "application/pdf"))
snprintf(filename, sizeof(filename), "%s/%d.pdf",
client->printer->directory, job->id);
- else if (!_cups_strcasecmp(job->format, "application/postscript"))
+ else if (!strcasecmp(job->format, "application/postscript"))
snprintf(filename, sizeof(filename), "%s/%d.ps",
client->printer->directory, job->id);
else
@@ -3642,9 +4604,9 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
if (job->fd < 0)
{
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to create print file: %s", strerror(errno));
return;
}
@@ -3653,8 +4615,8 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
{
if ((infile = open(resource, O_RDONLY)) < 0)
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
- strerror(errno));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to access URI: %s", strerror(errno));
return;
}
@@ -3663,11 +4625,11 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 &&
(errno == EAGAIN || errno == EINTR))
bytes = 1;
- else if (bytes > 0 && write(job->fd, buffer, bytes) < bytes)
+ else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes)
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3675,7 +4637,7 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
unlink(filename);
close(infile);
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to write print file: %s", strerror(error));
return;
}
@@ -3688,17 +4650,18 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
{
#ifdef HAVE_SSL
if (port == 443 || !strcmp(scheme, "https"))
- encryption = HTTP_ENCRYPT_ALWAYS;
+ encryption = HTTP_ENCRYPTION_ALWAYS;
else
#endif /* HAVE_SSL */
- encryption = HTTP_ENCRYPT_IF_REQUESTED;
+ encryption = HTTP_ENCRYPTION_IF_REQUESTED;
- if ((http = httpConnectEncrypt(hostname, port, encryption)) == NULL)
+ if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption,
+ 1, 30000, NULL)) == NULL)
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
"Unable to connect to %s: %s", hostname,
cupsLastErrorString());
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3711,10 +4674,10 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
if (httpGet(http, resource))
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
- strerror(errno));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", strerror(errno));
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3724,14 +4687,14 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
return;
}
- while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+ while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
- if (status != HTTP_OK)
+ if (status != HTTP_STATUS_OK)
{
- respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
- httpStatus(status));
+ respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+ "Unable to GET URI: %s", httpStatus(status));
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3743,11 +4706,11 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
{
- if (write(job->fd, buffer, bytes) < bytes)
+ if (write(job->fd, buffer, (size_t)bytes) < bytes)
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
close(job->fd);
job->fd = -1;
@@ -3755,7 +4718,7 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
unlink(filename);
httpClose(http);
- respond_ipp(client, IPP_INTERNAL_ERROR,
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
"Unable to write print file: %s", strerror(error));
return;
}
@@ -3768,13 +4731,13 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
{
int error = errno; /* Write error */
- job->state = IPP_JOB_ABORTED;
+ job->state = IPP_JSTATE_ABORTED;
job->fd = -1;
unlink(filename);
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
- strerror(error));
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+ "Unable to write print file: %s", strerror(error));
return;
}
@@ -3782,7 +4745,7 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
job->fd = -1;
job->filename = strdup(filename);
- job->state = IPP_JOB_PENDING;
+ job->state = IPP_JSTATE_PENDING;
_cupsRWUnlock(&(client->printer->rwlock));
@@ -3793,8 +4756,8 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
#if 0
if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
{
- job->state = IPP_JOB_ABORTED;
- respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+ job->state = IPP_JSTATE_ABORTED;
+ respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
return;
}
@@ -3806,7 +4769,7 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */
* Return the job info...
*/
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
cupsArrayAdd(ra, "job-id");
@@ -3827,7 +4790,345 @@ static void
ipp_validate_job(_ipp_client_t *client) /* I - Client */
{
if (valid_job_attributes(client))
- respond_ipp(client, IPP_OK, NULL);
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'load_attributes()' - Load printer attributes from a file.
+ *
+ * Syntax is based on ipptool format:
+ *
+ * ATTR value-tag name value
+ */
+
+static void
+load_attributes(const char *filename, /* I - File to load */
+ ipp_t *attrs) /* I - Printer attributes */
+{
+ int linenum = 0; /* Current line number */
+ FILE *fp = NULL; /* Test file */
+ char attr[128], /* Attribute name */
+ token[1024], /* Token from file */
+ *tokenptr; /* Pointer into token */
+ ipp_tag_t value; /* Current value type */
+ ipp_attribute_t *attrptr, /* Attribute pointer */
+ *lastcol = NULL; /* Last collection attribute */
+
+
+ if ((fp = fopen(filename, "r")) == NULL)
+ {
+ fprintf(stderr, "ippserver: Unable to open \"%s\": %s\n", filename, strerror(errno));
+ exit(1);
+ }
+
+ while (get_token(fp, token, sizeof(token), &linenum) != NULL)
+ {
+ if (!_cups_strcasecmp(token, "ATTR"))
+ {
+ /*
+ * Attribute...
+ */
+
+ if (!get_token(fp, token, sizeof(token), &linenum))
+ {
+ fprintf(stderr, "ippserver: Missing ATTR value tag on line %d of \"%s\".\n", linenum, filename);
+ exit(1);
+ }
+
+ if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
+ {
+ fprintf(stderr, "ippserver: Bad ATTR value tag \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+ exit(1);
+ }
+
+ if (!get_token(fp, attr, sizeof(attr), &linenum))
+ {
+ fprintf(stderr, "ippserver: Missing ATTR name on line %d of \"%s\".\n", linenum, filename);
+ exit(1);
+ }
+
+ if (!get_token(fp, token, sizeof(token), &linenum))
+ {
+ fprintf(stderr, "ippserver: Missing ATTR value on line %d of \"%s\".\n", linenum, filename);
+ exit(1);
+ }
+
+ attrptr = NULL;
+
+ switch (value)
+ {
+ case IPP_TAG_BOOLEAN :
+ if (!_cups_strcasecmp(token, "true"))
+ attrptr = ippAddBoolean(attrs, IPP_TAG_PRINTER, attr, 1);
+ else
+ attrptr = ippAddBoolean(attrs, IPP_TAG_PRINTER, attr, (char)atoi(token));
+ break;
+
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ if (!strchr(token, ','))
+ attrptr = ippAddInteger(attrs, IPP_TAG_PRINTER, value, attr, (int)strtol(token, &tokenptr, 0));
+ else
+ {
+ int values[100], /* Values */
+ num_values = 1; /* Number of values */
+
+ values[0] = (int)strtol(token, &tokenptr, 10);
+ while (tokenptr && *tokenptr &&
+ num_values < (int)(sizeof(values) / sizeof(values[0])))
+ {
+ if (*tokenptr == ',')
+ tokenptr ++;
+ else if (!isdigit(*tokenptr & 255) && *tokenptr != '-')
+ break;
+
+ values[num_values] = (int)strtol(tokenptr, &tokenptr, 0);
+ num_values ++;
+ }
+
+ attrptr = ippAddIntegers(attrs, IPP_TAG_PRINTER, value, attr, num_values, values);
+ }
+
+ if (!tokenptr || *tokenptr)
+ {
+ fprintf(stderr, "ippserver: Bad %s value \"%s\" on line %d of \"%s\".\n", ippTagString(value), token, linenum, filename);
+ exit(1);
+ }
+ break;
+
+ case IPP_TAG_RESOLUTION :
+ {
+ int xres, /* X resolution */
+ yres; /* Y resolution */
+ ipp_res_t units; /* Units */
+ char *start, /* Start of value */
+ *ptr, /* Pointer into value */
+ *next = NULL; /* Next value */
+
+ for (start = token; start; start = next)
+ {
+ xres = yres = (int)strtol(start, (char **)&ptr, 10);
+ if (ptr > start && xres > 0)
+ {
+ if (*ptr == 'x')
+ yres = (int)strtol(ptr + 1, (char **)&ptr, 10);
+ }
+
+ if (ptr && (next = strchr(ptr, ',')) != NULL)
+ *next++ = '\0';
+
+ if (ptr <= start || xres <= 0 || yres <= 0 || !ptr ||
+ (_cups_strcasecmp(ptr, "dpi") &&
+ _cups_strcasecmp(ptr, "dpc") &&
+ _cups_strcasecmp(ptr, "dpcm") &&
+ _cups_strcasecmp(ptr, "other")))
+ {
+ fprintf(stderr, "ippserver: Bad resolution value \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+ exit(1);
+ }
+
+ if (!_cups_strcasecmp(ptr, "dpc") || !_cups_strcasecmp(ptr, "dpcm"))
+ units = IPP_RES_PER_CM;
+ else
+ units = IPP_RES_PER_INCH;
+
+ if (attrptr)
+ ippSetResolution(attrs, &attrptr, ippGetCount(attrptr), units, xres, yres);
+ else
+ attrptr = ippAddResolution(attrs, IPP_TAG_PRINTER, attr, units, xres, yres);
+ }
+ }
+ break;
+
+ case IPP_TAG_RANGE :
+ {
+ int lowers[4], /* Lower value */
+ uppers[4], /* Upper values */
+ num_vals; /* Number of values */
+
+
+ num_vals = sscanf(token, "%d-%d,%d-%d,%d-%d,%d-%d",
+ lowers + 0, uppers + 0,
+ lowers + 1, uppers + 1,
+ lowers + 2, uppers + 2,
+ lowers + 3, uppers + 3);
+
+ if ((num_vals & 1) || num_vals == 0)
+ {
+ fprintf(stderr, "ippserver: Bad rangeOfInteger value \"%s\" on line %d of \"%s\".", token, linenum, filename);
+ exit(1);
+ }
+
+ attrptr = ippAddRanges(attrs, IPP_TAG_PRINTER, attr, num_vals / 2, lowers,
+ uppers);
+ }
+ break;
+
+ case IPP_TAG_BEGIN_COLLECTION :
+ if (!strcmp(token, "{"))
+ {
+ ipp_t *col = get_collection(fp, filename, &linenum);
+ /* Collection value */
+
+ if (col)
+ {
+ attrptr = lastcol = ippAddCollection(attrs, IPP_TAG_PRINTER, attr, col);
+ ippDelete(col);
+ }
+ else
+ exit(1);
+ }
+ else
+ {
+ fprintf(stderr, "ippserver: Bad ATTR collection value on line %d of \"%s\".\n", linenum, filename);
+ exit(1);
+ }
+
+ do
+ {
+ ipp_t *col; /* Collection value */
+ long pos = ftell(fp); /* Save position of file */
+
+ if (!get_token(fp, token, sizeof(token), &linenum))
+ break;
+
+ if (strcmp(token, ","))
+ {
+ fseek(fp, pos, SEEK_SET);
+ break;
+ }
+
+ if (!get_token(fp, token, sizeof(token), &linenum) || strcmp(token, "{"))
+ {
+ fprintf(stderr, "ippserver: Unexpected \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+ exit(1);
+ }
+
+ if ((col = get_collection(fp, filename, &linenum)) == NULL)
+ break;
+
+ ippSetCollection(attrs, &attrptr, ippGetCount(attrptr), col);
+ lastcol = attrptr;
+ }
+ while (!strcmp(token, "{"));
+ break;
+
+ case IPP_TAG_STRING :
+ attrptr = ippAddOctetString(attrs, IPP_TAG_PRINTER, attr, token, (int)strlen(token));
+ break;
+
+ default :
+ fprintf(stderr, "ippserver: Unsupported ATTR value tag %s on line %d of \"%s\".\n", ippTagString(value), linenum, filename);
+ exit(1);
+
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_NAMELANG :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ if (!strchr(token, ','))
+ attrptr = ippAddString(attrs, IPP_TAG_PRINTER, value, attr, NULL, token);
+ else
+ {
+ /*
+ * Multiple string values...
+ */
+
+ int num_values; /* Number of values */
+ char *values[100], /* Values */
+ *ptr; /* Pointer to next value */
+
+
+ values[0] = token;
+ num_values = 1;
+
+ for (ptr = strchr(token, ','); ptr; ptr = strchr(ptr, ','))
+ {
+ if (ptr > token && ptr[-1] == '\\')
+ _cups_strcpy(ptr - 1, ptr);
+ else
+ {
+ *ptr++ = '\0';
+ values[num_values] = ptr;
+ num_values ++;
+ if (num_values >= (int)(sizeof(values) / sizeof(values[0])))
+ break;
+ }
+ }
+
+ attrptr = ippAddStrings(attrs, IPP_TAG_PRINTER, value, attr, num_values, NULL, (const char **)values);
+ }
+ break;
+ }
+
+ if (!attrptr)
+ {
+ fprintf(stderr, "ippserver: Unable to add attribute on line %d of \"%s\": %s\n", linenum, filename, cupsLastErrorString());
+ exit(1);
+ }
+ }
+ else
+ {
+ fprintf(stderr, "ippserver: Unknown directive \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+ exit(1);
+ }
+ }
+
+ fclose(fp);
+}
+
+
+/*
+ * 'parse_options()' - Parse URL options into CUPS options.
+ *
+ * The client->options string is destroyed by this function.
+ */
+
+static int /* O - Number of options */
+parse_options(_ipp_client_t *client, /* I - Client */
+ cups_option_t **options) /* O - Options */
+{
+ char *name, /* Name */
+ *value, /* Value */
+ *next; /* Next name=value pair */
+ int num_options = 0; /* Number of options */
+
+
+ *options = NULL;
+
+ for (name = client->options; name && *name; name = next)
+ {
+ if ((value = strchr(name, '=')) == NULL)
+ break;
+
+ *value++ = '\0';
+ if ((next = strchr(value, '&')) != NULL)
+ *next++ = '\0';
+
+ num_options = cupsAddOption(name, value, num_options, options);
+ }
+
+ return (num_options);
+}
+
+
+/*
+ * 'process_attr_message()' - Process an ATTR: message from a command.
+ */
+
+static void
+process_attr_message(
+ _ipp_job_t *job, /* I - Job */
+ char *message) /* I - Message */
+{
+ (void)job;
+ (void)message;
}
@@ -3842,9 +5143,41 @@ process_client(_ipp_client_t *client) /* I - Client */
* Loop until we are out of requests or timeout (30 seconds)...
*/
- while (httpWait(&(client->http), 30000))
+#ifdef HAVE_SSL
+ int first_time = 1; /* First time request? */
+#endif /* HAVE_SSL */
+
+ while (httpWait(client->http, 30000))
+ {
+#ifdef HAVE_SSL
+ if (first_time)
+ {
+ /*
+ * See if we need to negotiate a TLS connection...
+ */
+
+ char buf[1]; /* First byte from client */
+
+ if (recv(httpGetFd(client->http), buf, 1, MSG_PEEK) == 1 && (!buf[0] || !strchr("DGHOPT", buf[0])))
+ {
+ fprintf(stderr, "%s Starting HTTPS session.\n", client->hostname);
+
+ if (httpEncryption(client->http, HTTP_ENCRYPTION_ALWAYS))
+ {
+ fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString());
+ break;
+ }
+
+ fprintf(stderr, "%s Connection now encrypted.\n", client->hostname);
+ }
+
+ first_time = 0;
+ }
+#endif /* HAVE_SSL */
+
if (!process_http(client))
break;
+ }
/*
* Close the conection to the client and return...
@@ -3863,175 +5196,131 @@ process_client(_ipp_client_t *client) /* I - Client */
int /* O - 1 on success, 0 on failure */
process_http(_ipp_client_t *client) /* I - Client connection */
{
- char line[4096], /* Line from client... */
- operation[64], /* Operation code from socket */
- uri[1024], /* URI */
- version[64], /* HTTP version number string */
- *ptr; /* Pointer into strings */
- int major, minor; /* HTTP version numbers */
- http_status_t status; /* Transfer status */
- ipp_state_t state; /* State of IPP transfer */
-
-
- /*
- * Abort if we have an error on the connection...
- */
+ char uri[1024]; /* URI */
+ http_state_t http_state; /* HTTP state */
+ http_status_t http_status; /* HTTP status */
+ ipp_state_t ipp_state; /* State of IPP transfer */
+ char scheme[32], /* Method/scheme */
+ userpass[128], /* Username:password */
+ hostname[HTTP_MAX_HOST];
+ /* Hostname */
+ int port; /* Port number */
+ const char *encoding; /* Content-Encoding value */
+ static const char * const http_states[] =
+ { /* Strings for logging HTTP method */
+ "WAITING",
+ "OPTIONS",
+ "GET",
+ "GET_SEND",
+ "HEAD",
+ "POST",
+ "POST_RECV",
+ "POST_SEND",
+ "PUT",
+ "PUT_RECV",
+ "DELETE",
+ "TRACE",
+ "CONNECT",
+ "STATUS",
+ "UNKNOWN_METHOD",
+ "UNKNOWN_VERSION"
+ };
- if (client->http.error)
- return (0);
/*
* Clear state variables...
*/
- httpClearFields(&(client->http));
ippDelete(client->request);
ippDelete(client->response);
- client->http.activity = time(NULL);
- client->http.version = HTTP_1_1;
- client->http.keep_alive = HTTP_KEEPALIVE_OFF;
- client->http.data_encoding = HTTP_ENCODE_LENGTH;
- client->http.data_remaining = 0;
- client->request = NULL;
- client->response = NULL;
- client->operation = HTTP_WAITING;
+ client->request = NULL;
+ client->response = NULL;
+ client->operation = HTTP_STATE_WAITING;
/*
* Read a request from the connection...
*/
- while ((ptr = httpGets(line, sizeof(line) - 1, &(client->http))) != NULL)
- if (*ptr)
- break;
-
- if (!ptr)
- return (0);
+ while ((http_state = httpReadRequest(client->http, uri,
+ sizeof(uri))) == HTTP_STATE_WAITING)
+ usleep(1);
/*
* Parse the request line...
*/
- fprintf(stderr, "%s %s\n", client->http.hostname, line);
-
- switch (sscanf(line, "%63s%1023s%63s", operation, uri, version))
+ if (http_state == HTTP_STATE_ERROR)
{
- case 1 :
- fprintf(stderr, "%s Bad request line.\n", client->http.hostname);
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
- return (0);
-
- case 2 :
- client->http.version = HTTP_0_9;
- break;
-
- case 3 :
- if (sscanf(version, "HTTP/%d.%d", &major, &minor) != 2)
- {
- fprintf(stderr, "%s Bad HTTP version.\n", client->http.hostname);
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
- return (0);
- }
+ if (httpError(client->http) == EPIPE)
+ fprintf(stderr, "%s Client closed connection.\n", client->hostname);
+ else
+ fprintf(stderr, "%s Bad request line (%s).\n", client->hostname,
+ strerror(httpError(client->http)));
- if (major < 2)
- {
- client->http.version = (http_version_t)(major * 100 + minor);
- if (client->http.version == HTTP_1_1)
- client->http.keep_alive = HTTP_KEEPALIVE_ON;
- else
- client->http.keep_alive = HTTP_KEEPALIVE_OFF;
- }
- else
- {
- respond_http(client, HTTP_NOT_SUPPORTED, NULL, 0);
- return (0);
- }
- break;
+ return (0);
}
-
- /*
- * Handle full URLs in the request line...
- */
-
- if (!strncmp(client->uri, "http:", 5) || !strncmp(client->uri, "ipp:", 4))
+ else if (http_state == HTTP_STATE_UNKNOWN_METHOD)
{
- char scheme[32], /* Method/scheme */
- userpass[128], /* Username:password */
- hostname[HTTP_MAX_HOST];/* Hostname */
- int port; /* Port number */
-
- /*
- * Separate the URI into its components...
- */
-
- if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme),
- userpass, sizeof(userpass),
- hostname, sizeof(hostname), &port,
- client->uri, sizeof(client->uri)) < HTTP_URI_OK)
- {
- fprintf(stderr, "%s Bad URI \"%s\".\n", client->http.hostname, uri);
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
- return (0);
- }
+ fprintf(stderr, "%s Bad/unknown operation.\n", client->hostname);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
}
- else
+ else if (http_state == HTTP_STATE_UNKNOWN_VERSION)
{
- /*
- * Decode URI
- */
-
- if (!_httpDecodeURI(client->uri, uri, sizeof(client->uri)))
- {
- fprintf(stderr, "%s Bad URI \"%s\".\n", client->http.hostname, uri);
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
- return (0);
- }
+ fprintf(stderr, "%s Bad HTTP version.\n", client->hostname);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
}
+ fprintf(stderr, "%s %s %s\n", client->hostname, http_states[http_state],
+ uri);
+
/*
- * Process the request...
+ * Separate the URI into its components...
*/
- if (!strcmp(operation, "GET"))
- client->http.state = HTTP_GET;
- else if (!strcmp(operation, "POST"))
- client->http.state = HTTP_POST;
- else if (!strcmp(operation, "OPTIONS"))
- client->http.state = HTTP_OPTIONS;
- else if (!strcmp(operation, "HEAD"))
- client->http.state = HTTP_HEAD;
- else
+ if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme),
+ userpass, sizeof(userpass),
+ hostname, sizeof(hostname), &port,
+ client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK &&
+ (http_state != HTTP_STATE_OPTIONS || strcmp(uri, "*")))
{
- fprintf(stderr, "%s Bad operation \"%s\".\n", client->http.hostname,
- operation);
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+ fprintf(stderr, "%s Bad URI \"%s\".\n", client->hostname, uri);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
return (0);
}
- client->start = time(NULL);
- client->operation = client->http.state;
- client->http.status = HTTP_OK;
+ if ((client->options = strchr(client->uri, '?')) != NULL)
+ *(client->options)++ = '\0';
+
+ /*
+ * Process the request...
+ */
+
+ client->start = time(NULL);
+ client->operation = httpGetState(client->http);
/*
* Parse incoming parameters until the status changes...
*/
- while ((status = httpUpdate(&(client->http))) == HTTP_CONTINUE);
+ while ((http_status = httpUpdate(client->http)) == HTTP_STATUS_CONTINUE);
- if (status != HTTP_OK)
+ if (http_status != HTTP_STATUS_OK)
{
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
return (0);
}
- if (!client->http.fields[HTTP_FIELD_HOST][0] &&
- client->http.version >= HTTP_1_1)
+ if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] &&
+ httpGetVersion(client->http) >= HTTP_VERSION_1_1)
{
/*
* HTTP/1.1 and higher require the "Host:" field...
*/
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
return (0);
}
@@ -4039,9 +5328,29 @@ process_http(_ipp_client_t *client) /* I - Client connection */
* Handle HTTP Upgrade...
*/
- if (!_cups_strcasecmp(client->http.fields[HTTP_FIELD_CONNECTION], "Upgrade"))
+ if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION),
+ "Upgrade"))
{
- if (!respond_http(client, HTTP_NOT_IMPLEMENTED, NULL, 0))
+#ifdef HAVE_SSL
+ if (strstr(httpGetField(client->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(client->http))
+ {
+ if (!respond_http(client, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, NULL, 0))
+ return (0);
+
+ fprintf(stderr, "%s Upgrading to encrypted connection.\n", client->hostname);
+
+ if (httpEncryption(client->http, HTTP_ENCRYPTION_REQUIRED))
+ {
+ fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString());
+ return (0);
+ }
+
+ fprintf(stderr, "%s Connection now encrypted.\n", client->hostname);
+ }
+ else
+#endif /* HAVE_SSL */
+
+ if (!respond_http(client, HTTP_STATUS_NOT_IMPLEMENTED, NULL, NULL, 0))
return (0);
}
@@ -4049,16 +5358,17 @@ process_http(_ipp_client_t *client) /* I - Client connection */
* Handle HTTP Expect...
*/
- if (client->http.expect &&
- (client->operation == HTTP_POST || client->operation == HTTP_PUT))
+ if (httpGetExpect(client->http) &&
+ (client->operation == HTTP_STATE_POST ||
+ client->operation == HTTP_STATE_PUT))
{
- if (client->http.expect == HTTP_CONTINUE)
+ if (httpGetExpect(client->http) == HTTP_STATUS_CONTINUE)
{
/*
* Send 100-continue header...
*/
- if (!respond_http(client, HTTP_CONTINUE, NULL, 0))
+ if (!respond_http(client, HTTP_STATUS_CONTINUE, NULL, NULL, 0))
return (0);
}
else
@@ -4067,13 +5377,8 @@ process_http(_ipp_client_t *client) /* I - Client connection */
* Send 417-expectation-failed header...
*/
- if (!respond_http(client, HTTP_EXPECTATION_FAILED, NULL, 0))
+ if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0))
return (0);
-
- httpPrintf(&(client->http), "Content-Length: 0\r\n");
- httpPrintf(&(client->http), "\r\n");
- httpFlushWrite(&(client->http));
- client->http.data_encoding = HTTP_ENCODE_LENGTH;
}
}
@@ -4081,25 +5386,26 @@ process_http(_ipp_client_t *client) /* I - Client connection */
* Handle new transfers...
*/
+ encoding = httpGetContentEncoding(client->http);
+
switch (client->operation)
{
- case HTTP_OPTIONS :
+ case HTTP_STATE_OPTIONS :
/*
- * Do HEAD/OPTIONS command...
+ * Do OPTIONS command...
*/
- return (respond_http(client, HTTP_OK, NULL, 0));
+ return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0));
- case HTTP_HEAD :
+ case HTTP_STATE_HEAD :
if (!strcmp(client->uri, "/icon.png"))
- return (respond_http(client, HTTP_OK, "image/png", 0));
- else if (!strcmp(client->uri, "/"))
- return (respond_http(client, HTTP_OK, "text/html", 0));
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0));
+ else if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies"))
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0));
else
- return (respond_http(client, HTTP_NOT_FOUND, NULL, 0));
- break;
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
- case HTTP_GET :
+ case HTTP_STATE_GET :
if (!strcmp(client->uri, "/icon.png"))
{
/*
@@ -4111,24 +5417,27 @@ process_http(_ipp_client_t *client) /* I - Client connection */
char buffer[4096]; /* Copy buffer */
ssize_t bytes; /* Bytes */
+ fprintf(stderr, "Icon file is \"%s\".\n", client->printer->icon);
+
if (!stat(client->printer->icon, &fileinfo) &&
(fd = open(client->printer->icon, O_RDONLY)) >= 0)
{
- if (!respond_http(client, HTTP_OK, "image/png", fileinfo.st_size))
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png",
+ (size_t)fileinfo.st_size))
{
close(fd);
return (0);
}
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
- httpWrite2(&(client->http), buffer, bytes);
+ httpWrite2(client->http, buffer, (size_t)bytes);
- httpFlushWrite(&(client->http));
+ httpFlushWrite(client->http);
close(fd);
}
else
- return (respond_http(client, HTTP_NOT_FOUND, NULL, 0));
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
}
else if (!strcmp(client->uri, "/"))
{
@@ -4136,57 +5445,316 @@ process_http(_ipp_client_t *client) /* I - Client connection */
* Show web status page...
*/
- if (!respond_http(client, HTTP_OK, "text/html", 0))
+ _ipp_job_t *job; /* Current job */
+ int i; /* Looping var */
+ _ipp_preason_t reason; /* Current reason */
+ static const char * const reasons[] =
+ { /* Reason strings */
+ "Other",
+ "Cover Open",
+ "Input Tray Missing",
+ "Marker Supply Empty",
+ "Marker Supply Low",
+ "Marker Waste Almost Full",
+ "Marker Waste Full",
+ "Media Empty",
+ "Media Jam",
+ "Media Low",
+ "Media Needed",
+ "Moving to Paused",
+ "Paused",
+ "Spool Area Full",
+ "Toner Empty",
+ "Toner Low"
+ };
+
+ if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
return (0);
+ html_header(client, client->printer->name);
html_printf(client,
- "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" "
- "\"http://www.w3.org/TR/html4/strict.dtd\">\n"
- "<html>\n"
- "<head>\n"
- "<title>%s</title>\n"
- "<link rel=\"SHORTCUT ICON\" href=\"/icon.png\" "
- "type=\"image/png\">\n"
- "</head>\n"
- "<body>\n"
- "</body>\n"
- "<h1>%s</h1>\n"
- "<p>%s, %d job(s).</p>\n"
- "</body>\n"
- "</html>\n",
- client->printer->name, client->printer->name,
- client->printer->state == IPP_PRINTER_IDLE ? "Idle" :
- client->printer->state == IPP_PRINTER_PROCESSING ?
- "Printing" : "Stopped",
- cupsArrayCount(client->printer->jobs));
- httpWrite2(&(client->http), "", 0);
+ "<p><img align=\"right\" src=\"/icon.png\" width=\"64\" height=\"64\"><b>ippserver (" CUPS_SVERSION ")</b></p>\n"
+ "<p>%s, %d job(s).", client->printer->state == IPP_PSTATE_IDLE ? "Idle" : client->printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(client->printer->jobs));
+ for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1)
+ if (client->printer->state_reasons & reason)
+ html_printf(client, "\n<br>&nbsp;&nbsp;&nbsp;&nbsp;%s", reasons[i]);
+ html_printf(client, "</p>\n");
+
+ if (cupsArrayCount(client->printer->jobs) > 0)
+ {
+ _cupsRWLockRead(&(client->printer->rwlock));
+
+ html_printf(client, "<table class=\"striped\" summary=\"Jobs\"><thead><tr><th>Job #</th><th>Name</th><th>Owner</th><th>When</th></tr></thead><tbody>\n");
+ for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs); job; job = (_ipp_job_t *)cupsArrayNext(client->printer->jobs))
+ {
+ char when[256], /* When job queued/started/finished */
+ hhmmss[64]; /* Time HH:MM:SS */
+
+ switch (job->state)
+ {
+ case IPP_JSTATE_PENDING :
+ case IPP_JSTATE_HELD :
+ snprintf(when, sizeof(when), "Queued at %s", time_string(job->created, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_PROCESSING :
+ case IPP_JSTATE_STOPPED :
+ snprintf(when, sizeof(when), "Started at %s", time_string(job->processing, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_ABORTED :
+ snprintf(when, sizeof(when), "Aborted at %s", time_string(job->completed, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_CANCELED :
+ snprintf(when, sizeof(when), "Canceled at %s", time_string(job->completed, hhmmss, sizeof(hhmmss)));
+ break;
+ case IPP_JSTATE_COMPLETED :
+ snprintf(when, sizeof(when), "Completed at %s", time_string(job->completed, hhmmss, sizeof(hhmmss)));
+ break;
+ }
+
+ html_printf(client, "<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", job->id, job->name, job->username, when);
+ }
+ html_printf(client, "</tbody></table>\n");
+
+ _cupsRWUnlock(&(client->printer->rwlock));
+ }
+ html_footer(client);
return (1);
}
- else
- return (respond_http(client, HTTP_NOT_FOUND, NULL, 0));
- break;
+ else if (!strcmp(client->uri, "/media"))
+ {
+ /*
+ * Show web media page...
+ */
+
+ int i, /* Looping var */
+ num_options; /* Number of form options */
+ cups_option_t *options; /* Form options */
+ static const char * const sizes[] =
+ { /* Size strings */
+ "ISO A4",
+ "ISO A5",
+ "ISO A6",
+ "DL Envelope",
+ "US Legal",
+ "US Letter",
+ "#10 Envelope",
+ "3x5 Photo",
+ "3.5x5 Photo",
+ "4x6 Photo",
+ "5x7 Photo"
+ };
+ static const char * const types[] =
+ /* Type strings */
+ {
+ "Auto",
+ "Cardstock",
+ "Envelope",
+ "Labels",
+ "Other",
+ "Glossy Photo",
+ "High-Gloss Photo",
+ "Matte Photo",
+ "Satin Photo",
+ "Semi-Gloss Photo",
+ "Plain",
+ "Letterhead",
+ "Transparency"
+ };
+ static const int sheets[] = /* Number of sheets */
+ {
+ 250,
+ 100,
+ 25,
+ 5,
+ 0
+ };
+
+ if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+ return (0);
+
+ html_header(client, client->printer->name);
+
+ if ((num_options = parse_options(client, &options)) > 0)
+ {
+ /*
+ * WARNING: A real printer/server implementation MUST NOT implement
+ * media updates via a GET request - GET requests are supposed to be
+ * idempotent (without side-effects) and we obviously are not
+ * authenticating access here. This form is provided solely to
+ * enable testing and development!
+ */
+
+ const char *val; /* Form value */
+
+ if ((val = cupsGetOption("main_size", num_options, options)) != NULL)
+ client->printer->main_size = atoi(val);
+ if ((val = cupsGetOption("main_type", num_options, options)) != NULL)
+ client->printer->main_type = atoi(val);
+ if ((val = cupsGetOption("main_level", num_options, options)) != NULL)
+ client->printer->main_level = atoi(val);
+
+ if ((val = cupsGetOption("envelope_size", num_options, options)) != NULL)
+ client->printer->envelope_size = atoi(val);
+ if ((val = cupsGetOption("envelope_level", num_options, options)) != NULL)
+ client->printer->envelope_level = atoi(val);
+
+ if ((val = cupsGetOption("photo_size", num_options, options)) != NULL)
+ client->printer->photo_size = atoi(val);
+ if ((val = cupsGetOption("photo_type", num_options, options)) != NULL)
+ client->printer->photo_type = atoi(val);
+ if ((val = cupsGetOption("photo_level", num_options, options)) != NULL)
+ client->printer->photo_level = atoi(val);
+
+ if ((client->printer->main_level < 100 && client->printer->main_level > 0) || (client->printer->envelope_level < 25 && client->printer->envelope_level > 0) || (client->printer->photo_level < 25 && client->printer->photo_level > 0))
+ client->printer->state_reasons |= _IPP_PREASON_MEDIA_LOW;
+ else
+ client->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_LOW;
+
+ if ((client->printer->main_level == 0 && client->printer->main_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->envelope_level == 0 && client->printer->envelope_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->photo_level == 0 && client->printer->photo_size > _IPP_MEDIA_SIZE_NONE))
+ {
+ client->printer->state_reasons |= _IPP_PREASON_MEDIA_EMPTY;
+ if (client->printer->active_job)
+ client->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED;
+ }
+ else
+ client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MEDIA_EMPTY | _IPP_PREASON_MEDIA_NEEDED);
+
+ html_printf(client, "<blockquote>Media updated.</blockquote>\n");
+ }
+
+ html_printf(client, "<form method=\"GET\" action=\"/media\">\n");
+
+ html_printf(client, "<table class=\"form\" summary=\"Media\">\n");
+ html_printf(client, "<tr><th>Main Tray:</th><td><select name=\"main_size\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+ if (!strstr(sizes[i], "Envelope") && !strstr(sizes[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_size ? " selected" : "", sizes[i]);
+ html_printf(client, "</select> <select name=\"main_type\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+ if (!strstr(types[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_type ? " selected" : "", types[i]);
+ html_printf(client, "</select> <select name=\"main_level\">");
+ for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+ html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->main_level ? " selected" : "", sheets[i]);
+ html_printf(client, "</select></td></tr>\n");
+
+ html_printf(client,
+ "<tr><th>Envelope Feeder:</th><td><select name=\"envelope_size\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+ if (strstr(sizes[i], "Envelope"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->envelope_size ? " selected" : "", sizes[i]);
+ html_printf(client, "</select> <select name=\"envelope_level\">");
+ for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+ html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->envelope_level ? " selected" : "", sheets[i]);
+ html_printf(client, "</select></td></tr>\n");
- case HTTP_POST :
- if (client->http.data_remaining < 0 ||
- (!client->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
- client->http.data_encoding == HTTP_ENCODE_LENGTH))
+ html_printf(client,
+ "<tr><th>Photo Tray:</th><td><select name=\"photo_size\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+ if (strstr(sizes[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_size ? " selected" : "", sizes[i]);
+ html_printf(client, "</select> <select name=\"photo_type\"><option value=\"-1\">None</option>");
+ for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+ if (strstr(types[i], "Photo"))
+ html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_type ? " selected" : "", types[i]);
+ html_printf(client, "</select> <select name=\"photo_level\">");
+ for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+ html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->photo_level ? " selected" : "", sheets[i]);
+ html_printf(client, "</select></td></tr>\n");
+
+ html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Media\"></td></tr></table></form>\n");
+ html_footer(client);
+
+ return (1);
+ }
+ else if (!strcmp(client->uri, "/supplies"))
{
/*
- * Negative content lengths are invalid...
+ * Show web supplies page...
*/
- return (respond_http(client, HTTP_BAD_REQUEST, NULL, 0));
+ int i, j, /* Looping vars */
+ num_options; /* Number of form options */
+ cups_option_t *options; /* Form options */
+ static const int levels[] = { 0, 5, 10, 25, 50, 75, 90, 95, 100 };
+
+ if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+ return (0);
+
+ html_header(client, client->printer->name);
+
+ if ((num_options = parse_options(client, &options)) > 0)
+ {
+ /*
+ * WARNING: A real printer/server implementation MUST NOT implement
+ * supply updates via a GET request - GET requests are supposed to be
+ * idempotent (without side-effects) and we obviously are not
+ * authenticating access here. This form is provided solely to
+ * enable testing and development!
+ */
+
+ char name[64]; /* Form field */
+ const char *val; /* Form value */
+
+ client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MARKER_SUPPLY_EMPTY | _IPP_PREASON_MARKER_SUPPLY_LOW | _IPP_PREASON_MARKER_WASTE_ALMOST_FULL | _IPP_PREASON_MARKER_WASTE_FULL | _IPP_PREASON_TONER_EMPTY | _IPP_PREASON_TONER_LOW);
+
+ for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+ {
+ snprintf(name, sizeof(name), "supply_%d", i);
+ if ((val = cupsGetOption(name, num_options, options)) != NULL)
+ {
+ int level = client->printer->supplies[i] = atoi(val);
+ /* New level */
+
+ if (i < 4)
+ {
+ if (level == 0)
+ client->printer->state_reasons |= _IPP_PREASON_TONER_EMPTY;
+ else if (level < 10)
+ client->printer->state_reasons |= _IPP_PREASON_TONER_LOW;
+ }
+ else
+ {
+ if (level == 100)
+ client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_FULL;
+ else if (level > 90)
+ client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_ALMOST_FULL;
+ }
+ }
+ }
+
+ html_printf(client, "<blockquote>Supplies updated.</blockquote>\n");
+ }
+
+ html_printf(client, "<form method=\"GET\" action=\"/supplies\">\n");
+
+ html_printf(client, "<table class=\"form\" summary=\"Supplies\">\n");
+ for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+ {
+ html_printf(client, "<tr><th>%s:</th><td><select name=\"supply_%d\">", printer_supplies[i], i);
+ for (j = 0; j < (int)(sizeof(levels) / sizeof(levels[0])); j ++)
+ html_printf(client, "<option value=\"%d\"%s>%d%%</option>", levels[j], levels[j] == client->printer->supplies[i] ? " selected" : "", levels[j]);
+ html_printf(client, "</select></td></tr>\n");
+ }
+ html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Supplies\"></td></tr>\n</table>\n</form>\n");
+ html_footer(client);
+
+ return (1);
}
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ break;
- if (strcmp(client->http.fields[HTTP_FIELD_CONTENT_TYPE],
+ case HTTP_STATE_POST :
+ if (strcmp(httpGetField(client->http, HTTP_FIELD_CONTENT_TYPE),
"application/ipp"))
{
/*
* Not an IPP request...
*/
- return (respond_http(client, HTTP_BAD_REQUEST, NULL, 0));
+ return (respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0));
}
/*
@@ -4195,14 +5763,17 @@ process_http(_ipp_client_t *client) /* I - Client connection */
client->request = ippNew();
- while ((state = ippRead(&(client->http), client->request)) != IPP_DATA)
- if (state == IPP_ERROR)
+ while ((ipp_state = ippRead(client->http,
+ client->request)) != IPP_STATE_DATA)
+ {
+ if (ipp_state == IPP_STATE_ERROR)
{
- fprintf(stderr, "%s IPP read error (%s).\n", client->http.hostname,
+ fprintf(stderr, "%s IPP read error (%s).\n", client->hostname,
cupsLastErrorString());
- respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
return (0);
}
+ }
/*
* Now that we have the IPP request, process the request...
@@ -4230,6 +5801,8 @@ process_ipp(_ipp_client_t *client) /* I - Client */
ipp_attribute_t *charset; /* Character set attribute */
ipp_attribute_t *language; /* Language attribute */
ipp_attribute_t *uri; /* Printer URI attribute */
+ int major, minor; /* Version number */
+ const char *name; /* Name of attribute */
debug_attributes("Request", client->request, 1);
@@ -4238,37 +5811,30 @@ process_ipp(_ipp_client_t *client) /* I - Client */
* First build an empty response message for this request...
*/
- client->operation_id = client->request->request.op.operation_id;
- client->response = ippNew();
-
- client->response->request.status.version[0] =
- client->request->request.op.version[0];
- client->response->request.status.version[1] =
- client->request->request.op.version[1];
- client->response->request.status.request_id =
- client->request->request.op.request_id;
+ client->operation_id = ippGetOperation(client->request);
+ client->response = ippNewResponse(client->request);
/*
* Then validate the request header and required attributes...
*/
- if (client->request->request.any.version[0] < 1 ||
- client->request->request.any.version[0] > 2)
+ major = ippGetVersion(client->request, &minor);
+
+ if (major < 1 || major > 2)
{
/*
* Return an error, since we only support IPP 1.x and 2.x.
*/
- respond_ipp(client, IPP_VERSION_NOT_SUPPORTED,
- "Bad request version number %d.%d.",
- client->request->request.any.version[0],
- client->request->request.any.version[1]);
+ respond_ipp(client, IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED,
+ "Bad request version number %d.%d.", major, minor);
}
- else if (client->request->request.any.request_id <= 0)
- respond_ipp(client, IPP_BAD_REQUEST, "Bad request-id %d.",
- client->request->request.any.request_id);
- else if (!client->request->attrs)
- respond_ipp(client, IPP_BAD_REQUEST, "No attributes in request.");
+ else if (ippGetRequestId(client->request) <= 0)
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad request-id %d.",
+ ippGetRequestId(client->request));
+ else if (!ippFirstAttribute(client->request))
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "No attributes in request.");
else
{
/*
@@ -4276,22 +5842,25 @@ process_ipp(_ipp_client_t *client) /* I - Client */
* don't repeat groups...
*/
- for (attr = client->request->attrs, group = attr->group_tag;
+ for (attr = ippFirstAttribute(client->request),
+ group = ippGetGroupTag(attr);
attr;
- attr = attr->next)
- if (attr->group_tag < group && attr->group_tag != IPP_TAG_ZERO)
+ attr = ippNextAttribute(client->request))
+ {
+ if (ippGetGroupTag(attr) < group && ippGetGroupTag(attr) != IPP_TAG_ZERO)
{
/*
* Out of order; return an error...
*/
- respond_ipp(client, IPP_BAD_REQUEST,
- "Attribute groups are out of order (%x < %x).",
- attr->group_tag, group);
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Attribute groups are out of order (%x < %x).",
+ ippGetGroupTag(attr), group);
break;
}
else
- group = attr->group_tag;
+ group = ippGetGroupTag(attr);
+ }
if (!attr)
{
@@ -4303,20 +5872,19 @@ process_ipp(_ipp_client_t *client) /* I - Client */
* printer-uri/job-uri
*/
- attr = client->request->attrs;
- if (attr && attr->name &&
- !strcmp(attr->name, "attributes-charset") &&
- (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_CHARSET)
+ attr = ippFirstAttribute(client->request);
+ name = ippGetName(attr);
+ if (attr && name && !strcmp(name, "attributes-charset") &&
+ ippGetValueTag(attr) == IPP_TAG_CHARSET)
charset = attr;
else
charset = NULL;
- if (attr)
- attr = attr->next;
+ attr = ippNextAttribute(client->request);
+ name = ippGetName(attr);
- if (attr && attr->name &&
- !strcmp(attr->name, "attributes-natural-language") &&
- (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_LANGUAGE)
+ if (attr && name && !strcmp(name, "attributes-natural-language") &&
+ ippGetValueTag(attr) == IPP_TAG_LANGUAGE)
language = attr;
else
language = NULL;
@@ -4330,25 +5898,17 @@ process_ipp(_ipp_client_t *client) /* I - Client */
else
uri = NULL;
- ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
- "attributes-charset", NULL,
- charset ? charset->values[0].string.text : "utf-8");
-
- ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
- "attributes-natural-language", NULL,
- language ? language->values[0].string.text : "en");
-
if (charset &&
- _cups_strcasecmp(charset->values[0].string.text, "us-ascii") &&
- _cups_strcasecmp(charset->values[0].string.text, "utf-8"))
+ strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") &&
+ strcasecmp(ippGetString(charset, 0, NULL), "utf-8"))
{
/*
* Bad character set...
*/
- respond_ipp(client, IPP_BAD_REQUEST,
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
"Unsupported character set \"%s\".",
- charset->values[0].string.text);
+ ippGetString(charset, 0, NULL));
}
else if (!charset || !language || !uri)
{
@@ -4358,120 +5918,461 @@ process_ipp(_ipp_client_t *client) /* I - Client */
* for all operations.
*/
- respond_ipp(client, IPP_BAD_REQUEST, "Missing required attributes.");
- }
- else if (strcmp(uri->values[0].string.text, client->printer->uri) &&
- strncmp(uri->values[0].string.text, client->printer->uri,
- client->printer->urilen))
- {
- respond_ipp(client, IPP_NOT_FOUND, "%s %s not found.", uri->name,
- uri->values[0].string.text);
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Missing required attributes.");
}
else
{
- /*
- * Try processing the operation...
- */
-
- if (client->http.expect == HTTP_CONTINUE)
+ char scheme[32], /* URI scheme */
+ userpass[32], /* Username/password in URI */
+ host[256], /* Host name in URI */
+ resource[256]; /* Resource path in URI */
+ int port; /* Port number in URI */
+
+ name = ippGetName(uri);
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL),
+ scheme, sizeof(scheme),
+ userpass, sizeof(userpass),
+ host, sizeof(host), &port,
+ resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,
+ "Bad %s value '%s'.", name, ippGetString(uri, 0, NULL));
+ else if ((!strcmp(name, "job-uri") &&
+ strncmp(resource, "/ipp/print/", 11)) ||
+ (!strcmp(name, "printer-uri") &&
+ strcmp(resource, "/ipp/print")))
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.",
+ name, ippGetString(uri, 0, NULL));
+ else
{
/*
- * Send 100-continue header...
+ * Try processing the operation...
*/
- if (!respond_http(client, HTTP_CONTINUE, NULL, 0))
- return (0);
+ switch (ippGetOperation(client->request))
+ {
+ case IPP_OP_PRINT_JOB :
+ ipp_print_job(client);
+ break;
+
+ case IPP_OP_PRINT_URI :
+ ipp_print_uri(client);
+ break;
+
+ case IPP_OP_VALIDATE_JOB :
+ ipp_validate_job(client);
+ break;
+
+ case IPP_OP_CREATE_JOB :
+ ipp_create_job(client);
+ break;
+
+ case IPP_OP_SEND_DOCUMENT :
+ ipp_send_document(client);
+ break;
+
+ case IPP_OP_SEND_URI :
+ ipp_send_uri(client);
+ break;
+
+ case IPP_OP_CANCEL_JOB :
+ ipp_cancel_job(client);
+ break;
+
+ case IPP_OP_GET_JOB_ATTRIBUTES :
+ ipp_get_job_attributes(client);
+ break;
+
+ case IPP_OP_GET_JOBS :
+ ipp_get_jobs(client);
+ break;
+
+ case IPP_OP_GET_PRINTER_ATTRIBUTES :
+ ipp_get_printer_attributes(client);
+ break;
+
+ case IPP_OP_CLOSE_JOB :
+ ipp_close_job(client);
+ break;
+
+ case IPP_OP_IDENTIFY_PRINTER :
+ ipp_identify_printer(client);
+ break;
+
+ default :
+ respond_ipp(client, IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED,
+ "Operation not supported.");
+ break;
+ }
}
+ }
+ }
+ }
- switch (client->request->request.op.operation_id)
- {
- case IPP_PRINT_JOB :
- ipp_print_job(client);
- break;
+ /*
+ * Send the HTTP header and return...
+ */
- case IPP_PRINT_URI :
- ipp_print_uri(client);
- break;
+ if (httpGetState(client->http) != HTTP_STATE_POST_SEND)
+ httpFlush(client->http); /* Flush trailing (junk) data */
- case IPP_VALIDATE_JOB :
- ipp_validate_job(client);
- break;
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "application/ipp",
+ ippLength(client->response)));
+}
- case IPP_CREATE_JOB :
- ipp_create_job(client);
- break;
- case IPP_SEND_DOCUMENT :
- ipp_send_document(client);
- break;
+/*
+ * 'process_job()' - Process a print job.
+ */
- case IPP_SEND_URI :
- ipp_send_uri(client);
- break;
+static void * /* O - Thread exit status */
+process_job(_ipp_job_t *job) /* I - Job */
+{
+ job->state = IPP_JSTATE_PROCESSING;
+ job->printer->state = IPP_PSTATE_PROCESSING;
+ job->processing = time(NULL);
- case IPP_CANCEL_JOB :
- ipp_cancel_job(client);
- break;
+ while (job->printer->state_reasons & _IPP_PREASON_MEDIA_EMPTY)
+ {
+ job->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED;
- case IPP_GET_JOB_ATTRIBUTES :
- ipp_get_job_attributes(client);
- break;
+ sleep(1);
+ }
- case IPP_GET_JOBS :
- ipp_get_jobs(client);
- break;
+ job->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_NEEDED;
- case IPP_GET_PRINTER_ATTRIBUTES :
- ipp_get_printer_attributes(client);
- break;
+ if (job->printer->command)
+ {
+ /*
+ * Execute a command with the job spool file and wait for it to complete...
+ */
- default :
- respond_ipp(client, IPP_OPERATION_NOT_SUPPORTED,
- "Operation not supported.");
- break;
+ int pid, /* Process ID */
+ status; /* Exit status */
+ time_t start, /* Start time */
+ end; /* End time */
+ char *myargv[3], /* Command-line arguments */
+ *myenvp[200]; /* Environment variables */
+ int myenvc; /* Number of environment variables */
+ ipp_attribute_t *attr; /* Job attribute */
+ char val[1280], /* IPP_NAME=value */
+ *valptr; /* Pointer into string */
+#ifndef WIN32
+ int mypipe[2]; /* Pipe for stderr */
+ char line[2048], /* Line from stderr */
+ *ptr, /* Pointer into line */
+ *endptr; /* End of line */
+ ssize_t bytes; /* Bytes read */
+#endif /* !WIN32 */
+
+ fprintf(stderr, "Running command \"%s %s\".\n", job->printer->command,
+ job->filename);
+ time(&start);
+
+ /*
+ * Setup the command-line arguments...
+ */
+
+ myargv[0] = job->printer->command;
+ myargv[1] = job->filename;
+ myargv[2] = NULL;
+
+ /*
+ * Copy the current environment, then add ENV variables for every Job
+ * attribute...
+ */
+
+ for (myenvc = 0; environ[myenvc] && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); myenvc ++)
+ myenvp[myenvc] = strdup(environ[myenvc]);
+
+ for (attr = ippFirstAttribute(job->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippNextAttribute(job->attrs))
+ {
+ /*
+ * Convert "attribute-name" to "IPP_ATTRIBUTE_NAME=" and then add the
+ * value(s) from the attribute.
+ */
+
+ const char *name = ippGetName(attr);
+ if (!name)
+ continue;
+
+ valptr = val;
+ *valptr++ = 'I';
+ *valptr++ = 'P';
+ *valptr++ = 'P';
+ *valptr++ = '_';
+ while (*name && valptr < (val + sizeof(val) - 2))
+ {
+ if (*name == '-')
+ *valptr++ = '_';
+ else
+ *valptr++ = (char)toupper(*name & 255);
+
+ name ++;
+ }
+ *valptr++ = '=';
+ ippAttributeString(attr, valptr, sizeof(val) - (size_t)(valptr - val));
+
+ myenvp[myenvc++] = strdup(val);
+ }
+ myenvp[myenvc] = NULL;
+
+ /*
+ * Now run the program...
+ */
+
+#ifdef WIN32
+ status = _spawnvpe(_P_WAIT, job->printer->command, myargv, myenvp);
+
+#else
+ if (pipe(mypipe))
+ {
+ perror("Unable to create pipe for stderr");
+ mypipe[0] = mypipe[1] = -1;
+ }
+
+ if ((pid = fork()) == 0)
+ {
+ /*
+ * Child comes here...
+ */
+
+ close(2);
+ dup2(mypipe[1], 2);
+ close(mypipe[0]);
+ close(mypipe[1]);
+
+ execve(job->printer->command, myargv, myenvp);
+ exit(errno);
+ }
+ else if (pid < 0)
+ {
+ /*
+ * Unable to fork process...
+ */
+
+ perror("Unable to start job processing command");
+ status = -1;
+
+ close(mypipe[0]);
+ close(mypipe[1]);
+
+ /*
+ * Free memory used for environment...
+ */
+
+ while (myenvc > 0)
+ free(myenvp[-- myenvc]);
+ }
+ else
+ {
+ /*
+ * Free memory used for environment...
+ */
+
+ while (myenvc > 0)
+ free(myenvp[-- myenvc]);
+
+ /*
+ * If the pipe exists, read from it until EOF...
+ */
+
+ if (mypipe[0] >= 0)
+ {
+ close(mypipe[1]);
+
+ endptr = line;
+ while ((bytes = read(mypipe[0], endptr, sizeof(line) - (size_t)(endptr - line) - 1)) > 0)
+ {
+ endptr += bytes;
+ *endptr = '\0';
+
+ while ((ptr = strchr(line, '\n')) != NULL)
+ {
+ *ptr++ = '\0';
+
+ if (!strncmp(line, "STATE:", 6))
+ {
+ /*
+ * Process printer-state-reasons keywords.
+ */
+
+ process_state_message(job, line);
+ }
+ else if (!strncmp(line, "ATTR:", 5))
+ {
+ /*
+ * Process printer attribute update.
+ */
+
+ process_attr_message(job, line);
+ }
+ else if (Verbosity > 1)
+ fprintf(stderr, "%s: %s\n", job->printer->command, line);
+
+ bytes = ptr - line;
+ if (ptr < endptr)
+ memmove(line, ptr, (size_t)(endptr - ptr));
+ endptr -= bytes;
+ *endptr = '\0';
+ }
}
+
+ close(mypipe[0]);
}
+
+ /*
+ * Wait for child to complete...
+ */
+
+# ifdef HAVE_WAITPID
+ while (waitpid(pid, &status, 0) < 0);
+# else
+ while (wait(&status) < 0);
+# endif /* HAVE_WAITPID */
}
+#endif /* WIN32 */
+
+ if (status)
+ {
+#ifndef WIN32
+ if (WIFEXITED(status))
+#endif /* !WIN32 */
+ fprintf(stderr, "Command \"%s\" exited with status %d.\n",
+ job->printer->command, WEXITSTATUS(status));
+#ifndef WIN32
+ else
+ fprintf(stderr, "Command \"%s\" terminated with signal %d.\n",
+ job->printer->command, WTERMSIG(status));
+#endif /* !WIN32 */
+ job->state = IPP_JSTATE_ABORTED;
+ }
+ else if (status < 0)
+ job->state = IPP_JSTATE_ABORTED;
+ else
+ fprintf(stderr, "Command \"%s\" completed successfully.\n",
+ job->printer->command);
+
+ /*
+ * Make sure processing takes at least 5 seconds...
+ */
+
+ time(&end);
+ if ((end - start) < 5)
+ sleep(5);
}
+ else
+ {
+ /*
+ * Sleep for a random amount of time to simulate job processing.
+ */
- /*
- * Send the HTTP header and return...
- */
+ sleep((unsigned)(5 + (rand() % 11)));
+ }
- if (client->http.state != HTTP_POST_SEND)
- httpFlush(&(client->http)); /* Flush trailing (junk) data */
+ if (job->cancel)
+ job->state = IPP_JSTATE_CANCELED;
+ else if (job->state == IPP_JSTATE_PROCESSING)
+ job->state = IPP_JSTATE_COMPLETED;
- return (respond_http(client, HTTP_OK, "application/ipp",
- ippLength(client->response)));
+ job->completed = time(NULL);
+ job->printer->state = IPP_PSTATE_IDLE;
+ job->printer->active_job = NULL;
+
+ return (NULL);
}
/*
- * 'process_job()' - Process a print job.
+ * 'process_state_message()' - Process a STATE: message from a command.
*/
-static void * /* O - Thread exit status */
-process_job(_ipp_job_t *job) /* I - Job */
+static void
+process_state_message(
+ _ipp_job_t *job, /* I - Job */
+ char *message) /* I - Message */
{
- job->state = IPP_JOB_PROCESSING;
- job->printer->state = IPP_PRINTER_PROCESSING;
+ int i; /* Looping var */
+ _ipp_preason_t state_reasons, /* printer-state-reasons values */
+ bit; /* Current reason bit */
+ char *ptr, /* Pointer into message */
+ *next; /* Next keyword in message */
+ int remove; /* Non-zero if we are removing keywords */
- sleep(5);
- if (job->cancel)
- job->state = IPP_JOB_CANCELED;
+ /*
+ * Skip leading "STATE:" and any whitespace...
+ */
+
+ for (message += 6; *message; message ++)
+ if (*message != ' ' && *message != '\t')
+ break;
+
+ /*
+ * Support the following forms of message:
+ *
+ * "keyword[,keyword,...]" to set the printer-state-reasons value(s).
+ *
+ * "-keyword[,keyword,...]" to remove keywords.
+ *
+ * "+keyword[,keyword,...]" to add keywords.
+ *
+ * Keywords may or may not have a suffix (-report, -warning, -error) per
+ * RFC 2911.
+ */
+
+ if (*message == '-')
+ {
+ remove = 1;
+ state_reasons = job->printer->state_reasons;
+ message ++;
+ }
+ else if (*message == '+')
+ {
+ remove = 0;
+ state_reasons = job->printer->state_reasons;
+ message ++;
+ }
else
- job->state = IPP_JOB_COMPLETED;
+ {
+ remove = 0;
+ state_reasons = _IPP_PREASON_NONE;
+ }
- job->completed = time(NULL);
- job->printer->state = IPP_PRINTER_IDLE;
- job->printer->active_job = NULL;
+ while (*message)
+ {
+ if ((next = strchr(message, ',')) != NULL)
+ *next++ = '\0';
- return (NULL);
+ if ((ptr = strstr(message, "-error")) != NULL)
+ *ptr = '\0';
+ else if ((ptr = strstr(message, "-report")) != NULL)
+ *ptr = '\0';
+ else if ((ptr = strstr(message, "-warning")) != NULL)
+ *ptr = '\0';
+
+ for (i = 0, bit = 1; i < (int)(sizeof(_ipp_preason_strings) / sizeof(_ipp_preason_strings[0])); i ++, bit *= 2)
+ {
+ if (!strcmp(message, _ipp_preason_strings[i]))
+ {
+ if (remove)
+ state_reasons &= ~bit;
+ else
+ state_reasons |= bit;
+ }
+ }
+
+ if (next)
+ message = next;
+ else
+ break;
+ }
+
+ job->printer->state_reasons = state_reasons;
}
-#ifdef HAVE_DNSSD
/*
* 'register_printer()' - Register a printer object via Bonjour.
*/
@@ -4484,13 +6385,19 @@ register_printer(
const char *model, /* I - Model name */
const char *formats, /* I - Supported formats */
const char *adminurl, /* I - Web interface URL */
+ const char *uuid, /* I - Printer UUID */
int color, /* I - 1 = color, 0 = monochrome */
int duplex, /* I - 1 = duplex, 0 = simplex */
- const char *regtype) /* I - Service type */
+ const char *subtype) /* I - Service subtype */
{
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
+ _ipp_txt_t ipp_txt; /* Bonjour IPP TXT record */
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
+#ifdef HAVE_DNSSD
DNSServiceErrorType error; /* Error from Bonjour */
char make_model[256],/* Make and model together */
- product[256]; /* Product string */
+ product[256], /* Product string */
+ regtype[256]; /* Bonjour service type */
/*
@@ -4500,46 +6407,41 @@ register_printer(
snprintf(make_model, sizeof(make_model), "%s %s", make, model);
snprintf(product, sizeof(product), "(%s)", model);
- TXTRecordCreate(&(printer->ipp_txt), 1024, NULL);
- TXTRecordSetValue(&(printer->ipp_txt), "txtvers", 1, "1");
- TXTRecordSetValue(&(printer->ipp_txt), "qtotal", 1, "1");
- TXTRecordSetValue(&(printer->ipp_txt), "rp", 3, "ipp");
- TXTRecordSetValue(&(printer->ipp_txt), "ty", (uint8_t)strlen(make_model),
+ TXTRecordCreate(&ipp_txt, 1024, NULL);
+ TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print");
+ TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(make_model),
make_model);
- TXTRecordSetValue(&(printer->ipp_txt), "adminurl", (uint8_t)strlen(adminurl),
+ TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(adminurl),
adminurl);
- TXTRecordSetValue(&(printer->ipp_txt), "note", (uint8_t)strlen(location),
- location);
- TXTRecordSetValue(&(printer->ipp_txt), "priority", 1, "0");
- TXTRecordSetValue(&(printer->ipp_txt), "product", (uint8_t)strlen(product),
+ if (*location)
+ TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(location),
+ location);
+ TXTRecordSetValue(&ipp_txt, "product", (uint8_t)strlen(product),
product);
- TXTRecordSetValue(&(printer->ipp_txt), "pdl", (uint8_t)strlen(formats),
+ TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats),
formats);
- TXTRecordSetValue(&(printer->ipp_txt), "Color", 1, color ? "T" : "F");
- TXTRecordSetValue(&(printer->ipp_txt), "Duplex", 1, duplex ? "T" : "F");
- TXTRecordSetValue(&(printer->ipp_txt), "usb_MFG", (uint8_t)strlen(make),
+ TXTRecordSetValue(&ipp_txt, "Color", 1, color ? "T" : "F");
+ TXTRecordSetValue(&ipp_txt, "Duplex", 1, duplex ? "T" : "F");
+ TXTRecordSetValue(&ipp_txt, "usb_MFG", (uint8_t)strlen(make),
make);
- TXTRecordSetValue(&(printer->ipp_txt), "usb_MDL", (uint8_t)strlen(model),
+ TXTRecordSetValue(&ipp_txt, "usb_MDL", (uint8_t)strlen(model),
model);
- TXTRecordSetValue(&(printer->ipp_txt), "air", 4, "none");
-
- /*
- * Create a shared service reference for Bonjour...
- */
+ TXTRecordSetValue(&ipp_txt, "UUID", (uint8_t)strlen(uuid), uuid);
+# ifdef HAVE_SSL
+ TXTRecordSetValue(&ipp_txt, "TLS", 3, "1.2");
+# endif /* HAVE_SSL */
+ if (strstr(formats, "image/urf"))
+ TXTRecordSetValue(&ipp_txt, "URF", 66, "CP1,IS1-5-7,MT1-2-3-4-5-6-8-9-10-11-12-13,RS300,SRGB24,V1.4,W8,DM1");
- if ((error = DNSServiceCreateConnection(&(printer->common_ref)))
- != kDNSServiceErr_NoError)
- {
- fprintf(stderr, "Unable to create mDNSResponder connection: %d\n", error);
- return (0);
- }
+ TXTRecordSetValue(&ipp_txt, "txtvers", 1, "1");
+ TXTRecordSetValue(&ipp_txt, "qtotal", 1, "1");
/*
* Register the _printer._tcp (LPD) service type with a port number of 0 to
* defend our service name but not actually support LPD...
*/
- printer->printer_ref = printer->common_ref;
+ printer->printer_ref = DNSSDMaster;
if ((error = DNSServiceRegister(&(printer->printer_ref),
kDNSServiceFlagsShareConnection,
@@ -4560,15 +6462,48 @@ register_printer(
* advertise our IPP printer...
*/
- printer->ipp_ref = printer->common_ref;
+ printer->ipp_ref = DNSSDMaster;
+
+ if (subtype && *subtype)
+ snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", subtype);
+ else
+ strlcpy(regtype, "_ipp._tcp", sizeof(regtype));
if ((error = DNSServiceRegister(&(printer->ipp_ref),
kDNSServiceFlagsShareConnection,
0 /* interfaceIndex */, printer->dnssd_name,
regtype, NULL /* domain */,
NULL /* host */, htons(printer->port),
- TXTRecordGetLength(&(printer->ipp_txt)),
- TXTRecordGetBytesPtr(&(printer->ipp_txt)),
+ TXTRecordGetLength(&ipp_txt),
+ TXTRecordGetBytesPtr(&ipp_txt),
+ (DNSServiceRegisterReply)dnssd_callback,
+ printer)) != kDNSServiceErr_NoError)
+ {
+ fprintf(stderr, "Unable to register \"%s.%s\": %d\n",
+ printer->dnssd_name, regtype, error);
+ return (0);
+ }
+
+# ifdef HAVE_SSL
+ /*
+ * Then register the _ipps._tcp (IPP) service type with the real port number to
+ * advertise our IPPS printer...
+ */
+
+ printer->ipps_ref = DNSSDMaster;
+
+ if (subtype && *subtype)
+ snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", subtype);
+ else
+ strlcpy(regtype, "_ipps._tcp", sizeof(regtype));
+
+ if ((error = DNSServiceRegister(&(printer->ipps_ref),
+ kDNSServiceFlagsShareConnection,
+ 0 /* interfaceIndex */, printer->dnssd_name,
+ regtype, NULL /* domain */,
+ NULL /* host */, htons(printer->port),
+ TXTRecordGetLength(&ipp_txt),
+ TXTRecordGetBytesPtr(&ipp_txt),
(DNSServiceRegisterReply)dnssd_callback,
printer)) != kDNSServiceErr_NoError)
{
@@ -4576,13 +6511,14 @@ register_printer(
printer->dnssd_name, regtype, error);
return (0);
}
+# endif /* HAVE_SSL */
/*
* Similarly, register the _http._tcp,_printer (HTTP) service type with the
* real port number to advertise our IPP printer...
*/
- printer->http_ref = printer->common_ref;
+ printer->http_ref = DNSSDMaster;
if ((error = DNSServiceRegister(&(printer->http_ref),
kDNSServiceFlagsShareConnection,
@@ -4598,9 +6534,85 @@ register_printer(
return (0);
}
+ TXTRecordDeallocate(&ipp_txt);
+
+#elif defined(HAVE_AVAHI)
+ char temp[256]; /* Subtype service string */
+
+ /*
+ * Create the TXT record...
+ */
+
+ ipp_txt = NULL;
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "rp=ipp/print");
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s %s", make, model);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", adminurl);
+ if (*location)
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", location);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "product=(%s)", model);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "Color=%s", color ? "T" : "F");
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "Duplex=%s", duplex ? "T" : "F");
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "usb_MFG=%s", make);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "usb_MDL=%s", model);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "UUID=%s", uuid);
+# ifdef HAVE_SSL
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "TLS=1.2");
+# endif /* HAVE_SSL */
+
+ /*
+ * Register _printer._tcp (LPD) with port 0 to reserve the service name...
+ */
+
+ avahi_threaded_poll_lock(DNSSDMaster);
+
+ printer->ipp_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, NULL);
+
+ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL);
+
+ /*
+ * Then register the _ipp._tcp (IPP)...
+ */
+
+ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt);
+ if (subtype && *subtype)
+ {
+ snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", subtype);
+ avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp);
+ }
+
+#ifdef HAVE_SSL
+ /*
+ * _ipps._tcp (IPPS) for secure printing...
+ */
+
+ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt);
+ if (subtype && *subtype)
+ {
+ snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", subtype);
+ avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp);
+ }
+#endif /* HAVE_SSL */
+
+ /*
+ * Finally _http.tcp (HTTP) for the web interface...
+ */
+
+ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL);
+ avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");
+
+ /*
+ * Commit it...
+ */
+
+ avahi_entry_group_commit(printer->ipp_ref);
+ avahi_threaded_poll_unlock(DNSSDMaster);
+
+ avahi_string_list_free(ipp_txt);
+#endif /* HAVE_DNSSD */
+
return (1);
}
-#endif /* HAVE_DNSSD */
/*
@@ -4608,32 +6620,32 @@ register_printer(
*/
int /* O - 1 on success, 0 on failure */
-respond_http(_ipp_client_t *client, /* I - Client */
- http_status_t code, /* I - HTTP status of response */
- const char *type, /* I - MIME type of response */
- size_t length) /* I - Length of response */
+respond_http(
+ _ipp_client_t *client, /* I - Client */
+ http_status_t code, /* I - HTTP status of response */
+ const char *content_encoding, /* I - Content-Encoding of response */
+ const char *type, /* I - MIME media type of response */
+ size_t length) /* I - Length of response */
{
char message[1024]; /* Text message */
- fprintf(stderr, "%s %s\n", client->http.hostname, httpStatus(code));
+ fprintf(stderr, "%s %s\n", client->hostname, httpStatus(code));
- if (code == HTTP_CONTINUE)
+ if (code == HTTP_STATUS_CONTINUE)
{
/*
* 100-continue doesn't send any headers...
*/
- return (httpPrintf(&(client->http), "HTTP/%d.%d 100 Continue\r\n\r\n",
- client->http.version / 100,
- client->http.version % 100) > 0);
+ return (httpWriteResponse(client->http, HTTP_STATUS_CONTINUE) == 0);
}
/*
* Format an error message...
*/
- if (!type && !length && code != HTTP_OK)
+ if (!type && !length && code != HTTP_STATUS_OK && code != HTTP_STATUS_SWITCHING_PROTOCOLS)
{
snprintf(message, sizeof(message), "%d - %s\n", code, httpStatus(code));
@@ -4644,60 +6656,30 @@ respond_http(_ipp_client_t *client, /* I - Client */
message[0] = '\0';
/*
- * Send the HTTP status header...
- */
-
- httpFlushWrite(&(client->http));
-
- client->http.data_encoding = HTTP_ENCODE_FIELDS;
-
- if (httpPrintf(&(client->http), "HTTP/%d.%d %d %s\r\n", client->http.version / 100,
- client->http.version % 100, code, httpStatus(code)) < 0)
- return (0);
-
- /*
- * Follow the header with the response fields...
+ * Send the HTTP response header...
*/
- if (httpPrintf(&(client->http), "Date: %s\r\n", httpGetDateString(time(NULL))) < 0)
- return (0);
+ httpClearFields(client->http);
- if (client->http.keep_alive && client->http.version >= HTTP_1_0)
- {
- if (httpPrintf(&(client->http),
- "Connection: Keep-Alive\r\n"
- "Keep-Alive: timeout=10\r\n") < 0)
- return (0);
- }
-
- if (code == HTTP_METHOD_NOT_ALLOWED || client->operation == HTTP_OPTIONS)
- {
- if (httpPrintf(&(client->http), "Allow: GET, HEAD, OPTIONS, POST\r\n") < 0)
- return (0);
- }
+ if (code == HTTP_STATUS_METHOD_NOT_ALLOWED ||
+ client->operation == HTTP_STATE_OPTIONS)
+ httpSetField(client->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST");
if (type)
{
if (!strcmp(type, "text/html"))
- {
- if (httpPrintf(&(client->http),
- "Content-Type: text/html; charset=utf-8\r\n") < 0)
- return (0);
- }
- else if (httpPrintf(&(client->http), "Content-Type: %s\r\n", type) < 0)
- return (0);
- }
+ httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE,
+ "text/html; charset=utf-8");
+ else
+ httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, type);
- if (length == 0 && !message[0])
- {
- if (httpPrintf(&(client->http), "Transfer-Encoding: chunked\r\n\r\n") < 0)
- return (0);
+ if (content_encoding)
+ httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, content_encoding);
}
- else if (httpPrintf(&(client->http), "Content-Length: " CUPS_LLFMT "\r\n\r\n",
- CUPS_LLCAST length) < 0)
- return (0);
- if (httpFlushWrite(&(client->http)) < 0)
+ httpSetLength(client->http, length);
+
+ if (httpWriteResponse(client->http, code) < 0)
return (0);
/*
@@ -4710,7 +6692,10 @@ respond_http(_ipp_client_t *client, /* I - Client */
* Send a plain text message.
*/
- if (httpPrintf(&(client->http), "%s", message) < 0)
+ if (httpPrintf(client->http, "%s", message) < 0)
+ return (0);
+
+ if (httpWrite2(client->http, "", 0) < 0)
return (0);
}
else if (client->response)
@@ -4721,21 +6706,13 @@ respond_http(_ipp_client_t *client, /* I - Client */
debug_attributes("Response", client->response, 2);
- client->http.data_encoding = HTTP_ENCODE_LENGTH;
- client->http.data_remaining = (off_t)ippLength(client->response);
- client->response->state = IPP_IDLE;
+ ippSetState(client->response, IPP_STATE_IDLE);
- if (ippWrite(&(client->http), client->response) != IPP_DATA)
+ if (ippWrite(client->http, client->response) != IPP_STATE_DATA)
return (0);
}
- else
- client->http.data_encoding = HTTP_ENCODE_CHUNKED;
-
- /*
- * Flush the data and return...
- */
- return (httpFlushWrite(&(client->http)) >= 0);
+ return (1);
}
@@ -4749,36 +6726,35 @@ respond_ipp(_ipp_client_t *client, /* I - Client */
const char *message, /* I - printf-style status-message */
...) /* I - Additional args as needed */
{
- va_list ap; /* Pointer to additional args */
- char formatted[1024]; /* Formatted errror message */
+ const char *formatted = NULL; /* Formatted message */
- client->response->request.status.status_code = status;
-
- if (!client->response->attrs)
- {
- ippAddString(client->response, IPP_TAG_OPERATION,
- IPP_TAG_CHARSET | IPP_TAG_COPY, "attributes-charset", NULL,
- "utf-8");
- ippAddString(client->response, IPP_TAG_OPERATION,
- IPP_TAG_LANGUAGE | IPP_TAG_COPY, "attributes-natural-language",
- NULL, "en-us");
- }
+ ippSetStatusCode(client->response, status);
if (message)
{
+ va_list ap; /* Pointer to additional args */
+ ipp_attribute_t *attr; /* New status-message attribute */
+
va_start(ap, message);
- vsnprintf(formatted, sizeof(formatted), message, ap);
+ if ((attr = ippFindAttribute(client->response, "status-message",
+ IPP_TAG_TEXT)) != NULL)
+ ippSetStringfv(client->response, &attr, 0, message, ap);
+ else
+ attr = ippAddStringfv(client->response, IPP_TAG_OPERATION, IPP_TAG_TEXT,
+ "status-message", NULL, message, ap);
va_end(ap);
- ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_TEXT,
- "status-message", NULL, formatted);
+ formatted = ippGetString(attr, 0, NULL);
}
- else
- formatted[0] = '\0';
- fprintf(stderr, "%s %s %s (%s)\n", client->http.hostname,
- ippOpString(client->operation_id), ippErrorString(status), formatted);
+ if (formatted)
+ fprintf(stderr, "%s %s %s (%s)\n", client->hostname,
+ ippOpString(client->operation_id), ippErrorString(status),
+ formatted);
+ else
+ fprintf(stderr, "%s %s %s\n", client->hostname,
+ ippOpString(client->operation_id), ippErrorString(status));
}
@@ -4794,12 +6770,10 @@ respond_unsupported(
ipp_attribute_t *temp; /* Copy of attribute */
- if (!client->response->attrs)
- respond_ipp(client, IPP_ATTRIBUTES, "Unsupported %s %s%s value.",
- attr->name, attr->num_values > 1 ? "1setOf " : "",
- ippTagString(attr->value_tag));
- else
- ippSetStatusCode(client->response, IPP_ATTRIBUTES);
+ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,
+ "Unsupported %s %s%s value.", ippGetName(attr),
+ ippGetCount(attr) > 1 ? "1setOf " : "",
+ ippTagString(ippGetValueTag(attr)));
temp = ippCopyAttribute(client->response, attr, 0);
ippSetGroupTag(client->response, &temp, IPP_TAG_UNSUPPORTED_GROUP);
@@ -4832,7 +6806,7 @@ run_printer(_ipp_printer_t *printer) /* I - Printer */
num_fds = 2;
#ifdef HAVE_DNSSD
- polldata[num_fds ].fd = DNSServiceRefSockFD(printer->common_ref);
+ polldata[num_fds ].fd = DNSServiceRefSockFD(DNSSDMaster);
polldata[num_fds ++].events = POLLIN;
#endif /* HAVE_DNSSD */
@@ -4847,7 +6821,7 @@ run_printer(_ipp_printer_t *printer) /* I - Printer */
else
timeout = -1;
- if (poll(polldata, num_fds, timeout) < 0 && errno != EINTR)
+ if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR)
{
perror("poll() failed");
break;
@@ -4879,7 +6853,7 @@ run_printer(_ipp_printer_t *printer) /* I - Printer */
#ifdef HAVE_DNSSD
if (polldata[2].revents & POLLIN)
- DNSServiceProcessResult(printer->common_ref);
+ DNSServiceProcessResult(DNSSDMaster);
#endif /* HAVE_DNSSD */
/*
@@ -4892,6 +6866,23 @@ run_printer(_ipp_printer_t *printer) /* I - Printer */
/*
+ * 'time_string()' - Return the local time in hours, minutes, and seconds.
+ */
+
+static char *
+time_string(time_t tv, /* I - Time value */
+ char *buffer, /* I - Buffer */
+ size_t bufsize) /* I - Size of buffer */
+{
+ struct tm *curtime = localtime(&tv);
+ /* Local time */
+
+ strftime(buffer, bufsize, "%X", curtime);
+ return (buffer);
+}
+
+
+/*
* 'usage()' - Show program usage.
*/
@@ -4900,7 +6891,8 @@ usage(int status) /* O - Exit status */
{
if (!status)
{
- puts(CUPS_SVERSION " - Copyright 2010 by Apple Inc. All rights reserved.");
+ puts(CUPS_SVERSION " - Copyright 2010-2015 by Apple Inc. All rights "
+ "reserved.");
puts("");
}
@@ -4909,17 +6901,21 @@ usage(int status) /* O - Exit status */
puts("Options:");
puts("-2 Supports 2-sided printing (default=1-sided)");
puts("-M manufacturer Manufacturer name (default=Test)");
+ puts("-P PIN printing mode");
+ puts("-a attributes-file Load printer attributes from file");
+ puts("-c command Run command for every print job");
printf("-d spool-directory Spool directory "
"(default=/tmp/ippserver.%d)\n", (int)getpid());
puts("-f type/subtype[,...] List of supported types "
"(default=application/pdf,image/jpeg)");
puts("-h Show program help");
puts("-i iconfile.png PNG icon file (default=printer.png)");
+ puts("-k Keep job spool files");
puts("-l location Location of printer (default=empty string)");
puts("-m model Model name (default=Printer)");
puts("-n hostname Hostname for printer");
puts("-p port Port number (default=auto)");
- puts("-r regtype Bonjour service type (default=_ipp._tcp)");
+ puts("-r subtype Bonjour service subtype (default=_print)");
puts("-s speed[,color-speed] Speed in pages per minute (default=10,0)");
puts("-v[vvv] Be (very) verbose");
@@ -4939,108 +6935,137 @@ static int /* O - 1 if valid, 0 if not */
valid_doc_attributes(
_ipp_client_t *client) /* I - Client */
{
- int i; /* Looping var */
+ int valid = 1; /* Valid attributes? */
+ ipp_op_t op = ippGetOperation(client->request);
+ /* IPP operation */
+ const char *op_name = ippOpString(op);
+ /* IPP operation name */
ipp_attribute_t *attr, /* Current attribute */
- *supported; /* document-format-supported */
- const char *format = NULL; /* document-format value */
+ *supported; /* xxx-supported attribute */
+ const char *compression = NULL,
+ /* compression value */
+ *format = NULL; /* document-format value */
/*
* Check operation attributes...
*/
- if ((attr = ippFindAttribute(client->request, "compression",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "compression", IPP_TAG_ZERO)) != NULL)
{
/*
- * If compression is specified, only accept "none"...
+ * If compression is specified, only accept a supported value in a Print-Job
+ * or Send-Document request...
*/
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_KEYWORD ||
- strcmp(attr->values[0].string.text, "none"))
+ compression = ippGetString(attr, 0, NULL);
+ supported = ippFindAttribute(client->printer->attrs,
+ "compression-supported", IPP_TAG_KEYWORD);
+
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD ||
+ ippGetGroupTag(attr) != IPP_TAG_OPERATION ||
+ (op != IPP_OP_PRINT_JOB && op != IPP_OP_SEND_DOCUMENT &&
+ op != IPP_OP_VALIDATE_JOB) ||
+ !ippContainsString(supported, compression))
+ {
respond_unsupported(client, attr);
+ valid = 0;
+ }
else
- fprintf(stderr, "%s %s compression=\"%s\"\n",
- client->http.hostname,
- ippOpString(client->request->request.op.operation_id),
- attr->values[0].string.text);
+ {
+ fprintf(stderr, "%s %s compression=\"%s\"\n", client->hostname, op_name, compression);
+
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "compression-supplied", NULL, compression);
+
+ if (strcmp(compression, "none"))
+ {
+ if (Verbosity)
+ fprintf(stderr, "Receiving job file with \"%s\" compression.\n", compression);
+ httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, compression);
+ }
+ }
}
/*
* Is it a format we support?
*/
- if ((attr = ippFindAttribute(client->request, "document-format",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_MIMETYPE)
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_MIMETYPE ||
+ ippGetGroupTag(attr) != IPP_TAG_OPERATION)
+ {
respond_unsupported(client, attr);
+ valid = 0;
+ }
else
{
- format = attr->values[0].string.text;
+ format = ippGetString(attr, 0, NULL);
fprintf(stderr, "%s %s document-format=\"%s\"\n",
- client->http.hostname,
- ippOpString(client->request->request.op.operation_id), format);
+ client->hostname, op_name, format);
+
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, format);
}
}
else
- format = "application/octet-stream";
+ {
+ format = ippGetString(ippFindAttribute(client->printer->attrs, "document-format-default", IPP_TAG_MIMETYPE), 0, NULL);
+ if (!format)
+ format = "application/octet-stream"; /* Should never happen */
+
+ attr = ippAddString(client->request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format);
+ }
- if (!strcmp(format, "application/octet-stream") &&
- (client->request->request.op.operation_id == IPP_PRINT_JOB ||
- client->request->request.op.operation_id == IPP_SEND_DOCUMENT))
+ if (!strcmp(format, "application/octet-stream") && (ippGetOperation(client->request) == IPP_OP_PRINT_JOB || ippGetOperation(client->request) == IPP_OP_SEND_DOCUMENT))
{
/*
- * Auto-type the file using the first 4 bytes of the file...
+ * Auto-type the file using the first 8 bytes of the file...
*/
- unsigned char header[4]; /* First 4 bytes of file */
+ unsigned char header[8]; /* First 8 bytes of file */
memset(header, 0, sizeof(header));
- _httpPeek(&(client->http), (char *)header, sizeof(header));
+ httpPeek(client->http, (char *)header, sizeof(header));
if (!memcmp(header, "%PDF", 4))
format = "application/pdf";
else if (!memcmp(header, "%!", 2))
format = "application/postscript";
- else if (!memcmp(header, "\377\330\377", 3) &&
- header[3] >= 0xe0 && header[3] <= 0xef)
+ else if (!memcmp(header, "\377\330\377", 3) && header[3] >= 0xe0 && header[3] <= 0xef)
format = "image/jpeg";
else if (!memcmp(header, "\211PNG", 4))
format = "image/png";
+ else if (!memcmp(header, "RAS2", 4))
+ format = "image/pwg-raster";
+ else if (!memcmp(header, "UNIRAST", 8))
+ format = "image/urf";
+ else
+ format = NULL;
if (format)
+ {
fprintf(stderr, "%s %s Auto-typed document-format=\"%s\"\n",
- client->http.hostname,
- ippOpString(client->request->request.op.operation_id), format);
+ client->hostname, op_name, format);
- if (!attr)
- attr = ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
- "document-format", NULL, format);
- else
- {
- _cupsStrFree(attr->values[0].string.text);
- attr->values[0].string.text = _cupsStrAlloc(format);
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, format);
}
}
- if (client->request->request.op.operation_id != IPP_CREATE_JOB &&
- (supported = ippFindAttribute(client->printer->attrs,
- "document-format-supported",
- IPP_TAG_MIMETYPE)) != NULL)
+ if (op != IPP_OP_CREATE_JOB && (supported = ippFindAttribute(client->printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL && !ippContainsString(supported, format))
{
- for (i = 0; i < supported->num_values; i ++)
- if (!_cups_strcasecmp(format, supported->values[i].string.text))
- break;
-
- if (i >= supported->num_values && attr)
- respond_unsupported(client, attr);
+ respond_unsupported(client, attr);
+ valid = 0;
}
- return (!client->response->attrs ||
- !client->response->attrs->next ||
- !client->response->attrs->next->next);
+ /*
+ * document-name
+ */
+
+ if ((attr = ippFindAttribute(client->request, "document-name", IPP_TAG_NAME)) != NULL)
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL));
+
+ return (valid);
}
@@ -5055,7 +7080,9 @@ static int /* O - 1 if valid, 0 if not */
valid_job_attributes(
_ipp_client_t *client) /* I - Client */
{
- int i; /* Looping var */
+ int i, /* Looping var */
+ count, /* Number of values */
+ valid = 1; /* Valid attributes? */
ipp_attribute_t *attr, /* Current attribute */
*supported; /* xxx-supported attribute */
@@ -5064,193 +7091,305 @@ valid_job_attributes(
* Check operation attributes...
*/
- valid_doc_attributes(client);
+ valid = valid_doc_attributes(client);
/*
* Check the various job template attributes...
*/
- if ((attr = ippFindAttribute(client->request, "copies",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "copies", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER ||
+ ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 999)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+
+ if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_INTEGER ||
- attr->values[0].integer < 1 || attr->values[0].integer > 999)
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BOOLEAN)
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "job-hold-until", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_BOOLEAN)
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(attr) != IPP_TAG_KEYWORD) ||
+ strcmp(ippGetString(attr, 0, NULL), "no-hold"))
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "job-hold-until",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 ||
- (attr->value_tag != IPP_TAG_NAME &&
- attr->value_tag != IPP_TAG_NAMELANG &&
- attr->value_tag != IPP_TAG_KEYWORD) ||
- strcmp(attr->values[0].string.text, "no-hold"))
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 0)
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "job-name",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 ||
- (attr->value_tag != IPP_TAG_NAME &&
- attr->value_tag != IPP_TAG_NAMELANG))
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG))
{
respond_unsupported(client, attr);
+ valid = 0;
}
+
+ ippSetGroupTag(client->request, &attr, IPP_TAG_JOB);
}
+ else
+ ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled");
- if ((attr = ippFindAttribute(client->request, "job-priority",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "job-priority", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_INTEGER ||
- attr->values[0].integer < 1 || attr->values[0].integer > 100)
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER ||
+ ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 100)
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "job-sheets",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "job-sheets", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 ||
- (attr->value_tag != IPP_TAG_NAME &&
- attr->value_tag != IPP_TAG_NAMELANG &&
- attr->value_tag != IPP_TAG_KEYWORD) ||
- strcmp(attr->values[0].string.text, "none"))
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(attr) != IPP_TAG_KEYWORD) ||
+ strcmp(ippGetString(attr, 0, NULL), "none"))
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "media",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "media", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 ||
- (attr->value_tag != IPP_TAG_NAME &&
- attr->value_tag != IPP_TAG_NAMELANG &&
- attr->value_tag != IPP_TAG_KEYWORD))
+ if (ippGetCount(attr) != 1 ||
+ (ippGetValueTag(attr) != IPP_TAG_NAME &&
+ ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(attr) != IPP_TAG_KEYWORD))
{
respond_unsupported(client, attr);
+ valid = 0;
}
else
{
- for (i = 0;
- i < (int)(sizeof(media_supported) / sizeof(media_supported[0]));
- i ++)
- if (!strcmp(attr->values[0].string.text, media_supported[i]))
- break;
+ supported = ippFindAttribute(client->printer->attrs, "media-supported", IPP_TAG_KEYWORD);
- if (i >= (int)(sizeof(media_supported) / sizeof(media_supported[0])))
+ if (!ippContainsString(supported, ippGetString(attr, 0, NULL)))
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
}
- if ((attr = ippFindAttribute(client->request, "media-col",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_BEGIN_COLLECTION)
+ ipp_t *col, /* media-col collection */
+ *size; /* media-size collection */
+ ipp_attribute_t *member, /* Member attribute */
+ *x_dim, /* x-dimension */
+ *y_dim; /* y-dimension */
+ int x_value, /* y-dimension value */
+ y_value; /* x-dimension value */
+
+ if (ippGetCount(attr) != 1 ||
+ ippGetValueTag(attr) != IPP_TAG_BEGIN_COLLECTION)
{
respond_unsupported(client, attr);
+ valid = 0;
+ }
+
+ col = ippGetCollection(attr, 0);
+
+ if ((member = ippFindAttribute(col, "media-size-name", IPP_TAG_ZERO)) != NULL)
+ {
+ if (ippGetCount(member) != 1 ||
+ (ippGetValueTag(member) != IPP_TAG_NAME &&
+ ippGetValueTag(member) != IPP_TAG_NAMELANG &&
+ ippGetValueTag(member) != IPP_TAG_KEYWORD))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ supported = ippFindAttribute(client->printer->attrs, "media-supported", IPP_TAG_KEYWORD);
+
+ if (!ippContainsString(supported, ippGetString(member, 0, NULL)))
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+ }
+ else if ((member = ippFindAttribute(col, "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ {
+ if (ippGetCount(member) != 1)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ size = ippGetCollection(member, 0);
+
+ if ((x_dim = ippFindAttribute(size, "x-dimension", IPP_TAG_INTEGER)) == NULL || ippGetCount(x_dim) != 1 ||
+ (y_dim = ippFindAttribute(size, "y-dimension", IPP_TAG_INTEGER)) == NULL || ippGetCount(y_dim) != 1)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ x_value = ippGetInteger(x_dim, 0);
+ y_value = ippGetInteger(y_dim, 0);
+ supported = ippFindAttribute(client->printer->attrs, "media-size-supported", IPP_TAG_BEGIN_COLLECTION);
+ count = ippGetCount(supported);
+
+ for (i = 0; i < count ; i ++)
+ {
+ size = ippGetCollection(supported, i);
+ x_dim = ippFindAttribute(size, "x-dimension", IPP_TAG_ZERO);
+ y_dim = ippFindAttribute(size, "y-dimension", IPP_TAG_ZERO);
+
+ if (ippContainsInteger(x_dim, x_value) && ippContainsInteger(y_dim, y_value))
+ break;
+ }
+
+ if (i >= count)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
+ }
}
- /* TODO: check for valid media-col */
}
- if ((attr = ippFindAttribute(client->request, "multiple-document-handling",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "multiple-document-handling", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_KEYWORD ||
- (strcmp(attr->values[0].string.text,
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD ||
+ (strcmp(ippGetString(attr, 0, NULL),
"separate-documents-uncollated-copies") &&
- strcmp(attr->values[0].string.text,
+ strcmp(ippGetString(attr, 0, NULL),
"separate-documents-collated-copies")))
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "orientation-requested",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "orientation-requested", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_ENUM ||
- attr->values[0].integer < IPP_PORTRAIT ||
- attr->values[0].integer > IPP_REVERSE_PORTRAIT)
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM ||
+ ippGetInteger(attr, 0) < IPP_ORIENT_PORTRAIT ||
+ ippGetInteger(attr, 0) > IPP_ORIENT_REVERSE_PORTRAIT)
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "page-ranges",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "page-ranges", IPP_TAG_ZERO)) != NULL)
{
- respond_unsupported(client, attr);
+ if (ippGetValueTag(attr) != IPP_TAG_RANGE)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
}
- if ((attr = ippFindAttribute(client->request, "print-quality",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "print-quality", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_ENUM ||
- attr->values[0].integer < IPP_QUALITY_DRAFT ||
- attr->values[0].integer > IPP_QUALITY_HIGH)
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM ||
+ ippGetInteger(attr, 0) < IPP_QUALITY_DRAFT ||
+ ippGetInteger(attr, 0) > IPP_QUALITY_HIGH)
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- if ((attr = ippFindAttribute(client->request, "printer-resolution",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "printer-resolution", IPP_TAG_ZERO)) != NULL)
{
- respond_unsupported(client, attr);
+ supported = ippFindAttribute(client->printer->attrs, "printer-resolution-supported", IPP_TAG_RESOLUTION);
+
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_RESOLUTION ||
+ !supported)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ else
+ {
+ int xdpi, /* Horizontal resolution for job template attribute */
+ ydpi, /* Vertical resolution for job template attribute */
+ sydpi; /* Vertical resolution for supported value */
+ ipp_res_t units, /* Units for job template attribute */
+ sunits; /* Units for supported value */
+
+ xdpi = ippGetResolution(attr, 0, &ydpi, &units);
+ count = ippGetCount(supported);
+
+ for (i = 0; i < count; i ++)
+ {
+ if (xdpi == ippGetResolution(supported, i, &sydpi, &sunits) && ydpi == sydpi && units == sunits)
+ break;
+ }
+
+ if (i >= count)
+ {
+ respond_unsupported(client, attr);
+ valid = 0;
+ }
+ }
}
- if ((attr = ippFindAttribute(client->request, "sides",
- IPP_TAG_ZERO)) != NULL)
+ if ((attr = ippFindAttribute(client->request, "sides", IPP_TAG_ZERO)) != NULL)
{
- if (attr->num_values != 1 || attr->value_tag != IPP_TAG_KEYWORD)
+ const char *sides = ippGetString(attr, 0, NULL);
+ /* "sides" value... */
+
+ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD)
{
respond_unsupported(client, attr);
+ valid = 0;
}
-
- if ((supported = ippFindAttribute(client->printer->attrs, "sides",
- IPP_TAG_KEYWORD)) != NULL)
+ else if ((supported = ippFindAttribute(client->printer->attrs, "sides-supported", IPP_TAG_KEYWORD)) != NULL)
{
- for (i = 0; i < supported->num_values; i ++)
- if (!strcmp(attr->values[0].string.text,
- supported->values[i].string.text))
- break;
-
- if (i >= supported->num_values)
+ if (!ippContainsString(supported, sides))
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- else
+ else if (strcmp(sides, "one-sided"))
{
respond_unsupported(client, attr);
+ valid = 0;
}
}
- return (!client->response->attrs ||
- !client->response->attrs->next ||
- !client->response->attrs->next->next);
+ return (valid);
}
/*
- * End of "$Id: ippserver.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ippserver.c 12947 2015-10-28 15:23:33Z msweet $".
*/
diff --git a/test/ippserver.man b/test/ippserver.man
new file mode 100644
index 0000000..a5c1c1c
--- /dev/null
+++ b/test/ippserver.man
@@ -0,0 +1,172 @@
+.\"
+.\" "$Id$"
+.\"
+.\" ippserver man page for CUPS.
+.\"
+.\" Copyright 2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law. Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file. If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippserver 1 "CUPS" "28 August 2014" "Apple Inc."
+.SH NAME
+ippserver \- a simple internet printing protocol server
+.SH SYNOPSIS
+.B ippserver
+[
+.B \-2
+] [
+.B \-M
+.I manufacturer
+] [
+.B \-P
+] [
+.B \-c
+.I command
+] [
+.B \-d
+.I spool-directory
+] [
+.B \-f
+.I type/subtype[,...]
+] [
+.B \-h
+] [
+.B \-i
+.I iconfile.png
+] [
+.B \-k
+] [
+.B \-l
+.I location
+] [
+.B \-m
+.I model
+] [
+.B \-n
+.I hostname
+] [
+.B \-p
+.I port
+] [
+.B \-r
+.I subtype
+] [
+.B \-s
+.I speed[,color-speed]
+] [
+.B \-v[vvv]
+]
+.I service-name
+.SH DESCRIPTION
+.B ippserver
+is a simple Internet Printing Protocol (IPP) server conforming to the IPP Everywhere (PWG 5100.14) specification. It can be used to test client software or act as a very basic print server that runs a command for every job that is printed.
+.SH OPTIONS
+The following options are recognized by
+.B ippserver:
+.TP 5
+.B \-2
+Report support for two-sided (duplex) printing.
+.TP 5
+\fB\-M \fImanufacturer\fR
+Set the manufacturer of the printer.
+The default is "Test".
+.TP 5
+.B \-P
+Report support for PIN printing.
+.TP 5
+\fB\-c \fIcommand\fR
+Run the specified command for each document that is printed.
+.TP 5
+\fB\-d \fIspool-directory\fR
+Specifies the directory that will hold the print files.
+The default is a directory under the user's current temporary directory.
+.TP 5
+\fB\-f \fItype/subtype[,...]\fR
+Specifies a list of MIME media types that the server will accept.
+The default is "application/pdf,image/jpeg,image/pwg-raster".
+.TP 5
+.B \-h
+Shows program help.
+.TP 5
+\fB\-i \fIiconfile.png\fR
+Specifies the printer icon file for the server.
+The default is "printer.png".
+.TP 5
+.B \-k
+Keeps the print documents in the spool directory rather than deleting them.
+.TP 5
+\fB\-l \fIlocation\fR
+Specifies the human-readable location string that is reported by the server.
+The default is the empty string.
+.TP 5
+\fB\-m \fImodel\fR
+Specifies the model name of the printer.
+The default is "Printer".
+.TP 5
+\fB\-n \fIhostname\fR
+Specifies the hostname that is reported by the server.
+The default is the name returned by the
+.BR hostname (1)
+command.
+.TP 5
+\fB\-p \fIport\fR
+Specifies the port number to listen on.
+The default is a user-specific number from 8000 to 8999.
+.TP 5
+\fB\-r \fIsubtype\fR
+Specifies the Bonjour subtype(s) to advertise.
+Separate multiple subtypes with a comma.
+The default is "_print".
+.TP 5
+\fB\-s \fIspeed[,color-speed]\fR
+Specifies the printer speed in pages per minute.
+If two numbers are specified and the second number is greater than zero, the server will report support for color printing.
+The default is "10,0".
+.TP 5
+.B \-v[vvv]
+Be (very) verbose when logging activity to the standard output.
+.SH EXIT STATUS
+The
+.B ippserver
+program returns 1 if it is unable to process the command-line arguments or register the IPP service.
+Otherwise
+.B ippserver
+will run continuously until terminated.
+.SH CONFORMING TO
+The
+.B ippserver
+program is unique to CUPS and conforms to the IPP Everywhere (PWG 5100.14) specification.
+.SH ENVIRONMENT
+.B ippserver
+adds environment variables starting with "IPP_" for all IPP Job attributes in the print request.
+For example, when executing a command for an IPP Job containing the "media" Job Template attribute, the "IPP_MEDIA" environment variable will be set to the value of that attribute.
+.LP
+Enumerated values are converted to their keyword equivalents.
+For example, a "print-quality" Job Template attribute with a enum value of 3 will become the "IPP_PRINT_QUALITY" environment variable with a value of "draft".
+.SH EXAMPLES
+Run
+.B ippserver
+with a service name of My Cool Printer:
+.nf
+
+ ippserver "My Cool Printer"
+.fi
+.LP
+Run the
+.BR file (1)
+command whenever a job is sent to the server:
+.nf
+
+ ippserver \-c file "My Cool Printer"
+.fi
+.SH SEE ALSO
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2014 by Apple Inc.
+.\"
+.\" End of "$Id$".
+.\"
diff --git a/test/ipptool.c b/test/ipptool.c
index afa60ef..64d827b 100644
--- a/test/ipptool.c
+++ b/test/ipptool.c
@@ -1,48 +1,18 @@
/*
- * "$Id: ipptool.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipptool.c 12952 2015-10-28 17:22:39Z msweet $"
*
- * ipptool command for CUPS.
+ * ipptool command for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Parse options and do tests.
- * add_stringf() - Add a formatted string to an array.
- * compare_vars() - Compare two variables.
- * do_tests() - Do tests as specified in the test file.
- * expand_variables() - Expand variables in a string.
- * expect_matches() - Return true if the tag matches the specification.
- * get_collection() - Get a collection value from the current test file.
- * get_filename() - Get a filename based on the current test file.
- * get_token() - Get a token from a file.
- * get_variable() - Get the value of a variable.
- * iso_date() - Return an ISO 8601 date/time string for the given IPP
- * dateTime value.
- * password_cb() - Password callback for authenticated tests.
- * print_attr() - Print an attribute on the screen.
- * print_col() - Print a collection attribute on the screen.
- * print_csv() - Print a line of CSV text.
- * print_fatal_error() - Print a fatal error message.
- * print_line() - Print a line of formatted or CSV text.
- * print_xml_header() - Print a standard XML plist header.
- * print_xml_string() - Print an XML string with escaping.
- * print_xml_trailer() - Print the XML trailer with success/fail value.
- * set_variable() - Set a variable value.
- * sigterm_handler() - Handle SIGINT and SIGTERM.
- * timeout_cb() - Handle HTTP timeouts.
- * usage() - Show program usage.
- * validate_attr() - Determine whether an attribute is valid.
- * with_value() - Test a WITH-VALUE predicate.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
@@ -53,8 +23,14 @@
#include <cups/file-private.h>
#include <regex.h>
#include <sys/stat.h>
-#ifndef WIN32
+#ifdef WIN32
+# include <windows.h>
+# ifndef R_OK
+# define R_OK 0
+# endif /* !R_OK */
+#else
# include <signal.h>
+# include <termios.h>
#endif /* WIN32 */
#ifndef O_BINARY
# define O_BINARY 0
@@ -85,19 +61,24 @@ typedef enum _cups_with_e /**** WITH flags ****/
{
_CUPS_WITH_LITERAL = 0, /* Match string is a literal value */
_CUPS_WITH_ALL = 1, /* Must match all values */
- _CUPS_WITH_REGEX = 2 /* Match string is a regular expression */
+ _CUPS_WITH_REGEX = 2, /* Match string is a regular expression */
+ _CUPS_WITH_HOSTNAME = 4, /* Match string is a URI hostname */
+ _CUPS_WITH_RESOURCE = 8, /* Match string is a URI resource */
+ _CUPS_WITH_SCHEME = 16 /* Match string is a URI scheme */
} _cups_with_t;
typedef struct _cups_expect_s /**** Expected attribute info ****/
{
int optional, /* Optional attribute? */
- not_expect; /* Don't expect attribute? */
+ not_expect, /* Don't expect attribute? */
+ expect_all; /* Expect all attributes to match/not match */
char *name, /* Attribute name */
*of_type, /* Type name */
*same_count_as, /* Parallel attribute name */
*if_defined, /* Only required if variable defined */
*if_not_defined, /* Only required if variable is not defined */
*with_value, /* Attribute must include this value */
+ *with_value_from, /* Attribute must have one of the values in this attribute */
*define_match, /* Variable to define on match */
*define_no_match, /* Variable to define on no-match */
*define_value; /* Variable to define with value */
@@ -148,12 +129,14 @@ typedef struct _cups_vars_s /**** Set of variables ****/
* Globals...
*/
-_cups_transfer_t Transfer = _CUPS_TRANSFER_AUTO;
+static _cups_transfer_t Transfer = _CUPS_TRANSFER_AUTO;
/* How to transfer requests */
-_cups_output_t Output = _CUPS_OUTPUT_LIST;
+static _cups_output_t Output = _CUPS_OUTPUT_LIST;
/* Output mode */
-int Cancel = 0, /* Cancel test? */
+static int Cancel = 0, /* Cancel test? */
IgnoreErrors = 0, /* Ignore errors? */
+ StopAfterIncludeError = 0,
+ /* Stop after include errors? */
Verbosity = 0, /* Show all attributes? */
Version = 11, /* Default IPP version */
XMLHeader = 0, /* 1 if header is written */
@@ -161,65 +144,44 @@ int Cancel = 0, /* Cancel test? */
PassCount = 0, /* Number of passing tests */
FailCount = 0, /* Number of failing tests */
SkipCount = 0; /* Number of skipped tests */
-char *Password = NULL; /* Password from URI */
-const char * const URIStatusStrings[] = /* URI status strings */
-{
- "URI too large",
- "Bad arguments to function",
- "Bad resource in URI",
- "Bad port number in URI",
- "Bad hostname/address in URI",
- "Bad username in URI",
- "Bad scheme in URI",
- "Bad/empty URI",
- "OK",
- "Missing scheme in URI",
- "Unknown scheme in URI",
- "Missing resource in URI"
-};
+static char *Username = NULL, /* Username from URI */
+ *Password = NULL; /* Password from URI */
+static int PasswordTries = 0; /* Number of tries with password */
/*
* Local functions...
*/
-static void add_stringf(cups_array_t *a, const char *s, ...)
- __attribute__ ((__format__ (__printf__, 2, 3)));
+static void add_stringf(cups_array_t *a, const char *s, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
static int compare_vars(_cups_var_t *a, _cups_var_t *b);
-static int do_tests(_cups_vars_t *vars, const char *testfile);
-static void expand_variables(_cups_vars_t *vars, char *dst, const char *src,
- size_t dstsize) __attribute__((nonnull(1,2,3)));
+static int do_tests(FILE *outfile, _cups_vars_t *vars, const char *testfile);
+static void expand_variables(_cups_vars_t *vars, char *dst, const char *src, size_t dstsize) __attribute__((nonnull(1,2,3)));
static int expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag);
-static ipp_t *get_collection(_cups_vars_t *vars, FILE *fp, int *linenum);
-static char *get_filename(const char *testfile, char *dst, const char *src,
- size_t dstsize);
-static char *get_token(FILE *fp, char *buf, int buflen,
- int *linenum);
+static ipp_t *get_collection(FILE *outfile, _cups_vars_t *vars, FILE *fp, int *linenum);
+static char *get_filename(const char *testfile, char *dst, const char *src, size_t dstsize);
+static const char *get_string(ipp_attribute_t *attr, int element, int flags, char *buffer, size_t bufsize);
+static char *get_token(FILE *fp, char *buf, int buflen, int *linenum);
static char *get_variable(_cups_vars_t *vars, const char *name);
static char *iso_date(ipp_uchar_t *date);
static const char *password_cb(const char *prompt);
-static void print_attr(ipp_attribute_t *attr, ipp_tag_t *group);
-static void print_col(ipp_t *col);
-static void print_csv(ipp_attribute_t *attr, int num_displayed,
- char **displayed, size_t *widths);
-static void print_fatal_error(const char *s, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
-static void print_line(ipp_attribute_t *attr, int num_displayed,
- char **displayed, size_t *widths);
-static void print_xml_header(void);
-static void print_xml_string(const char *element, const char *s);
-static void print_xml_trailer(int success, const char *message);
-static void set_variable(_cups_vars_t *vars, const char *name,
- const char *value);
+static void pause_message(const char *message);
+static void print_attr(FILE *outfile, int format, ipp_attribute_t *attr, ipp_tag_t *group);
+static void print_csv(FILE *outfile, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void print_fatal_error(FILE *outfile, const char *s, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
+static void print_line(FILE *outfile, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void print_xml_header(FILE *outfile);
+static void print_xml_string(FILE *outfile, const char *element, const char *s);
+static void print_xml_trailer(FILE *outfile, int success, const char *message);
+static void set_variable(FILE *outfile, _cups_vars_t *vars, const char *name, const char *value);
#ifndef WIN32
static void sigterm_handler(int sig);
#endif /* WIN32 */
static int timeout_cb(http_t *http, void *user_data);
static void usage(void) __attribute__((noreturn));
-static int validate_attr(cups_array_t *errors, ipp_attribute_t *attr);
-static int with_value(cups_array_t *errors, char *value, int flags,
- ipp_attribute_t *attr, char *matchbuf,
- size_t matchlen);
+static int validate_attr(FILE *outfile, cups_array_t *errors, ipp_attribute_t *attr);
+static int with_value(FILE *outfile, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
+static int with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
/*
@@ -232,6 +194,8 @@ main(int argc, /* I - Number of command-line args */
{
int i; /* Looping var */
int status; /* Status of tests... */
+ FILE *outfile = stdout;
+ /* Output file */
char *opt, /* Current option */
name[1024], /* Name/value buffer */
*value, /* Pointer to value */
@@ -280,7 +244,20 @@ main(int argc, /* I - Number of command-line args */
for (i = 1; i < argc; i ++)
{
- if (argv[i][0] == '-')
+ if (!strcmp(argv[i], "--help"))
+ {
+ usage();
+ }
+ else if (!strcmp(argv[i], "--stop-after-include-error"))
+ {
+ StopAfterIncludeError = 1;
+ }
+ else if (!strcmp(argv[i], "--version"))
+ {
+ puts(CUPS_SVERSION);
+ return (0);
+ }
+ else if (argv[i][0] == '-')
{
for (opt = argv[i] + 1; *opt; opt ++)
{
@@ -317,6 +294,33 @@ main(int argc, /* I - Number of command-line args */
Transfer = _CUPS_TRANSFER_LENGTH;
break;
+ case 'P' : /* Output to plist file */
+ i ++;
+
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Missing filename for \"-P\"."), "ipptool");
+ usage();
+ }
+
+ if (outfile != stdout)
+ usage();
+
+ if ((outfile = fopen(argv[i], "w")) == NULL)
+ {
+ _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", argv[i], strerror(errno));
+ exit(1);
+ }
+
+ Output = _CUPS_OUTPUT_PLIST;
+
+ if (interval || repeat)
+ {
+ _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
+ usage();
+ }
+ break;
+
case 'S' : /* Encrypt with SSL */
#ifdef HAVE_SSL
vars.encryption = HTTP_ENCRYPT_ALWAYS;
@@ -331,8 +335,9 @@ main(int argc, /* I - Number of command-line args */
if (i >= argc)
{
- _cupsLangPuts(stderr,
- _("ipptool: Missing timeout for \"-T\"."));
+ _cupsLangPrintf(stderr,
+ _("%s: Missing timeout for \"-T\"."),
+ "ipptool");
usage();
}
@@ -344,8 +349,9 @@ main(int argc, /* I - Number of command-line args */
if (i >= argc)
{
- _cupsLangPuts(stderr,
- _("ipptool: Missing version for \"-V\"."));
+ _cupsLangPrintf(stderr,
+ _("%s: Missing version for \"-V\"."),
+ "ipptool");
usage();
}
@@ -362,8 +368,8 @@ main(int argc, /* I - Number of command-line args */
else
{
_cupsLangPrintf(stderr,
- _("ipptool: Bad version %s for \"-V\"."),
- argv[i]);
+ _("%s: Bad version %s for \"-V\"."),
+ "ipptool", argv[i]);
usage();
}
break;
@@ -373,8 +379,7 @@ main(int argc, /* I - Number of command-line args */
if (interval || repeat)
{
- _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are "
- "incompatible with -X\"."));
+ _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
usage();
}
break;
@@ -399,7 +404,7 @@ main(int argc, /* I - Number of command-line args */
else
value = name + strlen(name);
- set_variable(&vars, name, value);
+ set_variable(outfile, &vars, name, value);
break;
case 'f' : /* Set the default test filename */
@@ -413,7 +418,10 @@ main(int argc, /* I - Number of command-line args */
}
if (vars.filename)
+ {
free(vars.filename);
+ vars.filename = NULL;
+ }
if (access(argv[i], 0))
{
@@ -436,6 +444,8 @@ main(int argc, /* I - Number of command-line args */
cg->cups_datadir, argv[i]);
if (access(filename, 0))
vars.filename = strdup(argv[i]);
+ else
+ vars.filename = strdup(filename);
}
else
vars.filename = strdup(filename);
@@ -453,34 +463,43 @@ main(int argc, /* I - Number of command-line args */
*/
if (!_cups_strcasecmp(ext, ".gif"))
- set_variable(&vars, "filetype", "image/gif");
+ set_variable(outfile, &vars, "filetype", "image/gif");
else if (!_cups_strcasecmp(ext, ".htm") ||
!_cups_strcasecmp(ext, ".htm.gz") ||
!_cups_strcasecmp(ext, ".html") ||
!_cups_strcasecmp(ext, ".html.gz"))
- set_variable(&vars, "filetype", "text/html");
- else if (!_cups_strcasecmp(ext, ".jpg"))
- set_variable(&vars, "filetype", "image/jpeg");
+ set_variable(outfile, &vars, "filetype", "text/html");
+ else if (!_cups_strcasecmp(ext, ".jpg") ||
+ !_cups_strcasecmp(ext, ".jpeg"))
+ set_variable(outfile, &vars, "filetype", "image/jpeg");
else if (!_cups_strcasecmp(ext, ".pcl") ||
!_cups_strcasecmp(ext, ".pcl.gz"))
- set_variable(&vars, "filetype", "application/vnd.hp-PCL");
+ set_variable(outfile, &vars, "filetype", "application/vnd.hp-PCL");
else if (!_cups_strcasecmp(ext, ".pdf"))
- set_variable(&vars, "filetype", "application/pdf");
+ set_variable(outfile, &vars, "filetype", "application/pdf");
else if (!_cups_strcasecmp(ext, ".png"))
- set_variable(&vars, "filetype", "image/png");
+ set_variable(outfile, &vars, "filetype", "image/png");
else if (!_cups_strcasecmp(ext, ".ps") ||
!_cups_strcasecmp(ext, ".ps.gz"))
- set_variable(&vars, "filetype", "application/postscript");
- else if (!_cups_strcasecmp(ext, ".ras") ||
+ set_variable(outfile, &vars, "filetype", "application/postscript");
+ else if (!_cups_strcasecmp(ext, ".pwg") ||
+ !_cups_strcasecmp(ext, ".pwg.gz") ||
+ !_cups_strcasecmp(ext, ".ras") ||
!_cups_strcasecmp(ext, ".ras.gz"))
- set_variable(&vars, "filetype", "image/pwg-raster");
+ set_variable(outfile, &vars, "filetype", "image/pwg-raster");
+ else if (!_cups_strcasecmp(ext, ".tif") ||
+ !_cups_strcasecmp(ext, ".tiff"))
+ set_variable(outfile, &vars, "filetype", "image/tiff");
else if (!_cups_strcasecmp(ext, ".txt") ||
!_cups_strcasecmp(ext, ".txt.gz"))
- set_variable(&vars, "filetype", "text/plain");
+ set_variable(outfile, &vars, "filetype", "text/plain");
+ else if (!_cups_strcasecmp(ext, ".urf") ||
+ !_cups_strcasecmp(ext, ".urf.gz"))
+ set_variable(outfile, &vars, "filetype", "image/urf");
else if (!_cups_strcasecmp(ext, ".xps"))
- set_variable(&vars, "filetype", "application/openxps");
+ set_variable(outfile, &vars, "filetype", "application/openxps");
else
- set_variable(&vars, "filetype", "application/octet-stream");
+ set_variable(outfile, &vars, "filetype", "application/octet-stream");
}
else
{
@@ -488,7 +507,7 @@ main(int argc, /* I - Number of command-line args */
* Use the "auto-type" MIME media type...
*/
- set_variable(&vars, "filetype", "application/octet-stream");
+ set_variable(outfile, &vars, "filetype", "application/octet-stream");
}
break;
@@ -515,8 +534,7 @@ main(int argc, /* I - Number of command-line args */
if (Output == _CUPS_OUTPUT_PLIST && interval)
{
- _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are "
- "incompatible with -X\"."));
+ _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
usage();
}
break;
@@ -539,8 +557,7 @@ main(int argc, /* I - Number of command-line args */
if (Output == _CUPS_OUTPUT_PLIST && repeat)
{
- _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are "
- "incompatible with -X\"."));
+ _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
usage();
}
break;
@@ -561,7 +578,6 @@ main(int argc, /* I - Number of command-line args */
_cupsLangPrintf(stderr, _("ipptool: Unknown option \"-%c\"."),
*opt);
usage();
- break;
}
}
}
@@ -597,8 +613,7 @@ main(int argc, /* I - Number of command-line args */
if (uri_status != HTTP_URI_OK)
{
- _cupsLangPrintf(stderr, _("ipptool: Bad URI - %s."),
- URIStatusStrings[uri_status - HTTP_URI_OVERFLOW]);
+ _cupsLangPrintf(stderr, _("ipptool: Bad URI - %s."), httpURIStatusString(uri_status));
return (1);
}
@@ -607,9 +622,9 @@ main(int argc, /* I - Number of command-line args */
if ((Password = strchr(vars.userpass, ':')) != NULL)
*Password++ = '\0';
- cupsSetUser(vars.userpass);
+ Username = vars.userpass;
cupsSetPasswordCB(password_cb);
- set_variable(&vars, "uriuser", vars.userpass);
+ set_variable(outfile, &vars, "uriuser", vars.userpass);
}
httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), vars.scheme, NULL,
@@ -625,6 +640,7 @@ main(int argc, /* I - Number of command-line args */
if (!vars.uri)
{
_cupsLangPuts(stderr, _("ipptool: URI required before test file."));
+ _cupsLangPuts(stderr, argv[i]);
usage();
}
@@ -644,7 +660,7 @@ main(int argc, /* I - Number of command-line args */
else
testfile = argv[i];
- if (!do_tests(&vars, testfile))
+ if (!do_tests(outfile, &vars, testfile))
status = 1;
}
}
@@ -657,13 +673,13 @@ main(int argc, /* I - Number of command-line args */
*/
if (Output == _CUPS_OUTPUT_PLIST)
- print_xml_trailer(!status, NULL);
+ print_xml_trailer(outfile, !status, NULL);
else if (interval > 0 && repeat > 0)
{
while (repeat > 1)
{
- usleep(interval);
- do_tests(&vars, testfile);
+ usleep((useconds_t)interval);
+ do_tests(outfile, &vars, testfile);
repeat --;
}
}
@@ -671,11 +687,12 @@ main(int argc, /* I - Number of command-line args */
{
for (;;)
{
- usleep(interval);
- do_tests(&vars, testfile);
+ usleep((useconds_t)interval);
+ do_tests(outfile, &vars, testfile);
}
}
- else if (Output == _CUPS_OUTPUT_TEST && TestCount > 1)
+
+ if ((Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile)) && TestCount > 1)
{
/*
* Show a summary report if there were multiple tests...
@@ -747,7 +764,8 @@ compare_vars(_cups_var_t *a, /* I - First variable */
*/
static int /* 1 = success, 0 = failure */
-do_tests(_cups_vars_t *vars, /* I - Variables */
+do_tests(FILE *outfile, /* I - Output file */
+ _cups_vars_t *vars, /* I - Variables */
const char *testfile) /* I - Test file to use */
{
int i, /* Looping var */
@@ -768,7 +786,8 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
token[1024], /* Token from file */
*tokenptr, /* Pointer into token */
temp[1024], /* Temporary string */
- buffer[8192]; /* Copy buffer */
+ buffer[8192], /* Copy buffer */
+ compression[16]; /* COMPRESSION value */
ipp_t *request = NULL, /* IPP request */
*response = NULL; /* IPP response */
size_t length; /* Length of IPP request */
@@ -782,7 +801,9 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
ipp_attribute_t *attrptr, /* Attribute pointer */
*found, /* Found attribute */
*lastcol = NULL; /* Last collection attribute */
- char name[1024]; /* Name of test */
+ char name[1024], /* Name of test */
+ file_id[1024], /* File identifier */
+ test_id[1024]; /* Test identifier */
char filename[1024]; /* Filename */
_cups_transfer_t transfer; /* To chunk or not to chunk */
int version, /* IPP version number to use */
@@ -808,7 +829,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if ((fp = fopen(testfile, "r")) == NULL)
{
- print_fatal_error("Unable to open test file %s - %s", testfile,
+ print_fatal_error(outfile, "Unable to open test file %s - %s", testfile,
strerror(errno));
pass = 0;
goto test_exit;
@@ -818,22 +839,21 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* Connect to the server...
*/
- if ((http = _httpCreate(vars->hostname, vars->port, NULL, vars->encryption,
- vars->family)) == NULL)
+ if ((http = httpConnect2(vars->hostname, vars->port, NULL, vars->family,
+ vars->encryption, 1, 30000, NULL)) == NULL)
{
- print_fatal_error("Unable to connect to %s on port %d - %s", vars->hostname,
+ print_fatal_error(outfile, "Unable to connect to %s on port %d - %s", vars->hostname,
vars->port, cupsLastErrorString());
pass = 0;
goto test_exit;
}
- if (httpReconnect(http))
- {
- print_fatal_error("Unable to connect to %s on port %d - %s", vars->hostname,
- vars->port, cupsLastErrorString());
- pass = 0;
- goto test_exit;
- }
+#ifdef HAVE_LIBZ
+ httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING,
+ "deflate, gzip, identity");
+#else
+ httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity");
+#endif /* HAVE_LIBZ */
if (vars->timeout > 0.0)
httpSetTimeout(http, vars->timeout, timeout_cb, NULL);
@@ -846,6 +866,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup,
(cups_afree_func_t)free);
+ file_id[0] = '\0';
pass = 1;
linenum = 1;
request_id = (CUPS_RAND() % 1000) * 137 + 1;
@@ -866,11 +887,11 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
get_token(fp, temp, sizeof(temp), &linenum))
{
expand_variables(vars, token, temp, sizeof(token));
- set_variable(vars, attr, token);
+ set_variable(outfile, vars, attr, token);
}
else
{
- print_fatal_error("Missing DEFINE name and/or value on line %d.",
+ print_fatal_error(outfile, "Missing DEFINE name and/or value on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -889,11 +910,11 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
expand_variables(vars, token, temp, sizeof(token));
if (!get_variable(vars, attr))
- set_variable(vars, attr, token);
+ set_variable(outfile, vars, attr, token);
}
else
{
- print_fatal_error("Missing DEFINE-DEFAULT name and/or value on line "
+ print_fatal_error(outfile, "Missing DEFINE-DEFAULT name and/or value on line "
"%d.", linenum);
pass = 0;
goto test_exit;
@@ -901,6 +922,25 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
continue;
}
+ else if (!strcmp(token, "FILE-ID"))
+ {
+ /*
+ * FILE-ID "string"
+ */
+
+ if (get_token(fp, temp, sizeof(temp), &linenum))
+ {
+ expand_variables(vars, file_id, temp, sizeof(file_id));
+ }
+ else
+ {
+ print_fatal_error(outfile, "Missing FILE-ID value on line %d.", linenum);
+ pass = 0;
+ goto test_exit;
+ }
+
+ continue;
+ }
else if (!strcmp(token, "IGNORE-ERRORS"))
{
/*
@@ -915,7 +955,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing IGNORE-ERRORS value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing IGNORE-ERRORS value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -935,18 +975,17 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* Map the filename to and then run the tests...
*/
- if (!do_tests(vars, get_filename(testfile, filename, temp,
- sizeof(filename))))
+ if (!do_tests(outfile, vars, get_filename(testfile, filename, temp, sizeof(filename))))
{
pass = 0;
- if (!IgnoreErrors)
+ if (StopAfterIncludeError)
goto test_exit;
}
}
else
{
- print_fatal_error("Missing INCLUDE filename on line %d.", linenum);
+ print_fatal_error(outfile, "Missing INCLUDE filename on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -969,18 +1008,17 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
*/
if (get_variable(vars, attr) &&
- !do_tests(vars, get_filename(testfile, filename, temp,
- sizeof(filename))))
+ !do_tests(outfile, vars, get_filename(testfile, filename, temp, sizeof(filename))))
{
pass = 0;
- if (!IgnoreErrors)
+ if (StopAfterIncludeError)
goto test_exit;
}
}
else
{
- print_fatal_error("Missing INCLUDE-IF-DEFINED name or filename on line "
+ print_fatal_error(outfile, "Missing INCLUDE-IF-DEFINED name or filename on line "
"%d.", linenum);
pass = 0;
goto test_exit;
@@ -1004,18 +1042,17 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
*/
if (!get_variable(vars, attr) &&
- !do_tests(vars, get_filename(testfile, filename, temp,
- sizeof(filename))))
+ !do_tests(outfile, vars, get_filename(testfile, filename, temp, sizeof(filename))))
{
pass = 0;
- if (!IgnoreErrors)
+ if (StopAfterIncludeError)
goto test_exit;
}
}
else
{
- print_fatal_error("Missing INCLUDE-IF-NOT-DEFINED name or filename on "
+ print_fatal_error(outfile, "Missing INCLUDE-IF-NOT-DEFINED name or filename on "
"line %d.", linenum);
pass = 0;
goto test_exit;
@@ -1037,7 +1074,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing SKIP-IF-DEFINED variable on line %d.",
+ print_fatal_error(outfile, "Missing SKIP-IF-DEFINED variable on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1056,12 +1093,34 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing SKIP-IF-NOT-DEFINED variable on line %d.",
+ print_fatal_error(outfile, "Missing SKIP-IF-NOT-DEFINED variable on line %d.",
linenum);
pass = 0;
goto test_exit;
}
}
+ else if (!strcmp(token, "STOP-AFTER-INCLUDE-ERROR"))
+ {
+ /*
+ * STOP-AFTER-INCLUDE-ERROR yes
+ * STOP-AFTER-INCLUDE-ERROR no
+ */
+
+ if (get_token(fp, temp, sizeof(temp), &linenum) &&
+ (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no")))
+ {
+ StopAfterIncludeError = !_cups_strcasecmp(temp, "yes");
+ }
+ else
+ {
+ print_fatal_error(outfile, "Missing STOP-AFTER-INCLUDE-ERROR value on line %d.",
+ linenum);
+ pass = 0;
+ goto test_exit;
+ }
+
+ continue;
+ }
else if (!strcmp(token, "TRANSFER"))
{
/*
@@ -1080,7 +1139,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
Transfer = _CUPS_TRANSFER_LENGTH;
else
{
- print_fatal_error("Bad TRANSFER value \"%s\" on line %d.", temp,
+ print_fatal_error(outfile, "Bad TRANSFER value \"%s\" on line %d.", temp,
linenum);
pass = 0;
goto test_exit;
@@ -1088,7 +1147,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing TRANSFER value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing TRANSFER value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1111,14 +1170,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
Version = 22;
else
{
- print_fatal_error("Bad VERSION \"%s\" on line %d.", temp, linenum);
+ print_fatal_error(outfile, "Bad VERSION \"%s\" on line %d.", temp, linenum);
pass = 0;
goto test_exit;
}
}
else
{
- print_fatal_error("Missing VERSION number on line %d.", linenum);
+ print_fatal_error(outfile, "Missing VERSION number on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1127,7 +1186,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else if (strcmp(token, "{"))
{
- print_fatal_error("Unexpected token %s seen on line %d.", token, linenum);
+ print_fatal_error(outfile, "Unexpected token %s seen on line %d.", token, linenum);
pass = 0;
goto test_exit;
}
@@ -1139,8 +1198,8 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (show_header)
{
if (Output == _CUPS_OUTPUT_PLIST)
- print_xml_header();
- else if (Output == _CUPS_OUTPUT_TEST)
+ print_xml_header(outfile);
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
printf("\"%s\":\n", testfile);
show_header = 0;
@@ -1149,17 +1208,19 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
strlcpy(resource, vars->resource, sizeof(resource));
request_id ++;
- request = ippNew();
- op = (ipp_op_t)0;
- group = IPP_TAG_ZERO;
- ignore_errors = IgnoreErrors;
- last_expect = NULL;
- last_status = NULL;
- filename[0] = '\0';
- skip_previous = 0;
- skip_test = 0;
- version = Version;
- transfer = Transfer;
+ request = ippNew();
+ op = (ipp_op_t)0;
+ group = IPP_TAG_ZERO;
+ ignore_errors = IgnoreErrors;
+ last_expect = NULL;
+ last_status = NULL;
+ filename[0] = '\0';
+ skip_previous = 0;
+ skip_test = 0;
+ test_id[0] = '\0';
+ version = Version;
+ transfer = Transfer;
+ compression[0] = '\0';
strlcpy(name, testfile, sizeof(name));
if (strrchr(name, '.') != NULL)
@@ -1184,7 +1245,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
_cups_strcasecmp(token, "REPEAT-NO-MATCH") &&
_cups_strcasecmp(token, "SAME-COUNT-AS") &&
_cups_strcasecmp(token, "WITH-ALL-VALUES") &&
- _cups_strcasecmp(token, "WITH-VALUE"))
+ _cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") &&
+ _cups_strcasecmp(token, "WITH-ALL-RESOURCES") &&
+ _cups_strcasecmp(token, "WITH-ALL-SCHEMES") &&
+ _cups_strcasecmp(token, "WITH-HOSTNAME") &&
+ _cups_strcasecmp(token, "WITH-RESOURCE") &&
+ _cups_strcasecmp(token, "WITH-SCHEME") &&
+ _cups_strcasecmp(token, "WITH-VALUE") &&
+ _cups_strcasecmp(token, "WITH-VALUE-FROM"))
last_expect = NULL;
if (_cups_strcasecmp(token, "DEFINE-MATCH") &&
@@ -1204,46 +1272,49 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* Another collection value
*/
- ipp_t *col = get_collection(vars, fp, &linenum);
+ ipp_t *col = get_collection(outfile, vars, fp, &linenum);
/* Collection value */
if (col)
{
- ipp_attribute_t *tempcol; /* Pointer to new buffer */
-
-
- /*
- * Reallocate memory...
- */
+ ippSetCollection(request, &lastcol, ippGetCount(lastcol), col);
+ }
+ else
+ {
+ pass = 0;
+ goto test_exit;
+ }
+ }
+ else if (!strcmp(token, "COMPRESSION"))
+ {
+ /*
+ * COMPRESSION none
+ * COMPRESSION deflate
+ * COMPRESSION gzip
+ */
- if ((tempcol = realloc(lastcol, sizeof(ipp_attribute_t) +
- (lastcol->num_values + 1) *
- sizeof(_ipp_value_t))) == NULL)
- {
- print_fatal_error("Unable to allocate memory on line %d.", linenum);
+ if (get_token(fp, temp, sizeof(temp), &linenum))
+ {
+ expand_variables(vars, compression, temp, sizeof(compression));
+#ifdef HAVE_LIBZ
+ if (strcmp(compression, "none") && strcmp(compression, "deflate") &&
+ strcmp(compression, "gzip"))
+#else
+ if (strcmp(compression, "none"))
+#endif /* HAVE_LIBZ */
+ {
+ print_fatal_error(outfile, "Unsupported COMPRESSION value '%s' on line %d.",
+ compression, linenum);
pass = 0;
goto test_exit;
- }
-
- if (tempcol != lastcol)
- {
- /*
- * Reset pointers in the list...
- */
-
- if (request->prev)
- request->prev->next = tempcol;
- else
- request->attrs = tempcol;
-
- lastcol = request->current = request->last = tempcol;
- }
+ }
- lastcol->values[lastcol->num_values].collection = col;
- lastcol->num_values ++;
+ if (!strcmp(compression, "none"))
+ compression[0] = '\0';
}
else
{
+ print_fatal_error(outfile, "Missing COMPRESSION value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1258,11 +1329,11 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
get_token(fp, temp, sizeof(temp), &linenum))
{
expand_variables(vars, token, temp, sizeof(token));
- set_variable(vars, attr, token);
+ set_variable(outfile, vars, attr, token);
}
else
{
- print_fatal_error("Missing DEFINE name and/or value on line %d.",
+ print_fatal_error(outfile, "Missing DEFINE name and/or value on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1282,7 +1353,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing IGNORE-ERRORS value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing IGNORE-ERRORS value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1295,7 +1366,17 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* Name of test...
*/
- get_token(fp, name, sizeof(name), &linenum);
+ get_token(fp, temp, sizeof(temp), &linenum);
+ expand_variables(vars, name, temp, sizeof(name));
+ }
+ else if (!_cups_strcasecmp(token, "PAUSE"))
+ {
+ /*
+ * Pause with a message...
+ */
+
+ get_token(fp, token, sizeof(token), &linenum);
+ pause_message(token);
}
else if (!strcmp(token, "REQUEST-ID"))
{
@@ -1312,7 +1393,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
request_id = (CUPS_RAND() % 1000) * 137 + 1;
else
{
- print_fatal_error("Bad REQUEST-ID value \"%s\" on line %d.", temp,
+ print_fatal_error(outfile, "Bad REQUEST-ID value \"%s\" on line %d.", temp,
linenum);
pass = 0;
goto test_exit;
@@ -1320,7 +1401,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing REQUEST-ID value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing REQUEST-ID value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1338,12 +1419,34 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing SKIP-IF-DEFINED value on line %d.",
+ print_fatal_error(outfile, "Missing SKIP-IF-DEFINED value on line %d.",
linenum);
pass = 0;
goto test_exit;
}
}
+ else if (!strcmp(token, "SKIP-IF-MISSING"))
+ {
+ /*
+ * SKIP-IF-MISSING filename
+ */
+
+ if (get_token(fp, temp, sizeof(temp), &linenum))
+ {
+ expand_variables(vars, token, temp, sizeof(token));
+ get_filename(testfile, filename, token, sizeof(filename));
+
+ if (access(filename, R_OK))
+ skip_test = 1;
+ }
+ else
+ {
+ print_fatal_error(outfile, "Missing SKIP-IF-MISSING filename on line %d.",
+ linenum);
+ pass = 0;
+ goto test_exit;
+ }
+ }
else if (!strcmp(token, "SKIP-IF-NOT-DEFINED"))
{
/*
@@ -1357,7 +1460,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing SKIP-IF-NOT-DEFINED value on line %d.",
+ print_fatal_error(outfile, "Missing SKIP-IF-NOT-DEFINED value on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1377,7 +1480,26 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing SKIP-PREVIOUS-ERROR value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing SKIP-PREVIOUS-ERROR value on line %d.", linenum);
+ pass = 0;
+ goto test_exit;
+ }
+
+ continue;
+ }
+ else if (!strcmp(token, "TEST-ID"))
+ {
+ /*
+ * TEST-ID "string"
+ */
+
+ if (get_token(fp, temp, sizeof(temp), &linenum))
+ {
+ expand_variables(vars, test_id, temp, sizeof(test_id));
+ }
+ else
+ {
+ print_fatal_error(outfile, "Missing TEST-ID value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1402,7 +1524,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
transfer = _CUPS_TRANSFER_LENGTH;
else
{
- print_fatal_error("Bad TRANSFER value \"%s\" on line %d.", temp,
+ print_fatal_error(outfile, "Bad TRANSFER value \"%s\" on line %d.", temp,
linenum);
pass = 0;
goto test_exit;
@@ -1410,7 +1532,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Missing TRANSFER value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing TRANSFER value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1433,14 +1555,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
version = 22;
else
{
- print_fatal_error("Bad VERSION \"%s\" on line %d.", temp, linenum);
+ print_fatal_error(outfile, "Bad VERSION \"%s\" on line %d.", temp, linenum);
pass = 0;
goto test_exit;
}
}
else
{
- print_fatal_error("Missing VERSION number on line %d.", linenum);
+ print_fatal_error(outfile, "Missing VERSION number on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1453,7 +1575,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, resource, sizeof(resource), &linenum))
{
- print_fatal_error("Missing RESOURCE path on line %d.", linenum);
+ print_fatal_error(outfile, "Missing RESOURCE path on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1466,7 +1588,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, temp, sizeof(temp), &linenum))
{
- print_fatal_error("Missing OPERATION code on line %d.", linenum);
+ print_fatal_error(outfile, "Missing OPERATION code on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1474,9 +1596,9 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
expand_variables(vars, token, temp, sizeof(token));
if ((op = ippOpValue(token)) == (ipp_op_t)-1 &&
- (op = strtol(token, NULL, 0)) == 0)
+ (op = (ipp_op_t)strtol(token, NULL, 0)) == 0)
{
- print_fatal_error("Bad OPERATION code \"%s\" on line %d.", token,
+ print_fatal_error(outfile, "Bad OPERATION code \"%s\" on line %d.", token,
linenum);
pass = 0;
goto test_exit;
@@ -1490,14 +1612,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing GROUP tag on line %d.", linenum);
+ print_fatal_error(outfile, "Missing GROUP tag on line %d.", linenum);
pass = 0;
goto test_exit;
}
if ((value = ippTagValue(token)) < 0)
{
- print_fatal_error("Bad GROUP tag \"%s\" on line %d.", token, linenum);
+ print_fatal_error(outfile, "Bad GROUP tag \"%s\" on line %d.", token, linenum);
pass = 0;
goto test_exit;
}
@@ -1517,7 +1639,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, temp, sizeof(temp), &linenum))
{
- print_fatal_error("Missing DELAY value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing DELAY value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1526,7 +1648,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if ((delay = _cupsStrScand(token, NULL, localeconv())) <= 0.0)
{
- print_fatal_error("Bad DELAY value \"%s\" on line %d.", token,
+ print_fatal_error(outfile, "Bad DELAY value \"%s\" on line %d.", token,
linenum);
pass = 0;
goto test_exit;
@@ -1536,7 +1658,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (Output == _CUPS_OUTPUT_TEST)
printf(" [%g second delay]\n", delay);
- usleep((int)(1000000.0 * delay));
+ usleep((useconds_t)(1000000.0 * delay));
}
}
else if (!_cups_strcasecmp(token, "ATTR"))
@@ -1547,14 +1669,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing ATTR value tag on line %d.", linenum);
+ print_fatal_error(outfile, "Missing ATTR value tag on line %d.", linenum);
pass = 0;
goto test_exit;
}
if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
{
- print_fatal_error("Bad ATTR value tag \"%s\" on line %d.", token,
+ print_fatal_error(outfile, "Bad ATTR value tag \"%s\" on line %d.", token,
linenum);
pass = 0;
goto test_exit;
@@ -1562,14 +1684,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, attr, sizeof(attr), &linenum))
{
- print_fatal_error("Missing ATTR name on line %d.", linenum);
+ print_fatal_error(outfile, "Missing ATTR name on line %d.", linenum);
pass = 0;
goto test_exit;
}
if (!get_token(fp, temp, sizeof(temp), &linenum))
{
- print_fatal_error("Missing ATTR value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing ATTR value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1583,30 +1705,76 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!_cups_strcasecmp(token, "true"))
attrptr = ippAddBoolean(request, group, attr, 1);
else
- attrptr = ippAddBoolean(request, group, attr, atoi(token));
+ attrptr = ippAddBoolean(request, group, attr, (char)atoi(token));
break;
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
if (!strchr(token, ','))
- attrptr = ippAddInteger(request, group, value, attr,
- strtol(token, &tokenptr, 0));
+ {
+ if (isdigit(token[0] & 255) || token[0] == '-')
+ attrptr = ippAddInteger(request, group, value, attr, (int)strtol(token, &tokenptr, 0));
+ else
+ {
+ tokenptr = token;
+ if ((i = ippEnumValue(attr, tokenptr)) >= 0)
+ {
+ attrptr = ippAddInteger(request, group, value, attr, i);
+ tokenptr += strlen(tokenptr);
+ }
+ }
+ }
else
{
int values[100], /* Values */
num_values = 1; /* Number of values */
- values[0] = strtol(token, &tokenptr, 10);
+ if (!isdigit(token[0] & 255) && token[0] != '-' && value == IPP_TAG_ENUM)
+ {
+ char *ptr; /* Pointer to next terminator */
+
+ if ((ptr = strchr(token, ',')) != NULL)
+ *ptr++ = '\0';
+ else
+ ptr = token + strlen(token);
+
+ if ((i = ippEnumValue(attr, token)) < 0)
+ tokenptr = NULL;
+ else
+ tokenptr = ptr;
+ }
+ else
+ i = (int)strtol(tokenptr, &tokenptr, 0);
+
+ values[0] = i;
+
while (tokenptr && *tokenptr &&
num_values < (int)(sizeof(values) / sizeof(values[0])))
{
if (*tokenptr == ',')
tokenptr ++;
- else if (!isdigit(*tokenptr & 255) && *tokenptr != '-')
- break;
- values[num_values] = strtol(tokenptr, &tokenptr, 0);
- num_values ++;
+ if (!isdigit(*tokenptr & 255) && *tokenptr != '-')
+ {
+ char *ptr; /* Pointer to next terminator */
+
+ if (value != IPP_TAG_ENUM)
+ break;
+
+ if ((ptr = strchr(tokenptr, ',')) != NULL)
+ *ptr++ = '\0';
+ else
+ ptr = tokenptr + strlen(tokenptr);
+
+ if ((i = ippEnumValue(attr, tokenptr)) < 0)
+ break;
+
+ tokenptr = ptr;
+ }
+ else
+ i = (int)strtol(tokenptr, &tokenptr, 0);
+
+ values[num_values ++] = i;
}
attrptr = ippAddIntegers(request, group, value, attr, num_values, values);
@@ -1614,7 +1782,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!tokenptr || *tokenptr)
{
- print_fatal_error("Bad %s value \"%s\" on line %d.",
+ print_fatal_error(outfile, "Bad %s value \"%s\" on line %d.",
ippTagString(value), token, linenum);
pass = 0;
goto test_exit;
@@ -1627,11 +1795,11 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
yres; /* Y resolution */
char *ptr; /* Pointer into value */
- xres = yres = strtol(token, (char **)&ptr, 10);
+ xres = yres = (int)strtol(token, (char **)&ptr, 10);
if (ptr > token && xres > 0)
{
if (*ptr == 'x')
- yres = strtol(ptr + 1, (char **)&ptr, 10);
+ yres = (int)strtol(ptr + 1, (char **)&ptr, 10);
}
if (ptr <= token || xres <= 0 || yres <= 0 || !ptr ||
@@ -1640,22 +1808,19 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
_cups_strcasecmp(ptr, "dpcm") &&
_cups_strcasecmp(ptr, "other")))
{
- print_fatal_error("Bad resolution value \"%s\" on line %d.",
+ print_fatal_error(outfile, "Bad resolution value \"%s\" on line %d.",
token, linenum);
pass = 0;
goto test_exit;
}
if (!_cups_strcasecmp(ptr, "dpi"))
- attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_INCH,
- xres, yres);
+ attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_INCH, xres, yres);
else if (!_cups_strcasecmp(ptr, "dpc") ||
!_cups_strcasecmp(ptr, "dpcm"))
- attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_CM,
- xres, yres);
+ attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_CM, xres, yres);
else
- attrptr = ippAddResolution(request, group, attr, (ipp_res_t)0,
- xres, yres);
+ attrptr = ippAddResolution(request, group, attr, (ipp_res_t)0, xres, yres);
}
break;
@@ -1674,7 +1839,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if ((num_vals & 1) || num_vals == 0)
{
- print_fatal_error("Bad rangeOfInteger value \"%s\" on line "
+ print_fatal_error(outfile, "Bad rangeOfInteger value \"%s\" on line "
"%d.", token, linenum);
pass = 0;
goto test_exit;
@@ -1688,7 +1853,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
case IPP_TAG_BEGIN_COLLECTION :
if (!strcmp(token, "{"))
{
- ipp_t *col = get_collection(vars, fp, &linenum);
+ ipp_t *col = get_collection(outfile, vars, fp, &linenum);
/* Collection value */
if (col)
@@ -1704,20 +1869,49 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Bad ATTR collection value on line %d.",
+ print_fatal_error(outfile, "Bad ATTR collection value on line %d.",
linenum);
pass = 0;
goto test_exit;
}
+
+ do
+ {
+ ipp_t *col; /* Collection value */
+ long pos = ftell(fp); /* Save position of file */
+
+ if (!get_token(fp, token, sizeof(token), &linenum))
+ break;
+
+ if (strcmp(token, ","))
+ {
+ fseek(fp, pos, SEEK_SET);
+ break;
+ }
+
+ if (!get_token(fp, token, sizeof(token), &linenum) || strcmp(token, "{"))
+ {
+ print_fatal_error(outfile, "Unexpected \"%s\" on line %d.", token, linenum);
+ pass = 0;
+ goto test_exit;
+ break;
+ }
+
+ if ((col = get_collection(outfile, vars, fp, &linenum)) == NULL)
+ break;
+
+ ippSetCollection(request, &attrptr, ippGetCount(attrptr), col);
+ lastcol = attrptr;
+ }
+ while (!strcmp(token, "{"));
break;
case IPP_TAG_STRING :
- attrptr = ippAddOctetString(request, group, attr, token,
- strlen(token));
+ attrptr = ippAddOctetString(request, group, attr, token, (int)strlen(token));
break;
default :
- print_fatal_error("Unsupported ATTR value tag %s on line %d.",
+ print_fatal_error(outfile, "Unsupported ATTR value tag %s on line %d.",
ippTagString(value), linenum);
pass = 0;
goto test_exit;
@@ -1750,9 +1944,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
for (ptr = strchr(token, ','); ptr; ptr = strchr(ptr, ','))
{
- *ptr++ = '\0';
- values[num_values] = ptr;
- num_values ++;
+ if (ptr > token && ptr[-1] == '\\')
+ _cups_strcpy(ptr - 1, ptr);
+ else
+ {
+ *ptr++ = '\0';
+ values[num_values] = ptr;
+ num_values ++;
+ }
}
attrptr = ippAddStrings(request, group, value, attr, num_values,
@@ -1763,7 +1962,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!attrptr)
{
- print_fatal_error("Unable to add attribute on line %d: %s", linenum,
+ print_fatal_error(outfile, "Unable to add attribute on line %d: %s", linenum,
cupsLastErrorString());
pass = 0;
goto test_exit;
@@ -1777,13 +1976,22 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, temp, sizeof(temp), &linenum))
{
- print_fatal_error("Missing FILE filename on line %d.", linenum);
+ print_fatal_error(outfile, "Missing FILE filename on line %d.", linenum);
pass = 0;
goto test_exit;
}
expand_variables(vars, token, temp, sizeof(token));
get_filename(testfile, filename, token, sizeof(filename));
+
+ if (access(filename, R_OK))
+ {
+ print_fatal_error(outfile, "Filename \"%s\" on line %d cannot be read.",
+ temp, linenum);
+ print_fatal_error(outfile, "Filename mapped to \"%s\".", filename);
+ pass = 0;
+ goto test_exit;
+ }
}
else if (!_cups_strcasecmp(token, "STATUS"))
{
@@ -1793,23 +2001,23 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (num_statuses >= (int)(sizeof(statuses) / sizeof(statuses[0])))
{
- print_fatal_error("Too many STATUS's on line %d.", linenum);
+ print_fatal_error(outfile, "Too many STATUS's on line %d.", linenum);
pass = 0;
goto test_exit;
}
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing STATUS code on line %d.", linenum);
+ print_fatal_error(outfile, "Missing STATUS code on line %d.", linenum);
pass = 0;
goto test_exit;
}
if ((statuses[num_statuses].status = ippErrorValue(token))
== (ipp_status_t)-1 &&
- (statuses[num_statuses].status = strtol(token, NULL, 0)) == 0)
+ (statuses[num_statuses].status = (ipp_status_t)strtol(token, NULL, 0)) == 0)
{
- print_fatal_error("Bad STATUS code \"%s\" on line %d.", token,
+ print_fatal_error(outfile, "Bad STATUS code \"%s\" on line %d.", token,
linenum);
pass = 0;
goto test_exit;
@@ -1826,22 +2034,24 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_status->repeat_match = 0;
last_status->repeat_no_match = 0;
}
- else if (!_cups_strcasecmp(token, "EXPECT"))
+ else if (!_cups_strcasecmp(token, "EXPECT") || !_cups_strcasecmp(token, "EXPECT-ALL"))
{
/*
* Expected attributes...
*/
+ int expect_all = !_cups_strcasecmp(token, "EXPECT-ALL");
+
if (num_expects >= (int)(sizeof(expects) / sizeof(expects[0])))
{
- print_fatal_error("Too many EXPECT's on line %d.", linenum);
+ print_fatal_error(outfile, "Too many EXPECT's on line %d.", linenum);
pass = 0;
goto test_exit;
}
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing EXPECT name on line %d.", linenum);
+ print_fatal_error(outfile, "Missing EXPECT name on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1851,6 +2061,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
memset(last_expect, 0, sizeof(_cups_expect_t));
last_expect->repeat_limit = 1000;
+ last_expect->expect_all = expect_all;
if (token[0] == '!')
{
@@ -1869,14 +2080,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing COUNT number on line %d.", linenum);
+ print_fatal_error(outfile, "Missing COUNT number on line %d.", linenum);
pass = 0;
goto test_exit;
}
if ((i = atoi(token)) <= 0)
{
- print_fatal_error("Bad COUNT \"%s\" on line %d.", token, linenum);
+ print_fatal_error(outfile, "Bad COUNT \"%s\" on line %d.", token, linenum);
pass = 0;
goto test_exit;
}
@@ -1885,7 +2096,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->count = i;
else
{
- print_fatal_error("COUNT without a preceding EXPECT on line %d.",
+ print_fatal_error(outfile, "COUNT without a preceding EXPECT on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1895,7 +2106,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing DEFINE-MATCH variable on line %d.",
+ print_fatal_error(outfile, "Missing DEFINE-MATCH variable on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1907,7 +2118,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_status->define_match = strdup(token);
else
{
- print_fatal_error("DEFINE-MATCH without a preceding EXPECT or STATUS "
+ print_fatal_error(outfile, "DEFINE-MATCH without a preceding EXPECT or STATUS "
"on line %d.", linenum);
pass = 0;
goto test_exit;
@@ -1917,7 +2128,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing DEFINE-NO-MATCH variable on line %d.",
+ print_fatal_error(outfile, "Missing DEFINE-NO-MATCH variable on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1929,7 +2140,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_status->define_no_match = strdup(token);
else
{
- print_fatal_error("DEFINE-NO-MATCH without a preceding EXPECT or "
+ print_fatal_error(outfile, "DEFINE-NO-MATCH without a preceding EXPECT or "
"STATUS on line %d.", linenum);
pass = 0;
goto test_exit;
@@ -1939,7 +2150,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing DEFINE-VALUE variable on line %d.",
+ print_fatal_error(outfile, "Missing DEFINE-VALUE variable on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1949,7 +2160,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->define_value = strdup(token);
else
{
- print_fatal_error("DEFINE-VALUE without a preceding EXPECT on "
+ print_fatal_error(outfile, "DEFINE-VALUE without a preceding EXPECT on "
"line %d.", linenum);
pass = 0;
goto test_exit;
@@ -1959,7 +2170,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing OF-TYPE value tag(s) on line %d.",
+ print_fatal_error(outfile, "Missing OF-TYPE value tag(s) on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1969,7 +2180,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->of_type = strdup(token);
else
{
- print_fatal_error("OF-TYPE without a preceding EXPECT on line %d.",
+ print_fatal_error(outfile, "OF-TYPE without a preceding EXPECT on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -1982,7 +2193,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing IN-GROUP group tag on line %d.", linenum);
+ print_fatal_error(outfile, "Missing IN-GROUP group tag on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -1994,7 +2205,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->in_group = in_group;
else
{
- print_fatal_error("IN-GROUP without a preceding EXPECT on line %d.",
+ print_fatal_error(outfile, "IN-GROUP without a preceding EXPECT on line %d.",
linenum);
pass = 0;
goto test_exit;
@@ -2004,13 +2215,13 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing REPEAT-LIMIT value on line %d.", linenum);
+ print_fatal_error(outfile, "Missing REPEAT-LIMIT value on line %d.", linenum);
pass = 0;
goto test_exit;
}
else if (atoi(token) <= 0)
{
- print_fatal_error("Bad REPEAT-LIMIT value on line %d.", linenum);
+ print_fatal_error(outfile, "Bad REPEAT-LIMIT value on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -2021,7 +2232,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->repeat_limit = atoi(token);
else
{
- print_fatal_error("REPEAT-LIMIT without a preceding EXPECT or STATUS "
+ print_fatal_error(outfile, "REPEAT-LIMIT without a preceding EXPECT or STATUS "
"on line %d.", linenum);
pass = 0;
goto test_exit;
@@ -2035,7 +2246,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->repeat_match = 1;
else
{
- print_fatal_error("REPEAT-MATCH without a preceding EXPECT or STATUS "
+ print_fatal_error(outfile, "REPEAT-MATCH without a preceding EXPECT or STATUS "
"on line %d.", linenum);
pass = 0;
goto test_exit;
@@ -2049,7 +2260,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->repeat_no_match = 1;
else
{
- print_fatal_error("REPEAT-NO-MATCH without a preceding EXPECT or "
+ print_fatal_error(outfile, "REPEAT-NO-MATCH without a preceding EXPECT or "
"STATUS on ine %d.", linenum);
pass = 0;
goto test_exit;
@@ -2059,7 +2270,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing SAME-COUNT-AS name on line %d.", linenum);
+ print_fatal_error(outfile, "Missing SAME-COUNT-AS name on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -2068,7 +2279,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_expect->same_count_as = strdup(token);
else
{
- print_fatal_error("SAME-COUNT-AS without a preceding EXPECT on line "
+ print_fatal_error(outfile, "SAME-COUNT-AS without a preceding EXPECT on line "
"%d.", linenum);
pass = 0;
goto test_exit;
@@ -2078,7 +2289,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing IF-DEFINED name on line %d.", linenum);
+ print_fatal_error(outfile, "Missing IF-DEFINED name on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -2089,7 +2300,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_status->if_defined = strdup(token);
else
{
- print_fatal_error("IF-DEFINED without a preceding EXPECT or STATUS "
+ print_fatal_error(outfile, "IF-DEFINED without a preceding EXPECT or STATUS "
"on line %d.", linenum);
pass = 0;
goto test_exit;
@@ -2099,7 +2310,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing IF-NOT-DEFINED name on line %d.", linenum);
+ print_fatal_error(outfile, "Missing IF-NOT-DEFINED name on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -2110,21 +2321,40 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
last_status->if_not_defined = strdup(token);
else
{
- print_fatal_error("IF-NOT-DEFINED without a preceding EXPECT or STATUS "
+ print_fatal_error(outfile, "IF-NOT-DEFINED without a preceding EXPECT or STATUS "
"on line %d.", linenum);
pass = 0;
goto test_exit;
}
}
else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") ||
+ !_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") ||
+ !_cups_strcasecmp(token, "WITH-ALL-RESOURCES") ||
+ !_cups_strcasecmp(token, "WITH-ALL-SCHEMES") ||
+ !_cups_strcasecmp(token, "WITH-HOSTNAME") ||
+ !_cups_strcasecmp(token, "WITH-RESOURCE") ||
+ !_cups_strcasecmp(token, "WITH-SCHEME") ||
!_cups_strcasecmp(token, "WITH-VALUE"))
{
- if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") && last_expect)
- last_expect->with_flags = _CUPS_WITH_ALL;
+ if (last_expect)
+ {
+ if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") ||
+ !_cups_strcasecmp(token, "WITH-HOSTNAME"))
+ last_expect->with_flags = _CUPS_WITH_HOSTNAME;
+ else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") ||
+ !_cups_strcasecmp(token, "WITH-RESOURCE"))
+ last_expect->with_flags = _CUPS_WITH_RESOURCE;
+ else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") ||
+ !_cups_strcasecmp(token, "WITH-SCHEME"))
+ last_expect->with_flags = _CUPS_WITH_SCHEME;
+
+ if (!_cups_strncasecmp(token, "WITH-ALL-", 9))
+ last_expect->with_flags |= _CUPS_WITH_ALL;
+ }
if (!get_token(fp, temp, sizeof(temp), &linenum))
{
- print_fatal_error("Missing %s value on line %d.", token, linenum);
+ print_fatal_error(outfile, "Missing %s value on line %d.", token, linenum);
pass = 0;
goto test_exit;
}
@@ -2145,11 +2375,11 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* WITH-VALUE is a POSIX extended regular expression.
*/
- last_expect->with_value = calloc(1, tokenptr - token);
+ last_expect->with_value = calloc(1, (size_t)(tokenptr - token));
last_expect->with_flags |= _CUPS_WITH_REGEX;
if (last_expect->with_value)
- memcpy(last_expect->with_value, token + 1, tokenptr - token - 1);
+ memcpy(last_expect->with_value, token + 1, (size_t)(tokenptr - token - 1));
}
else
{
@@ -2157,13 +2387,55 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* WITH-VALUE is a literal value...
*/
+ char *ptr; /* Pointer into value */
+
+ for (ptr = token; *ptr; ptr ++)
+ {
+ if (*ptr == '\\' && ptr[1])
+ {
+ /*
+ * Remove \ from \foo...
+ */
+
+ _cups_strcpy(ptr, ptr + 1);
+ }
+ }
+
last_expect->with_value = strdup(token);
last_expect->with_flags |= _CUPS_WITH_LITERAL;
}
}
else
{
- print_fatal_error("%s without a preceding EXPECT on line %d.", token,
+ print_fatal_error(outfile, "%s without a preceding EXPECT on line %d.", token,
+ linenum);
+ pass = 0;
+ goto test_exit;
+ }
+ }
+ else if (!_cups_strcasecmp(token, "WITH-VALUE-FROM"))
+ {
+ if (!get_token(fp, temp, sizeof(temp), &linenum))
+ {
+ print_fatal_error(outfile, "Missing %s value on line %d.", token, linenum);
+ pass = 0;
+ goto test_exit;
+ }
+
+ if (last_expect)
+ {
+ /*
+ * Expand any variables in the value and then save it.
+ */
+
+ expand_variables(vars, token, temp, sizeof(token));
+
+ last_expect->with_value_from = strdup(token);
+ last_expect->with_flags = _CUPS_WITH_LITERAL;
+ }
+ else
+ {
+ print_fatal_error(outfile, "%s without a preceding EXPECT on line %d.", token,
linenum);
pass = 0;
goto test_exit;
@@ -2177,14 +2449,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (num_displayed >= (int)(sizeof(displayed) / sizeof(displayed[0])))
{
- print_fatal_error("Too many DISPLAY's on line %d", linenum);
+ print_fatal_error(outfile, "Too many DISPLAY's on line %d", linenum);
pass = 0;
goto test_exit;
}
if (!get_token(fp, token, sizeof(token), &linenum))
{
- print_fatal_error("Missing DISPLAY name on line %d.", linenum);
+ print_fatal_error(outfile, "Missing DISPLAY name on line %d.", linenum);
pass = 0;
goto test_exit;
}
@@ -2194,7 +2466,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Unexpected token %s seen on line %d.", token,
+ print_fatal_error(outfile, "Unexpected token %s seen on line %d.", token,
linenum);
pass = 0;
goto test_exit;
@@ -2207,40 +2479,54 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
TestCount ++;
- request->request.op.version[0] = version / 10;
- request->request.op.version[1] = version % 10;
- request->request.op.operation_id = op;
- request->request.op.request_id = request_id;
+ ippSetVersion(request, version / 10, version % 10);
+ ippSetOperation(request, op);
+ ippSetRequestId(request, request_id);
if (Output == _CUPS_OUTPUT_PLIST)
{
- puts("<dict>");
- puts("<key>Name</key>");
- print_xml_string("string", name);
- puts("<key>Operation</key>");
- print_xml_string("string", ippOpString(op));
- puts("<key>RequestAttributes</key>");
- puts("<array>");
+ fputs("<dict>\n", outfile);
+ fputs("<key>Name</key>\n", outfile);
+ print_xml_string(outfile, "string", name);
+ if (file_id[0])
+ {
+ fputs("<key>FileId</key>\n", outfile);
+ print_xml_string(outfile, "string", file_id);
+ }
+ if (test_id[0])
+ {
+ fputs("<key>TestId</key>\n", outfile);
+ print_xml_string(outfile, "string", test_id);
+ }
+ fputs("<key>Version</key>\n", outfile);
+ fprintf(outfile, "<string>%d.%d</string>\n", version / 10, version % 10);
+ fputs("<key>Operation</key>\n", outfile);
+ print_xml_string(outfile, "string", ippOpString(op));
+ fputs("<key>RequestId</key>\n", outfile);
+ fprintf(outfile, "<integer>%d</integer>\n", request_id);
+ fputs("<key>RequestAttributes</key>\n", outfile);
+ fputs("<array>\n", outfile);
if (request->attrs)
{
- puts("<dict>");
+ fputs("<dict>\n", outfile);
for (attrptr = request->attrs,
group = attrptr ? attrptr->group_tag : IPP_TAG_ZERO;
attrptr;
attrptr = attrptr->next)
- print_attr(attrptr, &group);
- puts("</dict>");
+ print_attr(outfile, Output, attrptr, &group);
+ fputs("</dict>\n", outfile);
}
- puts("</array>");
+ fputs("</array>\n", outfile);
}
- else if (Output == _CUPS_OUTPUT_TEST)
+
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
{
if (Verbosity)
{
printf(" %s:\n", ippOpString(op));
for (attrptr = request->attrs; attrptr; attrptr = attrptr->next)
- print_attr(attrptr, NULL);
+ print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL);
}
printf(" %-68.68s [", name);
@@ -2256,19 +2542,23 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (Output == _CUPS_OUTPUT_PLIST)
{
- puts("<key>Successful</key>");
- puts("<true />");
- puts("<key>StatusCode</key>");
- print_xml_string("string", "skip");
- puts("<key>ResponseAttributes</key>");
- puts("<dict />");
+ fputs("<key>Successful</key>\n", outfile);
+ fputs("<true />\n", outfile);
+ fputs("<key>Skipped</key>\n", outfile);
+ fputs("<true />\n", outfile);
+ fputs("<key>StatusCode</key>\n", outfile);
+ print_xml_string(outfile, "string", "skip");
+ fputs("<key>ResponseAttributes</key>\n", outfile);
+ fputs("<dict />\n", outfile);
}
- else if (Output == _CUPS_OUTPUT_TEST)
+
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
puts("SKIP]");
goto skip_error;
}
+ PasswordTries = 0;
repeat_count = 0;
repeat_interval = 1;
repeat_prev = 1;
@@ -2277,7 +2567,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
repeat_count ++;
- status = HTTP_OK;
+ status = HTTP_STATUS_OK;
if (transfer == _CUPS_TRANSFER_CHUNKED ||
(transfer == _CUPS_TRANSFER_AUTO && filename[0]))
@@ -2303,7 +2593,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
*/
while ((bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0)
- length += bytes;
+ length += (size_t)bytes;
cupsFileClose(reqfile);
}
@@ -2317,22 +2607,25 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
repeat_test = 0;
prev_pass = 1;
- if (status != HTTP_ERROR)
+ if (status != HTTP_STATUS_ERROR)
{
while (!response && !Cancel && prev_pass)
{
status = cupsSendRequest(http, request, resource, length);
- if (!Cancel && status == HTTP_CONTINUE &&
+#ifdef HAVE_LIBZ
+ if (compression[0])
+ httpSetField(http, HTTP_FIELD_CONTENT_ENCODING, compression);
+#endif /* HAVE_LIBZ */
+
+ if (!Cancel && status == HTTP_STATUS_CONTINUE &&
request->state == IPP_DATA && filename[0])
{
if ((reqfile = cupsFileOpen(filename, "r")) != NULL)
{
while (!Cancel &&
- (bytes = cupsFileRead(reqfile, buffer,
- sizeof(buffer))) > 0)
- if ((status = cupsWriteRequestData(http, buffer,
- bytes)) != HTTP_CONTINUE)
+ (bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0)
+ if ((status = cupsWriteRequestData(http, buffer, (size_t)bytes)) != HTTP_STATUS_CONTINUE)
break;
cupsFileClose(reqfile);
@@ -2343,7 +2636,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
strerror(errno));
_cupsSetError(IPP_INTERNAL_ERROR, buffer, 0);
- status = HTTP_ERROR;
+ status = HTTP_STATUS_ERROR;
}
}
@@ -2351,13 +2644,13 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
* Get the server's response...
*/
- if (!Cancel && status != HTTP_ERROR)
+ if (!Cancel && status != HTTP_STATUS_ERROR)
{
response = cupsGetResponse(http, resource);
status = httpGetStatus(http);
}
- if (!Cancel && status == HTTP_ERROR && http->error != EINVAL &&
+ if (!Cancel && status == HTTP_STATUS_ERROR && http->error != EINVAL &&
#ifdef WIN32
http->error != WSAETIMEDOUT)
#else
@@ -2367,20 +2660,24 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (httpReconnect(http))
prev_pass = 0;
}
- else if (status == HTTP_ERROR)
+ else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED)
{
prev_pass = 0;
break;
}
- else if (status != HTTP_OK)
+ else if (status != HTTP_STATUS_OK)
{
httpFlush(http);
+
+ if (status == HTTP_STATUS_UNAUTHORIZED)
+ continue;
+
break;
}
}
}
- if (!Cancel && status == HTTP_ERROR && http->error != EINVAL &&
+ if (!Cancel && status == HTTP_STATUS_ERROR && http->error != EINVAL &&
#ifdef WIN32
http->error != WSAETIMEDOUT)
#else
@@ -2390,14 +2687,14 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (httpReconnect(http))
prev_pass = 0;
}
- else if (status == HTTP_ERROR)
+ else if (status == HTTP_STATUS_ERROR)
{
if (!Cancel)
httpReconnect(http);
prev_pass = 0;
}
- else if (status != HTTP_OK)
+ else if (status != HTTP_STATUS_OK)
{
httpFlush(http);
prev_pass = 0;
@@ -2433,18 +2730,18 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
IPP_TAG_INTEGER)) != NULL)
{
snprintf(temp, sizeof(temp), "%d", attrptr->values[0].integer);
- set_variable(vars, "job-id", temp);
+ set_variable(outfile, vars, "job-id", temp);
}
if ((attrptr = ippFindAttribute(response, "job-uri",
IPP_TAG_URI)) != NULL)
- set_variable(vars, "job-uri", attrptr->values[0].string.text);
+ set_variable(outfile, vars, "job-uri", attrptr->values[0].string.text);
if ((attrptr = ippFindAttribute(response, "notify-subscription-id",
IPP_TAG_INTEGER)) != NULL)
{
snprintf(temp, sizeof(temp), "%d", attrptr->values[0].integer);
- set_variable(vars, "notify-subscription-id", temp);
+ set_variable(outfile, vars, "notify-subscription-id", temp);
}
/*
@@ -2584,7 +2881,6 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
int out_of_order = 0; /* Are attribute groups out-of-order? */
cupsArrayClear(a);
-
switch (attrptr->group_tag)
{
case IPP_TAG_ZERO :
@@ -2627,7 +2923,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
group = attrptr->group_tag;
}
- validate_attr(errors, attrptr);
+ validate_attr(outfile, errors, attrptr);
if (attrptr->name)
{
@@ -2663,7 +2959,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
repeat_test = 1;
if (statuses[i].define_match)
- set_variable(vars, statuses[i].define_match, "1");
+ set_variable(outfile, vars, statuses[i].define_match, "1");
break;
}
@@ -2675,7 +2971,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (statuses[i].define_no_match)
{
- set_variable(vars, statuses[i].define_no_match, "1");
+ set_variable(outfile, vars, statuses[i].define_no_match, "1");
break;
}
}
@@ -2714,137 +3010,210 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
get_variable(vars, expect->if_not_defined))
continue;
- found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
+ found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
- if ((found && expect->not_expect) ||
- (!found && !(expect->not_expect || expect->optional)) ||
- (found && !expect_matches(expect, found->value_tag)) ||
- (found && expect->in_group &&
- found->group_tag != expect->in_group))
- {
- if (expect->define_no_match)
- set_variable(vars, expect->define_no_match, "1");
- else if (!expect->define_match && !expect->define_value)
+ do
+ {
+ if ((found && expect->not_expect) ||
+ (!found && !(expect->not_expect || expect->optional)) ||
+ (found && !expect_matches(expect, found->value_tag)) ||
+ (found && expect->in_group &&
+ found->group_tag != expect->in_group))
{
- if (found && expect->not_expect)
- add_stringf(errors, "NOT EXPECTED: %s", expect->name);
- else if (!found && !(expect->not_expect || expect->optional))
- add_stringf(errors, "EXPECTED: %s", expect->name);
- else if (found)
+ if (expect->define_no_match)
+ set_variable(outfile, vars, expect->define_no_match, "1");
+ else if (!expect->define_match && !expect->define_value)
{
- if (!expect_matches(expect, found->value_tag))
- add_stringf(errors, "EXPECTED: %s OF-TYPE %s (got %s)",
- expect->name, expect->of_type,
- ippTagString(found->value_tag));
-
- if (expect->in_group && found->group_tag != expect->in_group)
- add_stringf(errors, "EXPECTED: %s IN-GROUP %s (got %s).",
- expect->name, ippTagString(expect->in_group),
- ippTagString(found->group_tag));
- }
- }
+ if (found && expect->not_expect)
+ add_stringf(errors, "NOT EXPECTED: %s", expect->name);
+ else if (!found && !(expect->not_expect || expect->optional))
+ add_stringf(errors, "EXPECTED: %s", expect->name);
+ else if (found)
+ {
+ if (!expect_matches(expect, found->value_tag))
+ add_stringf(errors, "EXPECTED: %s OF-TYPE %s (got %s)",
+ expect->name, expect->of_type,
+ ippTagString(found->value_tag));
+
+ if (expect->in_group && found->group_tag != expect->in_group)
+ add_stringf(errors, "EXPECTED: %s IN-GROUP %s (got %s).",
+ expect->name, ippTagString(expect->in_group),
+ ippTagString(found->group_tag));
+ }
+ }
- if (expect->repeat_no_match &&
- repeat_count < expect->repeat_limit)
- repeat_test = 1;
+ if (expect->repeat_no_match &&
+ repeat_count < expect->repeat_limit)
+ repeat_test = 1;
- continue;
- }
+ break;
+ }
- if (found)
- ippAttributeString(found, buffer, sizeof(buffer));
+ if (found)
+ ippAttributeString(found, buffer, sizeof(buffer));
- if (found &&
- !with_value(NULL, expect->with_value, expect->with_flags, found,
- buffer, sizeof(buffer)))
- {
- if (expect->define_no_match)
- set_variable(vars, expect->define_no_match, "1");
- else if (!expect->define_match && !expect->define_value &&
- !expect->repeat_match && !expect->repeat_no_match)
+ if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer)))
{
- if (expect->with_flags & _CUPS_WITH_REGEX)
- add_stringf(errors, "EXPECTED: %s %s /%s/",
- expect->name,
- (expect->with_flags & _CUPS_WITH_ALL) ?
- "WITH-ALL-VALUES" : "WITH-VALUE",
- expect->with_value);
- else
- add_stringf(errors, "EXPECTED: %s %s \"%s\"",
- expect->name,
- (expect->with_flags & _CUPS_WITH_ALL) ?
- "WITH-ALL-VALUES" : "WITH-VALUE",
- expect->with_value);
-
- with_value(errors, expect->with_value, expect->with_flags, found,
- buffer, sizeof(buffer));
- }
+ if (expect->define_no_match)
+ set_variable(outfile, vars, expect->define_no_match, "1");
+ else if (!expect->define_match && !expect->define_value && !expect->repeat_match && !expect->repeat_no_match)
+ {
+ add_stringf(errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from);
- if (expect->repeat_no_match &&
- repeat_count < expect->repeat_limit)
- repeat_test = 1;
+ with_value_from(errors, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer));
+ }
- continue;
- }
+ if (expect->repeat_no_match && repeat_count < expect->repeat_limit)
+ repeat_test = 1;
- if (found && expect->count > 0 &&
- found->num_values != expect->count)
- {
- if (expect->define_no_match)
- set_variable(vars, expect->define_no_match, "1");
- else if (!expect->define_match && !expect->define_value)
- {
- add_stringf(errors, "EXPECTED: %s COUNT %d (got %d)", expect->name,
- expect->count, found->num_values);
+ break;
}
+ else if (found && !with_value(outfile, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)))
+ {
+ if (expect->define_no_match)
+ set_variable(outfile, vars, expect->define_no_match, "1");
+ else if (!expect->define_match && !expect->define_value &&
+ !expect->repeat_match && !expect->repeat_no_match)
+ {
+ if (expect->with_flags & _CUPS_WITH_REGEX)
+ add_stringf(errors, "EXPECTED: %s %s /%s/",
+ expect->name,
+ (expect->with_flags & _CUPS_WITH_ALL) ?
+ "WITH-ALL-VALUES" : "WITH-VALUE",
+ expect->with_value);
+ else
+ add_stringf(errors, "EXPECTED: %s %s \"%s\"",
+ expect->name,
+ (expect->with_flags & _CUPS_WITH_ALL) ?
+ "WITH-ALL-VALUES" : "WITH-VALUE",
+ expect->with_value);
+
+ with_value(outfile, errors, expect->with_value, expect->with_flags, found,
+ buffer, sizeof(buffer));
+ }
- if (expect->repeat_no_match &&
- repeat_count < expect->repeat_limit)
- repeat_test = 1;
-
- continue;
- }
+ if (expect->repeat_no_match &&
+ repeat_count < expect->repeat_limit)
+ repeat_test = 1;
- if (found && expect->same_count_as)
- {
- attrptr = ippFindAttribute(response, expect->same_count_as,
- IPP_TAG_ZERO);
+ break;
+ }
- if (!attrptr || attrptr->num_values != found->num_values)
+ if (found && expect->count > 0 &&
+ found->num_values != expect->count)
{
if (expect->define_no_match)
- set_variable(vars, expect->define_no_match, "1");
+ set_variable(outfile, vars, expect->define_no_match, "1");
else if (!expect->define_match && !expect->define_value)
{
- if (!attrptr)
- add_stringf(errors,
- "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
- "(not returned)", expect->name,
- found->num_values, expect->same_count_as);
- else if (attrptr->num_values != found->num_values)
- add_stringf(errors,
- "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
- "(%d values)", expect->name, found->num_values,
- expect->same_count_as, attrptr->num_values);
+ add_stringf(errors, "EXPECTED: %s COUNT %d (got %d)", expect->name,
+ expect->count, found->num_values);
}
if (expect->repeat_no_match &&
- repeat_count < expect->repeat_limit)
+ repeat_count < expect->repeat_limit)
repeat_test = 1;
- continue;
+ break;
}
- }
- if (found && expect->define_match)
- set_variable(vars, expect->define_match, "1");
+ if (found && expect->same_count_as)
+ {
+ attrptr = ippFindAttribute(response, expect->same_count_as,
+ IPP_TAG_ZERO);
+
+ if (!attrptr || attrptr->num_values != found->num_values)
+ {
+ if (expect->define_no_match)
+ set_variable(outfile, vars, expect->define_no_match, "1");
+ else if (!expect->define_match && !expect->define_value)
+ {
+ if (!attrptr)
+ add_stringf(errors,
+ "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
+ "(not returned)", expect->name,
+ found->num_values, expect->same_count_as);
+ else if (attrptr->num_values != found->num_values)
+ add_stringf(errors,
+ "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
+ "(%d values)", expect->name, found->num_values,
+ expect->same_count_as, attrptr->num_values);
+ }
+
+ if (expect->repeat_no_match &&
+ repeat_count < expect->repeat_limit)
+ repeat_test = 1;
+
+ break;
+ }
+ }
+
+ if (found && expect->define_match)
+ set_variable(outfile, vars, expect->define_match, "1");
+
+ if (found && expect->define_value)
+ {
+ if (!expect->with_value)
+ {
+ int last = ippGetCount(found) - 1;
+ /* Last element in attribute */
+
+ switch (ippGetValueTag(found))
+ {
+ case IPP_TAG_ENUM :
+ case IPP_TAG_INTEGER :
+ snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last));
+ break;
+
+ case IPP_TAG_BOOLEAN :
+ if (ippGetBoolean(found, last))
+ strlcpy(buffer, "true", sizeof(buffer));
+ else
+ strlcpy(buffer, "false", sizeof(buffer));
+ break;
+
+ case IPP_TAG_RESOLUTION :
+ {
+ int xres, /* Horizontal resolution */
+ yres; /* Vertical resolution */
+ ipp_res_t units; /* Resolution units */
+
+ xres = ippGetResolution(found, last, &yres, &units);
+
+ if (xres == yres)
+ snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ else
+ snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ }
+ break;
+
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ strlcpy(buffer, ippGetString(found, last, NULL), sizeof(buffer));
+ break;
+
+ default :
+ ippAttributeString(found, buffer, sizeof(buffer));
+ break;
+ }
+ }
- if (found && expect->define_value)
- set_variable(vars, expect->define_value, buffer);
+ set_variable(outfile, vars, expect->define_value, buffer);
+ }
- if (found && expect->repeat_match &&
- repeat_count < expect->repeat_limit)
- repeat_test = 1;
+ if (found && expect->repeat_match &&
+ repeat_count < expect->repeat_limit)
+ repeat_test = 1;
+ }
+ while (expect->expect_all && (found = ippFindNextAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL);
}
}
@@ -2855,16 +3224,35 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (repeat_test)
{
- if (Output == _CUPS_OUTPUT_TEST)
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
{
printf("%04d]\n", repeat_count);
fflush(stdout);
+
+ if (num_displayed > 0)
+ {
+ for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
+ {
+ const char *attrname = ippGetName(attrptr);
+ if (attrname)
+ {
+ for (i = 0; i < num_displayed; i ++)
+ {
+ if (!strcmp(displayed[i], attrname))
+ {
+ print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL);
+ break;
+ }
+ }
+ }
+ }
+ }
}
- sleep(repeat_interval);
+ sleep((unsigned)repeat_interval);
repeat_interval = _cupsNextDelay(repeat_interval, &repeat_prev);
- if (Output == _CUPS_OUTPUT_TEST)
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
{
printf(" %-68.68s [", name);
fflush(stdout);
@@ -2887,22 +3275,23 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (Output == _CUPS_OUTPUT_PLIST)
{
- puts("<key>Successful</key>");
- puts(prev_pass ? "<true />" : "<false />");
- puts("<key>StatusCode</key>");
- print_xml_string("string", ippErrorString(cupsLastError()));
- puts("<key>ResponseAttributes</key>");
- puts("<array>");
- puts("<dict>");
+ fputs("<key>Successful</key>\n", outfile);
+ fputs(prev_pass ? "<true />\n" : "<false />\n", outfile);
+ fputs("<key>StatusCode</key>\n", outfile);
+ print_xml_string(outfile, "string", ippErrorString(cupsLastError()));
+ fputs("<key>ResponseAttributes</key>\n", outfile);
+ fputs("<array>\n", outfile);
+ fputs("<dict>\n", outfile);
for (attrptr = response ? response->attrs : NULL,
group = attrptr ? attrptr->group_tag : IPP_TAG_ZERO;
attrptr;
attrptr = attrptr->next)
- print_attr(attrptr, &group);
- puts("</dict>");
- puts("</array>");
+ print_attr(outfile, Output, attrptr, &group);
+ fputs("</dict>\n", outfile);
+ fputs("</array>\n", outfile);
}
- else if (Output == _CUPS_OUTPUT_TEST)
+
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
{
puts(prev_pass ? "PASS]" : "FAIL]");
@@ -2913,16 +3302,16 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
printf(" status-code = %s (%s)\n", ippErrorString(cupsLastError()),
cupsLastErrorString());
- if (response)
+ if (Verbosity && response)
{
for (attrptr = response->attrs;
attrptr != NULL;
attrptr = attrptr->next)
- print_attr(attrptr, NULL);
+ print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL);
}
}
}
- else if (!prev_pass)
+ else if (!prev_pass && Output != _CUPS_OUTPUT_QUIET)
fprintf(stderr, "%s\n", cupsLastErrorString());
if (prev_pass && Output >= _CUPS_OUTPUT_LIST && !Verbosity &&
@@ -2946,9 +3335,9 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
if (Output == _CUPS_OUTPUT_CSV)
- print_csv(NULL, num_displayed, displayed, widths);
+ print_csv(outfile, NULL, num_displayed, displayed, widths);
else
- print_line(NULL, num_displayed, displayed, widths);
+ print_line(outfile, NULL, num_displayed, displayed, widths);
attrptr = response->attrs;
@@ -2960,9 +3349,9 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
if (attrptr)
{
if (Output == _CUPS_OUTPUT_CSV)
- print_csv(attrptr, num_displayed, displayed, widths);
+ print_csv(outfile, attrptr, num_displayed, displayed, widths);
else
- print_line(attrptr, num_displayed, displayed, widths);
+ print_line(outfile, attrptr, num_displayed, displayed, widths);
while (attrptr && attrptr->group_tag > IPP_TAG_OPERATION)
attrptr = attrptr->next;
@@ -2973,17 +3362,18 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (Output == _CUPS_OUTPUT_PLIST)
{
- puts("<key>Errors</key>");
- puts("<array>");
+ fputs("<key>Errors</key>\n", outfile);
+ fputs("<array>\n", outfile);
for (error = (char *)cupsArrayFirst(errors);
error;
error = (char *)cupsArrayNext(errors))
- print_xml_string("string", error);
+ print_xml_string(outfile, "string", error);
- puts("</array>");
+ fputs("</array>\n", outfile);
}
- else
+
+ if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
{
for (error = (char *)cupsArrayFirst(errors);
error;
@@ -2992,8 +3382,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
}
}
- if (num_displayed > 0 && !Verbosity && response &&
- Output == _CUPS_OUTPUT_TEST)
+ if (num_displayed > 0 && !Verbosity && response && (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout)))
{
for (attrptr = response->attrs;
attrptr != NULL;
@@ -3005,7 +3394,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
{
if (!strcmp(displayed[i], attrptr->name))
{
- print_attr(attrptr, NULL);
+ print_attr(outfile, Output, attrptr, NULL);
break;
}
}
@@ -3016,7 +3405,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */
skip_error:
if (Output == _CUPS_OUTPUT_PLIST)
- puts("</dict>");
+ fputs("</dict>\n", outfile);
fflush(stdout);
@@ -3164,16 +3553,28 @@ expand_variables(_cups_vars_t *vars, /* I - Variables */
value = getenv(temp);
src += tempptr - temp + 5;
}
- else if (vars)
+ else
{
- strlcpy(temp, src + 1, sizeof(temp));
+ if (src[1] == '{')
+ {
+ src += 2;
+ strlcpy(temp, src, sizeof(temp));
+ if ((tempptr = strchr(temp, '}')) != NULL)
+ *tempptr = '\0';
+ else
+ tempptr = temp + strlen(temp);
+ }
+ else
+ {
+ strlcpy(temp, src + 1, sizeof(temp));
- for (tempptr = temp; *tempptr; tempptr ++)
- if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_')
- break;
+ for (tempptr = temp; *tempptr; tempptr ++)
+ if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_')
+ break;
- if (*tempptr)
- *tempptr = '\0';
+ if (*tempptr)
+ *tempptr = '\0';
+ }
if (!strcmp(temp, "uri"))
value = vars->uri;
@@ -3199,15 +3600,10 @@ expand_variables(_cups_vars_t *vars, /* I - Variables */
src += tempptr - temp + 1;
}
- else
- {
- value = "$";
- src ++;
- }
if (value)
{
- strlcpy(dstptr, value, dstend - dstptr + 1);
+ strlcpy(dstptr, value, (size_t)(dstend - dstptr + 1));
dstptr += strlen(dstptr);
}
}
@@ -3287,7 +3683,8 @@ expect_matches(
*/
static ipp_t * /* O - Collection value */
-get_collection(_cups_vars_t *vars, /* I - Variables */
+get_collection(FILE *outfile, /* I - Output file */
+ _cups_vars_t *vars, /* I - Variables */
FILE *fp, /* I - File to read from */
int *linenum) /* IO - Line number */
{
@@ -3309,43 +3706,11 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
* Another collection value
*/
- ipp_t *subcol = get_collection(vars, fp, linenum);
+ ipp_t *subcol = get_collection(outfile, vars, fp, linenum);
/* Collection value */
if (subcol)
- {
- ipp_attribute_t *tempcol; /* Pointer to new buffer */
-
-
- /*
- * Reallocate memory...
- */
-
- if ((tempcol = realloc(lastcol, sizeof(ipp_attribute_t) +
- (lastcol->num_values + 1) *
- sizeof(_ipp_value_t))) == NULL)
- {
- print_fatal_error("Unable to allocate memory on line %d.", *linenum);
- goto col_error;
- }
-
- if (tempcol != lastcol)
- {
- /*
- * Reset pointers in the list...
- */
-
- if (col->prev)
- col->prev->next = tempcol;
- else
- col->attrs = tempcol;
-
- lastcol = col->current = col->last = tempcol;
- }
-
- lastcol->values[lastcol->num_values].collection = subcol;
- lastcol->num_values ++;
- }
+ ippSetCollection(col, &lastcol, ippGetCount(lastcol), subcol);
else
goto col_error;
}
@@ -3359,26 +3724,26 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
if (!get_token(fp, token, sizeof(token), linenum))
{
- print_fatal_error("Missing MEMBER value tag on line %d.", *linenum);
+ print_fatal_error(outfile, "Missing MEMBER value tag on line %d.", *linenum);
goto col_error;
}
if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
{
- print_fatal_error("Bad MEMBER value tag \"%s\" on line %d.", token,
+ print_fatal_error(outfile, "Bad MEMBER value tag \"%s\" on line %d.", token,
*linenum);
goto col_error;
}
if (!get_token(fp, attr, sizeof(attr), linenum))
{
- print_fatal_error("Missing MEMBER name on line %d.", *linenum);
+ print_fatal_error(outfile, "Missing MEMBER name on line %d.", *linenum);
goto col_error;
}
if (!get_token(fp, temp, sizeof(temp), linenum))
{
- print_fatal_error("Missing MEMBER value on line %d.", *linenum);
+ print_fatal_error(outfile, "Missing MEMBER value on line %d.", *linenum);
goto col_error;
}
@@ -3390,7 +3755,7 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
if (!_cups_strcasecmp(token, "true"))
ippAddBoolean(col, IPP_TAG_ZERO, attr, 1);
else
- ippAddBoolean(col, IPP_TAG_ZERO, attr, atoi(token));
+ ippAddBoolean(col, IPP_TAG_ZERO, attr, (char)atoi(token));
break;
case IPP_TAG_INTEGER :
@@ -3410,21 +3775,18 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
_cups_strcasecmp(units, "dpcm") &&
_cups_strcasecmp(units, "other")))
{
- print_fatal_error("Bad resolution value \"%s\" on line %d.",
+ print_fatal_error(outfile, "Bad resolution value \"%s\" on line %d.",
token, *linenum);
goto col_error;
}
if (!_cups_strcasecmp(units, "dpi"))
- ippAddResolution(col, IPP_TAG_ZERO, attr, xres, yres,
- IPP_RES_PER_INCH);
+ ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_INCH, xres, yres);
else if (!_cups_strcasecmp(units, "dpc") ||
!_cups_strcasecmp(units, "dpcm"))
- ippAddResolution(col, IPP_TAG_ZERO, attr, xres, yres,
- IPP_RES_PER_CM);
+ ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_CM, xres, yres);
else
- ippAddResolution(col, IPP_TAG_ZERO, attr, xres, yres,
- (ipp_res_t)0);
+ ippAddResolution(col, IPP_TAG_ZERO, attr, (ipp_res_t)0, xres, yres);
}
break;
@@ -3443,7 +3805,7 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
if ((num_vals & 1) || num_vals == 0)
{
- print_fatal_error("Bad rangeOfInteger value \"%s\" on line %d.",
+ print_fatal_error(outfile, "Bad rangeOfInteger value \"%s\" on line %d.",
token, *linenum);
goto col_error;
}
@@ -3456,7 +3818,7 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
case IPP_TAG_BEGIN_COLLECTION :
if (!strcmp(token, "{"))
{
- ipp_t *subcol = get_collection(vars, fp, linenum);
+ ipp_t *subcol = get_collection(outfile, vars, fp, linenum);
/* Collection value */
if (subcol)
@@ -3469,10 +3831,13 @@ get_collection(_cups_vars_t *vars, /* I - Variables */
}
else
{
- print_fatal_error("Bad collection value on line %d.", *linenum);
+ print_fatal_error(outfile, "Bad collection value on line %d.", *linenum);
goto col_error;
}
break;
+ case IPP_TAG_STRING :
+ ippAddOctetString(col, IPP_TAG_ZERO, attr, token, (int)strlen(token));
+ break;
default :
if (!strchr(token, ','))
@@ -3570,7 +3935,7 @@ get_filename(const char *testfile, /* I - Current test file */
else
dstptr = dst; /* Should never happen */
- strlcpy(dstptr, src, dstsize - (dstptr - dst));
+ strlcpy(dstptr, src, dstsize - (size_t)(dstptr - dst));
}
return (dst);
@@ -3578,6 +3943,84 @@ get_filename(const char *testfile, /* I - Current test file */
/*
+ * 'get_string()' - Get a pointer to a string value or the portion of interest.
+ */
+
+static const char * /* O - Pointer to string */
+get_string(ipp_attribute_t *attr, /* I - IPP attribute */
+ int element, /* I - Element to fetch */
+ int flags, /* I - Value ("with") flags */
+ char *buffer, /* I - Temporary buffer */
+ size_t bufsize) /* I - Size of temporary buffer */
+{
+ const char *value; /* Value */
+ char *ptr, /* Pointer into value */
+ scheme[256], /* URI scheme */
+ userpass[256], /* Username/password */
+ hostname[256], /* Hostname */
+ resource[1024]; /* Resource */
+ int port; /* Port number */
+
+
+ value = ippGetString(attr, element, NULL);
+
+ if (flags & _CUPS_WITH_HOSTNAME)
+ {
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, (int)bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ buffer[0] = '\0';
+
+ ptr = buffer + strlen(buffer) - 1;
+ if (ptr >= buffer && *ptr == '.')
+ *ptr = '\0'; /* Drop trailing "." */
+
+ return (buffer);
+ }
+ else if (flags & _CUPS_WITH_RESOURCE)
+ {
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, (int)bufsize) < HTTP_URI_STATUS_OK)
+ buffer[0] = '\0';
+
+ return (buffer);
+ }
+ else if (flags & _CUPS_WITH_SCHEME)
+ {
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, (int)bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ buffer[0] = '\0';
+
+ return (buffer);
+ }
+ else if (ippGetValueTag(attr) == IPP_TAG_URI && (!strncmp(value, "ipp://", 6) || !strncmp(value, "http://", 7) || !strncmp(value, "ipps://", 7) || !strncmp(value, "https://", 8)))
+ {
+ http_uri_status_t status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource));
+
+ if (status < HTTP_URI_STATUS_OK)
+ {
+ /*
+ * Bad URI...
+ */
+
+ buffer[0] = '\0';
+ }
+ else
+ {
+ /*
+ * Normalize URI with no trailing dot...
+ */
+
+ if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.')
+ *ptr = '\0';
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource);
+ }
+
+ return (buffer);
+ }
+ else
+ return (value);
+}
+
+
+/*
* 'get_token()' - Get a token from a file.
*/
@@ -3630,15 +4073,15 @@ get_token(FILE *fp, /* I - File to read from */
*/
if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
if ((ch = getc(fp)) != EOF && bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
else if (ch == quote)
break;
else if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
}
*bufptr = '\0';
@@ -3657,6 +4100,13 @@ get_token(FILE *fp, /* I - File to read from */
(*linenum) ++;
}
+ else if (ch == '{' || ch == '}' || ch == ',')
+ {
+ buf[0] = (char)ch;
+ buf[1] = '\0';
+
+ return (buf);
+ }
else
{
/*
@@ -3672,7 +4122,7 @@ get_token(FILE *fp, /* I - File to read from */
if (isspace(ch) || ch == '#')
break;
else if (bufptr < bufend)
- *bufptr++ = ch;
+ *bufptr++ = (char)ch;
if (ch == '#')
ungetc(ch, fp);
@@ -3739,7 +4189,117 @@ password_cb(const char *prompt) /* I - Prompt (unused) */
{
(void)prompt;
- return (Password);
+ if (PasswordTries < 3)
+ {
+ PasswordTries ++;
+
+ cupsSetUser(Username);
+
+ return (Password);
+ }
+ else
+ return (NULL);
+}
+
+
+/*
+ * 'pause_message()' - Display the message and pause until the user presses a key.
+ */
+
+static void
+pause_message(const char *message) /* I - Message */
+{
+#ifdef WIN32
+ HANDLE tty; /* Console handle */
+ DWORD mode; /* Console mode */
+ char key; /* Key press */
+ DWORD bytes; /* Bytes read for key press */
+
+
+ /*
+ * Disable input echo and set raw input...
+ */
+
+ if ((tty = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE)
+ return;
+
+ if (!GetConsoleMode(tty, &mode))
+ return;
+
+ if (!SetConsoleMode(tty, 0))
+ return;
+
+#else
+ int tty; /* /dev/tty - never read from stdin */
+ struct termios original, /* Original input mode */
+ noecho; /* No echo input mode */
+ char key; /* Current key press */
+
+
+ /*
+ * Disable input echo and set raw input...
+ */
+
+ if ((tty = open("/dev/tty", O_RDONLY)) < 0)
+ return;
+
+ if (tcgetattr(tty, &original))
+ {
+ close(tty);
+ return;
+ }
+
+ noecho = original;
+ noecho.c_lflag &= (tcflag_t)~(ICANON | ECHO | ECHOE | ISIG);
+
+ if (tcsetattr(tty, TCSAFLUSH, &noecho))
+ {
+ close(tty);
+ return;
+ }
+#endif /* WIN32 */
+
+ /*
+ * Display the prompt...
+ */
+
+ printf("%s\n---- PRESS ANY KEY ----", message);
+ fflush(stdout);
+
+#ifdef WIN32
+ /*
+ * Read a key...
+ */
+
+ ReadFile(tty, &key, 1, &bytes, NULL);
+
+ /*
+ * Cleanup...
+ */
+
+ SetConsoleMode(tty, mode);
+
+#else
+ /*
+ * Read a key...
+ */
+
+ read(tty, &key, 1);
+
+ /*
+ * Cleanup...
+ */
+
+ tcsetattr(tty, TCSAFLUSH, &original);
+ close(tty);
+#endif /* WIN32 */
+
+ /*
+ * Erase the "press any key" prompt...
+ */
+
+ fputs("\r \r", stdout);
+ fflush(stdout);
}
@@ -3748,21 +4308,23 @@ password_cb(const char *prompt) /* I - Prompt (unused) */
*/
static void
-print_attr(ipp_attribute_t *attr, /* I - Attribute to print */
+print_attr(FILE *outfile, /* I - Output file */
+ int format, /* I - Output format */
+ ipp_attribute_t *attr, /* I - Attribute to print */
ipp_tag_t *group) /* IO - Current group */
{
int i; /* Looping var */
ipp_attribute_t *colattr; /* Collection attribute */
- if (Output == _CUPS_OUTPUT_PLIST)
+ if (format == _CUPS_OUTPUT_PLIST)
{
if (!attr->name || (group && *group != attr->group_tag))
{
if (attr->group_tag != IPP_TAG_ZERO)
{
- puts("</dict>");
- puts("<dict>");
+ fputs("</dict>\n", outfile);
+ fputs("<dict>\n", outfile);
}
if (group)
@@ -3772,100 +4334,56 @@ print_attr(ipp_attribute_t *attr, /* I - Attribute to print */
if (!attr->name)
return;
- print_xml_string("key", attr->name);
+ print_xml_string(outfile, "key", attr->name);
if (attr->num_values > 1)
- puts("<array>");
+ fputs("<array>\n", outfile);
switch (attr->value_tag)
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- printf("<integer>%d</integer>\n", attr->values[i].integer);
- else
- printf("%d ", attr->values[i].integer);
+ fprintf(outfile, "<integer>%d</integer>\n", attr->values[i].integer);
break;
case IPP_TAG_BOOLEAN :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- puts(attr->values[i].boolean ? "<true />" : "<false />");
- else if (attr->values[i].boolean)
- fputs("true ", stdout);
- else
- fputs("false ", stdout);
+ fputs(attr->values[i].boolean ? "<true />\n" : "<false />\n", outfile);
break;
case IPP_TAG_RANGE :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- printf("<dict><key>lower</key><integer>%d</integer>"
- "<key>upper</key><integer>%d</integer></dict>\n",
- attr->values[i].range.lower, attr->values[i].range.upper);
- else
- printf("%d-%d ", attr->values[i].range.lower,
- attr->values[i].range.upper);
+ fprintf(outfile, "<dict><key>lower</key><integer>%d</integer>"
+ "<key>upper</key><integer>%d</integer></dict>\n",
+ attr->values[i].range.lower, attr->values[i].range.upper);
break;
case IPP_TAG_RESOLUTION :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- printf("<dict><key>xres</key><integer>%d</integer>"
- "<key>yres</key><integer>%d</integer>"
- "<key>units</key><string>%s</string></dict>\n",
- attr->values[i].resolution.xres,
- attr->values[i].resolution.yres,
- attr->values[i].resolution.units == IPP_RES_PER_INCH ?
- "dpi" : "dpcm");
- else
- printf("%dx%d%s ", attr->values[i].resolution.xres,
- attr->values[i].resolution.yres,
- attr->values[i].resolution.units == IPP_RES_PER_INCH ?
- "dpi" : "dpcm");
+ fprintf(outfile, "<dict><key>xres</key><integer>%d</integer>"
+ "<key>yres</key><integer>%d</integer>"
+ "<key>units</key><string>%s</string></dict>\n",
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.yres,
+ attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+ "dpi" : "dpcm");
break;
case IPP_TAG_DATE :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- printf("<date>%s</date>\n", iso_date(attr->values[i].date));
- else
- printf("%s ", iso_date(attr->values[i].date));
+ fprintf(outfile, "<date>%s</date>\n", iso_date(attr->values[i].date));
break;
case IPP_TAG_STRING :
for (i = 0; i < attr->num_values; i ++)
{
- if (Output == _CUPS_OUTPUT_PLIST)
- {
- char buffer[IPP_MAX_LENGTH * 5 / 4 + 1];
+ char buffer[IPP_MAX_LENGTH * 5 / 4 + 1];
/* Output buffer */
- printf("<data>%s</data>\n",
- httpEncode64_2(buffer, sizeof(buffer),
- attr->values[i].unknown.data,
- attr->values[i].unknown.length));
- }
- else
- {
- char *ptr, /* Pointer into data */
- *end; /* End of data */
-
- putchar('\"');
- for (ptr = attr->values[i].unknown.data,
- end = ptr + attr->values[i].unknown.length;
- ptr < end;
- ptr ++)
- {
- if (*ptr == '\\' || *ptr == '\"')
- printf("\\%c", *ptr);
- else if (!isprint(*ptr & 255))
- printf("\\%03o", *ptr & 255);
- else
- putchar(*ptr);
- }
- putchar('\"');
- }
+ fprintf(outfile, "<data>%s</data>\n",
+ httpEncode64_2(buffer, sizeof(buffer),
+ attr->values[i].unknown.data,
+ attr->values[i].unknown.length));
}
break;
@@ -3877,178 +4395,69 @@ print_attr(ipp_attribute_t *attr, /* I - Attribute to print */
case IPP_TAG_MIMETYPE :
case IPP_TAG_LANGUAGE :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- print_xml_string("string", attr->values[i].string.text);
- else
- printf("\"%s\" ", attr->values[i].string.text);
+ print_xml_string(outfile, "string", attr->values[i].string.text);
break;
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
for (i = 0; i < attr->num_values; i ++)
- if (Output == _CUPS_OUTPUT_PLIST)
- {
- fputs("<dict><key>language</key><string>", stdout);
- print_xml_string(NULL, attr->values[i].string.language);
- fputs("</string><key>string</key><string>", stdout);
- print_xml_string(NULL, attr->values[i].string.text);
- puts("</string></dict>");
- }
- else
- printf("\"%s\"[%s] ", attr->values[i].string.text,
- attr->values[i].string.language);
+ {
+ fputs("<dict><key>language</key><string>", outfile);
+ print_xml_string(outfile, NULL, attr->values[i].string.language);
+ fputs("</string><key>string</key><string>", outfile);
+ print_xml_string(outfile, NULL, attr->values[i].string.text);
+ fputs("</string></dict>\n", outfile);
+ }
break;
case IPP_TAG_BEGIN_COLLECTION :
for (i = 0; i < attr->num_values; i ++)
{
- if (Output == _CUPS_OUTPUT_PLIST)
- {
- puts("<dict>");
- for (colattr = attr->values[i].collection->attrs;
- colattr;
- colattr = colattr->next)
- print_attr(colattr, NULL);
- puts("</dict>");
- }
- else
- {
- if (i)
- putchar(' ');
-
- print_col(attr->values[i].collection);
- }
+ fputs("<dict>\n", outfile);
+ for (colattr = attr->values[i].collection->attrs;
+ colattr;
+ colattr = colattr->next)
+ print_attr(outfile, format, colattr, NULL);
+ fputs("</dict>\n", outfile);
}
break;
default :
- if (Output == _CUPS_OUTPUT_PLIST)
- printf("<string>&lt;&lt;%s&gt;&gt;</string>\n",
- ippTagString(attr->value_tag));
- else
- fputs(ippTagString(attr->value_tag), stdout);
+ fprintf(outfile, "<string>&lt;&lt;%s&gt;&gt;</string>\n", ippTagString(attr->value_tag));
break;
}
if (attr->num_values > 1)
- puts("</array>");
+ fputs("</array>\n", outfile);
}
else
{
char buffer[8192]; /* Value buffer */
- if (Output == _CUPS_OUTPUT_TEST)
+ if (format == _CUPS_OUTPUT_TEST)
{
if (!attr->name)
{
- puts(" -- separator --");
+ fputs(" -- separator --\n", outfile);
return;
}
- printf(" %s (%s%s) = ", attr->name,
- attr->num_values > 1 ? "1setOf " : "",
- ippTagString(attr->value_tag));
+ fprintf(outfile, " %s (%s%s) = ", attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag));
}
ippAttributeString(attr, buffer, sizeof(buffer));
- puts(buffer);
+ fprintf(outfile, "%s\n", buffer);
}
}
/*
- * 'print_col()' - Print a collection attribute on the screen.
- */
-
-static void
-print_col(ipp_t *col) /* I - Collection attribute to print */
-{
- int i; /* Looping var */
- ipp_attribute_t *attr; /* Current attribute in collection */
-
-
- fputs("{ ", stdout);
- for (attr = col->attrs; attr; attr = attr->next)
- {
- printf("%s (%s%s) = ", attr->name, attr->num_values > 1 ? "1setOf " : "",
- ippTagString(attr->value_tag));
-
- switch (attr->value_tag)
- {
- case IPP_TAG_INTEGER :
- case IPP_TAG_ENUM :
- for (i = 0; i < attr->num_values; i ++)
- printf("%d ", attr->values[i].integer);
- break;
-
- case IPP_TAG_BOOLEAN :
- for (i = 0; i < attr->num_values; i ++)
- if (attr->values[i].boolean)
- printf("true ");
- else
- printf("false ");
- break;
-
- case IPP_TAG_NOVALUE :
- printf("novalue");
- break;
-
- case IPP_TAG_RANGE :
- for (i = 0; i < attr->num_values; i ++)
- printf("%d-%d ", attr->values[i].range.lower,
- attr->values[i].range.upper);
- break;
-
- case IPP_TAG_RESOLUTION :
- for (i = 0; i < attr->num_values; i ++)
- printf("%dx%d%s ", attr->values[i].resolution.xres,
- attr->values[i].resolution.yres,
- attr->values[i].resolution.units == IPP_RES_PER_INCH ?
- "dpi" : "dpcm");
- break;
-
- case IPP_TAG_STRING :
- case IPP_TAG_TEXT :
- case IPP_TAG_NAME :
- case IPP_TAG_KEYWORD :
- case IPP_TAG_CHARSET :
- case IPP_TAG_URI :
- case IPP_TAG_MIMETYPE :
- case IPP_TAG_LANGUAGE :
- for (i = 0; i < attr->num_values; i ++)
- printf("\"%s\" ", attr->values[i].string.text);
- break;
-
- case IPP_TAG_TEXTLANG :
- case IPP_TAG_NAMELANG :
- for (i = 0; i < attr->num_values; i ++)
- printf("\"%s\"[%s] ", attr->values[i].string.text,
- attr->values[i].string.language);
- break;
-
- case IPP_TAG_BEGIN_COLLECTION :
- for (i = 0; i < attr->num_values; i ++)
- {
- print_col(attr->values[i].collection);
- putchar(' ');
- }
- break;
-
- default :
- break; /* anti-compiler-warning-code */
- }
- }
-
- putchar('}');
-}
-
-
-/*
* 'print_csv()' - Print a line of CSV text.
*/
static void
print_csv(
+ FILE *outfile, /* I - Output file */
ipp_attribute_t *attr, /* I - First attribute for line */
int num_displayed, /* I - Number of attributes to display */
char **displayed, /* I - Attributes to display */
@@ -4083,7 +4492,7 @@ print_csv(
for (i = 0; i < num_displayed; i ++)
{
if (i)
- putchar(',');
+ fputc(',', outfile);
buffer[0] = '\0';
@@ -4101,30 +4510,30 @@ print_csv(
if (strchr(buffer, ',') != NULL || strchr(buffer, '\"') != NULL ||
strchr(buffer, '\\') != NULL)
{
- putchar('\"');
+ putc('\"', outfile);
for (bufptr = buffer; *bufptr; bufptr ++)
{
if (*bufptr == '\\' || *bufptr == '\"')
- putchar('\\');
- putchar(*bufptr);
+ putc('\\', outfile);
+ putc(*bufptr, outfile);
}
- putchar('\"');
+ putc('\"', outfile);
}
else
- fputs(buffer, stdout);
+ fputs(buffer, outfile);
}
- putchar('\n');
+ putc('\n', outfile);
}
else
{
for (i = 0; i < num_displayed; i ++)
{
if (i)
- putchar(',');
+ putc(',', outfile);
- fputs(displayed[i], stdout);
+ fputs(displayed[i], outfile);
}
- putchar('\n');
+ putc('\n', outfile);
}
free(buffer);
@@ -4136,7 +4545,8 @@ print_csv(
*/
static void
-print_fatal_error(const char *s, /* I - Printf-style format string */
+print_fatal_error(FILE *outfile, /* I - Output file */
+ const char *s, /* I - Printf-style format string */
...) /* I - Additional arguments as needed */
{
char buffer[10240]; /* Format buffer */
@@ -4157,11 +4567,11 @@ print_fatal_error(const char *s, /* I - Printf-style format string */
if (Output == _CUPS_OUTPUT_PLIST)
{
- print_xml_header();
- print_xml_trailer(0, buffer);
+ print_xml_header(outfile);
+ print_xml_trailer(outfile, 0, buffer);
}
- else
- _cupsLangPrintf(stderr, "ipptool: %s", buffer);
+
+ _cupsLangPrintf(stderr, "ipptool: %s", buffer);
}
@@ -4171,6 +4581,7 @@ print_fatal_error(const char *s, /* I - Printf-style format string */
static void
print_line(
+ FILE *outfile, /* I - Output file */
ipp_attribute_t *attr, /* I - First attribute for line */
int num_displayed, /* I - Number of attributes to display */
char **displayed, /* I - Attributes to display */
@@ -4204,7 +4615,7 @@ print_line(
for (i = 0; i < num_displayed; i ++)
{
if (i)
- putchar(' ');
+ putc(' ', outfile);
buffer[0] = '\0';
@@ -4219,31 +4630,31 @@ print_line(
}
}
- printf("%*s", (int)-widths[i], buffer);
+ fprintf(outfile, "%*s", (int)-widths[i], buffer);
}
- putchar('\n');
+ putc('\n', outfile);
}
else
{
for (i = 0; i < num_displayed; i ++)
{
if (i)
- putchar(' ');
+ putc(' ', outfile);
- printf("%*s", (int)-widths[i], displayed[i]);
+ fprintf(outfile, "%*s", (int)-widths[i], displayed[i]);
}
- putchar('\n');
+ putc('\n', outfile);
for (i = 0; i < num_displayed; i ++)
{
if (i)
- putchar(' ');
+ putc(' ', outfile);
memset(buffer, '-', widths[i]);
buffer[widths[i]] = '\0';
- fputs(buffer, stdout);
+ fputs(buffer, outfile);
}
- putchar('\n');
+ putc('\n', outfile);
}
free(buffer);
@@ -4255,21 +4666,23 @@ print_line(
*/
static void
-print_xml_header(void)
+print_xml_header(FILE *outfile) /* I - Output file */
{
if (!XMLHeader)
{
- puts("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
- puts("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" "
- "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">");
- puts("<plist version=\"1.0\">");
- puts("<dict>");
- puts("<key>Transfer</key>");
- printf("<string>%s</string>\n",
- Transfer == _CUPS_TRANSFER_AUTO ? "auto" :
- Transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length");
- puts("<key>Tests</key>");
- puts("<array>");
+ fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", outfile);
+ fputs("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" "
+ "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n", outfile);
+ fputs("<plist version=\"1.0\">\n", outfile);
+ fputs("<dict>\n", outfile);
+ fputs("<key>ipptoolVersion</key>\n", outfile);
+ fputs("<string>" CUPS_SVERSION "</string>\n", outfile);
+ fputs("<key>Transfer</key>\n", outfile);
+ fprintf(outfile, "<string>%s</string>\n",
+ Transfer == _CUPS_TRANSFER_AUTO ? "auto" :
+ Transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length");
+ fputs("<key>Tests</key>\n", outfile);
+ fputs("<array>\n", outfile);
XMLHeader = 1;
}
@@ -4281,20 +4694,21 @@ print_xml_header(void)
*/
static void
-print_xml_string(const char *element, /* I - Element name or NULL */
+print_xml_string(FILE *outfile, /* I - Output file */
+ const char *element, /* I - Element name or NULL */
const char *s) /* I - String to print */
{
if (element)
- printf("<%s>", element);
+ fprintf(outfile, "<%s>", element);
while (*s)
{
if (*s == '&')
- fputs("&amp;", stdout);
+ fputs("&amp;", outfile);
else if (*s == '<')
- fputs("&lt;", stdout);
+ fputs("&lt;", outfile);
else if (*s == '>')
- fputs("&gt;", stdout);
+ fputs("&gt;", outfile);
else if ((*s & 0xe0) == 0xc0)
{
/*
@@ -4303,13 +4717,13 @@ print_xml_string(const char *element, /* I - Element name or NULL */
if ((s[1] & 0xc0) != 0x80)
{
- putchar('?');
+ putc('?', outfile);
s ++;
}
else
{
- putchar(*s++);
- putchar(*s);
+ putc(*s++, outfile);
+ putc(*s, outfile);
}
}
else if ((*s & 0xf0) == 0xe0)
@@ -4320,14 +4734,14 @@ print_xml_string(const char *element, /* I - Element name or NULL */
if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80)
{
- putchar('?');
+ putc('?', outfile);
s += 2;
}
else
{
- putchar(*s++);
- putchar(*s++);
- putchar(*s);
+ putc(*s++, outfile);
+ putc(*s++, outfile);
+ putc(*s, outfile);
}
}
else if ((*s & 0xf8) == 0xf0)
@@ -4339,15 +4753,15 @@ print_xml_string(const char *element, /* I - Element name or NULL */
if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 ||
(s[3] & 0xc0) != 0x80)
{
- putchar('?');
+ putc('?', outfile);
s += 3;
}
else
{
- putchar(*s++);
- putchar(*s++);
- putchar(*s++);
- putchar(*s);
+ putc(*s++, outfile);
+ putc(*s++, outfile);
+ putc(*s++, outfile);
+ putc(*s, outfile);
}
}
else if ((*s & 0x80) || (*s < ' ' && !isspace(*s & 255)))
@@ -4356,16 +4770,16 @@ print_xml_string(const char *element, /* I - Element name or NULL */
* Invalid control character...
*/
- putchar('?');
+ putc('?', outfile);
}
else
- putchar(*s);
+ putc(*s, outfile);
s ++;
}
if (element)
- printf("</%s>\n", element);
+ fprintf(outfile, "</%s>\n", element);
}
@@ -4374,21 +4788,22 @@ print_xml_string(const char *element, /* I - Element name or NULL */
*/
static void
-print_xml_trailer(int success, /* I - 1 on success, 0 on failure */
+print_xml_trailer(FILE *outfile, /* I - Output file */
+ int success, /* I - 1 on success, 0 on failure */
const char *message) /* I - Error message or NULL */
{
if (XMLHeader)
{
- puts("</array>");
- puts("<key>Successful</key>");
- puts(success ? "<true />" : "<false />");
+ fputs("</array>\n", outfile);
+ fputs("<key>Successful</key>\n", outfile);
+ fputs(success ? "<true />\n" : "<false />\n", outfile);
if (message)
{
- puts("<key>ErrorMessage</key>");
- print_xml_string("string", message);
+ fputs("<key>ErrorMessage</key>\n", outfile);
+ print_xml_string(outfile, "string", message);
}
- puts("</dict>");
- puts("</plist>");
+ fputs("</dict>\n", outfile);
+ fputs("</plist>\n", outfile);
XMLHeader = 0;
}
@@ -4400,7 +4815,8 @@ print_xml_trailer(int success, /* I - 1 on success, 0 on failure */
*/
static void
-set_variable(_cups_vars_t *vars, /* I - Variables */
+set_variable(FILE *outfile, /* I - Output file */
+ _cups_vars_t *vars, /* I - Variables */
const char *name, /* I - Variable name */
const char *value) /* I - Value string */
{
@@ -4425,7 +4841,7 @@ set_variable(_cups_vars_t *vars, /* I - Variables */
}
else if ((var = malloc(sizeof(_cups_var_t))) == NULL)
{
- print_fatal_error("Unable to allocate memory for variable \"%s\".", name);
+ print_fatal_error(outfile, "Unable to allocate memory for variable \"%s\".", name);
exit(1);
}
else
@@ -4461,14 +4877,35 @@ sigterm_handler(int sig) /* I - Signal number (unused) */
*/
static int /* O - 1 to continue, 0 to cancel */
-timeout_cb(http_t *http, /* I - Connection to server (unused) */
+timeout_cb(http_t *http, /* I - Connection to server */
void *user_data) /* I - User data (unused) */
{
- (void)http;
+ int buffered = 0; /* Bytes buffered but not yet sent */
+
+
(void)user_data;
- /* Always cancel on timeout */
- return (0);
+ /*
+ * If the socket still have data waiting to be sent to the printer (as can
+ * happen if the printer runs out of paper), continue to wait until the output
+ * buffer is empty...
+ */
+
+#ifdef SO_NWRITE /* OS X and some versions of Linux */
+ socklen_t len = sizeof(buffered); /* Size of return value */
+
+ if (getsockopt(httpGetFd(http), SOL_SOCKET, SO_NWRITE, &buffered, &len))
+ buffered = 0;
+
+#elif defined(SIOCOUTQ) /* Others except Windows */
+ if (ioctl(httpGetFd(http), SIOCOUTQ, &buffered))
+ buffered = 0;
+
+#else /* Windows (not possible) */
+ (void)http;
+#endif /* SO_NWRITE */
+
+ return (buffered > 0);
}
@@ -4482,6 +4919,10 @@ usage(void)
_cupsLangPuts(stderr, _("Usage: ipptool [options] URI filename [ ... "
"filenameN ]"));
_cupsLangPuts(stderr, _("Options:"));
+ _cupsLangPuts(stderr, _(" --help Show help."));
+ _cupsLangPuts(stderr, _(" --stop-after-include-error\n"
+ " Stop tests after a failed INCLUDE."));
+ _cupsLangPuts(stderr, _(" --version Show version."));
_cupsLangPuts(stderr, _(" -4 Connect using IPv4."));
_cupsLangPuts(stderr, _(" -6 Connect using IPv6."));
_cupsLangPuts(stderr, _(" -C Send requests using "
@@ -4491,6 +4932,7 @@ usage(void)
_cupsLangPuts(stderr, _(" -I Ignore errors."));
_cupsLangPuts(stderr, _(" -L Send requests using "
"content-length."));
+ _cupsLangPuts(stderr, _(" -P filename.plist Produce XML plist to a file and test report to standard output."));
_cupsLangPuts(stderr, _(" -S Test with SSL "
"encryption."));
_cupsLangPuts(stderr, _(" -T seconds Set the receive/send "
@@ -4499,12 +4941,14 @@ usage(void)
"version."));
_cupsLangPuts(stderr, _(" -X Produce XML plist instead "
"of plain text."));
+ _cupsLangPuts(stderr, _(" -c Produce CSV output."));
_cupsLangPuts(stderr, _(" -d name=value Set named variable to "
"value."));
_cupsLangPuts(stderr, _(" -f filename Set default request "
"filename."));
_cupsLangPuts(stderr, _(" -i seconds Repeat the last file with "
"the given time interval."));
+ _cupsLangPuts(stderr, _(" -l Produce plain text output."));
_cupsLangPuts(stderr, _(" -n count Repeat the last file the "
"given number of times."));
_cupsLangPuts(stderr, _(" -q Run silently."));
@@ -4520,7 +4964,8 @@ usage(void)
*/
static int /* O - 1 if valid, 0 otherwise */
-validate_attr(cups_array_t *errors, /* I - Errors array */
+validate_attr(FILE *outfile, /* I - Output file */
+ cups_array_t *errors, /* I - Errors array */
ipp_attribute_t *attr) /* I - Attribute to validate */
{
int i; /* Looping var */
@@ -4585,7 +5030,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad boolen value %d "
- "(RFC 2911 section 4.1.10).", attr->name,
+ "(RFC 2911 section 4.1.11).", attr->name,
attr->values[i].boolean);
}
}
@@ -4609,7 +5054,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
case IPP_TAG_STRING :
for (i = 0; i < attr->num_values; i ++)
{
- if (attr->values[i].unknown.length > 1023)
+ if (attr->values[i].unknown.length > IPP_MAX_OCTETSTRING)
{
valid = 0;
@@ -4632,7 +5077,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime month %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[2]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[2]);
}
if (date[3] < 1 || date[3] > 31)
@@ -4641,7 +5086,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime day %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[3]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[3]);
}
if (date[4] > 23)
@@ -4650,7 +5095,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime hours %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[4]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[4]);
}
if (date[5] > 59)
@@ -4659,7 +5104,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime minutes %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[5]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[5]);
}
if (date[6] > 60)
@@ -4668,7 +5113,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime seconds %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[6]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[6]);
}
if (date[7] > 9)
@@ -4677,7 +5122,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime deciseconds %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[7]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[7]);
}
if (date[8] != '-' && date[8] != '+')
@@ -4686,7 +5131,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime UTC sign '%c' "
- "(RFC 2911 section 4.1.13).", attr->name, date[8]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[8]);
}
if (date[9] > 11)
@@ -4695,7 +5140,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime UTC hours %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[9]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[9]);
}
if (date[10] > 59)
@@ -4704,7 +5149,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad dateTime UTC minutes %u "
- "(RFC 2911 section 4.1.13).", attr->name, date[10]);
+ "(RFC 2911 section 4.1.14).", attr->name, date[10]);
}
}
break;
@@ -4719,7 +5164,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad resolution value %dx%d%s - cross "
"feed resolution must be positive "
- "(RFC 2911 section 4.1.13).", attr->name,
+ "(RFC 2911 section 4.1.15).", attr->name,
attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units ==
@@ -4735,7 +5180,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad resolution value %dx%d%s - feed "
"resolution must be positive "
- "(RFC 2911 section 4.1.13).", attr->name,
+ "(RFC 2911 section 4.1.15).", attr->name,
attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units ==
@@ -4751,7 +5196,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
add_stringf(errors,
"\"%s\": Bad resolution value %dx%d%s - bad "
- "units value (RFC 2911 section 4.1.13).",
+ "units value (RFC 2911 section 4.1.15).",
attr->name, attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units ==
@@ -4785,7 +5230,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
colattr;
colattr = colattr->next)
{
- if (!validate_attr(NULL, colattr))
+ if (!validate_attr(outfile, NULL, colattr))
{
valid = 0;
break;
@@ -4798,7 +5243,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
while (colattr)
{
- validate_attr(errors, colattr);
+ validate_attr(outfile, errors, colattr);
colattr = colattr->next;
}
}
@@ -4852,7 +5297,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->values[i].string.text);
}
- if ((ptr - attr->values[i].string.text) > 1023)
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_TEXT - 1))
{
valid = 0;
@@ -4912,7 +5357,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->values[i].string.text);
}
- if ((ptr - attr->values[i].string.text) > 1023)
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_NAME - 1))
{
valid = 0;
@@ -4943,7 +5388,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->name, attr->values[i].string.text);
}
- if ((ptr - attr->values[i].string.text) > 255)
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_KEYWORD - 1))
{
valid = 0;
@@ -4974,11 +5419,10 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
"\"%s\": Bad URI value \"%s\" - %s "
"(RFC 2911 section 4.1.5).", attr->name,
attr->values[i].string.text,
- URIStatusStrings[uri_status -
- HTTP_URI_OVERFLOW]);
+ httpURIStatusString(uri_status));
}
- if (strlen(attr->values[i].string.text) > 1023)
+ if (strlen(attr->values[i].string.text) > (IPP_MAX_URI - 1))
{
valid = 0;
@@ -5013,7 +5457,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->name, attr->values[i].string.text);
}
- if ((ptr - attr->values[i].string.text) > 63)
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_URISCHEME - 1))
{
valid = 0;
@@ -5044,7 +5488,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->name, attr->values[i].string.text);
}
- if ((ptr - attr->values[i].string.text) > 40)
+ if ((ptr - attr->values[i].string.text) > (IPP_MAX_CHARSET - 1))
{
valid = 0;
@@ -5083,7 +5527,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
char temp[256]; /* Temporary error string */
regerror(i, &re, temp, sizeof(temp));
- print_fatal_error("Unable to compile naturalLanguage regular "
+ print_fatal_error(outfile, "Unable to compile naturalLanguage regular "
"expression: %s.", temp);
break;
}
@@ -5100,7 +5544,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->name, attr->values[i].string.text);
}
- if (strlen(attr->values[i].string.text) > 63)
+ if (strlen(attr->values[i].string.text) > (IPP_MAX_LANGUAGE - 1))
{
valid = 0;
@@ -5136,7 +5580,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
char temp[256]; /* Temporary error string */
regerror(i, &re, temp, sizeof(temp));
- print_fatal_error("Unable to compile mimeMediaType regular "
+ print_fatal_error(outfile, "Unable to compile mimeMediaType regular "
"expression: %s.", temp);
break;
}
@@ -5153,7 +5597,7 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
attr->name, attr->values[i].string.text);
}
- if (strlen(attr->values[i].string.text) > 255)
+ if (strlen(attr->values[i].string.text) > (IPP_MAX_MIMETYPE - 1))
{
valid = 0;
@@ -5181,7 +5625,8 @@ validate_attr(cups_array_t *errors, /* I - Errors array */
*/
static int /* O - 1 on match, 0 on non-match */
-with_value(cups_array_t *errors, /* I - Errors array */
+with_value(FILE *outfile, /* I - Output file */
+ cups_array_t *errors, /* I - Errors array */
char *value, /* I - Value string */
int flags, /* I - Flags for match */
ipp_attribute_t *attr, /* I - Attribute to compare */
@@ -5190,7 +5635,8 @@ with_value(cups_array_t *errors, /* I - Errors array */
{
int i, /* Looping var */
match; /* Match? */
- char *valptr; /* Pointer into value */
+ char temp[1024], /* Temporary value string */
+ *valptr; /* Pointer into value */
*matchbuf = '\0';
@@ -5235,7 +5681,7 @@ with_value(cups_array_t *errors, /* I - Errors array */
if (!*valptr)
break;
- intvalue = strtol(valptr, &nextptr, 0);
+ intvalue = (int)strtol(valptr, &nextptr, 0);
if (nextptr == valptr)
break;
valptr = nextptr;
@@ -5245,8 +5691,7 @@ with_value(cups_array_t *errors, /* I - Errors array */
(op == '>' && attr->values[i].integer > intvalue))
{
if (!matchbuf[0])
- snprintf(matchbuf, matchlen, "%d",
- attr->values[i].integer);
+ snprintf(matchbuf, matchlen, "%d", attr->values[i].integer);
valmatch = 1;
break;
@@ -5301,7 +5746,7 @@ with_value(cups_array_t *errors, /* I - Errors array */
if (!*valptr)
break;
- intvalue = strtol(valptr, &nextptr, 0);
+ intvalue = (int)strtol(valptr, &nextptr, 0);
if (nextptr == valptr)
break;
valptr = nextptr;
@@ -5374,6 +5819,63 @@ with_value(cups_array_t *errors, /* I - Errors array */
}
break;
+ case IPP_TAG_RESOLUTION :
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].resolution.xres ==
+ attr->values[i].resolution.yres)
+ snprintf(temp, sizeof(temp), "%d%s",
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+ "dpi" : "dpcm");
+ else
+ snprintf(temp, sizeof(temp), "%dx%d%s",
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.yres,
+ attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+ "dpi" : "dpcm");
+
+ if (!strcmp(value, temp))
+ {
+ if (!matchbuf[0])
+ strlcpy(matchbuf, value, matchlen);
+
+ if (!(flags & _CUPS_WITH_ALL))
+ {
+ match = 1;
+ break;
+ }
+ }
+ else if (flags & _CUPS_WITH_ALL)
+ {
+ match = 0;
+ break;
+ }
+ }
+
+ if (!match && errors)
+ {
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (attr->values[i].resolution.xres ==
+ attr->values[i].resolution.yres)
+ snprintf(temp, sizeof(temp), "%d%s",
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+ "dpi" : "dpcm");
+ else
+ snprintf(temp, sizeof(temp), "%dx%d%s",
+ attr->values[i].resolution.xres,
+ attr->values[i].resolution.yres,
+ attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+ "dpi" : "dpcm");
+
+ if (strcmp(value, temp))
+ add_stringf(errors, "GOT: %s=%s", attr->name, temp);
+ }
+ }
+ break;
+
case IPP_TAG_NOVALUE :
case IPP_TAG_UNKNOWN :
return (1);
@@ -5398,11 +5900,9 @@ with_value(cups_array_t *errors, /* I - Errors array */
if ((i = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0)
{
- char temp[256]; /* Temporary string */
-
regerror(i, &re, temp, sizeof(temp));
- print_fatal_error("Unable to compile WITH-VALUE regular expression "
+ print_fatal_error(outfile, "Unable to compile WITH-VALUE regular expression "
"\"%s\" - %s", value, temp);
return (0);
}
@@ -5413,10 +5913,13 @@ with_value(cups_array_t *errors, /* I - Errors array */
for (i = 0; i < attr->num_values; i ++)
{
- if (!regexec(&re, attr->values[i].string.text, 0, NULL, 0))
+ if (!regexec(&re, get_string(attr, i, flags, temp, sizeof(temp)),
+ 0, NULL, 0))
{
if (!matchbuf[0])
- strlcpy(matchbuf, attr->values[i].string.text, matchlen);
+ strlcpy(matchbuf,
+ get_string(attr, i, flags, temp, sizeof(temp)),
+ matchlen);
if (!(flags & _CUPS_WITH_ALL))
{
@@ -5433,6 +5936,55 @@ with_value(cups_array_t *errors, /* I - Errors array */
regfree(&re);
}
+ else if (ippGetValueTag(attr) == IPP_TAG_URI)
+ {
+ if (!strncmp(value, "ipp://", 6) || !strncmp(value, "http://", 7) || !strncmp(value, "ipps://", 7) || !strncmp(value, "https://", 8))
+ {
+ char scheme[256], /* URI scheme */
+ userpass[256], /* username:password, if any */
+ hostname[256], /* hostname */
+ *hostptr, /* Pointer into hostname */
+ resource[1024]; /* Resource path */
+ int port; /* Port number */
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) >= HTTP_URI_STATUS_OK && (hostptr = hostname + strlen(hostname) - 1) > hostname && *hostptr == '.')
+ {
+ /*
+ * Strip trailing "." in hostname of URI...
+ */
+
+ *hostptr = '\0';
+ httpAssembleURI(HTTP_URI_CODING_ALL, temp, sizeof(temp), scheme, userpass, hostname, port, resource);
+ value = temp;
+ }
+ }
+
+ /*
+ * Value is a literal URI string, see if the value(s) match...
+ */
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (!strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))))
+ {
+ if (!matchbuf[0])
+ strlcpy(matchbuf,
+ get_string(attr, i, flags, temp, sizeof(temp)),
+ matchlen);
+
+ if (!(flags & _CUPS_WITH_ALL))
+ {
+ match = 1;
+ break;
+ }
+ }
+ else if (flags & _CUPS_WITH_ALL)
+ {
+ match = 0;
+ break;
+ }
+ }
+ }
else
{
/*
@@ -5441,10 +5993,12 @@ with_value(cups_array_t *errors, /* I - Errors array */
for (i = 0; i < attr->num_values; i ++)
{
- if (!strcmp(value, attr->values[i].string.text))
+ if (!strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))))
{
if (!matchbuf[0])
- strlcpy(matchbuf, attr->values[i].string.text, matchlen);
+ strlcpy(matchbuf,
+ get_string(attr, i, flags, temp, sizeof(temp)),
+ matchlen);
if (!(flags & _CUPS_WITH_ALL))
{
@@ -5464,7 +6018,7 @@ with_value(cups_array_t *errors, /* I - Errors array */
{
for (i = 0; i < attr->num_values; i ++)
add_stringf(errors, "GOT: %s=\"%s\"", attr->name,
- attr->values[i].string.text);
+ attr->values[i].string.text);
}
break;
@@ -5477,5 +6031,165 @@ with_value(cups_array_t *errors, /* I - Errors array */
/*
- * End of "$Id: ipptool.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'with_value_from()' - Test a WITH-VALUE-FROM predicate.
+ */
+
+static int /* O - 1 on match, 0 on non-match */
+with_value_from(
+ cups_array_t *errors, /* I - Errors array */
+ ipp_attribute_t *fromattr, /* I - "From" attribute */
+ ipp_attribute_t *attr, /* I - Attribute to compare */
+ char *matchbuf, /* I - Buffer to hold matching value */
+ size_t matchlen) /* I - Length of match buffer */
+{
+ int i, j, /* Looping vars */
+ count = ippGetCount(attr), /* Number of attribute values */
+ match = 1; /* Match? */
+
+
+ *matchbuf = '\0';
+
+ /*
+ * Compare the from value(s) to the attribute value(s)...
+ */
+
+ switch (ippGetValueTag(attr))
+ {
+ case IPP_TAG_INTEGER :
+ if (ippGetValueTag(fromattr) != IPP_TAG_INTEGER && ippGetValueTag(fromattr) != IPP_TAG_RANGE)
+ goto wrong_value_tag;
+
+ for (i = 0; i < count; i ++)
+ {
+ int value = ippGetInteger(attr, i);
+ /* Current integer value */
+
+ if (ippContainsInteger(fromattr, value))
+ {
+ if (!matchbuf[0])
+ snprintf(matchbuf, matchlen, "%d", value);
+ }
+ else
+ {
+ add_stringf(errors, "GOT: %s=%d", ippGetName(attr), value);
+ match = 0;
+ }
+ }
+ break;
+
+ case IPP_TAG_ENUM :
+ if (ippGetValueTag(fromattr) != IPP_TAG_ENUM)
+ goto wrong_value_tag;
+
+ for (i = 0; i < count; i ++)
+ {
+ int value = ippGetInteger(attr, i);
+ /* Current integer value */
+
+ if (ippContainsInteger(fromattr, value))
+ {
+ if (!matchbuf[0])
+ snprintf(matchbuf, matchlen, "%d", value);
+ }
+ else
+ {
+ add_stringf(errors, "GOT: %s=%d", ippGetName(attr), value);
+ match = 0;
+ }
+ }
+ break;
+
+ case IPP_TAG_RESOLUTION :
+ if (ippGetValueTag(fromattr) != IPP_TAG_RESOLUTION)
+ goto wrong_value_tag;
+
+ for (i = 0; i < count; i ++)
+ {
+ int xres, yres;
+ ipp_res_t units;
+ int fromcount = ippGetCount(fromattr);
+ int fromxres, fromyres;
+ ipp_res_t fromunits;
+
+ xres = ippGetResolution(attr, i, &yres, &units);
+
+ for (j = 0; j < fromcount; j ++)
+ {
+ fromxres = ippGetResolution(fromattr, j, &fromyres, &fromunits);
+ if (fromxres == xres && fromyres == yres && fromunits == units)
+ break;
+ }
+
+ if (j < fromcount)
+ {
+ if (!matchbuf[0])
+ {
+ if (xres == yres)
+ snprintf(matchbuf, matchlen, "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ else
+ snprintf(matchbuf, matchlen, "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ }
+ }
+ else
+ {
+ if (xres == yres)
+ add_stringf(errors, "GOT: %s=%d%s", ippGetName(attr), xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ else
+ add_stringf(errors, "GOT: %s=%dx%d%s", ippGetName(attr), xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+
+ match = 0;
+ }
+ }
+ break;
+
+ case IPP_TAG_NOVALUE :
+ case IPP_TAG_UNKNOWN :
+ return (1);
+
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ for (i = 0; i < count; i ++)
+ {
+ const char *value = ippGetString(attr, i, NULL);
+ /* Current string value */
+
+ if (ippContainsString(fromattr, value))
+ {
+ if (!matchbuf[0])
+ strlcpy(matchbuf, value, matchlen);
+ }
+ else
+ {
+ add_stringf(errors, "GOT: %s='%s'", ippGetName(attr), value);
+ match = 0;
+ }
+ }
+ break;
+
+ default :
+ match = 0;
+ break;
+ }
+
+ return (match);
+
+ /* value tag mismatch between fromattr and attr */
+ wrong_value_tag :
+
+ add_stringf(errors, "GOT: %s OF-TYPE %s", ippGetName(attr), ippTagString(ippGetValueTag(attr)));
+
+ return (0);
+}
+
+
+/*
+ * End of "$Id: ipptool.c 12952 2015-10-28 17:22:39Z msweet $".
*/
diff --git a/test/make-ippeverywhere-print-tests.sh b/test/make-ippeverywhere-print-tests.sh
new file mode 100755
index 0000000..7d897ff
--- /dev/null
+++ b/test/make-ippeverywhere-print-tests.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# Script that builds the print-job tests for all IPP Everywhere PWG Raster
+# documents.
+#
+
+for file in color.jpg-4x6 document-a4 document-letter gray.jpg-4x6 onepage-a4 onepage-letter; do
+ for res in 150dpi 180dpi 300dpi 360dpi 600dpi 720dpi; do
+ HAVE_RES="`echo HAVE_$res | awk '{print toupper($1);}'`"
+ for type in black-1 cmyk-8 sgray-8 srgb-8 srgb-16; do
+ if test -f pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg; then
+ HAVE_TYPE="`echo HAVE_$type | awk '{print toupper($1);}' | tr '-' '_'`"
+ cat <<EOF
+{
+ NAME "Print $file @ $res, $type"
+ SKIP-IF-MISSING pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+ SKIP-IF-NOT-DEFINED $HAVE_RES
+ SKIP-IF-NOT-DEFINED $HAVE_TYPE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri \$uri
+ ATTR name requesting-user-name \$user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR name job-name "$file"
+ FILE pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print $file @ $res, $type, deflate"
+ SKIP-IF-MISSING pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+ SKIP-IF-NOT-DEFINED $HAVE_RES
+ SKIP-IF-NOT-DEFINED $HAVE_TYPE
+ SKIP-IF-NOT-DEFINED HAVE_DEFLATE
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri \$uri
+ ATTR name requesting-user-name \$user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression deflate
+ ATTR name job-name "$file"
+ COMPRESSION deflate
+ FILE pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+ NAME "Print $file @ $res, $type, gzip"
+ SKIP-IF-MISSING pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+ SKIP-IF-NOT-DEFINED $HAVE_RES
+ SKIP-IF-NOT-DEFINED $HAVE_TYPE
+ SKIP-IF-NOT-DEFINED HAVE_GZIP
+
+ OPERATION Print-Job
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR naturalLanguage attributes-natural-language en
+ ATTR uri printer-uri \$uri
+ ATTR name requesting-user-name \$user
+ ATTR mimeMediaType document-format image/pwg-raster
+ ATTR keyword compression gzip
+ ATTR name job-name "$file"
+ COMPRESSION gzip
+ FILE pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+
+ STATUS successful-ok
+ STATUS server-error-busy REPEAT-MATCH
+}
+
+EOF
+ fi
+ done
+ done
+done
diff --git a/test/onepage-a4-300-black-1.pwg.gz b/test/onepage-a4-300-black-1.pwg.gz
new file mode 100644
index 0000000..0a559fc
--- /dev/null
+++ b/test/onepage-a4-300-black-1.pwg.gz
Binary files differ
diff --git a/test/onepage-letter-300-black-1.pwg.gz b/test/onepage-letter-300-black-1.pwg.gz
new file mode 100644
index 0000000..8fd7386
--- /dev/null
+++ b/test/onepage-letter-300-black-1.pwg.gz
Binary files differ
diff --git a/test/print-job-and-wait.test b/test/print-job-and-wait.test
new file mode 100644
index 0000000..f6accca
--- /dev/null
+++ b/test/print-job-and-wait.test
@@ -0,0 +1,45 @@
+# Print a test page using print-job
+{
+ # The name of the test...
+ NAME "Print file using Print-Job"
+
+ # The operation to use
+ OPERATION Print-Job
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+
+ GROUP job-attributes-tag
+ ATTR integer copies 1
+
+ FILE $filename
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT job-id
+ EXPECT job-uri
+}
+{
+ NAME "Wait for job to complete..."
+ OPERATION Get-Job-Attributes
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR integer job-id $job-id
+ ATTR name requesting-user-name $user
+
+ STATUS successful-ok
+ EXPECT job-id
+ EXPECT job-state WITH-VALUE >5 REPEAT-NO-MATCH
+ DISPLAY job-state
+ DISPLAY job-state-reasons
+}
diff --git a/test/print-job-deflate.test b/test/print-job-deflate.test
new file mode 100644
index 0000000..e54028d
--- /dev/null
+++ b/test/print-job-deflate.test
@@ -0,0 +1,31 @@
+# Print a test page using print-job and compression=gzip
+{
+ # The name of the test...
+ NAME "Print file using Print-Job and compression=deflate"
+
+ # The operation to use
+ OPERATION Print-Job
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+ ATTR keyword compression deflate
+
+ GROUP job-attributes-tag
+ ATTR integer copies 1
+
+ COMPRESSION deflate
+ FILE $filename
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT job-id
+ EXPECT job-uri
+}
diff --git a/test/print-job-gzip.test b/test/print-job-gzip.test
new file mode 100644
index 0000000..2b8209c
--- /dev/null
+++ b/test/print-job-gzip.test
@@ -0,0 +1,31 @@
+# Print a test page using print-job and compression=gzip
+{
+ # The name of the test...
+ NAME "Print file using Print-Job and compression=gzip"
+
+ # The operation to use
+ OPERATION Print-Job
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+ ATTR keyword compression gzip
+
+ GROUP job-attributes-tag
+ ATTR integer copies 1
+
+ COMPRESSION gzip
+ FILE $filename
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT job-id
+ EXPECT job-uri
+}
diff --git a/test/print-job-password.test b/test/print-job-password.test
new file mode 100644
index 0000000..36e6a0a
--- /dev/null
+++ b/test/print-job-password.test
@@ -0,0 +1,31 @@
+# Print a test page using print-job
+{
+ # The name of the test...
+ NAME "Print file using Print-Job"
+
+ # The operation to use
+ OPERATION Print-Job
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+ ATTR octetString job-password 1234
+ ATTR keyword job-password-encryption none
+
+ GROUP job-attributes-tag
+ ATTR integer copies 1
+
+ FILE $filename
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+
+ # What attributes do we expect?
+ EXPECT job-id
+ EXPECT job-uri
+}
diff --git a/test/printer.opacity b/test/printer.opacity
index 595854a..44d8054 100644
--- a/test/printer.opacity
+++ b/test/printer.opacity
Binary files differ
diff --git a/test/printer.png b/test/printer.png
index 18c05db..08430fc 100644
--- a/test/printer.png
+++ b/test/printer.png
Binary files differ
diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh
index 48756c8..1a76104 100755
--- a/test/run-stp-tests.sh
+++ b/test/run-stp-tests.sh
@@ -1,18 +1,18 @@
#!/bin/sh
#
-# "$Id: run-stp-tests.sh 9034 2010-03-09 07:03:06Z mike $"
+# "$Id: run-stp-tests.sh 12853 2015-08-28 13:38:46Z msweet $"
#
-# Perform the complete set of IPP compliance tests specified in the
-# CUPS Software Test Plan.
+# Perform the complete set of IPP compliance tests specified in the
+# CUPS Software Test Plan.
#
-# Copyright 2007-2012 by Apple Inc.
-# Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
-# These coded instructions, statements, and computer programs are the
-# property of Apple Inc. and are protected by Federal copyright
-# law. Distribution and use rights are outlined in the file "LICENSE.txt"
-# which should have been included with this file. If this file is
-# file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law. Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file. If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
#
argcount=$#
@@ -100,6 +100,7 @@ case "$testtype" in
nprinters2=0
pjobs=0
pprinters=0
+ loglevel="debug2"
;;
2)
echo "Running the medium tests (2)"
@@ -107,6 +108,7 @@ case "$testtype" in
nprinters2=20
pjobs=20
pprinters=10
+ loglevel="debug"
;;
3)
echo "Running the extreme tests (3)"
@@ -114,6 +116,7 @@ case "$testtype" in
nprinters2=1000
pjobs=100
pprinters=50
+ loglevel="debug"
;;
4)
echo "Running the torture tests (4)"
@@ -121,6 +124,7 @@ case "$testtype" in
nprinters2=20000
pjobs=200
pprinters=100
+ loglevel="debug"
;;
*)
echo "Running the timid tests (1)"
@@ -128,6 +132,8 @@ case "$testtype" in
nprinters2=0
pjobs=10
pprinters=0
+ loglevel="debug2"
+ testtype="1"
;;
esac
@@ -184,9 +190,20 @@ if test -z "$user"; then
fi
fi
-port=8631
+port="${CUPS_TESTPORT:=8631}"
cwd=`pwd`
root=`dirname $cwd`
+CUPS_TESTROOT="$root"; export CUPS_TESTROOT
+
+BASE="${CUPS_TESTBASE:=}"
+if test -z "$BASE"; then
+ if test -d /private/tmp; then
+ BASE=/private/tmp/cups-$user
+ else
+ BASE=/tmp/cups-$user
+ fi
+fi
+export BASE
#
# Make sure that the LPDEST and PRINTER environment variables are
@@ -218,12 +235,12 @@ echo ""
case "$usevalgrind" in
Y* | y*)
- VALGRIND="valgrind --tool=memcheck --log-file=/tmp/cups-$user/log/valgrind.%p --error-limit=no --leak-check=yes --trace-children=yes --read-var-info=yes"
+ VALGRIND="valgrind --tool=memcheck --log-file=$BASE/log/valgrind.%p --error-limit=no --leak-check=yes --trace-children=yes"
if test `uname` = Darwin; then
VALGRIND="$VALGRIND --dsymutil=yes"
fi
export VALGRIND
- echo "Using Valgrind; log files can be found in /tmp/cups-$user/log..."
+ echo "Using Valgrind; log files can be found in $BASE/log..."
;;
*)
@@ -252,16 +269,16 @@ echo ""
case "$usedebugprintfs" in
Y* | y*)
- echo "Enabling debug printfs; log files can be found in /tmp/cups-$user/log..."
- CUPS_DEBUG_LOG="/tmp/cups-$user/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
+ echo "Enabling debug printfs (level 5); log files can be found in $BASE/log..."
+ CUPS_DEBUG_LOG="$BASE/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
CUPS_DEBUG_LEVEL=5; export CUPS_DEBUG_LEVEL
CUPS_DEBUG_FILTER='^(http|_http|ipp|_ipp|cups.*Request|cupsGetResponse|cupsSend).*$'; export CUPS_DEBUG_FILTER
;;
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)
- echo "Enabling debug printfs; log files can be found in /tmp/cups-$user/log..."
- CUPS_DEBUG_LOG="/tmp/cups-$user/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
- CUPS_DEBUG_LEVEL=$usedebugprintf; export CUPS_DEBUG_LEVEL
+ echo "Enabling debug printfs (level $usedebugprintfs); log files can be found in $BASE/log..."
+ CUPS_DEBUG_LOG="$BASE/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
+ CUPS_DEBUG_LEVEL="$usedebugprintfs"; export CUPS_DEBUG_LEVEL
CUPS_DEBUG_FILTER='^(http|_http|ipp|_ipp|cups.*Request|cupsGetResponse|cupsSend).*$'; export CUPS_DEBUG_FILTER
;;
@@ -275,104 +292,185 @@ esac
echo "Creating directories for test..."
-rm -rf /tmp/cups-$user
-mkdir /tmp/cups-$user
-mkdir /tmp/cups-$user/bin
-mkdir /tmp/cups-$user/bin/backend
-mkdir /tmp/cups-$user/bin/driver
-mkdir /tmp/cups-$user/bin/filter
-mkdir /tmp/cups-$user/certs
-mkdir /tmp/cups-$user/share
-mkdir /tmp/cups-$user/share/banners
-mkdir /tmp/cups-$user/share/drv
-mkdir /tmp/cups-$user/share/locale
+rm -rf $BASE
+mkdir $BASE
+mkdir $BASE/bin
+mkdir $BASE/bin/backend
+mkdir $BASE/bin/driver
+mkdir $BASE/bin/filter
+mkdir $BASE/certs
+mkdir $BASE/share
+mkdir $BASE/share/banners
+mkdir $BASE/share/drv
+mkdir $BASE/share/locale
for file in ../locale/cups_*.po; do
loc=`basename $file .po | cut -c 6-`
- mkdir /tmp/cups-$user/share/locale/$loc
- ln -s $root/locale/cups_$loc.po /tmp/cups-$user/share/locale/$loc
- ln -s $root/locale/ppdc_$loc.po /tmp/cups-$user/share/locale/$loc
+ mkdir $BASE/share/locale/$loc
+ ln -s $root/locale/cups_$loc.po $BASE/share/locale/$loc
+ ln -s $root/locale/ppdc_$loc.po $BASE/share/locale/$loc
done
-mkdir /tmp/cups-$user/share/mime
-mkdir /tmp/cups-$user/share/model
-mkdir /tmp/cups-$user/share/ppdc
-mkdir /tmp/cups-$user/interfaces
-mkdir /tmp/cups-$user/log
-mkdir /tmp/cups-$user/ppd
-mkdir /tmp/cups-$user/spool
-mkdir /tmp/cups-$user/spool/temp
-mkdir /tmp/cups-$user/ssl
-
-ln -s $root/backend/dnssd /tmp/cups-$user/bin/backend
-ln -s $root/backend/http /tmp/cups-$user/bin/backend
-ln -s $root/backend/ipp /tmp/cups-$user/bin/backend
-ln -s $root/backend/lpd /tmp/cups-$user/bin/backend
-ln -s $root/backend/mdns /tmp/cups-$user/bin/backend
-ln -s $root/backend/pseudo /tmp/cups-$user/bin/backend
-ln -s $root/backend/snmp /tmp/cups-$user/bin/backend
-ln -s $root/backend/socket /tmp/cups-$user/bin/backend
-ln -s $root/backend/usb /tmp/cups-$user/bin/backend
-ln -s $root/cgi-bin /tmp/cups-$user/bin
-ln -s $root/monitor /tmp/cups-$user/bin
-ln -s $root/notifier /tmp/cups-$user/bin
-ln -s $root/scheduler /tmp/cups-$user/bin/daemon
-ln -s $root/filter/commandtops /tmp/cups-$user/bin/filter
-ln -s $root/filter/gziptoany /tmp/cups-$user/bin/filter
-ln -s $root/filter/pstops /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertoepson /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertohp /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertolabel /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertopwg /tmp/cups-$user/bin/filter
-
-ln -s $root/data/classified /tmp/cups-$user/share/banners
-ln -s $root/data/confidential /tmp/cups-$user/share/banners
-ln -s $root/data/secret /tmp/cups-$user/share/banners
-ln -s $root/data/standard /tmp/cups-$user/share/banners
-ln -s $root/data/topsecret /tmp/cups-$user/share/banners
-ln -s $root/data/unclassified /tmp/cups-$user/share/banners
-ln -s $root/data /tmp/cups-$user/share
-ln -s $root/ppdc/sample.drv /tmp/cups-$user/share/drv
-ln -s $root/conf/mime.types /tmp/cups-$user/share/mime
-ln -s $root/conf/mime.convs /tmp/cups-$user/share/mime
-ln -s $root/data/*.h /tmp/cups-$user/share/ppdc
-ln -s $root/data/*.defs /tmp/cups-$user/share/ppdc
-ln -s $root/templates /tmp/cups-$user/share
+mkdir $BASE/share/mime
+mkdir $BASE/share/model
+mkdir $BASE/share/ppdc
+mkdir $BASE/interfaces
+mkdir $BASE/log
+mkdir $BASE/ppd
+mkdir $BASE/spool
+mkdir $BASE/spool/temp
+mkdir $BASE/ssl
+
+ln -s $root/backend/dnssd $BASE/bin/backend
+ln -s $root/backend/http $BASE/bin/backend
+ln -s $root/backend/ipp $BASE/bin/backend
+ln -s $root/backend/lpd $BASE/bin/backend
+ln -s $root/backend/mdns $BASE/bin/backend
+ln -s $root/backend/pseudo $BASE/bin/backend
+ln -s $root/backend/snmp $BASE/bin/backend
+ln -s $root/backend/socket $BASE/bin/backend
+ln -s $root/backend/usb $BASE/bin/backend
+ln -s $root/cgi-bin $BASE/bin
+ln -s $root/monitor $BASE/bin
+ln -s $root/notifier $BASE/bin
+ln -s $root/scheduler $BASE/bin/daemon
+ln -s $root/filter/commandtops $BASE/bin/filter
+ln -s $root/filter/gziptoany $BASE/bin/filter
+ln -s $root/filter/pstops $BASE/bin/filter
+ln -s $root/filter/rastertoepson $BASE/bin/filter
+ln -s $root/filter/rastertohp $BASE/bin/filter
+ln -s $root/filter/rastertolabel $BASE/bin/filter
+ln -s $root/filter/rastertopwg $BASE/bin/filter
+cat >$BASE/share/banners/standard <<EOF
+ ==== Cover Page ====
+
+
+ Job: {?printer-name}-{?job-id}
+ Owner: {?job-originating-user-name}
+ Name: {?job-name}
+ Pages: {?job-impressions}
+
+
+ ==== Cover Page ====
+EOF
+cat >$BASE/share/banners/classified <<EOF
+ ==== Classified - Do Not Disclose ====
+
+
+ Job: {?printer-name}-{?job-id}
+ Owner: {?job-originating-user-name}
+ Name: {?job-name}
+ Pages: {?job-impressions}
+
+
+ ==== Classified - Do Not Disclose ====
+EOF
+ln -s $root/data $BASE/share
+ln -s $root/ppdc/sample.drv $BASE/share/drv
+ln -s $root/conf/mime.types $BASE/share/mime
+ln -s $root/conf/mime.convs $BASE/share/mime
+ln -s $root/data/*.h $BASE/share/ppdc
+ln -s $root/data/*.defs $BASE/share/ppdc
+ln -s $root/templates $BASE/share
#
# Local filters and configuration files...
#
+instfilter() {
+ # instfilter src dst format
+ #
+ # See if the filter exists in a standard location; if so, make a
+ # symlink, otherwise create a dummy script for the specified format.
+ #
+ src="$1"
+ dst="$2"
+ format="$3"
+
+ for dir in /usr/local/libexec/cups/filter /usr/libexec/cups/filter /usr/lib/cups/filter; do
+ if test -x "$dir/$src"; then
+ ln -s "$dir/$src" "$BASE/bin/filter/$dst"
+ return
+ fi
+ done
+
+ # Source filter not present, create a dummy filter
+ case $format in
+ passthru)
+ ln -s gziptoany "$BASE/bin/filter/$dst"
+ ;;
+ pdf)
+ cat >"$BASE/bin/filter/$dst" <<EOF
+#!/bin/sh
+trap "" TERM
+trap "" PIPE
+gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
+case "\$5" in
+ *media=a4* | *media=iso_a4* | *PageSize=A4*)
+ gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-a4.pdf"
+ ;;
+ *)
+ gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-letter.pdf"
+ ;;
+esac
+EOF
+ chmod +x "$BASE/bin/filter/$dst"
+ ;;
+ ps)
+ cat >"$BASE/bin/filter/$dst" <<EOF
+#!/bin/sh
+trap "" TERM
+trap "" PIPE
+gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
+case "\$5" in
+ *media=a4* | *media=iso_a4* | *PageSize=A4*)
+ gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-a4.ps"
+ ;;
+ *)
+ gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-letter.ps"
+ ;;
+esac
+EOF
+ chmod +x "$BASE/bin/filter/$dst"
+ ;;
+ raster)
+ cat >"$BASE/bin/filter/$dst" <<EOF
+#!/bin/sh
+trap "" TERM
+trap "" PIPE
+gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
+case "\$5" in
+ *media=a4* | *media=iso_a4* | *PageSize=A4*)
+ gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-a4-300-black-1.pwg.gz"
+ ;;
+ *)
+ gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-letter-300-black-1.pwg.gz"
+ ;;
+esac
+EOF
+ chmod +x "$BASE/bin/filter/$dst"
+ ;;
+ esac
+}
+
+ln -s $root/test/test.convs $BASE/share/mime
+
if test `uname` = Darwin; then
- ln -s /usr/libexec/cups/filter/cgpdfto* /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/cgbannertopdf /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/cgimagetopdf /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/cgtexttopdf /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/nsimagetopdf /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/nstexttopdf /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/pictwpstops /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/pstoappleps /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/pstocupsraster /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/pstopdffilter /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/rastertourf /tmp/cups-$user/bin/filter
- ln -s /usr/libexec/cups/filter/xhtmltopdf /tmp/cups-$user/bin/filter
-
- if test -f /private/etc/cups/apple.types; then
- ln -s /private/etc/cups/apple.* /tmp/cups-$user/share/mime
- elif test -f /usr/share/cups/mime/apple.types; then
- ln -s /usr/share/cups/mime/apple.* /tmp/cups-$user/share/mime
- fi
+ instfilter cgimagetopdf imagetopdf pdf
+ instfilter cgpdftopdf pdftopdf passthru
+ instfilter cgpdftops pdftops ps
+ instfilter cgpdftoraster pdftoraster raster
+ instfilter cgtexttopdf texttopdf pdf
+ instfilter pstocupsraster pstoraster raster
else
- ln -s /usr/lib/cups/filter/bannertops /tmp/cups-$user/bin/filter
- ln -s /usr/lib/cups/filter/imagetops /tmp/cups-$user/bin/filter
- ln -s /usr/lib/cups/filter/imagetoraster /tmp/cups-$user/bin/filter
- ln -s /usr/lib/cups/filter/pdftops /tmp/cups-$user/bin/filter
- ln -s /usr/lib/cups/filter/texttops /tmp/cups-$user/bin/filter
-
- ln -s /usr/share/cups/mime/legacy.convs /tmp/cups-$user/share/mime
- ln -s /usr/share/cups/charsets /tmp/cups-$user/share
- if test -f $root/data/psglyphs; then
- ln -s /usr/share/cups/data/psglyphs $root/data
+ instfilter imagetopdf imagetopdf pdf
+ instfilter pdftopdf pdftopdf passthru
+ instfilter pdftops pdftops ps
+ instfilter pdftoraster pdftoraster raster
+ instfilter pstoraster pstoraster raster
+ instfilter texttopdf texttopdf pdf
+
+ if test -d /usr/share/cups/charsets; then
+ ln -s /usr/share/cups/charsets $BASE/share
fi
- ln -s /usr/share/cups/fonts /tmp/cups-$user/share
fi
#
@@ -387,18 +485,20 @@ else
encryption=""
fi
-cat >/tmp/cups-$user/cupsd.conf <<EOF
+cat >$BASE/cupsd.conf <<EOF
StrictConformance Yes
Browsing Off
Listen localhost:$port
+Listen $BASE/sock
PassEnv LOCALEDIR
PassEnv DYLD_INSERT_LIBRARIES
MaxSubscriptions 3
MaxLogSize 0
AccessLogLevel actions
-LogLevel debug2
+LogLevel $loglevel
LogTimeFormat usecs
PreserveJobHistory Yes
+PreserveJobFiles 5m
<Policy default>
<Limit All>
Order Allow,Deny
@@ -407,24 +507,32 @@ $encryption
</Policy>
EOF
-cat >/tmp/cups-$user/cups-files.conf <<EOF
+if test $testtype = 0; then
+ echo WebInterface yes >>$BASE/cupsd.conf
+fi
+
+cat >$BASE/cups-files.conf <<EOF
FileDevice yes
Printcap
User $user
-ServerRoot /tmp/cups-$user
-StateDir /tmp/cups-$user
-ServerBin /tmp/cups-$user/bin
-CacheDir /tmp/cups-$user/share
-DataDir /tmp/cups-$user/share
-FontPath /tmp/cups-$user/share/fonts
+ServerRoot $BASE
+StateDir $BASE
+ServerBin $BASE/bin
+CacheDir $BASE/share
+DataDir $BASE/share
+FontPath $BASE/share/fonts
DocumentRoot $root/doc
-RequestRoot /tmp/cups-$user/spool
-TempDir /tmp/cups-$user/spool/temp
-AccessLog /tmp/cups-$user/log/access_log
-ErrorLog /tmp/cups-$user/log/error_log
-PageLog /tmp/cups-$user/log/page_log
+RequestRoot $BASE/spool
+TempDir $BASE/spool/temp
+AccessLog $BASE/log/access_log
+ErrorLog $BASE/log/error_log
+PageLog $BASE/log/page_log
EOF
+if test $ssltype != 0 -a `uname` = Darwin; then
+ echo "ServerKeychain $HOME/Library/Keychains/login.keychain" >> $BASE/cups-files.conf
+fi
+
#
# Setup lots of test queues - half with PPD files, half without...
#
@@ -433,7 +541,7 @@ echo "Creating printers.conf for test..."
i=1
while test $i -le $nprinters1; do
- cat >>/tmp/cups-$user/printers.conf <<EOF
+ cat >>$BASE/printers.conf <<EOF
<Printer test-$i>
Accepting Yes
DeviceURI file:/dev/null
@@ -445,13 +553,13 @@ StateMessage Printer $1 is idle.
</Printer>
EOF
- cp testps.ppd /tmp/cups-$user/ppd/test-$i.ppd
+ cp testps.ppd $BASE/ppd/test-$i.ppd
i=`expr $i + 1`
done
while test $i -le $nprinters2; do
- cat >>/tmp/cups-$user/printers.conf <<EOF
+ cat >>$BASE/printers.conf <<EOF
<Printer test-$i>
Accepting Yes
DeviceURI file:/dev/null
@@ -466,10 +574,10 @@ EOF
i=`expr $i + 1`
done
-if test -f /tmp/cups-$user/printers.conf; then
- cp /tmp/cups-$user/printers.conf /tmp/cups-$user/printers.conf.orig
+if test -f $BASE/printers.conf; then
+ cp $BASE/printers.conf $BASE/printers.conf.orig
else
- touch /tmp/cups-$user/printers.conf.orig
+ touch $BASE/printers.conf.orig
fi
#
@@ -509,17 +617,17 @@ fi
export SHLIB_PATH
CUPS_DISABLE_APPLE_DEFAULT=yes; export CUPS_DISABLE_APPLE_DEFAULT
-CUPS_SERVER=localhost:8631; export CUPS_SERVER
-CUPS_SERVERROOT=/tmp/cups-$user; export CUPS_SERVERROOT
-CUPS_STATEDIR=/tmp/cups-$user; export CUPS_STATEDIR
-CUPS_DATADIR=/tmp/cups-$user/share; export CUPS_DATADIR
-LOCALEDIR=/tmp/cups-$user/share/locale; export LOCALEDIR
+CUPS_SERVER=localhost:$port; export CUPS_SERVER
+CUPS_SERVERROOT=$BASE; export CUPS_SERVERROOT
+CUPS_STATEDIR=$BASE; export CUPS_STATEDIR
+CUPS_DATADIR=$BASE/share; export CUPS_DATADIR
+LOCALEDIR=$BASE/share/locale; export LOCALEDIR
#
# Set a new home directory to avoid getting user options mixed in...
#
-HOME=/tmp/cups-$user
+HOME=$BASE
export HOME
#
@@ -537,25 +645,24 @@ export LC_MESSAGES
#
echo "Starting scheduler:"
-echo " $VALGRIND ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &"
+echo " $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &"
echo ""
if test `uname` = Darwin -a "x$VALGRIND" = x; then
- DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib
- ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+ DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib MallocStackLogging=1 ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &
else
- $VALGRIND ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+ $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &
fi
cupsd=$!
if test "x$testtype" = x0; then
# Not running tests...
- echo "Scheduler is PID $cupsd and is listening on port 8631."
+ echo "Scheduler is PID $cupsd and is listening on port $port."
echo ""
# Create a helper script to run programs with...
- runcups="/tmp/cups-$user/runcups"
+ runcups="$BASE/runcups"
echo "#!/bin/sh" >$runcups
echo "# Helper script for running CUPS test instance." >>$runcups
@@ -570,6 +677,11 @@ if test "x$testtype" = x0; then
echo "LD_PRELOAD=\"$LD_PRELOAD\"; export LD_PRELOAD" >>$runcups
echo "LOCALEDIR=\"$LOCALEDIR\"; export LOCALEDIR" >>$runcups
echo "SHLIB_PATH=\"$SHLIB_PATH\"; export SHLIB_PATH" >>$runcups
+ if test "x$CUPS_DEBUG_LEVEL" != x; then
+ echo "CUPS_DEBUG_FILTER='$CUPS_DEBUG_FILTER'; export CUPS_DEBUG_FILTER" >>$runcups
+ echo "CUPS_DEBUG_LEVEL=$CUPS_DEBUG_LEVEL; export CUPS_DEBUG_LEVEL" >>$runcups
+ echo "CUPS_DEBUG_LOG='$CUPS_DEBUG_LOG'; export CUPS_DEBUG_LOG" >>$runcups
+ fi
echo "" >>$runcups
echo "# Run command..." >>$runcups
echo "exec \"\$@\"" >>$runcups
@@ -608,7 +720,13 @@ done
#
date=`date "+%Y-%m-%d"`
-strfile=/tmp/cups-$user/cups-str-1.6-$date-$user.html
+
+if test -d $root/.svn; then
+ rev=`svn info . | grep Revision: | awk '{print $2}'`
+ strfile=$BASE/cups-str-2.1-r$rev-$user.html
+else
+ strfile=$BASE/cups-str-2.1-$date-$user.html
+fi
rm -f $strfile
cat str-header.html >$strfile
@@ -620,7 +738,7 @@ cat str-header.html >$strfile
echo ""
echo "Running IPP compliance tests..."
-echo "<H1>1 - IPP Compliance Tests</H1>" >>$strfile
+echo "<H1><A NAME='IPP'>1 - IPP Compliance Tests</A></H1>" >>$strfile
echo "<P>This section provides the results to the IPP compliance tests" >>$strfile
echo "outlined in the CUPS Software Test Plan. These tests were run on" >>$strfile
echo `date "+%Y-%m-%d"` by $user on `hostname`. >>$strfile
@@ -658,7 +776,7 @@ echo "</PRE>" >>$strfile
echo ""
echo "Running command tests..."
-echo "<H1>2 - Command Tests</H1>" >>$strfile
+echo "<H1><A NAME='COMMAND'>2 - Command Tests</A></H1>" >>$strfile
echo "<P>This section provides the results to the command tests" >>$strfile
echo "outlined in the CUPS Software Test Plan. These tests were run on" >>$strfile
echo $date by $user on `hostname`. >>$strfile
@@ -680,19 +798,51 @@ for file in 5*.sh; do
fi
done
-echo "</PRE>" >>$strfile
+#
+# Log all allocations made by the scheduler...
+#
+if test `uname` = Darwin -a "x$VALGRIND" = x; then
+ malloc_history $cupsd -callTree -showContent >$BASE/log/malloc_log 2>&1
+fi
#
-# Stop the server...
+# Restart the server...
#
-kill $cupsd
+echo $ac_n "Performing restart test: $ac_c"
+echo "" >>$strfile
+echo "\"5.10-restart\":" >>$strfile
+
+kill -HUP $cupsd
+
+while true; do
+ sleep 10
+
+ running=`../systemv/lpstat -r 2>/dev/null`
+ if test "x$running" = "xscheduler is running"; then
+ break
+ fi
+done
+
+description="`../systemv/lpstat -l -p Test1 | grep Description | sed -e '1,$s/^[^:]*: //g'`"
+if test "x$description" != "xTest Printer 1"; then
+ echo "Failed, printer-info for Test1 is '$description', expected 'Test Printer 1'." >>$strfile
+ echo "FAIL (got '$description', expected 'Test Printer 1')"
+ fail=`expr $fail + 1`
+else
+ echo "Passed." >>$strfile
+ echo PASS
+fi
+
+echo "</PRE>" >>$strfile
#
-# Append the log files for post-mortim...
+# Stop the server...
#
-echo "<H1>3 - Log Files</H1>" >>$strfile
+kill $cupsd
+wait $cupsd
+cupsdstatus=$?
#
# Verify counts...
@@ -700,10 +850,19 @@ echo "<H1>3 - Log Files</H1>" >>$strfile
echo "Test Summary"
echo ""
-echo "<H2>Summary</H2>" >>$strfile
+echo "<H1><A NAME='SUMMARY'>3 - Test Summary</A></H1>" >>$strfile
+
+if test $cupsdstatus != 0; then
+ echo "FAIL: cupsd failed with exit status $cupsdstatus."
+ echo "<p>FAIL: cupsd failed with exit status $cupsdstatus.</p>" >>$strfile
+ fail=`expr $fail + 1`
+else
+ echo "PASS: cupsd exited with no errors."
+ echo "<p>PASS: cupsd exited with no errors.</p>" >>$strfile
+fi
# Job control files
-count=`ls -1 /tmp/cups-$user/spool | wc -l`
+count=`ls -1 $BASE/spool | wc -l`
count=`expr $count - 1`
if test $count != 0; then
echo "FAIL: $count job control files were not purged."
@@ -715,7 +874,7 @@ else
fi
# Pages printed on Test1 (within 1 page for timing-dependent cancel issues)
-count=`$GREP '^Test1 ' /tmp/cups-$user/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
+count=`$GREP '^Test1 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
expected=`expr $pjobs \* 2 + 34`
expected2=`expr $expected + 2`
if test $count -lt $expected -a $count -gt $expected2; then
@@ -728,7 +887,7 @@ else
fi
# Paged printed on Test2
-count=`$GREP '^Test2 ' /tmp/cups-$user/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
+count=`$GREP '^Test2 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
expected=`expr $pjobs \* 2 + 3`
if test $count != $expected; then
echo "FAIL: Printer 'Test2' produced $count page(s), expected $expected."
@@ -740,7 +899,7 @@ else
fi
# Paged printed on Test3
-count=`$GREP '^Test3 ' /tmp/cups-$user/log/page_log | grep -v total | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
+count=`$GREP '^Test3 ' $BASE/log/page_log | grep -v total | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
expected=2
if test $count != $expected; then
echo "FAIL: Printer 'Test3' produced $count page(s), expected $expected."
@@ -752,8 +911,8 @@ else
fi
# Requests logged
-count=`wc -l /tmp/cups-$user/log/access_log | awk '{print $1}'`
-expected=`expr 37 + 18 + 28 + $pjobs \* 8 + $pprinters \* $pjobs \* 4`
+count=`wc -l $BASE/log/access_log | awk '{print $1}'`
+expected=`expr 37 + 18 + 30 + $pjobs \* 8 + $pprinters \* $pjobs \* 4`
if test $count != $expected; then
echo "FAIL: $count requests logged, expected $expected."
echo "<P>FAIL: $count requests logged, expected $expected.</P>" >>$strfile
@@ -764,11 +923,11 @@ else
fi
# Did CUPS-Get-Default get logged?
-if $GREP -q CUPS-Get-Default /tmp/cups-$user/log/access_log; then
+if $GREP -q CUPS-Get-Default $BASE/log/access_log; then
echo "FAIL: CUPS-Get-Default logged with 'AccessLogLevel actions'"
echo "<P>FAIL: CUPS-Get-Default logged with 'AccessLogLevel actions'</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP CUPS-Get-Default /tmp/cups-$user/log/access_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP CUPS-Get-Default $BASE/log/access_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -777,13 +936,13 @@ else
fi
# Emergency log messages
-count=`$GREP '^X ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^X ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count != 0; then
echo "FAIL: $count emergency messages, expected 0."
- $GREP '^X ' /tmp/cups-$user/log/error_log
+ $GREP '^X ' $BASE/log/error_log
echo "<P>FAIL: $count emergency messages, expected 0.</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP '^X ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP '^X ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -792,13 +951,13 @@ else
fi
# Alert log messages
-count=`$GREP '^A ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^A ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count != 0; then
echo "FAIL: $count alert messages, expected 0."
- $GREP '^A ' /tmp/cups-$user/log/error_log
+ $GREP '^A ' $BASE/log/error_log
echo "<P>FAIL: $count alert messages, expected 0.</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP '^A ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP '^A ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -807,13 +966,13 @@ else
fi
# Critical log messages
-count=`$GREP '^C ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^C ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count != 0; then
echo "FAIL: $count critical messages, expected 0."
- $GREP '^C ' /tmp/cups-$user/log/error_log
+ $GREP '^C ' $BASE/log/error_log
echo "<P>FAIL: $count critical messages, expected 0.</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP '^C ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP '^C ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -822,13 +981,13 @@ else
fi
# Error log messages
-count=`$GREP '^E ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^E ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count != 33; then
echo "FAIL: $count error messages, expected 33."
- $GREP '^E ' /tmp/cups-$user/log/error_log
+ $GREP '^E ' $BASE/log/error_log
echo "<P>FAIL: $count error messages, expected 33.</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP '^E ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP '^E ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -837,13 +996,13 @@ else
fi
# Warning log messages
-count=`$GREP '^W ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
-if test $count != 9; then
- echo "FAIL: $count warning messages, expected 9."
- $GREP '^W ' /tmp/cups-$user/log/error_log
- echo "<P>FAIL: $count warning messages, expected 9.</P>" >>$strfile
+count=`$GREP '^W ' $BASE/log/error_log | $GREP -v CreateProfile | wc -l | awk '{print $1}'`
+if test $count != 8; then
+ echo "FAIL: $count warning messages, expected 8."
+ $GREP '^W ' $BASE/log/error_log
+ echo "<P>FAIL: $count warning messages, expected 8.</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP '^W ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP '^W ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -852,13 +1011,13 @@ else
fi
# Notice log messages
-count=`$GREP '^N ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^N ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count != 0; then
echo "FAIL: $count notice messages, expected 0."
- $GREP '^N ' /tmp/cups-$user/log/error_log
+ $GREP '^N ' $BASE/log/error_log
echo "<P>FAIL: $count notice messages, expected 0.</P>" >>$strfile
echo "<PRE>" >>$strfile
- $GREP '^N ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+ $GREP '^N ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
fail=`expr $fail + 1`
else
@@ -867,7 +1026,7 @@ else
fi
# Info log messages
-count=`$GREP '^I ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^I ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count = 0; then
echo "FAIL: $count info messages, expected more than 0."
echo "<P>FAIL: $count info messages, expected more than 0.</P>" >>$strfile
@@ -878,7 +1037,7 @@ else
fi
# Debug log messages
-count=`$GREP '^D ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^D ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count = 0; then
echo "FAIL: $count debug messages, expected more than 0."
echo "<P>FAIL: $count debug messages, expected more than 0.</P>" >>$strfile
@@ -889,7 +1048,7 @@ else
fi
# Debug2 log messages
-count=`$GREP '^d ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^d ' $BASE/log/error_log | wc -l | awk '{print $1}'`
if test $count = 0; then
echo "FAIL: $count debug2 messages, expected more than 0."
echo "<P>FAIL: $count debug2 messages, expected more than 0.</P>" >>$strfile
@@ -899,20 +1058,25 @@ else
echo "<P>PASS: $count debug2 messages.</P>" >>$strfile
fi
+#
# Log files...
-echo "<H2>access_log</H2>" >>$strfile
+#
+
+echo "<H1><A NAME='LOGS'>4 - Log Files</A></H1>" >>$strfile
+
+echo "<H2><A NAME='access_log'>access_log</A></H2>" >>$strfile
echo "<PRE>" >>$strfile
-sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' /tmp/cups-$user/log/access_log >>$strfile
+sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' $BASE/log/access_log >>$strfile
echo "</PRE>" >>$strfile
-echo "<H2>error_log</H2>" >>$strfile
+echo "<H2><A NAME='error_log'>error_log</A></H2>" >>$strfile
echo "<PRE>" >>$strfile
-$GREP -v '^d' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+$GREP -v '^d' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
echo "</PRE>" >>$strfile
-echo "<H2>page_log</H2>" >>$strfile
+echo "<H2><A NAME='page_log'>page_log</A></H2>" >>$strfile
echo "<PRE>" >>$strfile
-sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' /tmp/cups-$user/log/page_log >>$strfile
+sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' $BASE/log/page_log >>$strfile
echo "</PRE>" >>$strfile
#
@@ -925,13 +1089,19 @@ echo ""
if test $fail != 0; then
echo "$fail tests failed."
- cp /tmp/cups-$user/log/error_log error_log-$date-$user
+
+ if test -d $root/.svn; then
+ cp $BASE/log/error_log error_log-r$rev-$user
+ else
+ cp $BASE/log/error_log error_log-$date-$user
+ fi
+
cp $strfile .
else
echo "All tests were successful."
fi
-echo "Log files can be found in /tmp/cups-$user/log."
+echo "Log files can be found in $BASE/log."
echo "A HTML report was created in $strfile."
echo ""
@@ -944,5 +1114,5 @@ if test $fail != 0; then
fi
#
-# End of "$Id: run-stp-tests.sh 9034 2010-03-09 07:03:06Z mike $"
+# End of "$Id: run-stp-tests.sh 12853 2015-08-28 13:38:46Z msweet $"
#
diff --git a/test/str-header.html b/test/str-header.html
index 64a3425..d13205a 100644
--- a/test/str-header.html
+++ b/test/str-header.html
@@ -1,10 +1,10 @@
<HTML>
<HEAD>
<META NAME="Description" CONTENT="CUPS Test Report">
- <META NAME="COPYRIGHT" CONTENT="Copyright 2007-2012, All Rights Reserved">
- <META NAME="DOCNUMBER" CONTENT="CUPS-STR-1.6">
+ <META NAME="COPYRIGHT" CONTENT="Copyright 2007-2015, All Rights Reserved">
+ <META NAME="DOCNUMBER" CONTENT="CUPS-STR-2.1">
<META NAME="Author" CONTENT="Apple Inc.">
- <TITLE>CUPS 1.6 Software Test Report</TITLE>
+ <TITLE>CUPS 2.1 Software Test Report</TITLE>
<STYLE TYPE="text/css"><!--
PRE {
font-size: 80%;
@@ -14,17 +14,22 @@
</HEAD>
<BODY>
-<H1>CUPS 1.6 Software Test Report</H1>
+<H1>CUPS 2.1 Software Test Report</H1>
<P>This software test report provides detailed test results that
-are used to evaluate the stability and compliance of CUPS Version 1.6.
+are used to evaluate the stability and compliance of CUPS Version 2.1.
<H2>Document Overview</H2>
<P>This software test plan is organized into the following sections:
<UL>
- <LI>1 - IPP Compliance Tests</LI>
- <LI>2 - Command Tests</LI>
- <LI>3 - Log Files</LI>
+ <LI><A HREF="#IPP">1 - IPP Compliance Tests</A></LI>
+ <LI><A HREF="#COMMAND">2 - Command Tests</A></LI>
+ <LI><A HREF="#SUMMARY">3 - Test Summary</A></LI>
+ <LI><A HREF="#LOGS">4 - Log Files</A><UL>
+ <LI><A HREF="#access_log">access_log</A></LI>
+ <LI><A HREF="#error_log">error_log</A></LI>
+ <LI><A HREF="#page_log">page_log</A></LI>
+ </UL></LI>
</UL>
diff --git a/test/test.convs b/test/test.convs
new file mode 100644
index 0000000..57540aa
--- /dev/null
+++ b/test/test.convs
@@ -0,0 +1,8 @@
+# Test file listing potential filters for conversions
+application/pdf application/vnd.cups-pdf 100 pdftopdf
+application/pdf application/postscript 100 pdftops
+application/pdf application/vnd.cups-raster 100 pdftoraster
+application/postscript application/vnd.cups-raster 100 pstoraster
+image/jpeg application/pdf 100 imagetopdf
+text/plain application/pdf 100 texttopdf
+
diff --git a/test/testhp.ppd b/test/testhp.ppd
index 6200c7a..a71994e 100644
--- a/test/testhp.ppd
+++ b/test/testhp.ppd
@@ -1,32 +1,32 @@
*PPD-Adobe: "4.3"
*%
-*% "$Id: testhp.ppd 6649 2007-07-11 21:46:42Z mike $"
+*% "$Id: testhp.ppd 11398 2013-11-06 20:11:11Z msweet $"
*%
-*% Test HP PPD file for CUPS.
+*% Test HP PPD file for CUPS.
*%
-*% Copyright 2007-2011 by Apple Inc.
-*% Copyright 1997-2005 by Easy Software Products.
+*% Copyright 2007-2013 by Apple Inc.
+*% Copyright 1997-2005 by Easy Software Products.
*%
-*% These coded instructions, statements, and computer programs are the
-*% property of Apple Inc. and are protected by Federal copyright
-*% law. Distribution and use rights are outlined in the file "LICENSE.txt"
-*% which should have been included with this file. If this file is
-*% file is missing or damaged, see the license at "http://www.cups.org/".
+*% These coded instructions, statements, and computer programs are the
+*% property of Apple Inc. and are protected by Federal copyright
+*% law. Distribution and use rights are outlined in the file "LICENSE.txt"
+*% which should have been included with this file. If this file is
+*% file is missing or damaged, see the license at "http://www.cups.org/".
*%
*FormatVersion: "4.3"
-*FileVersion: "1.1"
+*FileVersion: "1.7"
*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*PCFileName: "TESTHP.PPD"
*Manufacturer: "ESP"
*Product: "(CUPS v1.5)"
-*cupsVersion: 1.1
+*cupsVersion: 1.7
*cupsManualCopies: True
*cupsFilter: "application/vnd.cups-raster 50 rastertohp"
*cupsFilter2: "application/vnd.cups-raster application/vnd.hp-pcl 50 rastertohp"
*ModelName: "Test HP Printer"
*ShortNickName: "Test HP Printer"
-*NickName: "Test HP Printer CUPS v1.1"
+*NickName: "Test HP Printer CUPS v1.7"
*PSVersion: "(3010.000) 550"
*LanguageLevel: "3"
*ColorDevice: True
@@ -133,9 +133,10 @@
*OpenUI *Resolution/Output Resolution: PickOne
*OrderDependency: 20 AnySetup *Resolution
-*DefaultResolution: 100dpi
-*Resolution 75dpi/75 DPI: "<</HWResolution[75 75]>>setpagedevice"
-*Resolution 100dpi/100 DPI: "<</HWResolution[100 100]>>setpagedevice"
+*DefaultResolution: 300dpi
+*Resolution 150dpi/150 DPI: "<</HWResolution[150 150]>>setpagedevice"
+*Resolution 300dpi/300 DPI: "<</HWResolution[300 300]>>setpagedevice"
+*Resolution 600dpi/600 DPI: "<</HWResolution[600 600]>>setpagedevice"
*CloseUI: *Resolution
*OpenUI *ColorModel/Output Mode: PickOne
@@ -183,5 +184,5 @@
*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
*Font ZapfDingbats: Special "(001.004S)" Standard ROM
*%
-*% End of "$Id: testhp.ppd 6649 2007-07-11 21:46:42Z mike $".
+*% End of "$Id: testhp.ppd 11398 2013-11-06 20:11:11Z msweet $".
*%
diff --git a/test/testps.ppd b/test/testps.ppd
index 10b4a37..6251d06 100644
--- a/test/testps.ppd
+++ b/test/testps.ppd
@@ -1,6 +1,6 @@
*PPD-Adobe: "4.3"
*%
-*% "$Id: testps.ppd 6649 2007-07-11 21:46:42Z mike $"
+*% "$Id: testps.ppd 11398 2013-11-06 20:11:11Z msweet $"
*%
*% Test PS PPD file for CUPS.
*%
@@ -179,5 +179,5 @@
*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
*Font ZapfDingbats: Special "(001.004S)" Standard ROM
*%
-*% End of "$Id: testps.ppd 6649 2007-07-11 21:46:42Z mike $".
+*% End of "$Id: testps.ppd 11398 2013-11-06 20:11:11Z msweet $".
*%
diff --git a/test/validate-job.test b/test/validate-job.test
new file mode 100644
index 0000000..c4140ea
--- /dev/null
+++ b/test/validate-job.test
@@ -0,0 +1,23 @@
+# Validate a test page using Validate-Job
+{
+ # The name of the test...
+ NAME "Validate file/ticket using Validate-Job"
+
+ # The operation to use
+ OPERATION Validate-Job
+
+ # Attributes, starting in the operation group...
+ GROUP operation-attributes-tag
+ ATTR charset attributes-charset utf-8
+ ATTR language attributes-natural-language en
+ ATTR uri printer-uri $uri
+ ATTR name requesting-user-name $user
+ ATTR mimeMediaType document-format $filetype
+
+ GROUP job-attributes-tag
+ ATTR integer copies 1
+
+ # What statuses are OK?
+ STATUS successful-ok
+ STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/xmltotest.c b/test/xmltotest.c
index fdb9f93..143f241 100644
--- a/test/xmltotest.c
+++ b/test/xmltotest.c
@@ -1,5 +1,5 @@
/*
- * "$Id: xmltotest.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: xmltotest.c 3643 2012-02-13 16:35:48Z msweet $"
*
* IANA XML registration to test file generator for CUPS.
*
@@ -525,5 +525,5 @@ main(void)
/*
- * End of "$Id: xmltotest.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: xmltotest.c 3643 2012-02-13 16:35:48Z msweet $".
*/
diff --git a/vc2005/cups.sln b/vc2005/cups.sln
deleted file mode 100644
index e510e16..0000000
--- a/vc2005/cups.sln
+++ /dev/null
@@ -1,78 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcups2", "libcups2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcupsimage2", "libcupsimage2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E1234}"
- ProjectSection(ProjectDependencies) = postProject
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testfile", "testfile.vcproj", "{CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}"
- ProjectSection(ProjectDependencies) = postProject
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testhttp", "testhttp.vcproj", "{90B0058C-8393-411F-BD3B-E2C831D4E883}"
- ProjectSection(ProjectDependencies) = postProject
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cupstestppd", "cupstestppd.vcproj", "{6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}"
- ProjectSection(ProjectDependencies) = postProject
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234} = {CB4AA6F2-3E84-45BE-B505-95CD375E1234}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.ActiveCfg = Debug|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.Build.0 = Debug|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.ActiveCfg = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.Build.0 = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.ActiveCfg = Debug|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.Build.0 = Debug|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.ActiveCfg = Debug|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.Build.0 = Debug|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.ActiveCfg = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.Build.0 = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.ActiveCfg = Release|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.Build.0 = Release|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.ActiveCfg = Release|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.Build.0 = Release|x64
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.ActiveCfg = Debug|Win32
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.Build.0 = Debug|Win32
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.ActiveCfg = Debug|x64
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.Build.0 = Debug|x64
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.ActiveCfg = Debug|Win32
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.Build.0 = Debug|Win32
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.ActiveCfg = Debug|x64
- {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.Build.0 = Debug|x64
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.ActiveCfg = Debug|Win32
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.Build.0 = Debug|Win32
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.ActiveCfg = Debug|x64
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.Build.0 = Debug|x64
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.ActiveCfg = Debug|Win32
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.Build.0 = Debug|Win32
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.ActiveCfg = Debug|x64
- {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.Build.0 = Debug|x64
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.ActiveCfg = Debug|Win32
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.Build.0 = Debug|Win32
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.ActiveCfg = Debug|x64
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.Build.0 = Debug|x64
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.ActiveCfg = Release|Win32
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.Build.0 = Release|Win32
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.ActiveCfg = Release|x64
- {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/vc2005/ipptool.vcproj b/vc2005/ipptool.vcproj
deleted file mode 100644
index 271187b..0000000
--- a/vc2005/ipptool.vcproj
+++ /dev/null
@@ -1,199 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="cupstestppd"
- ProjectGUID="{B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}"
- RootNamespace="ipptool"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\vcnet;.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="1"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\vcnet;.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="1"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\test\ipptool.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/vc2005/libcups2.vcproj b/vc2005/libcups2.vcproj
deleted file mode 100644
index 0498185..0000000
--- a/vc2005/libcups2.vcproj
+++ /dev/null
@@ -1,1611 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="libcups2"
- ProjectGUID="{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- BufferSecurityCheck="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
- OutputFile="$(OutDir)\libcups2.dll"
- LinkIncremental="2"
- ModuleDefinitionFile="..\cups\libcups2.def"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcups2.pdb"
- SubSystem="2"
- ImportLibrary="$(OutDir)\libcups2.lib"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- BufferSecurityCheck="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
- OutputFile="$(OutDir)\libcups2.dll"
- LinkIncremental="2"
- ModuleDefinitionFile="..\cups\libcups2.def"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcups2.pdb"
- SubSystem="2"
- ImportLibrary="$(OutDir)\libcups2.lib"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
- OutputFile="$(OutDir)\libcups2.dll"
- LinkIncremental="1"
- ModuleDefinitionFile="..\cups\libcups2.def"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="libcups2.pdb"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- ImportLibrary="$(OutDir)\libcups2.lib"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot; mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot; &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
- OutputFile="$(OutDir)\libcups2.dll"
- LinkIncremental="1"
- ModuleDefinitionFile="..\cups\libcups2.def"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="libcups2.pdb"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- ImportLibrary="$(OutDir)\libcups2.lib"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot; mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot; &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\cups\adminutil.c"
- >
- </File>
- <File
- RelativePath="..\cups\array.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\attr.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\auth.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\backend.c"
- >
- </File>
- <File
- RelativePath="..\cups\conflicts.c"
- >
- </File>
- <File
- RelativePath="..\cups\custom.c"
- >
- </File>
- <File
- RelativePath="..\cups\dest.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\dir.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\emit.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\encode.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\file.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\getdevices.c"
- >
- </File>
- <File
- RelativePath="..\cups\getputfile.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\globals.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\http-addr.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\http-addrlist.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\http-support.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\http.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\ipp-support.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\ipp.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\langprintf.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\language.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\localize.c"
- >
- </File>
- <File
- RelativePath="..\cups\mark.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\md5.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\md5passwd.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\notify.c"
- >
- </File>
- <File
- RelativePath="..\cups\options.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\page.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\ppd.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\pwg-file.c"
- >
- </File>
- <File
- RelativePath="..\cups\pwg-media.c"
- >
- </File>
- <File
- RelativePath="..\cups\pwg-ppd.c"
- >
- </File>
- <File
- RelativePath="..\cups\request.c"
- >
- </File>
- <File
- RelativePath="..\cups\snmp.c"
- >
- </File>
- <File
- RelativePath="..\cups\snprintf.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\sspi.c"
- >
- </File>
- <File
- RelativePath="..\cups\string.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\tempfile.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\thread.c"
- >
- </File>
- <File
- RelativePath="..\cups\transcode.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\usersys.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\cups\util.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32"
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\cups\adminutil.h"
- >
- </File>
- <File
- RelativePath="..\cups\array.h"
- >
- </File>
- <File
- RelativePath="..\cups\backend.h"
- >
- </File>
- <File
- RelativePath="..\cups\cups-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\cups.h"
- >
- </File>
- <File
- RelativePath="..\cups\debug-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\dir.h"
- >
- </File>
- <File
- RelativePath="..\cups\file-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\file.h"
- >
- </File>
- <File
- RelativePath="..\cups\http-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\http.h"
- >
- </File>
- <File
- RelativePath="..\cups\ipp-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\ipp.h"
- >
- </File>
- <File
- RelativePath="..\cups\language-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\language.h"
- >
- </File>
- <File
- RelativePath="..\cups\md5-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\ppd-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\ppd.h"
- >
- </File>
- <File
- RelativePath="..\cups\pwg-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\sspi-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\string-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\thread-private.h"
- >
- </File>
- <File
- RelativePath="..\cups\transcode.h"
- >
- </File>
- <File
- RelativePath="..\cups\versioning.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/vc2005/testfile.vcproj b/vc2005/testfile.vcproj
deleted file mode 100644
index edebe63..0000000
--- a/vc2005/testfile.vcproj
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="testfile"
- ProjectGUID="{CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="Debug"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\vcnet;.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile="Debug\testfile.exe"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/testfile.pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="Release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\vcnet;.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="0"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile="testfile.exe"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\cups\testfile.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/vc2005/testhttp.vcproj b/vc2005/testhttp.vcproj
deleted file mode 100644
index 77501a2..0000000
--- a/vc2005/testhttp.vcproj
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="testhttp"
- ProjectGUID="{90B0058C-8393-411F-BD3B-E2C831D4E883}"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="Debug"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\vcnet;.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile="Debug\testhttp.exe"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/testhttp.pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="Release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\vcnet;.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="0"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile="testhttp.exe"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\cups\testhttp.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/vcnet/README.txt b/vcnet/README.txt
new file mode 100644
index 0000000..4637da3
--- /dev/null
+++ b/vcnet/README.txt
@@ -0,0 +1,27 @@
+README - CUPS v1.7b1 - 2013-04-18
+---------------------------------
+
+INTRODUCTION
+
+ This package includes the cupstestppd and ipptool utilities, CUPS API
+ libraries libcups2.dll and libcupsimage2.dll, and the import libraries and
+ headers needed to develop Windows applications that use the CUPS API to
+ communicate with CUPS and other IPP services.
+
+ See the file "IPPTOOL.txt" for instructions on using the ipptool utility.
+
+
+LEGAL STUFF
+
+ CUPS is Copyright 2007-2013 by Apple Inc. CUPS and the CUPS logo are
+ trademarks of Apple Inc.
+
+ The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+
+ This software is based in part on the work of the Independent JPEG Group.
+
+ CUPS is provided under the terms of version 2 of the GNU General Public
+ License and GNU Library General Public License. This program is distributed
+ in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the "doc/help/license.html" or "LICENSE.txt" files for more information.
diff --git a/vcnet/config.h b/vcnet/config.h
index 82c039f..345c6d8 100644
--- a/vcnet/config.h
+++ b/vcnet/config.h
@@ -1,16 +1,16 @@
/*
- * "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $"
*
- * Configuration file for CUPS on Windows.
+ * Configuration file for CUPS on Windows.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#ifndef _CUPS_CONFIG_H_
@@ -54,9 +54,19 @@
/*
+ * Map the POSIX strcasecmp() and strncasecmp() functions to the Win32 stricmp()
+ * and strnicmp() functions...
+ */
+
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+
+
+/*
* Map the POSIX sleep() and usleep() functions to the Win32 Sleep() function...
*/
+typedef unsigned long useconds_t;
#define sleep(X) Sleep(1000 * (X))
#define usleep(X) Sleep((X)/1000)
@@ -70,7 +80,7 @@
# define R_OK 04
# define O_RDONLY _O_RDONLY
# define O_WRONLY _O_WRONLY
-# define O_CREATE _O_CREAT
+# define O_CREAT _O_CREAT
# define O_TRUNC _O_TRUNC
@@ -86,8 +96,8 @@
* Version of software...
*/
-#define CUPS_SVERSION "CUPS v1.6.3"
-#define CUPS_MINIMAL "CUPS/1.6.3"
+#define CUPS_SVERSION "CUPS v2.1.2"
+#define CUPS_MINIMAL "CUPS/2.1.2"
/*
@@ -104,7 +114,7 @@
* Default file permissions...
*/
-#define CUPS_DEFAULT_CONFIG_FILE_PERM 0644
+#define CUPS_DEFAULT_CONFIG_FILE_PERM 0640
#define CUPS_DEFAULT_LOG_FILE_PERM 0644
@@ -128,12 +138,8 @@
*/
#define CUPS_DEFAULT_BROWSING 1
-#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "CUPS dnssd"
-#define CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS ""
-#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 1
+#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS ""
#define CUPS_DEFAULT_DEFAULT_SHARED 1
-#define CUPS_DEFAULT_IMPLICIT_CLASSES 1
-#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 0
/*
@@ -166,13 +172,20 @@
/*
- * Do we have domain socket support?
+ * Do we have domain socket support, and if so what is the default one?
*/
#undef CUPS_DEFAULT_DOMAINSOCKET
/*
+ * Default WebInterface value...
+ */
+
+#undef CUPS_DEFAULT_WEBIF
+
+
+/*
* Where are files stored?
*
* Note: These are defaults, which can be overridden by environment
@@ -194,23 +207,25 @@
/*
- * Do we have various image libraries?
+ * Do we have posix_spawn?
*/
-/* #undef HAVE_LIBPNG */
-/* #undef HAVE_LIBZ */
-/* #undef HAVE_LIBJPEG */
-/* #undef HAVE_LIBTIFF */
+/* #undef HAVE_POSIX_SPAWN */
+
+
+/*
+ * Do we have ZLIB?
+ */
+
+#define HAVE_LIBZ 1
+#define HAVE_INFLATECOPY 1
/*
* Do we have PAM stuff?
*/
-#ifndef HAVE_LIBPAM
#define HAVE_LIBPAM 0
-#endif /* !HAVE_LIBPAM */
-
/* #undef HAVE_PAM_PAM_APPL_H */
/* #undef HAVE_PAM_SET_ITEM */
/* #undef HAVE_PAM_SETCRED */
@@ -231,10 +246,10 @@
/*
- * Do we have <scsi/sg.h>?
+ * Use <stdint.h>?
*/
-/* #undef HAVE_SCSI_SG_H */
+/* #undef HAVE_STDINT_H */
/*
@@ -354,41 +369,37 @@
/* #undef HAVE_CDSASSL */
/* #undef HAVE_GNUTLS */
-/* #undef HAVE_LIBSSL */
#define HAVE_SSPISSL
#define HAVE_SSL
/*
- * What Security framework headers do we have?
+ * Do we have the gnutls_transport_set_pull_timeout_function function?
*/
-/* #undef HAVE_AUTHORIZATION_H */
-/* #undef HAVE_SECPOLICY_H */
-/* #undef HAVE_SECPOLICYPRIV_H */
-/* #undef HAVE_SECBASEPRIV_H */
-/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */
-
-
-/*
- * Do we have the SecIdentitySearchCreateWithPolicy function?
- */
-
-/* #undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY */
+/* #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */
/*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the gnutls_priority_set_direct function?
*/
-/* #undef HAVE_SECPOLICYCREATESSL */
+/* #undef HAVE_GNUTLS_PRIORITY_SET_DIRECT */
/*
- * Do we have the SecPolicyCreateSSL function?
+ * What Security framework headers do we have?
*/
-/* #undef HAVE_SECPOLICYCREATESSL */
+/* #undef HAVE_AUTHORIZATION_H */
+/* #undef HAVE_SECBASEPRIV_H */
+/* #undef HAVE_SECCERTIFICATE_H */
+/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */
+/* #undef HAVE_SECITEM_H */
+/* #undef HAVE_SECITEMPRIV_H */
+/* #undef HAVE_SECPOLICY_H */
+/* #undef HAVE_SECPOLICYPRIV_H */
+/* #undef HAVE_SECURETRANSPORTPRIV_H */
/*
@@ -399,22 +410,17 @@
/*
- * Do we have the SLP library?
+ * Do we have the SecGenerateSelfSignedCertificate function?
*/
-/* #undef HAVE_LIBSLP */
+/* #undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE */
/*
- * Do we have an LDAP library?
+ * Do we have the SecKeychainOpen function?
*/
-/* #undef HAVE_LDAP */
-/* #undef HAVE_OPENLDAP */
-/* #undef HAVE_MOZILLA_LDAP */
-/* #undef HAVE_LDAP_SSL_H */
-/* #undef HAVE_LDAP_SSL */
-/* #undef HAVE_LDAP_REBIND_PROC */
+/* #undef HAVE_SECKEYCHAINOPEN */
/*
@@ -425,24 +431,31 @@
/*
- * Do we have DNS Service Discovery (aka Bonjour)?
+ * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)?
*/
#define HAVE_DNSSD 1
/*
- * Does the "stat" structure contain the "st_gen" member?
+ * Do we have Avahi for DNS Service Discovery (aka Bonjour)?
*/
-/* #undef HAVE_ST_GEN */
+#undef HAVE_AVAHI
/*
* Do we have <sys/ioctl.h>?
*/
-/* #undef HAVE_SYS_IOCTL_H */
+#undef HAVE_SYS_IOCTL_H
+
+
+/*
+ * Does the "stat" structure contain the "st_gen" member?
+ */
+
+/* #undef HAVE_ST_GEN */
/*
@@ -516,13 +529,6 @@
/*
- * Do we have the AIX usersec.h header file?
- */
-
-/* #undef HAVE_USERSEC_H */
-
-
-/*
* Do we have pthread support?
*/
@@ -538,6 +544,13 @@
/*
+ * Do we have systemd support?
+ */
+
+/* #undef HAVE_SYSTEMD */
+
+
+/*
* Various scripting languages...
*/
@@ -556,6 +569,7 @@
*/
/* #undef HAVE_PDFTOPS */
+/* #undef HAVE_PDFTOPS_WITH_ORIGPAGESIZES */
#define CUPS_PDFTOPS ""
@@ -568,14 +582,6 @@
/*
- * Do we have Darwin's CoreFoundation and SystemConfiguration frameworks?
- */
-
-/* #undef HAVE_COREFOUNDATION */
-/* #undef HAVE_SYSTEMCONFIGURATION */
-
-
-/*
* Do we have CoreFoundation public and private headers?
*/
@@ -616,18 +622,12 @@
/*
- * Do we have Darwin's IOKit private headers?
- */
-
-/* #undef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
-
-
-/*
* Do we have DBUS?
*/
/* #undef HAVE_DBUS */
/* #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */
+/* #undef HAVE_DBUS_THREADS_INIT */
/*
@@ -639,11 +639,8 @@
/* #undef HAVE_GSS_GSSAPI_H */
/* #undef HAVE_GSS_GSSAPI_SPI_H */
/* #undef HAVE_GSSAPI */
-/* #undef HAVE_GSSAPI_GENERIC_H */
/* #undef HAVE_GSSAPI_GSSAPI_H */
/* #undef HAVE_GSSAPI_H */
-/* #undef HAVE_GSSAPI_KRB5_H */
-/* #undef HAVE_KRB5_H */
/*
@@ -731,7 +728,7 @@
* Do we have libusb?
*/
-/* #undef HAVE_USB_H */
+/* #undef HAVE_LIBUSB */
/*
@@ -768,21 +765,39 @@
/*
- * Do we have the ColorSyncRegisterDevice function?
+ * Do we have XPC?
*/
-/* #undef HAVE_COLORSYNCREGISTERDEVICE */
+/* #undef HAVE_XPC */
+/* #undef HAVE_XPC_PRIVATE_H */
/*
- * Do we have XPC?
+ * Do we have Mini-XML?
*/
-/* #undef HAVE_XPC */
+/* #undef HAVE_MXML_H */
+
+
+/*
+ * Do we have the C99 abs() function?
+ */
+/* #undef HAVE_ABS */
+#if !defined(HAVE_ABS) && !defined(abs)
+# if defined(__GNUC__) || __STDC_VERSION__ >= 199901L
+# define abs(x) _cups_abs(x)
+static inline int _cups_abs(int i) { return (i < 0 ? -i : i); }
+# elif defined(_MSC_VER)
+# define abs(x) _cups_abs(x)
+static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); }
+# else
+# define abs(x) ((x) < 0 ? -(x) : (x))
+# endif /* __GNUC__ || __STDC_VERSION__ */
+#endif /* !HAVE_ABS && !abs */
#endif /* !_CUPS_CONFIG_H_ */
/*
- * End of "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $".
*/
diff --git a/vcnet/cups.sln b/vcnet/cups.sln
index 5fede83..277d762 100644
--- a/vcnet/cups.sln
+++ b/vcnet/cups.sln
@@ -33,10 +33,29 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ipptool", "ipptool.vcproj",
EndProjectSection
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "ipptool-installer", "ipptool-installer.vdproj", "{6AEA263B-92C0-426F-B5FF-F7F5917B704A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85} = {B484DA0C-62C8-4C32-83B6-CCEB58968B85}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "regex.vcproj", "{18950A1B-D37A-40C7-B2DF-C12986C0526E}"
EndProject
-Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "ipptool-installer", "libcups2-installer.vdproj", "{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}"
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "libcups2-installer", "libcups2-installer.vdproj", "{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85} = {B484DA0C-62C8-4C32-83B6-CCEB58968B85}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ippfind", "ippfind.vcproj", "{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"
+ ProjectSection(ProjectDependencies) = postProject
+ {18950A1B-D37A-40C7-B2DF-C12986C0526E} = {18950A1B-D37A-40C7-B2DF-C12986C0526E}
+ {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}
+ EndProjectSection
+EndProject
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "sw-ippeveselfcert10", "sw-ippeveselfcert10.vdproj", "{7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ippserver", "ippserver.vcproj", "{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}
+ EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -52,8 +71,8 @@ Global
{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.Build.0 = Debug|x64
{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.ActiveCfg = Release|Win32
{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.Build.0 = Release|Win32
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Debug|x64
- {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Debug|x64
+ {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Release|x64
+ {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Release|x64
{CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.ActiveCfg = Debug|Win32
{CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.Build.0 = Debug|Win32
{CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.ActiveCfg = Debug|x64
@@ -104,10 +123,11 @@ Global
{6AEA263B-92C0-426F-B5FF-F7F5917B704A}.Release|x64.Build.0 = Release
{18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|Win32.ActiveCfg = Debug|Win32
{18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|Win32.Build.0 = Debug|Win32
- {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|x64.ActiveCfg = Debug|Win32
+ {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|x64.ActiveCfg = Debug|x64
+ {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|x64.Build.0 = Debug|x64
{18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|Win32.ActiveCfg = Release|Win32
{18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|Win32.Build.0 = Release|Win32
- {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|x64.ActiveCfg = Release|Win32
+ {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|x64.ActiveCfg = Release|x64
{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Debug|Win32.ActiveCfg = Debug
{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Debug|Win32.Build.0 = Debug
{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Debug|x64.ActiveCfg = Debug
@@ -116,6 +136,30 @@ Global
{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Release|Win32.Build.0 = Release
{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Release|x64.ActiveCfg = Release
{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Release|x64.Build.0 = Release
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|Win32.Build.0 = Debug|Win32
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|x64.ActiveCfg = Debug|x64
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|x64.Build.0 = Debug|x64
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|Win32.ActiveCfg = Release|Win32
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|Win32.Build.0 = Release|Win32
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|x64.ActiveCfg = Release|x64
+ {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|x64.Build.0 = Release|x64
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|Win32.ActiveCfg = Debug
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|Win32.Build.0 = Debug
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|x64.ActiveCfg = Debug
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|x64.Build.0 = Debug
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|Win32.ActiveCfg = Release
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|Win32.Build.0 = Release
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|x64.ActiveCfg = Release
+ {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|x64.Build.0 = Release
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|Win32.Build.0 = Debug|Win32
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|x64.ActiveCfg = Debug|x64
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|x64.Build.0 = Debug|x64
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|Win32.ActiveCfg = Release|Win32
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|Win32.Build.0 = Release|Win32
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|x64.ActiveCfg = Release|x64
+ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/vc2005/cupstestppd.vcproj b/vcnet/ippfind.vcproj
index 479afcc..59a7f2b 100644
--- a/vc2005/cupstestppd.vcproj
+++ b/vcnet/ippfind.vcproj
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="8.00"
- Name="cupstestppd"
- ProjectGUID="{6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}"
- RootNamespace="cupstestppd"
+ Version="9.00"
+ Name="ippfind"
+ ProjectGUID="{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"
+ RootNamespace="ippfind"
Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -20,8 +21,8 @@
<Configurations>
<Configuration
Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
@@ -43,14 +44,14 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..;..\vcnet"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="1"
- Detect64BitPortabilityProblems="true"
+ Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
<Tool
@@ -64,9 +65,12 @@
/>
<Tool
Name="VCLinkerTool"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
@@ -88,19 +92,15 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
+ Name="Debug|x64"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
- WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -116,15 +116,19 @@
/>
<Tool
Name="VCMIDLTool"
+ TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..;..\vcnet"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="1"
- Detect64BitPortabilityProblems="true"
+ Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
@@ -138,12 +142,13 @@
/>
<Tool
Name="VCLinkerTool"
- LinkIncremental="1"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
+ LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
@@ -164,18 +169,16 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+ Name="Release|Win32"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
+ WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -191,19 +194,15 @@
/>
<Tool
Name="VCMIDLTool"
- TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..;..\vcnet"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="1"
- Detect64BitPortabilityProblems="true"
+ Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
@@ -217,10 +216,15 @@
/>
<Tool
Name="VCLinkerTool"
- LinkIncremental="2"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
+ LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
- TargetMachine="17"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
@@ -241,15 +245,12 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
@@ -273,12 +274,12 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..;..\vcnet"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="1"
- Detect64BitPortabilityProblems="true"
+ Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
@@ -292,11 +293,14 @@
/>
<Tool
Name="VCLinkerTool"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -318,9 +322,6 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
@@ -331,23 +332,23 @@
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ UniqueIdentifier="{8C1A7322-AFBD-4611-A001-CF18E3B0F00C}"
>
<File
- RelativePath="..\systemv\cupstestppd.c"
+ RelativePath="..\test\ippfind.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ UniqueIdentifier="{5807291C-0541-4D9C-9290-628F88CF9119}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ UniqueIdentifier="{7767CEF5-1BED-4C4C-82A7-37DF77126FE3}"
>
</Filter>
</Files>
diff --git a/vc2005/libcupsimage2.vcproj b/vcnet/ippserver.vcproj
index bb1f9ef..fe5aaad 100644
--- a/vc2005/libcupsimage2.vcproj
+++ b/vcnet/ippserver.vcproj
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="8.00"
- Name="libcupsimage2"
- ProjectGUID="{CB4AA6F2-3E84-45BE-B505-95CD375E1234}"
+ Version="9.00"
+ Name="ippserver"
+ ProjectGUID="{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}"
+ RootNamespace="ippserver"
Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -21,9 +23,8 @@
Name="Debug|Win32"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
+ ConfigurationType="1"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -43,14 +44,13 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- BufferSecurityCheck="true"
UsePrecompiledHeader="0"
- WarningLevel="3"
+ WarningLevel="1"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
@@ -65,14 +65,12 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="$(OutDir)\libcupsimage2.dll"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
LinkIncremental="2"
- ModuleDefinitionFile="..\filter\libcupsimage2.def"
GenerateDebugInformation="true"
- ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcupsimage2.pdb"
- SubSystem="2"
- ImportLibrary="$(OutDir)\libcupsimage2.lib"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
@@ -94,9 +92,6 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
@@ -104,9 +99,8 @@
Name="Debug|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
+ ConfigurationType="1"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -127,14 +121,13 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- BufferSecurityCheck="true"
UsePrecompiledHeader="0"
- WarningLevel="3"
+ WarningLevel="1"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
@@ -149,14 +142,12 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="$(OutDir)\libcupsimage2.dll"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
LinkIncremental="2"
- ModuleDefinitionFile="..\filter\libcupsimage2.def"
GenerateDebugInformation="true"
- ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcupsimage2.pdb"
- SubSystem="2"
- ImportLibrary="$(OutDir)\libcupsimage2.lib"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -178,9 +169,6 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
@@ -188,9 +176,9 @@
Name="Release|Win32"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -209,12 +197,11 @@
/>
<Tool
Name="VCCLCompilerTool"
- Optimization="1"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
- WarningLevel="3"
+ WarningLevel="1"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
@@ -229,16 +216,14 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="$(OutDir)\libcupsimage2.dll"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
LinkIncremental="1"
- ModuleDefinitionFile="..\filter\libcupsimage2.def"
GenerateDebugInformation="true"
- ProgramDatabaseFile="libcupsimage2.pdb"
- SubSystem="2"
+ SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
- ImportLibrary="$(OutDir)\libcupsimage2.lib"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
@@ -260,20 +245,16 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
- CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot; mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot; &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="2"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -293,12 +274,11 @@
/>
<Tool
Name="VCCLCompilerTool"
- Optimization="1"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
- WarningLevel="3"
+ WarningLevel="1"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
@@ -313,16 +293,14 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="$(OutDir)\libcupsimage2.dll"
+ AdditionalDependencies="dnssd.lib ws2_32.lib"
LinkIncremental="1"
- ModuleDefinitionFile="..\filter\libcupsimage2.def"
GenerateDebugInformation="true"
- ProgramDatabaseFile="libcupsimage2.pdb"
- SubSystem="2"
+ SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
- ImportLibrary="$(OutDir)\libcupsimage2.lib"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -344,11 +322,7 @@
Name="VCAppVerifierTool"
/>
<Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
Name="VCPostBuildEventTool"
- CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot; mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot; &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"
/>
</Configuration>
</Configurations>
@@ -357,36 +331,24 @@
<Files>
<Filter
Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D7521234}"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{5129820B-88C2-40AE-BE81-C7957F76540D}"
>
<File
- RelativePath="..\filter\error.c"
- >
- </File>
- <File
- RelativePath="..\filter\interpret.c"
- >
- </File>
- <File
- RelativePath="..\filter\raster.c"
+ RelativePath="..\test\ippserver.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE521234}"
+ UniqueIdentifier="{CAF4FFBF-7D66-4368-A03A-3FD0971B59A0}"
>
- <File
- RelativePath="..\cups\raster.h"
- >
- </File>
</Filter>
<Filter
Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121A1234}"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{17D3B9CD-53D2-47AF-9D2A-4516D777D695}"
>
</Filter>
</Files>
diff --git a/vcnet/ipptool-installer.vdproj b/vcnet/ipptool-installer.vdproj
index 948299e..555cd2e 100644
--- a/vcnet/ipptool-installer.vdproj
+++ b/vcnet/ipptool-installer.vdproj
@@ -27,6 +27,12 @@
}
"Entry"
{
+ "MsmKey" = "8:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_1E4B2A9BD6A44926B719E0D7E8FC0952"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -57,32 +63,50 @@
}
"Entry"
{
- "MsmKey" = "8:_65CBD149C9DA448FBACE2B02766A6537"
+ "MsmKey" = "8:_4273A45FE6E54897AC9A4F66D9AA59EC"
+ "OwnerKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4454D1BB58774F95972FB94388DC5E6A"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_6F893B2A3B7048CBA39359FC368BCA27"
+ "MsmKey" = "8:_46AB64FF360D4F309866FF5F49C65D88"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"
- "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
+ "MsmKey" = "8:_531A281ACDC6420D918E2A9FE97A2D42"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"
- "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"
- "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F"
+ "MsmKey" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_65CBD149C9DA448FBACE2B02766A6537"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6F893B2A3B7048CBA39359FC368BCA27"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -99,6 +123,30 @@
}
"Entry"
{
+ "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"
+ "OwnerKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"
+ "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"
+ "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_8AC6B9D7EF6B4C7A8C7B5AD85AA397C3"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -111,6 +159,12 @@
}
"Entry"
{
+ "MsmKey" = "8:_9314DE98517C42E9AF190B67472408DF"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50"
"OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
"MsmSig" = "8:_UNDEFINED"
@@ -123,12 +177,24 @@
}
"Entry"
{
+ "MsmKey" = "8:_A63C5C4108AB4B588878482B26876DC5"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_AF057921D20E4520A3C6420F0729A744"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
+ "MsmKey" = "8:_B85BD013DC024B9E82862535191B405B"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_B9E79062FEF64745915546DDD5BF8D85"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -225,12 +291,6 @@
}
"Entry"
{
- "MsmKey" = "8:_F0AA062C769A4867B5C302491CA4F2D3"
- "OwnerKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
"MsmKey" = "8:_F16FA7F9826E461E955A95B2EEABA975"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -378,6 +438,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"
+ {
+ "SourcePath" = "8:zlibwapi.dll"
+ "TargetName" = "8:zlibwapi.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1E4B2A9BD6A44926B719E0D7E8FC0952"
{
"SourcePath" = "8:..\\test\\get-printer-attributes.test"
@@ -478,6 +558,86 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4454D1BB58774F95972FB94388DC5E6A"
+ {
+ "SourcePath" = "8:..\\test\\print-job-deflate.test"
+ "TargetName" = "8:print-job-deflate.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_46AB64FF360D4F309866FF5F49C65D88"
+ {
+ "SourcePath" = "8:..\\test\\ipp-everywhere.test"
+ "TargetName" = "8:ipp-everywhere.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_531A281ACDC6420D918E2A9FE97A2D42"
+ {
+ "SourcePath" = "8:..\\test\\get-notifications.test"
+ "TargetName" = "8:get-notifications.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_592FC984DBFD494D9FB7DFFEA35AD7A5"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ippfind.html"
+ "TargetName" = "8:man-ippfind.html"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_65CBD149C9DA448FBACE2B02766A6537"
{
"SourcePath" = "8:..\\test\\testfile.ps"
@@ -598,6 +758,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9314DE98517C42E9AF190B67472408DF"
+ {
+ "SourcePath" = "8:..\\test\\get-subscriptions.test"
+ "TargetName" = "8:get-subscriptions.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50"
{
"SourcePath" = "8:CRYPT32.dll"
@@ -614,7 +794,7 @@
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
- "Exclude" = "11:TRUE"
+ "Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
@@ -634,10 +814,30 @@
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
- "Exclude" = "11:TRUE"
+ "Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A63C5C4108AB4B588878482B26876DC5"
+ {
+ "SourcePath" = "8:..\\test\\validate-job.test"
+ "TargetName" = "8:validate-job.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AF057921D20E4520A3C6420F0729A744"
{
"SourcePath" = "8:..\\IPPTOOL.txt"
@@ -658,6 +858,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B85BD013DC024B9E82862535191B405B"
+ {
+ "SourcePath" = "8:..\\test\\print-job-gzip.test"
+ "TargetName" = "8:print-job-gzip.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B9E79062FEF64745915546DDD5BF8D85"
{
"SourcePath" = "8:..\\CHANGES-IPPTOOL.txt"
@@ -973,6 +1193,17 @@
"Property" = "8:ProgramMenuFolder"
"Folders"
{
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_E379D4EDBAD0460BB876711E9062ADB4"
+ {
+ "Name" = "8:ipptool"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_D115D2F4F12143B09D5FDA447A6A7D04"
+ "Folders"
+ {
+ }
+ }
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_D02CDADE99F344CF92CA1A8D0278861F"
@@ -1025,14 +1256,14 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:ipptool for Windows"
- "ProductCode" = "8:{8220ED6C-8FAC-4E28-8589-867295E2A23D}"
- "PackageCode" = "8:{B78F9AC6-92F9-48FF-AA11-ECD929442B4A}"
+ "ProductCode" = "8:{5B0420A3-BD82-4698-B8A1-9D9EC51A7836}"
+ "PackageCode" = "8:{ECECE842-1E95-48BD-962D-A4E62FBB5F89}"
"UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:12.02.0600"
+ "ProductVersion" = "8:13.07.3100"
"Manufacturer" = "8:Apple Inc."
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:http://www.cups.org/str.php"
@@ -1153,6 +1384,48 @@
}
"Shortcut"
{
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_63715171338D40FFBC5B47A1418B4814"
+ {
+ "Name" = "8:README"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_AF057921D20E4520A3C6420F0729A744"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_70CF74DB997A408DBBFD48AB10F92321"
+ {
+ "Name" = "8:ipptool Documentation"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_D5CD9D9AB1644688A1D54B1589BDF724"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_BD2A7DF74D844FF5919EE8340EE36ECD"
+ {
+ "Name" = "8:Test File Documentation"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_1A1324305D78463BBFC62269C56DCF0B"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
}
"UserInterface"
{
@@ -1549,11 +1822,11 @@
}
"MergeModule"
{
- "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_7AFD2BBA568D45F5B1E871E2B93892BC"
+ "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_4273A45FE6E54897AC9A4F66D9AA59EC"
{
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:TRUE"
- "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"
+ "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"
"Properties"
{
}
@@ -1563,11 +1836,11 @@
"Feature" = "8:"
"IsolateTo" = "8:"
}
- "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_F0AA062C769A4867B5C302491CA4F2D3"
+ "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"
{
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:TRUE"
- "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"
+ "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"
"Properties"
{
}
@@ -1580,9 +1853,37 @@
}
"ProjectOutput"
{
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_58DC0E72F0944BEFB927AED718CD1660"
+ {
+ "SourcePath" = "8:Win32\\Release\\ippfind.exe"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8"
{
- "SourcePath" = "8:Win32\\Debug\\regex.dll"
+ "SourcePath" = "8:Win32\\Release\\regex.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
@@ -1610,7 +1911,7 @@
}
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E97571D3FBE048DABDC59B37762D800F"
{
- "SourcePath" = "8:Win32\\Debug\\ipptool.exe"
+ "SourcePath" = "8:Win32\\Release\\ipptool.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
@@ -1638,7 +1939,7 @@
}
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A"
{
- "SourcePath" = "8:Win32\\Debug\\libcups2.dll"
+ "SourcePath" = "8:Win32\\Release\\libcups2.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
diff --git a/vcnet/libcups2-installer.vdproj b/vcnet/libcups2-installer.vdproj
index 75d6dd8..74b2216 100644
--- a/vcnet/libcups2-installer.vdproj
+++ b/vcnet/libcups2-installer.vdproj
@@ -45,14 +45,20 @@
}
"Entry"
{
- "MsmKey" = "8:_1AF767BD52F94DC08C2CBE11DA41E95A"
+ "MsmKey" = "8:_16CCCC95D1BE41A981EAA4CDAD772F32"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1859B81745C54E228CDCA94F130C8150"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_1DFD9AECD1AD4B2291DD52028E866569"
- "OwnerKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"
+ "MsmKey" = "8:_1AF767BD52F94DC08C2CBE11DA41E95A"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -69,12 +75,24 @@
}
"Entry"
{
+ "MsmKey" = "8:_232E0EB837A04A5B90312D947F1A7905"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_24E7DBA1F5964574A8251258BCDC935D"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
+ "MsmKey" = "8:_253C714B01974C9BB1A698DD449F588D"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_260594D75E4B4764BBAFE25C15E4F273"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -99,6 +117,18 @@
}
"Entry"
{
+ "MsmKey" = "8:_35AE0E84A609BB191E4085A2681730D1"
+ "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_35AE0E84A609BB191E4085A2681730D1"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_364DCCAFF25145BCBE75FFEEDCC75B3A"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -117,56 +147,80 @@
}
"Entry"
{
+ "MsmKey" = "8:_3CBB55F3EBEA4645BE6CEC8A0F251B80"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_3CFC5A9B09ED4916A350B88FEF4662CC"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
+ "MsmKey" = "8:_3CFD2A1A9D824E2491CC2BAC1334BA13"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3F5E38826D0C441897F43747FFA7491A"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_4879AF80C19D4ED9A3758DCC412190FB"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_574EE5A852D3434987B58E3B8118C1C2"
+ "MsmKey" = "8:_4A46F690254944ECBF1539E2C2F86A59"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_5ED87BAE980C4992A4C74AEAEC4A57CF"
+ "MsmKey" = "8:_51381771E03E40DEA842E785C9B7A31B"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"
- "OwnerKey" = "8:_0299839A2CCC4F908C5D3A8F465F3FFE"
+ "MsmKey" = "8:_52B5F2EDEDEC48B5A1188F780C67DE9B"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"
- "OwnerKey" = "8:_B20638175CCB42398417E0683A12469C"
+ "MsmKey" = "8:_574EE5A852D3434987B58E3B8118C1C2"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"
- "OwnerKey" = "8:_364DCCAFF25145BCBE75FFEEDCC75B3A"
+ "MsmKey" = "8:_5914C46E15794A9093C5BF50A983D502"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"
- "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmKey" = "8:_5B2FBC1C3AD5490689A61629854C80AF"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"
- "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
+ "MsmKey" = "8:_5BBA58EFC5A9495BBEF1752E15F4A077"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5ED87BAE980C4992A4C74AEAEC4A57CF"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -177,6 +231,12 @@
}
"Entry"
{
+ "MsmKey" = "8:_666BC59DB1514D61AE06860A2894BE4C"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_6BD69E32EE9A4D2B9ECC40558A68FCD8"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -201,6 +261,12 @@
}
"Entry"
{
+ "MsmKey" = "8:_7A478A9B37C44B22BD4F926913C9A5B7"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_7FC58520B0F44E3E95A207905CABFED4"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -219,8 +285,8 @@
}
"Entry"
{
- "MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50"
- "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmKey" = "8:_933D37C7FEBF4B8AAF9E6CE01A605039"
+ "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -231,31 +297,103 @@
}
"Entry"
{
- "MsmKey" = "8:_9FBF78D7B89EEA843380D5F10E1954D7"
+ "MsmKey" = "8:_A271CCE042C14DDF8F0F1A1B16584F17"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A513FBE6CC6247C19AF06829E5470D01"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A833908023464B61A160E0323C8E9606"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B15F5898006758C3483850D50CA2C7F0"
+ "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B15F5898006758C3483850D50CA2C7F0"
"OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_A271CCE042C14DDF8F0F1A1B16584F17"
+ "MsmKey" = "8:_B20638175CCB42398417E0683A12469C"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_A513FBE6CC6247C19AF06829E5470D01"
+ "MsmKey" = "8:_B38E399C93724A9BB5F429DABBA6301F"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_A833908023464B61A160E0323C8E9606"
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_0299839A2CCC4F908C5D3A8F465F3FFE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_5B2FBC1C3AD5490689A61629854C80AF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_D3197C67CBAC46DE854CF283CDBC677E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_B20638175CCB42398417E0683A12469C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "OwnerKey" = "8:_364DCCAFF25145BCBE75FFEEDCC75B3A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_BAEADCCB6AD74F36AE08401229354D79"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
- "MsmKey" = "8:_B20638175CCB42398417E0683A12469C"
+ "MsmKey" = "8:_C17DC336766E4B1BBC8DD24D686C440A"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
@@ -279,6 +417,18 @@
}
"Entry"
{
+ "MsmKey" = "8:_CAF8F7B63E0E9F92F4B3B83FA9CC5424"
+ "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CAF8F7B63E0E9F92F4B3B83FA9CC5424"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_CD0CFE42ED2D4416A01253E12A0082A8"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -291,12 +441,24 @@
}
"Entry"
{
+ "MsmKey" = "8:_CE2A836CE5AF4404B8672B100A9FC9ED"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
+ "MsmKey" = "8:_D3197C67CBAC46DE854CF283CDBC677E"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_D3B3B266E0FC45DD9B7EEBCC3AC52965"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -327,6 +489,12 @@
}
"Entry"
{
+ "MsmKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -345,12 +513,24 @@
}
"Entry"
{
+ "MsmKey" = "8:_F39E4E6E6DCB48E08E9E51E724E77DCF"
+ "OwnerKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_F77CB9E0AE78446481BD8BFD680F548E"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
+ "MsmKey" = "8:_F7FBD6E1C73B45EA813FB1D5E6050650"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
"MsmKey" = "8:_FA604C5C4FDD4D7B8110AFC6B603FBAF"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -532,6 +712,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1859B81745C54E228CDCA94F130C8150"
+ {
+ "SourcePath" = "8:..\\test\\get-notifications.test"
+ "TargetName" = "8:get-notifications.test"
+ "Tag" = "8:"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1AF767BD52F94DC08C2CBE11DA41E95A"
{
"SourcePath" = "8:..\\doc\\images\\raster.png"
@@ -577,7 +777,27 @@
"SourcePath" = "8:..\\cups\\adminutil.h"
"TargetName" = "8:adminutil.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_232E0EB837A04A5B90312D947F1A7905"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ipptool.html"
+ "TargetName" = "8:man-ipptool.html"
+ "Tag" = "8:"
+ "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -597,7 +817,27 @@
"SourcePath" = "8:..\\cups\\http.h"
"TargetName" = "8:http.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_253C714B01974C9BB1A698DD449F588D"
+ {
+ "SourcePath" = "8:..\\test\\validate-job.test"
+ "TargetName" = "8:validate-job.test"
+ "Tag" = "8:"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -657,7 +897,7 @@
"SourcePath" = "8:..\\cups\\ipp.h"
"TargetName" = "8:ipp.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -692,6 +932,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_35AE0E84A609BB191E4085A2681730D1"
+ {
+ "SourcePath" = "8:CRYPT32.dll"
+ "TargetName" = "8:CRYPT32.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_C8D931ADC425446B916E9711B929659F"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3697A58F04D14955AA428E89771E7BA3"
{
"SourcePath" = "8:..\\test\\ipp-2.0.test"
@@ -717,7 +977,7 @@
"SourcePath" = "8:Win32\\Release\\libcups2.lib"
"TargetName" = "8:libcups2.lib"
"Tag" = "8:"
- "Folder" = "8:_2927DAE23F604CF9B8B4D1EC01A6F158"
+ "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -737,7 +997,27 @@
"SourcePath" = "8:..\\cups\\transcode.h"
"TargetName" = "8:transcode.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3CFD2A1A9D824E2491CC2BAC1334BA13"
+ {
+ "SourcePath" = "8:..\\test\\get-subscriptions.test"
+ "TargetName" = "8:get-subscriptions.test"
+ "Tag" = "8:"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -757,7 +1037,47 @@
"SourcePath" = "8:..\\cups\\raster.h"
"TargetName" = "8:raster.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4A46F690254944ECBF1539E2C2F86A59"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ipptoolfile.html"
+ "TargetName" = "8:man-ipptoolfile.html"
+ "Tag" = "8:"
+ "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_51381771E03E40DEA842E785C9B7A31B"
+ {
+ "SourcePath" = "8:..\\test\\print-job-gzip.test"
+ "TargetName" = "8:print-job-gzip.test"
+ "Tag" = "8:"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -777,7 +1097,47 @@
"SourcePath" = "8:..\\cups\\array.h"
"TargetName" = "8:array.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5914C46E15794A9093C5BF50A983D502"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ippfind.html"
+ "TargetName" = "8:man-ippfind.html"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5BBA58EFC5A9495BBEF1752E15F4A077"
+ {
+ "SourcePath" = "8:README.txt"
+ "TargetName" = "8:README.txt"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -797,7 +1157,7 @@
"SourcePath" = "8:..\\cups\\ppd.h"
"TargetName" = "8:ppd.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -817,7 +1177,27 @@
"SourcePath" = "8:..\\cups\\language.h"
"TargetName" = "8:language.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_666BC59DB1514D61AE06860A2894BE4C"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-cupstestppd.html"
+ "TargetName" = "8:man-cupstestppd.html"
+ "Tag" = "8:"
+ "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -837,7 +1217,7 @@
"SourcePath" = "8:Win32\\Release\\libcupsimage2.lib"
"TargetName" = "8:libcupsimage2.lib"
"Tag" = "8:"
- "Folder" = "8:_2927DAE23F604CF9B8B4D1EC01A6F158"
+ "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -877,7 +1257,7 @@
"SourcePath" = "8:..\\cups\\versioning.h"
"TargetName" = "8:versioning.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -897,7 +1277,27 @@
"SourcePath" = "8:..\\cups\\dir.h"
"TargetName" = "8:dir.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7A478A9B37C44B22BD4F926913C9A5B7"
+ {
+ "SourcePath" = "8:..\\test\\get-jobs.test"
+ "TargetName" = "8:get-jobs.test"
+ "Tag" = "8:"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -972,12 +1372,12 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50"
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_933D37C7FEBF4B8AAF9E6CE01A605039"
{
- "SourcePath" = "8:CRYPT32.dll"
- "TargetName" = "8:CRYPT32.dll"
+ "SourcePath" = "8:..\\test\\ipp-everywhere.test"
+ "TargetName" = "8:ipp-everywhere.test"
"Tag" = "8:"
- "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -988,8 +1388,8 @@
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
- "Exclude" = "11:TRUE"
- "IsDependency" = "11:TRUE"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9D69B0FC2413407BA24D88B73EF456AA"
@@ -1012,12 +1412,12 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9FBF78D7B89EEA843380D5F10E1954D7"
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A271CCE042C14DDF8F0F1A1B16584F17"
{
- "SourcePath" = "8:Secur32.dll"
- "TargetName" = "8:Secur32.dll"
+ "SourcePath" = "8:..\\doc\\help\\api-filedir.html"
+ "TargetName" = "8:api-filedir.html"
"Tag" = "8:"
- "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -1028,16 +1428,16 @@
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
- "Exclude" = "11:TRUE"
- "IsDependency" = "11:TRUE"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A271CCE042C14DDF8F0F1A1B16584F17"
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A513FBE6CC6247C19AF06829E5470D01"
{
- "SourcePath" = "8:..\\doc\\help\\api-filedir.html"
- "TargetName" = "8:api-filedir.html"
+ "SourcePath" = "8:..\\test\\document-a4.pdf"
+ "TargetName" = "8:document-a4.pdf"
"Tag" = "8:"
- "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"
+ "Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -1052,10 +1452,10 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A513FBE6CC6247C19AF06829E5470D01"
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A833908023464B61A160E0323C8E9606"
{
- "SourcePath" = "8:..\\test\\document-a4.pdf"
- "TargetName" = "8:document-a4.pdf"
+ "SourcePath" = "8:..\\test\\document-letter.pdf"
+ "TargetName" = "8:document-letter.pdf"
"Tag" = "8:"
"Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
@@ -1072,10 +1472,30 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A833908023464B61A160E0323C8E9606"
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B15F5898006758C3483850D50CA2C7F0"
{
- "SourcePath" = "8:..\\test\\document-letter.pdf"
- "TargetName" = "8:document-letter.pdf"
+ "SourcePath" = "8:Secur32.dll"
+ "TargetName" = "8:Secur32.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_C8D931ADC425446B916E9711B929659F"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B38E399C93724A9BB5F429DABBA6301F"
+ {
+ "SourcePath" = "8:..\\test\\print-job-deflate.test"
+ "TargetName" = "8:print-job-deflate.test"
"Tag" = "8:"
"Folder" = "8:_9DFBB4777E594B0F8884792467931241"
"Condition" = "8:"
@@ -1152,6 +1572,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CAF8F7B63E0E9F92F4B3B83FA9CC5424"
+ {
+ "SourcePath" = "8:zlibwapi.dll"
+ "TargetName" = "8:zlibwapi.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CD0CFE42ED2D4416A01253E12A0082A8"
{
"SourcePath" = "8:..\\test\\testfile.pdf"
@@ -1192,6 +1632,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CE2A836CE5AF4404B8672B100A9FC9ED"
+ {
+ "SourcePath" = "8:..\\IPPTOOL.txt"
+ "TargetName" = "8:IPPTOOL.txt"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D3B3B266E0FC45DD9B7EEBCC3AC52965"
{
"SourcePath" = "8:..\\test\\get-printer-attributes.test"
@@ -1277,7 +1737,7 @@
"SourcePath" = "8:..\\cups\\cups.h"
"TargetName" = "8:cups.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -1317,7 +1777,7 @@
"SourcePath" = "8:..\\cups\\file.h"
"TargetName" = "8:file.h"
"Tag" = "8:"
- "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -1352,6 +1812,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F7FBD6E1C73B45EA813FB1D5E6050650"
+ {
+ "SourcePath" = "8:..\\cups\\pwg.h"
+ "TargetName" = "8:pwg.h"
+ "Tag" = "8:"
+ "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FA604C5C4FDD4D7B8110AFC6B603FBAF"
{
"SourcePath" = "8:..\\test\\onepage-letter.ps"
@@ -1430,6 +1910,17 @@
"Property" = "8:_23D8BBBA9DEE4C8E88C9D1624DEAFB81"
"Folders"
{
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"
+ {
+ "Name" = "8:cups"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_61254DF68D8F4039997C263F7B45ABB8"
+ "Folders"
+ {
+ }
+ }
}
}
"{9EF0B969-E518-4E46-987F-47570745A589}:_24DE31CE70694FD2977B5FB38F24D77F"
@@ -1463,6 +1954,50 @@
"Property" = "8:_927C9760A02446EBB2AEDE6BCCFDE29F"
"Folders"
{
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_ABA133175ABB48058F633A1599B418BC"
+ {
+ "Name" = "8:ReleaseX64"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_B4A5B4451AA146D4AA06FDF59FF36FCD"
+ "Folders"
+ {
+ }
+ }
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_BC1E27FED70845D1BA482FB1D96972F5"
+ {
+ "Name" = "8:ReleaseWin32"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_83BECF9B63434282B61BAA7043D96AB1"
+ "Folders"
+ {
+ }
+ }
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_E6A941208712461FAD0B4FB291EDDD56"
+ {
+ "Name" = "8:DebugWin32"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_808CB654DBF7446FB4C3706759D6326C"
+ "Folders"
+ {
+ }
+ }
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_EB4E176E122E4686A21902DD986EC361"
+ {
+ "Name" = "8:DebugX64"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_704A12AF60B74B92A12505146FD2CA2E"
+ "Folders"
+ {
+ }
+ }
}
}
"{9EF0B969-E518-4E46-987F-47570745A589}:_9DFBB4777E594B0F8884792467931241"
@@ -1494,14 +2029,14 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:CUPS SDK for Windows"
- "ProductCode" = "8:{4E0D1662-B032-4CAD-8DBD-5302ADCE1C6F}"
- "PackageCode" = "8:{00298F12-01DD-4785-9402-7A1E694F9577}"
+ "ProductCode" = "8:{FE657BEF-0C7A-4175-9EAE-D482789E7AD5}"
+ "PackageCode" = "8:{2AE9BB2F-C4FC-4BB7-9A4D-77F83E55EA55}"
"UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:12.03.2600"
+ "ProductVersion" = "8:13.04.1800"
"Manufacturer" = "8:Apple Inc."
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:http://www.cups.org/str.php"
@@ -2018,11 +2553,11 @@
}
"MergeModule"
{
- "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_1DFD9AECD1AD4B2291DD52028E866569"
+ "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_B7023A0B2ADF4B4D822FAEE062F9BD87"
{
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:TRUE"
- "SourcePath" = "8:microsoft_vc90_crt_x86.msm"
+ "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"
"Properties"
{
}
@@ -2032,11 +2567,11 @@
"Feature" = "8:"
"IsolateTo" = "8:"
}
- "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_62CA00B1E5E4460CA93EE7E2B8FE878B"
+ "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_F39E4E6E6DCB48E08E9E51E724E77DCF"
{
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:TRUE"
- "SourcePath" = "8:policy_9_0_Microsoft_VC90_CRT_x86.msm"
+ "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"
"Properties"
{
}
@@ -2051,10 +2586,10 @@
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_0299839A2CCC4F908C5D3A8F465F3FFE"
{
- "SourcePath" = "8:Win32\\Release\\libcupsimage2.dll"
+ "SourcePath" = "8:Win32\\Debug\\libcupsimage2.dll"
"TargetName" = "8:"
"Tag" = "8:"
- "Folder" = "8:_C8D931ADC425446B916E9711B929659F"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -2077,9 +2612,37 @@
{
}
}
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_16CCCC95D1BE41A981EAA4CDAD772F32"
+ {
+ "SourcePath" = "8:x64\\Debug\\regex.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_EB4E176E122E4686A21902DD986EC361"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Debug|x64"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_364DCCAFF25145BCBE75FFEEDCC75B3A"
{
- "SourcePath" = "8:Win32\\Release\\cupstestppd.exe"
+ "SourcePath" = "8:Win32\\Debug\\cupstestppd.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
@@ -2105,9 +2668,121 @@
{
}
}
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_3CBB55F3EBEA4645BE6CEC8A0F251B80"
+ {
+ "SourcePath" = "8:x64\\Release\\libcups2.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_ABA133175ABB48058F633A1599B418BC"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Release|x64"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_3F5E38826D0C441897F43747FFA7491A"
+ {
+ "SourcePath" = "8:x64\\Debug\\libcups2.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_EB4E176E122E4686A21902DD986EC361"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Debug|x64"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_52B5F2EDEDEC48B5A1188F780C67DE9B"
+ {
+ "SourcePath" = "8:Win32\\Release\\regex.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Release|Win32"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5B2FBC1C3AD5490689A61629854C80AF"
+ {
+ "SourcePath" = "8:Win32\\Debug\\ippfind.exe"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_B20638175CCB42398417E0683A12469C"
{
- "SourcePath" = "8:Win32\\Release\\ipptool.exe"
+ "SourcePath" = "8:Win32\\Debug\\ipptool.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
@@ -2133,12 +2808,68 @@
{
}
}
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_BAEADCCB6AD74F36AE08401229354D79"
+ {
+ "SourcePath" = "8:Win32\\Release\\libcups2.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Release|Win32"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_C17DC336766E4B1BBC8DD24D686C440A"
+ {
+ "SourcePath" = "8:x64\\Release\\regex.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_ABA133175ABB48058F633A1599B418BC"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Release|x64"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8"
{
- "SourcePath" = "8:Win32\\Release\\regex.dll"
+ "SourcePath" = "8:Win32\\Debug\\regex.dll"
"TargetName" = "8:"
"Tag" = "8:"
- "Folder" = "8:_C8D931ADC425446B916E9711B929659F"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
@@ -2161,12 +2892,68 @@
{
}
}
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D3197C67CBAC46DE854CF283CDBC677E"
+ {
+ "SourcePath" = "8:Win32\\Debug\\regex.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_E6A941208712461FAD0B4FB291EDDD56"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Debug|Win32"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E9925AF9A2D343D6BFE5BDAE33481292"
+ {
+ "SourcePath" = "8:Win32\\Debug\\libcups2.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_E6A941208712461FAD0B4FB291EDDD56"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:Debug|Win32"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A"
{
- "SourcePath" = "8:Win32\\Release\\libcups2.dll"
+ "SourcePath" = "8:Win32\\Debug\\libcups2.dll"
"TargetName" = "8:"
"Tag" = "8:"
- "Folder" = "8:_C8D931ADC425446B916E9711B929659F"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
diff --git a/vcnet/libcups2.vcproj b/vcnet/libcups2.vcproj
index 6e12bda..d22a863 100644
--- a/vcnet/libcups2.vcproj
+++ b/vcnet/libcups2.vcproj
@@ -4,6 +4,7 @@
Version="9.00"
Name="libcups2"
ProjectGUID="{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
+ RootNamespace="libcups2"
Keyword="Win32Proj"
TargetFrameworkVersion="131072"
>
@@ -44,8 +45,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
- PreprocessorDefinitions="WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"
+ PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -67,7 +68,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/NODEFAULTLIB:libcmt"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
+ AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"
OutputFile="$(OutDir)\libcups2.dll"
LinkIncremental="2"
ModuleDefinitionFile="..\cups\libcups2.def"
@@ -128,8 +129,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"
+ PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -150,7 +151,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
+ AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"
OutputFile="$(OutDir)\libcups2.dll"
LinkIncremental="2"
ModuleDefinitionFile="..\cups\libcups2.def"
@@ -208,8 +209,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="1"
- AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"
- PreprocessorDefinitions="WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"
+ PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="3"
@@ -228,7 +229,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/NODEFAULTLIB:libcmt"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
+ AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"
OutputFile="$(OutDir)\libcups2.dll"
LinkIncremental="1"
ModuleDefinitionFile="..\cups\libcups2.def"
@@ -292,8 +293,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="1"
- AdditionalIncludeDirectories="..\vcnet,.."
- PreprocessorDefinitions="WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
+ AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"
+ PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="3"
@@ -311,7 +312,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib advapi32.lib"
+ AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"
OutputFile="$(OutDir)\libcups2.dll"
LinkIncremental="1"
ModuleDefinitionFile="..\cups\libcups2.def"
@@ -484,6 +485,18 @@
>
</File>
<File
+ RelativePath="..\cups\dest-job.c"
+ >
+ </File>
+ <File
+ RelativePath="..\cups\dest-localization.c"
+ >
+ </File>
+ <File
+ RelativePath="..\cups\dest-options.c"
+ >
+ </File>
+ <File
RelativePath="..\cups\dest.c"
>
<FileConfiguration
@@ -1028,6 +1041,10 @@
</FileConfiguration>
</File>
<File
+ RelativePath="..\cups\libcups2.def"
+ >
+ </File>
+ <File
RelativePath="..\cups\localize.c"
>
</File>
@@ -1304,10 +1321,6 @@
</FileConfiguration>
</File>
<File
- RelativePath="..\cups\sspi.c"
- >
- </File>
- <File
RelativePath="..\cups\string.c"
>
<FileConfiguration
@@ -1384,6 +1397,10 @@
>
</File>
<File
+ RelativePath="..\cups\tls.c"
+ >
+ </File>
+ <File
RelativePath="..\cups\transcode.c"
>
<FileConfiguration
@@ -1514,6 +1531,10 @@
>
</File>
<File
+ RelativePath="..\cups\cups-private.h"
+ >
+ </File>
+ <File
RelativePath="..\cups\cups.h"
>
</File>
@@ -1586,10 +1607,6 @@
>
</File>
<File
- RelativePath="..\cups\sspi-private.h"
- >
- </File>
- <File
RelativePath="..\cups\string-private.h"
>
</File>
diff --git a/vcnet/regex.vcproj b/vcnet/regex.vcproj
index 8b13f6f..fbc9fdf 100644
--- a/vcnet/regex.vcproj
+++ b/vcnet/regex.vcproj
@@ -12,6 +12,9 @@
<Platform
Name="Win32"
/>
+ <Platform
+ Name="x64"
+ />
</Platforms>
<ToolFiles>
</ToolFiles>
@@ -165,6 +168,157 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="regex"
+ PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;REGEX_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ ModuleDefinitionFile="regex/regex.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories="regex"
+ PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;REGEX_EXPORTS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ ModuleDefinitionFile="regex/regex.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
</Configurations>
<References>
</References>
diff --git a/vcnet/regex/regcomp.c b/vcnet/regex/regcomp.c
index 5df5d53..22e7433 100644
--- a/vcnet/regex/regcomp.c
+++ b/vcnet/regex/regcomp.c
@@ -1345,7 +1345,7 @@ sopno finish; /* to this less one */
return(ret);
enlarge(p, p->ssize + len); /* this many unexpected additions */
assert(p->ssize >= p->slen + len);
- (void) memcpy((char *)(p->strip + p->slen),
+ (void) memmove((char *)(p->strip + p->slen),
(char *)(p->strip + start), (size_t)len*sizeof(sop));
p->slen += len;
return(ret);
diff --git a/vcnet/sw-ippeveselfcert10.vdproj b/vcnet/sw-ippeveselfcert10.vdproj
new file mode 100644
index 0000000..2895a46
--- /dev/null
+++ b/vcnet/sw-ippeveselfcert10.vdproj
@@ -0,0 +1,1581 @@
+"DeployProject"
+{
+"VSVersion" = "3:800"
+"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
+"IsWebType" = "8:FALSE"
+"ProjectName" = "8:sw-ippeveselfcert10"
+"LanguageId" = "3:1033"
+"CodePage" = "3:1252"
+"UILanguageId" = "3:1033"
+"SccProjectName" = "8:"
+"SccLocalPath" = "8:"
+"SccAuxPath" = "8:"
+"SccProvider" = "8:"
+ "Hierarchy"
+ {
+ "Entry"
+ {
+ "MsmKey" = "8:_156E3B06B7D14775B28242360FB7D1A0"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1A1324305D78463BBFC62269C56DCF0B"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1BCBABF5693841AE92515645BB7765F4"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_27AB74FFFBC7436B9EBC6AE23968CFCC"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_299D5816FF7142F3B2791685551AD1DC"
+ "OwnerKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_43D276E6E3054544A6A9828BE66519CD"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_466C1CF41795452A8B76425F8D05D8B8"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_842C04D73EBC4F5DBC2FD58D5B98D5D1"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_965005559A264140806149D54E2243BB"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9CB71023ADF84278A4A5EBC398F6C9F3"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9FBF78D7B89EEA843380D5F10E1954D7"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ "OwnerKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ "OwnerKey" = "8:_466C1CF41795452A8B76425F8D05D8B8"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A9EA3BF89F284AB4853F0682CE277275"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7D835B019744E61A7CC37B57B38694E"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_BD5B70C103EF41D9A30CF249D2B93CEB"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C430646D6E7C4CBDA84F951AE95EB76F"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D219587BACAC4D5FB4C8010900A781AD"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D5CD9D9AB1644688A1D54B1589BDF724"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E3C6C5A7FDD94965B68960844461D5EA"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E5E464C7DD97439B929E1EA1844F1FF0"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E97571D3FBE048DABDC59B37762D800F"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F22F5380A6E14A43A15A452C7C6F6C07"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ }
+ "Configurations"
+ {
+ "Debug"
+ {
+ "DisplayName" = "8:Debug"
+ "IsDebugOnly" = "11:TRUE"
+ "IsReleaseOnly" = "11:FALSE"
+ "OutputFilename" = "8:sw-ippeveselfcert10-windows.msi"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:3"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:2"
+ "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
+ {
+ "Enabled" = "11:TRUE"
+ "PromptEnabled" = "11:TRUE"
+ "PrerequisitesLocation" = "2:1"
+ "Url" = "8:"
+ "ComponentsUrl" = "8:"
+ "Items"
+ {
+ "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"
+ {
+ "Name" = "8:.NET Framework 3.5 SP1"
+ "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1"
+ }
+ "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"
+ {
+ "Name" = "8:Windows Installer 3.1"
+ "ProductCode" = "8:Microsoft.Windows.Installer.3.1"
+ }
+ }
+ }
+ }
+ "Release"
+ {
+ "DisplayName" = "8:Release"
+ "IsDebugOnly" = "11:FALSE"
+ "IsReleaseOnly" = "11:TRUE"
+ "OutputFilename" = "8:ipptool-windows.msi"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:3"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:2"
+ "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
+ {
+ "Enabled" = "11:TRUE"
+ "PromptEnabled" = "11:TRUE"
+ "PrerequisitesLocation" = "2:1"
+ "Url" = "8:"
+ "ComponentsUrl" = "8:"
+ "Items"
+ {
+ "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"
+ {
+ "Name" = "8:.NET Framework 3.5 SP1"
+ "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1"
+ }
+ "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"
+ {
+ "Name" = "8:Windows Installer 3.1"
+ "ProductCode" = "8:Microsoft.Windows.Installer.3.1"
+ }
+ }
+ }
+ }
+ }
+ "Deployable"
+ {
+ "CustomAction"
+ {
+ }
+ "DefaultFeature"
+ {
+ "Name" = "8:DefaultFeature"
+ "Title" = "8:"
+ "Description" = "8:"
+ }
+ "ExternalPersistence"
+ {
+ "LaunchCondition"
+ {
+ }
+ }
+ "File"
+ {
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_156E3B06B7D14775B28242360FB7D1A0"
+ {
+ "SourcePath" = "8:..\\everywhere\\document-tests.bat"
+ "TargetName" = "8:document-tests.bat"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1A1324305D78463BBFC62269C56DCF0B"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ipptoolfile.html"
+ "TargetName" = "8:man-ipptoolfile.html"
+ "Tag" = "8:"
+ "Folder" = "8:_26743E387598422398CF503F7478F9E1"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1BCBABF5693841AE92515645BB7765F4"
+ {
+ "SourcePath" = "8:..\\everywhere\\man-ippserver.html"
+ "TargetName" = "8:man-ippserver.html"
+ "Tag" = "8:"
+ "Folder" = "8:_26743E387598422398CF503F7478F9E1"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"
+ {
+ "SourcePath" = "8:zlibwapi.dll"
+ "TargetName" = "8:zlibwapi.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_27AB74FFFBC7436B9EBC6AE23968CFCC"
+ {
+ "SourcePath" = "8:..\\everywhere\\README.txt"
+ "TargetName" = "8:README.txt"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_43D276E6E3054544A6A9828BE66519CD"
+ {
+ "SourcePath" = "8:..\\test\\printer.png"
+ "TargetName" = "8:printer.png"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_592FC984DBFD494D9FB7DFFEA35AD7A5"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ippfind.html"
+ "TargetName" = "8:man-ippfind.html"
+ "Tag" = "8:"
+ "Folder" = "8:_26743E387598422398CF503F7478F9E1"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_842C04D73EBC4F5DBC2FD58D5B98D5D1"
+ {
+ "SourcePath" = "8:..\\test\\document-a4.pdf"
+ "TargetName" = "8:document-a4.pdf"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_965005559A264140806149D54E2243BB"
+ {
+ "SourcePath" = "8:..\\everywhere\\bonjour-access-tests.test"
+ "TargetName" = "8:bonjour-access-tests.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50"
+ {
+ "SourcePath" = "8:CRYPT32.dll"
+ "TargetName" = "8:CRYPT32.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9CB71023ADF84278A4A5EBC398F6C9F3"
+ {
+ "SourcePath" = "8:..\\everywhere\\bonjour-tests.bat"
+ "TargetName" = "8:bonjour-tests.bat"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9FBF78D7B89EEA843380D5F10E1954D7"
+ {
+ "SourcePath" = "8:Secur32.dll"
+ "TargetName" = "8:Secur32.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A9EA3BF89F284AB4853F0682CE277275"
+ {
+ "SourcePath" = "8:..\\everywhere\\bonjour-value-tests.test"
+ "TargetName" = "8:bonjour-value-tests.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B7D835B019744E61A7CC37B57B38694E"
+ {
+ "SourcePath" = "8:..\\everywhere\\document-tests.test"
+ "TargetName" = "8:document-tests.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_BD5B70C103EF41D9A30CF249D2B93CEB"
+ {
+ "SourcePath" = "8:setdebug.bat"
+ "TargetName" = "8:setdebug.bat"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C430646D6E7C4CBDA84F951AE95EB76F"
+ {
+ "SourcePath" = "8:..\\test\\color.jpg"
+ "TargetName" = "8:color.jpg"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D219587BACAC4D5FB4C8010900A781AD"
+ {
+ "SourcePath" = "8:..\\everywhere\\ipp-tests.test"
+ "TargetName" = "8:ipp-tests.test"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D5CD9D9AB1644688A1D54B1589BDF724"
+ {
+ "SourcePath" = "8:..\\doc\\help\\man-ipptool.html"
+ "TargetName" = "8:man-ipptool.html"
+ "Tag" = "8:"
+ "Folder" = "8:_26743E387598422398CF503F7478F9E1"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E3C6C5A7FDD94965B68960844461D5EA"
+ {
+ "SourcePath" = "8:..\\LICENSE.txt"
+ "TargetName" = "8:LICENSE.txt"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E5E464C7DD97439B929E1EA1844F1FF0"
+ {
+ "SourcePath" = "8:..\\everywhere\\ipp-tests.bat"
+ "TargetName" = "8:ipp-tests.bat"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F22F5380A6E14A43A15A452C7C6F6C07"
+ {
+ "SourcePath" = "8:..\\test\\document-letter.pdf"
+ "TargetName" = "8:document-letter.pdf"
+ "Tag" = "8:"
+ "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ }
+ "FileType"
+ {
+ }
+ "Folder"
+ {
+ "{1525181F-901A-416C-8A58-119130FE478E}:_BEC0EAE20C954C78B294B83E6696156E"
+ {
+ "Name" = "8:#1919"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:ProgramMenuFolder"
+ "Folders"
+ {
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_E379D4EDBAD0460BB876711E9062ADB4"
+ {
+ "Name" = "8:IPP Everywhere Printer Self-Certification Tools"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_D115D2F4F12143B09D5FDA447A6A7D04"
+ "Folders"
+ {
+ }
+ }
+ }
+ }
+ "{1525181F-901A-416C-8A58-119130FE478E}:_D02CDADE99F344CF92CA1A8D0278861F"
+ {
+ "Name" = "8:#1916"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:DesktopFolder"
+ "Folders"
+ {
+ }
+ }
+ "{3C67513D-01DD-4637-8A68-80971EB9504F}:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ {
+ "DefaultLocation" = "8:[ProgramFilesFolder]\\sw-ippeveselfcert10"
+ "Name" = "8:#1925"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:TARGETDIR"
+ "Folders"
+ {
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_26743E387598422398CF503F7478F9E1"
+ {
+ "Name" = "8:doc"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_5CD53B90FF754768B11ECBEB671A1749"
+ "Folders"
+ {
+ }
+ }
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_EB00D0298C7E441EBD0257AC04FB3560"
+ {
+ "Name" = "8:ipptool"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_6F223FB51798428A9F2D64A5A7F2B49C"
+ "Folders"
+ {
+ }
+ }
+ }
+ }
+ }
+ "LaunchCondition"
+ {
+ }
+ "Locator"
+ {
+ }
+ "MsiBootstrapper"
+ {
+ "LangId" = "3:1033"
+ "RequiresElevation" = "11:FALSE"
+ }
+ "Product"
+ {
+ "Name" = "8:Microsoft Visual Studio"
+ "ProductName" = "8:IPP Everywhere Printer Self-Certification Tools"
+ "ProductCode" = "8:{C08E3AC5-4FBF-40DD-BD19-9BE69A609DAF}"
+ "PackageCode" = "8:{25FF31C9-52A0-4838-8F1D-02FB5D5296F4}"
+ "UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}"
+ "RestartWWWService" = "11:FALSE"
+ "RemovePreviousVersions" = "11:TRUE"
+ "DetectNewerInstalledVersion" = "11:TRUE"
+ "InstallAllUsers" = "11:TRUE"
+ "ProductVersion" = "8:14.08.2600"
+ "Manufacturer" = "8:Apple Inc."
+ "ARPHELPTELEPHONE" = "8:"
+ "ARPHELPLINK" = "8:http://www.cups.org/str.php"
+ "Title" = "8:sw-ippeveselfcert10"
+ "Subject" = "8:"
+ "ARPCONTACT" = "8:Apple Inc."
+ "Keywords" = "8:IPP, Internet Printing Protocol"
+ "ARPCOMMENTS" = "8:IPP Everywhere Printer Self-Certification Tools"
+ "ARPURLINFOABOUT" = "8:http://www.cups.org/"
+ "ARPPRODUCTICON" = "8:"
+ "ARPIconIndex" = "3:0"
+ "SearchPath" = "8:"
+ "UseSystemSearchPath" = "11:TRUE"
+ "TargetPlatform" = "3:0"
+ "PreBuildEvent" = "8:"
+ "PostBuildEvent" = "8:"
+ "RunPostBuildEvent" = "3:0"
+ }
+ "Registry"
+ {
+ "HKLM"
+ {
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BC4E66686BCA4F9A8B24B6CF2728DACD"
+ {
+ "Name" = "8:Software"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F9AB9B310C7545D993D690F529048AA2"
+ {
+ "Name" = "8:cups.org"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E5BAC705A1D44E78C90C6D2A4A7BE20"
+ {
+ "Name" = "8:installdir"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:2"
+ "Value" = "8:[TARGETDIR]"
+ }
+ }
+ }
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ }
+ "HKCU"
+ {
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A4C9879F42874B6B92960A55F2D98922"
+ {
+ "Name" = "8:Software"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1ACB03C307FB4B85BB27C9913FB58B09"
+ {
+ "Name" = "8:[Manufacturer]"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ }
+ "HKCR"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKU"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKPU"
+ {
+ "Keys"
+ {
+ }
+ }
+ }
+ "Sequences"
+ {
+ }
+ "Shortcut"
+ {
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_57BCED85BA5944009F56A11D5A9FBBEE"
+ {
+ "Name" = "8:ippfind Documentation"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_26743E387598422398CF503F7478F9E1"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_63715171338D40FFBC5B47A1418B4814"
+ {
+ "Name" = "8:README"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_27AB74FFFBC7436B9EBC6AE23968CFCC"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_70CF74DB997A408DBBFD48AB10F92321"
+ {
+ "Name" = "8:ipptool Documentation"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_D5CD9D9AB1644688A1D54B1589BDF724"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_962004B0D5CA479A91EFA7F7BF7814C8"
+ {
+ "Name" = "8:ippserver Documentation"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_1BCBABF5693841AE92515645BB7765F4"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_26743E387598422398CF503F7478F9E1"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_BD2A7DF74D844FF5919EE8340EE36ECD"
+ {
+ "Name" = "8:Test File Documentation"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_1A1324305D78463BBFC62269C56DCF0B"
+ "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"
+ "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ }
+ "UserInterface"
+ {
+ "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_045DF90B1FF941A9BA7A742CFC0A6C00"
+ {
+ "UseDynamicProperties" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_345BD86390E841A98B74ED3E07945F8C"
+ {
+ "Name" = "8:#1900"
+ "Sequence" = "3:2"
+ "Attributes" = "3:1"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_067C143A8731427180B1568AF8C07375"
+ {
+ "Sequence" = "3:200"
+ "DisplayName" = "8:Installation Folder"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A2F2CC6EB9D7453599E7598D4D0629A5"
+ {
+ "Sequence" = "3:300"
+ "DisplayName" = "8:Confirm Installation"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C2B41369B7334F419318792EBA031412"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Welcome"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "CopyrightWarning"
+ {
+ "Name" = "8:CopyrightWarning"
+ "DisplayName" = "8:#1002"
+ "Description" = "8:#1102"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:2"
+ "Value" = "8:This computer program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2."
+ "DefaultValue" = "8:#1202"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "Welcome"
+ {
+ "Name" = "8:Welcome"
+ "DisplayName" = "8:#1003"
+ "Description" = "8:#1103"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1203"
+ "DefaultValue" = "8:#1203"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6B654A06090344BA9AA443E0D0296737"
+ {
+ "Name" = "8:#1902"
+ "Sequence" = "3:1"
+ "Attributes" = "3:3"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FB4E7BBC3DA242309FFB58F9A6194A93"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Finished"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "UpdateText"
+ {
+ "Name" = "8:UpdateText"
+ "DisplayName" = "8:#1058"
+ "Description" = "8:#1158"
+ "Type" = "3:15"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1258"
+ "DefaultValue" = "8:#1258"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_712819C7C4F042ABB708949BD4426628"
+ {
+ "Name" = "8:#1900"
+ "Sequence" = "3:1"
+ "Attributes" = "3:1"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2F49D4FACB954AF2B786D2AD9206D053"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Welcome"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "CopyrightWarning"
+ {
+ "Name" = "8:CopyrightWarning"
+ "DisplayName" = "8:#1002"
+ "Description" = "8:#1102"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:2"
+ "Value" = "8:This computer program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2."
+ "DefaultValue" = "8:#1202"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "Welcome"
+ {
+ "Name" = "8:Welcome"
+ "DisplayName" = "8:#1003"
+ "Description" = "8:#1103"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1203"
+ "DefaultValue" = "8:#1203"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_770E25BC453A464EA8CD51381FDDDD9F"
+ {
+ "Sequence" = "3:300"
+ "DisplayName" = "8:Confirm Installation"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9534A64B629F4F868D6D7A384C76DCB2"
+ {
+ "Sequence" = "3:200"
+ "DisplayName" = "8:Installation Folder"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "InstallAllUsersVisible"
+ {
+ "Name" = "8:InstallAllUsersVisible"
+ "DisplayName" = "8:#1059"
+ "Description" = "8:#1159"
+ "Type" = "3:5"
+ "ContextData" = "8:1;True=1;False=0"
+ "Attributes" = "3:0"
+ "Setting" = "3:0"
+ "Value" = "3:1"
+ "DefaultValue" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_770CCEFF81BD46A182A6E816A41A0E81"
+ {
+ "Name" = "8:#1901"
+ "Sequence" = "3:2"
+ "Attributes" = "3:2"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_75E0C1FD245D493DA0D7E3E0BC0C365F"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Progress"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "ShowProgress"
+ {
+ "Name" = "8:ShowProgress"
+ "DisplayName" = "8:#1009"
+ "Description" = "8:#1109"
+ "Type" = "3:5"
+ "ContextData" = "8:1;True=1;False=0"
+ "Attributes" = "3:0"
+ "Setting" = "3:0"
+ "Value" = "3:1"
+ "DefaultValue" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_933B15E9A383418F8ADF3B13F68458F3"
+ {
+ "UseDynamicProperties" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E310DA8CED734E00950A3C5D630CE987"
+ {
+ "Name" = "8:#1902"
+ "Sequence" = "3:2"
+ "Attributes" = "3:3"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CB172E69F9C74901BE1040336CFD4F72"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Finished"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F44F9BE9B54940848289669635E4A5A2"
+ {
+ "Name" = "8:#1901"
+ "Sequence" = "3:1"
+ "Attributes" = "3:2"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_14751F327A634B989283C8F28CFB6DFC"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Progress"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "ShowProgress"
+ {
+ "Name" = "8:ShowProgress"
+ "DisplayName" = "8:#1009"
+ "Description" = "8:#1109"
+ "Type" = "3:5"
+ "ContextData" = "8:1;True=1;False=0"
+ "Attributes" = "3:0"
+ "Setting" = "3:0"
+ "Value" = "3:1"
+ "DefaultValue" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ }
+ "MergeModule"
+ {
+ "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_299D5816FF7142F3B2791685551AD1DC"
+ {
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:TRUE"
+ "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"
+ "Properties"
+ {
+ }
+ "LanguageId" = "3:0"
+ "Exclude" = "11:FALSE"
+ "Folder" = "8:"
+ "Feature" = "8:"
+ "IsolateTo" = "8:"
+ }
+ "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_A1CB27EFF4094C39B58D0BE5A272DF1A"
+ {
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:TRUE"
+ "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"
+ "Properties"
+ {
+ }
+ "LanguageId" = "3:0"
+ "Exclude" = "11:FALSE"
+ "Folder" = "8:"
+ "Feature" = "8:"
+ "IsolateTo" = "8:"
+ }
+ }
+ "ProjectOutput"
+ {
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_466C1CF41795452A8B76425F8D05D8B8"
+ {
+ "SourcePath" = "8:Win32\\Debug\\ippserver.exe"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_58DC0E72F0944BEFB927AED718CD1660"
+ {
+ "SourcePath" = "8:Win32\\Debug\\ippfind.exe"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8"
+ {
+ "SourcePath" = "8:Win32\\Debug\\regex.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E97571D3FBE048DABDC59B37762D800F"
+ {
+ "SourcePath" = "8:Win32\\Debug\\ipptool.exe"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A"
+ {
+ "SourcePath" = "8:Win32\\Debug\\libcups2.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ }
+ }
+}
diff --git a/xcode/CUPS.xcodeproj/project.pbxproj b/xcode/CUPS.xcodeproj/project.pbxproj
index 23a2067..6f85ea9 100644
--- a/xcode/CUPS.xcodeproj/project.pbxproj
+++ b/xcode/CUPS.xcodeproj/project.pbxproj
@@ -13,8 +13,12 @@
buildPhases = (
);
dependencies = (
+ 274EE2861A03EEEE003213D1 /* PBXTargetDependency */,
+ 274EE2881A03EEEE003213D1 /* PBXTargetDependency */,
726AD704135E8AA1002C930D /* PBXTargetDependency */,
+ 2767FC5419267469000F61D3 /* PBXTargetDependency */,
273BF6DE1333B6370022CAAB /* PBXTargetDependency */,
+ 2767FC5619267469000F61D3 /* PBXTargetDependency */,
278C58D6136B641D00836530 /* PBXTargetDependency */,
270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */,
);
@@ -27,7 +31,11 @@
buildPhases = (
);
dependencies = (
+ 27A034871A8BDC6900650675 /* PBXTargetDependency */,
+ 274EE2821A03EEE0003213D1 /* PBXTargetDependency */,
+ 274EE2841A03EEE0003213D1 /* PBXTargetDependency */,
274FF5E313332D4300317ECB /* PBXTargetDependency */,
+ 72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */,
72F75A711336FACD004BB496 /* PBXTargetDependency */,
274FF5E513332D4300317ECB /* PBXTargetDependency */,
274FF622133331D300317ECB /* PBXTargetDependency */,
@@ -42,6 +50,8 @@
274FF65E13333A3400317ECB /* PBXTargetDependency */,
724379531333FECE009631B9 /* PBXTargetDependency */,
724379111333E4EA009631B9 /* PBXTargetDependency */,
+ 72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */,
+ 72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */,
276683FF1337F7C5000D33D0 /* PBXTargetDependency */,
7243792B1333E962009631B9 /* PBXTargetDependency */,
276683D71337B24A000D33D0 /* PBXTargetDependency */,
@@ -63,6 +73,20 @@
270CCDBA135E3D0900007BE2 /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; };
270CCDBC135E3D3E00007BE2 /* testmime.c in Sources */ = {isa = PBXBuildFile; fileRef = 270CCDBB135E3D3E00007BE2 /* testmime.c */; };
273BF6C71333B5370022CAAB /* testcups.c in Sources */ = {isa = PBXBuildFile; fileRef = 273BF6C61333B5370022CAAB /* testcups.c */; };
+ 274EE2611A03EDCA003213D1 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 274EE2621A03EDCA003213D1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+ 274EE2631A03EDCA003213D1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+ 274EE2641A03EDCA003213D1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+ 274EE2651A03EDCA003213D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+ 274EE2661A03EDCA003213D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+ 274EE2721A03EDCB003213D1 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 274EE2731A03EDCB003213D1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+ 274EE2741A03EDCB003213D1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+ 274EE2751A03EDCB003213D1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+ 274EE2761A03EDCB003213D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+ 274EE2771A03EDCB003213D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+ 274EE27E1A03EE0B003213D1 /* ippinfra.c in Sources */ = {isa = PBXBuildFile; fileRef = 274EE27D1A03EE0B003213D1 /* ippinfra.c */; };
+ 274EE2801A03EE41003213D1 /* ippproxy.c in Sources */ = {isa = PBXBuildFile; fileRef = 274EE27F1A03EE41003213D1 /* ippproxy.c */; };
274FF5D913332CC700317ECB /* cups-driverd.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D613332CC700317ECB /* cups-driverd.cxx */; };
274FF5DA13332CC700317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D713332CC700317ECB /* util.c */; };
274FF5DD13332D0600317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
@@ -193,11 +217,39 @@
276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
2766840F1337FA38000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
276684111337FA7C000D33D0 /* cupsaddsmb.c in Sources */ = {isa = PBXBuildFile; fileRef = 276684101337FA7C000D33D0 /* cupsaddsmb.c */; };
+ 2767FC5219266A36000F61D3 /* testdest.c in Sources */ = {isa = PBXBuildFile; fileRef = 2767FC5119266A36000F61D3 /* testdest.c */; };
+ 2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 2767FC58192674E0000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 2767FC5F1926750C000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+ 2767FC601926750C000F61D3 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; };
+ 2767FC611926750C000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+ 2767FC621926750C000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+ 2767FC631926750C000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+ 2767FC641926750C000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+ 2767FC6519267538000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 2767FC6619267538000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+ 2767FC6719267538000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+ 2767FC6819267538000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+ 2767FC6919267538000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+ 2767FC6A19267538000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+ 2767FC6B192685E6000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 2767FC6C192685E6000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+ 2767FC6D192685E6000F61D3 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; };
+ 2767FC6E192685E6000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+ 2767FC6F192685E6000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+ 2767FC70192685E6000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+ 2767FC71192685E6000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+ 2767FC7219268F06000F61D3 /* dest-job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E018A13543000FCAE4 /* dest-job.c */; };
+ 2767FC7319268F09000F61D3 /* dest-localization.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E118A13543000FCAE4 /* dest-localization.c */; };
+ 2767FC7419268F0C000F61D3 /* dest-options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E218A13543000FCAE4 /* dest-options.c */; };
278C58E3136B647200836530 /* testhttp.c in Sources */ = {isa = PBXBuildFile; fileRef = 278C58E2136B647200836530 /* testhttp.c */; };
278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; };
278C58EB136B64B000836530 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; };
278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; };
+ 27A034821A8BDC3A00650675 /* lpadmin.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08D137A3F5200FAFEF6 /* lpadmin.c */; };
+ 27A034851A8BDC5C00650675 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
+ 7200511218F492F200E7B81B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
720DD6D31358FDDE0064AA82 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 720DD6D21358FDDE0064AA82 /* snmp.c */; };
720DD6D413590AB90064AA82 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; };
@@ -329,7 +381,8 @@
7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; };
726AD702135E8A90002C930D /* ippserver.c in Sources */ = {isa = PBXBuildFile; fileRef = 726AD701135E8A90002C930D /* ippserver.c */; };
7271883D1374AB14001A2036 /* mime-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7271883C1374AB14001A2036 /* mime-private.h */; };
- 728FB7E8153600FA005426E1 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 728FB7E3153600FA005426E1 /* tls.c */; };
+ 727AD5B719100A58009F6862 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.c */; };
+ 727AD5B819100A58009F6862 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.c */; };
728FB7E91536161C005426E1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
728FB7EA1536161C005426E1 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; };
728FB7EB1536161C005426E1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; };
@@ -337,7 +390,28 @@
728FB7EE15361642005426E1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; };
728FB7F11536167A005426E1 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; };
728FB7F21536167A005426E1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; };
+ 72BFD5FB191AF0A30005DA37 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+ 72BFD5FC191AF0A30005DA37 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
+ 72BFD5FD191AF0A30005DA37 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; };
+ 72BFD5FE191AF0A30005DA37 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; };
+ 72BFD5FF191AF0A30005DA37 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; };
+ 72BFD600191AF0A30005DA37 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; };
+ 72BFD601191AF0A30005DA37 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; };
+ 72BFD602191AF1270005DA37 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
+ 72BFD603191AF1270005DA37 /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; };
+ 72BFD604191AF1270005DA37 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; };
+ 72BFD605191AF1270005DA37 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; };
+ 72BFD606191AF1270005DA37 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; };
+ 72BFD607191AF1270005DA37 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; };
+ 72BFD608191AF1270005DA37 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; };
+ 72BFD609191AF14C0005DA37 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; };
72C16CB9137B195D007E4BF4 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72C16CB8137B195D007E4BF4 /* file.c */; };
+ 72CEF95618A966E000FA9B81 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
+ 72CF95E318A13543000FCAE4 /* dest-job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E018A13543000FCAE4 /* dest-job.c */; };
+ 72CF95E418A13543000FCAE4 /* dest-localization.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E118A13543000FCAE4 /* dest-localization.c */; };
+ 72CF95E518A13543000FCAE4 /* dest-options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E218A13543000FCAE4 /* dest-options.c */; };
+ 72CF95EC18A19134000FCAE4 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
+ 72CF95F318A19165000FCAE4 /* ippfind.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95F218A19165000FCAE4 /* ippfind.c */; };
72D53A2A15B49110003F877F /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; };
72D53A2D15B4913D003F877F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; };
72D53A2E15B4915B003F877F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; };
@@ -395,6 +469,48 @@
remoteGlobalIDString = 273BF6BC1333B5000022CAAB;
remoteInfo = testcups;
};
+ 274EE25D1A03EDCA003213D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274FF6891333B1C400317ECB;
+ remoteInfo = libcups_static;
+ };
+ 274EE26E1A03EDCB003213D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274FF6891333B1C400317ECB;
+ remoteInfo = libcups_static;
+ };
+ 274EE2811A03EEE0003213D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274EE25B1A03EDCA003213D1;
+ remoteInfo = ippinfra;
+ };
+ 274EE2831A03EEE0003213D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274EE26C1A03EDCB003213D1;
+ remoteInfo = ippproxy;
+ };
+ 274EE2851A03EEEE003213D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274EE25B1A03EDCA003213D1;
+ remoteInfo = ippinfra;
+ };
+ 274EE2871A03EEEE003213D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274EE26C1A03EDCB003213D1;
+ remoteInfo = ippproxy;
+ };
274FF5DB13332CF900317ECB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
@@ -668,6 +784,27 @@
remoteGlobalIDString = 276684031337FA1D000D33D0;
remoteInfo = cupsaddsmb;
};
+ 2767FC4819266A0D000F61D3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274FF6891333B1C400317ECB;
+ remoteInfo = libcups_static;
+ };
+ 2767FC5319267469000F61D3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 276683EF1337F78E000D33D0;
+ remoteInfo = ipptool;
+ };
+ 2767FC5519267469000F61D3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 2767FC4619266A0D000F61D3;
+ remoteInfo = testdest;
+ };
278C58D5136B641D00836530 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
@@ -682,6 +819,20 @@
remoteGlobalIDString = 274FF6891333B1C400317ECB;
remoteInfo = libcups_static;
};
+ 27A034831A8BDC4A00650675 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 72220EAD1333047D00FCA411;
+ remoteInfo = libcups;
+ };
+ 27A034861A8BDC6900650675 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 27A0347A1A8BDB1200650675;
+ remoteInfo = lpadmin;
+ };
720DD6CE1358FD790064AA82 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
@@ -822,6 +973,34 @@
remoteGlobalIDString = 274FF6891333B1C400317ECB;
remoteInfo = libcups_static;
};
+ 72BEA8D319AFA89C0085F0F3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 726AD6F6135E88F0002C930D;
+ remoteInfo = ippserver;
+ };
+ 72BEA8D519AFA8A00085F0F3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 72CF95E618A19134000FCAE4;
+ remoteInfo = ippfind;
+ };
+ 72BEA8D719AFA8BB0085F0F3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 274FF6891333B1C400317ECB;
+ remoteInfo = libcups_static;
+ };
+ 72CF95E818A19134000FCAE4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 72220EAD1333047D00FCA411;
+ remoteInfo = libcups;
+ };
72F75A651336FA30004BB496 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
@@ -864,6 +1043,24 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
+ 274EE2671A03EDCA003213D1 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 274EE2781A03EDCB003213D1 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
274FF5CA13332B1F00317ECB /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -981,6 +1178,15 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
+ 2767FC4C19266A0D000F61D3 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
278C58C9136B640300836530 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -990,6 +1196,15 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
+ 27A034791A8BDB1200650675 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
720DD6C01358FD5F0064AA82 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -1071,6 +1286,15 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
+ 72CF95ED18A19134000FCAE4 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
72F75A501336F950004BB496 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -1083,6 +1307,9 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ 270B267D17F5C06700C8A3A9 /* tls-darwin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-darwin.c"; path = "../cups/tls-darwin.c"; sourceTree = "<group>"; };
+ 270B267E17F5C06700C8A3A9 /* tls-gnutls.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../cups/tls-gnutls.c"; sourceTree = "<group>"; };
+ 270B268117F5C5D600C8A3A9 /* tls-sspi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-sspi.c"; path = "../cups/tls-sspi.c"; sourceTree = "<group>"; };
270CCDA7135E3C9E00007BE2 /* testmime */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testmime; sourceTree = BUILT_PRODUCTS_DIR; };
270CCDBB135E3D3E00007BE2 /* testmime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testmime.c; path = ../scheduler/testmime.c; sourceTree = "<group>"; };
2732E089137A3F5200FAFEF6 /* cancel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cancel.c; path = ../systemv/cancel.c; sourceTree = "<group>"; };
@@ -1093,10 +1320,13 @@
2732E08E137A3F5200FAFEF6 /* lpinfo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpinfo.c; path = ../systemv/lpinfo.c; sourceTree = "<group>"; };
2732E08F137A3F5200FAFEF6 /* lpmove.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpmove.c; path = ../systemv/lpmove.c; sourceTree = "<group>"; };
2732E090137A3F5200FAFEF6 /* lpoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpoptions.c; path = ../systemv/lpoptions.c; sourceTree = "<group>"; };
- 2732E091137A3F5200FAFEF6 /* lppasswd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lppasswd.c; path = ../systemv/lppasswd.c; sourceTree = "<group>"; };
2732E092137A3F5200FAFEF6 /* lpstat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpstat.c; path = ../systemv/lpstat.c; sourceTree = "<group>"; };
273BF6BD1333B5000022CAAB /* testcups */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcups; sourceTree = BUILT_PRODUCTS_DIR; };
273BF6C61333B5370022CAAB /* testcups.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcups.c; path = ../cups/testcups.c; sourceTree = "<group>"; };
+ 274EE26B1A03EDCA003213D1 /* ippserver copy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ippserver copy"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 274EE27C1A03EDCB003213D1 /* ippserver copy copy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ippserver copy copy"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 274EE27D1A03EE0B003213D1 /* ippinfra.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippinfra.c; path = ../test/ippinfra.c; sourceTree = "<group>"; };
+ 274EE27F1A03EE41003213D1 /* ippproxy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippproxy.c; path = ../test/ippproxy.c; sourceTree = "<group>"; };
274FF5CC13332B1F00317ECB /* cups-driverd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-driverd"; sourceTree = BUILT_PRODUCTS_DIR; };
274FF5D613332CC700317ECB /* cups-driverd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "cups-driverd.cxx"; path = "../scheduler/cups-driverd.cxx"; sourceTree = "<group>"; };
274FF5D713332CC700317ECB /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../scheduler/util.c; sourceTree = "<group>"; };
@@ -1148,14 +1378,25 @@
276683F91337F7A9000D33D0 /* ipptool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipptool.c; path = ../test/ipptool.c; sourceTree = "<group>"; };
276684041337FA1D000D33D0 /* cupsaddsmb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsaddsmb; sourceTree = BUILT_PRODUCTS_DIR; };
276684101337FA7C000D33D0 /* cupsaddsmb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsaddsmb.c; path = ../systemv/cupsaddsmb.c; sourceTree = "<group>"; };
+ 2767FC5019266A0D000F61D3 /* testdest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testdest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 2767FC5119266A36000F61D3 /* testdest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testdest.c; path = ../cups/testdest.c; sourceTree = "<group>"; };
+ 2767FC591926750C000F61D3 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
+ 2767FC5A1926750C000F61D3 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; };
+ 2767FC5B1926750C000F61D3 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; };
+ 2767FC5C1926750C000F61D3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+ 2767FC5D1926750C000F61D3 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+ 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+ 2767FC7519269687000F61D3 /* pwg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pwg.h; path = ../cups/pwg.h; sourceTree = "<group>"; };
+ 2767FC76192696A0000F61D3 /* raster-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "raster-private.h"; path = "../cups/raster-private.h"; sourceTree = "<group>"; };
278C58CB136B640300836530 /* testhttp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhttp; sourceTree = BUILT_PRODUCTS_DIR; };
278C58E2136B647200836530 /* testhttp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testhttp.c; path = ../cups/testhttp.c; sourceTree = "<group>"; };
278C58E5136B64AF00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
278C58E6136B64B000836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = /System/Library/Frameworks/Kerberos.framework; sourceTree = "<absolute>"; };
278C58E7136B64B000836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
278C58E8136B64B000836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = "<absolute>"; };
- 27D3037C134148CB00F022B1 /* libcups_s.exp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.exports; name = libcups_s.exp; path = ../cups/libcups_s.exp; sourceTree = "<group>"; };
+ 27A0347B1A8BDB1300650675 /* lpadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpadmin; sourceTree = BUILT_PRODUCTS_DIR; };
27D3037D134148CB00F022B1 /* libcups2.def */ = {isa = PBXFileReference; lastKnownFileType = text; name = libcups2.def; path = ../cups/libcups2.def; sourceTree = "<group>"; };
+ 27F89DA21B3AC43B00E5A4B7 /* testraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testraster.c; path = ../filter/testraster.c; sourceTree = "<group>"; };
720DD6C21358FD5F0064AA82 /* snmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = snmp; sourceTree = BUILT_PRODUCTS_DIR; };
720DD6D21358FDDE0064AA82 /* snmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snmp.c; path = ../backend/snmp.c; sourceTree = "<group>"; };
72220EAE1333047D00FCA411 /* libcups.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1191,7 +1432,7 @@
72220EE0133305BB00FCA411 /* http-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "http-private.h"; path = "../cups/http-private.h"; sourceTree = "<group>"; };
72220EE1133305BB00FCA411 /* http-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-support.c"; path = "../cups/http-support.c"; sourceTree = "<group>"; };
72220EE2133305BB00FCA411 /* http.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = http.c; path = ../cups/http.c; sourceTree = "<group>"; };
- 72220EE3133305BB00FCA411 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = http.h; path = ../cups/http.h; sourceTree = "<group>"; };
+ 72220EE3133305BB00FCA411 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = http.h; path = ../cups/http.h; sourceTree = "<group>"; wrapsLines = 1; };
72220EE4133305BB00FCA411 /* ipp-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ipp-private.h"; path = "../cups/ipp-private.h"; sourceTree = "<group>"; };
72220EE5133305BB00FCA411 /* ipp-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-support.c"; path = "../cups/ipp-support.c"; sourceTree = "<group>"; };
72220EE6133305BB00FCA411 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../cups/ipp.c; sourceTree = "<group>"; };
@@ -1276,6 +1517,9 @@
72220FB313330BCE00FCA411 /* mime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mime.c; path = ../scheduler/mime.c; sourceTree = "<group>"; };
72220FB413330BCE00FCA411 /* mime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mime.h; path = ../scheduler/mime.h; sourceTree = "<group>"; };
72220FB513330BCE00FCA411 /* type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = type.c; path = ../scheduler/type.c; sourceTree = "<group>"; };
+ 7226369B18AE6D19004ED309 /* org.cups.cups-lpd.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "org.cups.cups-lpd.plist"; path = "../scheduler/org.cups.cups-lpd.plist"; sourceTree = SOURCE_ROOT; };
+ 7226369C18AE6D19004ED309 /* org.cups.cupsd.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = org.cups.cupsd.plist; path = ../scheduler/org.cups.cupsd.plist; sourceTree = SOURCE_ROOT; };
+ 7226369D18AE73BB004ED309 /* config.h.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.h.in; path = ../config.h.in; sourceTree = "<group>"; };
7234F41F1378A16F00D3E9C9 /* array-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "array-private.h"; path = "../cups/array-private.h"; sourceTree = "<group>"; };
724378FD1333E43E009631B9 /* ipp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ipp; sourceTree = BUILT_PRODUCTS_DIR; };
724379091333E4E3009631B9 /* backend-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "backend-private.h"; path = "../backend/backend-private.h"; sourceTree = "<group>"; };
@@ -1293,6 +1537,8 @@
724379C41333FFC7009631B9 /* usb-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "usb-darwin.c"; path = "../backend/usb-darwin.c"; sourceTree = "<group>"; };
724379C51333FFC7009631B9 /* usb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usb.c; path = ../backend/usb.c; sourceTree = "<group>"; };
724379CA1334000E009631B9 /* ieee1284.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ieee1284.c; path = ../backend/ieee1284.c; sourceTree = "<group>"; };
+ 72496E161A13A03B0051899C /* org.cups.cups-lpd.socket */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.cups-lpd.socket"; path = "../scheduler/org.cups.cups-lpd.socket"; sourceTree = SOURCE_ROOT; };
+ 72496E171A13A03B0051899C /* org.cups.cups-lpdAT.service.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.cups-lpdAT.service.in"; path = "../scheduler/org.cups.cups-lpdAT.service.in"; sourceTree = SOURCE_ROOT; };
7258EAE2134594C4009286F1 /* rastertopwg */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rastertopwg; sourceTree = BUILT_PRODUCTS_DIR; };
7258EAEC134594EB009286F1 /* rastertopwg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rastertopwg.c; path = ../filter/rastertopwg.c; sourceTree = "<group>"; };
726AD6F7135E88F0002C930D /* ippserver */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippserver; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1306,27 +1552,131 @@
7271882213746EA8001A2036 /* rastertohp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertohp.c; path = ../filter/rastertohp.c; sourceTree = "<group>"; };
7271882313746EA8001A2036 /* rastertolabel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertolabel.c; path = ../filter/rastertolabel.c; sourceTree = "<group>"; };
7271883C1374AB14001A2036 /* mime-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mime-private.h"; path = "../scheduler/mime-private.h"; sourceTree = "<group>"; };
- 728FB7E0153600FA005426E1 /* tls-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-darwin.c"; path = "../scheduler/tls-darwin.c"; sourceTree = "<group>"; };
- 728FB7E1153600FA005426E1 /* tls-gnutls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../scheduler/tls-gnutls.c"; sourceTree = "<group>"; };
- 728FB7E2153600FA005426E1 /* tls-openssl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-openssl.c"; path = "../scheduler/tls-openssl.c"; sourceTree = "<group>"; };
- 728FB7E3153600FA005426E1 /* tls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls.c; path = ../scheduler/tls.c; sourceTree = "<group>"; };
- 728FB7EC1536161C005426E1 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = ../../../../../usr/lib/libz.dylib; sourceTree = "<group>"; };
- 728FB7EF1536167A005426E1 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = ../../../../../usr/lib/libiconv.dylib; sourceTree = "<group>"; };
- 728FB7F01536167A005426E1 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = ../../../../../usr/lib/libresolv.dylib; sourceTree = "<group>"; };
+ 727AD5B619100A58009F6862 /* tls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls.c; path = ../cups/tls.c; sourceTree = "<group>"; };
+ 727EF02F192E3498001EF690 /* admin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = admin.c; path = "../cgi-bin/admin.c"; sourceTree = "<group>"; wrapsLines = 1; };
+ 727EF030192E3498001EF690 /* cgi-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "cgi-private.h"; path = "../cgi-bin/cgi-private.h"; sourceTree = "<group>"; };
+ 727EF031192E3498001EF690 /* cgi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cgi.h; path = "../cgi-bin/cgi.h"; sourceTree = "<group>"; };
+ 727EF032192E3498001EF690 /* classes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = classes.c; path = "../cgi-bin/classes.c"; sourceTree = "<group>"; };
+ 727EF033192E3498001EF690 /* help-index.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "help-index.c"; path = "../cgi-bin/help-index.c"; sourceTree = "<group>"; };
+ 727EF034192E3498001EF690 /* help-index.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "help-index.h"; path = "../cgi-bin/help-index.h"; sourceTree = "<group>"; };
+ 727EF035192E3498001EF690 /* help.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = help.c; path = "../cgi-bin/help.c"; sourceTree = "<group>"; };
+ 727EF036192E3498001EF690 /* html.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = html.c; path = "../cgi-bin/html.c"; sourceTree = "<group>"; };
+ 727EF037192E3498001EF690 /* ipp-var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "ipp-var.c"; path = "../cgi-bin/ipp-var.c"; sourceTree = "<group>"; };
+ 727EF038192E3498001EF690 /* jobs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jobs.c; path = "../cgi-bin/jobs.c"; sourceTree = "<group>"; };
+ 727EF039192E3498001EF690 /* makedocset.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = makedocset.c; path = "../cgi-bin/makedocset.c"; sourceTree = "<group>"; };
+ 727EF03A192E3498001EF690 /* printers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = printers.c; path = "../cgi-bin/printers.c"; sourceTree = "<group>"; };
+ 727EF03B192E3498001EF690 /* search.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = search.c; path = "../cgi-bin/search.c"; sourceTree = "<group>"; };
+ 727EF03C192E3498001EF690 /* template.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = template.c; path = "../cgi-bin/template.c"; sourceTree = "<group>"; };
+ 727EF03D192E3498001EF690 /* testcgi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcgi.c; path = "../cgi-bin/testcgi.c"; sourceTree = "<group>"; };
+ 727EF03E192E3498001EF690 /* testhi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testhi.c; path = "../cgi-bin/testhi.c"; sourceTree = "<group>"; };
+ 727EF03F192E3498001EF690 /* testtemplate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testtemplate.c; path = "../cgi-bin/testtemplate.c"; sourceTree = "<group>"; };
+ 727EF040192E3498001EF690 /* var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = var.c; path = "../cgi-bin/var.c"; sourceTree = "<group>"; };
+ 727EF041192E3544001EF690 /* testadmin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testadmin.c; path = ../cups/testadmin.c; sourceTree = "<group>"; };
+ 727EF042192E3544001EF690 /* testarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testarray.c; path = ../cups/testarray.c; sourceTree = "<group>"; };
+ 727EF043192E3544001EF690 /* testcache.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcache.c; path = ../cups/testcache.c; sourceTree = "<group>"; };
+ 727EF044192E3544001EF690 /* testconflicts.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testconflicts.c; path = ../cups/testconflicts.c; sourceTree = "<group>"; };
+ 727EF045192E3544001EF690 /* testfile.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testfile.c; path = ../cups/testfile.c; sourceTree = "<group>"; };
+ 727EF046192E3544001EF690 /* testi18n.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testi18n.c; path = ../cups/testi18n.c; sourceTree = "<group>"; };
+ 727EF047192E3544001EF690 /* testipp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testipp.c; path = ../cups/testipp.c; sourceTree = "<group>"; };
+ 727EF048192E3544001EF690 /* testlang.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlang.c; path = ../cups/testlang.c; sourceTree = "<group>"; };
+ 727EF049192E3544001EF690 /* testoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testoptions.c; path = ../cups/testoptions.c; sourceTree = "<group>"; };
+ 727EF04A192E3544001EF690 /* testppd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testppd.c; path = ../cups/testppd.c; sourceTree = "<group>"; };
+ 727EF04B192E3544001EF690 /* testpwg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testpwg.c; path = ../cups/testpwg.c; sourceTree = "<group>"; };
+ 727EF04C192E3544001EF690 /* testsnmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsnmp.c; path = ../cups/testsnmp.c; sourceTree = "<group>"; };
+ 727EF04D192E3602001EF690 /* testlpd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlpd.c; path = ../scheduler/testlpd.c; sourceTree = "<group>"; };
+ 727EF04E192E3602001EF690 /* testspeed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testspeed.c; path = ../scheduler/testspeed.c; sourceTree = "<group>"; };
+ 727EF04F192E3602001EF690 /* testsub.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsub.c; path = ../scheduler/testsub.c; sourceTree = "<group>"; };
+ 728FB7EC1536161C005426E1 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
+ 728FB7EF1536167A005426E1 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = /usr/lib/libiconv.dylib; sourceTree = "<absolute>"; };
+ 728FB7F01536167A005426E1 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = /usr/lib/libresolv.dylib; sourceTree = "<absolute>"; };
+ 729D4B561A2CB48700692B21 /* CHANGES-2.0.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = "CHANGES-2.0.txt"; path = "../CHANGES-2.0.txt"; sourceTree = "<group>"; };
+ 729D4B571A2CB48700692B21 /* CHANGES-IPPTOOL.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = "CHANGES-IPPTOOL.txt"; path = "../CHANGES-IPPTOOL.txt"; sourceTree = "<group>"; };
72A4332F155844CF002E172D /* libcups_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
72C16CB8137B195D007E4BF4 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../scheduler/file.c; sourceTree = SOURCE_ROOT; };
- 72D53A2915B49110003F877F /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = ../../../../../System/Library/Frameworks/GSS.framework; sourceTree = "<group>"; };
- 72D53A2C15B4913D003F877F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = ../../../../../System/Library/Frameworks/IOKit.framework; sourceTree = "<group>"; };
- 72D53A3315B4925B003F877F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = ../../../../../System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<group>"; };
+ 72CF95E018A13543000FCAE4 /* dest-job.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-job.c"; path = "../cups/dest-job.c"; sourceTree = "<group>"; };
+ 72CF95E118A13543000FCAE4 /* dest-localization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-localization.c"; path = "../cups/dest-localization.c"; sourceTree = "<group>"; };
+ 72CF95E218A13543000FCAE4 /* dest-options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-options.c"; path = "../cups/dest-options.c"; sourceTree = "<group>"; };
+ 72CF95F118A19134000FCAE4 /* ipptool copy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ipptool copy"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 72CF95F218A19165000FCAE4 /* ippfind.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippfind.c; path = ../test/ippfind.c; sourceTree = "<group>"; };
+ 72D53A2915B49110003F877F /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = /System/Library/Frameworks/GSS.framework; sourceTree = "<absolute>"; };
+ 72D53A2C15B4913D003F877F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+ 72D53A3315B4925B003F877F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
72D53A3615B4929D003F877F /* colorman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colorman.c; path = ../scheduler/colorman.c; sourceTree = "<group>"; };
72D53A3715B4929D003F877F /* colorman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colorman.h; path = ../scheduler/colorman.h; sourceTree = "<group>"; };
- 72D53A3915B492FA003F877F /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = ../../../../../usr/lib/libpam.dylib; sourceTree = "<group>"; };
+ 72D53A3915B492FA003F877F /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = /usr/lib/libpam.dylib; sourceTree = "<absolute>"; };
+ 72E65BA318DC797E00097E89 /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; name = configure.ac; path = ../configure.ac; sourceTree = "<group>"; };
+ 72E65BA418DC799B00097E89 /* cups-common.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-common.m4"; path = "../config-scripts/cups-common.m4"; sourceTree = "<group>"; };
+ 72E65BA518DC799B00097E89 /* cups-compiler.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-compiler.m4"; path = "../config-scripts/cups-compiler.m4"; sourceTree = "<group>"; };
+ 72E65BA618DC799B00097E89 /* cups-defaults.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-defaults.m4"; path = "../config-scripts/cups-defaults.m4"; sourceTree = "<group>"; };
+ 72E65BA718DC799B00097E89 /* cups-directories.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-directories.m4"; path = "../config-scripts/cups-directories.m4"; sourceTree = "<group>"; };
+ 72E65BA818DC799B00097E89 /* cups-dnssd.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-dnssd.m4"; path = "../config-scripts/cups-dnssd.m4"; sourceTree = "<group>"; };
+ 72E65BA918DC799B00097E89 /* cups-gssapi.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-gssapi.m4"; path = "../config-scripts/cups-gssapi.m4"; sourceTree = "<group>"; };
+ 72E65BAA18DC799B00097E89 /* cups-largefile.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-largefile.m4"; path = "../config-scripts/cups-largefile.m4"; sourceTree = "<group>"; };
+ 72E65BAB18DC799B00097E89 /* cups-startup.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-startup.m4"; path = "../config-scripts/cups-startup.m4"; sourceTree = "<group>"; };
+ 72E65BAC18DC799B00097E89 /* cups-libtool.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-libtool.m4"; path = "../config-scripts/cups-libtool.m4"; sourceTree = "<group>"; };
+ 72E65BAD18DC799B00097E89 /* cups-manpages.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-manpages.m4"; path = "../config-scripts/cups-manpages.m4"; sourceTree = "<group>"; };
+ 72E65BAE18DC799B00097E89 /* cups-network.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-network.m4"; path = "../config-scripts/cups-network.m4"; sourceTree = "<group>"; };
+ 72E65BAF18DC799B00097E89 /* cups-opsys.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-opsys.m4"; path = "../config-scripts/cups-opsys.m4"; sourceTree = "<group>"; };
+ 72E65BB018DC799B00097E89 /* cups-pam.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-pam.m4"; path = "../config-scripts/cups-pam.m4"; sourceTree = "<group>"; };
+ 72E65BB118DC799B00097E89 /* cups-poll.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-poll.m4"; path = "../config-scripts/cups-poll.m4"; sourceTree = "<group>"; };
+ 72E65BB218DC799B00097E89 /* cups-scripting.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-scripting.m4"; path = "../config-scripts/cups-scripting.m4"; sourceTree = "<group>"; };
+ 72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-sharedlibs.m4"; path = "../config-scripts/cups-sharedlibs.m4"; sourceTree = "<group>"; };
+ 72E65BB418DC799B00097E89 /* cups-ssl.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-ssl.m4"; path = "../config-scripts/cups-ssl.m4"; sourceTree = "<group>"; };
+ 72E65BB518DC799B00097E89 /* cups-threads.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-threads.m4"; path = "../config-scripts/cups-threads.m4"; sourceTree = "<group>"; };
+ 72E65BB618DC79CC00097E89 /* cups-config.in */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "cups-config.in"; path = "../cups-config.in"; sourceTree = "<group>"; };
+ 72E65BB718DC79CC00097E89 /* Makedefs.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makedefs.in; path = ../Makedefs.in; sourceTree = "<group>"; };
+ 72E65BB918DC7A3600097E89 /* doc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = doc; path = ../doc; sourceTree = "<group>"; };
+ 72E65BBA18DC7A3600097E89 /* man */ = {isa = PBXFileReference; lastKnownFileType = folder; name = man; path = ../man; sourceTree = "<group>"; };
+ 72E65BBB18DC7A6B00097E89 /* api-array.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-array.header"; path = "../cups/api-array.header"; sourceTree = "<group>"; };
+ 72E65BBC18DC7A6B00097E89 /* api-array.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-array.shtml"; path = "../cups/api-array.shtml"; sourceTree = "<group>"; };
+ 72E65BBD18DC7A6B00097E89 /* api-cups.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-cups.header"; path = "../cups/api-cups.header"; sourceTree = "<group>"; };
+ 72E65BBE18DC7A6B00097E89 /* api-cups.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-cups.shtml"; path = "../cups/api-cups.shtml"; sourceTree = "<group>"; };
+ 72E65BBF18DC7A6B00097E89 /* api-filedir.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-filedir.header"; path = "../cups/api-filedir.header"; sourceTree = "<group>"; };
+ 72E65BC018DC7A6B00097E89 /* api-filedir.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-filedir.shtml"; path = "../cups/api-filedir.shtml"; sourceTree = "<group>"; };
+ 72E65BC118DC7A6B00097E89 /* api-filter.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-filter.header"; path = "../cups/api-filter.header"; sourceTree = "<group>"; };
+ 72E65BC218DC7A6B00097E89 /* api-filter.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-filter.shtml"; path = "../cups/api-filter.shtml"; sourceTree = "<group>"; };
+ 72E65BC318DC7A6B00097E89 /* api-httpipp.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-httpipp.header"; path = "../cups/api-httpipp.header"; sourceTree = "<group>"; };
+ 72E65BC418DC7A6B00097E89 /* api-httpipp.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-httpipp.shtml"; path = "../cups/api-httpipp.shtml"; sourceTree = "<group>"; };
+ 72E65BC518DC7A6B00097E89 /* api-overview.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-overview.header"; path = "../cups/api-overview.header"; sourceTree = "<group>"; };
+ 72E65BC618DC7A6B00097E89 /* api-overview.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-overview.shtml"; path = "../cups/api-overview.shtml"; sourceTree = "<group>"; };
+ 72E65BC718DC7A6B00097E89 /* api-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-ppd.header"; path = "../cups/api-ppd.header"; sourceTree = "<group>"; };
+ 72E65BC818DC7A6B00097E89 /* api-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-ppd.shtml"; path = "../cups/api-ppd.shtml"; sourceTree = "<group>"; };
+ 72E65BC918DC7A7E00097E89 /* api-ppdc.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-ppdc.header"; path = "../ppdc/api-ppdc.header"; sourceTree = "<group>"; };
+ 72E65BCA18DC7A7E00097E89 /* api-ppdc.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-ppdc.shtml"; path = "../ppdc/api-ppdc.shtml"; sourceTree = "<group>"; };
+ 72E65BCB18DC7A9800097E89 /* api-raster.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-raster.header"; path = "../filter/api-raster.header"; sourceTree = "<group>"; };
+ 72E65BCC18DC7A9800097E89 /* api-raster.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-raster.shtml"; path = "../filter/api-raster.shtml"; sourceTree = "<group>"; };
+ 72E65BCD18DC7A9800097E89 /* postscript-driver.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "postscript-driver.header"; path = "../filter/postscript-driver.header"; sourceTree = "<group>"; };
+ 72E65BCE18DC7A9800097E89 /* postscript-driver.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "postscript-driver.shtml"; path = "../filter/postscript-driver.shtml"; sourceTree = "<group>"; };
+ 72E65BCF18DC7A9800097E89 /* ppd-compiler.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "ppd-compiler.header"; path = "../filter/ppd-compiler.header"; sourceTree = "<group>"; };
+ 72E65BD018DC7A9800097E89 /* ppd-compiler.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "ppd-compiler.shtml"; path = "../filter/ppd-compiler.shtml"; sourceTree = "<group>"; };
+ 72E65BD118DC7A9800097E89 /* raster-driver.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "raster-driver.header"; path = "../filter/raster-driver.header"; sourceTree = "<group>"; };
+ 72E65BD218DC7A9800097E89 /* raster-driver.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "raster-driver.shtml"; path = "../filter/raster-driver.shtml"; sourceTree = "<group>"; };
+ 72E65BD318DC7A9800097E89 /* spec-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "spec-ppd.header"; path = "../filter/spec-ppd.header"; sourceTree = "<group>"; };
+ 72E65BD418DC7A9800097E89 /* spec-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "spec-ppd.shtml"; path = "../filter/spec-ppd.shtml"; sourceTree = "<group>"; };
+ 72E65BD518DC818400097E89 /* org.cups.cups-lpd.plist.in */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "org.cups.cups-lpd.plist.in"; path = "../scheduler/org.cups.cups-lpd.plist.in"; sourceTree = SOURCE_ROOT; };
+ 72E65BD618DC818400097E89 /* org.cups.cupsd.path.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = org.cups.cupsd.path.in; path = ../scheduler/org.cups.cupsd.path.in; sourceTree = SOURCE_ROOT; };
+ 72E65BD718DC818400097E89 /* org.cups.cupsd.service.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = org.cups.cupsd.service.in; path = ../scheduler/org.cups.cupsd.service.in; sourceTree = SOURCE_ROOT; };
+ 72E65BD818DC818400097E89 /* org.cups.cupsd.socket.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = org.cups.cupsd.socket.in; path = ../scheduler/org.cups.cupsd.socket.in; sourceTree = SOURCE_ROOT; };
+ 72E65BD918DC850A00097E89 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../Makefile; sourceTree = "<group>"; };
+ 72E65BDA18DC852700097E89 /* api-mime.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-mime.header"; path = "../scheduler/api-mime.header"; sourceTree = SOURCE_ROOT; };
+ 72E65BDB18DC852700097E89 /* api-mime.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-mime.shtml"; path = "../scheduler/api-mime.shtml"; sourceTree = SOURCE_ROOT; };
+ 72E65BDC18DC852700097E89 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../scheduler/Makefile; sourceTree = SOURCE_ROOT; };
+ 72E65BDD18DCA35700097E89 /* CHANGES-1.7.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = "CHANGES-1.7.txt"; path = "../CHANGES-1.7.txt"; sourceTree = "<group>"; };
+ 72E65BDE18DCA35700097E89 /* CHANGES.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = CHANGES.txt; path = ../CHANGES.txt; sourceTree = "<group>"; };
+ 72E65BDF18DCA35700097E89 /* CREDITS.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = CREDITS.txt; path = ../CREDITS.txt; sourceTree = "<group>"; };
+ 72E65BE018DCA35700097E89 /* INSTALL.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = INSTALL.txt; path = ../INSTALL.txt; sourceTree = "<group>"; };
+ 72E65BE118DCA35700097E89 /* IPPTOOL.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = IPPTOOL.txt; path = ../IPPTOOL.txt; sourceTree = "<group>"; };
+ 72E65BE218DCA35700097E89 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE.txt; path = ../LICENSE.txt; sourceTree = "<group>"; };
+ 72E65BE318DCA35700097E89 /* README.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = README.txt; path = ../README.txt; sourceTree = "<group>"; };
72F75A521336F950004BB496 /* cupstestppd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupstestppd; sourceTree = BUILT_PRODUCTS_DIR; };
72F75A5B1336F988004BB496 /* cupstestppd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupstestppd.c; path = ../systemv/cupstestppd.c; sourceTree = "<group>"; };
72F75A611336F9A3004BB496 /* libcupsimage.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsimage.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
72F75A691336FA8A004BB496 /* error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = error.c; path = ../filter/error.c; sourceTree = "<group>"; };
72F75A6A1336FA8A004BB496 /* interpret.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = interpret.c; path = ../filter/interpret.c; sourceTree = "<group>"; };
72F75A6B1336FA8A004BB496 /* raster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raster.c; path = ../filter/raster.c; sourceTree = "<group>"; };
+ 72F7F1D719D1C0CC00870B09 /* org.cups.usb-quirks */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.usb-quirks"; path = "../backend/org.cups.usb-quirks"; sourceTree = "<group>"; };
+ 72FC29CF1A37A1CA00BDF935 /* usb-libusb.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "usb-libusb.c"; path = "../backend/usb-libusb.c"; sourceTree = "<group>"; };
+ 72FC29D01A37A1CA00BDF935 /* usb-unix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "usb-unix.c"; path = "../backend/usb-unix.c"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -1334,6 +1684,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */,
278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */,
278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */,
278C58EB136B64B000836530 /* Security.framework in Frameworks */,
@@ -1346,6 +1697,39 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 2767FC5F1926750C000F61D3 /* CoreFoundation.framework in Frameworks */,
+ 2767FC601926750C000F61D3 /* libiconv.dylib in Frameworks */,
+ 2767FC611926750C000F61D3 /* libresolv.dylib in Frameworks */,
+ 2767FC621926750C000F61D3 /* libz.dylib in Frameworks */,
+ 2767FC631926750C000F61D3 /* Security.framework in Frameworks */,
+ 2767FC641926750C000F61D3 /* SystemConfiguration.framework in Frameworks */,
+ 2767FC58192674E0000F61D3 /* libcups_static.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 274EE2601A03EDCA003213D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 274EE2611A03EDCA003213D1 /* libcups_static.a in Frameworks */,
+ 274EE2621A03EDCA003213D1 /* CoreFoundation.framework in Frameworks */,
+ 274EE2631A03EDCA003213D1 /* libresolv.dylib in Frameworks */,
+ 274EE2641A03EDCA003213D1 /* libz.dylib in Frameworks */,
+ 274EE2651A03EDCA003213D1 /* Security.framework in Frameworks */,
+ 274EE2661A03EDCA003213D1 /* SystemConfiguration.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 274EE2711A03EDCB003213D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 274EE2721A03EDCB003213D1 /* libcups_static.a in Frameworks */,
+ 274EE2731A03EDCB003213D1 /* CoreFoundation.framework in Frameworks */,
+ 274EE2741A03EDCB003213D1 /* libresolv.dylib in Frameworks */,
+ 274EE2751A03EDCB003213D1 /* libz.dylib in Frameworks */,
+ 274EE2761A03EDCB003213D1 /* Security.framework in Frameworks */,
+ 274EE2771A03EDCB003213D1 /* SystemConfiguration.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1362,6 +1746,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7200511218F492F200E7B81B /* CoreFoundation.framework in Frameworks */,
274FF6231333321400317ECB /* libcups.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1378,6 +1763,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 72CEF95618A966E000FA9B81 /* libcups.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1402,6 +1788,14 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 72BFD609191AF14C0005DA37 /* SystemConfiguration.framework in Frameworks */,
+ 72BFD602191AF1270005DA37 /* CoreFoundation.framework in Frameworks */,
+ 72BFD603191AF1270005DA37 /* GSS.framework in Frameworks */,
+ 72BFD604191AF1270005DA37 /* Kerberos.framework in Frameworks */,
+ 72BFD605191AF1270005DA37 /* libiconv.dylib in Frameworks */,
+ 72BFD606191AF1270005DA37 /* libresolv.dylib in Frameworks */,
+ 72BFD607191AF1270005DA37 /* libz.dylib in Frameworks */,
+ 72BFD608191AF1270005DA37 /* Security.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1474,10 +1868,39 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 2767FC4B19266A0D000F61D3 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2767FC6B192685E6000F61D3 /* libcups_static.a in Frameworks */,
+ 2767FC6C192685E6000F61D3 /* CoreFoundation.framework in Frameworks */,
+ 2767FC6D192685E6000F61D3 /* libiconv.dylib in Frameworks */,
+ 2767FC6E192685E6000F61D3 /* libresolv.dylib in Frameworks */,
+ 2767FC6F192685E6000F61D3 /* libz.dylib in Frameworks */,
+ 2767FC70192685E6000F61D3 /* Security.framework in Frameworks */,
+ 2767FC71192685E6000F61D3 /* SystemConfiguration.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
278C58C8136B640300836530 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 72BFD5FB191AF0A30005DA37 /* libcups_static.a in Frameworks */,
+ 72BFD5FC191AF0A30005DA37 /* CoreFoundation.framework in Frameworks */,
+ 72BFD5FD191AF0A30005DA37 /* Kerberos.framework in Frameworks */,
+ 72BFD5FE191AF0A30005DA37 /* libiconv.dylib in Frameworks */,
+ 72BFD5FF191AF0A30005DA37 /* libresolv.dylib in Frameworks */,
+ 72BFD600191AF0A30005DA37 /* libz.dylib in Frameworks */,
+ 72BFD601191AF0A30005DA37 /* Security.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 27A034781A8BDB1200650675 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 27A034851A8BDC5C00650675 /* libcups.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1585,6 +2008,20 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 2767FC6519267538000F61D3 /* libcups_static.a in Frameworks */,
+ 2767FC6619267538000F61D3 /* CoreFoundation.framework in Frameworks */,
+ 2767FC6719267538000F61D3 /* libresolv.dylib in Frameworks */,
+ 2767FC6819267538000F61D3 /* libz.dylib in Frameworks */,
+ 2767FC6919267538000F61D3 /* Security.framework in Frameworks */,
+ 2767FC6A19267538000F61D3 /* SystemConfiguration.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 72CF95EB18A19134000FCAE4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 72CF95EC18A19134000FCAE4 /* libcups.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1611,12 +2048,30 @@
273BF6B81333B4A90022CAAB /* tests */ = {
isa = PBXGroup;
children = (
+ 727EF041192E3544001EF690 /* testadmin.c */,
+ 727EF042192E3544001EF690 /* testarray.c */,
+ 727EF043192E3544001EF690 /* testcache.c */,
+ 727EF044192E3544001EF690 /* testconflicts.c */,
273BF6C61333B5370022CAAB /* testcups.c */,
+ 2767FC5119266A36000F61D3 /* testdest.c */,
+ 727EF045192E3544001EF690 /* testfile.c */,
278C58E2136B647200836530 /* testhttp.c */,
+ 727EF046192E3544001EF690 /* testi18n.c */,
+ 727EF047192E3544001EF690 /* testipp.c */,
+ 727EF048192E3544001EF690 /* testlang.c */,
+ 727EF04D192E3602001EF690 /* testlpd.c */,
270CCDBB135E3D3E00007BE2 /* testmime.c */,
+ 727EF049192E3544001EF690 /* testoptions.c */,
+ 727EF04A192E3544001EF690 /* testppd.c */,
+ 727EF04B192E3544001EF690 /* testpwg.c */,
+ 27F89DA21B3AC43B00E5A4B7 /* testraster.c */,
+ 727EF04C192E3544001EF690 /* testsnmp.c */,
+ 727EF04E192E3602001EF690 /* testspeed.c */,
+ 727EF04F192E3602001EF690 /* testsub.c */,
);
name = tests;
sourceTree = "<group>";
+ wrapsLines = 1;
};
274FF5D513332C2C00317ECB /* daemon */ = {
isa = PBXGroup;
@@ -1630,6 +2085,7 @@
);
name = daemon;
sourceTree = "<group>";
+ wrapsLines = 1;
};
274FF5F41333310400317ECB /* libcupsppdc */ = {
isa = PBXGroup;
@@ -1657,6 +2113,7 @@
);
name = libcupsppdc;
sourceTree = "<group>";
+ wrapsLines = 1;
};
274FF67313333B0A00317ECB /* commands */ = {
isa = PBXGroup;
@@ -1668,6 +2125,9 @@
274FF68713333B6E00317ECB /* cupsfilter.c */,
2732E08B137A3F5200FAFEF6 /* cupstestdsc.c */,
72F75A5B1336F988004BB496 /* cupstestppd.c */,
+ 72CF95F218A19165000FCAE4 /* ippfind.c */,
+ 274EE27D1A03EE0B003213D1 /* ippinfra.c */,
+ 274EE27F1A03EE41003213D1 /* ippproxy.c */,
726AD701135E8A90002C930D /* ippserver.c */,
276683F91337F7A9000D33D0 /* ipptool.c */,
2732E08C137A3F5200FAFEF6 /* lp.c */,
@@ -1675,11 +2135,11 @@
2732E08E137A3F5200FAFEF6 /* lpinfo.c */,
2732E08F137A3F5200FAFEF6 /* lpmove.c */,
2732E090137A3F5200FAFEF6 /* lpoptions.c */,
- 2732E091137A3F5200FAFEF6 /* lppasswd.c */,
2732E092137A3F5200FAFEF6 /* lpstat.c */,
);
name = commands;
sourceTree = "<group>";
+ wrapsLines = 1;
};
276683CB1337B1CC000D33D0 /* ppdc tools */ = {
isa = PBXGroup;
@@ -1692,6 +2152,7 @@
);
name = "ppdc tools";
sourceTree = "<group>";
+ wrapsLines = 1;
};
72220EAF1333047D00FCA411 /* Products */ = {
isa = PBXGroup;
@@ -1723,6 +2184,11 @@
726AD6F7135E88F0002C930D /* ippserver */,
278C58CB136B640300836530 /* testhttp */,
72A4332F155844CF002E172D /* libcups_static.a */,
+ 72CF95F118A19134000FCAE4 /* ipptool copy */,
+ 2767FC5019266A0D000F61D3 /* testdest */,
+ 274EE26B1A03EDCA003213D1 /* ippserver copy */,
+ 274EE27C1A03EDCB003213D1 /* ippserver copy copy */,
+ 27A0347B1A8BDB1300650675 /* lpadmin */,
);
name = Products;
sourceTree = "<group>";
@@ -1731,7 +2197,6 @@
isa = PBXGroup;
children = (
276683561337A8C5000D33D0 /* cups.strings */,
- 27D3037C134148CB00F022B1 /* libcups_s.exp */,
27D3037D134148CB00F022B1 /* libcups2.def */,
72220EB51333052D00FCA411 /* adminutil.c */,
72220EB81333056300FCA411 /* array.c */,
@@ -1743,6 +2208,9 @@
72220EC21333056300FCA411 /* custom.c */,
72220ED1133305BB00FCA411 /* debug.c */,
72220ED2133305BB00FCA411 /* dest.c */,
+ 72CF95E018A13543000FCAE4 /* dest-job.c */,
+ 72CF95E118A13543000FCAE4 /* dest-localization.c */,
+ 72CF95E218A13543000FCAE4 /* dest-options.c */,
72220ED3133305BB00FCA411 /* dir.c */,
72220ED4133305BB00FCA411 /* dir.h */,
72220ED5133305BB00FCA411 /* emit.c */,
@@ -1752,12 +2220,12 @@
72220EDB133305BB00FCA411 /* getifaddrs.c */,
72220EDC133305BB00FCA411 /* getputfile.c */,
72220EDD133305BB00FCA411 /* globals.c */,
+ 72220EE2133305BB00FCA411 /* http.c */,
72220EDE133305BB00FCA411 /* http-addr.c */,
72220EDF133305BB00FCA411 /* http-addrlist.c */,
72220EE1133305BB00FCA411 /* http-support.c */,
- 72220EE2133305BB00FCA411 /* http.c */,
- 72220EE5133305BB00FCA411 /* ipp-support.c */,
72220EE6133305BB00FCA411 /* ipp.c */,
+ 72220EE5133305BB00FCA411 /* ipp-support.c */,
72220EE8133305BB00FCA411 /* langprintf.c */,
72220EEA133305BB00FCA411 /* language.c */,
72220EEC133305BB00FCA411 /* localize.c */,
@@ -1777,12 +2245,17 @@
72220F02133305BB00FCA411 /* string.c */,
72220F03133305BB00FCA411 /* tempfile.c */,
72220F05133305BB00FCA411 /* thread.c */,
+ 727AD5B619100A58009F6862 /* tls.c */,
+ 270B267D17F5C06700C8A3A9 /* tls-darwin.c */,
+ 270B267E17F5C06700C8A3A9 /* tls-gnutls.c */,
+ 270B268117F5C5D600C8A3A9 /* tls-sspi.c */,
72220F06133305BB00FCA411 /* transcode.c */,
72220F08133305BB00FCA411 /* usersys.c */,
72220F09133305BB00FCA411 /* util.c */,
);
name = libcups;
sourceTree = "<group>";
+ wrapsLines = 1;
};
72220F45133305D000FCA411 /* Public Headers */ = {
isa = PBXGroup;
@@ -1798,6 +2271,7 @@
72220FB413330BCE00FCA411 /* mime.h */,
72220EF7133305BB00FCA411 /* ppd.h */,
274FF6091333315100317ECB /* ppdc.h */,
+ 2767FC7519269687000F61D3 /* pwg.h */,
72220EFA133305BB00FCA411 /* raster.h */,
72220EFD133305BB00FCA411 /* sidechannel.h */,
72220F07133305BB00FCA411 /* transcode.h */,
@@ -1805,6 +2279,7 @@
);
name = "Public Headers";
sourceTree = "<group>";
+ wrapsLines = 1;
};
72220F461333060C00FCA411 /* Private Headers */ = {
isa = PBXGroup;
@@ -1821,18 +2296,27 @@
7271883C1374AB14001A2036 /* mime-private.h */,
72220EF5133305BB00FCA411 /* ppd-private.h */,
72220EF9133305BB00FCA411 /* pwg-private.h */,
+ 2767FC76192696A0000F61D3 /* raster-private.h */,
72220EFE133305BB00FCA411 /* snmp-private.h */,
72220F01133305BB00FCA411 /* string-private.h */,
72220F04133305BB00FCA411 /* thread-private.h */,
);
name = "Private Headers";
sourceTree = "<group>";
+ wrapsLines = 1;
};
72220F5D13330A5A00FCA411 /* cupsd */ = {
isa = PBXGroup;
children = (
- 72D53A3615B4929D003F877F /* colorman.c */,
- 72D53A3715B4929D003F877F /* colorman.h */,
+ 72E65BDC18DC852700097E89 /* Makefile */,
+ 7226369B18AE6D19004ED309 /* org.cups.cups-lpd.plist */,
+ 72E65BD518DC818400097E89 /* org.cups.cups-lpd.plist.in */,
+ 72496E171A13A03B0051899C /* org.cups.cups-lpdAT.service.in */,
+ 72496E161A13A03B0051899C /* org.cups.cups-lpd.socket */,
+ 72E65BD618DC818400097E89 /* org.cups.cupsd.path.in */,
+ 7226369C18AE6D19004ED309 /* org.cups.cupsd.plist */,
+ 72E65BD718DC818400097E89 /* org.cups.cupsd.service.in */,
+ 72E65BD818DC818400097E89 /* org.cups.cupsd.socket.in */,
72220F6913330B0C00FCA411 /* auth.c */,
72220F6A13330B0C00FCA411 /* auth.h */,
72220F6B13330B0C00FCA411 /* banners.c */,
@@ -1843,6 +2327,8 @@
72220F7013330B0C00FCA411 /* classes.h */,
72220F7113330B0C00FCA411 /* client.c */,
72220F7213330B0C00FCA411 /* client.h */,
+ 72D53A3615B4929D003F877F /* colorman.c */,
+ 72D53A3715B4929D003F877F /* colorman.h */,
72220F7313330B0C00FCA411 /* conf.c */,
72220F7413330B0C00FCA411 /* conf.h */,
72220F7513330B0C00FCA411 /* cupsd.h */,
@@ -1872,14 +2358,11 @@
72220F8D13330B0C00FCA411 /* subscriptions.h */,
72220F8E13330B0C00FCA411 /* sysman.c */,
72220F8F13330B0C00FCA411 /* sysman.h */,
- 728FB7E3153600FA005426E1 /* tls.c */,
- 728FB7E0153600FA005426E1 /* tls-darwin.c */,
- 728FB7E1153600FA005426E1 /* tls-gnutls.c */,
- 728FB7E2153600FA005426E1 /* tls-openssl.c */,
);
name = cupsd;
path = .;
sourceTree = "<group>";
+ wrapsLines = 1;
};
72220FB013330B3400FCA411 /* libcupsmime */ = {
isa = PBXGroup;
@@ -1890,10 +2373,24 @@
);
name = libcupsmime;
sourceTree = "<group>";
+ wrapsLines = 1;
};
72220FB113330B4A00FCA411 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ 2767FC591926750C000F61D3 /* CoreFoundation.framework */,
+ 2767FC5A1926750C000F61D3 /* libiconv.dylib */,
+ 2767FC5B1926750C000F61D3 /* libresolv.dylib */,
+ 2767FC5C1926750C000F61D3 /* libz.dylib */,
+ 2767FC5D1926750C000F61D3 /* Security.framework */,
+ 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */,
+ 72D53A3915B492FA003F877F /* libpam.dylib */,
+ 72D53A3315B4925B003F877F /* ApplicationServices.framework */,
+ 72D53A2C15B4913D003F877F /* IOKit.framework */,
+ 72D53A2915B49110003F877F /* GSS.framework */,
+ 728FB7EF1536167A005426E1 /* libiconv.dylib */,
+ 728FB7F01536167A005426E1 /* libresolv.dylib */,
+ 728FB7EC1536161C005426E1 /* libz.dylib */,
278C58E5136B64AF00836530 /* CoreFoundation.framework */,
278C58E6136B64B000836530 /* Kerberos.framework */,
278C58E7136B64B000836530 /* Security.framework */,
@@ -1916,14 +2413,18 @@
724379281333E952009631B9 /* lpd.c */,
7243790B1333E4E3009631B9 /* network.c */,
724379121333E516009631B9 /* runloop.c */,
- 720DD6D21358FDDE0064AA82 /* snmp.c */,
7243790C1333E4E3009631B9 /* snmp-supplies.c */,
+ 720DD6D21358FDDE0064AA82 /* snmp.c */,
7243793C1333FD19009631B9 /* socket.c */,
724379C51333FFC7009631B9 /* usb.c */,
724379C41333FFC7009631B9 /* usb-darwin.c */,
+ 72FC29CF1A37A1CA00BDF935 /* usb-libusb.c */,
+ 72FC29D01A37A1CA00BDF935 /* usb-unix.c */,
+ 72F7F1D719D1C0CC00870B09 /* org.cups.usb-quirks */,
);
name = backends;
sourceTree = "<group>";
+ wrapsLines = 1;
};
7258EADC134594A8009286F1 /* filters */ = {
isa = PBXGroup;
@@ -1940,18 +2441,38 @@
);
name = filters;
sourceTree = "<group>";
+ wrapsLines = 1;
+ };
+ 727EF02E192E3461001EF690 /* cgi-bin */ = {
+ isa = PBXGroup;
+ children = (
+ 727EF02F192E3498001EF690 /* admin.c */,
+ 727EF030192E3498001EF690 /* cgi-private.h */,
+ 727EF031192E3498001EF690 /* cgi.h */,
+ 727EF032192E3498001EF690 /* classes.c */,
+ 727EF033192E3498001EF690 /* help-index.c */,
+ 727EF034192E3498001EF690 /* help-index.h */,
+ 727EF035192E3498001EF690 /* help.c */,
+ 727EF036192E3498001EF690 /* html.c */,
+ 727EF037192E3498001EF690 /* ipp-var.c */,
+ 727EF038192E3498001EF690 /* jobs.c */,
+ 727EF039192E3498001EF690 /* makedocset.c */,
+ 727EF03A192E3498001EF690 /* printers.c */,
+ 727EF03B192E3498001EF690 /* search.c */,
+ 727EF03C192E3498001EF690 /* template.c */,
+ 727EF03D192E3498001EF690 /* testcgi.c */,
+ 727EF03E192E3498001EF690 /* testhi.c */,
+ 727EF03F192E3498001EF690 /* testtemplate.c */,
+ 727EF040192E3498001EF690 /* var.c */,
+ );
+ name = "cgi-bin";
+ sourceTree = "<group>";
};
72BF96351333042100B1EAD7 = {
isa = PBXGroup;
children = (
- 72D53A3915B492FA003F877F /* libpam.dylib */,
- 72D53A3315B4925B003F877F /* ApplicationServices.framework */,
- 72D53A2C15B4913D003F877F /* IOKit.framework */,
- 72D53A2915B49110003F877F /* GSS.framework */,
- 728FB7EF1536167A005426E1 /* libiconv.dylib */,
- 728FB7F01536167A005426E1 /* libresolv.dylib */,
- 728FB7EC1536161C005426E1 /* libz.dylib */,
- 72220FB113330B4A00FCA411 /* Frameworks */,
+ 72E65BA218DC796500097E89 /* Autoconf Files */,
+ 72E65BB818DC79F800097E89 /* Documentation */,
72220F45133305D000FCA411 /* Public Headers */,
72220F461333060C00FCA411 /* Private Headers */,
72220EB41333050100FCA411 /* libcups */,
@@ -1959,18 +2480,96 @@
72220FB013330B3400FCA411 /* libcupsmime */,
274FF5F41333310400317ECB /* libcupsppdc */,
724378F71333E3CE009631B9 /* backends */,
+ 727EF02E192E3461001EF690 /* cgi-bin */,
274FF67313333B0A00317ECB /* commands */,
72220F5D13330A5A00FCA411 /* cupsd */,
274FF5D513332C2C00317ECB /* daemon */,
7258EADC134594A8009286F1 /* filters */,
276683CB1337B1CC000D33D0 /* ppdc tools */,
273BF6B81333B4A90022CAAB /* tests */,
+ 72220FB113330B4A00FCA411 /* Frameworks */,
72220EAF1333047D00FCA411 /* Products */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 8;
- wrapsLines = 0;
+ wrapsLines = 1;
+ };
+ 72E65BA218DC796500097E89 /* Autoconf Files */ = {
+ isa = PBXGroup;
+ children = (
+ 72E65BD918DC850A00097E89 /* Makefile */,
+ 72E65BB718DC79CC00097E89 /* Makedefs.in */,
+ 72E65BA318DC797E00097E89 /* configure.ac */,
+ 7226369D18AE73BB004ED309 /* config.h.in */,
+ 72E65BB618DC79CC00097E89 /* cups-config.in */,
+ 72E65BA418DC799B00097E89 /* cups-common.m4 */,
+ 72E65BA518DC799B00097E89 /* cups-compiler.m4 */,
+ 72E65BA618DC799B00097E89 /* cups-defaults.m4 */,
+ 72E65BA718DC799B00097E89 /* cups-directories.m4 */,
+ 72E65BA818DC799B00097E89 /* cups-dnssd.m4 */,
+ 72E65BA918DC799B00097E89 /* cups-gssapi.m4 */,
+ 72E65BAA18DC799B00097E89 /* cups-largefile.m4 */,
+ 72E65BAB18DC799B00097E89 /* cups-startup.m4 */,
+ 72E65BAC18DC799B00097E89 /* cups-libtool.m4 */,
+ 72E65BAD18DC799B00097E89 /* cups-manpages.m4 */,
+ 72E65BAE18DC799B00097E89 /* cups-network.m4 */,
+ 72E65BAF18DC799B00097E89 /* cups-opsys.m4 */,
+ 72E65BB018DC799B00097E89 /* cups-pam.m4 */,
+ 72E65BB118DC799B00097E89 /* cups-poll.m4 */,
+ 72E65BB218DC799B00097E89 /* cups-scripting.m4 */,
+ 72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */,
+ 72E65BB418DC799B00097E89 /* cups-ssl.m4 */,
+ 72E65BB518DC799B00097E89 /* cups-threads.m4 */,
+ );
+ name = "Autoconf Files";
+ sourceTree = "<group>";
+ };
+ 72E65BB818DC79F800097E89 /* Documentation */ = {
+ isa = PBXGroup;
+ children = (
+ 72E65BBB18DC7A6B00097E89 /* api-array.header */,
+ 72E65BBC18DC7A6B00097E89 /* api-array.shtml */,
+ 72E65BBD18DC7A6B00097E89 /* api-cups.header */,
+ 72E65BBE18DC7A6B00097E89 /* api-cups.shtml */,
+ 72E65BBF18DC7A6B00097E89 /* api-filedir.header */,
+ 72E65BC018DC7A6B00097E89 /* api-filedir.shtml */,
+ 72E65BC118DC7A6B00097E89 /* api-filter.header */,
+ 72E65BC218DC7A6B00097E89 /* api-filter.shtml */,
+ 72E65BC318DC7A6B00097E89 /* api-httpipp.header */,
+ 72E65BC418DC7A6B00097E89 /* api-httpipp.shtml */,
+ 72E65BDA18DC852700097E89 /* api-mime.header */,
+ 72E65BDB18DC852700097E89 /* api-mime.shtml */,
+ 72E65BC518DC7A6B00097E89 /* api-overview.header */,
+ 72E65BC618DC7A6B00097E89 /* api-overview.shtml */,
+ 72E65BC718DC7A6B00097E89 /* api-ppd.header */,
+ 72E65BC818DC7A6B00097E89 /* api-ppd.shtml */,
+ 72E65BC918DC7A7E00097E89 /* api-ppdc.header */,
+ 72E65BCA18DC7A7E00097E89 /* api-ppdc.shtml */,
+ 72E65BCB18DC7A9800097E89 /* api-raster.header */,
+ 72E65BCC18DC7A9800097E89 /* api-raster.shtml */,
+ 72E65BDD18DCA35700097E89 /* CHANGES-1.7.txt */,
+ 729D4B561A2CB48700692B21 /* CHANGES-2.0.txt */,
+ 729D4B571A2CB48700692B21 /* CHANGES-IPPTOOL.txt */,
+ 72E65BDE18DCA35700097E89 /* CHANGES.txt */,
+ 72E65BDF18DCA35700097E89 /* CREDITS.txt */,
+ 72E65BB918DC7A3600097E89 /* doc */,
+ 72E65BE018DCA35700097E89 /* INSTALL.txt */,
+ 72E65BE118DCA35700097E89 /* IPPTOOL.txt */,
+ 72E65BE218DCA35700097E89 /* LICENSE.txt */,
+ 72E65BBA18DC7A3600097E89 /* man */,
+ 72E65BCD18DC7A9800097E89 /* postscript-driver.header */,
+ 72E65BCE18DC7A9800097E89 /* postscript-driver.shtml */,
+ 72E65BCF18DC7A9800097E89 /* ppd-compiler.header */,
+ 72E65BD018DC7A9800097E89 /* ppd-compiler.shtml */,
+ 72E65BD118DC7A9800097E89 /* raster-driver.header */,
+ 72E65BD218DC7A9800097E89 /* raster-driver.shtml */,
+ 72E65BE318DCA35700097E89 /* README.txt */,
+ 72E65BD318DC7A9800097E89 /* spec-ppd.header */,
+ 72E65BD418DC7A9800097E89 /* spec-ppd.shtml */,
+ );
+ name = Documentation;
+ sourceTree = "<group>";
};
72F75A681336FA42004BB496 /* libcupsimage */ = {
isa = PBXGroup;
@@ -1981,6 +2580,7 @@
);
name = libcupsimage;
sourceTree = "<group>";
+ wrapsLines = 1;
};
/* End PBXGroup section */
@@ -2118,6 +2718,42 @@
productReference = 273BF6BD1333B5000022CAAB /* testcups */;
productType = "com.apple.product-type.tool";
};
+ 274EE25B1A03EDCA003213D1 /* ippinfra */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 274EE2681A03EDCA003213D1 /* Build configuration list for PBXNativeTarget "ippinfra" */;
+ buildPhases = (
+ 274EE25E1A03EDCA003213D1 /* Sources */,
+ 274EE2601A03EDCA003213D1 /* Frameworks */,
+ 274EE2671A03EDCA003213D1 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 274EE25C1A03EDCA003213D1 /* PBXTargetDependency */,
+ );
+ name = ippinfra;
+ productName = ippserver;
+ productReference = 274EE26B1A03EDCA003213D1 /* ippserver copy */;
+ productType = "com.apple.product-type.tool";
+ };
+ 274EE26C1A03EDCB003213D1 /* ippproxy */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 274EE2791A03EDCB003213D1 /* Build configuration list for PBXNativeTarget "ippproxy" */;
+ buildPhases = (
+ 274EE26F1A03EDCB003213D1 /* Sources */,
+ 274EE2711A03EDCB003213D1 /* Frameworks */,
+ 274EE2781A03EDCB003213D1 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 274EE26D1A03EDCB003213D1 /* PBXTargetDependency */,
+ );
+ name = ippproxy;
+ productName = ippserver;
+ productReference = 274EE27C1A03EDCB003213D1 /* ippserver copy copy */;
+ productType = "com.apple.product-type.tool";
+ };
274FF5CB13332B1F00317ECB /* cups-driverd */ = {
isa = PBXNativeTarget;
buildConfigurationList = 274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */;
@@ -2393,6 +3029,24 @@
productReference = 276684041337FA1D000D33D0 /* cupsaddsmb */;
productType = "com.apple.product-type.tool";
};
+ 2767FC4619266A0D000F61D3 /* testdest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 2767FC4D19266A0D000F61D3 /* Build configuration list for PBXNativeTarget "testdest" */;
+ buildPhases = (
+ 2767FC4919266A0D000F61D3 /* Sources */,
+ 2767FC4B19266A0D000F61D3 /* Frameworks */,
+ 2767FC4C19266A0D000F61D3 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 2767FC4719266A0D000F61D3 /* PBXTargetDependency */,
+ );
+ name = testdest;
+ productName = testcups;
+ productReference = 2767FC5019266A0D000F61D3 /* testdest */;
+ productType = "com.apple.product-type.tool";
+ };
278C58CA136B640300836530 /* testhttp */ = {
isa = PBXNativeTarget;
buildConfigurationList = 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */;
@@ -2411,6 +3065,24 @@
productReference = 278C58CB136B640300836530 /* testhttp */;
productType = "com.apple.product-type.tool";
};
+ 27A0347A1A8BDB1200650675 /* lpadmin */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 27A034811A8BDB1300650675 /* Build configuration list for PBXNativeTarget "lpadmin" */;
+ buildPhases = (
+ 27A034771A8BDB1200650675 /* Sources */,
+ 27A034781A8BDB1200650675 /* Frameworks */,
+ 27A034791A8BDB1200650675 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 27A034841A8BDC4A00650675 /* PBXTargetDependency */,
+ );
+ name = lpadmin;
+ productName = lpadmin;
+ productReference = 27A0347B1A8BDB1300650675 /* lpadmin */;
+ productType = "com.apple.product-type.tool";
+ };
720DD6C11358FD5F0064AA82 /* snmp */ = {
isa = PBXNativeTarget;
buildConfigurationList = 720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */;
@@ -2610,6 +3282,24 @@
productReference = 726AD6F7135E88F0002C930D /* ippserver */;
productType = "com.apple.product-type.tool";
};
+ 72CF95E618A19134000FCAE4 /* ippfind */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 72CF95EE18A19134000FCAE4 /* Build configuration list for PBXNativeTarget "ippfind" */;
+ buildPhases = (
+ 72CF95E918A19134000FCAE4 /* Sources */,
+ 72CF95EB18A19134000FCAE4 /* Frameworks */,
+ 72CF95ED18A19134000FCAE4 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 72CF95E718A19134000FCAE4 /* PBXTargetDependency */,
+ );
+ name = ippfind;
+ productName = ipptool;
+ productReference = 72CF95F118A19134000FCAE4 /* ipptool copy */;
+ productType = "com.apple.product-type.tool";
+ };
72F75A511336F950004BB496 /* cupstestppd */ = {
isa = PBXNativeTarget;
buildConfigurationList = 72F75A581336F951004BB496 /* Build configuration list for PBXNativeTarget "cupstestppd" */;
@@ -2653,8 +3343,13 @@
72BF96371333042100B1EAD7 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0440;
+ LastUpgradeCheck = 0600;
ORGANIZATIONNAME = "Apple Inc.";
+ TargetAttributes = {
+ 27A0347A1A8BDB1200650675 = {
+ CreatedOnToolsVersion = 6.1.1;
+ };
+ };
};
buildConfigurationList = 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */;
compatibilityVersion = "Xcode 3.2";
@@ -2686,8 +3381,12 @@
72F75A511336F950004BB496 /* cupstestppd */,
724379461333FEA9009631B9 /* dnssd */,
724378FC1333E43E009631B9 /* ipp */,
+ 72CF95E618A19134000FCAE4 /* ippfind */,
+ 274EE25B1A03EDCA003213D1 /* ippinfra */,
+ 274EE26C1A03EDCB003213D1 /* ippproxy */,
726AD6F6135E88F0002C930D /* ippserver */,
276683EF1337F78E000D33D0 /* ipptool */,
+ 27A0347A1A8BDB1200650675 /* lpadmin */,
724379171333E532009631B9 /* lpd */,
2766836F1337AC79000D33D0 /* ppdc */,
2766837C1337AC8C000D33D0 /* ppdhtml */,
@@ -2698,6 +3397,7 @@
720DD6C11358FD5F0064AA82 /* snmp */,
7243792F1333FB85009631B9 /* socket */,
273BF6BC1333B5000022CAAB /* testcups */,
+ 2767FC4619266A0D000F61D3 /* testdest */,
278C58CA136B640300836530 /* testhttp */,
270CCDA6135E3C9E00007BE2 /* testmime */,
7243795A1333FF1D009631B9 /* usb */,
@@ -2722,6 +3422,22 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 274EE25E1A03EDCA003213D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 274EE27E1A03EE0B003213D1 /* ippinfra.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 274EE26F1A03EDCB003213D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 274EE2801A03EE41003213D1 /* ippproxy.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
274FF5C813332B1F00317ECB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -2816,6 +3532,7 @@
274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */,
274FF69F1333B1C400317ECB /* http-support.c in Sources */,
274FF6A01333B1C400317ECB /* http.c in Sources */,
+ 2767FC7419268F0C000F61D3 /* dest-options.c in Sources */,
274FF6A11333B1C400317ECB /* ipp-support.c in Sources */,
274FF6A21333B1C400317ECB /* ipp.c in Sources */,
274FF6A31333B1C400317ECB /* langprintf.c in Sources */,
@@ -2826,10 +3543,13 @@
274FF6A81333B1C400317ECB /* md5passwd.c in Sources */,
274FF6A91333B1C400317ECB /* notify.c in Sources */,
274FF6AA1333B1C400317ECB /* options.c in Sources */,
+ 727AD5B819100A58009F6862 /* tls.c in Sources */,
274FF6AB1333B1C400317ECB /* page.c in Sources */,
274FF6AC1333B1C400317ECB /* ppd-cache.c in Sources */,
+ 2767FC7219268F06000F61D3 /* dest-job.c in Sources */,
274FF6AD1333B1C400317ECB /* ppd.c in Sources */,
274FF6AE1333B1C400317ECB /* pwg-media.c in Sources */,
+ 2767FC7319268F09000F61D3 /* dest-localization.c in Sources */,
274FF6AF1333B1C400317ECB /* request.c in Sources */,
274FF6B01333B1C400317ECB /* sidechannel.c in Sources */,
274FF6B11333B1C400317ECB /* snmp.c in Sources */,
@@ -2907,6 +3627,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 2767FC4919266A0D000F61D3 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2767FC5219266A36000F61D3 /* testdest.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
278C58C7136B640300836530 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -2915,6 +3643,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 27A034771A8BDB1200650675 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 27A034821A8BDC3A00650675 /* lpadmin.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
720DD6BE1358FD5F0064AA82 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -2931,6 +3667,7 @@
72220EB61333052D00FCA411 /* adminutil.c in Sources */,
72220EC51333056300FCA411 /* array.c in Sources */,
72220EC71333056300FCA411 /* attr.c in Sources */,
+ 727AD5B719100A58009F6862 /* tls.c in Sources */,
72220EC81333056300FCA411 /* auth.c in Sources */,
72220EC91333056300FCA411 /* backchannel.c in Sources */,
72220ECA1333056300FCA411 /* backend.c in Sources */,
@@ -2950,6 +3687,7 @@
72220F19133305BB00FCA411 /* http-addrlist.c in Sources */,
72220F1B133305BB00FCA411 /* http-support.c in Sources */,
72220F1C133305BB00FCA411 /* http.c in Sources */,
+ 72CF95E518A13543000FCAE4 /* dest-options.c in Sources */,
72220F1F133305BB00FCA411 /* ipp-support.c in Sources */,
72220F20133305BB00FCA411 /* ipp.c in Sources */,
72220F22133305BB00FCA411 /* langprintf.c in Sources */,
@@ -2970,10 +3708,12 @@
72220F3A133305BB00FCA411 /* snprintf.c in Sources */,
72220F3C133305BB00FCA411 /* string.c in Sources */,
72220F3D133305BB00FCA411 /* tempfile.c in Sources */,
+ 72CF95E418A13543000FCAE4 /* dest-localization.c in Sources */,
72220F3F133305BB00FCA411 /* thread.c in Sources */,
72220F40133305BB00FCA411 /* transcode.c in Sources */,
72220F42133305BB00FCA411 /* usersys.c in Sources */,
72220F43133305BB00FCA411 /* util.c in Sources */,
+ 72CF95E318A13543000FCAE4 /* dest-job.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3005,7 +3745,6 @@
72220FA613330B0C00FCA411 /* subscriptions.c in Sources */,
72220FA713330B0C00FCA411 /* sysman.c in Sources */,
72C16CB9137B195D007E4BF4 /* file.c in Sources */,
- 728FB7E8153600FA005426E1 /* tls.c in Sources */,
72D53A3815B4929D003F877F /* colorman.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -3086,6 +3825,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 72CF95E918A19134000FCAE4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 72CF95F318A19165000FCAE4 /* ippfind.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
72F75A4E1336F950004BB496 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -3132,6 +3879,36 @@
target = 273BF6BC1333B5000022CAAB /* testcups */;
targetProxy = 273BF6DD1333B6370022CAAB /* PBXContainerItemProxy */;
};
+ 274EE25C1A03EDCA003213D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274FF6891333B1C400317ECB /* libcups_static */;
+ targetProxy = 274EE25D1A03EDCA003213D1 /* PBXContainerItemProxy */;
+ };
+ 274EE26D1A03EDCB003213D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274FF6891333B1C400317ECB /* libcups_static */;
+ targetProxy = 274EE26E1A03EDCB003213D1 /* PBXContainerItemProxy */;
+ };
+ 274EE2821A03EEE0003213D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274EE25B1A03EDCA003213D1 /* ippinfra */;
+ targetProxy = 274EE2811A03EEE0003213D1 /* PBXContainerItemProxy */;
+ };
+ 274EE2841A03EEE0003213D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274EE26C1A03EDCB003213D1 /* ippproxy */;
+ targetProxy = 274EE2831A03EEE0003213D1 /* PBXContainerItemProxy */;
+ };
+ 274EE2861A03EEEE003213D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274EE25B1A03EDCA003213D1 /* ippinfra */;
+ targetProxy = 274EE2851A03EEEE003213D1 /* PBXContainerItemProxy */;
+ };
+ 274EE2881A03EEEE003213D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274EE26C1A03EDCB003213D1 /* ippproxy */;
+ targetProxy = 274EE2871A03EEEE003213D1 /* PBXContainerItemProxy */;
+ };
274FF5DC13332CF900317ECB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 72220EAD1333047D00FCA411 /* libcups */;
@@ -3327,6 +4104,21 @@
target = 276684031337FA1D000D33D0 /* cupsaddsmb */;
targetProxy = 276684121337FA8D000D33D0 /* PBXContainerItemProxy */;
};
+ 2767FC4719266A0D000F61D3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274FF6891333B1C400317ECB /* libcups_static */;
+ targetProxy = 2767FC4819266A0D000F61D3 /* PBXContainerItemProxy */;
+ };
+ 2767FC5419267469000F61D3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 276683EF1337F78E000D33D0 /* ipptool */;
+ targetProxy = 2767FC5319267469000F61D3 /* PBXContainerItemProxy */;
+ };
+ 2767FC5619267469000F61D3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 2767FC4619266A0D000F61D3 /* testdest */;
+ targetProxy = 2767FC5519267469000F61D3 /* PBXContainerItemProxy */;
+ };
278C58D6136B641D00836530 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 278C58CA136B640300836530 /* testhttp */;
@@ -3337,6 +4129,16 @@
target = 274FF6891333B1C400317ECB /* libcups_static */;
targetProxy = 278C58D7136B642F00836530 /* PBXContainerItemProxy */;
};
+ 27A034841A8BDC4A00650675 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 72220EAD1333047D00FCA411 /* libcups */;
+ targetProxy = 27A034831A8BDC4A00650675 /* PBXContainerItemProxy */;
+ };
+ 27A034871A8BDC6900650675 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 27A0347A1A8BDB1200650675 /* lpadmin */;
+ targetProxy = 27A034861A8BDC6900650675 /* PBXContainerItemProxy */;
+ };
720DD6CF1358FD790064AA82 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 72220EAD1333047D00FCA411 /* libcups */;
@@ -3437,6 +4239,26 @@
target = 274FF6891333B1C400317ECB /* libcups_static */;
targetProxy = 726AD705135E8AC5002C930D /* PBXContainerItemProxy */;
};
+ 72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 726AD6F6135E88F0002C930D /* ippserver */;
+ targetProxy = 72BEA8D319AFA89C0085F0F3 /* PBXContainerItemProxy */;
+ };
+ 72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 72CF95E618A19134000FCAE4 /* ippfind */;
+ targetProxy = 72BEA8D519AFA8A00085F0F3 /* PBXContainerItemProxy */;
+ };
+ 72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 274FF6891333B1C400317ECB /* libcups_static */;
+ targetProxy = 72BEA8D719AFA8BB0085F0F3 /* PBXContainerItemProxy */;
+ };
+ 72CF95E718A19134000FCAE4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 72220EAD1333047D00FCA411 /* libcups */;
+ targetProxy = 72CF95E818A19134000FCAE4 /* PBXContainerItemProxy */;
+ };
72F75A661336FA30004BB496 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 72220EAD1333047D00FCA411 /* libcups */;
@@ -3497,6 +4319,34 @@
};
name = Release;
};
+ 274EE2691A03EDCA003213D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "ippserver copy";
+ };
+ name = Debug;
+ };
+ 274EE26A1A03EDCA003213D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "ippserver copy";
+ };
+ name = Release;
+ };
+ 274EE27A1A03EDCB003213D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "ippserver copy copy";
+ };
+ name = Debug;
+ };
+ 274EE27B1A03EDCB003213D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "ippserver copy copy";
+ };
+ name = Release;
+ };
274FF5D313332B1F00317ECB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -3517,6 +4367,7 @@
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
};
name = Debug;
};
@@ -3524,12 +4375,14 @@
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
};
name = Release;
};
274FF5F0133330C800317ECB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
@@ -3541,6 +4394,7 @@
274FF5F1133330C800317ECB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
@@ -3616,6 +4470,7 @@
274FF6DE1333B1C400317ECB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_EXTENSION = a;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/local/lib;
@@ -3629,6 +4484,7 @@
274FF6DF1333B1C400317ECB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_EXTENSION = a;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/local/lib;
@@ -3767,6 +4623,20 @@
};
name = Release;
};
+ 2767FC4E19266A0D000F61D3 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = testdest;
+ };
+ name = Debug;
+ };
+ 2767FC4F19266A0D000F61D3 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = testdest;
+ };
+ name = Release;
+ };
278C58D1136B640300836530 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -3781,6 +4651,74 @@
};
name = Release;
};
+ 27A0347F1A8BDB1300650675 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ INSTALL_PATH = /usr/sbin;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 27A034801A8BDB1300650675 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ INSTALL_PATH = /usr/sbin;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
720DD6C91358FD5F0064AA82 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -3800,6 +4738,7 @@
72220EB01333047D00FCA411 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
@@ -3811,6 +4750,7 @@
72220EB11333047D00FCA411 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
@@ -3838,6 +4778,7 @@
72220FAE13330B2300FCA411 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3847,6 +4788,7 @@
72220FAF13330B2300FCA411 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3968,13 +4910,19 @@
72BF963C1333042100B1EAD7 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(NATIVE_ARCH_ACTUAL)";
+ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+ CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
+ GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_SHADOW = YES;
+ GCC_WARN_SIGN_COMPARE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
@@ -3984,6 +4932,7 @@
.,
..,
);
+ ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-D_CUPS_SOURCE",
"-Wno-shorten-64-to-32",
@@ -3994,12 +4943,18 @@
72BF963D1333042100B1EAD7 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+ CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_SHADOW = YES;
+ GCC_WARN_SIGN_COMPARE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
@@ -4016,6 +4971,22 @@
};
name = Release;
};
+ 72CF95EF18A19134000FCAE4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ INSTALL_PATH = /usr/bin;
+ PRODUCT_NAME = "ipptool copy";
+ };
+ name = Debug;
+ };
+ 72CF95F018A19134000FCAE4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ INSTALL_PATH = /usr/bin;
+ PRODUCT_NAME = "ipptool copy";
+ };
+ name = Release;
+ };
72F75A591336F951004BB496 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -4035,6 +5006,7 @@
72F75A631336F9A3004BB496 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4044,6 +5016,7 @@
72F75A641336F9A3004BB496 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = "";
INSTALL_PATH = /usr/lib;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4080,6 +5053,24 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 274EE2681A03EDCA003213D1 /* Build configuration list for PBXNativeTarget "ippinfra" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 274EE2691A03EDCA003213D1 /* Debug */,
+ 274EE26A1A03EDCA003213D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 274EE2791A03EDCB003213D1 /* Build configuration list for PBXNativeTarget "ippproxy" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 274EE27A1A03EDCB003213D1 /* Debug */,
+ 274EE27B1A03EDCB003213D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -4224,6 +5215,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 2767FC4D19266A0D000F61D3 /* Build configuration list for PBXNativeTarget "testdest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2767FC4E19266A0D000F61D3 /* Debug */,
+ 2767FC4F19266A0D000F61D3 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -4233,6 +5233,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 27A034811A8BDB1300650675 /* Build configuration list for PBXNativeTarget "lpadmin" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 27A0347F1A8BDB1300650675 /* Debug */,
+ 27A034801A8BDB1300650675 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -4341,6 +5350,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 72CF95EE18A19134000FCAE4 /* Build configuration list for PBXNativeTarget "ippfind" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 72CF95EF18A19134000FCAE4 /* Debug */,
+ 72CF95F018A19134000FCAE4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
72F75A581336F951004BB496 /* Build configuration list for PBXNativeTarget "cupstestppd" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/xcode/config.h b/xcode/config.h
index 6b010a9..5baa667 100644
--- a/xcode/config.h
+++ b/xcode/config.h
@@ -1,28 +1,29 @@
-/* config.h. Generated from config.h.in by configure. */
/*
- * "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $"
*
- * Configuration file for CUPS.
+ * Configuration file for CUPS and Xcode.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
#ifndef _CUPS_CONFIG_H_
#define _CUPS_CONFIG_H_
+#include <AvailabilityMacros.h>
+
/*
* Version of software...
*/
-#define CUPS_SVERSION "CUPS v1.6.3"
-#define CUPS_MINIMAL "CUPS/1.6.3"
+#define CUPS_SVERSION "CUPS v2.1.2"
+#define CUPS_MINIMAL "CUPS/2.1.2"
/*
@@ -33,6 +34,7 @@
#define CUPS_DEFAULT_GROUP "_lp"
#define CUPS_DEFAULT_SYSTEM_GROUPS "admin"
#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@AUTHKEY(system.print.operator) @admin @lpadmin"
+#define CUPS_DEFAULT_SYSTEM_AUTHKEY "system.print.admin"
/*
@@ -132,13 +134,18 @@
/*
- * Do we have various image libraries?
+ * Do we have posix_spawn?
+ */
+
+#define HAVE_POSIX_SPAWN 1
+
+
+/*
+ * Do we have ZLIB?
*/
-/* #undef HAVE_LIBPNG */
#define HAVE_LIBZ 1
-/* #undef HAVE_LIBJPEG */
-/* #undef HAVE_LIBTIFF */
+#define HAVE_INFLATECOPY 1
/*
@@ -169,10 +176,10 @@
/*
- * Do we have <scsi/sg.h>?
+ * Use <stdint.h>?
*/
-/* #undef HAVE_SCSI_SG_H */
+#define HAVE_STDINT_H 1
/*
@@ -241,6 +248,20 @@
/*
+ * Do we have the ASL functions?
+ */
+
+#define HAVE_ASL_H
+
+
+/*
+ * Do we have the systemd journal functions?
+ */
+
+/*#undef HAVE_SYSTEMD_SD_JOURNAL_H*/
+
+
+/*
* Do we have the (v)snprintf() functions?
*/
@@ -292,65 +313,66 @@
#define HAVE_CDSASSL 1
/* #undef HAVE_GNUTLS */
-/* #undef HAVE_LIBSSL */
#define HAVE_SSL 1
/*
- * Do we have the SSL_set_tlsext_host_name function?
+ * Do we have the gnutls_transport_set_pull_timeout_function function?
*/
-/* #undef HAVE_SSL_SET_TLSEXT_HOST_NAME */
+/* #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */
/*
- * What Security framework headers do we have?
+ * Do we have the gnutls_priority_set_direct function?
*/
-#define HAVE_AUTHORIZATION_H 1
-#define HAVE_SECBASEPRIV_H 1
-#define HAVE_SECCERTIFICATE_H 1
-#define HAVE_SECIDENTITYSEARCHPRIV_H 1
-#define HAVE_SECITEM_H 1
-#define HAVE_SECITEMPRIV_H 1
-#define HAVE_SECPOLICY_H 1
-#define HAVE_SECPOLICYPRIV_H 1
-#define HAVE_SECURETRANSPORTPRIV_H 1
+/* #undef HAVE_GNUTLS_PRIORITY_SET_DIRECT */
/*
- * Do we have the SecCertificateCopyData function?
+ * What Security framework headers do we have?
*/
-#define HAVE_SECCERTIFICATECOPYDATA 1
+#define HAVE_AUTHORIZATION_H 1
+/* #undef HAVE_SECBASEPRIV_H */
+#define HAVE_SECCERTIFICATE_H 1
+/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */
+#define HAVE_SECITEM_H 1
+/* #undef HAVE_SECITEMPRIV_H */
+#define HAVE_SECPOLICY_H 1
+/* #undef HAVE_SECPOLICYPRIV_H */
+/* #undef HAVE_SECURETRANSPORTPRIV_H */
/*
- * Do we have the SecIdentitySearchCreateWithPolicy function?
+ * Do we have the cssmErrorString function?
*/
-#define HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY 1
+#define HAVE_CSSMERRORSTRING 1
/*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecGenerateSelfSignedCertificate function?
*/
-#define HAVE_SECPOLICYCREATESSL 1
+/* #undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE */
/*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecKeychainOpen function?
*/
-#define HAVE_SECPOLICYCREATESSL 1
+#define HAVE_SECKEYCHAINOPEN 1
/*
- * Do we have the cssmErrorString function?
+ * Do we have (a working) SSLSetEnabledCiphers function?
*/
-#define HAVE_CSSMERRORSTRING 1
+#ifdef AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER
+# define HAVE_SSLSETENABLEDCIPHERS 1
+#endif /* AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER */
/*
@@ -459,13 +481,6 @@
/*
- * Do we have the AIX usersec.h header file?
- */
-
-/* #undef HAVE_USERSEC_H */
-
-
-/*
* Do we have pthread support?
*/
@@ -478,6 +493,7 @@
#define HAVE_LAUNCH_H 1
#define HAVE_LAUNCHD 1
+#define HAVE_LAUNCH_ACTIVATE_SOCKET 1
/*
@@ -517,8 +533,8 @@
*/
#define HAVE_COREFOUNDATION_H 1
-#define HAVE_CFPRIV_H 1
-#define HAVE_CFBUNDLEPRIV_H 1
+/* #undef HAVE_CFPRIV_H */
+/* #undef HAVE_CFBUNDLEPRIV_H */
/*
@@ -540,7 +556,7 @@
*/
#define HAVE_MEMBERSHIP_H 1
-#define HAVE_MEMBERSHIPPRIV_H 1
+/* #undef HAVE_MEMBERSHIPPRIV_H */
#define HAVE_MBR_UID_TO_UUID 1
@@ -553,13 +569,6 @@
/*
- * Do we have Darwin's IOKit private headers?
- */
-
-#define HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H 1
-
-
-/*
* Do we have DBUS?
*/
@@ -574,13 +583,10 @@
#define HAVE_GSS_ACQUIRE_CRED_EX_F 1
#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1
#define HAVE_GSS_GSSAPI_H 1
-#define HAVE_GSS_GSSAPI_SPI_H 1
+/* #undef HAVE_GSS_GSSAPI_SPI_H */
#define HAVE_GSSAPI 1
-/* #undef HAVE_GSSAPI_GENERIC_H */
/* #undef HAVE_GSSAPI_GSSAPI_H */
/* #undef HAVE_GSSAPI_H */
-#define HAVE_GSSAPI_KRB5_H 1
-#define HAVE_KRB5_H 1
/*
@@ -658,13 +664,6 @@
/*
- * Do we have vproc_transaction_begin/end?
- */
-
-#define HAVE_VPROC_TRANSACTION_BEGIN 1
-
-
-/*
* Do we have libusb?
*/
@@ -709,7 +708,7 @@
*/
#define HAVE_XPC 1
-#define HAVE_XPC_PRIVATE_H 1
+/* #undef HAVE_XPC_PRIVATE_H */
/*
@@ -739,5 +738,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); }
#endif /* !_CUPS_CONFIG_H_ */
/*
- * End of "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $".
*/